|
1 | 1 | import { readdirSync } from 'fs'; |
2 | 2 | import { join, parse } from 'path'; |
3 | 3 | import { TSESLint, TSESTree } from '@typescript-eslint/utils'; |
| 4 | +import { |
| 5 | + name as packageName, |
| 6 | + version as packageVersion, |
| 7 | +} from '../package.json'; |
4 | 8 |
|
5 | 9 | type RuleModule = TSESLint.RuleModule<string, unknown[]> & { |
6 | 10 | meta: Required<Pick<TSESLint.RuleMetaData<string>, 'docs'>>; |
@@ -36,47 +40,49 @@ const importDefault = (moduleName: string) => |
36 | 40 | const rulesDir = join(__dirname, 'rules'); |
37 | 41 | const excludedFiles = ['__tests__', 'utils']; |
38 | 42 |
|
39 | | -const rules = readdirSync(rulesDir) |
40 | | - .map(rule => parse(rule).name) |
41 | | - .filter(rule => !excludedFiles.includes(rule)) |
42 | | - .reduce<Record<string, RuleModule>>( |
43 | | - (acc, curr) => ({ |
44 | | - ...acc, |
45 | | - [curr]: importDefault(join(rulesDir, curr)) as RuleModule, |
46 | | - }), |
47 | | - {}, |
48 | | - ); |
| 43 | +const rules = Object.fromEntries( |
| 44 | + readdirSync(rulesDir) |
| 45 | + .map(rule => parse(rule).name) |
| 46 | + .filter(rule => !excludedFiles.includes(rule)) |
| 47 | + .map(rule => [rule, importDefault(join(rulesDir, rule)) as RuleModule]), |
| 48 | +); |
49 | 49 |
|
50 | | -const recommendedRules = Object.entries(rules) |
51 | | - .filter(([, rule]) => rule.meta.docs.recommended) |
52 | | - .reduce( |
53 | | - /* istanbul ignore next */ |
54 | | - (acc, [name, rule]) => ({ |
55 | | - ...acc, |
56 | | - [`jest-extended/${name}`]: rule.meta.docs.recommended, |
57 | | - }), |
58 | | - {}, |
59 | | - ); |
| 50 | +const recommendedRules = {} satisfies Record<string, TSESLint.Linter.RuleLevel>; |
60 | 51 |
|
61 | | -const allRules = Object.entries(rules) |
62 | | - .filter(([, rule]) => !rule.meta.deprecated) |
63 | | - .reduce( |
64 | | - (acc, [name]) => ({ |
65 | | - ...acc, |
66 | | - [`jest-extended/${name}`]: 'error', |
67 | | - }), |
68 | | - {}, |
69 | | - ); |
| 52 | +const allRules = Object.fromEntries<TSESLint.Linter.RuleLevel>( |
| 53 | + Object.entries(rules) |
| 54 | + .filter(([, rule]) => !rule.meta.deprecated) |
| 55 | + .map(([name]) => [`jest-extended/${name}`, 'error']), |
| 56 | +); |
70 | 57 |
|
71 | | -const createConfig = (rules: Record<string, TSESLint.Linter.RuleLevel>) => ({ |
| 58 | +const plugin = { |
| 59 | + meta: { name: packageName, version: packageVersion }, |
| 60 | + // ugly cast for now to keep TypeScript happy since |
| 61 | + // we don't have types for flat config yet |
| 62 | + configs: {} as Record< |
| 63 | + 'all' | 'recommended' | 'flat/all' | 'flat/recommended', |
| 64 | + Pick<Required<TSESLint.Linter.Config>, 'rules'> |
| 65 | + >, |
| 66 | + rules, |
| 67 | +}; |
| 68 | + |
| 69 | +const createRCConfig = (rules: Record<string, TSESLint.Linter.RuleLevel>) => ({ |
72 | 70 | plugins: ['jest-extended'], |
73 | 71 | rules, |
74 | 72 | }); |
75 | 73 |
|
76 | | -export = { |
77 | | - configs: { |
78 | | - all: createConfig(allRules), |
79 | | - recommended: createConfig(recommendedRules), |
80 | | - }, |
| 74 | +const createFlatConfig = ( |
| 75 | + rules: Record<string, TSESLint.Linter.RuleLevel>, |
| 76 | +) => ({ |
| 77 | + plugins: { 'jest-extended': plugin }, |
81 | 78 | rules, |
| 79 | +}); |
| 80 | + |
| 81 | +plugin.configs = { |
| 82 | + all: createRCConfig(allRules), |
| 83 | + recommended: createRCConfig(recommendedRules), |
| 84 | + 'flat/all': createFlatConfig(allRules), |
| 85 | + 'flat/recommended': createFlatConfig(recommendedRules), |
82 | 86 | }; |
| 87 | + |
| 88 | +export = plugin; |
0 commit comments