From 21ccf2cac362ff2e164845482c60bf3811febe6b Mon Sep 17 00:00:00 2001 From: Adam Reisinger Date: Sun, 23 May 2021 17:54:47 +0200 Subject: [PATCH 1/4] Fix @typescript-eslint disable rules. --- src/converters/lintConfigs/rules/meta.test.ts | 82 +++++++++++++++++++ .../lintConfigs/rules/ruleConverters/align.ts | 4 + .../rules/ruleConverters/indent.ts | 4 + .../ruleConverters/no-async-without-await.ts | 4 + .../rules/ruleConverters/no-empty.ts | 23 +++--- .../ruleConverters/no-shadowed-variable.ts | 4 + .../rules/ruleConverters/no-string-literal.ts | 4 + .../ruleConverters/no-unused-expression.ts | 4 + .../ruleConverters/no-unused-variable.ts | 4 + .../ruleConverters/no-use-before-declare.ts | 4 + .../rules/ruleConverters/quotemark.ts | 4 + .../rules/ruleConverters/semicolon.ts | 4 + .../rules/ruleConverters/tests/align.test.ts | 24 ++++++ .../rules/ruleConverters/tests/indent.test.ts | 16 ++++ .../tests/no-async-without-await.test.ts | 4 + .../ruleConverters/tests/no-empty.test.ts | 8 ++ .../tests/no-shadowed-variable.test.ts | 20 +++++ .../tests/no-string-literal.test.ts | 4 + .../tests/no-unused-expression.test.ts | 20 +++++ .../tests/no-unused-variable.test.ts | 4 + .../tests/no-use-before-declare.test.ts | 4 + .../ruleConverters/tests/quotemark.test.ts | 20 +++++ .../ruleConverters/tests/semicolon.test.ts | 32 ++++++++ 23 files changed, 291 insertions(+), 10 deletions(-) create mode 100644 src/converters/lintConfigs/rules/meta.test.ts diff --git a/src/converters/lintConfigs/rules/meta.test.ts b/src/converters/lintConfigs/rules/meta.test.ts new file mode 100644 index 00000000..31ae00ee --- /dev/null +++ b/src/converters/lintConfigs/rules/meta.test.ts @@ -0,0 +1,82 @@ +import { promises as fs } from "fs"; +import { resolve, join } from "path"; + +describe("@typescript-eslint rules that require another rule be disabled", () => { + const rootDirToSearch = join(__dirname, "ruleConverters"); + let converterFiles: string[] = []; + + beforeAll(async () => { + converterFiles = (await getFiles(rootDirToSearch)).filter( + (filePath) => filePath.endsWith(".ts") && !filePath.endsWith(".test.ts"), + ); + }); + + // Source: https://github.com/typescript-eslint/typescript-eslint/tree/master/packages/eslint-plugin/docs/rules + test.each([ + ["@typescript-eslint/brace-style", "brace-style"], + ["@typescript-eslint/comma-dangle", "comma-dangle"], + ["@typescript-eslint/comma-spacing", "comma-spacing"], + ["@typescript-eslint/default-param-last", "default-param-last"], + ["@typescript-eslint/dot-notation", "dot-notation"], + ["@typescript-eslint/func-call-spacing", "func-call-spacing"], + ["@typescript-eslint/indent", "indent"], + ["@typescript-eslint/init-declarations", "init-declarations"], + ["@typescript-eslint/keyword-spacing", "keyword-spacing"], + ["@typescript-eslint/lines-between-class-members", "lines-between-class-members"], + ["@typescript-eslint/no-array-constructor", "no-array-constructor"], + ["@typescript-eslint/no-dupe-class-members", "no-dupe-class-members"], + ["@typescript-eslint/no-duplicate-imports", "no-duplicate-imports"], + ["@typescript-eslint/no-empty-function", "no-empty-function"], + ["@typescript-eslint/no-extra-parens", "no-extra-parens"], + ["@typescript-eslint/no-extra-semi", "no-extra-semi"], + ["@typescript-eslint/no-invalid-this", "no-invalid-this"], + ["@typescript-eslint/no-loop-func", "no-loop-func"], + ["@typescript-eslint/no-loss-of-precision", "no-loss-of-precision"], + ["@typescript-eslint/no-magic-numbers", "no-magic-numbers"], + ["@typescript-eslint/no-redeclare", "no-redeclare"], + ["@typescript-eslint/no-shadow", "no-shadow"], + ["@typescript-eslint/no-throw-literal", "no-throw-literal"], + ["@typescript-eslint/no-unused-expressions", "no-unused-expressions"], + ["@typescript-eslint/no-unused-vars", "no-unused-vars"], + ["@typescript-eslint/no-use-before-define", "no-use-before-define"], + ["@typescript-eslint/no-useless-constructor", "no-useless-constructor"], + ["@typescript-eslint/object-curly-spacing", "object-curly-spacing"], + ["@typescript-eslint/quotes", "quotes"], + ["@typescript-eslint/require-await", "require-await"], + ["@typescript-eslint/return-await", "no-return-await"], + ["@typescript-eslint/semi", "semi"], + ["@typescript-eslint/space-before-function-paren", "space-before-function-paren"], + ["@typescript-eslint/space-infix-ops", "space-infix-ops"], + ])( + '"%s" requires to disable "%s" but it is not disabled in the converter.', + async (rule, disabledRule) => { + await Promise.all( + converterFiles.map((filePath) => checkFile(filePath, rule, disabledRule)), + ); + }, + ); +}); + +async function checkFile(filePath: string, rule: string, disabledRule: string) { + const content = (await fs.readFile(filePath)).toString(); + + if ( + content.includes(`ruleName: "${rule}"`) && + !content.includes(`ruleName: "${disabledRule}"`) && + !content.includes('ruleSeverity: "off"') + ) { + fail(); + } +} + +async function getFiles(dir: string): Promise { + const dirents = await fs.readdir(dir, { withFileTypes: true }); + + const filePromises = dirents.map(async (dirent) => { + const res = resolve(dir, dirent.name); + return dirent.isDirectory() ? getFiles(res) : Promise.resolve([res]); + }); + + const files = await Promise.all(filePromises); + return Array.prototype.concat(...files); +} diff --git a/src/converters/lintConfigs/rules/ruleConverters/align.ts b/src/converters/lintConfigs/rules/ruleConverters/align.ts index 7ae3c886..d0e22f44 100644 --- a/src/converters/lintConfigs/rules/ruleConverters/align.ts +++ b/src/converters/lintConfigs/rules/ruleConverters/align.ts @@ -29,6 +29,10 @@ export const convertAlign: RuleConverter = (tslintRule) => { return { rules: [ + { + ruleName: "indent", + ruleSeverity: "off", + }, { ruleName: "@typescript-eslint/indent", ...{ ruleArguments }, diff --git a/src/converters/lintConfigs/rules/ruleConverters/indent.ts b/src/converters/lintConfigs/rules/ruleConverters/indent.ts index a37c2e4f..a4cfc2a4 100644 --- a/src/converters/lintConfigs/rules/ruleConverters/indent.ts +++ b/src/converters/lintConfigs/rules/ruleConverters/indent.ts @@ -11,6 +11,10 @@ export const convertIndent: RuleConverter = (tslintRule) => { return { rules: [ + { + ruleName: "indent", + ruleSeverity: "off", + }, { ruleName: "@typescript-eslint/indent", ...(indentSize !== 4 && { ruleArguments: [indentSize] }), diff --git a/src/converters/lintConfigs/rules/ruleConverters/no-async-without-await.ts b/src/converters/lintConfigs/rules/ruleConverters/no-async-without-await.ts index d521ee64..c8e6d717 100644 --- a/src/converters/lintConfigs/rules/ruleConverters/no-async-without-await.ts +++ b/src/converters/lintConfigs/rules/ruleConverters/no-async-without-await.ts @@ -3,6 +3,10 @@ import { RuleConverter } from "../ruleConverter"; export const convertNoAsyncWithoutAwait: RuleConverter = () => { return { rules: [ + { + ruleName: "require-await", + ruleSeverity: "off", + }, { ruleName: "@typescript-eslint/require-await", }, diff --git a/src/converters/lintConfigs/rules/ruleConverters/no-empty.ts b/src/converters/lintConfigs/rules/ruleConverters/no-empty.ts index 5157cb2b..0b6c84de 100644 --- a/src/converters/lintConfigs/rules/ruleConverters/no-empty.ts +++ b/src/converters/lintConfigs/rules/ruleConverters/no-empty.ts @@ -1,11 +1,8 @@ -import { isDefined } from "../../../../utils"; -import { RuleConverter, RuleConverterOptions } from "../ruleConverter"; +import { ConvertedRuleChanges, RuleConverter, RuleConverterOptions } from "../ruleConverter"; export const convertNoEmpty: RuleConverter = (tslintRule) => { return { - rules: [convertNoEmptyRule(tslintRule), convertNoEmptyFunctionRule(tslintRule)].filter( - isDefined, - ), + rules: [convertNoEmptyRule(tslintRule), ...convertNoEmptyFunctionRule(tslintRule)], }; }; @@ -22,10 +19,16 @@ const convertNoEmptyRule = (tslintRule: RuleConverterOptions) => { }; }; -const convertNoEmptyFunctionRule = (tslintRule: RuleConverterOptions) => { +const convertNoEmptyFunctionRule = (tslintRule: RuleConverterOptions): ConvertedRuleChanges[] => { return tslintRule.ruleArguments.includes("allow-empty-functions") - ? undefined - : { - ruleName: "@typescript-eslint/no-empty-function", - }; + ? [] + : [ + { + ruleName: "no-empty-function", + ruleSeverity: "off", + }, + { + ruleName: "@typescript-eslint/no-empty-function", + }, + ]; }; diff --git a/src/converters/lintConfigs/rules/ruleConverters/no-shadowed-variable.ts b/src/converters/lintConfigs/rules/ruleConverters/no-shadowed-variable.ts index 12e15f93..e03c606e 100644 --- a/src/converters/lintConfigs/rules/ruleConverters/no-shadowed-variable.ts +++ b/src/converters/lintConfigs/rules/ruleConverters/no-shadowed-variable.ts @@ -37,6 +37,10 @@ export const convertNoShadowedVariable: RuleConverter = (tslintRule) => { return { rules: [ + { + ruleName: "no-shadow", + ruleSeverity: "off", + }, { ...(notices.length !== 0 && { notices }), ...(ruleArguments.length !== 0 && { ruleArguments }), diff --git a/src/converters/lintConfigs/rules/ruleConverters/no-string-literal.ts b/src/converters/lintConfigs/rules/ruleConverters/no-string-literal.ts index 25a8550c..76ab6937 100644 --- a/src/converters/lintConfigs/rules/ruleConverters/no-string-literal.ts +++ b/src/converters/lintConfigs/rules/ruleConverters/no-string-literal.ts @@ -3,6 +3,10 @@ import { RuleConverter } from "../ruleConverter"; export const convertNoStringLiteral: RuleConverter = () => { return { rules: [ + { + ruleName: "dot-notation", + ruleSeverity: "off", + }, { ruleName: "@typescript-eslint/dot-notation", }, diff --git a/src/converters/lintConfigs/rules/ruleConverters/no-unused-expression.ts b/src/converters/lintConfigs/rules/ruleConverters/no-unused-expression.ts index 2f574dc0..47f46080 100644 --- a/src/converters/lintConfigs/rules/ruleConverters/no-unused-expression.ts +++ b/src/converters/lintConfigs/rules/ruleConverters/no-unused-expression.ts @@ -3,6 +3,10 @@ import { RuleConverter } from "../ruleConverter"; export const convertNoUnusedExpression: RuleConverter = (tslintRule) => { return { rules: [ + { + ruleName: "no-unused-expressions", + ruleSeverity: "off", + }, { ruleName: "@typescript-eslint/no-unused-expressions", ...collectNoticesAndArguments(tslintRule.ruleArguments), diff --git a/src/converters/lintConfigs/rules/ruleConverters/no-unused-variable.ts b/src/converters/lintConfigs/rules/ruleConverters/no-unused-variable.ts index 1a4f090c..1b422d5f 100644 --- a/src/converters/lintConfigs/rules/ruleConverters/no-unused-variable.ts +++ b/src/converters/lintConfigs/rules/ruleConverters/no-unused-variable.ts @@ -7,6 +7,10 @@ export const NO_UNUSED_VARIABLE_NOTICE = export const convertNoUnusedVariable: RuleConverter = () => { return { rules: [ + { + ruleName: "no-unused-vars", + ruleSeverity: "off", + }, { ruleName: "@typescript-eslint/no-unused-vars", notices: [NO_UNUSED_VARIABLE_NOTICE], diff --git a/src/converters/lintConfigs/rules/ruleConverters/no-use-before-declare.ts b/src/converters/lintConfigs/rules/ruleConverters/no-use-before-declare.ts index fc1f1751..40b7e338 100644 --- a/src/converters/lintConfigs/rules/ruleConverters/no-use-before-declare.ts +++ b/src/converters/lintConfigs/rules/ruleConverters/no-use-before-declare.ts @@ -3,6 +3,10 @@ import { RuleConverter } from "../ruleConverter"; export const convertNoUseBeforeDeclare: RuleConverter = () => { return { rules: [ + { + ruleName: "no-use-before-define", + ruleSeverity: "off", + }, { ruleName: "@typescript-eslint/no-use-before-define", }, diff --git a/src/converters/lintConfigs/rules/ruleConverters/quotemark.ts b/src/converters/lintConfigs/rules/ruleConverters/quotemark.ts index b32c2246..d79271dd 100644 --- a/src/converters/lintConfigs/rules/ruleConverters/quotemark.ts +++ b/src/converters/lintConfigs/rules/ruleConverters/quotemark.ts @@ -24,6 +24,10 @@ export const convertQuotemark: RuleConverter = (tslintRule) => { return { rules: [ + { + ruleName: "quotes", + ruleSeverity: "off", + }, { ...(notices.length !== 0 && { notices }), ...(ruleArguments.length !== 0 && { ruleArguments }), diff --git a/src/converters/lintConfigs/rules/ruleConverters/semicolon.ts b/src/converters/lintConfigs/rules/ruleConverters/semicolon.ts index d974cac3..bf113ee6 100644 --- a/src/converters/lintConfigs/rules/ruleConverters/semicolon.ts +++ b/src/converters/lintConfigs/rules/ruleConverters/semicolon.ts @@ -15,6 +15,10 @@ export const convertSemicolon: RuleConverter = (tslintRule) => { ], }), rules: [ + { + ruleName: "semi", + ruleSeverity: "off", + }, { ruleArguments: [tslintRule.ruleArguments[0]], ruleName: "@typescript-eslint/semi", diff --git a/src/converters/lintConfigs/rules/ruleConverters/tests/align.test.ts b/src/converters/lintConfigs/rules/ruleConverters/tests/align.test.ts index eeabe3ab..c7ec967e 100644 --- a/src/converters/lintConfigs/rules/ruleConverters/tests/align.test.ts +++ b/src/converters/lintConfigs/rules/ruleConverters/tests/align.test.ts @@ -8,6 +8,10 @@ describe(convertAlign, () => { expect(result).toEqual({ rules: [ + { + ruleName: "indent", + ruleSeverity: "off", + }, { ruleName: "@typescript-eslint/indent", }, @@ -22,6 +26,10 @@ describe(convertAlign, () => { expect(result).toEqual({ rules: [ + { + ruleName: "indent", + ruleSeverity: "off", + }, { ruleName: "@typescript-eslint/indent", ruleArguments: [ @@ -42,6 +50,10 @@ describe(convertAlign, () => { expect(result).toEqual({ rules: [ + { + ruleName: "indent", + ruleSeverity: "off", + }, { ruleName: "@typescript-eslint/indent", ruleArguments: [ @@ -62,6 +74,10 @@ describe(convertAlign, () => { expect(result).toEqual({ rules: [ + { + ruleName: "indent", + ruleSeverity: "off", + }, { ruleName: "@typescript-eslint/indent", ruleArguments: [ @@ -82,6 +98,10 @@ describe(convertAlign, () => { expect(result).toEqual({ rules: [ + { + ruleName: "indent", + ruleSeverity: "off", + }, { ruleName: "@typescript-eslint/indent", ruleArguments: [ @@ -103,6 +123,10 @@ describe(convertAlign, () => { expect(result).toEqual({ rules: [ + { + ruleName: "indent", + ruleSeverity: "off", + }, { ruleName: "@typescript-eslint/indent", ruleArguments: [ diff --git a/src/converters/lintConfigs/rules/ruleConverters/tests/indent.test.ts b/src/converters/lintConfigs/rules/ruleConverters/tests/indent.test.ts index d6377b22..f22a688b 100644 --- a/src/converters/lintConfigs/rules/ruleConverters/tests/indent.test.ts +++ b/src/converters/lintConfigs/rules/ruleConverters/tests/indent.test.ts @@ -8,6 +8,10 @@ describe(convertIndent, () => { expect(result).toEqual({ rules: [ + { + ruleName: "indent", + ruleSeverity: "off", + }, { ruleName: "@typescript-eslint/indent", }, @@ -22,6 +26,10 @@ describe(convertIndent, () => { expect(result).toEqual({ rules: [ + { + ruleName: "indent", + ruleSeverity: "off", + }, { ruleName: "@typescript-eslint/indent", ruleArguments: [2], @@ -37,6 +45,10 @@ describe(convertIndent, () => { expect(result).toEqual({ rules: [ + { + ruleName: "indent", + ruleSeverity: "off", + }, { ruleName: "@typescript-eslint/indent", }, @@ -51,6 +63,10 @@ describe(convertIndent, () => { expect(result).toEqual({ rules: [ + { + ruleName: "indent", + ruleSeverity: "off", + }, { ruleName: "@typescript-eslint/indent", ruleArguments: ["tab"], diff --git a/src/converters/lintConfigs/rules/ruleConverters/tests/no-async-without-await.test.ts b/src/converters/lintConfigs/rules/ruleConverters/tests/no-async-without-await.test.ts index 4e4e8853..00b350a0 100644 --- a/src/converters/lintConfigs/rules/ruleConverters/tests/no-async-without-await.test.ts +++ b/src/converters/lintConfigs/rules/ruleConverters/tests/no-async-without-await.test.ts @@ -8,6 +8,10 @@ describe(convertNoAsyncWithoutAwait, () => { expect(result).toEqual({ rules: [ + { + ruleName: "require-await", + ruleSeverity: "off", + }, { ruleName: "@typescript-eslint/require-await", }, diff --git a/src/converters/lintConfigs/rules/ruleConverters/tests/no-empty.test.ts b/src/converters/lintConfigs/rules/ruleConverters/tests/no-empty.test.ts index f1d8db89..7086d270 100644 --- a/src/converters/lintConfigs/rules/ruleConverters/tests/no-empty.test.ts +++ b/src/converters/lintConfigs/rules/ruleConverters/tests/no-empty.test.ts @@ -11,6 +11,10 @@ describe(convertNoEmpty, () => { { ruleName: "no-empty", }, + { + ruleName: "no-empty-function", + ruleSeverity: "off", + }, { ruleName: "@typescript-eslint/no-empty-function", }, @@ -29,6 +33,10 @@ describe(convertNoEmpty, () => { ruleArguments: [{ allowEmptyCatch: true }], ruleName: "no-empty", }, + { + ruleName: "no-empty-function", + ruleSeverity: "off", + }, { ruleName: "@typescript-eslint/no-empty-function", }, diff --git a/src/converters/lintConfigs/rules/ruleConverters/tests/no-shadowed-variable.test.ts b/src/converters/lintConfigs/rules/ruleConverters/tests/no-shadowed-variable.test.ts index a0d9c7da..940b2cf2 100644 --- a/src/converters/lintConfigs/rules/ruleConverters/tests/no-shadowed-variable.test.ts +++ b/src/converters/lintConfigs/rules/ruleConverters/tests/no-shadowed-variable.test.ts @@ -8,6 +8,10 @@ describe(convertNoShadowedVariable, () => { expect(result).toEqual({ rules: [ + { + ruleName: "no-shadow", + ruleSeverity: "off", + }, { ruleArguments: [{ hoist: "all" }], ruleName: "@typescript-eslint/no-shadow", @@ -23,6 +27,10 @@ describe(convertNoShadowedVariable, () => { expect(result).toEqual({ rules: [ + { + ruleName: "no-shadow", + ruleSeverity: "off", + }, { ruleArguments: [{ hoist: "all" }], ruleName: "@typescript-eslint/no-shadow", @@ -38,6 +46,10 @@ describe(convertNoShadowedVariable, () => { expect(result).toEqual({ rules: [ + { + ruleName: "no-shadow", + ruleSeverity: "off", + }, { ruleArguments: [{ hoist: "all" }], ruleName: "@typescript-eslint/no-shadow", @@ -53,6 +65,10 @@ describe(convertNoShadowedVariable, () => { expect(result).toEqual({ rules: [ + { + ruleName: "no-shadow", + ruleSeverity: "off", + }, { ruleArguments: [{ hoist: "never" }], ruleName: "@typescript-eslint/no-shadow", @@ -68,6 +84,10 @@ describe(convertNoShadowedVariable, () => { expect(result).toEqual({ rules: [ + { + ruleName: "no-shadow", + ruleSeverity: "off", + }, { notices: [ "ESLint does not support disabling shadowed variable checks based on " + diff --git a/src/converters/lintConfigs/rules/ruleConverters/tests/no-string-literal.test.ts b/src/converters/lintConfigs/rules/ruleConverters/tests/no-string-literal.test.ts index 3ae6dda3..30d36196 100644 --- a/src/converters/lintConfigs/rules/ruleConverters/tests/no-string-literal.test.ts +++ b/src/converters/lintConfigs/rules/ruleConverters/tests/no-string-literal.test.ts @@ -8,6 +8,10 @@ describe(convertNoStringLiteral, () => { expect(result).toEqual({ rules: [ + { + ruleName: "dot-notation", + ruleSeverity: "off", + }, { ruleName: "@typescript-eslint/dot-notation", }, diff --git a/src/converters/lintConfigs/rules/ruleConverters/tests/no-unused-expression.test.ts b/src/converters/lintConfigs/rules/ruleConverters/tests/no-unused-expression.test.ts index 79d35745..523c189f 100644 --- a/src/converters/lintConfigs/rules/ruleConverters/tests/no-unused-expression.test.ts +++ b/src/converters/lintConfigs/rules/ruleConverters/tests/no-unused-expression.test.ts @@ -8,6 +8,10 @@ describe(convertNoUnusedExpression, () => { expect(result).toEqual({ rules: [ + { + ruleName: "no-unused-expressions", + ruleSeverity: "off", + }, { notices: [ `The TSLint optional config "allow-new" is the default ESLint behavior and will no longer be ignored.`, @@ -25,6 +29,10 @@ describe(convertNoUnusedExpression, () => { expect(result).toEqual({ rules: [ + { + ruleName: "no-unused-expressions", + ruleSeverity: "off", + }, { notices: [ `The TSLint optional config "allow-new" is the default ESLint behavior and will no longer be ignored.`, @@ -43,6 +51,10 @@ describe(convertNoUnusedExpression, () => { expect(result).toEqual({ rules: [ + { + ruleName: "no-unused-expressions", + ruleSeverity: "off", + }, { ruleArguments: [{ allowTaggedTemplates: true }], ruleName: "@typescript-eslint/no-unused-expressions", @@ -58,6 +70,10 @@ describe(convertNoUnusedExpression, () => { expect(result).toEqual({ rules: [ + { + ruleName: "no-unused-expressions", + ruleSeverity: "off", + }, { ruleArguments: [{ allowShortCircuit: true }], ruleName: "@typescript-eslint/no-unused-expressions", @@ -73,6 +89,10 @@ describe(convertNoUnusedExpression, () => { expect(result).toEqual({ rules: [ + { + ruleName: "no-unused-expressions", + ruleSeverity: "off", + }, { ruleArguments: [{ allowTaggedTemplates: true, allowShortCircuit: true }], ruleName: "@typescript-eslint/no-unused-expressions", diff --git a/src/converters/lintConfigs/rules/ruleConverters/tests/no-unused-variable.test.ts b/src/converters/lintConfigs/rules/ruleConverters/tests/no-unused-variable.test.ts index ddfd0322..5c2afc30 100644 --- a/src/converters/lintConfigs/rules/ruleConverters/tests/no-unused-variable.test.ts +++ b/src/converters/lintConfigs/rules/ruleConverters/tests/no-unused-variable.test.ts @@ -8,6 +8,10 @@ describe(convertNoUnusedVariable, () => { expect(result).toEqual({ rules: [ + { + ruleName: "no-unused-vars", + ruleSeverity: "off", + }, { ruleName: "@typescript-eslint/no-unused-vars", notices: [NO_UNUSED_VARIABLE_NOTICE], diff --git a/src/converters/lintConfigs/rules/ruleConverters/tests/no-use-before-declare.test.ts b/src/converters/lintConfigs/rules/ruleConverters/tests/no-use-before-declare.test.ts index 0631a48a..5c5d9adb 100644 --- a/src/converters/lintConfigs/rules/ruleConverters/tests/no-use-before-declare.test.ts +++ b/src/converters/lintConfigs/rules/ruleConverters/tests/no-use-before-declare.test.ts @@ -8,6 +8,10 @@ describe(convertNoUseBeforeDeclare, () => { expect(result).toEqual({ rules: [ + { + ruleName: "no-use-before-define", + ruleSeverity: "off", + }, { ruleName: "@typescript-eslint/no-use-before-define", }, diff --git a/src/converters/lintConfigs/rules/ruleConverters/tests/quotemark.test.ts b/src/converters/lintConfigs/rules/ruleConverters/tests/quotemark.test.ts index 3c358ee8..4ea3b2a0 100644 --- a/src/converters/lintConfigs/rules/ruleConverters/tests/quotemark.test.ts +++ b/src/converters/lintConfigs/rules/ruleConverters/tests/quotemark.test.ts @@ -8,6 +8,10 @@ describe(convertQuotemark, () => { expect(result).toEqual({ rules: [ + { + ruleName: "quotes", + ruleSeverity: "off", + }, { ruleName: "@typescript-eslint/quotes", }, @@ -22,6 +26,10 @@ describe(convertQuotemark, () => { expect(result).toEqual({ rules: [ + { + ruleName: "quotes", + ruleSeverity: "off", + }, { ruleArguments: ["double"], ruleName: "@typescript-eslint/quotes", @@ -37,6 +45,10 @@ describe(convertQuotemark, () => { expect(result).toEqual({ rules: [ + { + ruleName: "quotes", + ruleSeverity: "off", + }, { ruleArguments: [{ avoidEscape: true }], ruleName: "@typescript-eslint/quotes", @@ -52,6 +64,10 @@ describe(convertQuotemark, () => { expect(result).toEqual({ rules: [ + { + ruleName: "quotes", + ruleSeverity: "off", + }, { notices: ['Option "avoid-template" is not supported by ESLint.'], ruleArguments: ["single"], @@ -68,6 +84,10 @@ describe(convertQuotemark, () => { expect(result).toEqual({ rules: [ + { + ruleName: "quotes", + ruleSeverity: "off", + }, { notices: [ 'Option "jsx-single" is not supported by ESLint.', diff --git a/src/converters/lintConfigs/rules/ruleConverters/tests/semicolon.test.ts b/src/converters/lintConfigs/rules/ruleConverters/tests/semicolon.test.ts index f7cb30a4..c0e2690c 100644 --- a/src/converters/lintConfigs/rules/ruleConverters/tests/semicolon.test.ts +++ b/src/converters/lintConfigs/rules/ruleConverters/tests/semicolon.test.ts @@ -8,6 +8,10 @@ describe(convertSemicolon, () => { expect(result).toEqual({ rules: [ + { + ruleName: "semi", + ruleSeverity: "off", + }, { ruleArguments: ["always"], ruleName: "@typescript-eslint/semi", @@ -38,6 +42,10 @@ describe(convertSemicolon, () => { expect(result).toEqual({ rules: [ + { + ruleName: "semi", + ruleSeverity: "off", + }, { ruleArguments: ["never"], ruleName: "@typescript-eslint/semi", @@ -68,6 +76,10 @@ describe(convertSemicolon, () => { expect(result).toEqual({ rules: [ + { + ruleName: "semi", + ruleSeverity: "off", + }, { ruleName: "@typescript-eslint/semi", ruleArguments: ["always"], @@ -101,6 +113,10 @@ describe(convertSemicolon, () => { expect(result).toEqual({ rules: [ + { + ruleName: "semi", + ruleSeverity: "off", + }, { ruleName: "@typescript-eslint/semi", ruleArguments: ["never"], @@ -134,6 +150,10 @@ describe(convertSemicolon, () => { expect(result).toEqual({ rules: [ + { + ruleName: "semi", + ruleSeverity: "off", + }, { ruleName: "@typescript-eslint/semi", ruleArguments: ["always"], @@ -149,6 +169,10 @@ describe(convertSemicolon, () => { expect(result).toEqual({ rules: [ + { + ruleName: "semi", + ruleSeverity: "off", + }, { ruleName: "@typescript-eslint/semi", ruleArguments: ["never"], @@ -164,6 +188,10 @@ describe(convertSemicolon, () => { expect(result).toEqual({ rules: [ + { + ruleName: "semi", + ruleSeverity: "off", + }, { ruleName: "@typescript-eslint/semi", ruleArguments: ["always"], @@ -182,6 +210,10 @@ describe(convertSemicolon, () => { expect(result).toEqual({ rules: [ + { + ruleName: "semi", + ruleSeverity: "off", + }, { ruleName: "@typescript-eslint/semi", ruleArguments: ["never"], From 21b1992911392c495b7fcc2c64087d0d40bb2ff1 Mon Sep 17 00:00:00 2001 From: Adam Reisinger Date: Sun, 23 May 2021 18:28:03 +0200 Subject: [PATCH 2/4] Refactor meta test. --- src/converters/lintConfigs/rules/meta.test.ts | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/converters/lintConfigs/rules/meta.test.ts b/src/converters/lintConfigs/rules/meta.test.ts index 31ae00ee..18c646c3 100644 --- a/src/converters/lintConfigs/rules/meta.test.ts +++ b/src/converters/lintConfigs/rules/meta.test.ts @@ -2,13 +2,16 @@ import { promises as fs } from "fs"; import { resolve, join } from "path"; describe("@typescript-eslint rules that require another rule be disabled", () => { - const rootDirToSearch = join(__dirname, "ruleConverters"); let converterFiles: string[] = []; beforeAll(async () => { - converterFiles = (await getFiles(rootDirToSearch)).filter( + const rootDirToSearch = join(__dirname, "ruleConverters"); + const converterFilePaths = (await getFiles(rootDirToSearch)).filter( (filePath) => filePath.endsWith(".ts") && !filePath.endsWith(".test.ts"), ); + converterFiles = await Promise.all( + converterFilePaths.map(async (filePath) => (await fs.readFile(filePath)).toString()), + ); }); // Source: https://github.com/typescript-eslint/typescript-eslint/tree/master/packages/eslint-plugin/docs/rules @@ -49,17 +52,15 @@ describe("@typescript-eslint rules that require another rule be disabled", () => ["@typescript-eslint/space-infix-ops", "space-infix-ops"], ])( '"%s" requires to disable "%s" but it is not disabled in the converter.', - async (rule, disabledRule) => { - await Promise.all( - converterFiles.map((filePath) => checkFile(filePath, rule, disabledRule)), - ); + (rule, disabledRule) => { + converterFiles.forEach((content) => { + checkFile(content, rule, disabledRule); + }); }, ); }); -async function checkFile(filePath: string, rule: string, disabledRule: string) { - const content = (await fs.readFile(filePath)).toString(); - +function checkFile(content: string, rule: string, disabledRule: string) { if ( content.includes(`ruleName: "${rule}"`) && !content.includes(`ruleName: "${disabledRule}"`) && From 0f5034d7c8a788e7784f9cd1536c75111c181fec Mon Sep 17 00:00:00 2001 From: Adam Reisinger Date: Tue, 25 May 2021 17:58:16 +0200 Subject: [PATCH 3/4] Add a missing rule to the typescript-eslint extension table. --- src/converters/lintConfigs/rules/meta.test.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/converters/lintConfigs/rules/meta.test.ts b/src/converters/lintConfigs/rules/meta.test.ts index 18c646c3..b8fbdbc7 100644 --- a/src/converters/lintConfigs/rules/meta.test.ts +++ b/src/converters/lintConfigs/rules/meta.test.ts @@ -14,7 +14,7 @@ describe("@typescript-eslint rules that require another rule be disabled", () => ); }); - // Source: https://github.com/typescript-eslint/typescript-eslint/tree/master/packages/eslint-plugin/docs/rules + // Source: https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/README.md#extension-rules test.each([ ["@typescript-eslint/brace-style", "brace-style"], ["@typescript-eslint/comma-dangle", "comma-dangle"], @@ -32,6 +32,7 @@ describe("@typescript-eslint rules that require another rule be disabled", () => ["@typescript-eslint/no-empty-function", "no-empty-function"], ["@typescript-eslint/no-extra-parens", "no-extra-parens"], ["@typescript-eslint/no-extra-semi", "no-extra-semi"], + ["@typescript-eslint/no-implied-eval", "no-implied-eval"], ["@typescript-eslint/no-invalid-this", "no-invalid-this"], ["@typescript-eslint/no-loop-func", "no-loop-func"], ["@typescript-eslint/no-loss-of-precision", "no-loss-of-precision"], From e7ee12dd0e1c00511603f4972f0bcbe29cecc205 Mon Sep 17 00:00:00 2001 From: Adam Reisinger Date: Thu, 27 May 2021 18:31:40 +0200 Subject: [PATCH 4/4] Delete unneccessary test. --- src/converters/lintConfigs/rules/meta.test.ts | 84 ------------------- 1 file changed, 84 deletions(-) delete mode 100644 src/converters/lintConfigs/rules/meta.test.ts diff --git a/src/converters/lintConfigs/rules/meta.test.ts b/src/converters/lintConfigs/rules/meta.test.ts deleted file mode 100644 index b8fbdbc7..00000000 --- a/src/converters/lintConfigs/rules/meta.test.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { promises as fs } from "fs"; -import { resolve, join } from "path"; - -describe("@typescript-eslint rules that require another rule be disabled", () => { - let converterFiles: string[] = []; - - beforeAll(async () => { - const rootDirToSearch = join(__dirname, "ruleConverters"); - const converterFilePaths = (await getFiles(rootDirToSearch)).filter( - (filePath) => filePath.endsWith(".ts") && !filePath.endsWith(".test.ts"), - ); - converterFiles = await Promise.all( - converterFilePaths.map(async (filePath) => (await fs.readFile(filePath)).toString()), - ); - }); - - // Source: https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/README.md#extension-rules - test.each([ - ["@typescript-eslint/brace-style", "brace-style"], - ["@typescript-eslint/comma-dangle", "comma-dangle"], - ["@typescript-eslint/comma-spacing", "comma-spacing"], - ["@typescript-eslint/default-param-last", "default-param-last"], - ["@typescript-eslint/dot-notation", "dot-notation"], - ["@typescript-eslint/func-call-spacing", "func-call-spacing"], - ["@typescript-eslint/indent", "indent"], - ["@typescript-eslint/init-declarations", "init-declarations"], - ["@typescript-eslint/keyword-spacing", "keyword-spacing"], - ["@typescript-eslint/lines-between-class-members", "lines-between-class-members"], - ["@typescript-eslint/no-array-constructor", "no-array-constructor"], - ["@typescript-eslint/no-dupe-class-members", "no-dupe-class-members"], - ["@typescript-eslint/no-duplicate-imports", "no-duplicate-imports"], - ["@typescript-eslint/no-empty-function", "no-empty-function"], - ["@typescript-eslint/no-extra-parens", "no-extra-parens"], - ["@typescript-eslint/no-extra-semi", "no-extra-semi"], - ["@typescript-eslint/no-implied-eval", "no-implied-eval"], - ["@typescript-eslint/no-invalid-this", "no-invalid-this"], - ["@typescript-eslint/no-loop-func", "no-loop-func"], - ["@typescript-eslint/no-loss-of-precision", "no-loss-of-precision"], - ["@typescript-eslint/no-magic-numbers", "no-magic-numbers"], - ["@typescript-eslint/no-redeclare", "no-redeclare"], - ["@typescript-eslint/no-shadow", "no-shadow"], - ["@typescript-eslint/no-throw-literal", "no-throw-literal"], - ["@typescript-eslint/no-unused-expressions", "no-unused-expressions"], - ["@typescript-eslint/no-unused-vars", "no-unused-vars"], - ["@typescript-eslint/no-use-before-define", "no-use-before-define"], - ["@typescript-eslint/no-useless-constructor", "no-useless-constructor"], - ["@typescript-eslint/object-curly-spacing", "object-curly-spacing"], - ["@typescript-eslint/quotes", "quotes"], - ["@typescript-eslint/require-await", "require-await"], - ["@typescript-eslint/return-await", "no-return-await"], - ["@typescript-eslint/semi", "semi"], - ["@typescript-eslint/space-before-function-paren", "space-before-function-paren"], - ["@typescript-eslint/space-infix-ops", "space-infix-ops"], - ])( - '"%s" requires to disable "%s" but it is not disabled in the converter.', - (rule, disabledRule) => { - converterFiles.forEach((content) => { - checkFile(content, rule, disabledRule); - }); - }, - ); -}); - -function checkFile(content: string, rule: string, disabledRule: string) { - if ( - content.includes(`ruleName: "${rule}"`) && - !content.includes(`ruleName: "${disabledRule}"`) && - !content.includes('ruleSeverity: "off"') - ) { - fail(); - } -} - -async function getFiles(dir: string): Promise { - const dirents = await fs.readdir(dir, { withFileTypes: true }); - - const filePromises = dirents.map(async (dirent) => { - const res = resolve(dir, dirent.name); - return dirent.isDirectory() ? getFiles(res) : Promise.resolve([res]); - }); - - const files = await Promise.all(filePromises); - return Array.prototype.concat(...files); -}