logoESLint React

v5.8.0–v5.26.5 Retrospective

A recap of five months of LTS maintenance: React Compiler alignment, fact-based rule architecture, Web API leak detection hardening, and ecosystem compatibility

This article consolidates the highlights of 107 releases across 19 minor lines, from v5.8.0 (2026-05-17) to v5.26.5 (2026-10-13), while the project is in LTS maintenance mode.

v5.8.x — Documentation Overhaul (2026-05-17 → 06-12, 19 releases)

  • JSX package aligned with React/Babel source semantics: children filtering and whitespace handling were unified into public APIs in @eslint-react/jsx, improving the accuracy of no-useless-fragment, no-children-prop, and related rules.
  • Rule documentation overhaul: all plugin docs were migrated from the old Common Violations/Invalid/Valid format to a scenario-based Examples/Troubleshooting/Further Reading format; 48 react-x rule docs gained scenario examples.
  • Representative fixes: a major false-positive reduction in no-unused-state; nested state mutation detection in no-direct-mutation-state; React 19 attribute whitelist (precedence/blocking) in no-unknown-property.

v5.9.0 (2026-06-13)

  • New rule: react-web-api/no-leaked-intersection-observer, enabled as warn in the recommended preset.

  • Tighter observer leak semantics: calling disconnect only inside the observer's own callback now counts as a leak, since the callback may never run after unmount.

    useEffect(() => {
      const observer = new IntersectionObserver((entries) => {
        // ...
        observer.disconnect(); // reported: only inside the callback — still a leak
      });
      observer.observe(el);
      // missing: return () => observer.disconnect();
    }, []);

v5.10.x–v5.14.x — React Compiler Alignment Sprint (2026-06-28 → 07-15, 24 releases)

No new rules; the focus was deep rework of refs and immutability:

  • v5.11.0: refs detects ref reads/writes inside helper functions called during render; new duplicateRefInit diagnostic.

    function Component() {
      const ref = useRef(0);
      const bump = () => {
        ref.current += 1; // reported: `bump` is invoked during render
      };
      bump();
      return <div>{ref.current}</div>;
    }
  • v5.12.0: immutability was reworked to align with React Compiler's ValidateNoFreezingKnownMutableFunctions validation pass.

  • v5.13.0: refs gained nested property write tracking and member-expression-bound function tracing; lazy-initialization guard detection became direction-aware.

  • v5.14.0: refs render-reachability analysis expanded to IIFEs and useMemo/useReducer callbacks with unbounded fixed-point propagation; internals switched to scope-variable-identity tracking.

  • v5.14.6/.7: immutability stopped treating navigation-hook methods (useRouter().push(), useNavigate()) as in-place mutations inside frozen callbacks; useHistory followed in v5.16.1.

v5.15.x–v5.20.x — New Capabilities and Preset Fixes (2026-07-15 → 09-24, 28 releases)

  • v5.16.0: tagged-template hook calls (Motion-style APIs) are now recognized.

    const x = useMotionValue(100);
    const transform = useMotionTemplate`transform(${x}px)`;
    //                ^^^ tagged template literal hook call
  • v5.18.0: new shared setting additionalRefHooks — five rules uniformly recognize custom ref-creating hooks, completing the custom-hook declaration system alongside additionalStateHooks/additionalEffectHooks.

  • v5.18.8/.10: fixed the frequently-hit "Cannot redefine plugin" integration error across all presets — the most user-impactful fix of this period.

  • v5.18.2/.3: no-nested-component-definitions refined (known-wrapper resolution, narrowed with* HOC detection).

  • v5.19.0: immutability now reports direct mutations of props/state, plus nested mutations through shallow copies ({ ...state }).

    const copy = { ...state };
    copy.items.push(item); // reported: nested values are still shared with `state`
    copy.label = "new"; // not reported: top-level write to the copy's own slot
  • v5.20.0: immutability reports mutations of for...of iteration variables; v5.20.6 systematically closed missed write forms — destructuring targets, loop targets, delete — across immutability, use-memo, globals, and refs.

    for (const item of props.items) {
      item.done = true; // reported: mutates shared elements of `props.items`
    }
  • purity alias resolution improvements; react-dom polymorphic component (<motion.div as="button">) resolution fixes.

v5.21.x–v5.26.5 — Ecosystem Expansion and Final Polish (2026-09-28 → 10-13, 30 releases)

  • v5.21.0: Oxlint compatibility — eslint became an optional peer dependency, so the plugins can run in environments without ESLint installed.

  • v5.21.1: web-api leak rules now resolve variables by scope, fixing the cross-effect same-name mispairing that name-only matching could cause.

  • v5.22.0: support for React 19.3 DOM attributes (closedby, shadowrootmode, and friends).

  • v5.23.0 / v5.24.0: fact-based architecture adopted in core rules — static-components, set-state-in-effect, set-state-in-render, and use-memo were split into collect/origins/effects modules; static-components also gained dynamic creation-site tracing through logical and sequence expressions, reported once per creation site.

  • v5.23.3/.5 → v5.26.5: the ref-derived-value exemption system in set-state-in-effect kept expanding (template interpolation, literals, optional chaining, indirect calls, assignment tracing, short-circuit operators), aligning with react-hooks 7.1.1.

    useEffect(() => {
      const dv = visible - prevVisible.current;
      if (dv === 0) return; // ref-derived early-return guard exempts the rest
      setData(`${prevVisible.current}`); // ref-derived interpolation — exempt
      setMeta({ value: prevVisible.current }); // object literal — exempt
    }, [visible]);
  • v5.24.7: leak-rule fixes — recursive signal alias chains, destructured AbortController, observer cleanup-phase semantics.

  • v5.24.2/.4: smaller published packages (tsdown dead-code elimination, stripped JSDoc).

  • v5.25.0: no-unsafe-target-blank gained the allowReferrer option.

  • v5.26.0: minimum Node.js version lowered from 22 to 20.19, broadening the install base.

  • v5.26.2: no-unused-props detection improvements (default-valued params, alias tracing, template-literal keys).

  • v5.26.3/.4: name-lookup boundary fixes for the three naming-convention rules.

References

On this page