Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit cde97ac

Browse files
Michael McDonaldbradzacher
Michael McDonald
authored andcommitted
feat(experimental-utils): make RuleMetaData.docs optional (typescript-eslint#1462)
1 parent fcff5b4 commit cde97ac

File tree

4 files changed

+27
-27
lines changed

4 files changed

+27
-27
lines changed

packages/eslint-plugin/tests/configs.test.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@ import plugin from '../src/index';
33

44
const RULE_NAME_PREFIX = '@typescript-eslint/';
55
const EXTENSION_RULES = Object.entries(rules)
6-
.filter(([, rule]) => rule.meta.docs.extendsBaseRule)
6+
.filter(([, rule]) => rule.meta.docs?.extendsBaseRule)
77
.map(
88
([ruleName, rule]) =>
99
[
1010
`${RULE_NAME_PREFIX}${ruleName}`,
11-
typeof rule.meta.docs.extendsBaseRule === 'string'
11+
typeof rule.meta.docs?.extendsBaseRule === 'string'
1212
? rule.meta.docs.extendsBaseRule
1313
: ruleName,
1414
] as const,
@@ -68,12 +68,12 @@ describe('recommended.json config', () => {
6868
const ruleConfigs = Object.entries(rules)
6969
.filter(
7070
([, rule]) =>
71-
rule.meta.docs.recommended !== false &&
72-
rule.meta.docs.requiresTypeChecking !== true,
71+
rule.meta.docs?.recommended !== false &&
72+
rule.meta.docs?.requiresTypeChecking !== true,
7373
)
7474
.map<[string, string]>(([name, rule]) => [
7575
`${RULE_NAME_PREFIX}${name}`,
76-
rule.meta.docs.recommended || 'off',
76+
rule.meta.docs?.recommended ? rule.meta.docs.recommended : 'off',
7777
]);
7878

7979
it("contains all recommended rules that don't require typechecking, excluding the deprecated ones", () => {
@@ -91,12 +91,12 @@ describe('recommended-requiring-type-checking.json config', () => {
9191
const ruleConfigs = Object.entries(rules)
9292
.filter(
9393
([, rule]) =>
94-
rule.meta.docs.recommended !== false &&
95-
rule.meta.docs.requiresTypeChecking === true,
94+
rule.meta.docs?.recommended !== false &&
95+
rule.meta.docs?.requiresTypeChecking === true,
9696
)
9797
.map<[string, string]>(([name, rule]) => [
9898
`${RULE_NAME_PREFIX}${name}`,
99-
rule.meta.docs.recommended || 'off',
99+
rule.meta.docs?.recommended ? rule.meta.docs.recommended : 'off',
100100
]);
101101

102102
it('contains all recommended rules that require type checking, excluding the deprecated ones', () => {

packages/eslint-plugin/tests/docs.test.ts

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ describe('Validating rule docs', () => {
6363
expect(tokens[0]).toEqual({
6464
type: 'heading',
6565
depth: 1,
66-
text: `${rule.meta.docs.description} (\`${ruleName}\`)`,
66+
text: `${rule.meta.docs?.description} (\`${ruleName}\`)`,
6767
});
6868
});
6969
}
@@ -76,7 +76,7 @@ describe('Validating rule metadata', () => {
7676
// validate if rule name is same as url
7777
// there is no way to access this field but its used only in generation of docs url
7878
expect(
79-
rule.meta.docs.url.endsWith(`rules/${ruleName}.md`),
79+
rule.meta.docs?.url.endsWith(`rules/${ruleName}.md`),
8080
).toBeTruthy();
8181
});
8282

@@ -88,7 +88,7 @@ describe('Validating rule metadata', () => {
8888
);
8989

9090
expect(ruleFileContents.includes('getParserServices')).toEqual(
91-
rule.meta.docs.requiresTypeChecking ?? false,
91+
rule.meta.docs?.requiresTypeChecking ?? false,
9292
);
9393
});
9494
});
@@ -99,10 +99,10 @@ describe('Validating README.md', () => {
9999
const rulesTables = parseReadme();
100100
const notDeprecated = rulesData.filter(([, rule]) => !rule.meta.deprecated);
101101
const baseRules = notDeprecated.filter(
102-
([, rule]) => !rule.meta.docs.extendsBaseRule,
102+
([, rule]) => !rule.meta.docs?.extendsBaseRule,
103103
);
104104
const extensionRules = notDeprecated.filter(
105-
([, rule]) => rule.meta.docs.extendsBaseRule,
105+
([, rule]) => rule.meta.docs?.extendsBaseRule,
106106
);
107107

108108
it('All non-deprecated base rules should have a row in the base rules table, and the table should be ordered alphabetically', () => {
@@ -128,7 +128,7 @@ describe('Validating README.md', () => {
128128

129129
for (const [ruleName, rule] of notDeprecated) {
130130
describe(`Checking rule ${ruleName}`, () => {
131-
const ruleRow: string[] | undefined = (rule.meta.docs.extendsBaseRule
131+
const ruleRow: string[] | undefined = (rule.meta.docs?.extendsBaseRule
132132
? rulesTables.extension.cells
133133
: rulesTables.base.cells
134134
).find(row => row[0].includes(`/${ruleName}.md`));
@@ -143,12 +143,12 @@ describe('Validating README.md', () => {
143143
});
144144

145145
it('Description column should be correct', () => {
146-
expect(ruleRow[1]).toEqual(rule.meta.docs.description);
146+
expect(ruleRow[1]).toEqual(rule.meta.docs?.description);
147147
});
148148

149149
it('Recommended column should be correct', () => {
150150
expect(ruleRow[2]).toEqual(
151-
rule.meta.docs.recommended ? ':heavy_check_mark:' : '',
151+
rule.meta.docs?.recommended ? ':heavy_check_mark:' : '',
152152
);
153153
});
154154

@@ -160,7 +160,7 @@ describe('Validating README.md', () => {
160160

161161
it('Requiring type information column should be correct', () => {
162162
expect(ruleRow[4]).toEqual(
163-
rule.meta.docs.requiresTypeChecking === true
163+
rule.meta.docs?.requiresTypeChecking === true
164164
? ':thought_balloon:'
165165
: '',
166166
);

packages/eslint-plugin/tools/generate-configs.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,13 @@ const MAX_RULE_NAME_LENGTH = Object.keys(rules).reduce(
2626
const DEFAULT_RULE_SETTING = 'warn';
2727
const BASE_RULES_TO_BE_OVERRIDDEN = new Map(
2828
Object.entries(rules)
29-
.filter(([, rule]) => rule.meta.docs.extendsBaseRule)
29+
.filter(([, rule]) => rule.meta.docs?.extendsBaseRule)
3030
.map(
3131
([ruleName, rule]) =>
3232
[
3333
ruleName,
34-
typeof rule.meta.docs.extendsBaseRule === 'string'
35-
? rule.meta.docs.extendsBaseRule
34+
typeof rule.meta.docs?.extendsBaseRule === 'string'
35+
? rule.meta.docs?.extendsBaseRule
3636
: ruleName,
3737
] as const,
3838
),
@@ -74,21 +74,21 @@ function reducer<TMessageIds extends string>(
7474
// Explicitly exclude rules requiring type-checking
7575
if (
7676
settings.filterRequiresTypeChecking === 'exclude' &&
77-
value.meta.docs.requiresTypeChecking === true
77+
value.meta.docs?.requiresTypeChecking === true
7878
) {
7979
return config;
8080
}
8181

8282
// Explicitly include rules requiring type-checking
8383
if (
8484
settings.filterRequiresTypeChecking === 'include' &&
85-
value.meta.docs.requiresTypeChecking !== true
85+
value.meta.docs?.requiresTypeChecking !== true
8686
) {
8787
return config;
8888
}
8989

9090
const ruleName = `${RULE_NAME_PREFIX}${key}`;
91-
const recommendation = value.meta.docs.recommended;
91+
const recommendation = value.meta.docs?.recommended;
9292
const usedSetting = settings.errorLevel
9393
? settings.errorLevel
9494
: !recommendation
@@ -157,7 +157,7 @@ console.log(
157157
'------------------------------ recommended.json (should not require program) ------------------------------',
158158
);
159159
const recommendedRules = ruleEntries
160-
.filter(entry => !!entry[1].meta.docs.recommended)
160+
.filter(entry => !!entry[1].meta.docs?.recommended)
161161
.reduce<LinterConfigRules>(
162162
(config, entry) =>
163163
reducer(config, entry, {
@@ -183,7 +183,7 @@ console.log(
183183
'--------------------------------- recommended-requiring-type-checking.json ---------------------------------',
184184
);
185185
const recommendedRulesRequiringProgram = ruleEntries
186-
.filter(entry => !!entry[1].meta.docs.recommended)
186+
.filter(entry => !!entry[1].meta.docs?.recommended)
187187
.reduce<LinterConfigRules>(
188188
(config, entry) =>
189189
reducer(config, entry, {

packages/experimental-utils/src/ts-eslint/Rule.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,9 @@ interface RuleMetaData<TMessageIds extends string> {
4646
*/
4747
deprecated?: boolean;
4848
/**
49-
* Documentation for the rule
49+
* Documentation for the rule, unnecessary for custom rules/plugins
5050
*/
51-
docs: RuleMetaDataDocs;
51+
docs?: RuleMetaDataDocs;
5252
/**
5353
* The fixer category. Omit if there is no fixer
5454
*/

0 commit comments

Comments
 (0)