Plugins
Where every rule in every preset comes from — the upstream plugin or spec it's ported or wrapped from, and where to read why a rule is off.
Every rule in oxlint traces back to one of two places: a plugin built into oxlint itself (ported from an upstream ESLint plugin into Rust, and run natively), or an external ESLint plugin loaded through jsPlugins and run as real JS. This page lists both, with a link to the upstream source and a link to the file in this repo where the rule is turned on or off — every "off" entry carries a comment explaining why, so you never have to guess.
Built into oxlint
These run as native oxc rules, ported from the ESLint plugin named. Browse the full ported rule set on oxc’s rules reference; the upstream link is where the rule concept and original docs come from.
| Plugin | Upstream | Used by |
|---|---|---|
eslint |
ESLint core rules | base |
typescript |
typescript-eslint | base |
unicorn |
eslint-plugin-unicorn | base |
oxc |
oxc-original — no upstream, native to the linter | base |
import |
eslint-plugin-import | base |
jsdoc |
eslint-plugin-jsdoc | jsdoc |
node |
eslint-plugin-n | node |
promise |
eslint-plugin-promise | base |
react |
eslint-plugin-react | react, react-compiler, jsx-runtime-automatic/jsx-runtime-classic |
react-perf |
eslint-plugin-react-perf | react-perf |
jsx-a11y |
eslint-plugin-jsx-a11y | react-a11y |
vitest |
eslint-plugin-vitest | vitest |
None of these appear in package.json — oxlint ships its own port, so there’s no npm dependency to install or version to track.
External ESLint plugins
These are real npm packages, loaded through jsPlugins and run as actual ESLint plugin JS (listed as dependencies in packages/oxlint/package.json). Every upstream rule is covered — either "error" or explicitly "off" with a comment.
| Plugin | Package | Upstream | Rule decisions in this repo |
|---|---|---|---|
regexp |
eslint-plugin-regexp |
GitHub · docs | _rules-regexp.ts |
sonarjs |
eslint-plugin-sonarjs |
GitHub · rule docs | _rules-sonarjs.ts |
github |
eslint-plugin-github |
GitHub | _rules-github.ts (base); its 4 a11y-* rules with no jsx-a11y equivalent live in react-a11y.ts instead |
e18e |
@e18e/eslint-plugin |
GitHub | _rules-e18e.ts |
playwright |
eslint-plugin-playwright |
GitHub | playwright.ts, rules in _rules-playwright.ts |
react-doctor |
oxlint-plugin-react-doctor |
GitHub (directory packages/oxlint-plugin-react-doctor) |
react-doctor.ts (framework-agnostic core, rules in _rules-react-doctor.ts) and the per-framework leaves, each with its own _rules-react-doctor-*.ts |
tanstack-query |
@tanstack/eslint-plugin-query |
Docs · GitHub | tanstack-query.ts, rules in _rules-tanstack-query.ts |
tanstack-router |
@tanstack/eslint-plugin-router |
Docs · GitHub | tanstack-router.ts, rules in _rules-tanstack-router.ts |
stylex |
@stylexjs/eslint-plugin |
GitHub | stylex.ts, rules in _rules-stylex.ts |
tailwindcss |
eslint-plugin-tailwindcss |
GitHub | tailwindcss.ts, rules in _rules-tailwindcss.ts |
testing-library |
eslint-plugin-testing-library |
GitHub | testing-library.ts, rules in _rules-testing-library.ts |
jest-dom |
eslint-plugin-jest-dom |
GitHub | jest-dom.ts, rules in _rules-jest-dom.ts |
cypress |
eslint-plugin-cypress |
GitHub | cypress.ts, rules in _rules-cypress.ts |
storybook |
eslint-plugin-storybook |
GitHub | storybook.ts, rules in _rules-storybook.ts |
solid |
eslint-plugin-solid |
GitHub | solid.ts, rules in _rules-solid.ts |
react-doctor is the one wrapped plugin that ships its own per-framework rule slices — presets explains how those slices map onto the framework and library leaf presets. Its framework-agnostic core used to duplicate roughly 90 rules already owned by react, react-perf, and jsx-a11y; those now live exclusively in the plugin that originates them, not in react-doctor.
Original rules
anti-slop isn’t wrapped from anything upstream — it’s original to this repo. Its rules and their rationale live directly in src/anti-slop/rules.
Checking why a rule is off
Every "off" entry in this package sits next to a comment explaining the reason — a deprecation, a false-positive pattern, an option this repo’s rule-map shape can’t express. Open the file for the plugin in question (linked in the tables above) and search for the rule name; the comment sits directly above it. If a rule you’d expect isn’t covered at all, it means the preset simply doesn’t load that plugin — check presets for which plugins each preset pulls in.