# What changed in @eslint/js

> 50 changes in @eslint/js 9 to 10 from its official release notes, upgrade guides and advisories: 42 breaking, 2 new APIs and options. Each one cited. Sources checked 2026-10-18. HTML: https://unstale.sh/npm/@eslint/js/

To see which of these apply to a repository, run `npx @unstale/cli init` in it.

## @eslint/js 10

### Breaking changes

- Enabled in eslint:recommended, so projects using that config may report new lint errors. (10.0.0) — [upgrade guide](https://eslint.org/docs/latest/use/migrate-to-10.0.0)
- Enabled in eslint:recommended, so projects using that config may report new lint errors. (10.0.0) — [upgrade guide](https://eslint.org/docs/latest/use/migrate-to-10.0.0)
- Enabled in eslint:recommended, so projects using that config may report new lint errors. (10.0.0) — [upgrade guide](https://eslint.org/docs/latest/use/migrate-to-10.0.0)

### Fixes and other changes

- The name property has been restored to ESLint core configs exported from @eslint/js; FlatCompat users should update @eslint/eslintrc for compatibility. (10.0.0) — [upgrade guide](https://eslint.org/docs/latest/use/migrate-to-10.0.0)

## @eslint/js 9

### Breaking changes

- The no-invalid-regexp option now matches flags case-sensitively. (9.0.0) — [upgrade guide](https://eslint.org/docs/latest/use/migrate-to-9.0.0)
- The allow option now only accepts an array of strings. (9.0.0) — [upgrade guide](https://eslint.org/docs/latest/use/migrate-to-9.0.0)
- The formatter was removed from core; install eslint-formatter-checkstyle to use it. (9.0.0) — [upgrade guide](https://eslint.org/docs/latest/use/migrate-to-9.0.0)
- The deprecated property was removed. (9.0.0) — [upgrade guide](https://eslint.org/docs/latest/use/migrate-to-9.0.0)
- The formatter was removed from core; install eslint-formatter-compact to use it. (9.0.0) — [upgrade guide](https://eslint.org/docs/latest/use/migrate-to-9.0.0)
- Deprecated source, comment, token, parser-services, scope, ancestor, and variable-usage methods were removed from context and moved to SourceCode, with some replacements requiring a node argument. (9.0.0) — [upgrade guide](https://eslint.org/docs/latest/use/migrate-to-9.0.0)
- Flat config no longer accepts the "eslint:all" string in its config array; use the @eslint/js preset instead. (9.0.0) — [upgrade guide](https://eslint.org/docs/latest/use/migrate-to-9.0.0)
- The preset enables no-constant-binary-expression, no-empty-static-block, no-new-native-nonconstructor, and no-unused-private-class-members, and removes no-extra-semi, no-inner-declarations, no-mixed-spaces-and-tabs, and no-new-symbol. (9.0.0) — [upgrade guide](https://eslint.org/docs/latest/use/migrate-to-9.0.0)
- Flat config no longer accepts the "eslint:recommended" string in its config array; use the @eslint/js preset instead. (9.0.0) — [upgrade guide](https://eslint.org/docs/latest/use/migrate-to-9.0.0)
- Flat config is now the default; eslintrc is deprecated and is no longer searched for automatically. (9.0.0) — [upgrade guide](https://eslint.org/docs/latest/use/migrate-to-9.0.0)
- Multiple configuration comments for the same rule are no longer silently accepted: the first applies and subsequent ones are reported as lint errors. (9.0.0) — [upgrade guide](https://eslint.org/docs/latest/use/migrate-to-9.0.0)
- Variables followed by a colon and value are ignored as invalid; variable names must be comma-separated. (9.0.0) — [upgrade guide](https://eslint.org/docs/latest/use/migrate-to-9.0.0)
- The temporary FlatESLint class is now named ESLint, and the v8 ESLint class is named LegacyESLint. (9.0.0) — [upgrade guide](https://eslint.org/docs/latest/use/migrate-to-9.0.0)
- Rules exported as functions are no longer supported; rules must use an object with a create() method. (9.0.0) — [upgrade guide](https://eslint.org/docs/latest/use/migrate-to-9.0.0)
- The formatter was removed from core; install eslint-formatter-jslint-xml to use it. (9.0.0) — [upgrade guide](https://eslint.org/docs/latest/use/migrate-to-9.0.0)
- The formatter was removed from core; install eslint-formatter-junit to use it. (9.0.0) — [upgrade guide](https://eslint.org/docs/latest/use/migrate-to-9.0.0)
- The method is no longer available; configure parsers through flat config languageOptions instead. (9.0.0) — [upgrade guide](https://eslint.org/docs/latest/use/migrate-to-9.0.0)
- The method is no longer available; define rules through flat config plugins instead. (9.0.0) — [upgrade guide](https://eslint.org/docs/latest/use/migrate-to-9.0.0)
- The method is no longer available; define rules through flat config plugins instead. (9.0.0) — [upgrade guide](https://eslint.org/docs/latest/use/migrate-to-9.0.0)
- The method is no longer available. (9.0.0) — [upgrade guide](https://eslint.org/docs/latest/use/migrate-to-9.0.0)
- The config argument must use flat config format. (9.0.0) — [upgrade guide](https://eslint.org/docs/latest/use/migrate-to-9.0.0)
- The config argument must use flat config format. (9.0.0) — [upgrade guide](https://eslint.org/docs/latest/use/migrate-to-9.0.0)
- Rules that receive options must specify meta.schema; ESLint throws an error when options are passed to a rule without it. (9.0.0) — [upgrade guide](https://eslint.org/docs/latest/use/migrate-to-9.0.0)
- The rule schema now rejects options; the rule does not accept any options. (9.0.0) — [upgrade guide](https://eslint.org/docs/latest/use/migrate-to-9.0.0)
- By default, the rule additionally reports -(-foo) and foo - 0; configure allow with ["-", "- -"] to retain the previous behavior. (9.0.0) — [upgrade guide](https://eslint.org/docs/latest/use/migrate-to-9.0.0)
- With flat config, running the CLI without patterns lints the current directory; with eslintrc, it errors. Use --pass-on-no-patterns to retain the previous exit-zero behavior. (9.0.0) — [upgrade guide](https://eslint.org/docs/latest/use/migrate-to-9.0.0)
- The caughtErrors option now defaults to all, so caught errors are checked for being used. (9.0.0) — [upgrade guide](https://eslint.org/docs/latest/use/migrate-to-9.0.0)
- The option now defaults to true, so unnecessary computed member names in classes are flagged by default. (9.0.0) — [upgrade guide](https://eslint.org/docs/latest/use/migrate-to-9.0.0)
- ESLint v9 requires Node.js v18.18.0 or above, v20.9.0 or above, or v21 and above; earlier versions are no longer supported. (9.0.0) — [upgrade guide](https://eslint.org/docs/latest/use/migrate-to-9.0.0)
- Rules set to warn are no longer executed unless --max-warnings is used, which can improve performance and affect rules that modify data used by other rules. (9.0.0) — [upgrade guide](https://eslint.org/docs/latest/use/migrate-to-9.0.0)
- The rule was removed; use replacement rules in eslint-plugin-jsdoc for equivalent linting. (9.0.0) — [upgrade guide](https://eslint.org/docs/latest/use/migrate-to-9.0.0)
- RuleTester replaces FlatRuleTester, while the v8 RuleTester is removed; the new tester uses flat-config defaults for ecmaVersion and sourceType. (9.0.0) — [upgrade guide](https://eslint.org/docs/latest/use/migrate-to-9.0.0)
- RuleTester now validates autofix outputs, error and suggestion fields, suggestion uniqueness and syntax, duplicate test cases, filename and only types, and unsubstituted message placeholders. (9.0.0) — [upgrade guide](https://eslint.org/docs/latest/use/migrate-to-9.0.0)
- The deprecated method was removed; use getCommentsBefore, getCommentsAfter, or getCommentsInside instead. (9.0.0) — [upgrade guide](https://eslint.org/docs/latest/use/migrate-to-9.0.0)
- The formatter was removed from core; install eslint-formatter-tap to use it. (9.0.0) — [upgrade guide](https://eslint.org/docs/latest/use/migrate-to-9.0.0)
- The formatter was removed from core; install eslint-formatter-unix to use it. (9.0.0) — [upgrade guide](https://eslint.org/docs/latest/use/migrate-to-9.0.0)
- The rule was removed; use replacement rules in eslint-plugin-jsdoc for equivalent linting. (9.0.0) — [upgrade guide](https://eslint.org/docs/latest/use/migrate-to-9.0.0)
- The no-unused-vars option no longer applies to catch arguments; use caughtErrorsIgnorePattern to ignore catch-clause variable names. (9.0.0) — [upgrade guide](https://eslint.org/docs/latest/use/migrate-to-9.0.0)
- The formatter was removed from core; install eslint-formatter-visualstudio to use it. (9.0.0) — [upgrade guide](https://eslint.org/docs/latest/use/migrate-to-9.0.0)

### New APIs and options

- Adds blockScopeFunctions, which by default allows block-level functions in strict mode when ecmaVersion is 2015 or above. (9.0.0) — [upgrade guide](https://eslint.org/docs/latest/use/migrate-to-9.0.0)
- The rule schema now accepts one option: an object with a boolean allowInParentheses property. (9.0.0) — [upgrade guide](https://eslint.org/docs/latest/use/migrate-to-9.0.0)

### Behavior and default changes

- Code path information is now calculated before rule traversal, so it is complete regardless of when a rule accesses it. (9.0.0) — [upgrade guide](https://eslint.org/docs/latest/use/migrate-to-9.0.0)
- A configuration comment specifying only severity now retains options configured for that rule in the config file. (9.0.0) — [upgrade guide](https://eslint.org/docs/latest/use/migrate-to-9.0.0)
- Set this environment variable to false to continue using the deprecated eslintrc config format. (9.0.0) — [upgrade guide](https://eslint.org/docs/latest/use/migrate-to-9.0.0)
- Multiple paths entries with the same name now all apply, allowing different restrictions and messages for imported names. (9.0.0) — [upgrade guide](https://eslint.org/docs/latest/use/migrate-to-9.0.0)
- The CLI now writes the output file even when the output is empty. (9.0.0) — [upgrade guide](https://eslint.org/docs/latest/use/migrate-to-9.0.0)
