Base eslint config for all projects
This config is based on ESLint 9 flat config.
To keep using legacy config, please consider installing @anmiles/[email protected]
| Config | Code |
|---|---|
| Base | ...configs.base |
| TS | ...configs.ts |
| React | ...configs.react |
| Jest | ...configs.jest |
For JS-only projects (without TS, Jest, React) use base config.
For more complex projects use combination of configs.
Note that base config is mandatory in all cases.
- Install this package
npm install --save-dev @anmiles/eslint-config
- Install required devDependencies
- Base dependencies for all files:
npm install --save-dev eslint eslint-plugin-align-assignments eslint-plugin-i18next eslint-plugin-import eslint-plugin-n eslint-plugin-promise @eslint/compat @eslint/css @eslint/js @eslint/json @eslint/markdown @stylistic/eslint-plugin
- Additional dependencies for TS:
npm install --save-dev @typescript-eslint/eslint-plugin @typescript-eslint/parser eslint-import-resolver-typescript jiti typescript
- Additional dependencies for React:
npm install --save-dev eslint-plugin-react eslint-plugin-react-hooks eslint-plugin-react-redux eslint-plugin-react-refresh
- Additional dependencies for Jest:
npm install --save-dev eslint-plugin-jest jest
- Base dependencies for all files:
-
Extend all needed configs in your
./eslint.config.mjs(or./eslint.config.jsfor ESM projects)- For JS-only projects (without TS, React, Jest) use base config:
import { configs } from '@anmiles/eslint-config'; export default [ ...configs.base, /* your own config */ ];
- For more complex projects use combination of configs
- Backend TS project with Jest:
import { configs } from '@anmiles/eslint-config'; export default [ ...configs.base, ...configs.ts, ...configs.jest, /* your own config */ ];
- Frontend TS project with React and Jest:
import { configs } from '@anmiles/eslint-config'; export default [ ...configs.base, ...configs.ts, ...configs.jest, ...configs.react, /* your own config */ ];
- Backend TS project with Jest:
- Also you can use type-checked config -
./eslint.config.mts(or./eslint.config.tsfor ESM projects). This requiresjiti(why?)import type { Linter } from 'eslint'; import { configs } from '@anmiles/eslint-config'; export default [ ...configs.base, ...configs.ts, ...configs.jest, ...configs.react, /* your own config */ ] as Linter.Config[];
- For JS-only projects (without TS, React, Jest) use base config:
-
Specify npm commands
"lint": "eslint", "lint:fix": "eslint --fix"
--extparameter is not used in Flat Config mode- Specifying target directory (
.) is not needed in Flat Config mode
Javascript:
import stylisticEslintPlugin from '@stylistic/eslint-plugin';
import { patterns, configs } from '@anmiles/eslint-config';
export default [
...configs.base,
...configs.ts,
...configs.jest,
{
ignores : [
'coverage/*',
'dist/*',
'**/__snapshots__/*',
],
},
{
files : patterns.base,
rules : {
'@stylistic/max-len' : [ 'error', {
code : 100,
tabWidth : 4,
ignoreComments : true,
} ],
'@stylistic/object-property-newline' : [ 'error', {
allowAllPropertiesOnSameLine : true,
} ],
// override for TS-ESM project
'import/extensions' : [ 'error', 'ignorePackages', {
'js' : 'always',
'mjs' : 'always',
'ts' : 'never',
'mts' : 'never',
} ],
},
},
{
files : patterns.ts,
rules : {
'@typescript-eslint/no-unsafe-type-assertion' : [ 'off' ],
},
},
];Typescript:
import stylisticEslintPlugin from '@stylistic/eslint-plugin';
import type { Linter } from 'eslint';
import { patterns, configs } from '@anmiles/eslint-config';
export default [
...configs.base,
...configs.ts,
...configs.jest,
{
ignores : [
'coverage/*',
'dist/*',
'**/__snapshots__/*',
],
},
{
files : patterns.base,
rules : {
'@stylistic/max-len' : [ 'error', {
code : 100,
tabWidth : 4,
ignoreComments : true,
} ],
'@stylistic/object-property-newline' : [ 'error', {
allowAllPropertiesOnSameLine : true,
} ],
// override for TS-ESM project
'import/extensions' : [ 'error', 'ignorePackages', {
'js' : 'always',
'mjs' : 'always',
'ts' : 'never',
'mts' : 'never',
} ],
},
},
{
files : patterns.ts,
rules : {
'@typescript-eslint/no-unsafe-type-assertion' : [ 'off' ],
},
},
] as Linter.Config[];Patterns and extensions are also exported.
import { patterns, configs } from '@anmiles/eslint-config';
console.log(extensions.base); // [ '.js', '.mjs', '.cjs', '.jsx', '.ts', '.cts', '.mts', '.tsx' ]
console.log(extensions.jest); // [ '.test.js', '.test.mjs', '.test.cjs', '.test.jsx', '.test.ts', '.test.cts', '.test.mts', '.test.tsx' ]
console.log(patterns.ts); // [ '**/*.ts', '**/*.cts', '**/*.mts', '**/*.tsx' ]
console.log(patterns.react); // [ '**/*.js', '**/*.mjs', '**/*.cjs', '**/*.jsx', '**/*.ts', '**/*.cts', '**/*.mts', '**/*.tsx' ]package-lock.jsondoesn't have to be ignored. It's already ignored in configuration forjsonplugin insidebaseconfig.node_modulesdoesn't have to be ignored. It's implicitly ignored by ESLint.- Remember to provide
filesoption in override sections to specify a set of extensions for which the section applies.- There are some patterns to use (see above)
- Don't keep
.eslintignorefile when using Flat Config. Useignoresconfig key instead (see the example above).
Version 9 is based on ESLint V9 flat configuration. See migration guide if you had been using version 8 or below.