From ce585490c7d2fbc614705db920c85ace428790bb Mon Sep 17 00:00:00 2001 From: Evan You Date: Tue, 17 Jul 2018 17:07:12 -0400 Subject: [PATCH] fix: infer rootOptions for late invoked generators close #1820 --- packages/@vue/cli/lib/Generator.js | 7 +++-- .../@vue/cli/lib/util/inferRootOptions.js | 31 +++++++++++++++++++ 2 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 packages/@vue/cli/lib/util/inferRootOptions.js diff --git a/packages/@vue/cli/lib/Generator.js b/packages/@vue/cli/lib/Generator.js index 0d1357cd8..e614dabeb 100644 --- a/packages/@vue/cli/lib/Generator.js +++ b/packages/@vue/cli/lib/Generator.js @@ -3,6 +3,7 @@ const debug = require('debug') const GeneratorAPI = require('./GeneratorAPI') const sortObject = require('./util/sortObject') const writeFileTree = require('./util/writeFileTree') +const inferRootOptions = require('./util/inferRootOptions') const normalizeFilePaths = require('./util/normalizeFilePaths') const injectImportsAndOptions = require('./util/injectImportsAndOptions') const { toShortPluginId, matchesPluginId } = require('@vue/cli-shared-utils') @@ -86,10 +87,12 @@ module.exports = class Generator { this.exitLogs = [] const cliService = plugins.find(p => p.id === '@vue/cli-service') - const rootOptions = cliService && cliService.options + const rootOptions = cliService + ? cliService.options + : inferRootOptions(pkg) // apply generators from plugins plugins.forEach(({ id, apply, options }) => { - const api = new GeneratorAPI(id, this, options, rootOptions || {}) + const api = new GeneratorAPI(id, this, options, rootOptions) apply(api, options, rootOptions) }) } diff --git a/packages/@vue/cli/lib/util/inferRootOptions.js b/packages/@vue/cli/lib/util/inferRootOptions.js new file mode 100644 index 000000000..58c5a8428 --- /dev/null +++ b/packages/@vue/cli/lib/util/inferRootOptions.js @@ -0,0 +1,31 @@ +// Infer rootOptions for individual generators being invoked +// in an existing project. + +module.exports = function inferRootOptions (pkg) { + const rootOptions = {} + const deps = Object.assign({}, pkg.dependencies, pkg.devDependencies) + + // projectName + rootOptions.projectName = pkg.name + + // router + if ('vue-router' in deps) { + rootOptions.router = true + } + + // vuex + if ('vuex' in deps) { + rootOptions.vuex = true + } + + // cssPreprocessors + if ('sass-loader' in deps) { + rootOptions.cssPreprocessor = 'sass' + } else if ('less-loader' in deps) { + rootOptions.cssPreprocessor = 'less' + } else if ('stylus-loader' in deps) { + rootOptions.cssPreprocessor = 'stylus' + } + + return rootOptions +}