Skip to content

Commit 922cf03

Browse files
authored
Merge pull request #510 from VirtualLiveLab/eslint-config-helper
refactor: `@eslint/config-helpers` ベースで設定をいじるようにする
2 parents a67023f + 9226bff commit 922cf03

17 files changed

Lines changed: 215 additions & 145 deletions

File tree

packages/eslint-config/package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,14 @@
3535
"dependencies": {
3636
"@astrojs/compiler": "2.12.2",
3737
"@eslint/compat": "1.3.1",
38+
"@eslint/config-helpers": "0.3.0",
3839
"@eslint/eslintrc": "3.3.1",
3940
"@eslint/js": "9.29.0",
4041
"@stylistic/eslint-plugin-ts": "4.4.1",
4142
"@typescript-eslint/utils": "8.35.0",
4243
"astro-eslint-parser": "1.2.2",
4344
"astrojs-compiler-sync": "1.1.1",
45+
"defu": "6.1.4",
4446
"eslint-config-flat-gitignore": "2.1.0",
4547
"eslint-config-prettier": "10.1.5",
4648
"eslint-plugin-astro": "1.3.1",
Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
import type { Linter } from "eslint";
22

3+
import { defineConfig } from "@eslint/config-helpers";
34
// @ts-expect-error - eslint-plugin-jsx-a11y does not have types
45
import jsx from "eslint-plugin-jsx-a11y";
5-
import tseslint from "typescript-eslint";
66

77
import { jsxFiles } from "../utils/files";
88

9-
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
10-
export default tseslint.config(jsx.flatConfigs.recommended as Linter.Config[], {
9+
export default defineConfig({
10+
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
11+
extends: [jsx.flatConfigs.recommended as Linter.Config[]],
1112
files: [jsxFiles],
13+
name: "@virtual-live-lab/eslint-config/jsx-a11y",
1214
});

packages/eslint-config/src/addons/tailwind.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import type { Linter } from "eslint";
22

3+
import { defineConfig } from "@eslint/config-helpers";
34
// @ts-expect-error - eslint-plugin-tailwindcss does not have types
45
import tailwindESLint from "eslint-plugin-tailwindcss";
5-
import tseslint from "typescript-eslint";
66

77
import { jsxFiles } from "../utils/files";
88

9-
const tailwind = tseslint.config({
9+
const tailwind = defineConfig({
1010
extends: [
1111
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
1212
...(tailwindESLint.configs["flat/recommended"] as Linter.Config[]),
Lines changed: 28 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,53 +1,41 @@
1+
import { defineConfig } from "@eslint/config-helpers";
12
import * as astroESLintParser from "astro-eslint-parser";
23
import astroPlugin from "eslint-plugin-astro";
3-
import tseslint from "typescript-eslint";
44
import * as typescriptESLintParserForExtraFiles from "typescript-eslint-parser-for-extra-files";
55

66
import { __dirname } from "../lib/dir";
7-
import { astroFiles, tsFiles } from "../utils/files";
7+
import { prepareForExtend } from "../utils/eslint";
8+
import { astroFiles } from "../utils/files";
89
import { jsConfig } from "./js";
910
import { stylisticConfig } from "./stylistic";
1011
import { tsConfig } from "./typescript";
1112

12-
export const astroConfig = tseslint.config(
13-
{
14-
files: [tsFiles],
15-
languageOptions: {
13+
export const astroConfig = defineConfig({
14+
extends: prepareForExtend(
15+
jsConfig,
16+
stylisticConfig,
17+
tsConfig({ extraFiles: true }),
18+
astroPlugin.configs.recommended,
19+
astroPlugin.configs["jsx-a11y-strict"],
20+
),
21+
files: [astroFiles],
22+
languageOptions: {
23+
parser: astroESLintParser,
24+
parserOptions: {
1625
parser: typescriptESLintParserForExtraFiles,
17-
parserOptions: {
18-
project: true,
19-
projectService: false,
20-
tsconfigRootDir: __dirname,
21-
},
26+
project: true,
27+
projectService: false,
28+
tsconfigRootDir: __dirname,
2229
},
2330
},
24-
{
25-
extends: [
26-
...jsConfig,
27-
...stylisticConfig,
28-
...tsConfig,
29-
...astroPlugin.configs.recommended,
30-
...astroPlugin.configs["jsx-a11y-strict"],
31-
],
32-
files: [astroFiles],
33-
languageOptions: {
34-
parser: astroESLintParser,
35-
parserOptions: {
36-
parser: typescriptESLintParserForExtraFiles,
37-
project: true,
38-
projectService: false,
39-
tsconfigRootDir: __dirname,
40-
},
41-
},
42-
name: "@virtual-live-lab/eslint-config/astro",
43-
rules: {
44-
"astro/no-set-html-directive": "error",
45-
"astro/no-set-text-directive": "error",
46-
"astro/no-unused-css-selector": "error",
47-
"astro/prefer-class-list-directive": "error",
48-
"astro/prefer-object-class-list": "error",
49-
"astro/prefer-split-class-list": "error",
50-
"astro/sort-attributes": "error",
51-
},
31+
name: "@virtual-live-lab/eslint-config/astro",
32+
rules: {
33+
"astro/no-set-html-directive": "error",
34+
"astro/no-set-text-directive": "error",
35+
"astro/no-unused-css-selector": "error",
36+
"astro/prefer-class-list-directive": "error",
37+
"astro/prefer-object-class-list": "error",
38+
"astro/prefer-split-class-list": "error",
39+
"astro/sort-attributes": "error",
5240
},
53-
);
41+
});
Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
import type { FlatConfig } from "@typescript-eslint/utils/ts-eslint";
2-
1+
import { defineConfig } from "@eslint/config-helpers";
32
import gitignore from "eslint-config-flat-gitignore";
43

5-
const baseConfig: FlatConfig.ConfigArray = [gitignore()];
6-
7-
export { baseConfig };
4+
export const baseConfig = defineConfig({
5+
extends: [gitignore()],
6+
name: "@virtual-live-lab/eslint-config/base",
7+
});
Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,11 @@
1-
import type { FlatConfig } from "@typescript-eslint/utils/ts-eslint";
2-
1+
import { defineConfig } from "@eslint/config-helpers";
32
import js from "@eslint/js";
43

4+
import { prepareForExtend } from "../utils/eslint";
55
import { jsFiles } from "../utils/files";
66

7-
const jsConfig: FlatConfig.ConfigArray = [
8-
{
9-
files: [jsFiles],
10-
...js.configs.recommended,
11-
},
12-
];
13-
14-
export { jsConfig };
7+
export const jsConfig = defineConfig({
8+
extends: prepareForExtend(js.configs.recommended),
9+
files: [jsFiles],
10+
name: "@virtual-live-lab/eslint-config/javascript",
11+
});

packages/eslint-config/src/base/nextjs.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
import type { FlatConfig } from "@typescript-eslint/utils/ts-eslint";
1+
import type { Linter } from "eslint";
22

33
import { fixupConfigRules } from "@eslint/compat";
44

55
import { compat } from "../lib/compat";
66
import { jsFiles, tsFiles } from "../utils/files";
77
import { reactConfig } from "./react";
88

9-
const nextJsConfig: FlatConfig.ConfigArray = [
9+
export const nextJsConfig: Linter.Config[] = [
1010
...reactConfig,
1111
{
1212
files: [jsFiles, tsFiles],
@@ -21,5 +21,3 @@ const nextJsConfig: FlatConfig.ConfigArray = [
2121
...fixupConfigRules(compat.extends("next/core-web-vitals")),
2222
},
2323
];
24-
25-
export { nextJsConfig };

packages/eslint-config/src/base/react.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
1+
import { defineConfig } from "@eslint/config-helpers";
12
import react from "eslint-plugin-react";
23
import reactRefresh from "eslint-plugin-react-refresh";
34
import globals from "globals";
4-
import tseslint from "typescript-eslint";
55

66
import { compat } from "../lib/compat";
7+
import { prepareForExtend } from "../utils/eslint";
78
import { jsxFiles } from "../utils/files";
89

9-
const reactConfig = tseslint.config({
10-
extends: [
11-
// @ts-expect-error 型が合わない
12-
react.configs.flat.recommended,
13-
// @ts-expect-error 型が合わない
10+
const reactConfig = defineConfig({
11+
extends: prepareForExtend(
12+
// @ts-expect-error type mismatch
13+
react.configs.flat["recommended"],
1414
react.configs.flat["jsx-runtime"],
1515
...compat.extends("plugin:react-hooks/recommended"),
16-
],
16+
),
1717
files: [jsxFiles],
1818
languageOptions: {
1919
globals: {

packages/eslint-config/src/base/stylistic.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
1+
import { defineConfig } from "@eslint/config-helpers";
12
import prettierConfig from "eslint-config-prettier/flat";
23
import perfectionistPlugin from "eslint-plugin-perfectionist";
3-
import tseslint from "typescript-eslint";
44

5+
import { prepareForExtend } from "../utils/eslint";
56
import { jsFiles, tsFiles } from "../utils/files";
67

7-
const stylisticConfig = tseslint.config({
8-
extends: [prettierConfig, perfectionistPlugin.configs["recommended-natural"]],
8+
export const stylisticConfig = defineConfig({
9+
extends: prepareForExtend(
10+
prettierConfig,
11+
perfectionistPlugin.configs["recommended-natural"],
12+
),
913
files: [tsFiles, jsFiles],
1014
name: "@virtual-live-lab/eslint-config/stylistic",
1115
rules: {
@@ -51,5 +55,3 @@ const stylisticConfig = tseslint.config({
5155
],
5256
},
5357
});
54-
55-
export { stylisticConfig };

0 commit comments

Comments
 (0)