Rules

jetlint ships 182 rules organized into 7 categories. Five rules form the recommended preset and fire at error severity by default; every other rule is off until opted in via .jetlintrc.json.

Compatibility. 6193 / 6193 typescript-eslint fixtures pass, plus 4405 / 4405 AST-only fixtures across the 112 biome and oxlint ports, plus 71 / 71 hand-written tests for the 9 ESLint-core rules without upstream fixture data — 100% across the board (10669 cases total). Every rule’s score is reproducible from the jetlint repo.

Origin. Type-aware rules were ported from typescript-eslint; AST-only rules from biome and oxlint (which themselves mirror ESLint core for the JS-only rules). The distinction the rule pages care about is type-aware vs AST-only (does the rule cost a TypeScript program load?) so that’s what each row below shows.

These five fire by default. They map to the consensus between typescript-eslint’s recommendedTypeChecked and oxc’s correctness category — rules upstream tools agree are bug-finders, not opinionated style.

RuleFixturesCatches
await-thenable121 / 121await on a non-thenable. The await is a no-op.
no-base-to-string315 / 315Implicit Object.prototype.toString() calls that yield "[object Object]".
no-floating-promises175 / 175Promises that aren’t awaited, returned, voided, or chained.
no-misused-promises215 / 215Promises passed where a sync value is expected (if (promise), spread into args, etc.).
no-unsafe-assignment91 / 91Assigning any-typed values into typed variables — bypasses the rest of the type system.

To turn off any recommended rule, set it to off in your config; to add others, opt in by name. See Config.

All rules, by category

The seven categories follow the rubric in docs/RULE-CATEGORIES.md: the first matching framing wins, with correctness beating performance beating complexity for cross-cutting rules. A ★ marks rules in the recommended preset.

correctness — 105 rules

Code that is wrong: runtime bugs, undefined behavior, type holes. No legitimate reason to write.

RuleModeFixtures
array-callback-returnAST-only241 / 241
await-thenabletype-aware121 / 121
consistent-returntype-aware30 / 30
constructor-superAST-only87 / 87
for-directionAST-only65 / 65
no-array-deletetype-aware29 / 29
no-base-to-stringtype-aware315 / 315
no-children-propAST-only2 / 2
no-cond-assignAST-only57 / 57
no-const-assignAST-only44 / 44
no-constant-conditionAST-only306 / 306
no-constant-math-min-max-clampAST-only3 / 3
no-constructor-returnAST-only20 / 20
no-duplicate-private-class-membersAST-only2 / 2
no-empty-character-classAST-only7 hand-written
no-empty-patternAST-only31 / 31
no-ex-assignAST-only8 / 8
no-floating-promisestype-aware175 / 175
no-for-in-arraytype-aware22 / 22
no-func-assignAST-only16 / 16
no-global-dirname-filenameAST-only4 / 4
no-initializer-with-definiteAST-only2 / 2
no-inner-declarationsAST-only66 / 66
no-invalid-builtin-instantiationAST-only2 / 2
no-invalid-regexpAST-only7 hand-written
no-loss-of-precisionAST-only145 / 145
no-misused-promisestype-aware215 / 215
no-misused-spreadtype-aware128 / 128
no-mixed-enumstype-aware51 / 51
no-nested-component-definitionsAST-only3 / 3
no-new-native-nonconstructorAST-only14 / 14
no-next-async-client-componentAST-only3 / 3
no-nodejs-modulesAST-only3 / 3
no-nonoctal-decimal-escapeAST-only2 / 2
no-obj-callsAST-only75 / 75
no-precision-lossAST-only2 / 2
no-private-importsAST-only17 / 17
no-process-globalAST-only4 / 4
no-promise-executor-returnAST-only122 / 122
no-qwik-use-visible-taskAST-only2 / 2
no-react-prop-assignmentsAST-only2 / 2
no-render-return-valueAST-only5 / 5
no-restricted-elementsAST-only0 / 0
no-self-assignAST-only92 / 92
no-setter-returnAST-only142 / 142
no-solid-destructured-propsAST-only2 / 2
no-string-case-mismatchAST-only2 / 2
no-super-without-extendsAST-only2 / 2
no-switch-declarationsAST-only13 / 13
no-this-before-superAST-only65 / 65
no-type-only-import-attributesAST-only4 / 4
no-undeclared-dependenciesAST-only4 / 4
no-undefAST-only97 / 97
no-unmodified-loop-conditionAST-only39 / 39
no-unreachableAST-only65 / 65
no-unreachable-loopAST-only10 hand-written
no-unreachable-superAST-only4 / 4
no-unresolved-importsAST-only2 / 2
no-unsafe-argumenttype-aware42 / 42
no-unsafe-assignmenttype-aware91 / 91
no-unsafe-calltype-aware38 / 38
no-unsafe-enum-comparisontype-aware85 / 85
no-unsafe-finallyAST-only28 / 28
no-unsafe-member-accesstype-aware35 / 35
no-unsafe-optional-chainingAST-only82 / 82
no-unsafe-returntype-aware62 / 62
no-unsafe-unary-minustype-aware23 / 23
no-unused-function-parametersAST-only6 / 6
no-unused-importsAST-only30 / 30
no-unused-labelsAST-only31 / 31
no-unused-private-class-membersAST-only87 / 87
no-unused-varsAST-only12 hand-written
no-use-before-defineAST-only340 / 340
no-useless-backreferenceAST-only9 hand-written
no-void-elements-with-childrenAST-only2 / 2
no-void-type-returnAST-only2 / 2
no-vue-data-object-declarationAST-only13 / 13
no-vue-duplicate-keysAST-only21 / 21
no-vue-reserved-keysAST-only21 / 21
no-vue-reserved-propsAST-only20 / 20
no-vue-setup-props-reactivity-lossAST-only4 / 4
only-throw-errortype-aware89 / 89
prefer-promise-reject-errorstype-aware161 / 161
related-getter-setter-pairstype-aware23 / 23
require-array-sort-comparetype-aware33 / 33
require-atomic-updatesAST-only7 hand-written
require-awaittype-aware54 / 54
strict-void-returntype-aware210 / 210
switch-exhaustiveness-checktype-aware104 / 104
use-exhaustive-dependenciesAST-only37 / 37
use-hook-at-top-levelAST-only10 / 10
use-image-sizeAST-only6 / 6
use-import-extensionsAST-only2 / 2
use-isnanAST-only208 / 208
use-json-import-attributesAST-only2 / 2
use-jsx-key-in-iterableAST-only2 / 2
use-parse-int-radixAST-only2 / 2
use-qwik-classlistAST-only2 / 2
use-qwik-method-usageAST-only2 / 2
use-qwik-valid-lexical-scopeAST-only2 / 2
use-single-js-doc-asteriskAST-only3 / 3
use-unique-element-idsAST-only2 / 2
use-unknown-in-catch-callback-variabletype-aware56 / 56
use-yieldAST-only17 / 17
valid-typeofAST-only60 / 60

suspicious — 31 rules

Code that smells. Usually wrong, occasionally intentional. The author should justify or fix.

RuleModeFixtures
getter-returnAST-only85 / 85
no-async-promise-executorAST-only6 / 6
no-class-assignAST-only25 / 25
no-compare-neg-zeroAST-only40 / 40
no-confusing-void-expressiontype-aware108 / 108
no-constant-binary-expressionAST-only251 / 251
no-control-regexAST-only8 hand-written
no-debuggerAST-only2 / 2
no-deprecatedtype-aware262 / 262
no-dupe-argsAST-only5 hand-written
no-dupe-class-membersAST-only74 / 74
no-dupe-else-ifAST-only89 / 89
no-dupe-keysAST-only50 / 50
no-duplicate-caseAST-only30 / 30
no-fallthroughAST-only86 / 86
no-import-assignAST-only116 / 116
no-irregular-whitespaceAST-only220 / 220
no-misleading-character-classAST-only6 hand-written
no-prototype-builtinsAST-only47 / 47
no-self-compareAST-only24 / 24
no-sparse-arraysAST-only9 / 9
no-template-curly-in-stringAST-only23 / 23
no-unexpected-multilineAST-only58 / 58
no-unsafe-negationAST-only30 / 30
no-unsafe-type-assertiontype-aware15 / 15
promise-function-asynctype-aware53 / 53
restrict-plus-operandstype-aware119 / 119
restrict-template-expressionstype-aware79 / 79
return-awaittype-aware95 / 95
strict-boolean-expressionstype-aware214 / 214
unbound-methodtype-aware202 / 202

security — 6 rules

Patterns enabling injection, eval, prototype pollution, or unsafe deserialization.

RuleModeFixtures
no-blank-targetAST-only2 / 2
no-dangerously-set-inner-htmlAST-only4 / 4
no-dangerously-set-inner-html-with-childrenAST-only2 / 2
no-global-evalAST-only3 / 3
no-implied-evaltype-aware70 / 70
no-secretsAST-only2 / 2

performance — 16 rules

Known-slow patterns with a faster equivalent. No correctness impact.

RuleModeFixtures
no-accumulating-spreadAST-only28 / 28
no-await-in-loopAST-only37 / 37
no-barrel-fileAST-only7 / 7
no-deleteAST-only19 / 19
no-dynamic-namespace-import-accessAST-only2 / 2
no-img-elementAST-only2 / 2
no-namespace-importAST-only2 / 2
no-re-export-allAST-only3 / 3
no-unwanted-polyfillioAST-only3 / 3
prefer-findtype-aware45 / 45
prefer-includestype-aware42 / 42
prefer-regexp-exectype-aware37 / 37
prefer-string-starts-ends-withtype-aware123 / 123
use-google-font-preconnectAST-only2 / 2
use-solid-for-componentAST-only2 / 2
use-top-level-regexAST-only2 / 2

complexity — 17 rules

Needless complication with a simpler equivalent. No correctness or perf impact.

RuleModeFixtures
no-duplicate-type-constituentstype-aware82 / 82
no-redundant-type-constituentstype-aware104 / 104
no-unnecessary-boolean-literal-comparetype-aware45 / 45
no-unnecessary-conditiontype-aware296 / 296
no-unnecessary-qualifiertype-aware17 / 17
no-unnecessary-template-expressiontype-aware71 / 71
no-unnecessary-type-argumentstype-aware71 / 71
no-unnecessary-type-assertiontype-aware223 / 223
no-unnecessary-type-conversiontype-aware66 / 66
no-unnecessary-type-parameterstype-aware160 / 160
no-useless-default-assignmenttype-aware83 / 83
non-nullable-type-assertion-styletype-aware20 / 20
prefer-destructuringtype-aware92 / 92
prefer-nullish-coalescingtype-aware617 / 617
prefer-optional-chaintype-aware45 / 45
prefer-reduce-type-parametertype-aware31 / 31
prefer-return-this-typetype-aware21 / 21

style — 7 rules

Formatting, naming, ordering. Pure preference; team-configurable.

RuleModeFixtures
consistent-type-exportstype-aware47 / 47
dot-notationtype-aware61 / 61
naming-conventiontype-aware88 / 88
no-duplicate-importsAST-only86 / 86
no-meaningless-void-operatortype-aware5 / 5
prefer-readonlytype-aware162 / 162
prefer-readonly-parameter-typestype-aware130 / 130

nursery — 0 rules

New or iterating rules. May change shape or move to another group. Not included in the recommended preset. Empty today.

Reproducing the compatibility scores

Every rule has a vendored fixture (or inline test cases) and a Go harness. From the jetlint repo:

# typescript-eslint ports (type-aware rules)
go test -count=1 -run TypescriptEslintCompatibility -v \
  ./internal/rules/<rule-package>/

# biome + ESLint-core ports (AST-only rules)
go test -count=1 -run EslintCompatibility -v \
  ./internal/rules/<rule-package>/

The aggregate validates all 182 rules against 10669 cases in one go. See docs/OXLINT-COMPAT-OVERVIEW.md for the AST-only fixture format and how to regenerate from a fresh oxc/biome checkout.