web: upgrade ESLint to v9 with flat config#9250
Conversation
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
MobileInstall the Dev Tool (iOS via TestFlight, iOS Simulator, or Android .apk) here. Scan the QR with your phone camera, or tap Open in Dev Tool on the device, to open this branch in the installed Dev Tool dev client.
Deep linksiOS Android Web (Vercel)View the Vercel web preview for this branch. Backend
Other
|
|
Hey @kevinortiz43 just checking did you follow the migration guide for this? If so can you please link it in the description? |
|
@nabramow You are right I did not include the migrations guides, I have included it now. |
|
@kevinortiz43 I noticed this is marked as a draft, but you also marked me as a reviewer. Are you still working on it or is it ready for review? |
|
@nabramow yes please review! I was scared about this one and wanted the CI/CD pipeline to go green then check out vercel and make sure everything worked fine before asking for a review. |
|
alright the vercel preview looks good |
…npmjs.com/package/@eslint/eslintrc?activeTab=versions @eslint/js to 9.39.5, up to date as of 5 days ago - https://www.npmjs.com/package/@eslint/js/v/10.0.1?activeTab=versions
…intjs latest versions
nabramow
left a comment
There was a problem hiding this comment.
Okay this looks good to go now! Thanks for picking this up!
📝 Release NotesThis PR does not need to be included in release notes. Reason: This PR is a developer tooling upgrade for ESLint configuration in the web app. It does not change user-facing behavior or fix a noticeable end-user issue, and while it helps enable a future Next.js upgrade, on its own it is routine internal technical work rather than a major infrastructure change users would care about. 🤖 Bot Debug InformationModel: |


Migrates
app/webfrom ESLint 8 (legacy.eslintrc.json) to ESLint 9 with the new flat config (eslint.config.mjs). This is the prerequisite for upgrading to Next.js 16, which requires ESLint 9 + flat config.Done as 4 incremental, individually-validated commits at major-change boundaries: pin 8.57.1 → migrate to flat config on 8.57 → ESLint 9.0.0 → latest 9.x (9.39.4).
eslint-config-next15.5.7 is legacy-format only, sonext/core-web-vitalsis loaded viaFlatCompat(@eslint/eslintrc); native flat exports are a follow-up coupled to the Next 16 bump. The flat config is a 1:1 translation of the old.eslintrc.json(same plugins, same rule severities,proto/**ignore preserved).Closes #7383
Migration guides followed
--ext/.eslintignoreremoval, the removed-API checklist.FlatCompat(@eslint/eslintrc) pattern for loadingnext/core-web-vitals, sinceeslint-config-next15.x ships only the legacy config format.Testing
Lint parity was the primary gate at every stage (repo is at zero warnings, so a config that lints nothing would also pass CI — parity was verified explicitly, not just "lint passes"):
eslint --print-configrule-map diff empty on 5 representative files (feature.tsx,.test.tsx, a.jsscript, a locale.json,package.json).@next/next/no-img-element/jsonc/no-commentsstay off — identical ruleset old vs new.yarn lint --max-warnings=0green at all 4 stages.yarn formatidempotent,tsc --noEmitpasses, fullyarn testsuite: zero regressions (only pre-existing parallel-load flakes).yarn build(production) passes, no rushstack/eslint stack traces.Note: no runtime/UI code changed — this is a lint-toolchain migration, so the browser smoke was a sanity check rather than a UI review.
Web frontend checklist
For maintainers
This PR was created with the Couchers PR skill.