1- import { FlatCompat } from '@eslint/eslintrc' ;
21import js from '@eslint/js' ;
3- import tsEslintPlugin from '@typescript-eslint/eslint-plugin' ;
4- import { createRequire } from 'node:module' ;
5- import path from 'node:path' ;
6- import { fileURLToPath } from 'node:url' ;
2+ import { defineConfig } from 'eslint/config' ;
3+ import prettier from 'eslint-config-prettier' ;
4+ import jest from 'eslint-plugin-jest' ;
5+ import react from 'eslint-plugin-react' ;
6+ import reactHooks from 'eslint-plugin-react-hooks' ;
7+ import globals from 'globals' ;
8+ import tseslint from 'typescript-eslint' ;
79
8- const __filename = fileURLToPath ( import . meta. url ) ;
9- const __dirname = path . dirname ( __filename ) ;
10- const require = createRequire ( import . meta. url ) ;
11-
12- const compat = new FlatCompat ( {
13- baseDirectory : __dirname ,
14- recommendedConfig : js . configs . recommended ,
15- allConfig : js . configs . all ,
16- } ) ;
17-
18- const recommendedTsRulesConfig = tsEslintPlugin . configs . recommended ;
19- const recommendedTsRulesObject = Array . isArray ( recommendedTsRulesConfig )
20- ? recommendedTsRulesConfig . reduce (
21- ( rules , config ) => ( { ...rules , ...( config . rules || { } ) } ) ,
22- { } ,
23- )
24- : recommendedTsRulesConfig ?. rules || { } ;
25- const recommendedTsRules = new Set ( Object . keys ( recommendedTsRulesObject ) ) ;
26- const noopRule = {
27- meta : { type : 'problem' , docs : { } , schema : [ ] } ,
28- create : ( ) => ( { } ) ,
29- } ;
30-
31- function normalizeConfig ( config ) {
32- const next = { ...config } ;
33-
34- if ( next . plugins ?. [ '@typescript-eslint' ] ) {
35- next . plugins = { ...next . plugins } ;
36- delete next . plugins [ '@typescript-eslint' ] ;
37- }
38-
39- if ( next . rules ) {
40- next . rules = Object . fromEntries (
41- Object . entries ( next . rules ) . filter ( ( [ ruleName ] ) => {
42- if ( ruleName . startsWith ( '@babel/' ) ) {
43- return false ;
44- }
45- if ( ! ruleName . startsWith ( '@typescript-eslint/' ) ) {
46- return true ;
47- }
48- return recommendedTsRules . has ( ruleName ) ;
49- } ) ,
50- ) ;
51- }
52-
53- return next ;
54- }
55-
56- export default [
10+ export default defineConfig ( [
11+ {
12+ plugins : {
13+ '@typescript-eslint' : tseslint . plugin ,
14+ } ,
15+ } ,
16+ {
17+ linterOptions : {
18+ reportUnusedDisableDirectives : 'off' ,
19+ } ,
20+ } ,
5721 {
5822 ignores : [
5923 'node_modules/' ,
@@ -65,27 +29,83 @@ export default [
6529 '.dumi/' ,
6630 '.doc/' ,
6731 '.vercel/' ,
68- '.eslintrc.js' ,
6932 'src/index.d.ts' ,
7033 ] ,
7134 } ,
7235 {
36+ files : [ '**/*.{js,jsx,ts,tsx}' ] ,
37+ extends : [
38+ js . configs . recommended ,
39+ react . configs . flat . recommended ,
40+ react . configs . flat [ 'jsx-runtime' ] ,
41+ prettier ,
42+ ] ,
7343 plugins : {
74- '@typescript-eslint' : {
75- ...tsEslintPlugin ,
76- rules : {
77- ...tsEslintPlugin . rules ,
78- 'consistent-type-exports' : noopRule ,
79- } ,
44+ 'react-hooks' : reactHooks ,
45+ } ,
46+ languageOptions : {
47+ globals : {
48+ ...globals . browser ,
49+ ...globals . node ,
50+ } ,
51+ } ,
52+ settings : {
53+ react : {
54+ version : 'detect' ,
8055 } ,
8156 } ,
57+ rules : {
58+ 'no-async-promise-executor' : 'off' ,
59+ 'no-empty-pattern' : 'off' ,
60+ 'no-irregular-whitespace' : 'off' ,
61+ 'no-prototype-builtins' : 'off' ,
62+ 'no-useless-escape' : 'off' ,
63+ 'no-extra-boolean-cast' : 'off' ,
64+ 'no-undef' : 'off' ,
65+ 'no-unused-vars' : 'off' ,
66+ 'react/no-find-dom-node' : 'off' ,
67+ 'react/display-name' : 'off' ,
68+ 'react/no-unknown-property' : 'off' ,
69+ 'react/prop-types' : 'off' ,
70+ 'react-hooks/exhaustive-deps' : 'warn' ,
71+ 'react-hooks/rules-of-hooks' : 'error' ,
72+ } ,
8273 } ,
83- ...compat . config ( require ( './.eslintrc.js' ) ) . map ( normalizeConfig ) ,
8474 {
75+ files : [ '**/*.{ts,tsx}' ] ,
76+ extends : [ ...tseslint . configs . recommended ] ,
8577 rules : {
78+ '@typescript-eslint/ban-ts-comment' : 'off' ,
8679 '@typescript-eslint/no-empty-object-type' : 'off' ,
80+ '@typescript-eslint/no-explicit-any' : 'off' ,
8781 '@typescript-eslint/no-unsafe-function-type' : 'off' ,
82+ '@typescript-eslint/no-unnecessary-type-constraint' : 'off' ,
8883 '@typescript-eslint/no-unused-vars' : 'off' ,
8984 } ,
9085 } ,
91- ] ;
86+ {
87+ files : [ 'src/**/*.{ts,tsx}' ] ,
88+ languageOptions : {
89+ parserOptions : {
90+ projectService : true ,
91+ tsconfigRootDir : import . meta. dirname ,
92+ } ,
93+ } ,
94+ } ,
95+ {
96+ files : [ 'tests/**/*.{js,jsx,ts,tsx}' , '**/*.{test,spec}.{js,jsx,ts,tsx}' ] ,
97+ extends : [ jest . configs [ 'flat/recommended' ] ] ,
98+ rules : {
99+ 'jest/no-disabled-tests' : 'off' ,
100+ 'jest/no-done-callback' : 'off' ,
101+ 'jest/no-identical-title' : 'off' ,
102+ 'jest/expect-expect' : 'off' ,
103+ 'jest/no-alias-methods' : 'off' ,
104+ 'jest/no-conditional-expect' : 'off' ,
105+ 'jest/no-export' : 'off' ,
106+ 'jest/no-standalone-expect' : 'off' ,
107+ 'jest/valid-expect' : 'off' ,
108+ 'jest/valid-title' : 'off' ,
109+ } ,
110+ } ,
111+ ] ) ;
0 commit comments