Skip to content

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:

PluginApproachWhy
TypeScriptstrictTypeCheckedThe strictest official preset. No recommended fallback.
RegExpflat/recommended + extrasThe preset is well-scoped. We add rules for ReDoS prevention and safe replacement strings on top.
JSDocflat/recommended-typescript-errorTypeScript-aware preset with errors instead of warnings. No JSDoc required — only existing annotations are validated.
Reactstrict-type-checkedBased 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.
UnicornHand-pickedflat/recommended includes highly opinionated rules that clash with common patterns. We pick the ones that catch real bugs and enforce modern syntax.
SonarJSHand-pickedMany SonarJS rules duplicate what typescript-eslint and unicorn already cover. Only non-overlapping rules are enabled.
SecurityHand-pickedThe default preset enables detect-object-injection, which flags every bracket access — too many false positives for real-world code.
Node.jsHand-pickedModule resolution rules (no-missing-import, no-unpublished-import) conflict with TypeScript's own resolution. Only the rules TypeScript doesn't cover are included.
ImportHand-pickedTypeScript handles missing imports and duplicate exports. Import-x fills the gaps TypeScript doesn't cover: cycles, self-imports, mutable exports, and path hygiene.
PerfectionistHand-pickedMechanical sorting (imports, exports, types) always on. Structural sorting (objects, interfaces, classes) only in AI mode.
Package.jsonrecommendedThe recommended preset validates existing fields and requires only fundamentals. Sorting/ordering rules are off by default — enabled in AI mode.
De MorganAll rulesOnly two rules, both auto-fixable. Simplifies negated boolean expressions using De Morgan's laws.
React EffectHand-pickedAll rules enabled, but no-adjust-state-on-prop-change at warn level — it has legitimate edge cases.
AI modeHand-pickedNot 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.

PluginPurpose
@eslint/jsESLint core rules
typescript-eslintType-checked TypeScript rules (strictTypeChecked)
eslint-plugin-unicornModern JS patterns and best practices
eslint-plugin-regexpRegExp quality, optimization, and ReDoS prevention
eslint-plugin-jsdocJSDoc validation (validates existing annotations, doesn't require them)
eslint-plugin-import-xImport validation — cycles, duplicates, self-imports, mutable exports
eslint-plugin-perfectionistDeterministic sorting of imports, exports, union types, and more (auto-fixable)
eslint-plugin-unused-importsAuto-remove unused imports
eslint-plugin-sonarjsCode quality — duplicate detection, cognitive complexity, dead code
eslint-plugin-securitySecurity patterns — eval, regex DoS, command injection, timing attacks
@cspell/eslint-pluginSpell checking in identifiers and comments
eslint-config-prettierDisables formatting rules that conflict with your formatter
eslint-plugin-de-morganSimplifies negated boolean expressions using De Morgan's laws (auto-fixable)
eslint-plugin-package-jsonSemantic package.json validation — malformed fields, duplicate dependencies
@eslint/jsonJSON/JSONC linting — duplicate keys, unsafe values
eslint-plugin-mdxLints 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

PluginWhen activePurpose
@eslint-react/eslint-pluginreact: true80+ React rules (core, DOM, Web API, hooks, naming, RSC) under unified react/ namespace — 31 rules run in OxLint
eslint-plugin-react-hooksreact: trueRules of Hooks and exhaustive dependency checking
eslint-plugin-react-refreshreact: trueValidates component exports for Fast Refresh (HMR) compatibility
eslint-plugin-react-you-might-not-need-an-effectreact: trueCatches unnecessary useEffect — derived state, chained updates, prop resets
eslint-plugin-jsx-a11yreact: trueJSX accessibility — ARIA validation, keyboard navigation, alt text
eslint-plugin-nnode: trueNode.js APIs — deprecated API detection, path handling, hashbang validation
eslint-plugin-compatnode: falseBrowser API compatibility against your browserslist targets
eslint-plugin-perfectionistai: trueStructural sorting — objects, interfaces, enums, JSX props, classes, switch cases
eslint-plugin-package-jsonai: truePackage.json property ordering and collection sorting
eslint-plugin-oxlintoxlint: trueDisables ESLint rules that OxLint already covers

By file pattern

PluginFilesPurpose
@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.tsPlaywright E2E — missing awaits, locator patterns, no hardcoded timeouts
eslint-plugin-storybook*.stories.{ts,tsx}Storybook CSF — story exports, play functions, hierarchy