Skip to content

chore: bump eslint 9->10 + eslint-plugin-react-hooks 5->7 (Dependabot #4/#7) - #30

Merged
alicoding merged 1 commit into
mainfrom
chore/eslint-10-react-hooks-7
Aug 12, 2026
Merged

chore: bump eslint 9->10 + eslint-plugin-react-hooks 5->7 (Dependabot #4/#7)#30
alicoding merged 1 commit into
mainfrom
chore/eslint-10-react-hooks-7

Conversation

@alicoding

Copy link
Copy Markdown
Owner

Summary

  • Bumps eslint 9.39.5 -> 10.8.1 and eslint-plugin-react-hooks 5.2.0 -> 7.1.1 together, one migration, not two: react-hooks 5.2.0 only peer-supports eslint up to ^9.0.0 (confirmed via npm view eslint-plugin-react-hooks@5.2.0 peerDependencies), so eslint 10 required react-hooks 7 in the same change. Supersedes Dependabot build(deps-dev): Bump eslint from 9.39.5 to 10.8.1 in /frontend #4 and build(deps-dev): Bump eslint-plugin-react-hooks from 5.2.0 to 7.1.1 in /frontend #7 (both red).
  • typescript-eslint (8.66+) and eslint-plugin-react-refresh (0.5.3) already peer-support eslint 10 -- no bump needed for either.
  • react-hooks 6.x/7.x folded the React Compiler's lint rules into recommended, which surfaced real new violations, each triaged individually (see commit message for the full rule-by-rule breakdown): two preserve-caught-error fixes (attach cause to two e2e-fixture throws), one no-useless-assignment fix (a genuinely dead initializer), a pure reorder in QuickPanel.tsx for react-hooks/immutability, two documented disable-line comments for legitimate false positives (react-hooks/refs on a headless-hook ref-spread idiom, react-hooks/purity on an intentional Date.now() read in a relative-time badge), and one project-wide rule tune-off (react-hooks/set-state-in-effect, matching .golangci.yml's own "tune when defaults fight house style" precedent) for an established 15-instance reset-state-on-id-change idiom that would otherwise require real behavioral refactoring well beyond this bump's scope.

Test plan

  • npm run lint -- 0 errors, 4 pre-existing warnings (react-refresh/only-export-components x3, exhaustive-deps x1 -- unrelated to this bump, unchanged plugin versions)
  • npx tsc --noEmit -- clean
  • npm run boundaries -- no dependency violations
  • npm run test -- 227/227 vitest tests pass
  • npm run build -- production build succeeds
  • go vet . ./internal/..., go build (desktop + server tags) -- unaffected, both green
  • file-loc-limit, rules-frontmatter, root-file-naming -- green
  • CI green through merge (auto-merge enabled)

🤖 Generated with Claude Code

https://claude.ai/code/session_01FYwojT8GdUbYSoggbvEFft

/#7)

Bundled together, not sequential: react-hooks 5.2.0 only peer-supports
eslint up to ^9.0.0, so eslint 10 required react-hooks 7.1.1 in the
same migration (confirmed via npm view peerDependencies before
starting, per Dependabot #4/#7 both being red).

react-hooks 6.x/7.x folded the React Compiler's lint rules into
`recommended`, surfacing real new violations, triaged rule-by-rule:
- preserve-caught-error (new eslint 10 core rule): two e2e fixture
  throws now attach `cause` to the original error.
- no-useless-assignment (new eslint 10 core rule): a genuinely dead
  initializer in SchemaIntake's detect().
- react-hooks/immutability: QuickPanel's refreshFrecency/openMain
  moved above the effects that reference them (order-only, same
  runtime closures).
- react-hooks/refs, react-hooks/purity: two legitimate false
  positives (a headless-hook ref-spread idiom in Tabs.tsx, an
  intentional Date.now() read in a relative-time badge) documented
  with disable-line comments.
- react-hooks/set-state-in-effect: tuned off project-wide in
  eslint.config.js -- flags an established, deliberate 15-instance
  reset-state-on-id-change idiom across the codebase; rewriting all
  15 call sites is real behavioral refactor work well beyond this
  bump's scope, so this follows .golangci.yml's own "tune when
  defaults fight house style" precedent instead of scattering 15
  disable-line comments or silently regressing behavior.

Also bumped @eslint/js to match eslint 10's flat-config recommended
preset. typescript-eslint (8.66+) and eslint-plugin-react-refresh
(0.5.3) already peer-support eslint 10, so neither needed a bump.

Full local suite green: eslint, tsc, boundaries, vitest (227/227),
frontend build, go vet, go build (desktop+server), file-loc-limit,
rules-frontmatter, root-file-naming.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FYwojT8GdUbYSoggbvEFft
@alicoding
alicoding enabled auto-merge (squash) August 12, 2026 19:49
@alicoding
alicoding merged commit ebb2b86 into main Aug 12, 2026
55 of 61 checks passed
alicoding added a commit that referenced this pull request Aug 15, 2026
/#7) (#30)

Bundled together, not sequential: react-hooks 5.2.0 only peer-supports
eslint up to ^9.0.0, so eslint 10 required react-hooks 7.1.1 in the
same migration (confirmed via npm view peerDependencies before
starting, per Dependabot #4/#7 both being red).

react-hooks 6.x/7.x folded the React Compiler's lint rules into
`recommended`, surfacing real new violations, triaged rule-by-rule:
- preserve-caught-error (new eslint 10 core rule): two e2e fixture
  throws now attach `cause` to the original error.
- no-useless-assignment (new eslint 10 core rule): a genuinely dead
  initializer in SchemaIntake's detect().
- react-hooks/immutability: QuickPanel's refreshFrecency/openMain
  moved above the effects that reference them (order-only, same
  runtime closures).
- react-hooks/refs, react-hooks/purity: two legitimate false
  positives (a headless-hook ref-spread idiom in Tabs.tsx, an
  intentional Date.now() read in a relative-time badge) documented
  with disable-line comments.
- react-hooks/set-state-in-effect: tuned off project-wide in
  eslint.config.js -- flags an established, deliberate 15-instance
  reset-state-on-id-change idiom across the codebase; rewriting all
  15 call sites is real behavioral refactor work well beyond this
  bump's scope, so this follows .golangci.yml's own "tune when
  defaults fight house style" precedent instead of scattering 15
  disable-line comments or silently regressing behavior.

Also bumped @eslint/js to match eslint 10's flat-config recommended
preset. typescript-eslint (8.66+) and eslint-plugin-react-refresh
(0.5.3) already peer-support eslint 10, so neither needed a bump.

Full local suite green: eslint, tsc, boundaries, vitest (227/227),
frontend build, go vet, go build (desktop+server), file-loc-limit,
rules-frontmatter, root-file-naming.


Claude-Session: https://claude.ai/code/session_01FYwojT8GdUbYSoggbvEFft

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant