diff --git a/packages/eslint-plugin/tests/configs.test.ts b/packages/eslint-plugin/tests/configs.test.ts index f034fd86ccf..f8fc068ad64 100644 --- a/packages/eslint-plugin/tests/configs.test.ts +++ b/packages/eslint-plugin/tests/configs.test.ts @@ -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, @@ -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", () => { @@ -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', () => { diff --git a/packages/eslint-plugin/tests/docs.test.ts b/packages/eslint-plugin/tests/docs.test.ts index 56a9e50002d..68cbeed0187 100644 --- a/packages/eslint-plugin/tests/docs.test.ts +++ b/packages/eslint-plugin/tests/docs.test.ts @@ -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}\`)`, }); }); } @@ -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(); }); @@ -88,7 +88,7 @@ describe('Validating rule metadata', () => { ); expect(ruleFileContents.includes('getParserServices')).toEqual( - rule.meta.docs.requiresTypeChecking ?? false, + rule.meta.docs?.requiresTypeChecking ?? false, ); }); }); @@ -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', () => { @@ -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`)); @@ -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:' : '', ); }); @@ -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:' : '', ); diff --git a/packages/eslint-plugin/tools/generate-configs.ts b/packages/eslint-plugin/tools/generate-configs.ts index 33ac44c65ca..d35fd7362bc 100644 --- a/packages/eslint-plugin/tools/generate-configs.ts +++ b/packages/eslint-plugin/tools/generate-configs.ts @@ -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, ), @@ -74,7 +74,7 @@ function reducer( // Explicitly exclude rules requiring type-checking if ( settings.filterRequiresTypeChecking === 'exclude' && - value.meta.docs.requiresTypeChecking === true + value.meta.docs?.requiresTypeChecking === true ) { return config; } @@ -82,13 +82,13 @@ function reducer( // 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 @@ -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( (config, entry) => reducer(config, entry, { @@ -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( (config, entry) => reducer(config, entry, { diff --git a/packages/experimental-utils/src/ts-eslint/Rule.ts b/packages/experimental-utils/src/ts-eslint/Rule.ts index 845560e8037..4623e8758ae 100644 --- a/packages/experimental-utils/src/ts-eslint/Rule.ts +++ b/packages/experimental-utils/src/ts-eslint/Rule.ts @@ -46,9 +46,9 @@ interface RuleMetaData { */ 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 */