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.2001import { 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.
Config input
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-vareslint/constructor-supereslint/for-directioneslint/getter-returneslint/no-async-promise-executoreslint/no-await-in-loopeslint/no-callereslint/no-class-assigneslint/no-compare-neg-zeroeslint/no-cond-assigneslint/no-const-assigneslint/no-constant-binary-expressioneslint/no-constant-conditioneslint/no-control-regexeslint/no-debuggereslint/no-delete-vareslint/no-dupe-class-memberseslint/no-dupe-else-ifeslint/no-dupe-keyseslint/no-duplicate-caseeslint/no-empty-character-classeslint/no-empty-patterneslint/no-empty-static-blockeslint/no-evaleslint/no-ex-assigneslint/no-extend-nativeeslint/no-extra-bindeslint/no-extra-boolean-casteslint/no-func-assigneslint/no-global-assigneslint/no-implied-evaleslint/no-import-assigneslint/no-invalid-regexpeslint/no-irregular-whitespaceeslint/no-iteratoreslint/no-loss-of-precisioneslint/no-misleading-character-classeslint/no-neweslint/no-new-native-nonconstructoreslint/no-nonoctal-decimal-escapeeslint/no-obj-callseslint/no-self-assigneslint/no-setter-returneslint/no-shadoweslint/no-shadow-restricted-nameseslint/no-sparse-arrayseslint/no-this-before-supereslint/no-unassigned-varseslint/no-underscore-dangleeslint/no-unexpected-multilineeslint/no-unmodified-loop-conditioneslint/no-unneeded-ternaryeslint/no-unreachableeslint/no-unsafe-finallyeslint/no-unsafe-negationeslint/no-unsafe-optional-chainingeslint/no-unused-expressionseslint/no-unused-labelseslint/no-unused-private-class-memberseslint/no-unused-varseslint/no-useless-backreferenceeslint/no-useless-calleslint/no-useless-catcheslint/no-useless-concateslint/no-useless-constructoreslint/no-useless-escapeeslint/no-useless-renameeslint/no-witheslint/preserve-caught-erroreslint/require-yieldeslint/use-isnaneslint/valid-typeof
Imports8
import/defaultimport/namespaceimport/no-absolute-pathimport/no-duplicatesimport/no-empty-named-blocksimport/no-named-as-defaultimport/no-named-as-default-memberimport/no-unassigned-import
OXC20
oxc/approx-constantoxc/bad-array-method-on-argumentsoxc/bad-char-at-comparisonoxc/bad-comparison-sequenceoxc/bad-match-all-argoxc/bad-min-max-funcoxc/bad-object-literal-comparisonoxc/bad-replace-all-argoxc/const-comparisonsoxc/double-comparisonsoxc/erasing-opoxc/misrefactored-assign-opoxc/missing-throwoxc/no-accumulating-spreadoxc/no-async-endpoint-handlersoxc/no-map-spreadoxc/no-this-in-exported-functionoxc/number-arg-out-of-rangeoxc/only-used-in-recursionoxc/uninvoked-array-callback
TypeScript40
typescript/await-thenabletypescript/ban-ts-commenttypescript/consistent-returntypescript/no-array-deletetypescript/no-base-to-stringtypescript/no-confusing-non-null-assertiontypescript/no-duplicate-enum-valuestypescript/no-duplicate-type-constituentstypescript/no-extra-non-null-assertiontypescript/no-extraneous-classtypescript/no-floating-promisestypescript/no-for-in-arraytypescript/no-implied-evaltypescript/no-meaningless-void-operatortypescript/no-misused-newtypescript/no-misused-spreadtypescript/no-non-null-asserted-optional-chaintypescript/no-redundant-type-constituentstypescript/no-this-aliastypescript/no-unnecessary-boolean-literal-comparetypescript/no-unnecessary-parameter-property-assignmenttypescript/no-unnecessary-template-expressiontypescript/no-unnecessary-type-argumentstypescript/no-unnecessary-type-assertiontypescript/no-unnecessary-type-constrainttypescript/no-unnecessary-type-conversiontypescript/no-unnecessary-type-parameterstypescript/no-unsafe-declaration-mergingtypescript/no-unsafe-enum-comparisontypescript/no-unsafe-type-assertiontypescript/no-unsafe-unary-minustypescript/no-useless-default-assignmenttypescript/no-useless-empty-exporttypescript/no-wrapper-object-typestypescript/prefer-as-consttypescript/prefer-namespace-keywordtypescript/require-array-sort-comparetypescript/restrict-template-expressionstypescript/triple-slash-referencetypescript/unbound-method
Unicorn26
unicorn/consistent-function-scopingunicorn/no-accessor-recursionunicorn/no-array-fill-with-reference-typeunicorn/no-array-reverseunicorn/no-array-sortunicorn/no-await-in-promise-methodsunicorn/no-confusing-array-withunicorn/no-empty-fileunicorn/no-instanceof-builtinsunicorn/no-invalid-fetch-optionsunicorn/no-invalid-remove-event-listenerunicorn/no-new-arrayunicorn/no-single-promise-in-promise-methodsunicorn/no-thenableunicorn/no-unnecessary-awaitunicorn/no-useless-fallback-in-spreadunicorn/no-useless-length-checkunicorn/no-useless-spreadunicorn/prefer-add-event-listenerunicorn/prefer-array-findunicorn/prefer-array-flat-mapunicorn/prefer-set-hasunicorn/prefer-set-sizeunicorn/prefer-string-starts-ends-withunicorn/require-module-specifiersunicorn/require-post-message-target-origin
Project context
Rules added or adjusted by the selected context
React65
Added65
jsx-a11y/alt-textjsx-a11y/anchor-has-contentjsx-a11y/anchor-is-validjsx-a11y/aria-activedescendant-has-tabindexjsx-a11y/aria-propsjsx-a11y/aria-proptypesjsx-a11y/aria-rolejsx-a11y/aria-unsupported-elementsjsx-a11y/autocomplete-validjsx-a11y/click-events-have-key-eventsjsx-a11y/control-has-associated-labeljsx-a11y/heading-has-contentjsx-a11y/html-has-langjsx-a11y/iframe-has-titlejsx-a11y/img-redundant-altjsx-a11y/interactive-supports-focusjsx-a11y/label-has-associated-controljsx-a11y/langjsx-a11y/media-has-captionjsx-a11y/mouse-events-have-key-eventsjsx-a11y/no-access-keyjsx-a11y/no-aria-hidden-on-focusablejsx-a11y/no-autofocusjsx-a11y/no-distracting-elementsjsx-a11y/no-interactive-element-to-noninteractive-rolejsx-a11y/no-noninteractive-element-interactionsjsx-a11y/no-noninteractive-element-to-interactive-rolejsx-a11y/no-noninteractive-tabindexjsx-a11y/no-redundant-rolesjsx-a11y/no-static-element-interactionsjsx-a11y/prefer-tag-over-rolejsx-a11y/role-has-required-aria-propsjsx-a11y/role-supports-aria-propsjsx-a11y/scopejsx-a11y/tabindex-no-positivereact/exhaustive-depsreact/forward-ref-uses-refreact/iframe-missing-sandboxreact/jsx-keyreact/jsx-no-comment-textnodesreact/jsx-no-constructed-context-valuesreact/jsx-no-duplicate-propsreact/jsx-no-script-urlreact/jsx-no-undefreact/jsx-props-no-spread-multireact/no-array-index-keyreact/no-children-propreact/no-danger-with-childrenreact/no-did-mount-set-statereact/no-did-update-set-statereact/no-direct-mutation-statereact/no-find-dom-nodereact/no-is-mountedreact/no-namespacereact/no-object-type-as-default-propreact/no-render-return-valuereact/no-string-refsreact/no-this-in-sfcreact/no-unsafereact/no-unstable-nested-componentsreact/no-will-update-set-statereact/react-in-jsx-scopereact/rules-of-hooksreact/style-prop-objectreact/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.
- 01113 base rules
Essential
Oxlint correctness rules for the lowest-noise supported baseline.
- 02166 base rules
Recommended
Adds suspicious and performance rules. This is the default.
- 03485 base rules
Strict
Adds pedantic, style, and restriction rules while nursery stays off.
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
{
"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.
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