Skip to content

Web ESLint is stuck on the eslintrc compat shim, blocking eslint 10 and Next 16 #81

Description

@yashranaway

Two Dependabot bumps failed in the same place, for the same reason.

apps/web/eslint.config.mjs wraps the legacy eslintrc configs through FlatCompat:

const compat = new FlatCompat({ baseDirectory: ... });
const config = [
  ...compat.config({ extends: ["next/core-web-vitals", "next/typescript"] }),
  ...
];

That shim is what breaks:

Bump Failure
eslint 9 → 10 (#76) @rushstack/eslint-patch, pulled in by the legacy config path, throws on load
next group → 16 (#74) @eslint/eslintrc ConfigValidator.formatErrors: TypeError: Converting circular structure to JSON

eslint-config-next@15.5.20 ships no flat-config entry point — only index.js, core-web-vitals.js, typescript.js, and no exports map. Native flat config arrives with eslint-config-next 16, so the migration and the Next bump have to land together; neither bump can succeed alone.

Work

  • Bump next and eslint-config-next to 16, and eslint to 10.
  • Replace FlatCompat with eslint-config-next's native flat config, dropping the @eslint/eslintrc and @rushstack/eslint-patch dependencies.
  • Keep the current ignores (.next/**, next-env.d.ts).
  • Verify pnpm --filter @headless/web lint and next build — Next 16 is a framework major, so the build is the real check, not just lint.
  • Worth pairing with the dead-weight cleanup (F5 — Remove dead weight from the web bundle #51), since both touch the web dependency surface.

PRs #74 and #76 were closed in favour of this; left open they would only be rebased and re-fail.

Activity

  1. self-assigned this
    on Aug 10, 2026
  2. moved this from Todo to In Progress in Headless Roadmapon Aug 10, 2026
  3. yashranaway commented on Aug 10, 2026

    @yashranaway
    CollaboratorAuthor

    Implementation is now in #94. The native Next 16 flat config works, but current upstream package metadata and a local run show that the bundled React/import/a11y plugins do not yet support ESLint 10; eslint-plugin-react fails at runtime with contextOrFilename.getFilename is not a function. I split that remaining external compatibility gate into #93 so #81 can close when the Next 16 migration lands without hiding the deferred major upgrade.

  4. moved this from In Progress to Done in Headless Roadmapon Aug 10, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:webapps/web marketing and docs sitepriority:mediumScheduled, not blockingtype:choreMaintenance and cleanup

Type

No type

Projects

Relationships

None yet

Development

No branches or pull requests

Issue actions