Skip to content

Update to ESLint 10 and TypeScript 6 #213

Description

@jhnns

Just a quick update what's currently blocking. This is the AI output:

TypeScript 6

Partly, by fixing the real peer cap — but one dependency still blocks a fully strict install.

typescript-eslint
On 8.57.x, peers are typescript: ">=4.8.4 <6.0.0", so TypeScript 6 is rejected.
From 8.58.0 onward, peers are typescript: ">=4.8.4 <6.1.0", so TypeScript 6 is allowed.
No overrides and no --force are required for typescript-eslint once you’re on ≥8.58.

@eslint-react/eslint-plugin@2.13.x
It still declares typescript: ">=4.8.4 <6.0.0". That directly conflicts with TypeScript 6, so npm install fails with ERESOLVE until something gives.
package.json overrides do not rewrite another package’s peer ranges, so they don’t remove this conflict.
@eslint-react/eslint-plugin@4.x allows typescript: "*", but it requires ESLint 10, while your stack (e.g. eslint-plugin-react, eslint-plugin-react-hooks) is still on ESLint 9 peers, so that’s not a drop-in upgrade yet.

ESLint 10

Here’s what actually gates ESLint 10 for this repo, going by your current dependencies and each package’s peerDependencies on npm today.

These are the ones that do not declare ESLint 10 on their latest tag, so a strict install with eslint@10 will disagree with their peers:

Package Declared eslint peer (latest)
eslint-plugin-react ^3 || … || ^9.7no 10
eslint-plugin-react-hooks ^3 … || ^9.0.0no 10
eslint-plugin-jsx-a11y ^3 || … || ^9no 10
@tanstack/eslint-plugin-query ^8.57.0 || ^9.0.0no 10

Your React preset pulls in the first three; TanStack rules pull in the fourth. Until those maintainers ship releases whose peers include ^10.0.0 (or a range that includes 10), ESLint 10 is blocked if you care about clean peer resolution (same kind of issue you hit with TypeScript 6).

@eslint-react/eslint-plugin is the opposite problem

  • v2.x (what you use) is aimed at ESLint 8–9 and still has the tight TypeScript < 6 peer.
  • v4.x expects eslint: ^10.0.0 and typescript: *, so it fits ESLint 10, but only after the React core plugins above allow 10.

So eslint-react isn’t “blocking 10” in the abstract — v4 is the ESLint 10 line — but you can’t land on it comfortably until the rest of the React ESLint stack allows 10.

Already fine for ESLint 10 (by peers)

Examples from your tree: eslint-config-prettier, eslint-plugin-unicorn, @eslint/compat, typescript-eslint, @vitest/eslint-plugin, eslint-plugin-playwright, eslint-plugin-react-refresh (^9 \|\| ^10), eslint-plugin-react-you-might-not-need-an-effect, etc.

Tooling you’d bump with ESLint 10

@eslint/js on latest is pinned to eslint: ^10.0.0, so moving the repo to ESLint 10 means taking @eslint/js v10 alongside eslint v10, not staying on the v9 line.


Bottom line: what prevents moving to ESLint 10 today is mostly the React + a11y + TanStack ESLint plugins, whose stable peer ranges still stop at 9. Once those publish ESLint 10–compatible majors/minors, you can adopt eslint@10, @eslint/js@10, @eslint-react/eslint-plugin@4, and drop a lot of the peer friction you worked around for TypeScript 6.

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Fields

No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions