
Highlights
Separate Package for MCP Server
The ESLint MCP server, added to the core in v9.26.0, has been extracted into a separate package @eslint/mcp. The server can be started by running npx @eslint/mcp@latest. For more details on setup and usage, please read the documentation.
This change has been made to reduce the number and size of ESLint dependencies. The --mcp ESLint CLI flag still works, maintaining the same behavior for users who are already relying on it, but now it just runs npx @eslint/mcp@latest.
ESLINT_FLAGS environment variable
Feature flags can now also be set using the ESLINT_FLAGS environment variable.
# .bashrc
export ESLINT_FLAGS="unstable_config_lookup_from_file,unstable_native_nodejs_ts_config"
This approach can be especially useful in CI/CD pipelines or when you want to enable the same flags across multiple ESLint commands.
See Enable Feature Flags with Environment Variables for more details.
Sorted eslint-suppressions.json
Object keys in suppressions files are now sorted, to avoid unnecessary diff when the content changes.
New Rule no-unassigned-vars
One new rule has been added to the core: no-unassigned-vars.
This rule reports variables declared using let or var that are never assigned a value but are still read in the code. Since these variables will always have the value undefined, their usage is likely a programming mistake.
/*eslint no-unassigned-vars: "error"*/
let status; // error: 'status' is always 'undefined' because it's never assigned.
if (status === 'ready') {
console.log('Ready!');
}
allowRegexCharacters option in no-useless-escape
The no-useless-escape rule has a new allowRegexCharacters option, which can be used to allow unnecessary escapes for specified characters in regular expression literals.
/*eslint no-useless-escape: ["error", { "allowRegexCharacters": ["-"] }]*/
/[0\-]/; // not reported, because "-" is specified in "allowRegexCharacters"
In the above example, escaping - doesn’t change the behavior of the regular expression, and therefore this rule would report it by default. However, allowing escaped - might be useful to prevent it from forming the range syntax if another character is later added to the end of the character class.
no-array-constructor is autofixable
Most problems reported by the no-array-constructor rule can now be automatically fixed with the --fix command line option.
In cases where the fix wouldn’t be safe, such as new Array(...args) due to an unknown number of arguments and the specific behavior of the Array constructor when a single argument is passed, this rule still provides suggestions.
TypeScript Syntax Support in Core Rules
As announced in the ESLint v9.23.0 release blog post, we are actively working to add TypeScript syntax support to core rules.
ESLint v9.27.0 introduces full TypeScript syntax support for two more core rules. These rules are:
max-params. This rule has a new TypeScript-specific optioncountVoidThis.no-unassigned-vars. This newly added rule supports TypeScript syntax from the start, by not reporting ambient declarations.
These rules can now be used to lint TypeScript files as well as regular JavaScript.
To lint TypeScript code, be sure to use @typescript-eslint/parser, or another compatible parser.
Features
d71e37ffeat: Allow flags to be set in ESLINT_FLAGS env variable (#19717) (Nicholas C. Zakas)ba456e0feat: Externalize MCP server (#19699) (Nicholas C. Zakas)07c1a7efeat: addallowRegexCharacterstono-useless-escape(#19705) (sethamus)7bc6c71feat: add no-unassigned-vars rule (#19618) (Jacob Bandes-Storch)ee40364feat: convert no-array-constructor suggestions to autofixes (#19621) (sethamus)32957cdfeat: support TS syntax inmax-params(#19557) (Nitin Kumar)
Bug Fixes
5687ce7fix: correct mismatched removed rules (#19734) (루밀LuMir)dc5ed33fix: correct types and tighten type definitions inSourceCodeclass (#19731) (루밀LuMir)de1b5defix: correctserviceproperty name inLinter.ESLintParseResulttype (#19713) (Francesco Trotta)60c3e2cfix: sort keys in eslint-suppressions.json to avoid git churn (#19711) (Ron Waldon-Howe)9da90cafix: addallowReservedtoLinter.ParserOptionstype (#19710) (Francesco Trotta)fbb8be9fix: addinfotoESLint.DeprecatedRuleUsetype (#19701) (Francesco Trotta)
Documentation
25de550docs: Update description of frozen rules to mention TypeScript (#19736) (Nicholas C. Zakas)bd5def6docs: Clean up configuration files docs (#19735) (Nicholas C. Zakas)4d0c60ddocs: Add Neovim to editor integrations (#19729) (Maria José Solano)71317ebdocs: Update README (GitHub Actions Bot)4c289e6docs: Update README (GitHub Actions Bot)f0f0d46docs: clarify that unused suppressions cause non-zero exit code (#19698) (Milos Djermanovic)8ed3273docs: fix internal usages ofConfigDatatype (#19688) (Francesco Trotta)eb316a8docs: addfmtandchecksections toPackage.json Conventions(#19686) (루밀LuMir)a3a2559docs: fix wording in Combine Configs (#19685) (Milos Djermanovic)c8d17e1docs: Update README (GitHub Actions Bot)
Chores
f8f1560chore: upgrade @eslint/js@9.27.0 (#19739) (Milos Djermanovic)ecaef73chore: package.json update for @eslint/js release (Jenkins)596fdc6chore: update dependency @arethetypeswrong/cli to ^0.18.0 (#19732) (renovate[bot])f791da0chore: remove unbalanced curly brace from.editorconfig(#19730) (Maria José Solano)e86edeerefactor: Consolidate Config helpers (#19675) (Nicholas C. Zakas)cf36352chore: remove shared types (#19718) (Francesco Trotta)f60f276refactor: Easier RuleContext creation (#19709) (Nicholas C. Zakas)58a171echore: update dependency @eslint/plugin-kit to ^0.3.1 (#19712) (renovate[bot])3a075a2chore: update dependency @eslint/core to ^0.14.0 (#19715) (renovate[bot])44bac9dci: run tests in Node.js 24 (#19702) (Francesco Trotta)35304ddchore: add missingfundingfield to packages (#19684) (루밀LuMir)f305bebtest: mockprocess.emitWarningto prevent output disruption (#19687) (Francesco Trotta)
