# What changed in eslint

> 159 changes in eslint 9 to 10 from its official release notes, upgrade guides and advisories: 28 breaking, 2 deprecations, 3 security, 16 new APIs and options. Each one cited. Sources checked 2026-10-17. HTML: https://unstale.sh/npm/eslint/

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

## eslint 10

### Breaking changes

- Reports references inside immediately invoked function expressions. (10.13.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.13.0)
- Built-ins are exempted only when they reference the global. (10.11.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.11.0)
- The rule now reports unsafe labeled continue statements. (10.11.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.11.0)
- Reports max-nested-callbacks violations at the function head. (10.5.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.5.0)
- eslint-env comments are now reported as errors. (10.0.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.0.0)
- The rules included in eslint:recommended have been updated. (10.0.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.0.0)
- Legacy eslintrc configuration support has been removed. (10.0.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.0.0)
- The fake FlatESLint export has been removed. (10.0.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.0.0)
- The func-names rule schema has been tightened. (10.0.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.0.0)
- Versions of jiti older than 2.2.0 are no longer supported. (10.0.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.0.0)
- The fake LegacyESLint export has been removed. (10.0.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.0.0)
- The deprecated LintMessage#nodeType field has been removed. (10.0.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.0.0)
- The rule schema now requires unique items in its option array. (10.0.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.0.0)
- no-shadow-restricted-names reports globalThis by default. (10.0.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.0.0)
- Supported Node.js versions are now ^20.19.0, ^22.13.0, or >=24. (10.0.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.0.0)
- ParserOptions no longer includes ecmaVersion. (10.0.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.0.0)
- ParserOptions no longer includes sourceType. (10.0.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.0.0)
- Program ranges now span the entire source text. (10.0.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.0.0)
- ResultsMeta now includes a color property. (10.0.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.0.0)
- Deprecated rule context methods have been removed. (10.0.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.0.0)
- All RuleFixer methods now assert that text is a string. (10.0.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.0.0)
- Valid test cases now use stricter assertions. (10.0.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.0.0)
- Global variables are added through ScopeManager#addGlobals(). (10.0.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.0.0)
- Deprecated SourceCode methods have been removed. (10.0.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.0.0)
- The TDZ scope type has been removed. (10.0.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.0.0)
- The deprecated TestCaseError#type field has been removed. (10.0.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.0.0)
- Inactive unstable_* flags have been removed. (10.0.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.0.0)
- The v10_* flags have been removed. (10.0.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.0.0)

### Security

- The html formatter now escapes reserved characters in rule IDs, producing safer formatter output. (10.8.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.8.0)

### Deprecations

- The always option of radix is deprecated. (10.0.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.0.0)
- The as-needed option of radix is deprecated. (10.0.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.0.0)

### New APIs and options

- Accepts tokens and comments as inputs. (10.12.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.12.0)
- Adds d and v flags to no-unexpected-multiline. (10.10.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.10.0)
- Adds checkConditionalExpressions to inspect conditional expressions for unmodified loop conditions. (10.9.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.9.0)
- ConfigObject is now exported from eslint/config for use by developers consuming ESLint configuration APIs. (10.8.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.8.0)
- Added support for constructor callbacks in max-nested-callbacks. (10.7.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.7.0)
- Added the errorClassNames option to preserve-caught-error. (10.7.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.7.0)
- Adds checkRelationalComparisons to control checking of relational comparisons. (10.6.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.6.0)
- Adds includeIgnoreFile() to eslint/config for incorporating ignore files into configuration. (10.4.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.4.0)
- Rules can declare the languages they support through meta.languages. (10.2.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.2.0)
- Temporal is now included among the ES2026 globals. (10.2.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.2.0)
- API support for bulk suppressions was added. (10.1.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.1.0)
- Configuration objects can include a name. (10.0.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.0.0)
- max-params adds the countThis option. (10.0.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.0.0)
- no-implied-eval now supports self as an option. (10.0.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.0.0)
- RuleTester adds error assertion options. (10.0.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.0.0)
- RuleTester adds the requireData assertion option. (10.0.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.0.0)

### Performance

- The rule no longer uses a quadratic-time regular expression, improving lint performance. (10.8.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.8.0)

### Behavior and default changes

- Checks `globalThis` for invalid object calls. (10.13.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.13.0)
- Checks `yield*` expressions for unsafe optional chaining. (10.13.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.13.0)
- The ignoreConstructors option now handles quoted properties. (10.11.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.11.0)
- Checks Object.prototype property names. (10.10.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.10.0)
- The radix rule now supports computed Number.parseInt member access. (10.7.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.7.0)
- The radix rule now reports invalid signed numeric radix values. (10.7.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.7.0)
- The rule now detects constant binary expressions involving Symbol() and BigInt(). (10.6.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.6.0)
- Reports max-depth violations on keywords. (10.5.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.5.0)
- Reports max-lines-per-function violations at the function head. (10.5.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.5.0)
- Updates max-statements error locations to the function header. (10.5.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.5.0)
- The rule now checks sequence expressions in for-loop conditions. (10.4.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.4.0)
- The rule now provides suggestions for unused private class members. (10.3.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.3.0)
- The rule now recognizes Temporal objects when checking for disallowed object calls. (10.2.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.2.0)
- The no-var rule now applies fixes within TSModuleBlock nodes. (10.1.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.1.0)
- array-callback-return now handles Array.fromAsync callbacks. (10.0.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.0.0)
- JSX references are tracked during linting. (10.0.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.0.0)
- RuleTester outputs the failing test case index. (10.0.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.0.0)

### Tooling

- Added suggestions to no-compare-neg-zero. (10.7.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.7.0)
- Reports no-with violations at the with keyword. (10.5.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.5.0)
- Failure locations are estimated for RuleTester assertions. (10.0.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.0.0)
- ESLint replaces chalk with styleText for terminal styling. (10.0.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.0.0)

### Fixes and other changes

- Prevents combined fixes from creating a redeclared `let`. (10.13.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.13.0)
- Fixes handling of astral letters. (10.12.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.12.0)
- Adds the missing space after else in autofixes. (10.12.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.12.0)
- Supports TSFunctionType nodes. (10.12.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.12.0)
- Corrects messages for long private names. (10.12.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.12.0)
- Skips lines containing multiple comments. (10.12.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.12.0)
- Handles astral letters when enforcing capitalization conventions. (10.12.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.12.0)
- Fixes handling of astral letters. (10.12.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.12.0)
- Fixes handling of astral letters. (10.12.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.12.0)
- Avoids a false positive for 0.e5. (10.12.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.12.0)
- Avoids a false positive in conditional tests. (10.12.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.12.0)
- Corrects autofixing for async function bases. (10.12.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.12.0)
- The rule no longer reports __proto__ properties. (10.11.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.11.0)
- The rule now ignores __proto__ properties. (10.11.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.11.0)
- TimePass.parse is now optional in the types. (10.11.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.11.0)
- Adds support for __proto__ in exported comments. (10.10.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.10.0)
- Fixes a false positive for UTC calls when properties is false. (10.10.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.10.0)
- Fixes false negatives involving class fields and static blocks. (10.10.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.10.0)
- Ignores static imports when reporting unreachable code. (10.10.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.10.0)
- Prevents the autofix from breaking when Object is shadowed. (10.10.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.10.0)
- Fixes a false positive for numeric literals with a trailing decimal point. (10.9.1) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.9.1)
- The rule now handles numeric underflow cases. (10.9.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.9.0)
- Prevents unsafe autofixes when functions are hoisted. (10.9.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.9.0)
- Prevents autofixes when a var is shadowed by a catch parameter. (10.9.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.9.0)
- Prevents invalid autofixes that create a tagged template call. (10.9.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.9.0)
- False positives are corrected for the accessor-pairs rule. (10.8.1) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.8.1)
- False positives are corrected for the getter-return rule. (10.8.1) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.8.1)
- Meta-property names are now ignored when checking identifiers against the denylist. (10.8.1) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.8.1)
- Meta-property names are now ignored when checking identifiers against the configured pattern. (10.8.1) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.8.1)
- The autofix now prevents an ASI hazard when removing unused labels. (10.8.1) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.8.1)
- The removeVar suggestion now handles ASI hazards safely. (10.8.1) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.8.1)
- Ignore configurations are now applied to computed methods. (10.8.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.8.0)
- The rule no longer crashes when all loop types are ignored. (10.8.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.8.0)
- The rule now adds a semicolon when inserting parentheses. (10.8.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.8.0)
- The rule now handles NewExpression nodes with a parenthesized callee. (10.8.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.8.0)
- Fixed handling of static template literals. (10.7.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.7.0)
- The null option no longer reports non-equality operators. (10.7.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.7.0)
- ignoreClassesWithImplements now applies to class expressions. (10.7.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.7.0)
- Avoided false positives for shadowed RegExp. (10.7.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.7.0)
- Sequence expression operands are now parenthesized correctly. (10.7.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.7.0)
- Avoided false positives for shadowed RegExp. (10.7.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.7.0)
- Avoided false positives for shadowed globals. (10.7.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.7.0)
- Cause insertion now occurs outside wrapping parentheses. (10.7.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.7.0)
- Avoided false positives for spread arguments. (10.7.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.7.0)
- Avoided false positives on shadowed NaN and Number. (10.7.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.7.0)
- Restores the rule's report range for files containing too many classes. (10.6.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.6.0)
- Fixes callback detection for IIFEs and avoids reporting inner non-callbacks. (10.6.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.6.0)
- The rule now correctly accounts for a shadowed Boolean identifier. (10.6.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.6.0)
- Suppresses an invalid class suggestion produced by the rule. (10.6.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.6.0)
- The rule no longer reports shadowed undefined identifiers. (10.6.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.6.0)
- Fixes an invalid autofix when the rule reports an expression at the start of a statement. (10.6.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.6.0)
- The rule no longer reports shadowed undefined identifiers or shadowed Promise references. (10.6.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.6.0)
- The rule no longer reports shadowed undefined identifiers. (10.6.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.6.0)
- Corrects max-depth handling for else-if chains. (10.5.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.5.0)
- Corrected stack tracking for max-nested-callbacks violations. (10.5.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.5.0)
- Adds missing CodePath and CodePathSegment types for consumers of ESLint's type definitions. (10.4.1) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.4.1)
- Failures from delegated commands are now propagated so command-line failures are reported correctly. (10.4.1) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.4.1)
- Corrects an invalid autofix when a newline appears after async. (10.4.1) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.4.1)
- Prevents a false positive for a reference in a finally block. (10.4.1) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.4.1)
- Deprecated rule replacements that are not arrays are now handled correctly. (10.4.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.4.0)
- ESLint now handles an unavailable require cache, preventing failures when the cache cannot be accessed. (9.39.5, 10.3.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v9.39.5), [release notes](https://github.com/eslint/eslint/releases/tag/v10.3.0)
- Rule suggestions no longer cause unintended continuation in a class body. (10.3.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.3.0)
- Generator yield resumption paths are modeled correctly in code path analysis. (10.2.1) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.2.1)
- Language and processor validation errors are clarified, helping diagnose invalid configuration. (10.2.1) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.2.1)
- The rule no longer reports false positives when Promise is shadowed. (10.2.1) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.2.1)
- The no-var rule no longer autofixes when a variable is used before its declaration. (10.1.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.1.0)
- Messages now include the variable name, making reported useless assignments easier to identify. (10.0.3) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.0.3)
- The error message for unused suppressions was updated. (10.0.1) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.0.1)
- no-restricted-import messages have been corrected. (10.0.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.0.0)
- verifyAndFix now receives filename as its third argument. (10.0.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v10.0.0)

## eslint 9

### Security

- ajv was updated to address security vulnerabilities. (9.39.4) — [release notes](https://github.com/eslint/eslint/releases/tag/v9.39.4)
- A security vulnerability patch was applied for ESLint 9.x. (9.39.4) — [release notes](https://github.com/eslint/eslint/releases/tag/v9.39.4)

### Behavior and default changes

- The rule highlights only the static block header. (9.39.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v9.39.0)
- Error locations now point to the duplicate key. (9.39.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v9.39.0)
- The rule now highlights only the function header, changing where complexity warnings appear. (9.38.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v9.38.0)

### Fixes and other changes

- Restored TypeScript 4.0 compatibility in ESLint types. (9.39.3) — [release notes](https://github.com/eslint/eslint/releases/tag/v9.39.3)
- ESLint now warns when eslint-env configuration comments are found. (9.39.2) — [release notes](https://github.com/eslint/eslint/releases/tag/v9.39.2)
- Only the node is passed to JS language visitor methods, correcting the visitor method arguments. (9.39.1) — [release notes](https://github.com/eslint/eslint/releases/tag/v9.39.1)
- Error locations are updated. (9.39.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v9.39.0)
- Error locations are updated. (9.39.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v9.39.0)
- The rule now allows JSDoc comments. (9.39.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v9.39.0)
- Program nodes now use the AST.Program type. (9.39.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v9.39.0)
- Rule typings are corrected for more accurate TypeScript usage. (9.39.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v9.39.0)
- Scope typings are corrected for more accurate TypeScript usage. (9.39.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v9.39.0)
- Forward traversal now passes step arguments to visitors. (9.39.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v9.39.0)
- The error message is improved when a suggestion lacks a fix function. (9.39.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v9.39.0)
- Timing reporting is unified for concurrent linting. (9.39.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v9.39.0)
- The rule no longer incorrectly reports some numeric literals written with e notation. (9.38.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v9.38.0)
- Type support for isolated dependencies in pnpm was improved. (9.38.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v9.38.0)
- The SourceCode type definitions were corrected for developers using the API. (9.38.0) — [release notes](https://github.com/eslint/eslint/releases/tag/v9.38.0)
