Included Plugins
Curated, not copy-pasted
Most shared configs slap recommended on every plugin and call it a day. That gives you whatever the plugin author thought was a good default — including rules that overlap, contradict each other, or don't apply to your stack.
This config takes a different approach. Every rule from every plugin was reviewed individually. Some plugins use their official preset as a starting point. Others are entirely hand-picked:
| Plugin | Approach | Why |
|---|---|---|
| TypeScript | strictTypeChecked | The strictest official preset. No recommended fallback. |
| RegExp | flat/recommended + extras | The preset is well-scoped. We add rules for ReDoS prevention and safe replacement strings on top. |
| JSDoc | flat/recommended-typescript-error | TypeScript-aware preset with errors instead of warnings. No JSDoc required — only existing annotations are validated. |
| React | strict-type-checked | Based on @eslint-react's strictest type-aware preset. 80+ rules across core, DOM, Web API, hooks, naming, and RSC — unified under a single react/ namespace via the React Compat Plugin for OxLint compatibility. |
| Unicorn | Hand-picked | flat/recommended includes highly opinionated rules that clash with common patterns. We pick the ones that catch real bugs and enforce modern syntax. |
| SonarJS | Hand-picked | Many SonarJS rules duplicate what typescript-eslint and unicorn already cover. Only non-overlapping rules are enabled. |
| Security | Hand-picked | The default preset enables detect-object-injection, which flags every bracket access — too many false positives for real-world code. |
| Node.js | Hand-picked | Module resolution rules (no-missing-import, no-unpublished-import) conflict with TypeScript's own resolution. Only the rules TypeScript doesn't cover are included. |
| Import | Hand-picked | TypeScript handles missing imports and duplicate exports. Import-x fills the gaps TypeScript doesn't cover: cycles, self-imports, mutable exports, and path hygiene. |
| Perfectionist | Hand-picked | Mechanical sorting (imports, exports, types) always on. Structural sorting (objects, interfaces, classes) only in AI mode. |
| Package.json | recommended | The recommended preset validates existing fields and requires only fundamentals. Sorting/ordering rules are off by default — enabled in AI mode. |
| De Morgan | All rules | Only two rules, both auto-fixable. Simplifies negated boolean expressions using De Morgan's laws. |
| React Effect | Hand-picked | All rules enabled, but no-adjust-state-on-prop-change at warn level — it has legitimate edge cases. |
| AI mode | Hand-picked | Not a plugin preset at all — rules from across all plugins, tightened beyond their defaults for AI-generated code. |
TIP
The result: no duplicate rules, no conflicting severities, no rules that fire on files where they don't belong. Just one coherent rule set.
Always active (16 plugins)
These plugins run on every project, regardless of flags.
| Plugin | Purpose |
|---|---|
@eslint/js | ESLint core rules |
typescript-eslint | Type-checked TypeScript rules (strictTypeChecked) |
eslint-plugin-unicorn | Modern JS patterns and best practices |
eslint-plugin-regexp | RegExp quality, optimization, and ReDoS prevention |
eslint-plugin-jsdoc | JSDoc validation (validates existing annotations, doesn't require them) |
eslint-plugin-import-x | Import validation — cycles, duplicates, self-imports, mutable exports |
eslint-plugin-perfectionist | Deterministic sorting of imports, exports, union types, and more (auto-fixable) |
eslint-plugin-unused-imports | Auto-remove unused imports |
eslint-plugin-sonarjs | Code quality — duplicate detection, cognitive complexity, dead code |
eslint-plugin-security | Security patterns — eval, regex DoS, command injection, timing attacks |
@cspell/eslint-plugin | Spell checking in identifiers and comments |
eslint-config-prettier | Disables formatting rules that conflict with your formatter |
eslint-plugin-de-morgan | Simplifies negated boolean expressions using De Morgan's laws (auto-fixable) |
eslint-plugin-package-json | Semantic package.json validation — malformed fields, duplicate dependencies |
@eslint/json | JSON/JSONC linting — duplicate keys, unsafe values |
eslint-plugin-mdx | Lints code blocks inside Markdown and MDX files with your ESLint rules |
Formatting
This config does not handle code formatting. Following ESLint's own recommendation, formatting is a separate concern best handled by a dedicated tool — Prettier, Biome, or oxfmt.
All formatting-related ESLint rules are disabled at build time via eslint-config-prettier, so they never conflict with your formatter of choice.
Conditional plugins
These plugins activate based on your configuration flags or file patterns.
By flag
| Plugin | When active | Purpose |
|---|---|---|
@eslint-react/eslint-plugin | react: true | 80+ React rules (core, DOM, Web API, hooks, naming, RSC) under unified react/ namespace — 31 rules run in OxLint |
eslint-plugin-react-hooks | react: true | Rules of Hooks and exhaustive dependency checking |
eslint-plugin-react-refresh | react: true | Validates component exports for Fast Refresh (HMR) compatibility |
eslint-plugin-react-you-might-not-need-an-effect | react: true | Catches unnecessary useEffect — derived state, chained updates, prop resets |
eslint-plugin-jsx-a11y | react: true | JSX accessibility — ARIA validation, keyboard navigation, alt text |
eslint-plugin-n | node: true | Node.js APIs — deprecated API detection, path handling, hashbang validation |
eslint-plugin-compat | node: false | Browser API compatibility against your browserslist targets |
eslint-plugin-perfectionist | ai: true | Structural sorting — objects, interfaces, enums, JSX props, classes, switch cases |
eslint-plugin-package-json | ai: true | Package.json property ordering and collection sorting |
eslint-plugin-oxlint | oxlint: true | Disables ESLint rules that OxLint already covers |
By file pattern
| Plugin | Files | Purpose |
|---|---|---|
@vitest/eslint-plugin | *.test.{ts,tsx} | Vitest best practices — assertions, focused tests, hooks |
eslint-plugin-testing-library | *.test.{ts,tsx} | Testing Library patterns — queries, async utilities, screen usage |
eslint-plugin-playwright | *.spec.ts | Playwright E2E — missing awaits, locator patterns, no hardcoded timeouts |
eslint-plugin-storybook | *.stories.{ts,tsx} | Storybook CSF — story exports, play functions, hierarchy |