Skip to content

Type-aware by default

Native Oxlint.Type-aware TypeScript.One complete preset.

Run fast native rules and semantic checks such as unhandled promises through one Oxlint command. Every policy level includes the pinned type-aware backend; React, Node.js, and AI remain deliberate additions.

pnpm add -D oxlint-config-setup oxlint@1.78.0 oxlint-tsgolint@7.0.2001
oxlint.config.ts
import { getOxlintConfig } from "oxlint-config-setup";

export default getOxlintConfig({ react: true, ai: true });

This starts with one of 24 complete core artifacts, then adds convention-based test, spec, and story overrides. Type-aware linting is enabled by default; syntax-only is explicit. No parallel ESLint process.

Your configuration already exists.

Choose intent, not implementation details. Every combination below maps to a complete artifact generated and tested before release.

Policy level
Project context

Config input

oxlint.config.ts
import { getOxlintConfig } from "oxlint-config-setup";

export default getOxlintConfig({ react: true });

Config output

231 active rules

Plugins
6
JSON
9.1 KB
Export
react

resolves to config-57bab470d5b3.json

Policy level

166 base rules

ESLint core72
  • eslint/block-scoped-var
  • eslint/constructor-super
  • eslint/for-direction
  • eslint/getter-return
  • eslint/no-async-promise-executor
  • eslint/no-await-in-loop
  • eslint/no-caller
  • eslint/no-class-assign
  • eslint/no-compare-neg-zero
  • eslint/no-cond-assign
  • eslint/no-const-assign
  • eslint/no-constant-binary-expression
  • eslint/no-constant-condition
  • eslint/no-control-regex
  • eslint/no-debugger
  • eslint/no-delete-var
  • eslint/no-dupe-class-members
  • eslint/no-dupe-else-if
  • eslint/no-dupe-keys
  • eslint/no-duplicate-case
  • eslint/no-empty-character-class
  • eslint/no-empty-pattern
  • eslint/no-empty-static-block
  • eslint/no-eval
  • eslint/no-ex-assign
  • eslint/no-extend-native
  • eslint/no-extra-bind
  • eslint/no-extra-boolean-cast
  • eslint/no-func-assign
  • eslint/no-global-assign
  • eslint/no-implied-eval
  • eslint/no-import-assign
  • eslint/no-invalid-regexp
  • eslint/no-irregular-whitespace
  • eslint/no-iterator
  • eslint/no-loss-of-precision
  • eslint/no-misleading-character-class
  • eslint/no-new
  • eslint/no-new-native-nonconstructor
  • eslint/no-nonoctal-decimal-escape
  • eslint/no-obj-calls
  • eslint/no-self-assign
  • eslint/no-setter-return
  • eslint/no-shadow
  • eslint/no-shadow-restricted-names
  • eslint/no-sparse-arrays
  • eslint/no-this-before-super
  • eslint/no-unassigned-vars
  • eslint/no-underscore-dangle
  • eslint/no-unexpected-multiline
  • eslint/no-unmodified-loop-condition
  • eslint/no-unneeded-ternary
  • eslint/no-unreachable
  • eslint/no-unsafe-finally
  • eslint/no-unsafe-negation
  • eslint/no-unsafe-optional-chaining
  • eslint/no-unused-expressions
  • eslint/no-unused-labels
  • eslint/no-unused-private-class-members
  • eslint/no-unused-vars
  • eslint/no-useless-backreference
  • eslint/no-useless-call
  • eslint/no-useless-catch
  • eslint/no-useless-concat
  • eslint/no-useless-constructor
  • eslint/no-useless-escape
  • eslint/no-useless-rename
  • eslint/no-with
  • eslint/preserve-caught-error
  • eslint/require-yield
  • eslint/use-isnan
  • eslint/valid-typeof
Imports8
  • import/default
  • import/namespace
  • import/no-absolute-path
  • import/no-duplicates
  • import/no-empty-named-blocks
  • import/no-named-as-default
  • import/no-named-as-default-member
  • import/no-unassigned-import
OXC20
  • oxc/approx-constant
  • oxc/bad-array-method-on-arguments
  • oxc/bad-char-at-comparison
  • oxc/bad-comparison-sequence
  • oxc/bad-match-all-arg
  • oxc/bad-min-max-func
  • oxc/bad-object-literal-comparison
  • oxc/bad-replace-all-arg
  • oxc/const-comparisons
  • oxc/double-comparisons
  • oxc/erasing-op
  • oxc/misrefactored-assign-op
  • oxc/missing-throw
  • oxc/no-accumulating-spread
  • oxc/no-async-endpoint-handlers
  • oxc/no-map-spread
  • oxc/no-this-in-exported-function
  • oxc/number-arg-out-of-range
  • oxc/only-used-in-recursion
  • oxc/uninvoked-array-callback
TypeScript40
  • typescript/await-thenable
  • typescript/ban-ts-comment
  • typescript/consistent-return
  • typescript/no-array-delete
  • typescript/no-base-to-string
  • typescript/no-confusing-non-null-assertion
  • typescript/no-duplicate-enum-values
  • typescript/no-duplicate-type-constituents
  • typescript/no-extra-non-null-assertion
  • typescript/no-extraneous-class
  • typescript/no-floating-promises
  • typescript/no-for-in-array
  • typescript/no-implied-eval
  • typescript/no-meaningless-void-operator
  • typescript/no-misused-new
  • typescript/no-misused-spread
  • typescript/no-non-null-asserted-optional-chain
  • typescript/no-redundant-type-constituents
  • typescript/no-this-alias
  • typescript/no-unnecessary-boolean-literal-compare
  • typescript/no-unnecessary-parameter-property-assignment
  • typescript/no-unnecessary-template-expression
  • typescript/no-unnecessary-type-arguments
  • typescript/no-unnecessary-type-assertion
  • typescript/no-unnecessary-type-constraint
  • typescript/no-unnecessary-type-conversion
  • typescript/no-unnecessary-type-parameters
  • typescript/no-unsafe-declaration-merging
  • typescript/no-unsafe-enum-comparison
  • typescript/no-unsafe-type-assertion
  • typescript/no-unsafe-unary-minus
  • typescript/no-useless-default-assignment
  • typescript/no-useless-empty-export
  • typescript/no-wrapper-object-types
  • typescript/prefer-as-const
  • typescript/prefer-namespace-keyword
  • typescript/require-array-sort-compare
  • typescript/restrict-template-expressions
  • typescript/triple-slash-reference
  • typescript/unbound-method
Unicorn26
  • unicorn/consistent-function-scoping
  • unicorn/no-accessor-recursion
  • unicorn/no-array-fill-with-reference-type
  • unicorn/no-array-reverse
  • unicorn/no-array-sort
  • unicorn/no-await-in-promise-methods
  • unicorn/no-confusing-array-with
  • unicorn/no-empty-file
  • unicorn/no-instanceof-builtins
  • unicorn/no-invalid-fetch-options
  • unicorn/no-invalid-remove-event-listener
  • unicorn/no-new-array
  • unicorn/no-single-promise-in-promise-methods
  • unicorn/no-thenable
  • unicorn/no-unnecessary-await
  • unicorn/no-useless-fallback-in-spread
  • unicorn/no-useless-length-check
  • unicorn/no-useless-spread
  • unicorn/prefer-add-event-listener
  • unicorn/prefer-array-find
  • unicorn/prefer-array-flat-map
  • unicorn/prefer-set-has
  • unicorn/prefer-set-size
  • unicorn/prefer-string-starts-ends-with
  • unicorn/require-module-specifiers
  • unicorn/require-post-message-target-origin

Project context

Rules added or adjusted by the selected context

React65

Added65

  • jsx-a11y/alt-text
  • jsx-a11y/anchor-has-content
  • jsx-a11y/anchor-is-valid
  • jsx-a11y/aria-activedescendant-has-tabindex
  • jsx-a11y/aria-props
  • jsx-a11y/aria-proptypes
  • jsx-a11y/aria-role
  • jsx-a11y/aria-unsupported-elements
  • jsx-a11y/autocomplete-valid
  • jsx-a11y/click-events-have-key-events
  • jsx-a11y/control-has-associated-label
  • jsx-a11y/heading-has-content
  • jsx-a11y/html-has-lang
  • jsx-a11y/iframe-has-title
  • jsx-a11y/img-redundant-alt
  • jsx-a11y/interactive-supports-focus
  • jsx-a11y/label-has-associated-control
  • jsx-a11y/lang
  • jsx-a11y/media-has-caption
  • jsx-a11y/mouse-events-have-key-events
  • jsx-a11y/no-access-key
  • jsx-a11y/no-aria-hidden-on-focusable
  • jsx-a11y/no-autofocus
  • jsx-a11y/no-distracting-elements
  • jsx-a11y/no-interactive-element-to-noninteractive-role
  • jsx-a11y/no-noninteractive-element-interactions
  • jsx-a11y/no-noninteractive-element-to-interactive-role
  • jsx-a11y/no-noninteractive-tabindex
  • jsx-a11y/no-redundant-roles
  • jsx-a11y/no-static-element-interactions
  • jsx-a11y/prefer-tag-over-role
  • jsx-a11y/role-has-required-aria-props
  • jsx-a11y/role-supports-aria-props
  • jsx-a11y/scope
  • jsx-a11y/tabindex-no-positive
  • react/exhaustive-deps
  • react/forward-ref-uses-ref
  • react/iframe-missing-sandbox
  • react/jsx-key
  • react/jsx-no-comment-textnodes
  • react/jsx-no-constructed-context-values
  • react/jsx-no-duplicate-props
  • react/jsx-no-script-url
  • react/jsx-no-undef
  • react/jsx-props-no-spread-multi
  • react/no-array-index-key
  • react/no-children-prop
  • react/no-danger-with-children
  • react/no-did-mount-set-state
  • react/no-did-update-set-state
  • react/no-direct-mutation-state
  • react/no-find-dom-node
  • react/no-is-mounted
  • react/no-namespace
  • react/no-object-type-as-default-prop
  • react/no-render-return-value
  • react/no-string-refs
  • react/no-this-in-sfc
  • react/no-unsafe
  • react/no-unstable-nested-components
  • react/no-will-update-set-state
  • react/react-in-jsx-scope
  • react/rules-of-hooks
  • react/style-prop-object
  • react/void-dom-elements-no-children

Same selection, same artifact - on a laptop, in CI, and on the next clean install.

Strict should mean chosen, not bundled.

Each level adds stable native Oxlint categories. The build expands them into explicit rules, so moving up is predictable, reviewable, and every higher level remains a strict superset.

  1. 01

    Essential

    Oxlint correctness rules for the lowest-noise supported baseline.

    113 base rules
  2. 02

    Recommended

    Adds suspicious and performance rules. This is the default.

    166 base rules
  3. 03

    Strict

    Adds pedantic, style, and restriction rules while nursery stays off.

    485 base rules

Type information without the second linter.

Native Oxlint rules cover JavaScript, TypeScript, imports, React, accessibility, Node.js, Vitest, and Jest. When a TypeScript rule needs semantic information, the same command uses the pinned oxlint-tsgolint backend. Package-owned Testing Library, Playwright, and Storybook compatibility runtimes remain scoped to canonical test, spec, and story files. There is no parallel ESLint process.

One configuration model. One diagnostic stream. One place to update.

package.json
// package.json
{
  "scripts": {
    "lint": "oxlint ."
  }
}

AI is an overlay, not a fourth policy level.

Generated code can absorb feedback that would be tedious to enforce manually. The overlay may tighten a rule your level already enabled, or add an explicitly AI-only guardrail. It cannot reach into a higher policy level and switch those rules on by surprise.

231recommended + React

232with the AI overlay

The small rule-count change is deliberate. Most AI behavior comes from tightening options on rules that are already active.

  • Never activates a higher-level rule.
  • Never weakens or disables an active rule.
  • Every AI-only addition needs a distinct rationale.
oxlint.config.ts
import {
  configureRule,
  disableRule,
  getOxlintConfig,
  setRuleSeverity,
} from "oxlint-config-setup";

const config = getOxlintConfig({ ai: true });

configureRule(config, "eslint/valid-typeof", [
  { requireStringLiterals: true },
]);
setRuleSeverity(config, "eslint/no-warning-comments", "error");
disableRule(config, "import/no-duplicates");

export default config;

Opinionated does not mean sealed shut.

Keep the prebuilt policy and adjust the exceptions that are genuinely yours. The helper API changes severities, merges detailed option objects, disables rules, adds project rules, or isolates one rule for diagnostics.

Option patches merge recursively, so changing one nested value does not erase the rest of the preset.

No testimonials. The repository has receipts.

Every number links to the source, test, or decision behind it. These are release artifacts, not marketing estimates.

Set the policy once. Let Oxlint repeat it.

Start with recommended, add only the project contexts you actually use, and tighten from evidence instead of inheriting a mystery stack.

pnpm add -D oxlint-config-setup oxlint@1.78.0 oxlint-tsgolint@7.0.2001