diff --git a/src/rules/convertRules.test.ts b/src/rules/convertRules.test.ts index 20aa66b90..8ac1ae890 100644 --- a/src/rules/convertRules.test.ts +++ b/src/rules/convertRules.test.ts @@ -183,6 +183,96 @@ describe("convertRules", () => { ); }); + it("merges and deduplicates rule notices", () => { + // Arrange + const tslintRule: TSLintRuleOptions = { + ruleArguments: [], + ruleName: "tslint-rule-a", + ruleSeverity: "error", + }; + const conversionResult = { + rules: [ + { + ruleName: "eslint-rule-a", + notices: ["notice-1", "notice-2"], + }, + { + ruleName: "eslint-rule-a", + notices: ["notice-1"], + }, + ], + }; + const mergedArguments = [{ merged: true }]; + const converters = new Map([[tslintRule.ruleName, () => conversionResult]]); + const mergers = new Map([[conversionResult.rules[0].ruleName, () => mergedArguments]]); + + // Act + const { converted } = convertRules( + { converters, mergers }, + { [tslintRule.ruleName]: tslintRule }, + ); + + // Assert + expect(converted).toEqual( + new Map([ + [ + "eslint-rule-a", + { + ruleArguments: mergedArguments, + ruleName: "eslint-rule-a", + ruleSeverity: "error", + notices: ["notice-1", "notice-2"], + }, + ], + ]), + ); + }); + + it("merges undefined notices", () => { + // Arrange + const tslintRule: TSLintRuleOptions = { + ruleArguments: [], + ruleName: "tslint-rule-a", + ruleSeverity: "error", + }; + const conversionResult = { + rules: [ + { + ruleName: "eslint-rule-a", + notices: undefined, + }, + { + ruleName: "eslint-rule-a", + notices: undefined, + }, + ], + }; + const mergedArguments = [{ merged: true }]; + const converters = new Map([[tslintRule.ruleName, () => conversionResult]]); + const mergers = new Map([[conversionResult.rules[0].ruleName, () => mergedArguments]]); + + // Act + const { converted } = convertRules( + { converters, mergers }, + { [tslintRule.ruleName]: tslintRule }, + ); + + // Assert + expect(converted).toEqual( + new Map([ + [ + "eslint-rule-a", + { + ruleArguments: mergedArguments, + ruleName: "eslint-rule-a", + ruleSeverity: "error", + notices: [], + }, + ], + ]), + ); + }); + it("marks a new plugin when a conversion has a new plugin", () => { // Arrange const tslintRule: TSLintRuleOptions = { diff --git a/src/rules/convertRules.ts b/src/rules/convertRules.ts index 8090c5a11..d28c42199 100644 --- a/src/rules/convertRules.ts +++ b/src/rules/convertRules.ts @@ -78,7 +78,7 @@ export const convertRules = ( existingConversion.ruleArguments, newConversion.ruleArguments, ), - notices: [...existingNotices, ...newNotices], + notices: Array.from(new Set([...existingNotices, ...newNotices])), }); } }