Rework configs using tseslint InfiniteArray

Signed-off-by: Émile Ré <emile@getprobo.com>
This commit is contained in:
Émile Ré
2026-01-23 11:15:27 +04:00
parent e143477d66
commit fb521544e5
12 changed files with 94 additions and 86 deletions

View File

@@ -2,10 +2,10 @@ import { configs } from "@probo/eslint-config";
import { defineConfig } from "eslint/config"; import { defineConfig } from "eslint/config";
export default defineConfig([ export default defineConfig([
...configs.base, configs.base,
...configs.ts, configs.ts,
...configs.imports, configs.imports,
...configs.react, configs.react,
configs.stylistic,
configs.languageOptions.browser, configs.languageOptions.browser,
...configs.stylistic,
]); ]);

View File

@@ -2,10 +2,10 @@ import { configs } from "@probo/eslint-config";
import { defineConfig } from "eslint/config"; import { defineConfig } from "eslint/config";
export default defineConfig([ export default defineConfig([
...configs.base, configs.base,
...configs.ts, configs.ts,
...configs.imports, configs.imports,
...configs.react, configs.react,
configs.stylistic,
configs.languageOptions.browser, configs.languageOptions.browser,
...configs.stylistic,
]); ]);

View File

@@ -1,13 +1,15 @@
import { defineConfig } from "eslint/config"; import { defineConfig } from "eslint/config";
import { baseConfigs } from "#baseConfigs"; import { baseConfigs } from "#baseConfigs";
import { tsConfigs } from "#tsConfigs"; import { importsConfigs } from "#importsConfigs";
import { nodeLanguageOptionsConfig } from "#languageOptionsConfigs"; import { nodeLanguageOptionsConfigs } from "#languageOptionsConfigs";
import { stylisticConfigs } from "#stylisticConfigs"; import { stylisticConfigs } from "#stylisticConfigs";
import { tsConfigs } from "#tsConfigs";
export default defineConfig([ export default defineConfig([
...baseConfigs, ...baseConfigs,
...tsConfigs, ...tsConfigs,
nodeLanguageOptionsConfig, ...importsConfigs,
...stylisticConfigs, ...stylisticConfigs,
...nodeLanguageOptionsConfigs,
]); ]);

View File

@@ -13,6 +13,7 @@
"imports": { "imports": {
"#baseConfigs": "./src/baseConfigs.ts", "#baseConfigs": "./src/baseConfigs.ts",
"#tsConfigs": "./src/tsConfigs.ts", "#tsConfigs": "./src/tsConfigs.ts",
"#importsConfigs": "./src/importsConfigs.ts",
"#languageOptionsConfigs": "./src/languageOptionsConfigs.ts", "#languageOptionsConfigs": "./src/languageOptionsConfigs.ts",
"#stylisticConfigs": "./src/stylisticConfigs.ts" "#stylisticConfigs": "./src/stylisticConfigs.ts"
}, },

View File

@@ -1,7 +1,15 @@
import js from "@eslint/js"; import js from "@eslint/js";
import type { Linter } from "eslint"; import { globalIgnores } from "eslint/config";
import type { FlatConfig } from "typescript-eslint";
export const baseConfigs = [ export const baseConfigs: FlatConfig.ConfigArray = [
{ ignores: ["dist", "node_modules", "**/*.d.ts"] } satisfies Pick<Linter.Config, "ignores">, { files: ["**/*.js", "**/*.mjs", "**/*.ts", "**/*.tsx"] },
globalIgnores([
".turbo/",
"**/dist/",
"**/node_modules/",
"**/__generated__/",
"**/*.d.ts",
]),
js.configs.recommended, js.configs.recommended,
]; ];

View File

@@ -1,17 +1,10 @@
import { createTypeScriptImportResolver } from "eslint-import-resolver-typescript"; import { createTypeScriptImportResolver } from "eslint-import-resolver-typescript";
import { importX } from "eslint-plugin-import-x"; import { importX } from "eslint-plugin-import-x";
import type { FlatConfig } from "typescript-eslint";
export const importsConfigs = [ export const importsConfigs: FlatConfig.ConfigArray = [
importX.flatConfigs.recommended, importX.flatConfigs.recommended,
{ importX.flatConfigs.typescript,
...importX.flatConfigs.typescript,
settings: {
"import-x/resolver-next": createTypeScriptImportResolver({
alwaysTryTypes: true,
project: "tsconfig.json",
}),
},
},
{ {
rules: { rules: {
"import-x/order": [ "import-x/order": [
@@ -37,5 +30,11 @@ export const importsConfigs = [
}, },
], ],
}, },
settings: {
"import-x/resolver-next": createTypeScriptImportResolver({
alwaysTryTypes: true,
project: "tsconfig.json",
}),
},
}, },
]; ];

View File

@@ -1,18 +1,18 @@
import { baseConfigs } from "./baseConfigs.ts"; import { baseConfigs } from "./baseConfigs.ts";
import { browserLanguageOptionsConfig, nodeLanguageOptionsConfig } from "./languageOptionsConfigs.ts"; import { importsConfigs } from "./importsConfigs.ts";
import { tsConfigs } from "./tsConfigs.ts"; import { browserLanguageOptionsConfigs, nodeLanguageOptionsConfigs } from "./languageOptionsConfigs.ts";
import { reactConfigs } from "./reactConfigs.ts"; import { reactConfigs } from "./reactConfigs.ts";
import { stylisticConfigs } from "./stylisticConfigs.ts"; import { stylisticConfigs } from "./stylisticConfigs.ts";
import { importsConfigs } from "./importsConfigs.ts"; import { tsConfigs } from "./tsConfigs.ts";
export const configs = { export const configs = {
base: baseConfigs, base: baseConfigs,
imports: importsConfigs, imports: importsConfigs,
ts: tsConfigs, ts: tsConfigs,
languageOptions: {
browser: browserLanguageOptionsConfig,
node: nodeLanguageOptionsConfig,
},
react: reactConfigs, react: reactConfigs,
stylistic: stylisticConfigs, stylistic: stylisticConfigs,
languageOptions: {
browser: browserLanguageOptionsConfigs,
node: nodeLanguageOptionsConfigs,
},
}; };

View File

@@ -1,38 +1,42 @@
import type { Linter } from "eslint"; import globals from "globals";
import * as globals from "globals"; import type { FlatConfig } from "typescript-eslint";
export const browserLanguageOptionsConfig = { export const browserLanguageOptionsConfigs: FlatConfig.ConfigArray = [
languageOptions: { {
// Same as the ones we use in our tsconfig compilerOptions.lib for browser languageOptions: {
ecmaVersion: 2022, // Same as the ones we use in our tsconfig compilerOptions.lib for browser
globals: { ecmaVersion: 2022,
...globals.browser, globals: {
...globals.es2022, ...globals.browser,
}, ...globals.es2022,
sourceType: "module", },
parserOptions: { sourceType: "module",
projectService: true, parserOptions: {
ecmaFeatures: { projectService: true,
impliedStrict: true, ecmaFeatures: {
impliedStrict: true,
},
}, },
}, },
}, },
} satisfies Pick<Linter.Config, "languageOptions">; ];
export const nodeLanguageOptionsConfig = { export const nodeLanguageOptionsConfigs: FlatConfig.ConfigArray = [
languageOptions: { {
// Same as the ones we use in our tsconfig compilerOptions.lib for node languageOptions: {
ecmaVersion: 2023, // Same as the ones we use in our tsconfig compilerOptions.lib for node
globals: { ecmaVersion: 2023,
...globals.node, globals: {
...globals.es2023, ...globals.node,
}, ...globals.es2023,
sourceType: "module", },
parserOptions: { sourceType: "module",
projectService: true, parserOptions: {
ecmaFeatures: { projectService: true,
impliedStrict: true, ecmaFeatures: {
impliedStrict: true,
},
}, },
}, },
}, },
} satisfies Pick<Linter.Config, "languageOptions">; ];

View File

@@ -1,15 +1,16 @@
import react from "eslint-plugin-react"; import react from "eslint-plugin-react";
import * as reactHooks from "eslint-plugin-react-hooks"; import reactHooks from "eslint-plugin-react-hooks";
import type { FlatConfig } from "typescript-eslint";
export const reactConfigs = [ export const reactConfigs: FlatConfig.ConfigArray = [
{ {
...react.configs.flat.recommended, ...react.configs.flat.recommended,
...react.configs.flat["jsx-runtime"], ...react.configs.flat["jsx-runtime"],
...reactHooks.configs.flat.recommended,
settings: { settings: {
react: { react: {
version: "detect", version: "detect",
}, },
}, },
}, },
reactHooks.configs.flat.recommended,
]; ];

View File

@@ -1,7 +1,7 @@
import stylistic from "@stylistic/eslint-plugin"; import stylistic from "@stylistic/eslint-plugin";
import type { Linter } from "eslint"; import type { FlatConfig } from "typescript-eslint";
export const stylisticConfigs = [ export const stylisticConfigs: FlatConfig.ConfigArray = [
stylistic.configs.customize({ stylistic.configs.customize({
arrowParens: false, // Will actually set it to "as-needed" arrowParens: false, // Will actually set it to "as-needed"
blockSpacing: true, blockSpacing: true,
@@ -28,5 +28,5 @@ export const stylisticConfigs = [
}, },
], ],
}, },
} satisfies Linter.Config, },
]; ];

View File

@@ -1,10 +1,8 @@
import type { Linter } from "eslint"; import { configs, type FlatConfig } from "typescript-eslint";
import { configs } from "typescript-eslint";
export const tsConfigs = [ export const tsConfigs: FlatConfig.ConfigArray = [
...configs.recommendedTypeChecked, ...configs.recommendedTypeChecked,
{ {
files: ["**/*.{ts,tsx}"],
rules: { rules: {
"@typescript-eslint/no-unused-vars": [ "@typescript-eslint/no-unused-vars": [
"error", "error",
@@ -19,10 +17,5 @@ export const tsConfigs = [
}, },
], ],
}, },
languageOptions: { },
parserOptions: {
projectService: true,
},
},
} satisfies Linter.Config,
]; ];

View File

@@ -2,19 +2,19 @@ import { configs } from "@probo/eslint-config";
import { defineConfig } from "eslint/config"; import { defineConfig } from "eslint/config";
export default defineConfig([ export default defineConfig([
...configs.base, configs.base,
...configs.ts, configs.ts,
...configs.imports, configs.imports,
...configs.react, configs.react,
...configs.stylistic, configs.stylistic,
{ {
extends: [configs.languageOptions.browser],
ignores: ["./tailwind.config.js"], ignores: ["./tailwind.config.js"],
...configs.languageOptions.browser,
}, },
{ {
extends: [configs.languageOptions.node],
files: ["./tailwind.config.js"], files: ["./tailwind.config.js"],
languageOptions: { languageOptions: {
...configs.languageOptions.node.languageOptions,
sourceType: "commonjs", sourceType: "commonjs",
}, },
}, },