eslint breaking changes
Every breaking API change we have recorded in eslint on npm: 891 breaking changes in 51 versions. Below are its newest 6 versions, removals and renames first, each with its source.
Newest change October 2, 2026

On this page
10.12.0
- Signature changed
SourceCode
Was class SourceCode implements TextSourceCode<{LangOptions: Linter.LanguageOptions; RootNode: AST.Program; SyntaxElementWithLoc: AST.Token | ESTree.Node; ConfigNode: ESTree.Comment;}>; now class SourceCode implements... npmjs.com - Signature changed
SourceCode.getLoc
Was getLoc(syntaxElement: AST.Token | ESTree.Node): ESTree.SourceLocation; now getLoc(syntaxElement: AST.Token | ESTree.Node | ESTree.Comment): ESTree.SourceLocation. npmjs.com - Signature changed
SourceCode.getRange
Was getRange(syntaxElement: AST.Token | ESTree.Node): SourceRange; now getRange(syntaxElement: AST.Token | ESTree.Node | ESTree.Comment): SourceRange. npmjs.com - Signature changed
SourceCode.getText
Was getText(node?: ESTree.Node, beforeCount?: number, afterCount?: number): string; now getText(node?: ESTree.Node | AST.Token | ESTree.Comment, beforeCount?: number, afterCount?: number): string. npmjs.com
10.11.0
- Behavior changed
new-cap
The new-cap rule exempts fewer built-in constructors than before, so code that calls some built-ins without new may now be reported. github.com - Behavior changed
no-unsafe-finally
The no-unsafe-finally rule reports labeled continue statements inside finally blocks that it did not report before, so existing code may get new lint errors. github.com - Signature changed
Linter.TimePass.parse
Was parse: {total: number}; now parse?: {total: number}. npmjs.com
10.9.0
- Behavior changed
no-loss-of-precision
The rule now also detects loss of precision from underflow, so existing code may get new lint reports. Review flagged literals if your linting fails after upgrading. github.com - Signature changed
rules:ESLintRules.no-unmodified-loop-condition
Was "no-unmodified-loop-condition": Linter.RuleEntry<[]>; now "no-unmodified-loop-condition": Linter.RuleEntry<[Partial<{checkConditionalExpressions: boolean;}>]>. npmjs.com
10.8.0
- Signature changed
config:Config
Was export {type Config, defineConfig, globalIgnores, includeIgnoreFile}; now export {type Config, type ConfigObject, defineConfig, globalIgnores, includeIgnoreFile}. npmjs.com - Signature changed
config:defineConfig
Was export {type Config, defineConfig, globalIgnores, includeIgnoreFile}; now export {type Config, type ConfigObject, defineConfig, globalIgnores, includeIgnoreFile}. npmjs.com - Signature changed
config:globalIgnores
Was export {type Config, defineConfig, globalIgnores, includeIgnoreFile}; now export {type Config, type ConfigObject, defineConfig, globalIgnores, includeIgnoreFile}. npmjs.com - Signature changed
config:includeIgnoreFile
Was export {type Config, defineConfig, globalIgnores, includeIgnoreFile}; now export {type Config, type ConfigObject, defineConfig, globalIgnores, includeIgnoreFile}. npmjs.com
10.7.0
- Signature changed
Linter.LintOptions.filterCodeBlock
Was filterCodeBlock?: | ((filename: string, text: string) => boolean) | undefined; now filterCodeBlock?: ((filename: string, text: string) => boolean) | undefined. npmjs.com - Signature changed
Linter.LintOptions.postprocess
Was postprocess?: | ((problemLists: LintMessage[][]) => LintMessage[]) | undefined; now postprocess?: ((problemLists: LintMessage[][]) => LintMessage[]) | undefined. npmjs.com - Signature changed
Rule.NodeListener
Was interface NodeListener extends CustomRuleVisitorWithExit<{[Node in Rule.Node as Node["type"]]?: | ((node: Node) => void) | undefined;} & {Program?: ((node: AST.Program) => void) | undefined;}>; now interface NodeListener extends... npmjs.com - Signature changed
rules:EitherGroupOrRegEx
Was type EitherGroupOrRegEx = | {group: string[]; regex?: never} | {regex: string; group?: never}; now type EitherGroupOrRegEx = {group: string[]; regex?: never} | {regex: string; group?: never}. npmjs.com - Signature changed
rules:ESLintRules.max-nested-callbacks
Was "max-nested-callbacks": Linter.RuleEntry<[| number | Partial<{maximum: number; max: number;}>]>; now "max-nested-callbacks": Linter.RuleEntry<[| number | Partial<{maximum: number; max: number; checkConstructorCallCallbacks... npmjs.com - Signature changed
rules:ESLintRules.no-extra-parens
Was "no-extra-parens": | Linter.RuleEntry<["all", Partial<{conditionalAssign: boolean; returnAssign: boolean; nestedBinaryExpressions: boolean; ignoreJSX: | "none" | "all" | "multi-line" | "single-line"; enforceForArrowConditionals... npmjs.com - Signature changed
rules:ESLintRules.preserve-caught-error
Was "preserve-caught-error": Linter.RuleEntry<[Partial<{requireCatchParameter: boolean;}>]>; now "preserve-caught-error": Linter.RuleEntry<[Partial<{requireCatchParameter: boolean; errorClassNames: Array<| string | {name: string... npmjs.com - Signature changed
rules:ESLintRules.semi
Was semi: | Linter.RuleEntry<["always", Partial<{omitLastInOneLineBlock: boolean;}>]> | Linter.RuleEntry<["never", Partial<{beforeStatementContinuationChars: | "any" | "always" | "never";}>]>; now semi: | Linter.RuleEntry<["always"... npmjs.com
10.6.0
- Signature changed
rules:ESLintRules.no-constant-binary-expression
Was "no-constant-binary-expression": Linter.RuleEntry<[]>; now "no-constant-binary-expression": Linter.RuleEntry<[Partial<{checkRelationalComparisons: boolean;}>]>. npmjs.com
Check your code
These are the changes. To see which of them reach your code, scan a public repository, or have your coding agent call check_code with your manifest or lockfile over MCP. The API reads every change in every version, not only the newest. On Team and up, a fix pull request opens for the changes that reach a connected repository. Nothing merges or deploys.

Put your code on continuous management.
Scan a public repository now, or give your agent one line.
See how out of date your code is.
Tell your agent what changed since it was trained.
claude mcp add --transport http since https://api.since.dev/mcp