@e18e/eslint-plugin
May 11, 2026 ยท View on GitHub
The official e18e ESLint plugin for modernizing JavaScript/TypeScript code and improving performance.
This plugin focuses on applying the e18e community's best practices and advise to JavaScript/TypeScript codebases.
Overview
There are a few categories of rules in this plugin:
- Modernization - New syntax and APIs which improve code readability and performance
- Module replacements - Community recommended alternatives to popular libraries, focused on performance and size
- Performance improvements - Patterns that can be optimized for better runtime performance
Each of these can be enabled individually, or you can use the recommended configuration to enable all rules.
Installation
npm install --save-dev @e18e/eslint-plugin
Usage
Add the plugin to your eslint.config.js:
import e18e from '@e18e/eslint-plugin';
export default [
// Use the recommended configuration (includes all categories)
e18e.configs.recommended,
// Or use specific category configurations
e18e.configs.modernization,
e18e.configs.moduleReplacements,
e18e.configs.performanceImprovements,
// Or configure rules manually
{
plugins: {
e18e
},
rules: {
'e18e/prefer-array-at': 'error',
'e18e/prefer-array-fill': 'error',
'e18e/prefer-includes': 'error'
}
}
];
Usage with oxlint
If you're using oxlint, you can enable the e18e plugin by adding it to your .oxlintrc.json file:
{
"jsPlugins": ["@e18e/eslint-plugin"],
"rules": {
"e18e/prefer-includes": "error"
}
}
You can enable the recommended configuration by copying the rules from each of the ESLint configuration files into your .oxlintrc.json file.
- modernization configuration
- module replacements configuration
- performance improvements configuration
Copying these rules into your rules object will achieve the same effect as using the recommended configuration in ESLint.
Note
Our type-aware rules depend on TypeScript ESLint's parser, which means they will not work with oxlint at this time.
Linting package.json
Some rules (e.g. ban-dependencies) can be used against your package.json.
You can achieve this by using @eslint/json or jsonc-eslint-parser.
For example, with @eslint/json and eslint.config.js:
import e18e from '@e18e/eslint-plugin';
import json from '@eslint/json';
import {defineConfig} from 'eslint/config';
export default defineConfig([
{
files: ['package.json'],
language: 'json/json',
plugins: {
e18e,
json
},
extends: ['e18e/recommended'],
}
]);
Or with jsonc-eslint-parser and eslint.config.js:
import e18e from '@e18e/eslint-plugin';
import jsonParser from 'jsonc-eslint-parser';
import {defineConfig} from 'eslint/config';
export default defineConfig([
{
files: ['package.json'],
languageOptions: {
parser: jsonParser
},
plugins: {
e18e
},
extends: ['e18e/recommended'],
}
]);
Read more at the
@eslint/json docs and
jsonc-eslint-parser docs.
Rules
Legend:
- โ = Yes / Enabled
- โ๏ธ = No / Disabled
- ๐ก = Has suggestions (requires user confirmation for fixes)
- ๐ถ = Optionally uses types (works without TypeScript but more powerful with it)
Modernization
| Rule | Description | Recommended | Fixable | Requires Types |
|---|---|---|---|---|
| prefer-array-at | Prefer Array.prototype.at() over length-based indexing | โ | โ | ๐ถ |
| prefer-array-fill | Prefer Array.prototype.fill() over Array.from() or map() with constant values | โ | โ | โ๏ธ |
| prefer-includes | Prefer .includes() over indexOf() comparisons for arrays and strings | โ | โ | โ๏ธ |
| prefer-array-to-reversed | Prefer Array.prototype.toReversed() over copying and reversing arrays | โ | โ | ๐ถ |
| prefer-array-to-sorted | Prefer Array.prototype.toSorted() over copying and sorting arrays | โ | โ | ๐ถ |
| prefer-array-to-spliced | Prefer Array.prototype.toSpliced() over copying and splicing arrays | โ | โ | โ๏ธ |
| prefer-exponentiation-operator | Prefer the exponentiation operator ** over Math.pow() | โ | โ | โ๏ธ |
| prefer-nullish-coalescing | Prefer nullish coalescing operator (?? and ??=) over verbose null checks | โ | โ | โ๏ธ |
| prefer-object-has-own | Prefer Object.hasOwn() over Object.prototype.hasOwnProperty.call() and obj.hasOwnProperty() | โ | โ | โ๏ธ |
| prefer-spread-syntax | Prefer spread syntax over Array.concat(), Array.from(), Object.assign({}, ...), and Function.apply() | โ | โ | ๐ถ |
| prefer-url-canparse | Prefer URL.canParse() over try-catch blocks for URL validation | โ | ๐ก | โ๏ธ |
Module replacements
| Rule | Description | Recommended | Fixable | Requires Types |
|---|---|---|---|---|
| ban-dependencies | Disallow dependencies in favor of more performant or secure alternatives | โ | โ๏ธ | โ๏ธ |
Performance improvements
| Rule | Description | Recommended | Fixable | Requires Types |
|---|---|---|---|---|
| no-indexof-equality | Prefer startsWith() for strings and direct array access over indexOf() equality checks | โ๏ธ | โ | โ |
| prefer-array-from-map | Prefer Array.from(iterable, mapper) over [...iterable].map(mapper) to avoid intermediate array allocation | โ | โ | โ๏ธ |
| prefer-array-some | Prefer Array.some() over Array.find() and Array.filter().length checks when checking for element existence | โ | โ | โ๏ธ |
| prefer-timer-args | Prefer passing function and arguments directly to setTimeout/setInterval instead of wrapping in an arrow function or using bind | โ | โ | โ๏ธ |
| prefer-date-now | Prefer Date.now() over new Date().getTime() and +new Date() | โ | โ | โ๏ธ |
| prefer-regex-test | Prefer RegExp.test() over String.match() and RegExp.exec() when only checking for match existence | โ | โ | ๐ถ |
| prefer-static-regex | Prefer defining regular expressions at module scope to avoid re-compilation on every function call | โ | โ๏ธ | ๐ถ |
| prefer-inline-equality | Prefer inline equality checks over temporary object creation for simple comparisons | โ๏ธ | โ | ๐ถ |
| prefer-string-fromcharcode | Prefer String.fromCharCode() over String.fromCodePoint() for code points below 0x10000 | โ | โ | โ๏ธ |
| prefer-includes-over-regex-test | Prefer s.includes() / startsWith / endsWith over /literal/.test(s) when the regex has no metacharacters or flags | โ๏ธ | โ | โ๏ธ |
| no-delete-property | Disallow delete on properties โ V8 deoptimizes the object to dictionary mode | โ๏ธ | ๐ก | โ๏ธ |
| no-spread-in-reduce | Disallow spreading the accumulator inside a .reduce() callback โ it's O(Nยฒ) | โ๏ธ | โ๏ธ | โ๏ธ |
| prefer-static-collator | Prefer hoisting an Intl.Collator over calling localeCompare inside a sort/toSorted callback | โ๏ธ | โ๏ธ | โ๏ธ |
Sponsors
License
MIT