From 5601ffdf7d831e060e7e5958ea8fa293b4fd31a9 Mon Sep 17 00:00:00 2001 From: Daniel Supplieth Date: Fri, 4 Oct 2019 19:41:50 +0200 Subject: [PATCH 1/4] Add missing converter: file-name-casing Linked to issue: #161 --- src/rules/converters.ts | 2 + src/rules/converters/file-name-casing.ts | 56 ++++++++++++ .../converters/tests/file-name-casing.test.ts | 91 +++++++++++++++++++ 3 files changed, 149 insertions(+) create mode 100644 src/rules/converters/file-name-casing.ts create mode 100644 src/rules/converters/tests/file-name-casing.test.ts diff --git a/src/rules/converters.ts b/src/rules/converters.ts index 96a036500..db091d4d1 100644 --- a/src/rules/converters.ts +++ b/src/rules/converters.ts @@ -13,6 +13,7 @@ import { convertCurly } from "./converters/curly"; import { convertCyclomaticComplexity } from "./converters/cyclomatic-complexity"; import { convertEofline } from "./converters/eofline"; import { convertMemberAccess } from "./converters/member-access"; +import { convertFileNameCasing } from "./converters/file-name-casing"; import { convertForin } from "./converters/forin"; import { convertFunctionConstructor } from "./converters/function-constructor"; import { convertIncrementDecrement } from "./converters/increment-decrement"; @@ -123,6 +124,7 @@ export const converters = new Map([ ["callable-types", convertCallableTypes], ["class-name", convertClassName], ["eofline", convertEofline], + ["file-name-casing", convertFileNameCasing], ["forin", convertForin], ["function-constructor", convertFunctionConstructor], ["indent", convertIndent], diff --git a/src/rules/converters/file-name-casing.ts b/src/rules/converters/file-name-casing.ts new file mode 100644 index 000000000..7a3247e59 --- /dev/null +++ b/src/rules/converters/file-name-casing.ts @@ -0,0 +1,56 @@ +import { RuleConverter } from "../converter"; + +const IGNORE_CASE_NOTICE = "ESLint (Unicorn plugin) does not support ignore as case"; +export const convertFileNameCasing: RuleConverter = tslintRule => { + return { + rules: [ + { + ruleName: "unicorn/filename-case", + ...collectArguments(tslintRule.ruleArguments), + }, + ], + plugins: ["unicorn"], + }; +}; + +const collectArguments = (ruleArguments: any[]) => { + const notices: string[] = []; + let casesMap = new Map(); + casesMap.set("camel-case", "camelCase"); + casesMap.set("pascal-case", "pascalCase"); + casesMap.set("kebab-case", "kebabCase"); + casesMap.set("snake-case", "snakeCase"); + let foundCases: { [k: string]: any } = {}; + + if (ruleArguments.length === 0 || ruleArguments[0] === false || ruleArguments.length < 2) { + return undefined; + } + + let casings = ruleArguments[1]; + if (typeof casings === "string") { + if (casings === "ignore") { + notices.push(IGNORE_CASE_NOTICE); + } else { + foundCases[casesMap.get(casings)] = true; + } + } + + if (ruleArguments[1] instanceof Object) { + for (let casing in casings) { + if (casings[casing] === "ignore") { + notices.push(IGNORE_CASE_NOTICE); + } else { + foundCases[casesMap.get(casings[casing])] = true; + } + } + } + + return { + ...(notices.length > 0 && { notices }), + ruleArguments: [ + { + cases: foundCases, + }, + ], + }; +}; diff --git a/src/rules/converters/tests/file-name-casing.test.ts b/src/rules/converters/tests/file-name-casing.test.ts new file mode 100644 index 000000000..7668ff427 --- /dev/null +++ b/src/rules/converters/tests/file-name-casing.test.ts @@ -0,0 +1,91 @@ +import { convertFileNameCasing } from "../file-name-casing"; + +describe(convertFileNameCasing, () => { + test("conversion without string value", () => { + const result = convertFileNameCasing({ + ruleArguments: [true, "camel-case"], + }); + + expect(result).toEqual({ + rules: [ + { + ruleName: "unicorn/filename-case", + ruleArguments: [ + { + cases: { + camelCase: true, + }, + }, + ], + }, + ], + plugins: ["unicorn"], + }); + }); + + test("conversion with object for filetypes", () => { + const result = convertFileNameCasing({ + ruleArguments: [true, { ".ts": "ignore", ".tsx": "pascal-case", ".js": "snake-case" }], + }); + + expect(result).toEqual({ + rules: [ + { + notices: ["ESLint (Unicorn plugin) does not support ignore as case"], + ruleName: "unicorn/filename-case", + ruleArguments: [ + { + cases: { + snakeCase: true, + pascalCase: true, + }, + }, + ], + }, + ], + plugins: ["unicorn"], + }); + }); + + test("conversion with ignore as case", () => { + const result = convertFileNameCasing({ + ruleArguments: [true, "ignore"], + }); + + expect(result).toEqual({ + rules: [ + { + notices: ["ESLint (Unicorn plugin) does not support ignore as case"], + ruleName: "unicorn/filename-case", + ruleArguments: [ + { + cases: {}, + }, + ], + }, + ], + plugins: ["unicorn"], + }); + }); + + test("conversion with ignore in object", () => { + const result = convertFileNameCasing({ + ruleArguments: [true, { ".ts": "ignore" }], + }); + + expect(result).toEqual({ + rules: [ + { + notices: ["ESLint (Unicorn plugin) does not support ignore as case"], + ruleName: "unicorn/filename-case", + ruleArguments: [ + { + cases: {}, + }, + ], + }, + ], + plugins: ["unicorn"], + }); + }); +}); From 82106708f641fbe4fa07c9c95495a04923fa00de Mon Sep 17 00:00:00 2001 From: Daniel Supplieth Date: Fri, 4 Oct 2019 20:20:26 +0200 Subject: [PATCH 2/4] Add test case for coverage --- .../converters/tests/file-name-casing.test.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/rules/converters/tests/file-name-casing.test.ts b/src/rules/converters/tests/file-name-casing.test.ts index 7668ff427..091855959 100644 --- a/src/rules/converters/tests/file-name-casing.test.ts +++ b/src/rules/converters/tests/file-name-casing.test.ts @@ -1,6 +1,21 @@ import { convertFileNameCasing } from "../file-name-casing"; describe(convertFileNameCasing, () => { + test("conversion without parameter", () => { + const result = convertFileNameCasing({ + ruleArguments: [], + }); + + expect(result).toEqual({ + rules: [ + { + ruleName: "unicorn/filename-case", + }, + ], + plugins: ["unicorn"], + }); + }); + test("conversion without string value", () => { const result = convertFileNameCasing({ ruleArguments: [true, "camel-case"], From d8c1bfe8e825ff7e74f041a29ff25d0cf4c2ad83 Mon Sep 17 00:00:00 2001 From: Daniel Supplieth Date: Fri, 4 Oct 2019 20:23:07 +0200 Subject: [PATCH 3/4] Fix linting issues --- src/rules/converters/file-name-casing.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/rules/converters/file-name-casing.ts b/src/rules/converters/file-name-casing.ts index 7a3247e59..3e471bef4 100644 --- a/src/rules/converters/file-name-casing.ts +++ b/src/rules/converters/file-name-casing.ts @@ -15,18 +15,18 @@ export const convertFileNameCasing: RuleConverter = tslintRule => { const collectArguments = (ruleArguments: any[]) => { const notices: string[] = []; - let casesMap = new Map(); + const casesMap = new Map(); casesMap.set("camel-case", "camelCase"); casesMap.set("pascal-case", "pascalCase"); casesMap.set("kebab-case", "kebabCase"); casesMap.set("snake-case", "snakeCase"); - let foundCases: { [k: string]: any } = {}; + const foundCases: { [k: string]: any } = {}; if (ruleArguments.length === 0 || ruleArguments[0] === false || ruleArguments.length < 2) { return undefined; } - let casings = ruleArguments[1]; + const casings = ruleArguments[1]; if (typeof casings === "string") { if (casings === "ignore") { notices.push(IGNORE_CASE_NOTICE); @@ -36,7 +36,7 @@ const collectArguments = (ruleArguments: any[]) => { } if (ruleArguments[1] instanceof Object) { - for (let casing in casings) { + for (const casing in casings) { if (casings[casing] === "ignore") { notices.push(IGNORE_CASE_NOTICE); } else { From 405d57d18ea8b2343d070ad34a143edf9ad9973c Mon Sep 17 00:00:00 2001 From: Daniel Supplieth Date: Sat, 5 Oct 2019 10:04:28 +0200 Subject: [PATCH 4/4] Fixes after review. #161 * Add notice for changed behavior * Change map to object * Correct notice about the 'ignore' case * Specify map typing --- src/rules/converters/file-name-casing.ts | 23 +++++++++++-------- .../converters/tests/file-name-casing.test.ts | 12 +++++++--- 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/src/rules/converters/file-name-casing.ts b/src/rules/converters/file-name-casing.ts index 3e471bef4..ac83ebf09 100644 --- a/src/rules/converters/file-name-casing.ts +++ b/src/rules/converters/file-name-casing.ts @@ -1,6 +1,15 @@ import { RuleConverter } from "../converter"; -const IGNORE_CASE_NOTICE = "ESLint (Unicorn plugin) does not support ignore as case"; +const IGNORE_CASE_NOTICE = "ESLint (Unicorn plugin) does not support the 'ignore' case."; +const CASING_BY_FILETYPE_CHANGE = + "ESLint (Unicorn Plugin) does not support file name casing by file type, so all previously configured casings are now allowed."; +const CASES_MAP: { [s: string]: string } = { + "camel-case": "camelCase", + "pascal-case": "pascalCase", + "kebab-case": "kebabCase", + "snake-case": "snakeCase", +}; + export const convertFileNameCasing: RuleConverter = tslintRule => { return { rules: [ @@ -15,12 +24,7 @@ export const convertFileNameCasing: RuleConverter = tslintRule => { const collectArguments = (ruleArguments: any[]) => { const notices: string[] = []; - const casesMap = new Map(); - casesMap.set("camel-case", "camelCase"); - casesMap.set("pascal-case", "pascalCase"); - casesMap.set("kebab-case", "kebabCase"); - casesMap.set("snake-case", "snakeCase"); - const foundCases: { [k: string]: any } = {}; + const foundCases: { [k: string]: boolean } = {}; if (ruleArguments.length === 0 || ruleArguments[0] === false || ruleArguments.length < 2) { return undefined; @@ -31,16 +35,17 @@ const collectArguments = (ruleArguments: any[]) => { if (casings === "ignore") { notices.push(IGNORE_CASE_NOTICE); } else { - foundCases[casesMap.get(casings)] = true; + foundCases[CASES_MAP[casings]] = true; } } if (ruleArguments[1] instanceof Object) { + notices.push(CASING_BY_FILETYPE_CHANGE); for (const casing in casings) { if (casings[casing] === "ignore") { notices.push(IGNORE_CASE_NOTICE); } else { - foundCases[casesMap.get(casings[casing])] = true; + foundCases[CASES_MAP[casings[casing]]] = true; } } } diff --git a/src/rules/converters/tests/file-name-casing.test.ts b/src/rules/converters/tests/file-name-casing.test.ts index 091855959..e5672c477 100644 --- a/src/rules/converters/tests/file-name-casing.test.ts +++ b/src/rules/converters/tests/file-name-casing.test.ts @@ -46,7 +46,10 @@ describe(convertFileNameCasing, () => { expect(result).toEqual({ rules: [ { - notices: ["ESLint (Unicorn plugin) does not support ignore as case"], + notices: [ + "ESLint (Unicorn Plugin) does not support file name casing by file type, so all previously configured casings are now allowed.", + "ESLint (Unicorn plugin) does not support the 'ignore' case.", + ], ruleName: "unicorn/filename-case", ruleArguments: [ { @@ -70,7 +73,7 @@ describe(convertFileNameCasing, () => { expect(result).toEqual({ rules: [ { - notices: ["ESLint (Unicorn plugin) does not support ignore as case"], + notices: ["ESLint (Unicorn plugin) does not support the 'ignore' case."], ruleName: "unicorn/filename-case", ruleArguments: [ { @@ -91,7 +94,10 @@ describe(convertFileNameCasing, () => { expect(result).toEqual({ rules: [ { - notices: ["ESLint (Unicorn plugin) does not support ignore as case"], + notices: [ + "ESLint (Unicorn Plugin) does not support file name casing by file type, so all previously configured casings are now allowed.", + "ESLint (Unicorn plugin) does not support the 'ignore' case.", + ], ruleName: "unicorn/filename-case", ruleArguments: [ {