What's Changed
✨ New
react-x/set-state-in-effect: reworked around explicit effect roots and a synchronous call graph with recursive value resolution, unifying stable aliases, multi-level helpers, named setups, and nested IIFEs. Indirect reports now target the effect-side trigger and deduplicate by setter sink; async functions remain deferred (documented limitation). (#2075)
🐞 Fixes
react-x/set-state-in-effect: TypeScript-wrapped setups are now resolved correctly. (#2075)react-x/set-state-in-effect: timer or event callbacks nested inuseCallback/useEffectEventare no longer treated as synchronous setters. (#2075)react-x/set-state-in-effect: expanded ref provenance to TypeScript assertions, computed member keys, and resolvable local getters. Plain same-branch overwrites now clear earlier ref exemptions, guard-test setters cannot self-exempt, and ref guards propagate through synchronous helpers and IIFEs. (#2075)react-x/set-state-in-effect: direct and indirect zero-argument setters now use the same reporting policy, and nested effect setups no longer discard the outer setup's remaining analysis. (#2075)
🏗️ Internal
@eslint-react/ast: added theCheck.isLoopStatementhelper;@eslint-react/core: narrowed the accepted node types of hook detection helpers. (#2075)- Bumped
nextto16.4.3,fumadocs-coreandfumadocs-uito16.17.8,fumadocs-mdxto15.4.10,fumadocs-typescriptto5.6.0,tsdownto0.23.2,nxto23.3.1, andeslint-plugin-package-jsonto1.11.0.
Full Changelog: v5.28.8...v5.30.0-beta.0
Attestation
https://github.com/Rel1cx/eslint-react/attestations/59473062