Releases: Rel1cx/eslint-react
v4.2.5-beta.1 (2026-04-03)
What's Changed
🐞 Fixes
📝 Documentation
- add missing index pages and clean up redirects for flattened URLs (
c419f4282)
Full Changelog: v4.2.3...v4.2.5-beta.0
v4.2.3 (2026-04-03)
What's Changed
✨ New
- jsx: add jsx-no-leaked-dollar rule, add suggest fix to jsx-no-leaked-semicolon rule (#1688) (
b86bdd6da) - jsx: add jsx-no-leaked-semicolon rule, closes #1685 (#1686) (
fbb495000)
📝 Documentation
- update recipe section structure (Code→Rule, Usage→Config) (
8cade3008) - update custom rule examples code style (#1684) (
dc9d05c33) - update recipe titles to Title Case (
6a2d941b6) - improve recipes overview (
8278f45c9)
Full Changelog: v4.2.2...v4.2.3
v4.2.2 (2026-04-02)
What's Changed
🪄 Improvements
refactor(kit): RenameRuleDefinitiontoRuleFunctionand deprecate the old name (#1683). TheRuleDefinitiontype is now deprecated and will be removed in a future major release. Please migrate toRuleFunction.
📝 Documentation
docs: AddnoCircularEffectrecipe and register in examples, closes #755 (#1681).docs: Addcomponent-hook-factoriesrecipe and update examples.docs: AddnoExplicitSpreadPropsrule tocustom-rules-of-propsrecipe, closes #503.docs: Migrate recipe docs to MDX format.docs: Flatten recipe docs from tabbed UI to plain markdown sections.docs: Standardize quotes in rule descriptions (#1680).docs: Standardize punctuation and phrasing in recipe docs (#1682).docs: Standardize recipe frontmatter descriptions.docs(website): Update recipes overview page.docs(website): Add "See Also" cross-references to recipes docs.docs(website): Simplify rule definition example in recipes overview.docs: Remove obsoletecomponent-hook-factoriesreferences from recipes.docs: Remove Roadmap section from READMEs.docs: Remove Custom Rules for Missing Rules link.docs: Add Recipes link and update install command.docs: Switch to installing@eslint-react/kitwithout rc tag.
Full Changelog: v4.2.1...v4.2.2
v4.2.1 (2026-04-01)
What's Changed
This release consolidates all changes since v3.0.0.
💥 Breaking Changes
New eslint-plugin-react-jsx package
A new dedicated plugin for React Flavored JSX rules has been introduced. Several rules have been migrated from eslint-plugin-react-x and eslint-plugin-react-dom to this new package:
Old Rule (react-x/) |
New Rule (react-jsx/) |
Change |
|---|---|---|
jsx-key-before-spread |
no-key-after-spread |
relocated, renamed |
jsx-no-comment-textnodes |
no-comment-textnodes |
relocated, renamed |
no-children-prop |
no-children-prop |
relocated |
no-useless-fragment |
no-useless-fragment |
relocated |
Old Rule (react-dom/) |
New Rule (react-jsx/) |
Change |
|---|---|---|
no-namespace |
no-namespace |
relocated |
Rule prefix changes in @eslint-react/eslint-plugin
Rules from individual plugins now use a flattened naming convention when accessed through the unified @eslint-react/eslint-plugin package:
@eslint-react/<rule>->@eslint-react/<rule>(no changes)@eslint-react-jsx-<rule>->@eslint-react-jsx-<rule>(no changes)@eslint-react/rsc/<rule>->@eslint-react/rsc-<rule>@eslint-react/dom/<rule>->@eslint-react/dom-<rule>@eslint-react/web-api/<rule>->@eslint-react/web-api-<rule>@eslint-react/naming-convention/<rule>->@eslint-react/naming-convention-<rule>@eslint-react/debug/<rule>->@eslint-react/debug-<rule>
Removed Rules from eslint-plugin-react-x
The following rules have been removed from eslint-plugin-react-x:
| Rule | Replaced by |
|---|---|
react-x/jsx-dollar |
@eslint-react/kit (custom rule) |
react-x/jsx-shorthand-boolean |
@eslint-react/kit (custom rule) |
react-x/jsx-shorthand-fragment |
@eslint-react/kit (custom rule) |
react-x/unstable-rules-of-props |
Recipes: custom-rules-of-props |
react-x/unstable-rules-of-state |
Recipes: custom-rules-of-state |
JSX utilities extracted from @eslint-react/core to @eslint-react/jsx
The JSX module has been extracted from @eslint-react/core into a new standalone @eslint-react/jsx package. The following exports are no longer available from @eslint-react/core:
JsxInspectorclass — removed, replaced with standalone utility functions from@eslint-react/jsx(e.g.findAttribute,hasAttribute,getChildren,isElement,isFragmentElement,isHostElement,isJsxLike, etc.)JsxConfig,JsxDetectionHint,JsxAttributeValue— moved to@eslint-react/jsxgetElementType— renamed togetElementFullTypein@eslint-react/jsxgetElementSelfName— renamed togetElementSelfTypein@eslint-react/jsx
Removed ref APIs from @eslint-react/core
The following ref-related APIs have been removed from @eslint-react/core without replacement:
isRefIdisInitializedFromRefgetRefInitisRefLikeName
Core collector API renames
The collector APIs in @eslint-react/core have been renamed:
| Before | After |
|---|---|
useComponentCollector() |
getComponentCollector() |
useComponentCollectorLegacy() |
getComponentCollectorLegacy() |
useHookCollector() |
getHookCollector() |
Collector return property .ctx |
Collector return property .api |
@eslint-react/kit API restructuring
The hint API in @eslint-react/kit has been restructured for better namespacing:
| Before | After |
|---|---|
hint.defaultComponent |
hint.component.Default |
@eslint-react/kit API redesign
The defineConfig function has been replaced with a chainable builder API for better composability and type inference:
| Before | After |
|---|---|
defineConfig({ rules: [rule1, rule2] }) |
eslintReactKit().use(rule1).use(rule2).getConfig() |
The new API provides better TypeScript intellisense and allows for more flexible rule configuration:
import eslintReactKit from "@eslint-react/kit";
export default defineConfig(
{
files: ["**/*.{ts,tsx}"],
extends: [
// ... other configs
eslintReactKit()
.use(functionComponentDefinition)
.use(maxComponentPerFile, { max: 1 })
.getConfig(),
],
},
);react-jsx: Renameno-deoptimizationrule tono-key-after-spreadfor clearer intent (#1668).kit: Removefilesoption fromgetConfig()and normalize file extensions handling (#1669). Thefilesoption is no longer supported; file extensions are now automatically normalized to include both standard and TypeScript variants.
✨ New
- New
jsxanddisable-jsxconfig presets in@eslint-react/eslint-plugin. - New
react-dom-with-custom-rulesexample project demonstrating custom rule creation with@eslint-react/kit. eslint-plugin-react-jsx: New plugin dedicated to React Flavored JSX rules. Ships withrecommendedandstrictconfig presets.react-jsx/no-children-prop-with-children: New rule that disallows passingchildrenas a prop when children are also passed as nested content.react-jsx/no-key-after-spread: New rule that prevents patterns causing deoptimization when using the automatic JSX runtime (e.g. placingkeyafter spread props).react-jsx/no-namespace: New rule that disallows JSX namespace syntax, as React does not support them.@eslint-react/jsx: New utility package for static analysis of JSX patterns in TSESTree ASTs, extracted from@eslint-react/core.@eslint-react/kit: New utility module for building custom ESLint rules with React awareness. Provides a chainableeslintReactKit().use().getConfig()builder API and aRuleToolkitinterface with pre-bound context helpers for component/hook analysis.@eslint-react/kit: Re-export types from@eslint-react/sharedfor better TypeScript intellisense.kit: AddgetPlugin()API toBuilderfor fine-grained control over plugin namespace and rule severities.kit: Support more file extensions ingetConfigdefaults (js,mjs,cjs,jsx,ts,mts,cts,tsx), closes #1659.kit.settings: Expose normalized ESLint React settings viasettingsproperty onRuleToolkit.docs(utilities): Add utilities documentation for utility modules, closes #1656.
🐞 Fixes
purity: Remove console methods from impurity detection, closes #1616 (#1676).purity: Treatnew Date(arg)as pure, closes #1582 (#1677).react-jsx: Improve type safety and edge case handling for JSX rules (#1664).react-x:component-hook-factories: Exclude HOC patterns and test mocks from component detection, closes #1652. Thanks @zerone0x!react-x:component-hook-factories: UseisComponentNameLoosefor more accurate component parameter checks.react-x:immutability: Exclude event handler params from props mutation check, closes #1647. Thanks @zerone0x!react-x:no-duplicate-key: Fix false positive for SVGxlinkattributes.react-x:purity: RemoveAbortControllerfrom impure constructors, closes #1648. Thanks @zerone0x!core:isReactAPI: Fix API name matching logic to useendsWithfor precise matching.core:isRenderMethodLike: SupportClassExpressionin addition toClassDeclaration.core:findImportSource: Add cycle detection to prevent infinite recursion when resolving variable aliases.ast: Fix JSX attribute name comparison to useisNodeEqualinstead of string comparison, properly handlingJSXNamespacedName(e.g.,xlink:href).ast: UpdateFunctionInitPathtypes to support method definitions and property arrow functions in class expressions.ast:isNodeEqual: FixJSXNamespacedNamecomparison logic.var: Fix logic bugs incompute-object-type,find-enclosing-assignment-target, andis-value-equalutilities (#1672).docs: Update package structure documentation in contributing guide and FAQ, closes #1658.
🪄 Improvements
react-jsx/no-children-prop: Add suggestion-fix feature to move children from prop to element content.@eslint-react/eslint-plugin: Unified plugin architecture refactored — configs now auto-inject the plugin, so users no longer need to manually register it separately.refactor(kit): ImproveBuilderandRuleDefinitionimplementation for better type inference and code organization.refactor(kit): ReplacedefineConfigwith chainable.use().getConfig()builder API, closes #1644.refactor(kit): Remove unused type parameter fromCollectorWithContext<T, E>to `CollectorWithC...
v4.2.0-beta.3 (2026-04-01)
What's Changed
🐞 Fixes
- purity: treat new Date(arg) as pure, closes #1582 (#1677) (
f727b59f5) - purity: remove console methods from impurity detection, closes #1616 (#1676) (
10fe2eb0e)
📝 Documentation
- scripts: add comprehensive README and more automation scripts (#1673) (
dcaa5aa45)
Full Changelog: v4.2.0-beta.2...v4.2.0-beta.3
v4.2.0-beta.1 (2026-03-31)
What's Changed
🐞 Fixes
ast:isNodeEqual: FixJSXNamespacedNamecomparison logic.
🪄 Improvements
test: Add comprehensive test coverage forfind-import-source,is-react-api, legacy component detection, hook detection, function init path, and node equality utilities (#1671).deps: Update typescript-eslint to ^8.58.0 (#1670).
Full Changelog: v4.2.0-beta.0...v4.2.0-beta.1
v4.2.0-beta.0 (2026-03-31)
What's Changed
💥 Breaking Changes
kit: Removefilesoption fromgetConfig()and normalize file extensions handling (#1669). Thefilesoption is no longer supported; file extensions are now automatically normalized to include both standard and TypeScript variants.
🐞 Fixes
react-x:component-hook-factories: UseisComponentNameLoosefor more accurate component parameter checks.
Full Changelog: v4.1.0-beta.0...v4.2.0-beta.0
v4.1.0-beta.0 (2026-03-30)
What's Changed
💥 Breaking Changes
react-jsx: Renameno-deoptimizationrule tono-key-after-spreadfor clearer intent (#1668).
Full Changelog: v4.0.3-beta.0...v4.1.0-beta.0
v4.0.3-beta.0 (2026-03-30)
What's Changed
🐞 Fixes
react-x:component-hook-factories: Exclude HOC patterns and test mocks from component detection, closes #1652. Thanks @zerone0x!react-jsx: Improve type safety and edge case handling for JSX rules (#1664).
Full Changelog: v4.0.2-beta.6...v4.0.3-beta.0
v4.0.2-beta.6 (2026-03-30)
What's Changed
🪄 Improvements
test: Enhance test coverage forreact-xandreact-domrules, closes #1663.
Full Changelog: v4.0.2-beta.5...v4.0.2-beta.6