diff --git a/lib/cli-engine/cli-engine.js b/lib/cli-engine/cli-engine.js index 81e1b07c83e..d7512fe3f36 100644 --- a/lib/cli-engine/cli-engine.js +++ b/lib/cli-engine/cli-engine.js @@ -20,6 +20,7 @@ const path = require("path"); const defaultOptions = require("../../conf/default-cli-options"); const pkg = require("../../package.json"); const ConfigOps = require("../shared/config-ops"); +const naming = require("../shared/naming"); const ModuleResolver = require("../shared/relative-module-resolver"); const { Linter } = require("../linter"); const builtInRules = require("../rules"); @@ -29,7 +30,6 @@ const { FileEnumerator } = require("./file-enumerator"); const hash = require("./hash"); const { IgnoredPaths } = require("./ignored-paths"); const LintResultCache = require("./lint-result-cache"); -const naming = require("./naming"); const debug = require("debug")("eslint:cli-engine"); const validFixTypes = new Set(["problem", "suggestion", "layout"]); diff --git a/lib/cli-engine/config-array-factory.js b/lib/cli-engine/config-array-factory.js index 782bb1d148f..95430c358df 100644 --- a/lib/cli-engine/config-array-factory.js +++ b/lib/cli-engine/config-array-factory.js @@ -38,9 +38,9 @@ const path = require("path"); const importFresh = require("import-fresh"); const stripComments = require("strip-json-comments"); const { validateConfigSchema } = require("../shared/config-validator"); +const naming = require("../shared/naming"); const ModuleResolver = require("../shared/relative-module-resolver"); const { ConfigArray, ConfigDependency, OverrideTester } = require("./config-array"); -const naming = require("./naming"); const debug = require("debug")("eslint:config-array-factory"); //------------------------------------------------------------------------------ diff --git a/lib/init/config-initializer.js b/lib/init/config-initializer.js index 4d52377d267..17aa96505a3 100644 --- a/lib/init/config-initializer.js +++ b/lib/init/config-initializer.js @@ -18,6 +18,7 @@ const util = require("util"), recConfig = require("../../conf/eslint-recommended"), ConfigOps = require("../shared/config-ops"), log = require("../shared/logging"), + naming = require("../shared/naming"), ModuleResolver = require("../shared/relative-module-resolver"), autoconfig = require("./autoconfig.js"), ConfigFile = require("./config-file"), @@ -97,17 +98,26 @@ function getModulesList(config, installESLint) { // Create a list of modules which should be installed based on config if (config.plugins) { for (const plugin of config.plugins) { - modules[`eslint-plugin-${plugin}`] = "latest"; + const moduleName = naming.normalizePackageName(plugin, "eslint-plugin"); + + modules[moduleName] = "latest"; } } - if (config.extends && config.extends.indexOf("eslint:") === -1) { - const moduleName = `eslint-config-${config.extends}`; - - modules[moduleName] = "latest"; - Object.assign( - modules, - getPeerDependencies(`${moduleName}@latest`) - ); + if (config.extends) { + const extendList = Array.isArray(config.extends) ? config.extends : [config.extends]; + + for (const extend of extendList) { + if (extend.startsWith("eslint:") || extend.startsWith("plugin:")) { + continue; + } + const moduleName = naming.normalizePackageName(extend, "eslint-config"); + + modules[moduleName] = "latest"; + Object.assign( + modules, + getPeerDependencies(`${moduleName}@latest`) + ); + } } if (installESLint === false) { diff --git a/lib/cli-engine/naming.js b/lib/shared/naming.js similarity index 100% rename from lib/cli-engine/naming.js rename to lib/shared/naming.js diff --git a/tests/lib/init/config-initializer.js b/tests/lib/init/config-initializer.js index 68cd06e1d1a..4ee6ff6b732 100644 --- a/tests/lib/init/config-initializer.js +++ b/tests/lib/init/config-initializer.js @@ -306,6 +306,17 @@ describe("configInitializer", () => { }); }); }); + + it("should support the standard style guide with Vue.js", () => { + const config = { + plugins: ["vue"], + extends: ["plugin:vue/essential", "standard"] + }; + const modules = init.getModulesList(config); + + assert.include(modules, "eslint-plugin-vue@latest"); + assert.include(modules, "eslint-config-standard@latest"); + }); }); describe("auto", () => { diff --git a/tests/lib/cli-engine/naming.js b/tests/lib/shared/naming.js similarity index 97% rename from tests/lib/cli-engine/naming.js rename to tests/lib/shared/naming.js index 3bc917baf1f..f6239dab1ea 100644 --- a/tests/lib/cli-engine/naming.js +++ b/tests/lib/shared/naming.js @@ -9,7 +9,7 @@ const assert = require("chai").assert, leche = require("leche"), - naming = require("../../../lib/cli-engine/naming"); + naming = require("../../../lib/shared/naming"); //------------------------------------------------------------------------------ // Tests