Skip to content

Commit 94fa724

Browse files
authored
chore: build recommended ruleset based on rules meta doc property (#615)
1 parent 6b86aa4 commit 94fa724

13 files changed

+46
-51
lines changed

src/index.ts

+30-37
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
11
import { readdirSync } from 'fs';
22
import { join, parse } from 'path';
3+
import { TSESLint } from '@typescript-eslint/experimental-utils';
34
import globals from './globals.json';
45
import * as snapshotProcessor from './processors/snapshot-processor';
56

7+
type RuleModule = TSESLint.RuleModule<string, unknown[]> & {
8+
meta: Required<Pick<TSESLint.RuleMetaData<string>, 'docs'>>;
9+
};
10+
611
// can be removed once we've on v3: https://github.com/typescript-eslint/typescript-eslint/issues/2060
712
declare module '@typescript-eslint/experimental-utils/dist/ts-eslint/Rule' {
813
export interface RuleMetaDataDocs {
@@ -25,50 +30,38 @@ const excludedFiles = ['__tests__', 'utils'];
2530
const rules = readdirSync(rulesDir)
2631
.map(rule => parse(rule).name)
2732
.filter(rule => !excludedFiles.includes(rule))
33+
.reduce<Record<string, RuleModule>>(
34+
(acc, curr) => ({
35+
...acc,
36+
[curr]: importDefault(join(rulesDir, curr)) as RuleModule,
37+
}),
38+
{},
39+
);
40+
41+
const recommendedRules = Object.entries(rules)
42+
.filter(([, rule]) => rule.meta.docs.recommended)
2843
.reduce(
29-
(acc, curr) =>
30-
Object.assign(acc, { [curr]: importDefault(join(rulesDir, curr)) }),
44+
(acc, [name, rule]) => ({
45+
...acc,
46+
[`jest/${name}`]: rule.meta.docs.recommended,
47+
}),
3148
{},
3249
);
3350

34-
const allRules = Object.keys(rules).reduce<Record<string, string>>(
35-
(rules, key) => ({ ...rules, [`jest/${key}`]: 'error' }),
36-
{},
37-
);
51+
const allRules = Object.keys(rules).reduce<
52+
Record<string, TSESLint.Linter.RuleLevel>
53+
>((rules, key) => ({ ...rules, [`jest/${key}`]: 'error' }), {});
54+
55+
const createConfig = (rules: Record<string, TSESLint.Linter.RuleLevel>) => ({
56+
plugins: ['jest'],
57+
env: { 'jest/globals': true },
58+
rules,
59+
});
3860

3961
export = {
4062
configs: {
41-
all: {
42-
plugins: ['jest'],
43-
env: {
44-
'jest/globals': true,
45-
},
46-
rules: allRules,
47-
},
48-
recommended: {
49-
plugins: ['jest'],
50-
env: {
51-
'jest/globals': true,
52-
},
53-
rules: {
54-
'jest/expect-expect': 'warn',
55-
'jest/no-commented-out-tests': 'warn',
56-
'jest/no-disabled-tests': 'warn',
57-
'jest/no-export': 'error',
58-
'jest/no-focused-tests': 'error',
59-
'jest/no-identical-title': 'error',
60-
'jest/no-jest-import': 'error',
61-
'jest/no-mocks-import': 'error',
62-
'jest/no-jasmine-globals': 'warn',
63-
'jest/no-standalone-expect': 'error',
64-
'jest/no-test-callback': 'error',
65-
'jest/no-test-prefixes': 'error',
66-
'jest/no-try-expect': 'error',
67-
'jest/valid-describe': 'error',
68-
'jest/valid-expect': 'error',
69-
'jest/valid-expect-in-promise': 'error',
70-
},
71-
},
63+
all: createConfig(allRules),
64+
recommended: createConfig(recommendedRules),
7265
style: {
7366
plugins: ['jest'],
7467
rules: {

src/rules/expect-expect.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ export default createRule<
4949
docs: {
5050
category: 'Best Practices',
5151
description: 'Enforce assertion to be made in a test body',
52-
recommended: false,
52+
recommended: 'warn',
5353
},
5454
messages: {
5555
noAssertions: 'Test has no assertions',

src/rules/no-alias-methods.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ export default createRule({
66
docs: {
77
category: 'Best Practices',
88
description: 'Disallow alias methods',
9-
recommended: 'warn',
9+
recommended: false,
1010
},
1111
messages: {
1212
replaceAlias: `Replace {{ alias }}() with its canonical name of {{ canonical }}()`,

src/rules/no-commented-out-tests.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ export default createRule({
1313
docs: {
1414
category: 'Best Practices',
1515
description: 'Disallow commented out tests',
16-
recommended: false,
16+
recommended: 'warn',
1717
},
1818
messages: {
1919
commentedTests: 'Some tests seem to be commented',

src/rules/no-disabled-tests.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ export default createRule({
66
docs: {
77
category: 'Best Practices',
88
description: 'Disallow disabled tests',
9-
recommended: false,
9+
recommended: 'warn',
1010
},
1111
messages: {
1212
missingFunction: 'Test is missing function argument',

src/rules/no-export.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ export default createRule({
1010
docs: {
1111
category: 'Best Practices',
1212
description: 'Prevent exporting from test files',
13-
recommended: false,
13+
recommended: 'error',
1414
},
1515
messages: {
1616
unexpectedExport: `Do not export from a test file.`,

src/rules/no-focused-tests.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ export default createRule({
4848
docs: {
4949
category: 'Best Practices',
5050
description: 'Disallow focused tests',
51-
recommended: false,
51+
recommended: 'error',
5252
},
5353
messages: {
5454
focusedTest: 'Unexpected focused test.',

src/rules/no-jasmine-globals.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ export default createRule({
1212
docs: {
1313
category: 'Best Practices',
1414
description: 'Disallow Jasmine globals',
15-
recommended: 'error',
15+
recommended: 'warn',
1616
},
1717
messages: {
1818
illegalGlobal:

src/rules/no-standalone-expect.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ export default createRule<
6666
docs: {
6767
category: 'Best Practices',
6868
description: 'Prevents expects that are outside of an it or test block.',
69-
recommended: false,
69+
recommended: 'error',
7070
},
7171
messages: {
7272
unexpectedExpect: 'Expect must be inside of a test block.',

src/rules/no-test-callback.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ export default createRule({
77
docs: {
88
category: 'Best Practices',
99
description: 'Avoid using a callback in asynchronous tests',
10-
recommended: false,
10+
recommended: 'error',
1111
suggestion: true,
1212
},
1313
messages: {

src/rules/no-try-expect.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ export default createRule({
1212
docs: {
1313
description: 'Prefer using toThrow for exception tests',
1414
category: 'Best Practices',
15-
recommended: false,
15+
recommended: 'error',
1616
},
1717
deprecated: true,
1818
replacedBy: ['no-conditional-expect'],

src/rules/valid-describe.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ export default createRule({
2929
docs: {
3030
category: 'Possible Errors',
3131
description: 'Enforce valid `describe()` callback',
32-
recommended: 'warn',
32+
recommended: 'error',
3333
},
3434
messages: {
3535
nameAndCallback: 'Describe requires name and callback arguments',

tools/generate-rules-table.ts

+5-3
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@ interface RuleDetails {
1414
fixable: FixType | false;
1515
}
1616

17-
type RuleModule = TSESLint.RuleModule<string, unknown[]>;
17+
type RuleModule = TSESLint.RuleModule<string, unknown[]> & {
18+
meta: Required<Pick<TSESLint.RuleMetaData<string>, 'docs'>>;
19+
};
1820

1921
const staticElements = {
2022
listHeaderRow: ['Rule', 'Description', 'Configurations', 'Fixable'],
@@ -97,10 +99,10 @@ const details: RuleDetails[] = Object.keys(config.configs.all.rules)
9799
.map(
98100
([name, rule]): RuleDetails => ({
99101
name,
100-
description: rule.meta.docs?.description ?? '',
102+
description: rule.meta.docs.description,
101103
fixable: rule.meta.fixable
102104
? 'fixable'
103-
: rule.meta.docs?.suggestion
105+
: rule.meta.docs.suggestion
104106
? 'suggest'
105107
: false,
106108
}),

0 commit comments

Comments
 (0)