v5.11.0 (2026-07-05)
Immutable
release. Only release title and notes can be modified.
What's Changed
✨ New
react-x/refsnow detects ref mutations/reads inside helper functions that are called (directly, or through a simple variable alias) during render, closing a gap where any nested function was previously treated as a safe boundary regardless of whether it was actually invoked during render.react-x/refsnow reports a second guarded ref initialization: only a singleif (ref.current == null) { ref.current = ... }guarded initialization is allowed per ref per component/hook, and a second guarded write (in the same or a differentifblock) is reported asduplicateRefInit.react-x/refsnow supports.currentaccesses whose base is a member expression that looks like a ref (e.g.props.ref.current), not just a plain identifier.
🏗️ Internal
- Added unit tests for
packages/ast/src/check.ts. - Bumped
@effect/language-serviceto^0.86.4andpreactto^10.29.4. - Refactored
react-x/static-componentsinternals without changing behavior:findVariableForIdentifiernow delegates to@typescript-eslint/utils/ast-utils'sfindVariableinstead of a hand-rolled scope-chain walk,resolveDynamicValuewas split intofindDynamicCreationSiteandfindReassignmentCreationSite, and render-boundary/JSX-candidate handling was extracted into dedicated helpers. - Unified the signatures of
Check.isDirectiveandCheck.isIdentifierin@eslint-react/ast: both now take the node as the first argument and an optionalnameas the second, replacing the previous curried(name) => (node) => booleanshape. RemovedCheck.isStringLiteral; usets-pattern'sisMatchingor an inline type guard instead.
Full Changelog: v5.10.4...v5.11.0
Attestation
https://github.com/Rel1cx/eslint-react/attestations/33921957