Skip to content

Support ESLint v10 in @itwin/eslint-plugin #112

@MrVopi

Description

@MrVopi

ESLint v10 was released on Feb 6, 2026:
https://eslint.org/blog/2026/02/eslint-v10.0.0-released/

I understand this is still very fresh, but since ESLint v9 is now in maintenance mode (no new features planned) and v8 is already end-of-life, it seems likely that the ecosystem will gradually move toward v10 as the new baseline.

This is not just a feature request — below is a dependency-level analysis that may also serve as a reference for tracking ecosystem readiness until an upgrade is feasible.


Key benefits in ESLint v10

  • Aligned with modern Node.js LTS versions
    Dropped support for older Node versions, simplifying toolchains and aligning with current LTS environments.
  • Smarter config lookup
    ESLint now searches for eslint.config.* starting from each file’s directory rather than the process CWD, improving behavior in monorepos and multi-package repositories.
  • Legacy .eslintrc support removed
    Full removal of legacy config formats and related CLI flags, enforcing the modern flat config system.
  • Updated eslint:recommended ruleset
    The recommended configuration includes new and updated rules, improving default lint coverage.
  • Expanded glob pattern support
    Support for POSIX character classes in glob patterns via updated minimatch, allowing more expressive file targeting.
  • Cleaner, modernized APIs
    Deprecated rule and internal APIs removed, resulting in a more maintainable and future-proof plugin ecosystem.

ESLint v10 dependency compatibility analysis

Below is a summary of key dependencies used by @itwin/eslint-plugin, their declared ESLint peer ranges, and known upstream discussions regarding ESLint 10 support.

Package ESLint peer range Includes v10? Upstream discussion Risk
@typescript-eslint/eslint-plugin ^8.57.0 || ^9.0.0 || ^10.0.0 ✅ Yes https://typescript-eslint.io/users/dependency-versions/ 🟢 Low
@typescript-eslint/parser ^8.57.0 || ^9.0.0 || ^10.0.0 ✅ Yes https://typescript-eslint.io/users/dependency-versions/ 🟢 Low
eslint-plugin-import up to ^9 ❌ No import-js/eslint-plugin-import#3227 🔴 High
eslint-plugin-react up to ^9 ❌ No jsx-eslint/eslint-plugin-react#3977 🟠 Medium–High
eslint-plugin-react-hooks up to ^9 ❌ No facebook/react#35758 🟡 Medium
eslint-plugin-jsx-a11y up to ^9 ❌ No jsx-eslint/eslint-plugin-jsx-a11y#1075 🟡 Medium
eslint-plugin-jsdoc ^7 || ^8 || ^9 || ^10 ✅ Yes gajus/eslint-plugin-jsdoc#1653 🟢 Low
eslint-plugin-prefer-arrow >=2.0.0 ✅ Yes (unverified) https://github.com/TristonJ/eslint-plugin-prefer-arrow 🟢 Low
eslint-formatter-visualstudio no peer dep ➖ Not restricted https://github.com/eslint-community/eslint-formatters 🟢 Low
luxon, workspace-tools ➖ Not applicable ⚪ None

Observations

  1. TypeScript ESLint tooling and eslint-plugin-jsdoc already support ESLint 10, removing two potential blockers.
  2. Several popular plugins (eslint-plugin-import, eslint-plugin-react, eslint-plugin-react-hooks, eslint-plugin-jsx-a11y) have open upstream discussions or do not yet declare ESLint 10 support.
  3. The primary declared peer-dependency blocker at this time appears to be eslint-plugin-import, with React-related plugins following closely behind.
  4. Even if @itwin/eslint-plugin widens its peer range to include ^10, downstream peer dependency constraints may still block installation in strict environments (e.g. pnpm with strict peer deps).
  5. Runtime compatibility may differ from declared peer ranges, but peer ranges will affect installation and CI validation.
  6. Some plugins (e.g. eslint-plugin-prefer-arrow) technically allow ESLint 10 via peer range, but lack recent ESLint test coverage, so validation would still be required.

Additional context

One of our projects using @itwin/eslint-plugin was previously stuck on ESLint v8 due to CRA. We’ve recently migrated to Vite, so we’re now able to upgrade.

We were considering moving directly to ESLint 10, but I noticed the plugin currently declares support for 9.x only.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    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