|
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