From aec5772d2f41331b961ed75f55d7e768731d8edc Mon Sep 17 00:00:00 2001 From: Yash Kulshrestha Date: Sun, 6 Oct 2019 10:38:33 -0700 Subject: [PATCH 1/5] added the editor tab width for people who have their editors configured to be 2 spaces --- .vscode/settings.json | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index d695c1f4c..a42d383ec 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -2,8 +2,11 @@ "files.exclude": { "**/*.d.ts": true, "**/*.js.map": true, - "**/*.js": { "when": "$(basename).ts" } + "**/*.js": { + "when": "$(basename).ts" + } }, "prettier.ignorePath": ".prettierignore", - "typescript.tsdk": "node_modules/typescript/lib" + "typescript.tsdk": "node_modules/typescript/lib", + "editor.tabSize": 4 } From 0fbc611526549d7a91f4da4e4e8ae1a723c497c6 Mon Sep 17 00:00:00 2001 From: Yash Kulshrestha Date: Sun, 6 Oct 2019 10:39:16 -0700 Subject: [PATCH 2/5] added the semicolon rule and some tests, plus export from converters --- src/rules/converters.ts | 2 + src/rules/converters/semicolon.ts | 53 +++++ src/rules/converters/tests/semicolon.test.ts | 207 +++++++++++++++++++ 3 files changed, 262 insertions(+) create mode 100644 src/rules/converters/semicolon.ts create mode 100644 src/rules/converters/tests/semicolon.test.ts diff --git a/src/rules/converters.ts b/src/rules/converters.ts index 78b2b9e94..4910e8be2 100644 --- a/src/rules/converters.ts +++ b/src/rules/converters.ts @@ -99,6 +99,7 @@ import { convertPreferTemplate } from "./converters/prefer-template"; import { convertPromiseFunctionAsync } from "./converters/promise-function-async"; import { convertRadix } from "./converters/radix"; import { convertRestrictPlusOperands } from "./converters/restrict-plus-operands"; +import { semicolon } from "./converters/semicolon"; import { convertSpaceBeforeFunctionParen } from "./converters/space-before-function-paren"; import { convertSwitchDefault } from "./converters/switch-default"; import { convertTypedefWhitespace } from "./converters/typedef-whitespace"; @@ -217,6 +218,7 @@ export const converters = new Map([ ["quotemark", convertQuotemark], ["radix", convertRadix], ["restrict-plus-operands", convertRestrictPlusOperands], + ["semicolon", semicolon], ["space-before-function-paren", convertSpaceBeforeFunctionParen], ["switch-default", convertSwitchDefault], ["triple-equals", convertTripleEquals], diff --git a/src/rules/converters/semicolon.ts b/src/rules/converters/semicolon.ts new file mode 100644 index 000000000..175f28a0e --- /dev/null +++ b/src/rules/converters/semicolon.ts @@ -0,0 +1,53 @@ +import { RuleConverter } from "../converter"; + +// for reference, see here +// https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/semi.md +export const semicolon: RuleConverter = tslintRule => { + const getMultilineDelimiter = (strategy: "always" | "never") => { + if (strategy === "always") { + return "semi"; + } else { + return "none"; + } + }; + + const ignoreInterfaces = tslintRule.ruleArguments.includes("ignore-interfaces"); + const strictBoundClassMethods = tslintRule.ruleArguments.includes("strict-bound-class-methods"); + + return { + rules: [ + { + ruleName: "@typescript-eslint/semi", + ruleArguments: [tslintRule.ruleArguments[0]], + }, + ...(ignoreInterfaces + ? [] + : [ + { + ruleName: "@typescript-estlint/member-delimiter-style", + ruleArguments: [ + "error", + { + multiline: { + delimiter: getMultilineDelimiter(tslintRule.ruleArguments[0]), + requireLast: true, + }, + singleline: { + delimiter: "semi", + requireLast: false, + }, + }, + ], + }, + ]), + ], + notices: [ + "You must disable the base rule (semi) as it can report incorrect errors.", + ...(strictBoundClassMethods + ? [ + "Option `strict-bound-class-methods` was found, there is no exact equivalent yet supported.", + ] + : []), + ], + }; +}; diff --git a/src/rules/converters/tests/semicolon.test.ts b/src/rules/converters/tests/semicolon.test.ts new file mode 100644 index 000000000..3231be3c7 --- /dev/null +++ b/src/rules/converters/tests/semicolon.test.ts @@ -0,0 +1,207 @@ +import { semicolon } from "../semicolon"; + +describe("semicolon", () => { + test("conversion with always", () => { + const result = semicolon({ + ruleArguments: ["always"], + }); + + expect(result).toEqual({ + rules: [ + { + ruleName: "@typescript-eslint/semi", + ruleArguments: ["always"], + }, + { + ruleName: "@typescript-estlint/member-delimiter-style", + ruleArguments: [ + "error", + { + multiline: { + delimiter: "semi", + requireLast: true, + }, + singleline: { + delimiter: "semi", + requireLast: false, + }, + }, + ], + }, + ], + notices: ["You must disable the base rule (semi) as it can report incorrect errors."], + }); + }); + + test("conversion with never", () => { + const result = semicolon({ + ruleArguments: ["never"], + }); + + expect(result).toEqual({ + rules: [ + { + ruleName: "@typescript-eslint/semi", + ruleArguments: ["never"], + }, + { + ruleName: "@typescript-estlint/member-delimiter-style", + ruleArguments: [ + "error", + { + multiline: { + delimiter: "none", + requireLast: true, + }, + singleline: { + delimiter: "semi", + requireLast: false, + }, + }, + ], + }, + ], + notices: ["You must disable the base rule (semi) as it can report incorrect errors."], + }); + }); + + test("conversion with always and strict bound class methods", () => { + const result = semicolon({ + ruleArguments: ["always", "strict-bound-class-methods"], + }); + + expect(result).toEqual({ + rules: [ + { + ruleName: "@typescript-eslint/semi", + ruleArguments: ["always"], + }, + { + ruleName: "@typescript-estlint/member-delimiter-style", + ruleArguments: [ + "error", + { + multiline: { + delimiter: "semi", + requireLast: true, + }, + singleline: { + delimiter: "semi", + requireLast: false, + }, + }, + ], + }, + ], + notices: [ + "You must disable the base rule (semi) as it can report incorrect errors.", + "Option `strict-bound-class-methods` was found, there is no exact equivalent yet supported.", + ], + }); + }); + + test("conversion with never and strict bound class methods", () => { + const result = semicolon({ + ruleArguments: ["never", "strict-bound-class-methods"], + }); + + expect(result).toEqual({ + rules: [ + { + ruleName: "@typescript-eslint/semi", + ruleArguments: ["never"], + }, + { + ruleName: "@typescript-estlint/member-delimiter-style", + ruleArguments: [ + "error", + { + multiline: { + delimiter: "none", + requireLast: true, + }, + singleline: { + delimiter: "semi", + requireLast: false, + }, + }, + ], + }, + ], + notices: [ + "You must disable the base rule (semi) as it can report incorrect errors.", + "Option `strict-bound-class-methods` was found, there is no exact equivalent yet supported.", + ], + }); + }); + + test("conversion with always and ignore interfaces", () => { + const result = semicolon({ + ruleArguments: ["always", "ignore-interfaces"], + }); + + expect(result).toEqual({ + rules: [ + { + ruleName: "@typescript-eslint/semi", + ruleArguments: ["always"], + }, + ], + notices: ["You must disable the base rule (semi) as it can report incorrect errors."], + }); + }); + + test("conversion with never and ignore interfaces", () => { + const result = semicolon({ + ruleArguments: ["never", "ignore-interfaces"], + }); + + expect(result).toEqual({ + rules: [ + { + ruleName: "@typescript-eslint/semi", + ruleArguments: ["never"], + }, + ], + notices: ["You must disable the base rule (semi) as it can report incorrect errors."], + }); + }); + + test("conversion with always, strict bound class methods and ignore interfaces", () => { + const result = semicolon({ + ruleArguments: ["always", "ignore-interfaces", "strict-bound-class-methods"], + }); + + expect(result).toEqual({ + rules: [ + { + ruleName: "@typescript-eslint/semi", + ruleArguments: ["always"], + }, + ], + notices: [ + "You must disable the base rule (semi) as it can report incorrect errors.", + "Option `strict-bound-class-methods` was found, there is no exact equivalent yet supported.", + ], + }); + }); + + test("conversion with always, strict bound class methods and ignore interfaces", () => { + const result = semicolon({ + ruleArguments: ["never", "ignore-interfaces", "strict-bound-class-methods"], + }); + + expect(result).toEqual({ + rules: [ + { + ruleName: "@typescript-eslint/semi", + ruleArguments: ["never"], + }, + ], + notices: [ + "You must disable the base rule (semi) as it can report incorrect errors.", + "Option `strict-bound-class-methods` was found, there is no exact equivalent yet supported.", + ], + }); + }); +}); From 764e78609ec8f638f6cd10ff20950e8327a1450c Mon Sep 17 00:00:00 2001 From: Yash Kulshrestha Date: Sun, 6 Oct 2019 10:46:59 -0700 Subject: [PATCH 3/5] fixed an eslint issue with the build --- src/rules/converters/semicolon.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/rules/converters/semicolon.ts b/src/rules/converters/semicolon.ts index 175f28a0e..8b3918f06 100644 --- a/src/rules/converters/semicolon.ts +++ b/src/rules/converters/semicolon.ts @@ -6,9 +6,8 @@ export const semicolon: RuleConverter = tslintRule => { const getMultilineDelimiter = (strategy: "always" | "never") => { if (strategy === "always") { return "semi"; - } else { - return "none"; } + return "none"; }; const ignoreInterfaces = tslintRule.ruleArguments.includes("ignore-interfaces"); From 4a73c4627879e9297b45f26842ff5f8afa6df8d6 Mon Sep 17 00:00:00 2001 From: Yash Kulshrestha Date: Sun, 6 Oct 2019 11:03:16 -0700 Subject: [PATCH 4/5] fixed not following converter naming convention --- src/rules/converters.ts | 4 ++-- src/rules/converters/semicolon.ts | 2 +- src/rules/converters/tests/semicolon.test.ts | 20 ++++++++++---------- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/rules/converters.ts b/src/rules/converters.ts index 4910e8be2..8d1343148 100644 --- a/src/rules/converters.ts +++ b/src/rules/converters.ts @@ -99,7 +99,7 @@ import { convertPreferTemplate } from "./converters/prefer-template"; import { convertPromiseFunctionAsync } from "./converters/promise-function-async"; import { convertRadix } from "./converters/radix"; import { convertRestrictPlusOperands } from "./converters/restrict-plus-operands"; -import { semicolon } from "./converters/semicolon"; +import { convertSemicolon } from "./converters/semicolon"; import { convertSpaceBeforeFunctionParen } from "./converters/space-before-function-paren"; import { convertSwitchDefault } from "./converters/switch-default"; import { convertTypedefWhitespace } from "./converters/typedef-whitespace"; @@ -218,7 +218,7 @@ export const converters = new Map([ ["quotemark", convertQuotemark], ["radix", convertRadix], ["restrict-plus-operands", convertRestrictPlusOperands], - ["semicolon", semicolon], + ["semicolon", convertSemicolon], ["space-before-function-paren", convertSpaceBeforeFunctionParen], ["switch-default", convertSwitchDefault], ["triple-equals", convertTripleEquals], diff --git a/src/rules/converters/semicolon.ts b/src/rules/converters/semicolon.ts index 8b3918f06..288359a2d 100644 --- a/src/rules/converters/semicolon.ts +++ b/src/rules/converters/semicolon.ts @@ -2,7 +2,7 @@ import { RuleConverter } from "../converter"; // for reference, see here // https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/semi.md -export const semicolon: RuleConverter = tslintRule => { +export const convertSemicolon: RuleConverter = tslintRule => { const getMultilineDelimiter = (strategy: "always" | "never") => { if (strategy === "always") { return "semi"; diff --git a/src/rules/converters/tests/semicolon.test.ts b/src/rules/converters/tests/semicolon.test.ts index 3231be3c7..834e3c84a 100644 --- a/src/rules/converters/tests/semicolon.test.ts +++ b/src/rules/converters/tests/semicolon.test.ts @@ -1,8 +1,8 @@ -import { semicolon } from "../semicolon"; +import { convertSemicolon } from "../semicolon"; -describe("semicolon", () => { +describe(convertSemicolon, () => { test("conversion with always", () => { - const result = semicolon({ + const result = convertSemicolon({ ruleArguments: ["always"], }); @@ -34,7 +34,7 @@ describe("semicolon", () => { }); test("conversion with never", () => { - const result = semicolon({ + const result = convertSemicolon({ ruleArguments: ["never"], }); @@ -66,7 +66,7 @@ describe("semicolon", () => { }); test("conversion with always and strict bound class methods", () => { - const result = semicolon({ + const result = convertSemicolon({ ruleArguments: ["always", "strict-bound-class-methods"], }); @@ -101,7 +101,7 @@ describe("semicolon", () => { }); test("conversion with never and strict bound class methods", () => { - const result = semicolon({ + const result = convertSemicolon({ ruleArguments: ["never", "strict-bound-class-methods"], }); @@ -136,7 +136,7 @@ describe("semicolon", () => { }); test("conversion with always and ignore interfaces", () => { - const result = semicolon({ + const result = convertSemicolon({ ruleArguments: ["always", "ignore-interfaces"], }); @@ -152,7 +152,7 @@ describe("semicolon", () => { }); test("conversion with never and ignore interfaces", () => { - const result = semicolon({ + const result = convertSemicolon({ ruleArguments: ["never", "ignore-interfaces"], }); @@ -168,7 +168,7 @@ describe("semicolon", () => { }); test("conversion with always, strict bound class methods and ignore interfaces", () => { - const result = semicolon({ + const result = convertSemicolon({ ruleArguments: ["always", "ignore-interfaces", "strict-bound-class-methods"], }); @@ -187,7 +187,7 @@ describe("semicolon", () => { }); test("conversion with always, strict bound class methods and ignore interfaces", () => { - const result = semicolon({ + const result = convertSemicolon({ ruleArguments: ["never", "ignore-interfaces", "strict-bound-class-methods"], }); From 996d11e5535bce200053ed2635d0e69758ecbe9e Mon Sep 17 00:00:00 2001 From: Yash Kulshrestha Date: Sun, 6 Oct 2019 13:56:00 -0700 Subject: [PATCH 5/5] code review changes --- .vscode/settings.json | 7 ++----- src/rules/converters/semicolon.ts | 18 +++++++----------- src/rules/converters/tests/semicolon.test.ts | 16 ++++------------ 3 files changed, 13 insertions(+), 28 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index a42d383ec..d695c1f4c 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -2,11 +2,8 @@ "files.exclude": { "**/*.d.ts": true, "**/*.js.map": true, - "**/*.js": { - "when": "$(basename).ts" - } + "**/*.js": { "when": "$(basename).ts" } }, "prettier.ignorePath": ".prettierignore", - "typescript.tsdk": "node_modules/typescript/lib", - "editor.tabSize": 4 + "typescript.tsdk": "node_modules/typescript/lib" } diff --git a/src/rules/converters/semicolon.ts b/src/rules/converters/semicolon.ts index 288359a2d..e32d94898 100644 --- a/src/rules/converters/semicolon.ts +++ b/src/rules/converters/semicolon.ts @@ -1,7 +1,5 @@ import { RuleConverter } from "../converter"; -// for reference, see here -// https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/semi.md export const convertSemicolon: RuleConverter = tslintRule => { const getMultilineDelimiter = (strategy: "always" | "never") => { if (strategy === "always") { @@ -23,7 +21,7 @@ export const convertSemicolon: RuleConverter = tslintRule => { ? [] : [ { - ruleName: "@typescript-estlint/member-delimiter-style", + ruleName: "@typescript-eslint/member-delimiter-style", ruleArguments: [ "error", { @@ -40,13 +38,11 @@ export const convertSemicolon: RuleConverter = tslintRule => { }, ]), ], - notices: [ - "You must disable the base rule (semi) as it can report incorrect errors.", - ...(strictBoundClassMethods - ? [ - "Option `strict-bound-class-methods` was found, there is no exact equivalent yet supported.", - ] - : []), - ], + + notices: strictBoundClassMethods + ? [ + "Option `strict-bound-class-methods` was found, there is no exact equivalent yet supported.", + ] + : undefined, }; }; diff --git a/src/rules/converters/tests/semicolon.test.ts b/src/rules/converters/tests/semicolon.test.ts index 834e3c84a..95b8d8f50 100644 --- a/src/rules/converters/tests/semicolon.test.ts +++ b/src/rules/converters/tests/semicolon.test.ts @@ -13,7 +13,7 @@ describe(convertSemicolon, () => { ruleArguments: ["always"], }, { - ruleName: "@typescript-estlint/member-delimiter-style", + ruleName: "@typescript-eslint/member-delimiter-style", ruleArguments: [ "error", { @@ -29,7 +29,6 @@ describe(convertSemicolon, () => { ], }, ], - notices: ["You must disable the base rule (semi) as it can report incorrect errors."], }); }); @@ -45,7 +44,7 @@ describe(convertSemicolon, () => { ruleArguments: ["never"], }, { - ruleName: "@typescript-estlint/member-delimiter-style", + ruleName: "@typescript-eslint/member-delimiter-style", ruleArguments: [ "error", { @@ -61,7 +60,6 @@ describe(convertSemicolon, () => { ], }, ], - notices: ["You must disable the base rule (semi) as it can report incorrect errors."], }); }); @@ -77,7 +75,7 @@ describe(convertSemicolon, () => { ruleArguments: ["always"], }, { - ruleName: "@typescript-estlint/member-delimiter-style", + ruleName: "@typescript-eslint/member-delimiter-style", ruleArguments: [ "error", { @@ -94,7 +92,6 @@ describe(convertSemicolon, () => { }, ], notices: [ - "You must disable the base rule (semi) as it can report incorrect errors.", "Option `strict-bound-class-methods` was found, there is no exact equivalent yet supported.", ], }); @@ -112,7 +109,7 @@ describe(convertSemicolon, () => { ruleArguments: ["never"], }, { - ruleName: "@typescript-estlint/member-delimiter-style", + ruleName: "@typescript-eslint/member-delimiter-style", ruleArguments: [ "error", { @@ -129,7 +126,6 @@ describe(convertSemicolon, () => { }, ], notices: [ - "You must disable the base rule (semi) as it can report incorrect errors.", "Option `strict-bound-class-methods` was found, there is no exact equivalent yet supported.", ], }); @@ -147,7 +143,6 @@ describe(convertSemicolon, () => { ruleArguments: ["always"], }, ], - notices: ["You must disable the base rule (semi) as it can report incorrect errors."], }); }); @@ -163,7 +158,6 @@ describe(convertSemicolon, () => { ruleArguments: ["never"], }, ], - notices: ["You must disable the base rule (semi) as it can report incorrect errors."], }); }); @@ -180,7 +174,6 @@ describe(convertSemicolon, () => { }, ], notices: [ - "You must disable the base rule (semi) as it can report incorrect errors.", "Option `strict-bound-class-methods` was found, there is no exact equivalent yet supported.", ], }); @@ -199,7 +192,6 @@ describe(convertSemicolon, () => { }, ], notices: [ - "You must disable the base rule (semi) as it can report incorrect errors.", "Option `strict-bound-class-methods` was found, there is no exact equivalent yet supported.", ], });