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 ( ( rules , config ) => ( { ...rules , ...( config . rules || { } ) } ) , { } )
21- : recommendedTsRulesConfig ?. rules || { } ;
22- const recommendedTsRules = new Set ( Object . keys ( recommendedTsRulesObject ) ) ;
23- const noopRule = {
24- meta : { type : 'problem' , docs : { } , schema : [ ] } ,
25- create : ( ) => ( { } ) ,
26- } ;
27-
28- function normalizeConfig ( config ) {
29- const next = { ...config } ;
30-
31- if ( next . plugins ?. [ '@typescript-eslint' ] ) {
32- next . plugins = { ...next . plugins } ;
33- delete next . plugins [ '@typescript-eslint' ] ;
34- }
35-
36- if ( next . rules ) {
37- next . rules = Object . fromEntries (
38- Object . entries ( next . rules ) . filter ( ( [ ruleName ] ) => {
39- if ( ruleName . startsWith ( '@babel/' ) ) {
40- return false ;
41- }
42- if ( ! ruleName . startsWith ( '@typescript-eslint/' ) ) {
43- return true ;
44- }
45- return recommendedTsRules . has ( ruleName ) ;
46- } ) ,
47- ) ;
48- }
49-
50- return next ;
51- }
52-
53- export default [
10+ export default defineConfig ( [
11+ {
12+ plugins : {
13+ '@typescript-eslint' : tseslint . plugin ,
14+ } ,
15+ } ,
16+ {
17+ linterOptions : {
18+ reportUnusedDisableDirectives : 'off' ,
19+ } ,
20+ } ,
5421 {
5522 ignores : [
5623 'node_modules/' ,
@@ -62,33 +29,83 @@ export default [
6229 '.dumi/' ,
6330 '.doc/' ,
6431 '.vercel/' ,
65- '.eslintrc.js' ,
6632 'src/index.d.ts' ,
6733 ] ,
6834 } ,
6935 {
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+ ] ,
7043 plugins : {
71- '@typescript-eslint' : {
72- ...tsEslintPlugin ,
73- rules : {
74- ...tsEslintPlugin . rules ,
75- 'consistent-type-exports' : noopRule ,
76- } ,
44+ 'react-hooks' : reactHooks ,
45+ } ,
46+ languageOptions : {
47+ globals : {
48+ ...globals . browser ,
49+ ...globals . node ,
50+ } ,
51+ } ,
52+ settings : {
53+ react : {
54+ version : 'detect' ,
7755 } ,
7856 } ,
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+ } ,
7973 } ,
80- ...compat . config ( require ( './.eslintrc.js' ) ) . map ( normalizeConfig ) ,
8174 {
75+ files : [ '**/*.{ts,tsx}' ] ,
76+ extends : [ ...tseslint . configs . recommended ] ,
8277 rules : {
78+ '@typescript-eslint/ban-ts-comment' : 'off' ,
8379 '@typescript-eslint/no-empty-object-type' : 'off' ,
80+ '@typescript-eslint/no-explicit-any' : 'off' ,
8481 '@typescript-eslint/no-unsafe-function-type' : 'off' ,
85- '@typescript-eslint/no-unused-vars' : [
86- 'warn' ,
87- {
88- argsIgnorePattern : '^_' ,
89- varsIgnorePattern : '^_' ,
90- } ,
91- ] ,
82+ '@typescript-eslint/no-unnecessary-type-constraint' : 'off' ,
83+ '@typescript-eslint/no-unused-vars' : 'off' ,
84+ } ,
85+ } ,
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' ,
92109 } ,
93110 } ,
94- ] ;
111+ ] ) ;
0 commit comments