@slashnephy/eslint-config 3.0.105 → 3.0.111

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -6,7 +6,7 @@
6
6
  ## Install
7
7
 
8
8
  ```console
9
- $ yarn add @slashnephy/eslint-config
9
+ pnpm add @slashnephy/eslint-config
10
10
  ```
11
11
 
12
12
  ## Usage (for Flat Configs)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@slashnephy/eslint-config",
3
- "version": "3.0.105",
3
+ "version": "3.0.111",
4
4
  "keywords": [
5
5
  "eslint",
6
6
  "eslintconfig"
@@ -14,42 +14,32 @@
14
14
  "type": "module",
15
15
  "main": "./src/index.js",
16
16
  "files": [
17
- "./package.json",
18
17
  "./src/**/*.js",
19
- "./src/**/*.ts",
20
- "./README.md"
18
+ "./src/**/*.ts"
21
19
  ],
22
- "scripts": {
23
- "build": "tsc",
24
- "bump-version": "tsx bin/bump-version.ts",
25
- "clean": "rm -rf src/**/*.js",
26
- "format": "eslint --fix",
27
- "lint": "eslint",
28
- "publish": "yarn build && yarn npm publish"
29
- },
30
20
  "dependencies": {
31
21
  "@eslint-community/eslint-plugin-eslint-comments": "4.5.0",
32
- "@eslint/js": "9.28.0",
22
+ "@eslint/js": "9.39.2",
33
23
  "@graphql-eslint/eslint-plugin": "4.4.0",
34
- "@next/eslint-plugin-next": "15.3.6",
24
+ "@next/eslint-plugin-next": "16.0.10",
35
25
  "@stylistic/eslint-plugin": "5.6.1",
36
26
  "@susisu/eslint-plugin-safe-typescript": "0.10.1",
37
- "@typescript-eslint/utils": "8.30.1",
38
- "@vitest/eslint-plugin": "1.5.1",
27
+ "@typescript-eslint/utils": "8.49.0",
28
+ "@vitest/eslint-plugin": "1.5.2",
39
29
  "eslint-config-flat-gitignore": "2.1.0",
40
30
  "eslint-import-resolver-node": "0.3.9",
41
31
  "eslint-import-resolver-typescript": "4.4.4",
42
32
  "eslint-plugin-import-x": "4.16.1",
43
- "eslint-plugin-jest": "29.2.1",
33
+ "eslint-plugin-jest": "29.2.2",
44
34
  "eslint-plugin-jsx-a11y": "6.10.2",
45
- "eslint-plugin-n": "17.16.2",
46
- "eslint-plugin-package-json": "0.30.0",
35
+ "eslint-plugin-n": "17.23.1",
36
+ "eslint-plugin-package-json": "0.85.0",
47
37
  "eslint-plugin-promise": "7.2.1",
48
38
  "eslint-plugin-react": "7.37.5",
49
- "eslint-plugin-react-hooks": "5.2.0",
39
+ "eslint-plugin-react-hooks": "7.0.1",
50
40
  "eslint-plugin-react-refresh": "0.4.24",
51
41
  "eslint-plugin-relay": "2.0.0",
52
- "eslint-plugin-storybook": "0.12.0",
42
+ "eslint-plugin-storybook": "10.1.8",
53
43
  "eslint-plugin-tsdoc": "0.5.0",
54
44
  "eslint-plugin-unused-imports": "4.3.0",
55
45
  "eslint-plugin-userscripts": "0.5.6",
@@ -57,25 +47,34 @@
57
47
  "eslint-plugin-yml": "1.19.0",
58
48
  "globals": "16.5.0",
59
49
  "graphql": "16.12.0",
60
- "jsonc-eslint-parser": "2.4.1",
50
+ "jsonc-eslint-parser": "2.4.2",
61
51
  "typescript": "5.9.3",
62
- "typescript-eslint": "8.30.1",
52
+ "typescript-eslint": "8.49.0",
63
53
  "yaml-eslint-parser": "1.3.2"
64
54
  },
65
55
  "devDependencies": {
66
56
  "@eslint/config-inspector": "1.4.2",
67
57
  "@types/eslint": "9.6.1",
68
- "@types/node": "24.10.1",
58
+ "@types/node": "25.0.1",
69
59
  "concurrently": "9.2.1",
70
- "eslint": "9.28.0",
60
+ "eslint": "9.39.2",
71
61
  "jiti": "2.6.1",
72
62
  "tsx": "4.21.0"
73
63
  },
74
64
  "peerDependencies": {
75
65
  "eslint": "^9"
76
66
  },
77
- "packageManager": "yarn@4.12.0",
67
+ "engines": {
68
+ "node": ">= 22"
69
+ },
78
70
  "publishConfig": {
79
71
  "access": "public"
72
+ },
73
+ "scripts": {
74
+ "build": "tsc",
75
+ "bump-version": "tsx bin/bump-version.ts",
76
+ "clean": "rm -rf src/**/*.js",
77
+ "format": "eslint --fix",
78
+ "lint": "eslint"
80
79
  }
81
80
  }
@@ -1,37 +1,10 @@
1
- import stylisticPlugin from '@stylistic/eslint-plugin';
2
- import { globalIgnores } from 'eslint/config';
1
+ import { defineConfig, globalIgnores } from 'eslint/config';
3
2
  import gitignore from 'eslint-config-flat-gitignore';
4
- import { config } from 'typescript-eslint';
5
- export const common = config(globalIgnores([
3
+ export const common = defineConfig(globalIgnores([
6
4
  '**/.git/**',
7
5
  '**/node_modules/**',
8
6
  '**/.yarn/**',
9
7
  '**/dist/**',
10
8
  '**/.idea/**',
11
- ]), gitignore({ name: 'eslint-config-flat-gitignore', strict: false }), {
12
- name: '@stylistic/eslint-plugin',
13
- files: ['**/*.{js,cjs,mjs,jsx,ts,cts,mts,tsx}'],
14
- extends: [
15
- stylisticPlugin.configs.customize({
16
- indent: 2,
17
- quotes: 'single',
18
- semi: false,
19
- jsx: true,
20
- arrowParens: true,
21
- blockSpacing: true,
22
- quoteProps: 'consistent-as-needed',
23
- commaDangle: 'always-multiline',
24
- }),
25
- ],
26
- rules: {
27
- // UTF-8 BOM を禁止
28
- 'unicode-bom': ['error', 'never'],
29
- // 最終行に改行を挿入
30
- '@stylistic/eol-last': ['error', 'always'],
31
- // 行末のスペースを禁止
32
- '@stylistic/no-trailing-spaces': ['error'],
33
- // 型名の前後のスペースを揃える
34
- // e.g. const foo: string = 'bar'
35
- '@stylistic/type-annotation-spacing': 'error',
36
- },
37
- });
9
+ '**/pnpm-lock.yaml',
10
+ ]), gitignore({ name: 'eslint-config-flat-gitignore', strict: false }));
@@ -1,42 +1,14 @@
1
- import stylisticPlugin from '@stylistic/eslint-plugin'
2
- import { globalIgnores } from 'eslint/config'
1
+ import { defineConfig, globalIgnores } from 'eslint/config'
3
2
  import gitignore from 'eslint-config-flat-gitignore'
4
- import { config } from 'typescript-eslint'
5
3
 
6
- export const common = config(
4
+ export const common = defineConfig(
7
5
  globalIgnores([
8
6
  '**/.git/**',
9
7
  '**/node_modules/**',
10
8
  '**/.yarn/**',
11
9
  '**/dist/**',
12
10
  '**/.idea/**',
11
+ '**/pnpm-lock.yaml',
13
12
  ]),
14
13
  gitignore({ name: 'eslint-config-flat-gitignore', strict: false }),
15
- {
16
- name: '@stylistic/eslint-plugin',
17
- files: ['**/*.{js,cjs,mjs,jsx,ts,cts,mts,tsx}'],
18
- extends: [
19
- stylisticPlugin.configs.customize({
20
- indent: 2,
21
- quotes: 'single',
22
- semi: false,
23
- jsx: true,
24
- arrowParens: true,
25
- blockSpacing: true,
26
- quoteProps: 'consistent-as-needed',
27
- commaDangle: 'always-multiline',
28
- }),
29
- ],
30
- rules: {
31
- // UTF-8 BOM を禁止
32
- 'unicode-bom': ['error', 'never'],
33
- // 最終行に改行を挿入
34
- '@stylistic/eol-last': ['error', 'always'],
35
- // 行末のスペースを禁止
36
- '@stylistic/no-trailing-spaces': ['error'],
37
- // 型名の前後のスペースを揃える
38
- // e.g. const foo: string = 'bar'
39
- '@stylistic/type-annotation-spacing': 'error',
40
- },
41
- },
42
14
  )
@@ -1,6 +1,6 @@
1
1
  import graphqlPlugin from '@graphql-eslint/eslint-plugin';
2
- import { config } from 'typescript-eslint';
3
- export const graphql = config(
2
+ import { defineConfig } from 'eslint/config';
3
+ export const graphql = defineConfig(
4
4
  // GraphQL を解釈できるようにする
5
5
  {
6
6
  name: '@graphql-eslint/eslint-plugin (parser)',
@@ -9,6 +9,7 @@ export const graphql = config(
9
9
  parser: graphqlPlugin.parser,
10
10
  },
11
11
  plugins: {
12
+ // @ts-expect-error -- 一時的に型定義を無視
12
13
  '@graphql-eslint': graphqlPlugin,
13
14
  },
14
15
  },
@@ -1,7 +1,7 @@
1
1
  import graphqlPlugin from '@graphql-eslint/eslint-plugin'
2
- import { config } from 'typescript-eslint'
2
+ import { defineConfig } from 'eslint/config'
3
3
 
4
- export const graphql = config(
4
+ export const graphql = defineConfig(
5
5
  // GraphQL を解釈できるようにする
6
6
  {
7
7
  name: '@graphql-eslint/eslint-plugin (parser)',
@@ -10,6 +10,7 @@ export const graphql = config(
10
10
  parser: graphqlPlugin.parser,
11
11
  },
12
12
  plugins: {
13
+ // @ts-expect-error -- 一時的に型定義を無視
13
14
  '@graphql-eslint': graphqlPlugin,
14
15
  },
15
16
  },
@@ -1,12 +1,14 @@
1
1
  import eslint from '@eslint/js';
2
2
  // @ts-expect-error 型定義ファイルがない
3
3
  import eslintCommentsConfig from '@eslint-community/eslint-plugin-eslint-comments/configs';
4
- import importXPlugin from 'eslint-plugin-import-x';
4
+ import stylisticPlugin from '@stylistic/eslint-plugin';
5
+ import { defineConfig } from 'eslint/config';
6
+ import { importX } from 'eslint-plugin-import-x';
5
7
  // @ts-expect-error 型定義ファイルがない
6
8
  import promisePlugin from 'eslint-plugin-promise';
7
9
  import unusedImportsPlugin from 'eslint-plugin-unused-imports';
8
- import tseslint, { config } from 'typescript-eslint';
9
- export const javaScript = config({
10
+ import tseslint from 'typescript-eslint';
11
+ export const javaScript = defineConfig({
10
12
  files: ['**/*.cjs'],
11
13
  languageOptions: {
12
14
  sourceType: 'commonjs',
@@ -30,13 +32,13 @@ export const javaScript = config({
30
32
  // 関数宣言は function xxx() {} にする
31
33
  'func-style': ['error', 'declaration', { allowArrowFunctions: true }],
32
34
  // 中括弧の省略を禁止
33
- 'curly': 'error',
35
+ curly: 'error',
34
36
  // テンプレート文字列を優先
35
37
  'prefer-template': 'error',
36
38
  // == 比較 👉 === 比較
37
- 'eqeqeq': 'error',
39
+ eqeqeq: 'error',
38
40
  // *.js で 'use strict'; を強制
39
- 'strict': ['error', 'global'],
41
+ strict: ['error', 'global'],
40
42
  // 特定の構文を禁止
41
43
  'no-restricted-syntax': [
42
44
  'error',
@@ -76,12 +78,10 @@ export const javaScript = config({
76
78
  'no-unused-private-class-members': 'error',
77
79
  // スレッドセーフで安全に更新されないコードを禁止
78
80
  'require-atomic-updates': 'error',
79
- // func () 👉 func()
80
- 'func-call-spacing': ['error', 'never'],
81
81
  // ペアになっていない setter を禁止
82
82
  'accessor-pairs': 'error',
83
83
  // キャメルケースに強制しない
84
- 'camelcase': 'off',
84
+ camelcase: 'off',
85
85
  // switch 文で default を強制しない
86
86
  'default-case': 'off',
87
87
  // continue 文を許可
@@ -98,25 +98,54 @@ export const javaScript = config({
98
98
  'no-plusplus': 'off',
99
99
  // return の省略などを許可
100
100
  'consistent-return': 'off',
101
- // 空行を挟む
102
- 'padding-line-between-statements': [
103
- 'warn',
104
- // return 前に空行
105
- { blankLine: 'always', prev: '*', next: 'return' },
106
- // ディレクティブ後に空行
107
- { blankLine: 'always', prev: 'directive', next: '*' },
108
- { blankLine: 'any', prev: 'directive', next: 'directive' },
109
- ],
110
101
  // void Promise を許可
111
102
  'no-void': 'off',
112
103
  // 1 <= x < 10 を許可
113
- 'yoda': [
104
+ yoda: [
114
105
  'error',
115
106
  'never',
116
107
  {
117
108
  exceptRange: true,
118
109
  },
119
110
  ],
111
+ // UTF-8 BOM を禁止
112
+ 'unicode-bom': ['error', 'never'],
113
+ },
114
+ }, {
115
+ name: '@stylistic/eslint-plugin',
116
+ files: ['**/*.{js,cjs,mjs,jsx,ts,cts,mts,tsx}'],
117
+ extends: [
118
+ stylisticPlugin.configs.customize({
119
+ indent: 2,
120
+ quotes: 'single',
121
+ semi: false,
122
+ jsx: true,
123
+ arrowParens: true,
124
+ blockSpacing: true,
125
+ quoteProps: 'as-needed',
126
+ commaDangle: 'always-multiline',
127
+ braceStyle: '1tbs',
128
+ }),
129
+ ],
130
+ rules: {
131
+ // 最終行に改行を挿入
132
+ '@stylistic/eol-last': ['error', 'always'],
133
+ // 行末のスペースを禁止
134
+ '@stylistic/no-trailing-spaces': ['error'],
135
+ // 型名の前後のスペースを揃える
136
+ // e.g. const foo: string = 'bar'
137
+ '@stylistic/type-annotation-spacing': 'error',
138
+ // func () 👉 func()
139
+ '@stylistic/function-call-spacing': ['error', 'never'],
140
+ // 空行を挟む
141
+ '@stylistic/padding-line-between-statements': [
142
+ 'warn',
143
+ // return 前に空行
144
+ { blankLine: 'always', prev: '*', next: 'return' },
145
+ // ディレクティブ後に空行
146
+ { blankLine: 'always', prev: 'directive', next: '*' },
147
+ { blankLine: 'any', prev: 'directive', next: 'directive' },
148
+ ],
120
149
  },
121
150
  }, {
122
151
  name: '@eslint-community/eslint-plugin-eslint-comments',
@@ -124,7 +153,10 @@ export const javaScript = config({
124
153
  }, {
125
154
  name: 'eslint-plugin-import-x',
126
155
  files: ['**/*.{js,cjs,mjs,jsx,ts,cts,mts,tsx}'],
127
- extends: [importXPlugin.flatConfigs.recommended],
156
+ extends: [
157
+ // @ts-expect-error -- languageOptions の型定義が不一致
158
+ importX.flatConfigs.recommended,
159
+ ],
128
160
  settings: {
129
161
  'import-x/resolver': {
130
162
  node: {
@@ -149,7 +181,7 @@ export const javaScript = config({
149
181
  'warn',
150
182
  {
151
183
  // 組み込み → 外部依存 → 内部依存 → object → type の順にする
152
- 'groups': [
184
+ groups: [
153
185
  'builtin',
154
186
  'external',
155
187
  ['parent', 'sibling', 'index'],
@@ -160,11 +192,11 @@ export const javaScript = config({
160
192
  // カテゴリー間に改行を入れる
161
193
  'newlines-between': 'always',
162
194
  // 大文字小文字区別なしで ABC 順にする
163
- 'alphabetize': {
195
+ alphabetize: {
164
196
  order: 'asc',
165
197
  caseInsensitive: true,
166
198
  },
167
- 'pathGroups': [
199
+ pathGroups: [
168
200
  // **.css は最後に配置する
169
201
  {
170
202
  pattern: '**.css',
@@ -173,7 +205,7 @@ export const javaScript = config({
173
205
  },
174
206
  ],
175
207
  // **.css が import 順最後ではないときに警告
176
- 'warnOnUnassignedImports': true,
208
+ warnOnUnassignedImports: true,
177
209
  },
178
210
  ],
179
211
  },
@@ -1,13 +1,15 @@
1
1
  import eslint from '@eslint/js'
2
2
  // @ts-expect-error 型定義ファイルがない
3
3
  import eslintCommentsConfig from '@eslint-community/eslint-plugin-eslint-comments/configs'
4
- import importXPlugin from 'eslint-plugin-import-x'
4
+ import stylisticPlugin from '@stylistic/eslint-plugin'
5
+ import { defineConfig } from 'eslint/config'
6
+ import { importX } from 'eslint-plugin-import-x'
5
7
  // @ts-expect-error 型定義ファイルがない
6
8
  import promisePlugin from 'eslint-plugin-promise'
7
9
  import unusedImportsPlugin from 'eslint-plugin-unused-imports'
8
- import tseslint, { config } from 'typescript-eslint'
10
+ import tseslint from 'typescript-eslint'
9
11
 
10
- export const javaScript = config(
12
+ export const javaScript = defineConfig(
11
13
  {
12
14
  files: ['**/*.cjs'],
13
15
  languageOptions: {
@@ -35,13 +37,13 @@ export const javaScript = config(
35
37
  // 関数宣言は function xxx() {} にする
36
38
  'func-style': ['error', 'declaration', { allowArrowFunctions: true }],
37
39
  // 中括弧の省略を禁止
38
- 'curly': 'error',
40
+ curly: 'error',
39
41
  // テンプレート文字列を優先
40
42
  'prefer-template': 'error',
41
43
  // == 比較 👉 === 比較
42
- 'eqeqeq': 'error',
44
+ eqeqeq: 'error',
43
45
  // *.js で 'use strict'; を強制
44
- 'strict': ['error', 'global'],
46
+ strict: ['error', 'global'],
45
47
  // 特定の構文を禁止
46
48
  'no-restricted-syntax': [
47
49
  'error',
@@ -81,12 +83,10 @@ export const javaScript = config(
81
83
  'no-unused-private-class-members': 'error',
82
84
  // スレッドセーフで安全に更新されないコードを禁止
83
85
  'require-atomic-updates': 'error',
84
- // func () 👉 func()
85
- 'func-call-spacing': ['error', 'never'],
86
86
  // ペアになっていない setter を禁止
87
87
  'accessor-pairs': 'error',
88
88
  // キャメルケースに強制しない
89
- 'camelcase': 'off',
89
+ camelcase: 'off',
90
90
  // switch 文で default を強制しない
91
91
  'default-case': 'off',
92
92
  // continue 文を許可
@@ -103,25 +103,55 @@ export const javaScript = config(
103
103
  'no-plusplus': 'off',
104
104
  // return の省略などを許可
105
105
  'consistent-return': 'off',
106
- // 空行を挟む
107
- 'padding-line-between-statements': [
108
- 'warn',
109
- // return 前に空行
110
- { blankLine: 'always', prev: '*', next: 'return' },
111
- // ディレクティブ後に空行
112
- { blankLine: 'always', prev: 'directive', next: '*' },
113
- { blankLine: 'any', prev: 'directive', next: 'directive' },
114
- ],
115
106
  // void Promise を許可
116
107
  'no-void': 'off',
117
108
  // 1 <= x < 10 を許可
118
- 'yoda': [
109
+ yoda: [
119
110
  'error',
120
111
  'never',
121
112
  {
122
113
  exceptRange: true,
123
114
  },
124
115
  ],
116
+ // UTF-8 BOM を禁止
117
+ 'unicode-bom': ['error', 'never'],
118
+ },
119
+ },
120
+ {
121
+ name: '@stylistic/eslint-plugin',
122
+ files: ['**/*.{js,cjs,mjs,jsx,ts,cts,mts,tsx}'],
123
+ extends: [
124
+ stylisticPlugin.configs.customize({
125
+ indent: 2,
126
+ quotes: 'single',
127
+ semi: false,
128
+ jsx: true,
129
+ arrowParens: true,
130
+ blockSpacing: true,
131
+ quoteProps: 'as-needed',
132
+ commaDangle: 'always-multiline',
133
+ braceStyle: '1tbs',
134
+ }),
135
+ ],
136
+ rules: {
137
+ // 最終行に改行を挿入
138
+ '@stylistic/eol-last': ['error', 'always'],
139
+ // 行末のスペースを禁止
140
+ '@stylistic/no-trailing-spaces': ['error'],
141
+ // 型名の前後のスペースを揃える
142
+ // e.g. const foo: string = 'bar'
143
+ '@stylistic/type-annotation-spacing': 'error',
144
+ // func () 👉 func()
145
+ '@stylistic/function-call-spacing': ['error', 'never'],
146
+ // 空行を挟む
147
+ '@stylistic/padding-line-between-statements': [
148
+ 'warn',
149
+ // return 前に空行
150
+ { blankLine: 'always', prev: '*', next: 'return' },
151
+ // ディレクティブ後に空行
152
+ { blankLine: 'always', prev: 'directive', next: '*' },
153
+ { blankLine: 'any', prev: 'directive', next: 'directive' },
154
+ ],
125
155
  },
126
156
  },
127
157
  {
@@ -131,7 +161,10 @@ export const javaScript = config(
131
161
  {
132
162
  name: 'eslint-plugin-import-x',
133
163
  files: ['**/*.{js,cjs,mjs,jsx,ts,cts,mts,tsx}'],
134
- extends: [importXPlugin.flatConfigs.recommended],
164
+ extends: [
165
+ // @ts-expect-error -- languageOptions の型定義が不一致
166
+ importX.flatConfigs.recommended,
167
+ ],
135
168
  settings: {
136
169
  'import-x/resolver': {
137
170
  node: {
@@ -156,7 +189,7 @@ export const javaScript = config(
156
189
  'warn',
157
190
  {
158
191
  // 組み込み → 外部依存 → 内部依存 → object → type の順にする
159
- 'groups': [
192
+ groups: [
160
193
  'builtin',
161
194
  'external',
162
195
  ['parent', 'sibling', 'index'],
@@ -167,11 +200,11 @@ export const javaScript = config(
167
200
  // カテゴリー間に改行を入れる
168
201
  'newlines-between': 'always',
169
202
  // 大文字小文字区別なしで ABC 順にする
170
- 'alphabetize': {
203
+ alphabetize: {
171
204
  order: 'asc',
172
205
  caseInsensitive: true,
173
206
  },
174
- 'pathGroups': [
207
+ pathGroups: [
175
208
  // **.css は最後に配置する
176
209
  {
177
210
  pattern: '**.css',
@@ -180,7 +213,7 @@ export const javaScript = config(
180
213
  },
181
214
  ],
182
215
  // **.css が import 順最後ではないときに警告
183
- 'warnOnUnassignedImports': true,
216
+ warnOnUnassignedImports: true,
184
217
  },
185
218
  ],
186
219
  },
@@ -1,10 +1,11 @@
1
+ import { defineConfig } from 'eslint/config';
1
2
  import packageJsonPlugin from 'eslint-plugin-package-json';
2
- import { config } from 'typescript-eslint';
3
- export const packageJson = config({
3
+ export const packageJson = defineConfig({
4
4
  name: 'eslint-plugin-package-json',
5
5
  files: ['**/package.json'],
6
6
  extends: [packageJsonPlugin.configs.recommended],
7
7
  rules: {
8
+ 'package-json/require-description': 'off',
8
9
  'package-json/order-properties': [
9
10
  'error',
10
11
  {
@@ -1,11 +1,12 @@
1
+ import { defineConfig } from 'eslint/config'
1
2
  import packageJsonPlugin from 'eslint-plugin-package-json'
2
- import { config } from 'typescript-eslint'
3
3
 
4
- export const packageJson = config({
4
+ export const packageJson = defineConfig({
5
5
  name: 'eslint-plugin-package-json',
6
6
  files: ['**/package.json'],
7
7
  extends: [packageJsonPlugin.configs.recommended],
8
8
  rules: {
9
+ 'package-json/require-description': 'off',
9
10
  'package-json/order-properties': [
10
11
  'error',
11
12
  {
@@ -1,8 +1,9 @@
1
1
  import safeTypeScriptPlugin from '@susisu/eslint-plugin-safe-typescript';
2
- import importXPlugin from 'eslint-plugin-import-x';
2
+ import { defineConfig } from 'eslint/config';
3
+ import { importX } from 'eslint-plugin-import-x';
3
4
  import tsdocPlugin from 'eslint-plugin-tsdoc';
4
- import tseslint, { config } from 'typescript-eslint';
5
- export const typeScript = config({
5
+ import tseslint from 'typescript-eslint';
6
+ export const typeScript = defineConfig({
6
7
  files: ['**/*.cts'],
7
8
  languageOptions: {
8
9
  sourceType: 'commonjs',
@@ -196,7 +197,10 @@ export const typeScript = config({
196
197
  }, {
197
198
  name: 'eslint-plugin-import-x',
198
199
  files: ['**/*.{ts,cts,mts,tsx}'],
199
- extends: [importXPlugin.flatConfigs.typescript],
200
+ extends: [
201
+ // @ts-expect-error -- languageOptions の型定義が不一致
202
+ importX.flatConfigs.typescript,
203
+ ],
200
204
  rules: {
201
205
  // import に拡張子を推奨
202
206
  'import-x/extensions': [
@@ -1,9 +1,10 @@
1
1
  import safeTypeScriptPlugin from '@susisu/eslint-plugin-safe-typescript'
2
- import importXPlugin from 'eslint-plugin-import-x'
2
+ import { defineConfig } from 'eslint/config'
3
+ import { importX } from 'eslint-plugin-import-x'
3
4
  import tsdocPlugin from 'eslint-plugin-tsdoc'
4
- import tseslint, { config } from 'typescript-eslint'
5
+ import tseslint from 'typescript-eslint'
5
6
 
6
- export const typeScript = config(
7
+ export const typeScript = defineConfig(
7
8
  {
8
9
  files: ['**/*.cts'],
9
10
  languageOptions: {
@@ -202,7 +203,10 @@ export const typeScript = config(
202
203
  {
203
204
  name: 'eslint-plugin-import-x',
204
205
  files: ['**/*.{ts,cts,mts,tsx}'],
205
- extends: [importXPlugin.flatConfigs.typescript],
206
+ extends: [
207
+ // @ts-expect-error -- languageOptions の型定義が不一致
208
+ importX.flatConfigs.typescript,
209
+ ],
206
210
  rules: {
207
211
  // import に拡張子を推奨
208
212
  'import-x/extensions': [
package/src/base/yaml.js CHANGED
@@ -1,6 +1,6 @@
1
+ import { defineConfig } from 'eslint/config';
1
2
  import ymlPlugin from 'eslint-plugin-yml';
2
- import { config } from 'typescript-eslint';
3
- export const yaml = config({
3
+ export const yaml = defineConfig({
4
4
  name: 'eslint-plugin-yml',
5
5
  files: ['**/*.{yml,yaml}'],
6
6
  extends: [
package/src/base/yaml.ts CHANGED
@@ -1,7 +1,7 @@
1
+ import { defineConfig } from 'eslint/config'
1
2
  import ymlPlugin from 'eslint-plugin-yml'
2
- import { config } from 'typescript-eslint'
3
3
 
4
- export const yaml = config(
4
+ export const yaml = defineConfig(
5
5
  {
6
6
  name: 'eslint-plugin-yml',
7
7
  files: ['**/*.{yml,yaml}'],
@@ -1,5 +1,5 @@
1
- import { config } from 'typescript-eslint';
2
- export const cloudflareWorkers = config({
1
+ import { defineConfig } from 'eslint/config';
2
+ export const cloudflareWorkers = defineConfig({
3
3
  files: ['**/src/worker.{js,ts}', '**/functions/**/*.{js,ts}'],
4
4
  rules: {
5
5
  // default export を許可
@@ -1,6 +1,6 @@
1
- import { config } from 'typescript-eslint'
1
+ import { defineConfig } from 'eslint/config'
2
2
 
3
- export const cloudflareWorkers = config({
3
+ export const cloudflareWorkers = defineConfig({
4
4
  files: ['**/src/worker.{js,ts}', '**/functions/**/*.{js,ts}'],
5
5
  rules: {
6
6
  // default export を許可
@@ -1,6 +1,6 @@
1
+ import { defineConfig } from 'eslint/config';
1
2
  import nPlugin from 'eslint-plugin-n';
2
- import { config } from 'typescript-eslint';
3
- export const node = config({
3
+ export const node = defineConfig({
4
4
  name: 'eslint-plugin-n',
5
5
  files: [
6
6
  '**/bin/**/*.{js,cjs,mjs,ts,cts,mts}',
@@ -1,7 +1,7 @@
1
+ import { defineConfig } from 'eslint/config'
1
2
  import nPlugin from 'eslint-plugin-n'
2
- import { config } from 'typescript-eslint'
3
3
 
4
- export const node = config(
4
+ export const node = defineConfig(
5
5
  {
6
6
  name: 'eslint-plugin-n',
7
7
  files: [
@@ -1,6 +1,6 @@
1
+ import { defineConfig } from 'eslint/config';
1
2
  import userScriptsPlugin from 'eslint-plugin-userscripts';
2
- import { config } from 'typescript-eslint';
3
- export const userScript = config({
3
+ export const userScript = defineConfig({
4
4
  name: 'eslint-plugin-userscripts',
5
5
  files: ['**/*.user.js'],
6
6
  plugins: {
@@ -1,7 +1,7 @@
1
+ import { defineConfig } from 'eslint/config'
1
2
  import userScriptsPlugin from 'eslint-plugin-userscripts'
2
- import { config } from 'typescript-eslint'
3
3
 
4
- export const userScript = config({
4
+ export const userScript = defineConfig({
5
5
  name: 'eslint-plugin-userscripts',
6
6
  files: ['**/*.user.js'],
7
7
  plugins: {
@@ -1,6 +1,6 @@
1
+ import { defineConfig } from 'eslint/config';
1
2
  import jestPlugin from 'eslint-plugin-jest';
2
- import { config } from 'typescript-eslint';
3
- export const jest = config({
3
+ export const jest = defineConfig({
4
4
  name: 'eslint-plugin-jest',
5
5
  files: [
6
6
  '**/*.test.{js,cjs,mjs,jsx,ts,cts,mts,tsx}',
@@ -1,7 +1,7 @@
1
+ import { defineConfig } from 'eslint/config'
1
2
  import jestPlugin from 'eslint-plugin-jest'
2
- import { config } from 'typescript-eslint'
3
3
 
4
- export const jest = config({
4
+ export const jest = defineConfig({
5
5
  name: 'eslint-plugin-jest',
6
6
  files: [
7
7
  '**/*.test.{js,cjs,mjs,jsx,ts,cts,mts,tsx}',
@@ -1,7 +1,6 @@
1
- // @ts-expect-error 型定義ファイルがない
2
1
  import nextPlugin from '@next/eslint-plugin-next';
3
- import { config } from 'typescript-eslint';
4
- export const nextJs = config({
2
+ import { defineConfig } from 'eslint/config';
3
+ export const nextJs = defineConfig({
5
4
  name: '@next/eslint-plugin-next',
6
5
  files: [
7
6
  // Pages Router
@@ -9,9 +8,6 @@ export const nextJs = config({
9
8
  // App Router
10
9
  '**/app/**/*.{js,cjs,mjs,jsx,ts,cts,mts,tsx}',
11
10
  ],
12
- plugins: {
13
- '@next/next': nextPlugin,
14
- },
15
11
  extends: [
16
12
  nextPlugin.configs.recommended,
17
13
  nextPlugin.configs['core-web-vitals'],
@@ -1,8 +1,7 @@
1
- // @ts-expect-error 型定義ファイルがない
2
1
  import nextPlugin from '@next/eslint-plugin-next'
3
- import { config } from 'typescript-eslint'
2
+ import { defineConfig } from 'eslint/config'
4
3
 
5
- export const nextJs = config({
4
+ export const nextJs = defineConfig({
6
5
  name: '@next/eslint-plugin-next',
7
6
  files: [
8
7
  // Pages Router
@@ -10,9 +9,6 @@ export const nextJs = config({
10
9
  // App Router
11
10
  '**/app/**/*.{js,cjs,mjs,jsx,ts,cts,mts,tsx}',
12
11
  ],
13
- plugins: {
14
- '@next/next': nextPlugin,
15
- },
16
12
  extends: [
17
13
  nextPlugin.configs.recommended,
18
14
  nextPlugin.configs['core-web-vitals'],
@@ -1,11 +1,11 @@
1
+ import { defineConfig } from 'eslint/config';
1
2
  // @ts-expect-error 型定義ファイルがない
2
3
  import jsxA11y from 'eslint-plugin-jsx-a11y';
3
4
  import reactPlugin from 'eslint-plugin-react';
4
5
  import reactHooksPlugin from 'eslint-plugin-react-hooks';
5
6
  import reactRefreshPlugin from 'eslint-plugin-react-refresh';
6
7
  import globals from 'globals';
7
- import { config } from 'typescript-eslint';
8
- export const react = config([
8
+ export const react = defineConfig([
9
9
  {
10
10
  name: 'eslint-plugin-react',
11
11
  files: ['**/*.{jsx,tsx}'],
@@ -95,7 +95,7 @@ export const react = config([
95
95
  ], {
96
96
  name: 'eslint-plugin-react-hooks',
97
97
  files: ['**/*.{jsx,tsx}'],
98
- extends: [reactHooksPlugin.configs['recommended-latest']],
98
+ extends: [reactHooksPlugin.configs.flat['recommended-latest']],
99
99
  rules: {
100
100
  // https://recoiljs.org/docs/introduction/installation/#eslint
101
101
  'react-hooks/rules-of-hooks': 'error',
@@ -1,12 +1,12 @@
1
+ import { defineConfig } from 'eslint/config'
1
2
  // @ts-expect-error 型定義ファイルがない
2
3
  import jsxA11y from 'eslint-plugin-jsx-a11y'
3
4
  import reactPlugin from 'eslint-plugin-react'
4
5
  import reactHooksPlugin from 'eslint-plugin-react-hooks'
5
6
  import reactRefreshPlugin from 'eslint-plugin-react-refresh'
6
7
  import globals from 'globals'
7
- import { config } from 'typescript-eslint'
8
8
 
9
- export const react = config(
9
+ export const react = defineConfig(
10
10
  [
11
11
  {
12
12
  name: 'eslint-plugin-react',
@@ -98,7 +98,7 @@ export const react = config(
98
98
  {
99
99
  name: 'eslint-plugin-react-hooks',
100
100
  files: ['**/*.{jsx,tsx}'],
101
- extends: [reactHooksPlugin.configs['recommended-latest']],
101
+ extends: [reactHooksPlugin.configs.flat['recommended-latest']],
102
102
  rules: {
103
103
  // https://recoiljs.org/docs/introduction/installation/#eslint
104
104
  'react-hooks/rules-of-hooks': 'error',
@@ -1,13 +1,15 @@
1
- import { config } from 'typescript-eslint';
2
- export const relay = config({
1
+ import { defineConfig } from 'eslint/config';
2
+ // @ts-expect-error -- 型定義がない
3
+ import relayPlugin from 'eslint-plugin-relay';
4
+ export const relay = defineConfig({
3
5
  name: 'eslint-plugin-relay',
4
6
  files: ['**/*.{js,cjs,mjs,jsx,ts,cts,mts,tsx}'],
5
- // TODO: eslint-plugin-relay が Flat Configs に対応したら移行する
6
- // https://github.com/relayjs/eslint-plugin-relay/issues/156
7
- // extends: ['plugin:relay/recommended'],
8
- // plugins: ['relay'],
9
- // rules: {
10
- // // 未使用の GraphQL フィールドを禁止
11
- // 'relay/unused-fields': 'error',
12
- // },
7
+ extends: [
8
+ relayPlugin.configs['ts-recommended'],
9
+ ],
10
+ plugins: { relay: relayPlugin },
11
+ rules: {
12
+ // 未使用の GraphQL フィールドを禁止
13
+ 'relay/unused-fields': 'error',
14
+ },
13
15
  });
@@ -1,14 +1,16 @@
1
- import { config } from 'typescript-eslint'
1
+ import { defineConfig } from 'eslint/config'
2
+ // @ts-expect-error -- 型定義がない
3
+ import relayPlugin from 'eslint-plugin-relay'
2
4
 
3
- export const relay = config({
5
+ export const relay = defineConfig({
4
6
  name: 'eslint-plugin-relay',
5
7
  files: ['**/*.{js,cjs,mjs,jsx,ts,cts,mts,tsx}'],
6
- // TODO: eslint-plugin-relay が Flat Configs に対応したら移行する
7
- // https://github.com/relayjs/eslint-plugin-relay/issues/156
8
- // extends: ['plugin:relay/recommended'],
9
- // plugins: ['relay'],
10
- // rules: {
11
- // // 未使用の GraphQL フィールドを禁止
12
- // 'relay/unused-fields': 'error',
13
- // },
8
+ extends: [
9
+ relayPlugin.configs['ts-recommended'],
10
+ ],
11
+ plugins: { relay: relayPlugin },
12
+ rules: {
13
+ // 未使用の GraphQL フィールドを禁止
14
+ 'relay/unused-fields': 'error',
15
+ },
14
16
  })
@@ -1,7 +1,6 @@
1
+ import { defineConfig } from 'eslint/config';
1
2
  import storybookPlugin from 'eslint-plugin-storybook';
2
- import { config } from 'typescript-eslint';
3
- export const storybook = config({
4
- name: 'eslint-plugin-storybook',
5
- files: ['**/*.stories.{jsx,tsx}'],
6
- extends: [storybookPlugin.configs['flat/recommended']],
7
- });
3
+ export const storybook = defineConfig(
4
+ // eslint-plugin-storybook
5
+ // @ts-expect-error -- 型定義が不一致
6
+ storybookPlugin.configs['flat/recommended']);
@@ -1,8 +1,8 @@
1
+ import { defineConfig } from 'eslint/config'
1
2
  import storybookPlugin from 'eslint-plugin-storybook'
2
- import { config } from 'typescript-eslint'
3
3
 
4
- export const storybook = config({
5
- name: 'eslint-plugin-storybook',
6
- files: ['**/*.stories.{jsx,tsx}'],
7
- extends: [storybookPlugin.configs['flat/recommended']],
8
- })
4
+ export const storybook = defineConfig(
5
+ // eslint-plugin-storybook
6
+ // @ts-expect-error -- 型定義が不一致
7
+ storybookPlugin.configs['flat/recommended'],
8
+ )
@@ -1,6 +1,6 @@
1
+ import { defineConfig } from 'eslint/config';
1
2
  import reactRefreshPlugin from 'eslint-plugin-react-refresh';
2
- import { config } from 'typescript-eslint';
3
- export const vite = config({
3
+ export const vite = defineConfig({
4
4
  name: 'eslint-plugin-react-refresh',
5
5
  files: ['**/src/**/*.{jsx,tsx}'],
6
6
  extends: [reactRefreshPlugin.configs.vite],
@@ -1,7 +1,7 @@
1
+ import { defineConfig } from 'eslint/config'
1
2
  import reactRefreshPlugin from 'eslint-plugin-react-refresh'
2
- import { config } from 'typescript-eslint'
3
3
 
4
- export const vite = config({
4
+ export const vite = defineConfig({
5
5
  name: 'eslint-plugin-react-refresh',
6
6
  files: ['**/src/**/*.{jsx,tsx}'],
7
7
  extends: [reactRefreshPlugin.configs.vite],
@@ -1,6 +1,6 @@
1
1
  import vitestPlugin from '@vitest/eslint-plugin';
2
- import { config } from 'typescript-eslint';
3
- export const vitest = config({
2
+ import { defineConfig } from 'eslint/config';
3
+ export const vitest = defineConfig({
4
4
  name: '@vitest/eslint-plugin',
5
5
  files: [
6
6
  '**/*.test.{js,cjs,mjs,jsx,ts,cts,mts,tsx}',
@@ -1,7 +1,7 @@
1
1
  import vitestPlugin from '@vitest/eslint-plugin'
2
- import { config } from 'typescript-eslint'
2
+ import { defineConfig } from 'eslint/config'
3
3
 
4
- export const vitest = config({
4
+ export const vitest = defineConfig({
5
5
  name: '@vitest/eslint-plugin',
6
6
  files: [
7
7
  '**/*.test.{js,cjs,mjs,jsx,ts,cts,mts,tsx}',
package/src/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import tseslint from 'typescript-eslint';
1
+ import { defineConfig } from 'eslint/config';
2
2
  import { common } from './base/common.js';
3
3
  import { graphql } from './base/graphql.js';
4
4
  import { javaScript } from './base/javascript.js';
@@ -15,8 +15,8 @@ import { relay } from './frameworks/relay.js';
15
15
  import { storybook } from './frameworks/storybook.js';
16
16
  import { vite } from './frameworks/vite.js';
17
17
  import { vitest } from './frameworks/vitest.js';
18
- export function config(_options, ...overrides) {
19
- return tseslint.config(
18
+ export function config(options, ...overrides) {
19
+ return defineConfig(
20
20
  // ベース
21
21
  [
22
22
  common,
@@ -56,5 +56,7 @@ export function config(_options, ...overrides) {
56
56
  cloudflareWorkers,
57
57
  // UserScript
58
58
  userScript,
59
- ], ...overrides);
59
+ ],
60
+ // @ts-expect-error -- 型定義が不完全
61
+ ...overrides);
60
62
  }
package/src/index.ts CHANGED
@@ -1,4 +1,4 @@
1
- import tseslint from 'typescript-eslint'
1
+ import { defineConfig } from 'eslint/config'
2
2
 
3
3
  import { common } from './base/common.js'
4
4
  import { graphql } from './base/graphql.js'
@@ -17,11 +17,13 @@ import { storybook } from './frameworks/storybook.js'
17
17
  import { vite } from './frameworks/vite.js'
18
18
  import { vitest } from './frameworks/vitest.js'
19
19
 
20
+ import type { ConfigArray, ConfigWithExtends } from 'typescript-eslint'
21
+
20
22
  // eslint-disable-next-line @typescript-eslint/no-empty-object-type -- 将来のために予約してある
21
23
  type Options = {}
22
24
 
23
- export function config(_options?: Options, ...overrides: tseslint.ConfigWithExtends[]): tseslint.ConfigArray {
24
- return tseslint.config(
25
+ export function config(options?: Options, ...overrides: ConfigWithExtends[]): ConfigArray {
26
+ return defineConfig(
25
27
  // ベース
26
28
  [
27
29
  common,
@@ -65,6 +67,7 @@ export function config(_options?: Options, ...overrides: tseslint.ConfigWithExte
65
67
  userScript,
66
68
  ],
67
69
 
70
+ // @ts-expect-error -- 型定義が不完全
68
71
  ...overrides,
69
72
  )
70
73
  }