Skip to content

Commit

Permalink
feat(experimental-utils): make RuleMetaData.docs optional (#1462)
Browse files Browse the repository at this point in the history
  • Loading branch information
Michael McDonald authored and bradzacher committed Jan 21, 2020
1 parent fcff5b4 commit cde97ac
Show file tree
Hide file tree
Showing 4 changed files with 27 additions and 27 deletions.
16 changes: 8 additions & 8 deletions packages/eslint-plugin/tests/configs.test.ts
Expand Up @@ -3,12 +3,12 @@ import plugin from '../src/index';

const RULE_NAME_PREFIX = '@typescript-eslint/';
const EXTENSION_RULES = Object.entries(rules)
.filter(([, rule]) => rule.meta.docs.extendsBaseRule)
.filter(([, rule]) => rule.meta.docs?.extendsBaseRule)
.map(
([ruleName, rule]) =>
[
`${RULE_NAME_PREFIX}${ruleName}`,
typeof rule.meta.docs.extendsBaseRule === 'string'
typeof rule.meta.docs?.extendsBaseRule === 'string'
? rule.meta.docs.extendsBaseRule
: ruleName,
] as const,
Expand Down Expand Up @@ -68,12 +68,12 @@ describe('recommended.json config', () => {
const ruleConfigs = Object.entries(rules)
.filter(
([, rule]) =>
rule.meta.docs.recommended !== false &&
rule.meta.docs.requiresTypeChecking !== true,
rule.meta.docs?.recommended !== false &&
rule.meta.docs?.requiresTypeChecking !== true,
)
.map<[string, string]>(([name, rule]) => [
`${RULE_NAME_PREFIX}${name}`,
rule.meta.docs.recommended || 'off',
rule.meta.docs?.recommended ? rule.meta.docs.recommended : 'off',
]);

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

it('contains all recommended rules that require type checking, excluding the deprecated ones', () => {
Expand Down
18 changes: 9 additions & 9 deletions packages/eslint-plugin/tests/docs.test.ts
Expand Up @@ -63,7 +63,7 @@ describe('Validating rule docs', () => {
expect(tokens[0]).toEqual({
type: 'heading',
depth: 1,
text: `${rule.meta.docs.description} (\`${ruleName}\`)`,
text: `${rule.meta.docs?.description} (\`${ruleName}\`)`,
});
});
}
Expand All @@ -76,7 +76,7 @@ describe('Validating rule metadata', () => {
// validate if rule name is same as url
// there is no way to access this field but its used only in generation of docs url
expect(
rule.meta.docs.url.endsWith(`rules/${ruleName}.md`),
rule.meta.docs?.url.endsWith(`rules/${ruleName}.md`),
).toBeTruthy();
});

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

expect(ruleFileContents.includes('getParserServices')).toEqual(
rule.meta.docs.requiresTypeChecking ?? false,
rule.meta.docs?.requiresTypeChecking ?? false,
);
});
});
Expand All @@ -99,10 +99,10 @@ describe('Validating README.md', () => {
const rulesTables = parseReadme();
const notDeprecated = rulesData.filter(([, rule]) => !rule.meta.deprecated);
const baseRules = notDeprecated.filter(
([, rule]) => !rule.meta.docs.extendsBaseRule,
([, rule]) => !rule.meta.docs?.extendsBaseRule,
);
const extensionRules = notDeprecated.filter(
([, rule]) => rule.meta.docs.extendsBaseRule,
([, rule]) => rule.meta.docs?.extendsBaseRule,
);

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

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

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

it('Recommended column should be correct', () => {
expect(ruleRow[2]).toEqual(
rule.meta.docs.recommended ? ':heavy_check_mark:' : '',
rule.meta.docs?.recommended ? ':heavy_check_mark:' : '',
);
});

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

it('Requiring type information column should be correct', () => {
expect(ruleRow[4]).toEqual(
rule.meta.docs.requiresTypeChecking === true
rule.meta.docs?.requiresTypeChecking === true
? ':thought_balloon:'
: '',
);
Expand Down
16 changes: 8 additions & 8 deletions packages/eslint-plugin/tools/generate-configs.ts
Expand Up @@ -26,13 +26,13 @@ const MAX_RULE_NAME_LENGTH = Object.keys(rules).reduce(
const DEFAULT_RULE_SETTING = 'warn';
const BASE_RULES_TO_BE_OVERRIDDEN = new Map(
Object.entries(rules)
.filter(([, rule]) => rule.meta.docs.extendsBaseRule)
.filter(([, rule]) => rule.meta.docs?.extendsBaseRule)
.map(
([ruleName, rule]) =>
[
ruleName,
typeof rule.meta.docs.extendsBaseRule === 'string'
? rule.meta.docs.extendsBaseRule
typeof rule.meta.docs?.extendsBaseRule === 'string'
? rule.meta.docs?.extendsBaseRule
: ruleName,
] as const,
),
Expand Down Expand Up @@ -74,21 +74,21 @@ function reducer<TMessageIds extends string>(
// Explicitly exclude rules requiring type-checking
if (
settings.filterRequiresTypeChecking === 'exclude' &&
value.meta.docs.requiresTypeChecking === true
value.meta.docs?.requiresTypeChecking === true
) {
return config;
}

// Explicitly include rules requiring type-checking
if (
settings.filterRequiresTypeChecking === 'include' &&
value.meta.docs.requiresTypeChecking !== true
value.meta.docs?.requiresTypeChecking !== true
) {
return config;
}

const ruleName = `${RULE_NAME_PREFIX}${key}`;
const recommendation = value.meta.docs.recommended;
const recommendation = value.meta.docs?.recommended;
const usedSetting = settings.errorLevel
? settings.errorLevel
: !recommendation
Expand Down Expand Up @@ -157,7 +157,7 @@ console.log(
'------------------------------ recommended.json (should not require program) ------------------------------',
);
const recommendedRules = ruleEntries
.filter(entry => !!entry[1].meta.docs.recommended)
.filter(entry => !!entry[1].meta.docs?.recommended)
.reduce<LinterConfigRules>(
(config, entry) =>
reducer(config, entry, {
Expand All @@ -183,7 +183,7 @@ console.log(
'--------------------------------- recommended-requiring-type-checking.json ---------------------------------',
);
const recommendedRulesRequiringProgram = ruleEntries
.filter(entry => !!entry[1].meta.docs.recommended)
.filter(entry => !!entry[1].meta.docs?.recommended)
.reduce<LinterConfigRules>(
(config, entry) =>
reducer(config, entry, {
Expand Down
4 changes: 2 additions & 2 deletions packages/experimental-utils/src/ts-eslint/Rule.ts
Expand Up @@ -46,9 +46,9 @@ interface RuleMetaData<TMessageIds extends string> {
*/
deprecated?: boolean;
/**
* Documentation for the rule
* Documentation for the rule, unnecessary for custom rules/plugins
*/
docs: RuleMetaDataDocs;
docs?: RuleMetaDataDocs;
/**
* The fixer category. Omit if there is no fixer
*/
Expand Down

0 comments on commit cde97ac

Please sign in to comment.