Skip to content

Commit b351703

Browse files
authored
feat(typescript-eslint): allow infinitely deep array nesting in config function and extends (typescript-eslint#10333)
1 parent 00a3a84 commit b351703

File tree

18 files changed

+427
-422
lines changed

18 files changed

+427
-422
lines changed

docs/getting-started/Quickstart.mdx

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ import tseslint from 'typescript-eslint';
3939

4040
export default tseslint.config(
4141
eslint.configs.recommended,
42-
...tseslint.configs.recommended,
42+
tseslint.configs.recommended,
4343
);
4444
```
4545

@@ -52,6 +52,12 @@ The `.mjs` extension makes the file use the [ES modules (ESM)](https://developer
5252

5353
</details>
5454

55+
#### Details
56+
57+
- `tseslint.config(...)` is an **_optional_** helper function — [read more about it here](../packages/TypeScript_ESLint.mdx#config).
58+
- `'@eslint/js'` / `eslint.configs.recommended` turns on [eslint's recommended config](https://www.npmjs.com/package/@eslint/js).
59+
- `tseslint.configs.recommended` turns on [our recommended config](../users/Shared_Configurations.mdx#recommended).
60+
5561
### Step 3: Running ESLint
5662

5763
Open a terminal to the root of your project and run the following command:
@@ -82,12 +88,6 @@ pnpm eslint .
8288

8389
ESLint will lint all TypeScript compatible files within the current folder, and will output the results to your terminal.
8490

85-
## Details
86-
87-
- `tseslint.config(...)` is an _optional_ helper function — [read more about it here](../packages/TypeScript_ESLint.mdx#config).
88-
- `'@eslint/js'` / `eslint.configs.recommended` turns on [eslint's recommended config](https://www.npmjs.com/package/@eslint/js).
89-
- `...tseslint.configs.recommended` turns on [our recommended config](../users/Shared_Configurations.mdx#recommended).
90-
9191
## Next Steps
9292

9393
If you're having problems getting this working, please have a look at our [Troubleshooting & FAQs](../troubleshooting/faqs/General.mdx).
@@ -103,11 +103,11 @@ We recommend you consider enabling the following two configs:
103103
export default tseslint.config(
104104
eslint.configs.recommended,
105105
// Remove this line
106-
...tseslint.configs.recommended,
106+
tseslint.configs.recommended,
107107
// Add this line
108-
...tseslint.configs.strict,
108+
tseslint.configs.strict,
109109
// Add this line
110-
...tseslint.configs.stylistic,
110+
tseslint.configs.stylistic,
111111
);
112112
```
113113

docs/getting-started/Typed_Linting.mdx

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@ import tseslint from 'typescript-eslint';
2222
export default tseslint.config(
2323
eslint.configs.recommended,
2424
// Remove this line
25-
...tseslint.configs.recommended,
25+
tseslint.configs.recommended,
2626
// Added lines start
27-
...tseslint.configs.recommendedTypeChecked,
27+
tseslint.configs.recommendedTypeChecked,
2828
{
2929
languageOptions: {
3030
parserOptions: {
@@ -104,12 +104,12 @@ If you enabled the [`strict` shared config](../users/Shared_Configurations.mdx#s
104104
export default tseslint.config(
105105
eslint.configs.recommended,
106106
// Removed lines start
107-
...tseslint.configs.strict,
108-
...tseslint.configs.stylistic,
107+
tseslint.configs.strict,
108+
tseslint.configs.stylistic,
109109
// Removed lines end
110110
// Added lines start
111-
...tseslint.configs.strictTypeChecked,
112-
...tseslint.configs.stylisticTypeChecked,
111+
tseslint.configs.strictTypeChecked,
112+
tseslint.configs.stylisticTypeChecked,
113113
// Added lines end
114114
// ...
115115
);
@@ -205,8 +205,8 @@ You can combine ESLint's [overrides](https://eslint.org/docs/latest/use/configur
205205
```js title="eslint.config.mjs"
206206
export default tseslint.config(
207207
eslint.configs.recommended,
208-
...tseslint.configs.recommendedTypeChecked,
209-
...tseslint.configs.stylisticTypeChecked,
208+
tseslint.configs.recommendedTypeChecked,
209+
tseslint.configs.stylisticTypeChecked,
210210
{
211211
languageOptions: {
212212
parserOptions: {
@@ -218,7 +218,7 @@ export default tseslint.config(
218218
// Added lines start
219219
{
220220
files: ['**/*.js'],
221-
...tseslint.configs.disableTypeChecked,
221+
extends: [tseslint.configs.disableTypeChecked],
222222
},
223223
// Added lines end
224224
);

docs/packages/TypeScript_ESLint.mdx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ import tseslint from 'typescript-eslint';
5151

5252
export default tseslint.config(
5353
eslint.configs.recommended,
54-
...tseslint.configs.recommended,
54+
tseslint.configs.recommended,
5555
);
5656
```
5757

@@ -145,12 +145,12 @@ export default tseslint.config(
145145
{
146146
// disable type-aware linting on JS files
147147
files: ['**/*.js'],
148-
...tseslint.configs.disableTypeChecked,
148+
extends: [tseslint.configs.disableTypeChecked],
149149
},
150150
{
151151
// enable jest rules on test files
152152
files: ['test/**'],
153-
...jestPlugin.configs['flat/recommended'],
153+
extends: [jestPlugin.configs['flat/recommended']],
154154
},
155155
);
156156
```
@@ -172,7 +172,7 @@ import tseslint from 'typescript-eslint';
172172

173173
export default tseslint.config(
174174
eslint.configs.recommended,
175-
...tseslint.configs.recommended,
175+
tseslint.configs.recommended,
176176
{
177177
/*... */
178178
},
@@ -216,7 +216,7 @@ export default tseslint.config({
216216
files: ['**/*.ts'],
217217
extends: [
218218
eslint.configs.recommended,
219-
...tseslint.configs.recommended,
219+
tseslint.configs.recommended,
220220
],
221221
rules: {
222222
'@typescript-eslint/array-type': 'error',

docs/troubleshooting/faqs/General.mdx

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -239,18 +239,22 @@ For example, the following config enables only the recommended config's type-che
239239
<Tabs groupId="eslint-config">
240240
<TabItem value="Flat Config">
241241

242+
{/* prettier-ignore */}
242243
```js title="eslint.config.mjs"
243244
import eslint from '@eslint/js';
244245
import tseslint from 'typescript-eslint';
245246

246-
export default tseslint.config(...tseslint.configs.recommendedTypeCheckedOnly, {
247-
languageOptions: {
248-
parserOptions: {
249-
projectService: true,
250-
tsconfigRootDir: import.meta.dirname,
247+
export default tseslint.config(
248+
tseslint.configs.recommendedTypeCheckedOnly,
249+
{
250+
languageOptions: {
251+
parserOptions: {
252+
projectService: true,
253+
tsconfigRootDir: import.meta.dirname,
254+
},
251255
},
252256
},
253-
});
257+
);
254258
```
255259

256260
</TabItem>

docs/troubleshooting/typed-linting/Monorepos.mdx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ For each file being linted, the first matching project path will be used as its
5858
```js title="eslint.config.mjs"
5959
export default tseslint.config(
6060
eslint.configs.recommended,
61-
...tseslint.configs.recommendedTypeChecked,
61+
tseslint.configs.recommendedTypeChecked,
6262
{
6363
languageOptions: {
6464
parserOptions: {
@@ -110,7 +110,7 @@ Instead of globs that use `**` to recursively check all folders, prefer paths th
110110
```js title="eslint.config.mjs"
111111
export default tseslint.config(
112112
eslint.configs.recommended,
113-
...tseslint.configs.recommendedTypeChecked,
113+
tseslint.configs.recommendedTypeChecked,
114114
{
115115
languageOptions: {
116116
parserOptions: {

docs/troubleshooting/typed-linting/Performance.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ import tseslint from 'typescript-eslint';
174174

175175
export default tseslint.config(
176176
eslint.configs.recommended,
177-
...tseslint.configs.recommendedRequiringTypeChecking,
177+
tseslint.configs.recommendedRequiringTypeChecking,
178178
{
179179
languageOptions: {
180180
parserOptions: {

docs/users/Shared_Configurations.mdx

Lines changed: 31 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import tseslint from 'typescript-eslint';
2525

2626
export default tseslint.config(
2727
eslint.configs.recommended,
28-
...tseslint.configs.recommended,
28+
tseslint.configs.recommended,
2929
);
3030
```
3131

@@ -39,8 +39,8 @@ If your project does not enable [typed linting](../getting-started/Typed_Linting
3939
```js title="eslint.config.mjs"
4040
export default tseslint.config(
4141
eslint.configs.recommended,
42-
...tseslint.configs.recommended,
43-
...tseslint.configs.stylistic,
42+
tseslint.configs.recommended,
43+
tseslint.configs.stylistic,
4444
);
4545
```
4646

@@ -72,8 +72,8 @@ If your project enables [typed linting](../getting-started/Typed_Linting.mdx), w
7272
```js title="eslint.config.mjs"
7373
export default tseslint.config(
7474
eslint.configs.recommended,
75-
...tseslint.configs.recommendedTypeChecked,
76-
...tseslint.configs.stylisticTypeChecked,
75+
tseslint.configs.recommendedTypeChecked,
76+
tseslint.configs.stylisticTypeChecked,
7777
);
7878
```
7979

@@ -125,8 +125,11 @@ These rules are those whose reports are almost always for a bad practice and/or
125125
<Tabs groupId="eslint-config">
126126
<TabItem value="Flat Config">
127127

128+
{/* prettier-ignore */}
128129
```js title="eslint.config.mjs"
129-
export default tseslint.config(...tseslint.configs.recommended);
130+
export default tseslint.config(
131+
tseslint.configs.recommended,
132+
);
130133
```
131134

132135
</TabItem>
@@ -151,8 +154,11 @@ Rules newly added in this configuration are similarly useful to those in `recomm
151154
<Tabs groupId="eslint-config">
152155
<TabItem value="Flat Config">
153156

157+
{/* prettier-ignore */}
154158
```js title="eslint.config.mjs"
155-
export default tseslint.config(...tseslint.configs.recommendedTypeChecked);
159+
export default tseslint.config(
160+
tseslint.configs.recommendedTypeChecked,
161+
);
156162
```
157163

158164
</TabItem>
@@ -177,8 +183,11 @@ Rules added in `strict` are more opinionated than recommended rules and might no
177183
<Tabs groupId="eslint-config">
178184
<TabItem value="Flat Config">
179185

186+
{/* prettier-ignore */}
180187
```js title="eslint.config.mjs"
181-
export default tseslint.config(...tseslint.configs.strict);
188+
export default tseslint.config(
189+
tseslint.configs.strict,
190+
);
182191
```
183192

184193
</TabItem>
@@ -213,8 +222,11 @@ Rules newly added in this configuration are similarly useful (and opinionated) t
213222
<Tabs groupId="eslint-config">
214223
<TabItem value="Flat Config">
215224

225+
{/* prettier-ignore */}
216226
```js title="eslint.config.mjs"
217-
export default tseslint.config(...tseslint.configs.strictTypeChecked);
227+
export default tseslint.config(
228+
tseslint.configs.strictTypeChecked,
229+
);
218230
```
219231

220232
</TabItem>
@@ -249,8 +261,11 @@ These rules are generally opinionated about enforcing simpler code patterns.
249261
<Tabs groupId="eslint-config">
250262
<TabItem value="Flat Config">
251263

264+
{/* prettier-ignore */}
252265
```js title="eslint.config.mjs"
253-
export default tseslint.config(...tseslint.configs.stylistic);
266+
export default tseslint.config(
267+
tseslint.configs.stylistic,
268+
);
254269
```
255270

256271
</TabItem>
@@ -278,8 +293,11 @@ Rules newly added in this configuration are similarly opinionated to those in `s
278293
<Tabs groupId="eslint-config">
279294
<TabItem value="Flat Config">
280295

296+
{/* prettier-ignore */}
281297
```js title="eslint.config.mjs"
282-
export default tseslint.config(...tseslint.configs.stylisticTypeChecked);
298+
export default tseslint.config(
299+
tseslint.configs.stylisticTypeChecked,
300+
);
283301
```
284302

285303
</TabItem>
@@ -346,7 +364,7 @@ If you use type-aware rules from other plugins, you will need to manually disabl
346364
```js title="eslint.config.mjs"
347365
export default tseslint.config(
348366
eslint.configs.recommended,
349-
...tseslint.configs.recommendedTypeChecked,
367+
tseslint.configs.recommendedTypeChecked,
350368
{
351369
languageOptions: {
352370
parserOptions: {
@@ -358,7 +376,7 @@ export default tseslint.config(
358376
// Added lines start
359377
{
360378
files: ['**/*.js'],
361-
...tseslint.configs.disableTypeChecked,
379+
extends: [tseslint.configs.disableTypeChecked],
362380
},
363381
// Added lines end
364382
);

docs/users/What_About_Formatting.mdx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,8 @@ import tseslint from 'typescript-eslint';
5656

5757
export default tseslint.config(
5858
eslint.configs.recommended,
59-
...tseslint.configs.recommended,
60-
...someOtherConfig,
59+
tseslint.configs.recommended,
60+
someOtherConfig,
6161
// Add this line
6262
prettierConfig,
6363
);

eslint.config.mjs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -33,16 +33,15 @@ export default tseslint.config(
3333
['@typescript-eslint/internal']: tseslintInternalPlugin,
3434
['eslint-comments']: eslintCommentsPlugin,
3535
['eslint-plugin']: eslintPluginPlugin,
36-
// https://github.com/import-js/eslint-plugin-import/issues/2948
37-
['import']: fixupPluginRules(importPlugin),
36+
['import']: importPlugin,
3837
['jest']: jestPlugin,
3938
['jsdoc']: jsdocPlugin,
40-
['jsx-a11y']: jsxA11yPlugin,
39+
// @ts-expect-error -- https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/pull/1038
40+
['jsx-a11y']: jsxA11yPlugin.flatConfigs.recommended.plugins['jsx-a11y'],
4141
['perfectionist']: perfectionistPlugin,
4242
// https://github.com/facebook/react/issues/28313
43+
['react']: reactPlugin,
4344
['react-hooks']: fixupPluginRules(reactHooksPlugin),
44-
// https://github.com/jsx-eslint/eslint-plugin-react/issues/3699
45-
['react']: fixupPluginRules(reactPlugin),
4645
['regexp']: regexpPlugin,
4746
['sonarjs']: sonarjsPlugin,
4847
['unicorn']: unicornPlugin,
@@ -86,8 +85,8 @@ export default tseslint.config(
8685

8786
// extends ...
8887
eslint.configs.recommended,
89-
...tseslint.configs.strictTypeChecked,
90-
...tseslint.configs.stylisticTypeChecked,
88+
tseslint.configs.strictTypeChecked,
89+
tseslint.configs.stylisticTypeChecked,
9190
jsdocPlugin.configs['flat/recommended-typescript-error'],
9291

9392
// base config
@@ -457,7 +456,7 @@ export default tseslint.config(
457456
//
458457

459458
{
460-
extends: [...compat.config(eslintPluginPlugin.configs.recommended)],
459+
extends: [eslintPluginPlugin.configs['flat/recommended']],
461460
files: [
462461
'packages/eslint-plugin-internal/**/*.{ts,tsx,cts,mts}',
463462
'packages/eslint-plugin-tslint/**/*.{ts,tsx,cts,mts}',
@@ -563,9 +562,10 @@ export default tseslint.config(
563562

564563
{
565564
extends: [
566-
...compat.config(jsxA11yPlugin.configs.recommended),
567-
...fixupConfigRules(compat.config(reactPlugin.configs.recommended)),
568-
...fixupConfigRules(compat.config(reactHooksPlugin.configs.recommended)),
565+
jsxA11yPlugin.flatConfigs.recommended,
566+
reactPlugin.configs.flat.recommended,
567+
// https://github.com/facebook/react/pull/30774
568+
fixupConfigRules(compat.config(reactHooksPlugin.configs.recommended)),
569569
],
570570
files: ['packages/website/**/*.{ts,tsx,mts,cts,js,jsx}'],
571571
rules: {

0 commit comments

Comments
 (0)