From 4c0b70b869c16647f7af6de9d5c5479fc19f49db Mon Sep 17 00:00:00 2001 From: Pig Fang Date: Sat, 31 Aug 2019 03:12:20 +0800 Subject: [PATCH] New: support TypeScript at config initializer (fixes #11789) (#12172) * New: support TypeScript at config initializer (fixes #11789) * fix lint * tiny fixes --- lib/init/config-initializer.js | 29 ++++++++++++++++++++ tests/lib/init/config-initializer.js | 40 ++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+) diff --git a/lib/init/config-initializer.js b/lib/init/config-initializer.js index 17aa96505a3..2e47e902c77 100644 --- a/lib/init/config-initializer.js +++ b/lib/init/config-initializer.js @@ -120,6 +120,12 @@ function getModulesList(config, installESLint) { } } + const parser = config.parser || (config.parserOptions && config.parserOptions.parser); + + if (parser) { + modules[parser] = "latest"; + } + if (installESLint === false) { delete modules.eslint; } else { @@ -291,6 +297,20 @@ function processAnswers(answers) { config.extends.push("plugin:vue/essential"); } + if (answers.typescript) { + if (answers.framework === "vue") { + config.parserOptions.parser = "@typescript-eslint/parser"; + } else { + config.parser = "@typescript-eslint/parser"; + } + + if (Array.isArray(config.plugins)) { + config.plugins.push("@typescript-eslint"); + } else { + config.plugins = ["@typescript-eslint"]; + } + } + // setup rules based on problems/style enforcement preferences if (answers.purpose === "problems") { config.extends.unshift("eslint:recommended"); @@ -306,6 +326,9 @@ function processAnswers(answers) { config = autoconfig.extendFromRecommended(config); } } + if (answers.typescript && config.extends.includes("eslint:recommended")) { + config.extends.push("plugin:@typescript-eslint/eslint-recommended"); + } // normalize extends if (config.extends.length === 0) { @@ -465,6 +488,12 @@ function promptUser() { { name: "None of these", value: "none" } ] }, + { + type: "confirm", + name: "typescript", + message: "Does your project use TypeScript?", + default: false + }, { type: "checkbox", name: "env", diff --git a/tests/lib/init/config-initializer.js b/tests/lib/init/config-initializer.js index 4ee6ff6b732..ed2388fd568 100644 --- a/tests/lib/init/config-initializer.js +++ b/tests/lib/init/config-initializer.js @@ -168,6 +168,24 @@ describe("configInitializer", () => { assert.deepStrictEqual(config.extends, ["eslint:recommended", "plugin:vue/essential"]); }); + it("should enable typescript parser and plugin", () => { + answers.typescript = true; + const config = init.processAnswers(answers); + + assert.strictEqual(config.parser, "@typescript-eslint/parser"); + assert.deepStrictEqual(config.plugins, ["@typescript-eslint"]); + assert.deepStrictEqual(config.extends, ["eslint:recommended", "plugin:@typescript-eslint/eslint-recommended"]); + }); + + it("should enable typescript parser and plugin with vue", () => { + answers.framework = "vue"; + answers.typescript = true; + const config = init.processAnswers(answers); + + assert.strictEqual(config.parserOptions.parser, "@typescript-eslint/parser"); + assert.deepStrictEqual(config.plugins, ["vue", "@typescript-eslint"]); + }); + it("should extend eslint:recommended", () => { const config = init.processAnswers(answers); @@ -317,6 +335,28 @@ describe("configInitializer", () => { assert.include(modules, "eslint-plugin-vue@latest"); assert.include(modules, "eslint-config-standard@latest"); }); + + it("should support custom parser", () => { + const config = { + parser: "@typescript-eslint/parser" + }; + const modules = init.getModulesList(config); + + assert.include(modules, "@typescript-eslint/parser@latest"); + }); + + it("should support custom parser with Vue.js", () => { + const config = { + + // We should declare the parser at `parserOptions` when using with `eslint-plugin-vue`. + parserOptions: { + parser: "@typescript-eslint/parser" + } + }; + const modules = init.getModulesList(config); + + assert.include(modules, "@typescript-eslint/parser@latest"); + }); }); describe("auto", () => {