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.
Recommended preset
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.
| Rule | Fixtures | Catches |
|---|---|---|
await-thenable | 121 / 121 | await on a non-thenable. The await is a no-op. |
no-base-to-string | 315 / 315 | Implicit Object.prototype.toString() calls that yield "[object Object]". |
no-floating-promises | 175 / 175 | Promises that aren’t awaited, returned, voided, or chained. |
no-misused-promises | 215 / 215 | Promises passed where a sync value is expected (if (promise), spread into args, etc.). |
no-unsafe-assignment | 91 / 91 | Assigning 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.
suspicious — 31 rules
Code that smells. Usually wrong, occasionally intentional. The author should justify or fix.
security — 6 rules
Patterns enabling injection, eval, prototype pollution, or unsafe deserialization.
| Rule | Mode | Fixtures |
|---|---|---|
no-blank-target | AST-only | 2 / 2 |
no-dangerously-set-inner-html | AST-only | 4 / 4 |
no-dangerously-set-inner-html-with-children | AST-only | 2 / 2 |
no-global-eval | AST-only | 3 / 3 |
no-implied-eval | type-aware | 70 / 70 |
no-secrets | AST-only | 2 / 2 |
performance — 16 rules
Known-slow patterns with a faster equivalent. No correctness impact.
| Rule | Mode | Fixtures |
|---|---|---|
no-accumulating-spread | AST-only | 28 / 28 |
no-await-in-loop | AST-only | 37 / 37 |
no-barrel-file | AST-only | 7 / 7 |
no-delete | AST-only | 19 / 19 |
no-dynamic-namespace-import-access | AST-only | 2 / 2 |
no-img-element | AST-only | 2 / 2 |
no-namespace-import | AST-only | 2 / 2 |
no-re-export-all | AST-only | 3 / 3 |
no-unwanted-polyfillio | AST-only | 3 / 3 |
prefer-find | type-aware | 45 / 45 |
prefer-includes | type-aware | 42 / 42 |
prefer-regexp-exec | type-aware | 37 / 37 |
prefer-string-starts-ends-with | type-aware | 123 / 123 |
use-google-font-preconnect | AST-only | 2 / 2 |
use-solid-for-component | AST-only | 2 / 2 |
use-top-level-regex | AST-only | 2 / 2 |
complexity — 17 rules
Needless complication with a simpler equivalent. No correctness or perf impact.
| Rule | Mode | Fixtures |
|---|---|---|
no-duplicate-type-constituents | type-aware | 82 / 82 |
no-redundant-type-constituents | type-aware | 104 / 104 |
no-unnecessary-boolean-literal-compare | type-aware | 45 / 45 |
no-unnecessary-condition | type-aware | 296 / 296 |
no-unnecessary-qualifier | type-aware | 17 / 17 |
no-unnecessary-template-expression | type-aware | 71 / 71 |
no-unnecessary-type-arguments | type-aware | 71 / 71 |
no-unnecessary-type-assertion | type-aware | 223 / 223 |
no-unnecessary-type-conversion | type-aware | 66 / 66 |
no-unnecessary-type-parameters | type-aware | 160 / 160 |
no-useless-default-assignment | type-aware | 83 / 83 |
non-nullable-type-assertion-style | type-aware | 20 / 20 |
prefer-destructuring | type-aware | 92 / 92 |
prefer-nullish-coalescing | type-aware | 617 / 617 |
prefer-optional-chain | type-aware | 45 / 45 |
prefer-reduce-type-parameter | type-aware | 31 / 31 |
prefer-return-this-type | type-aware | 21 / 21 |
style — 7 rules
Formatting, naming, ordering. Pure preference; team-configurable.
| Rule | Mode | Fixtures |
|---|---|---|
consistent-type-exports | type-aware | 47 / 47 |
dot-notation | type-aware | 61 / 61 |
naming-convention | type-aware | 88 / 88 |
no-duplicate-imports | AST-only | 86 / 86 |
no-meaningless-void-operator | type-aware | 5 / 5 |
prefer-readonly | type-aware | 162 / 162 |
prefer-readonly-parameter-types | type-aware | 130 / 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.