Skip to content

Commit

Permalink
feat(root,ts): migrated the eslint flat config
Browse files Browse the repository at this point in the history
  • Loading branch information
kurone-kito committed Aug 5, 2024
1 parent 567dec2 commit f02ec03
Show file tree
Hide file tree
Showing 20 changed files with 571 additions and 340 deletions.
4 changes: 3 additions & 1 deletion .yarnrc.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,5 +33,7 @@ packageExtensions:
eslint-plugin-storybook@*:
peerDependencies:
typescript: ">=4.2.0"

typescript-eslint@*:
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
pnpEnableEsmLoader: true
2 changes: 2 additions & 0 deletions cspell.config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,5 @@ import:
- '@kurone-kito/cspell-config'
usePnP: true
version: '0.2'
words:
- TSES
30 changes: 20 additions & 10 deletions packages/eslint-config-base/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,29 +4,39 @@ My ESLint configuration for general Node.js projects.

## Usage

### Use the flat config (recommended)

First, install this package and its peer dependencies:

```sh
npm install --save-dev @kurone-kito/eslint-config-base eslint typescript
```

Then, create a `eslint.config.mjs` file.
If exists, merge the following configuration into it:

```js
export { default } from '@kurone-kito/eslint-config-base';
```

### for legacy configuration (deprecated)

⚠️ **DEPRECATED**: The legacy configuration is no longer maintained.

First, install this package and its peer dependencies:

```sh
npm install --save-dev \
@kurone-kito/eslint-config-base \
@cspell/eslint-plugin \
@typescript-eslint/eslint-plugin \
@typescript-eslint/parser \
eslint \
eslint-config-airbnb-typescript \
eslint-config-prettier \
eslint-formatter-codeframe \
eslint-import-resolver-node \
eslint-import-resolver-typescript \
eslint-plugin-editorconfig \
eslint-plugin-import \
eslint-plugin-jsdoc \
eslint-plugin-json \
eslint-plugin-markdown \
eslint-plugin-markdownlint \
eslint-plugin-n \
eslint-plugin-oxlint \
eslint-plugin-yaml
eslint-plugin-n
```

Then, create a `.eslintrc.yml` file.
Expand Down
97 changes: 21 additions & 76 deletions packages/eslint-config-base/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -40,26 +40,15 @@
"start": "tsc --watch"
},
"dependencies": {
"@cspell/eslint-plugin": "^8.13.1",
"@eslint/compat": "^1.1.1",
"@eslint/eslintrc": "^3.1.0",
"@eslint/js": "^9.8.0",
"eslint-plugin-yaml": "^1.0.3"
},
"devDependencies": {
"@cspell/eslint-plugin": "^8.13.1",
"@kurone-kito/typescript-config": "workspace:^",
"@types/eslint": "^9.6.0",
"@types/eslint__eslintrc": "^2.1.2",
"@types/eslint__js": "^8.42.3",
"@types/node": "^22.1.0",
"@typescript-eslint/eslint-plugin": "^8.0.0",
"@typescript-eslint/parser": "^8.0.0",
"concurrently": "^8.2.2",
"cpy-cli": "^5.0.0",
"eslint": "^9.8.0",
"eslint-config-airbnb-base": "^15.0.0",
"eslint-config-airbnb-typescript": "^18.0.0",
"eslint-config-prettier": "^9.1.0",
"eslint-formatter-codeframe": "^7.32.1",
"eslint-import-resolver-node": "^0.3.9",
"eslint-import-resolver-typescript": "^3.6.1",
"eslint-plugin-editorconfig": "^4.0.3",
Expand All @@ -70,80 +59,36 @@
"eslint-plugin-markdownlint": "^0.6.0",
"eslint-plugin-n": "^17.10.2",
"eslint-plugin-oxlint": "^0.5.0",
"eslint-plugin-yaml": "^1.0.3",
"globals": "^15.9.0",
"typescript-eslint": "^8.0.0"
},
"devDependencies": {
"@kurone-kito/typescript-config": "workspace:^",
"@types/eslint": "^9.6.0",
"@types/eslint-config-prettier": "^6.11.3",
"@types/eslint-plugin-markdown": "^2.0.2",
"@types/eslint__eslintrc": "^2.1.2",
"@types/eslint__js": "^8.42.3",
"@types/node": "^22.1.0",
"@typescript-eslint/utils": "^8.0.0",
"concurrently": "^8.2.2",
"cpy-cli": "^5.0.0",
"eslint": "^9.8.0",
"eslint-formatter-codeframe": "^7.32.1",
"js-yaml": "^4.1.0",
"prettier": "^3.3.3",
"rimraf": "^5.0.10",
"typescript": "~5.5.4"
},
"peerDependencies": {
"@cspell/eslint-plugin": ">=6.x.x",
"@typescript-eslint/eslint-plugin": ">=8.0.x",
"@typescript-eslint/parser": ">=8.0.x",
"eslint": ">=9.x.x",
"eslint-config-airbnb-typescript": ">=17.x.x",
"eslint-config-prettier": ">=8.x.x",
"eslint-formatter-codeframe": ">=7.x.x",
"eslint-import-resolver-node": ">=0.3.x",
"eslint-import-resolver-typescript": ">=3.x.x",
"eslint-plugin-editorconfig": ">=4.x.x",
"eslint-plugin-import": ">=2.27.x",
"eslint-plugin-jsdoc": ">=46.x.x",
"eslint-plugin-json": ">=4.x.x",
"eslint-plugin-markdown": ">=3.x.x",
"eslint-plugin-markdownlint": ">=0.5.x",
"eslint-plugin-n": ">=17.x.x",
"eslint-plugin-oxlint": ">=0.2.x"
"typescript": ">=5.5.x"
},
"peerDependenciesMeta": {
"@cspell/eslint-plugin": {
"optional": true
},
"@typescript-eslint/eslint-plugin": {
"optional": true
},
"@typescript-eslint/parser": {
"optional": true
},
"eslint": {
"optional": true
},
"eslint-config-airbnb-typescript": {
"optional": true
},
"eslint-config-prettier": {
"optional": true
},
"eslint-formatter-codeframe": {
"optional": true
},
"eslint-import-resolver-node": {
"optional": true
},
"eslint-import-resolver-typescript": {
"optional": true
},
"eslint-plugin-editorconfig": {
"optional": true
},
"eslint-plugin-import": {
"optional": true
},
"eslint-plugin-jsdoc": {
"optional": true
},
"eslint-plugin-json": {
"optional": true
},
"eslint-plugin-markdown": {
"optional": true
},
"eslint-plugin-markdownlint": {
"optional": true
},
"eslint-plugin-n": {
"optional": true
},
"eslint-plugin-oxlint": {
"typescript": {
"optional": true
}
},
Expand Down
13 changes: 13 additions & 0 deletions packages/eslint-config-base/src/airbnb.mts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import type { Linter } from 'eslint';
import { compat } from './utils.mjs';

/** The configuration for ESLint to use the Airbnb style guide. */
export const airbnbConfig: readonly Linter.Config[] = [
...compat.extends('airbnb-base'),
// ...compat.extends('airbnb-typescript/base'),
{
languageOptions: {
parserOptions: { project: true, tsconfigRootDir: process.cwd() },
},
},
];
3 changes: 3 additions & 0 deletions packages/eslint-config-base/src/data.mts
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
import type { Linter } from 'eslint';
// @ts-ignore
import json from 'eslint-plugin-json';
import pluginYaml from 'eslint-plugin-yaml';

/** The ESLint configuration for data language files. */
export const dataConfig: readonly Linter.Config[] = [
{ files: ['**/*.json'], ...json.configs['recommended'] },
(pluginYaml as any).configs.recommended,
];
107 changes: 107 additions & 0 deletions packages/eslint-config-base/src/import.mts
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
import type { Linter } from 'eslint';
import { compat } from './utils.mjs';

/** Additional configuration for the `import` plugin. */
export const additionalImportConfig: readonly Linter.Config[] = [
{
files: ['*.?(c)js?(x)'],
rules: {
/**
* Allow `require` syntax only for JavaScript. By default, it is
* completely prohibited.
*
* There are many situations where pure JavaScript is used outside
* the scope of transpiling, such as in various configuration files,
* making the `import` syntax challenging.
*/
'@typescript-eslint/no-var-requires': 'off',
},
},
{
files: ['*.?([cm])js?(x)'],
rules: {
/**
* Allow type inference of return values of exported functions, etc.,
* only for JavaScript. By default, it is allowed with a warning.
*
* There are many situations where CommonJS is used outside the scope
* of transpiling, such as in various configuration files,
* where it is challenging to make type definitions mandatory.
*/
'@typescript-eslint/explicit-module-boundary-types': 'off',
},
},
{
rules: {
/**
* Forces import without extensions for internal modules only.
* The default is full enforcement.
*
* Because it interferes with imports such as `lodash-es`
* in the ES modules environment.
*/
'import/extensions': [
'error',
'never',
{ js: 'ignorePackages', json: 'ignorePackages' },
],
/**
* Prohibit dependencies on `devDependencies`, except for specific
* files. By default, this is a total ban.
*
* There is no need for strict separation of dependent packages since
* they are internally tree shaken by bundlers. Still, some packages
* are separated into `devDependencies` to make it easier to organize.
*/
'import/no-extraneous-dependencies': [
'error',
{
devDependencies: [
'**/*.config.?([cm])[jt]s?(x)',
'**/*.spec.?([cm])[jt]s?(x)',
'**/*.test.?([cm])[jt]s?(x)',
],
},
],
/**
* Allow with a warning that the arbitrary reordering in the
* import syntax. The default is to allow it unconditionally.
*
* in order to deal with the snowballing problem of the import part.
*/
'import/order': [
'warn',
{
alphabetize: { caseInsensitive: true, order: 'asc' },
groups: [
'builtin',
'external',
'internal',
'parent',
'sibling',
'index',
'object',
],
'newlines-between': 'never',
},
],
/**
* Allow with a warning that the arbitrary reordering in the
* import syntax. The default is to allow it unconditionally.
*
* To deal with the snowballing problem of the import part.
*/
'sort-imports': [
'warn',
{ ignoreCase: true, ignoreDeclarationSort: true },
],
},
},
];

/** The ESLint configuration for the `import` plugin. */
export const importConfig: readonly Linter.Config[] = [
...compat.extends('plugin:import/recommended'),
...compat.extends('plugin:import/typescript'),
...additionalImportConfig,
];
31 changes: 26 additions & 5 deletions packages/eslint-config-base/src/index.mts
Original file line number Diff line number Diff line change
@@ -1,8 +1,29 @@
import type { Linter } from 'eslint';
import tsEslint from 'typescript-eslint';
import { airbnbConfig } from './airbnb.mjs';
import { dataConfig } from './data.mjs';
import { ignoreConfig } from './ignore.mjs';
import { importConfig, additionalImportConfig } from './import.mjs';
import { jsdocConfig, additionalJsdocConfig } from './jsdoc.mjs';
import { markdownConfig } from './markdown.mjs';
import { additionalNodeConfig, nodeConfig } from './node.mjs';
import { additionalStyleConfig, styleConfig } from './style.mjs';
import { additionalTsConfig, tsConfig } from './ts.mjs';

/** ESLint configuration for generic TypeScript projects. */
const config: readonly Linter.Config[] = [...ignoreConfig, ...dataConfig];

export default config;
export default tsEslint.config(
...([
...ignoreConfig,
...markdownConfig,
...dataConfig,
...styleConfig,
...jsdocConfig,
...importConfig,
...nodeConfig,
...tsConfig,
...airbnbConfig,
...additionalStyleConfig,
...additionalJsdocConfig,
...additionalImportConfig,
...additionalNodeConfig,
...additionalTsConfig,
] as tsEslint.ConfigWithExtends[]),
);
Loading

0 comments on commit f02ec03

Please sign in to comment.