
Highlights
Faster startup and linting
This release includes a set of performance improvements across ESLint’s core linting pipeline and the stylish formatter. Linting results and the public API are unchanged: the same files produce the same messages as before, just faster.
The main improvements are:
- Startup. Loading the
eslintpackage no longer eagerly initializes the JSON Schema validator used for rule options. It’s now created the first time a rule’s options actually need to be validated, which removes about 45 modules from the initial dependency graph and reduces package load time by 20–25%. - Rule execution. When ESLint traverses a file’s structure, it has to decide, for every piece of code, which rules are interested in it and then call those rules. This is the most frequently executed part of the linting process, and it now takes a shorter route in the most common cases. Common node selector types are handled by fast paths, and rule visitors are invoked directly whenever possible instead of through a wrapper function on every node.
- Overhead per reported problem. When a rule reports a problem, ESLint needs to perform several processing steps before displaying a message. Some of those steps have been made cheaper: placeholders in message templates are only filled in when necessary, autofixes are checked for validity without serializing each one to JSON, and one fixer object is shared by all problems reported in a file instead of creating one per fix. Also, files without any
eslint-enableoreslint-disablecomments now skip the directive processing step altogether. - Default formatter. The default
stylishformatter avoids stripping terminal control characters from strings that don’t contain any and no longer runs a regular expression on every message, which speeds up printing large numbers of problems.
Actual results will vary depending on your configuration and hardware, but projects using many core rules should see a noticeable improvement in both startup time and overall linting time.
Features
d136fa4feat: object-shorthand handle quoted properties forignoreConstructors(#21271) (Pavel)397b3b8feat: report unsafe labeledcontinueinno-unsafe-finallyrule (#21316) (electrohyun)d3dd47ffeat: only exemptnew-capbuilt-ins that reference the global (#21290) (sethamus)
Bug Fixes
22b09f5fix: ignore__proto__properties inprefer-object-spread(#21311) (xbinaryx)b684bb1fix: make TimePass.parse optional in types and docs (#21313) (ntnyq)26d11bcfix: don’t report__proto__properties inobject-shorthand(#21310) (xbinaryx)
Documentation
9ecfdc5docs: note that --cache can serve stale results for cross-file rules (#21312) (bytedoe)6c789ffdocs: Update README (GitHub Actions Bot)5997825docs: clarify preserve-caught-error known limitation (#21294) (Akinyemi Toluwalase)
Chores
520dd77perf: Implement fast paths in critical areas (#21210) (Nicholas C. Zakas)92086c8test: updateEMFILEerror generation for Node.js 26.9.0 compatibility (#21330) (Francesco Trotta)9ac7eb6chore: update github/codeql-action action to v4.38.0 (#21331) (renovate[bot])24310e3chore: update ecosystem plugins (#21324) (ESLint Bot)45ad79eci: bump pnpm/action-setup from 6.0.10 to 6.1.0 (#21318) (dependabot[bot])ac74e37chore: Add AGENTS.md with AI disclosure requirements (#21221) (Nicholas C. Zakas)c832660chore: Upgrade Stylelint to the latest version in docs (#21245) (Jung Hyeon Jun)f9f88fcchore: update ecosystem plugins (#21308) (ESLint Bot)fc81076ci: add more types integration tests (#20395) (Nitin Kumar)
