Skip to content

Releases: Rel1cx/eslint-react

v4.2.5-beta.1 (2026-04-03)

03 Apr 15:17
02cb5c9

Choose a tag to compare

Pre-release

What's Changed

🐞 Fixes

  • react-x: error-boundaries: Fix false positives on non-react code, closes #1690 (#1693) (d2103595d)

📝 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)

02 Apr 18:36
e5e2732

Choose a tag to compare

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)

01 Apr 23:52
b93af46

Choose a tag to compare

What's Changed

🪄 Improvements

  • refactor(kit): Rename RuleDefinition to RuleFunction and deprecate the old name (#1683). The RuleDefinition type is now deprecated and will be removed in a future major release. Please migrate to RuleFunction.

📝 Documentation

  • docs: Add noCircularEffect recipe and register in examples, closes #755 (#1681).
  • docs: Add component-hook-factories recipe and update examples.
  • docs: Add noExplicitSpreadProps rule to custom-rules-of-props recipe, 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 obsolete component-hook-factories references 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/kit without rc tag.

Full Changelog: v4.2.1...v4.2.2

v4.2.1 (2026-04-01)

01 Apr 14:39
7f0529d

Choose a tag to compare

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:

  • JsxInspector class — 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/jsx
  • getElementType — renamed to getElementFullType in @eslint-react/jsx
  • getElementSelfName — renamed to getElementSelfType in @eslint-react/jsx

Removed ref APIs from @eslint-react/core

The following ref-related APIs have been removed from @eslint-react/core without replacement:

  • isRefId
  • isInitializedFromRef
  • getRefInit
  • isRefLikeName

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: Rename no-deoptimization rule to no-key-after-spread for clearer intent (#1668).
  • kit: Remove files option from getConfig() and normalize file extensions handling (#1669). The files option is no longer supported; file extensions are now automatically normalized to include both standard and TypeScript variants.

✨ New

  • New jsx and disable-jsx config presets in @eslint-react/eslint-plugin.
  • New react-dom-with-custom-rules example project demonstrating custom rule creation with @eslint-react/kit.
  • eslint-plugin-react-jsx: New plugin dedicated to React Flavored JSX rules. Ships with recommended and strict config presets.
  • react-jsx/no-children-prop-with-children: New rule that disallows passing children as 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. placing key after 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 chainable eslintReactKit().use().getConfig() builder API and a RuleToolkit interface with pre-bound context helpers for component/hook analysis.
  • @eslint-react/kit: Re-export types from @eslint-react/shared for better TypeScript intellisense.
  • kit: Add getPlugin() API to Builder for fine-grained control over plugin namespace and rule severities.
  • kit: Support more file extensions in getConfig defaults (js, mjs, cjs, jsx, ts, mts, cts, tsx), closes #1659.
  • kit.settings: Expose normalized ESLint React settings via settings property on RuleToolkit.
  • docs(utilities): Add utilities documentation for utility modules, closes #1656.

🐞 Fixes

  • purity: Remove console methods from impurity detection, closes #1616 (#1676).
  • purity: Treat new 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: Use isComponentNameLoose for 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 SVG xlink attributes.
  • react-x: purity: Remove AbortController from impure constructors, closes #1648. Thanks @zerone0x!
  • core: isReactAPI: Fix API name matching logic to use endsWith for precise matching.
  • core: isRenderMethodLike: Support ClassExpression in addition to ClassDeclaration.
  • core: findImportSource: Add cycle detection to prevent infinite recursion when resolving variable aliases.
  • ast: Fix JSX attribute name comparison to use isNodeEqual instead of string comparison, properly handling JSXNamespacedName (e.g., xlink:href).
  • ast: Update FunctionInitPath types to support method definitions and property arrow functions in class expressions.
  • ast: isNodeEqual: Fix JSXNamespacedName comparison logic.
  • var: Fix logic bugs in compute-object-type, find-enclosing-assignment-target, and is-value-equal utilities (#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): Improve Builder and RuleDefinition implementation for better type inference and code organization.
  • refactor(kit): Replace defineConfig with chainable .use().getConfig() builder API, closes #1644.
  • refactor(kit): Remove unused type parameter from CollectorWithContext<T, E> to `CollectorWithC...
Read more

v4.2.0-beta.3 (2026-04-01)

31 Mar 19:41
3cc4964

Choose a tag to compare

Pre-release

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)

31 Mar 12:45
92dfe76

Choose a tag to compare

Pre-release

What's Changed

🐞 Fixes

  • ast: isNodeEqual: Fix JSXNamespacedName comparison logic.

🪄 Improvements

  • test: Add comprehensive test coverage for find-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)

30 Mar 17:01
120f890

Choose a tag to compare

Pre-release

What's Changed

💥 Breaking Changes

  • kit: Remove files option from getConfig() and normalize file extensions handling (#1669). The files option is no longer supported; file extensions are now automatically normalized to include both standard and TypeScript variants.

🐞 Fixes

  • react-x: component-hook-factories: Use isComponentNameLoose for 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)

30 Mar 12:35
8cd2434

Choose a tag to compare

Pre-release

What's Changed

💥 Breaking Changes

  • react-jsx: Rename no-deoptimization rule to no-key-after-spread for clearer intent (#1668).

Full Changelog: v4.0.3-beta.0...v4.1.0-beta.0

v4.0.3-beta.0 (2026-03-30)

30 Mar 12:01
db1173b

Choose a tag to compare

Pre-release

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)

30 Mar 08:34
e2efcaf

Choose a tag to compare

Pre-release

What's Changed

🪄 Improvements

  • test: Enhance test coverage for react-x and react-dom rules, closes #1663.

Full Changelog: v4.0.2-beta.5...v4.0.2-beta.6