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.
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.
npm install --save-dev @e18e/eslint-pluginAdd 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'
}
}
];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.
Legend:
- ✅ = Yes / Enabled
- ✖️ = No / Disabled
- 💡 = Has suggestions (requires user confirmation for fixes)
| 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 |
✅ | 💡 | ✖️ |
| Rule | Description | Recommended | Fixable | Requires Types |
|---|---|---|---|---|
| ban-dependencies | Ban dependencies in favor of lighter alternatives | ✅ | ✖️ | ✖️ |
| 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-timer-args | Prefer passing function and arguments directly to setTimeout/setInterval instead of wrapping in an arrow function or using bind |
✅ | ✅ | ✖️ |
MIT