# Extension points — eslint/eslint

> Canonical page: https://codevetter.com/unpack/eslint/extension-points

# Extension points — eslint/eslint

Scanned commit bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7 (2026-10-02). Generated by codevetter codevetter 1.15.0 on 2026-10-02.

Source inspection; upstream code and tests were not executed.

Extension is centered on flat configuration and explicit plugin objects. Rules, languages, processors, and parsers connect at different stages of verification. Formatters extend the output boundary, while configuration helpers and feature flags provide additional integration surfaces. Built-in rules are registered lazily and follow the same metadata/create contract used by rule tests.
- New built-in rules enter the alphabetized LazyLoadingRuleMap in lib/rules/index.js; defaultConfig exposes that map through a proxy under the internal '@' plugin. — [lib/rules/index.js#L9-23](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/rules/index.js#L9-L23) [lib/config/default-config.js#L34-60](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/config/default-config.js#L34-L60)
- Rule modules provide create(context) and metadata; runRules() rejects missing create(), requires meta.fixable for emitted fixes, and requires meta.hasSuggestions for suggestions. — [lib/rules/no-undef.js#L27-60](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/rules/no-undef.js#L27-L60) [lib/linter/linter.js#L490-505](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/linter/linter.js#L490-L505) [lib/linter/linter.js#L594-615](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/linter/linter.js#L594-L615)
- Plugin rule IDs resolve through config.plugins[pluginName].rules[ruleName]; CLI --plugin normalizes package names and registers default exports under shorthand names. — [lib/config/config.js#L184-187](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/config/config.js#L184-L187) [lib/shared/translate-cli-options.js#L36-52](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/shared/translate-cli-options.js#L36-L52)
- Language plugins register under plugins[namespace].languages[name]; Config merges defaults, validates languageOptions, and optionally normalizes them before parsing. — [lib/config/config.js#L498-542](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/config/config.js#L498-L542) [lib/services/parser-service.js#L32-45](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/services/parser-service.js#L32-L45)
- Custom JavaScript parsers may implement parseForESLint() or parse(); enhanced parser results can supply services, visitor keys, and scopeManager. — [lib/languages/js/index.js#L268-287](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/languages/js/index.js#L268-L287)
- Processors can be plugin-qualified names or objects; verification uses preprocess/postprocess and disables fixes unless supportsAutofix is true. — [lib/config/config.js#L545-575](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/config/config.js#L545-L575) [lib/linter/linter.js#L1425-1437](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/linter/linter.js#L1425-L1437) [lib/linter/linter.js#L926-936](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/linter/linter.js#L926-L936)
- Custom formatters are dynamically imported functions from paths or eslint-formatter packages; their wrapper sorts results and supplies contextual/rule metadata. — [lib/eslint/eslint.js#L1246-1288](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/eslint/eslint.js#L1246-L1288) [lib/eslint/eslint.js#L1300-1315](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/eslint/eslint.js#L1300-L1315)
- eslint/config re-exports defineConfig(), globalIgnores(), and includeIgnoreFile(); behavior experiments register in activeFlags/inactiveFlags, including unstable_native_nodejs_ts_config. — [lib/config-api.js#L8-18](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/config-api.js#L8-L18) [lib/shared/flags.js#L28-65](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/lib/shared/flags.js#L28-L65) [package.json#L17-19](https://github.com/eslint/eslint/blob/bc51eee6e3e816622b2dd1bc08acb9cfb2d3a6a7/package.json#L17-L19)

Every claim links to its cited files at the pinned commit. Citations identify source evidence; they do not establish runtime correctness. Independent CodeVetter scan — not reviewed by upstream maintainers.

## Public product links

- [CodeVetter](https://codevetter.com/)
- [Download](https://codevetter.com/download)
- [Documentation](https://codevetter.com/docs/)
- [Source](https://github.com/Codevetter/codevetter)
