Skip to content

chore(deps): upgrade to ESLint 10 (blocked on upstream #3979) #122

Description

@EmiyaKiritsugu3

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:

  1. Single dependency (eslint-plugin-react@7.37.5) blocks the entire upgrade.
  2. No published release of that plugin supports eslint 10 yet.
  3. 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).
  4. 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:

  1. eslint-plugin-react publishes a release with peerDependencies.eslint accepting ^10.
  2. PR #3979 (or equivalent fix) is merged and released.
  3. eslint-config-next releases a version depending on the new plugin version.
  4. CI smoke run with the new eslint version passes locally (typecheck + lint + format:check + test).

Related

Metadata

Metadata

Assignees

No one assigned

    Labels

    dependenciesDependency upgrades, bump tracking, supply-chaintech-debtDeferred technical debt, future work tracking

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions