What's Changed
This release consolidates all changes since v4.2.1.
💥 Breaking Changes
Core API Refactoring (@eslint-react/core)
- Performed a large-scale flattening refactor of the core package's internal structure, merging modules previously scattered across subdirectories like
component/,function/,hook/,semantic/, andapi/into the root directory. - Renamed several core APIs:
isReactAPI→isAPIisReactAPICall→isAPICallisInitializedFromReact→isAPIFromReactisInitializedFromReactNative→isAPIFromReactNativeComponentDetectionHint→FunctionComponentDetectionHintComponentFlag→FunctionComponentFlaggetComponentCollector→getFunctionComponentCollectorgetComponentCollectorLegacy→getClassComponentCollector
- Migrated type utilities (
type-is,type-name,type-variant) fromeslint-plugin-react-xto@eslint-react/core. - Updated the
Toolkitinterface in@eslint-react/kitto reflect the naming changes above.
Kit API Simplification (@eslint-react/kit)
- Simplified
RuleToolkit.isAPI: Removed pre-built identifier predicates (memo,lazy,forwardRef, etc.) fromRuleToolkit.is. Only*Callvariants andAPI/APICallfactories are now available. - Renamed initialization checkers:
initializedFromReact→APIFromReactinitializedFromReactNative→APIFromReactNative
- Code using
is.memo(node),is.lazy(node), etc. must migrate tois.memoCall(node)or useis.API("memo")(node).
Type Alias Removal
- Removed deprecated
RuleDefinitiontype alias: TheRuleDefinitiontype has been completely removed from@eslint-react/kit. UseRuleFunctioninstead.
Removed Rules
The following rules have been removed from eslint-plugin-react-x, eslint-plugin-react-dom, and eslint-plugin-react-debug:
| Rule | Package | Notes |
|---|---|---|
component-hook-factories
| react-x
| Removed from all configs |
no-redundant-should-component-update
| react-x
| Removed from all configs |
no-unnecessary-use-callback
| react-x
| Removed from all configs |
no-unnecessary-use-memo
| react-x
| Removed from all configs |
no-unused-state
| react-x
| Removed from all configs |
prefer-destructuring-assignment
| react-x
| Removed from all configs |
prefer-namespace-import
| react-x
| Removed from all configs |
prefer-namespace-import
| react-dom
| Removed from all configs |
debug/class-component
| react-debug
| Removed from all configs |
Class Component Support Deprecation
- All Class Component-related detection functions in the core package (such as
isClassComponent,isPureComponent, and various lifecycle checkers) have been marked as@deprecated, retaining only minimal compatibility support for existing rules. - Rules in
eslint-plugin-react-web-api, includingno-leaked-event-listener,no-leaked-interval, andno-leaked-timeout, have removed detection for Class Component lifecycles (componentDidMount/componentWillUnmount) and now only report on Hook Effects (useEffect, etc.).
✨ New
New Rules
react-x/globals: New rule for restricting usage of global variables in React components.react-x/static-components: New rule for enforcing static component definitions. Enhanced with variable reference tracking and acreatedHerediagnostic to reduce false positives.react-web-api/no-leaked-fetch: New rule that detects leakedfetchcalls in effects, closing #1714.
Kit Enhancements
- Added
ast.findParentutility to@eslint-react/kitfor traversing AST ancestors. - Added support for Universally Unique Lexicographically Sortable Identifiers (ULID) for anonymous rules (later migrated to
node:crypto randomBytes).
Custom Rule Examples
- Added Error Boundaries custom rule example.
- Added boolean prop naming custom rule and documentation.
🐞 Fixes
Rule Fixes
react-x/error-boundaries: Fixed false positives on non-React code and resolved catch block over-reporting.react-x/set-state-in-effect: Improved validation accuracy.react-x/use-memo: Added reassignment check, aligned message IDs, and added support forfor-of/for-inloops.
Config Fixes
- Added missing rules to presets, cleaned up experimental disables, and updated documentation.
- Extracted naming-convention preset and fixed config gaps.
Type Expression Fixes
- Added missing
Extract.unwrapfor type expressions and chain expressions. - Unwrapped type expressions before inspecting AST node types.
🪄 Improvements
API & Refactoring
ast: Normalized API naming conventions and rewrote Check helpers.ast: RenamedisJSXLike→isJSXElementOrFragmentandisMethodOrProperty→isPropertyOrMethod.- Extracted ESLint types and utilities into the
@eslint-react/eslintpackage. - Extracted
@eslint-react/jsxfrom@eslint-react/coreinto a standalone utility package for static analysis of JSX patterns. - Migrated to
@and#path aliases and replacedtsxwithvite-node. - Moved pattern utilities to rule directories and extracted rule helpers into co-located
lib.tsmodules across multiple plugins. - Reorganized imports across the codebase.
- Replaced
RuleConfigwithLinter.RulesRecordfrom ESLint. - Restructured monorepo packages directory layout.
- Unified import style across packages and plugins.
Core & AST Improvements
ast: UpdatedFunctionInitPathtypes to support method definitions and property arrow functions in class expressions.ast/isNodeEqual: FixedJSXNamespacedNamecomparison logic.
Rule Improvements
react-x/static-components: Registered inall,x, anddisable-experimentalconfigs.react-rsc/function-definition: Added directive position and quote checks.- Extracted HOC detection helpers to dedicated
lib.tsfiles.
Website & Documentation Improvements
- Added LLM routes (
/llms.txt,/llms-full.txt,/llms.mdx). - Added inline TOCs and improved navigation.
- Enabled twoslash type-checking for code examples.
- Improved accessibility and unified layout configuration.
Testing
- Expanded compiler fixture coverage across 9 rules.
- Added comprehensive unit tests for component/hook detection utilities.
Dependencies
- Bumped TypeScript to 6.0.3.
- Bumped Vite to ^8.0.7 in examples.
- Bumped
@typescript-eslintpackages to 8.59.1. - Bumped
tsl-dx,tsdown,fumadocs,postcss,lucide-react,eslint-plugin-package-json, and other dependencies.
📝 Documentation
- Added custom rule recipes for React Children API, Context API, props, state, boolean prop naming, and error boundaries.
- Added migration examples (
no-set-state,no-string-refs). - Added IMPL vs SPEC diff documents for 5 React Compiler aligned rules.
- Added spec documentation for validation rules.
- Added rule feature docs.
- Added table of contents to multiple documentation files.
- Updated migrating-from-eslint-plugin-react guide.
- Updated local packages docs.
- Updated roadmap and contributing architecture diagram.
🏗️ Internal
- Added
build:pluginsscript and updated build path patterns. - Added
publishConfig.accessto packages and marked@local/effas private. - Added documentation comments to rule scripts.
- Added typedoc docs and engines field.
- Extracted shared tsdown config.
- Fixed high-priority build, lockfile, script and doc inconsistencies.
- Removed "Naming Pattern Quick Reference" from AST abbreviations doc.
- Removed
major-release-checklist.md. - Removed
scripts/prepare-release.tsand the accompanyingprepare:releasenpm script. - Removed barrel exports for utils.
- Removed unused dependencies and added missing devDependencies.
Full Changelog: v4.2.1...v5.6.0