Context
PR #112 attempted to bump eslint 9.39.4 → 10.4.1, but failed because eslint-plugin-react@7.37.5 (transitive via eslint-config-next@16.2.6) declares peerDependencies.eslint: "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" — capping at ^9.7, excluding eslint 10.
PR #112 has been closed in favor of this tracking issue.
Upstream status
- Open issue (root cause): jsx-eslint/eslint-plugin-react#3977 — "ESLint v10 compatibility" — 277 reactions, open, no release promised.
- Open fix PR: jsx-eslint/eslint-plugin-react#3979 — open since 2026-02-09, mergeable, no movement toward merge in 4 months.
- Next.js tracking: vercel/next.js#89764 — open, labeled
Upstream. Maintainer icyJoseph posture: "I rather see an upstream fix merged and published first."
- Maintainer ljharb's stance: "we're explicitly not compatible with eslint 10. Until peer dep range is updated, one should not attempt to use eslint 10 with this plugin."
Blocker dep chain
@next/eslint-plugin-next@16.2.7 → eslint-plugin-react@7.37.5 → peer cap ^9.7
Other plugins already support eslint 10:
eslint-plugin-react-hooks@7.1.1 (peer includes ^10.0.0) ✓
typescript-eslint@8.59.3 (peer ^8.57.0 || ^9.0.0 || ^10.0.0) ✓
@typescript-eslint/parser + eslint-plugin v8.59.3 ✓
eslint-config-next@16.2.7 (peer >=9.0.0) ✓
eslint-config-prettier@10.1.8 ✓
Decision
Date: 2026-06-05. Decision: defer eslint 10 upgrade until upstream fix ships a published release.
Rationale:
- Single dependency (
eslint-plugin-react@7.37.5) blocks the entire upgrade.
- No published release of that plugin supports eslint 10 yet.
- Force-overriding via npm
overrides is technically possible but risks runtime breakage (the plugin's rules hit eslint 10's new context API which v7.37.5 was not built against).
- Workaround Option B from the research (drop
eslint-config-next/core-web-vitals, use @next/eslint-plugin-next + eslint-plugin-react-hooks directly) is feasible but loses the preset's react/recommended rules — not worth it for an unproven upgrade.
Re-attempt trigger
Re-attempt the eslint 10 bump when all of the following are true:
eslint-plugin-react publishes a release with peerDependencies.eslint accepting ^10.
- PR #3979 (or equivalent fix) is merged and released.
eslint-config-next releases a version depending on the new plugin version.
- CI smoke run with the new
eslint version passes locally (typecheck + lint + format:check + test).
Related
Context
PR #112 attempted to bump
eslint9.39.4 → 10.4.1, but failed becauseeslint-plugin-react@7.37.5(transitive viaeslint-config-next@16.2.6) declarespeerDependencies.eslint: "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7"— capping at ^9.7, excluding eslint 10.PR #112 has been closed in favor of this tracking issue.
Upstream status
Upstream. MaintainericyJosephposture: "I rather see an upstream fix merged and published first."Blocker dep chain
Other plugins already support eslint 10:
eslint-plugin-react-hooks@7.1.1(peer includes^10.0.0) ✓typescript-eslint@8.59.3(peer^8.57.0 || ^9.0.0 || ^10.0.0) ✓@typescript-eslint/parser+eslint-pluginv8.59.3 ✓eslint-config-next@16.2.7(peer>=9.0.0) ✓eslint-config-prettier@10.1.8✓Decision
Date: 2026-06-05. Decision: defer eslint 10 upgrade until upstream fix ships a published release.
Rationale:
eslint-plugin-react@7.37.5) blocks the entire upgrade.overridesis technically possible but risks runtime breakage (the plugin's rules hit eslint 10's new context API which v7.37.5 was not built against).eslint-config-next/core-web-vitals, use@next/eslint-plugin-next+eslint-plugin-react-hooksdirectly) is feasible but loses the preset'sreact/recommendedrules — not worth it for an unproven upgrade.Re-attempt trigger
Re-attempt the eslint 10 bump when all of the following are true:
eslint-plugin-reactpublishes a release withpeerDependencies.eslintaccepting^10.eslint-config-nextreleases a version depending on the new plugin version.eslintversion passes locally (typecheck + lint + format:check + test).Related
correction-optimizationplan