From e54c4bd5558aa57ffc01fb96de8c1b38fbf51b14 Mon Sep 17 00:00:00 2001 From: melbarch Date: Mon, 7 Oct 2019 21:16:20 +0100 Subject: [PATCH 1/3] Add no-implicit-dependencies converter --- src/rules/converters.ts | 2 + .../converters/no-implicit-dependencies.ts | 21 +++++++ .../tests/no-implicit-dependencies.test.ts | 62 +++++++++++++++++++ 3 files changed, 85 insertions(+) create mode 100644 src/rules/converters/no-implicit-dependencies.ts create mode 100644 src/rules/converters/tests/no-implicit-dependencies.test.ts diff --git a/src/rules/converters.ts b/src/rules/converters.ts index d7846f633..0525e812d 100644 --- a/src/rules/converters.ts +++ b/src/rules/converters.ts @@ -53,6 +53,7 @@ import { convertNoExplicitAny } from "./converters/no-explicit-any"; import { convertNoFloatingPromises } from "./converters/no-floating-promises"; import { convertNoForIn } from "./converters/no-for-in"; import { convertNoForInArray } from "./converters/no-for-in-array"; +import { convertNoImplicitDependencies } from "./converters/no-implicit-dependencies"; import { convertNoInferrableTypes } from "./converters/no-inferrable-types"; import { convertNoInternalModule } from "./converters/no-internal-module"; import { convertNoInvalidRegexp } from "./converters/no-invalid-regexp"; @@ -180,6 +181,7 @@ export const converters = new Map([ ["no-eval", convertNoEval], ["no-floating-promises", convertNoFloatingPromises], ["no-for-in-array", convertNoForInArray], + ["no-implicit-dependencies", convertNoImplicitDependencies], ["no-for-in", convertNoForIn], ["no-inferrable-types", convertNoInferrableTypes], ["no-internal-module", convertNoInternalModule], diff --git a/src/rules/converters/no-implicit-dependencies.ts b/src/rules/converters/no-implicit-dependencies.ts new file mode 100644 index 000000000..f1ed33bb5 --- /dev/null +++ b/src/rules/converters/no-implicit-dependencies.ts @@ -0,0 +1,21 @@ +import { RuleConverter } from "../converter"; + +export const convertNoImplicitDependencies: RuleConverter = tslintRule => { + const ruleArgs = []; + + tslintRule.ruleArguments.forEach(element => { + if (element === "dev") { + ruleArgs.push({ devDependencies: false }); + } else if (element === "optional") { + ruleArgs.push({ optionalDependencies: false }); + } + }); + return { + rules: [ + { + ruleName: "import/no-extraneous-dependencies", + ...(ruleArgs.length > 0 && { ruleArguments: ruleArgs }), + }, + ], + }; +}; diff --git a/src/rules/converters/tests/no-implicit-dependencies.test.ts b/src/rules/converters/tests/no-implicit-dependencies.test.ts new file mode 100644 index 000000000..90a750642 --- /dev/null +++ b/src/rules/converters/tests/no-implicit-dependencies.test.ts @@ -0,0 +1,62 @@ +import { convertNoImplicitDependencies } from "../no-implicit-dependencies"; + +describe(convertNoImplicitDependencies, () => { + test("conversion without arguments", () => { + const result = convertNoImplicitDependencies({ + ruleArguments: [], + }); + + expect(result).toEqual({ + rules: [ + { + ruleName: "import/no-extraneous-dependencies", + }, + ], + }); + }); + + test("conversion with dev argument", () => { + const result = convertNoImplicitDependencies({ + ruleArguments: ["dev"], + }); + + expect(result).toEqual({ + rules: [ + { + ruleArguments: [{ devDependencies: false }], + ruleName: "import/no-extraneous-dependencies", + }, + ], + }); + }); + + test("conversion with optional argument", () => { + const result = convertNoImplicitDependencies({ + ruleArguments: ["optional"], + }); + + expect(result).toEqual({ + rules: [ + { + ruleArguments: [{ optionalDependencies: false }], + ruleName: "import/no-extraneous-dependencies", + }, + ], + }); + }); + + test("conversion with both dev and optional argument", () => { + const result = convertNoImplicitDependencies({ + ruleArguments: ["dev", "optional"], + }); + + expect(result).toEqual({ + rules: [ + { + ruleArguments: [{ devDependencies: false }, { optionalDependencies: false }], + ruleName: "import/no-extraneous-dependencies", + }, + ], + }); + }); +}); From 3c501121cab68a382e181b034f384fe16cb1a4b3 Mon Sep 17 00:00:00 2001 From: melbarch Date: Mon, 7 Oct 2019 21:22:03 +0100 Subject: [PATCH 2/3] Add whitelist support --- src/rules/converters/no-implicit-dependencies.ts | 2 ++ .../tests/no-implicit-dependencies.test.ts | 15 +++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/src/rules/converters/no-implicit-dependencies.ts b/src/rules/converters/no-implicit-dependencies.ts index f1ed33bb5..72572d12b 100644 --- a/src/rules/converters/no-implicit-dependencies.ts +++ b/src/rules/converters/no-implicit-dependencies.ts @@ -8,6 +8,8 @@ export const convertNoImplicitDependencies: RuleConverter = tslintRule => { ruleArgs.push({ devDependencies: false }); } else if (element === "optional") { ruleArgs.push({ optionalDependencies: false }); + } else { + ruleArgs.push({ devDependencies: element }); } }); return { diff --git a/src/rules/converters/tests/no-implicit-dependencies.test.ts b/src/rules/converters/tests/no-implicit-dependencies.test.ts index 90a750642..ce5f06316 100644 --- a/src/rules/converters/tests/no-implicit-dependencies.test.ts +++ b/src/rules/converters/tests/no-implicit-dependencies.test.ts @@ -59,4 +59,19 @@ describe(convertNoImplicitDependencies, () => { ], }); }); + + test("conversion with whitelisted folders argument", () => { + const result = convertNoImplicitDependencies({ + ruleArguments: [["src", "app"]], + }); + + expect(result).toEqual({ + rules: [ + { + ruleArguments: [{ devDependencies: ["src", "app"] }], + ruleName: "import/no-extraneous-dependencies", + }, + ], + }); + }); }); From ebb78f2a994d900b55cc98c60466cd264c6b3610 Mon Sep 17 00:00:00 2001 From: melbarch Date: Thu, 10 Oct 2019 20:42:22 +0100 Subject: [PATCH 3/3] Add plugin import and fix tsc issues --- src/rules/converters/no-implicit-dependencies.ts | 11 +++++++++-- .../converters/tests/no-implicit-dependencies.test.ts | 7 ++++++- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/rules/converters/no-implicit-dependencies.ts b/src/rules/converters/no-implicit-dependencies.ts index 72572d12b..a48552495 100644 --- a/src/rules/converters/no-implicit-dependencies.ts +++ b/src/rules/converters/no-implicit-dependencies.ts @@ -1,7 +1,10 @@ import { RuleConverter } from "../converter"; export const convertNoImplicitDependencies: RuleConverter = tslintRule => { - const ruleArgs = []; + const ruleArgs: { + [eslintOption in "devDependencies" | "optionalDependencies"]?: boolean + }[] = []; + const notices: string[] = []; tslintRule.ruleArguments.forEach(element => { if (element === "dev") { @@ -9,15 +12,19 @@ export const convertNoImplicitDependencies: RuleConverter = tslintRule => { } else if (element === "optional") { ruleArgs.push({ optionalDependencies: false }); } else { - ruleArgs.push({ devDependencies: element }); + notices.push("ESLint does not support whitelisting modules"); } }); + return { rules: [ { ruleName: "import/no-extraneous-dependencies", ...(ruleArgs.length > 0 && { ruleArguments: ruleArgs }), + ...(notices.length > 0 && { notices }), }, ], + + plugins: ["import"], }; }; diff --git a/src/rules/converters/tests/no-implicit-dependencies.test.ts b/src/rules/converters/tests/no-implicit-dependencies.test.ts index ce5f06316..8d97f2357 100644 --- a/src/rules/converters/tests/no-implicit-dependencies.test.ts +++ b/src/rules/converters/tests/no-implicit-dependencies.test.ts @@ -12,6 +12,7 @@ describe(convertNoImplicitDependencies, () => { ruleName: "import/no-extraneous-dependencies", }, ], + plugins: ["import"], }); }); @@ -27,6 +28,7 @@ describe(convertNoImplicitDependencies, () => { ruleName: "import/no-extraneous-dependencies", }, ], + plugins: ["import"], }); }); @@ -42,6 +44,7 @@ describe(convertNoImplicitDependencies, () => { ruleName: "import/no-extraneous-dependencies", }, ], + plugins: ["import"], }); }); @@ -57,6 +60,7 @@ describe(convertNoImplicitDependencies, () => { ruleName: "import/no-extraneous-dependencies", }, ], + plugins: ["import"], }); }); @@ -68,10 +72,11 @@ describe(convertNoImplicitDependencies, () => { expect(result).toEqual({ rules: [ { - ruleArguments: [{ devDependencies: ["src", "app"] }], + notices: ["ESLint does not support whitelisting modules"], ruleName: "import/no-extraneous-dependencies", }, ], + plugins: ["import"], }); }); });