Skip to content

Commit 604db02

Browse files
committed
* migrate to eslint v9 flat config @ eslint.config.js
@ fe
1 parent 23fc546 commit 604db02

File tree

1 file changed

+70
-63
lines changed

1 file changed

+70
-63
lines changed

fe/eslint.config.js

Lines changed: 70 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
const eslintPluginUnicorn = { // as of [email protected]
1+
const rules = [{ // as of [email protected]
22
optout: {
33
'unicorn/no-null': 'off',
44
'unicorn/no-array-callback-reference': 'off',
@@ -14,8 +14,7 @@ const eslintPluginUnicorn = { // as of [email protected]
1414
'unicorn/numeric-separators-style': ['error', { onlyIfContainsSeparator: true }],
1515
'unicorn/switch-case-braces': ['error', 'avoid'],
1616
},
17-
};
18-
const eslintPluginImport = { // as of [email protected]
17+
}, { // as of [email protected]
1918
optout: {
2019
'import-x/namespace': 'off', // https://github.com/import-js/eslint-plugin-import/issues/2340
2120
},
@@ -50,15 +49,13 @@ const eslintPluginImport = { // as of [email protected]
5049
warnOnUnassignedImports: true,
5150
}],
5251
},
53-
};
54-
const stylisticPlus = { // as of @stylistic/[email protected]
52+
}, { // as of @stylistic/[email protected]
5553
optin: {
5654
// '@stylistic/indent-binary-ops': ['error', 4],
5755
'@stylistic/type-generic-spacing': 'error',
5856
'@stylistic/type-named-tuple-spacing': 'error',
5957
},
60-
};
61-
const stylisticMigrate = { // as of @stylistic/[email protected]
58+
}, { // as of @stylistic/[email protected]
6259
optin: {
6360
'@stylistic/dot-location': ['error', 'property'],
6461
'@stylistic/no-floating-decimal': 'error',
@@ -164,8 +161,7 @@ const stylisticMigrate = { // as of @stylistic/[email protected]
164161
// https://github.com/eslint-stylistic/eslint-stylistic/issues/249
165162
// '@stylistic/type-annotation-spacing': 'error',
166163
},
167-
};
168-
const eslint = { // as of [email protected]
164+
}, { // as of [email protected]
169165
optout: {
170166
camelcase: 'off',
171167
},
@@ -261,8 +257,7 @@ const eslint = { // as of [email protected]
261257
'no-empty-static-block': 'error',
262258
'no-new-native-nonconstructor': 'error',
263259
},
264-
};
265-
const typescriptESLint = { // as of @typescript[email protected]
260+
}, { // as of @typescript[email protected]
266261
override: {
267262
'no-empty-function': 'off',
268263
'@typescript-eslint/no-empty-function': 'error',
@@ -389,8 +384,7 @@ const typescriptESLint = { // as of @[email protected]
389384
'@typescript-eslint/no-unsafe-unary-minus': 'error',
390385
'@typescript-eslint/parameter-properties': ['error', { prefer: 'parameter-property' }],
391386
},
392-
};
393-
const eslintPluginVue = { // as of [email protected]
387+
}, { // as of [email protected]
394388
optout: {
395389
'vue/max-attributes-per-line': 'off',
396390
'vue/singleline-html-element-content-newline': 'off',
@@ -525,29 +519,67 @@ const eslintPluginVue = { // as of [email protected]
525519
'vue/no-unused-emit-declarations': 'error',
526520
'vue/no-ref-object-reactivity-loss': 'error',
527521
},
528-
};
522+
}];
529523

530-
// eslint-disable-next-line no-undef
531-
module.exports = {
532-
root: true,
533-
reportUnusedDisableDirectives: true,
534-
parserOptions: {
535-
project: ['./tsconfig.json', './tsconfig.node.json'],
536-
// eslint-disable-next-line no-undef
537-
tsconfigRootDir: __dirname,
524+
import viteConfig from './vite.config.ts';
525+
import { fixupConfigRules } from '@eslint/compat';
526+
import { FlatCompat } from '@eslint/eslintrc';
527+
import eslintJs from '@eslint/js';
528+
import * as vueESLintParser from 'vue-eslint-parser';
529+
import pluginVue from 'eslint-plugin-vue'
530+
import vueESLintConfigTypescriptRecommendedExtends from '@vue/eslint-config-typescript/recommended.js'
531+
import * as typescriptESLintParserForExtraFiles from 'typescript-eslint-parser-for-extra-files';
532+
import pluginStylistic from '@stylistic/eslint-plugin';
533+
import stylisticMigrate from '@stylistic/eslint-plugin-migrate';
534+
import pluginImportX from 'eslint-plugin-import-x';
535+
import pluginUnicorn from 'eslint-plugin-unicorn';
536+
import * as _ from 'lodash-es';
537+
538+
// https://github.com/eslint/eslint/issues/18093
539+
// https://github.com/eslint/eslint/issues/18391
540+
const compat = new FlatCompat();
541+
542+
export default [
543+
eslintJs.configs.recommended,
544+
...pluginVue.configs['flat/recommended'],
545+
...compat.config(vueESLintConfigTypescriptRecommendedExtends), // https://github.com/vuejs/eslint-config-typescript/issues/76#issuecomment-2051234597
546+
...compat.extends( // https://github.com/ota-meshi/typescript-eslint-parser-for-extra-files/issues/95#issuecomment-2148604881
547+
'plugin:@typescript-eslint/strict-type-checked',
548+
'plugin:@typescript-eslint/stylistic-type-checked',
549+
),
550+
...compat.config(pluginImportX.configs.recommended), // https://github.com/un-ts/eslint-plugin-import-x/issues/29#issuecomment-2148843214
551+
...compat.config(pluginImportX.configs.typescript),
552+
...fixupConfigRules(...compat.extends(
553+
'plugin:@tanstack/eslint-plugin-query/recommended', // https://github.com/TanStack/query/pull/7253
554+
)),
555+
pluginUnicorn.configs['flat/recommended'],
556+
{ linterOptions: { reportUnusedDisableDirectives: 'error' } },
557+
{
558+
languageOptions: {
559+
parserOptions: {
560+
project: ['./tsconfig.json', './tsconfig.node.json'],
561+
tsconfigRootDir: import.meta.dirname,
562+
},
563+
},
564+
plugins: { '@stylistic': pluginStylistic },
565+
566+
// https://stackoverflow.com/questions/30221286/how-to-convert-an-array-of-objects-to-an-object-in-lodash/36692117#36692117
567+
rules: Object.assign({}, ..._.flatten(_.map(rules, Object.values))),
538568
},
539-
overrides: [{ // https://stackoverflow.com/questions/57107800/eslint-disable-extends-in-override
540-
files: '*.ts',
541-
parser: 'typescript-eslint-parser-for-extra-files',
569+
{
570+
files: ['**/*.ts'],
571+
languageOptions: { parser: typescriptESLintParserForExtraFiles },
542572
settings: { 'import-x/resolver': { typescript: true } },
543-
}, {
544-
files: '*.vue',
545-
parser: 'vue-eslint-parser',
546-
parserOptions: {
547-
parser: 'typescript-eslint-parser-for-extra-files',
548-
project: ['./tsconfig.json', './tsconfig.node.json'],
549-
// eslint-disable-next-line no-undef
550-
tsconfigRootDir: __dirname,
573+
},
574+
{
575+
files: ['**/*.vue'],
576+
languageOptions: {
577+
parser: vueESLintParser,
578+
parserOptions: {
579+
parser: typescriptESLintParserForExtraFiles,
580+
project: ['./tsconfig.json', './tsconfig.node.json'],
581+
tsconfigRootDir: import.meta.dirname,
582+
},
551583
},
552584
settings: {
553585
'import-x/resolver': {
@@ -557,40 +589,15 @@ module.exports = {
557589
vite: { viteConfig: import('./vite.config') },
558590
},
559591
},
560-
}, {
561-
files: '.eslintrc.cjs',
562-
plugins: ['@stylistic', '@stylistic/migrate'],
592+
},
593+
{
594+
files: ['eslint.config.js'],
595+
plugins: { '@stylistic': pluginStylistic, '@stylistic/migrate': stylisticMigrate },
563596
rules: {
564597
'@stylistic/migrate/migrate-js': 'error',
565598
'@stylistic/migrate/migrate-ts': 'error',
566599
'@stylistic/comma-dangle': ['error', 'always-multiline'],
567600
'@typescript-eslint/naming-convention': 'off',
568601
},
569-
}],
570-
plugins: ['@stylistic'],
571-
extends: [
572-
'eslint:recommended',
573-
'plugin:vue/vue3-recommended',
574-
'@vue/typescript/recommended',
575-
'plugin:@typescript-eslint/strict-type-checked',
576-
'plugin:@typescript-eslint/stylistic-type-checked',
577-
'plugin:import-x/recommended',
578-
'plugin:import-x/typescript',
579-
'plugin:unicorn/recommended',
580-
'plugin:@tanstack/eslint-plugin-query/recommended',
581-
],
582-
rules: {
583-
...eslintPluginUnicorn.optout,
584-
...eslintPluginUnicorn.optin,
585-
...eslintPluginImport.optout,
586-
...eslintPluginImport.optin,
587-
...stylisticPlus.optin,
588-
...stylisticMigrate.optin,
589-
...eslint.optout,
590-
...eslint.optin,
591-
...typescriptESLint.override,
592-
...typescriptESLint.optin,
593-
...eslintPluginVue.optout,
594-
...eslintPluginVue.optin,
595602
},
596-
};
603+
];

0 commit comments

Comments
 (0)