Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(experimental-utils): make RuleMetaData.docs optional #1462

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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