@aarongoldenthal/eslint-config-standard
Version:
Standard ESLint configuration settings
114 lines (92 loc) • 6.29 kB
Markdown
# @aarongoldenthal/eslint-config-standard
## Summary
Custom ESLint configuration for all projects. Includes flat-config formatted
configurations compatible with ESLint v9+ for the following:
| Plugin Name | Config name | Rule Prefix |
| ------------------------------------------------- | -------------------------------------------------------------------------- | ------------ |
| `eslint` | [`base-configs`](./base-configs.js) | none, `core` |
| `@eslint-community/eslint-plugin-eslint-comments` | [`eslint-comments-config`](./eslint-comments-config.js) | `comments` |
| `eslint-plugin-jest` | [`jest-config`](./jest-config.js) | `jest` |
| `eslint-plugin-jsdoc` | [`jsdoc-config`](./jsdoc-config.js) | `jsdoc` |
| `eslint-plugin-n` | [`node-config`](./node-config.js) | `node` |
| `eslint-plugin-playwright` | [`playwright-config`](./playwright-config.js) | `playwright` |
| `eslint-plugin-promise` | [`promise-config`](./promise-config.js) | `promise` |
| `eslint-plugin-unicorn` | [`unicorn-configs`](./unicorn-configs.js), [`esm-config`](./esm-config.js) | `unicorn` |
| `eslint-plugin-vitest` | [`vitest-config`](./vitest-config.js) | `vitest` |
As flat configs, the package defines all required plugins/configurations as
`dependencies`. Since flat config allows flexibility in the rule prefixes (that
is, they don't have to match the plugin name), the rules prefixes are adapted
in some cases to be more intuitive or readable. Since they may be combined, and
flat config doesn't allow nested arrays of rules, file names that are singular
export a single config object (for example `jsdoc-config`), and file names
that are plural export an array of config objects (for example `base-configs`).
The `core` prefix has only one rule, `core/complexity`, that has a higher threshold.
This provides a secondary check for cases where the lower threshold in the `complexity`
rule is disabled, which otherwise allows unbounded complexity. Since re-use of core
rules is an experimental capability, this must be enabled with environment variable
`ENABLE_ESLINT_CORE_RULE_DUPLICATES=true`.
Most rule configurations are applicable to files matching `'**/*.{js,mjs,cjs}'`. The
following configurations are exceptions and are applicable to files as noted:
- `base-configs` sets `sourceType` to `commonjs` for `*.js`/`*.cjs` files and
`module` for `*.mjs` files.
- `base-configs` includes a config that disables some rules for test files
matching any of the following test patterns (for example `max-lines`,
`max-lines-per-function`).
- `jest-config` applies rules to files matching
`'**/__tests__/**/*.{js,mjs,cjs}'` or `'**/?(*.)+(spec|test).{js,mjs,cjs}'`.
- `vitest-config` applies rules to files matching
`'**/__tests__/**/*.{js,mjs}'` or `'**/?(*.)+(spec|test).{js,mjs}'`.
- `playwright-config`: applies rules to files matching `'**/*.pwtest.{js,mjs,cjs}'`,
which differentiates them from Jest/Vitest test files.
- `unicorn-configs` includes a config that disables some rules for test files
(matching any of the following test patterns), and applies some ESM-specific
rules only applicable to `*.mjs` files.
With ESLint v9 the majority of formatting rules are deprecated and removed from
`base-configs`, but the `eslint-config-prettier` package is included and can be
added to the config if `prettier` is also being used to ensure it takes priority
for formatting.
There is also an `esm-config` included for projects using ES modules instead of
CommonJS modules. This config sets `sourceType` to `module` for `*.js` files and
includes `unicorn-config` ESM-specific rules.
### Usage
This module is now pure ESM, so must be called from an ESM file, either
`eslint.config.js` (if the project is ESM) or `eslint.config.mjs` (if the
project is CJS).
There is a `recommended` configuration for CJS with all plugin configurations
enabled except `vitest-config` (it does include `jest-config`, and applies
ESM-specific rules to `*.mjs files`). To configure `eslint.config.mjs` with
this configuration:
```js
import { defineConfig, globalIgnores } from 'eslint/config';
import recommendedConfig from '@aarongoldenthal/eslint-config-standard/recommended';
export default defineConfig([
recommendedConfig,
globalIgnores(['.vscode/**', 'archive/**', 'node_modules/**', 'coverage/**'])
]);
```
Note the optional `ignores` config that can be added last to ignore certain
directories.
There is also a `recommended-esm` configuration that's the same as the
`recommended` config, but includes the `vitest-config` instead of the
`jest-config`, and also the `esm-config` (applicable to `*.js` files).
It can be configured with:
```js
import { defineConfig, globalIgnores } from 'eslint/config';
import recommendedConfig from '@aarongoldenthal/eslint-config-standard/recommended-esm';
export default defineConfig([
recommendedConfig,
globalIgnores(['.vscode/**', 'archive/**', 'node_modules/**', 'coverage/**'])
]);
```
To configure `eslint.config.js` with individual plugins, see the
[`recommended`](./recommended.js) or
[`recommended-esm`](./recommended-esm.js) configurations as examples.
Notes:
- If used, the `base-configs` should be included after other configurations,
except `esm-config` and `prettier`, so those settings take precedence.
- The `jest-config` and `vitest-config` have the same file applicability, so
only one should be used.
- If used, the `esm-config` should be configured after all functional rules
to ensure the overridden settings take precedence.
- If used, the `prettier` config should be included last to take priority in
disabling the applicable rules from all other configurations.