diff --git a/packages/@vue/cli/lib/add.js b/packages/@vue/cli/lib/add.js index b846b55a85..918932a196 100644 --- a/packages/@vue/cli/lib/add.js +++ b/packages/@vue/cli/lib/add.js @@ -2,6 +2,7 @@ const chalk = require('chalk') const invoke = require('./invoke') const { loadOptions } = require('./options') const { installPackage } = require('./util/installDeps') +const { resolveModule } = require('./util/module') const { log, error, @@ -26,7 +27,12 @@ async function add (pluginName, options = {}, context = process.cwd()) { log(`${chalk.green('✔')} Successfully installed plugin: ${chalk.cyan(packageName)}`) log() - invoke(pluginName, options, context) + const generatorPath = resolveModule(`${packageName}/generator`, context) + if (generatorPath) { + invoke(pluginName, options, context) + } else { + log(`Plugin ${packageName} does not have a generator to invoke`) + } } module.exports = (...args) => { diff --git a/packages/@vue/cli/lib/invoke.js b/packages/@vue/cli/lib/invoke.js index b6481b9380..740e77f991 100644 --- a/packages/@vue/cli/lib/invoke.js +++ b/packages/@vue/cli/lib/invoke.js @@ -3,11 +3,11 @@ const path = require('path') const execa = require('execa') const chalk = require('chalk') const globby = require('globby') -const resolve = require('resolve') const inquirer = require('inquirer') const Generator = require('./Generator') const { loadOptions } = require('./options') const { installDeps } = require('./util/installDeps') +const { loadModule } = require('./util/module') const { log, error, @@ -18,16 +18,6 @@ const { resolvePluginId } = require('@vue/cli-shared-utils') -function load (request, context) { - let resolvedPath - try { - resolvedPath = resolve.sync(request, { basedir: context }) - } catch (e) {} - if (resolvedPath) { - return require(resolvedPath) - } -} - async function readFiles (context) { const files = await globby(['**'], { cwd: context, @@ -75,7 +65,7 @@ async function invoke (pluginName, options = {}, context = process.cwd()) { ) } - const pluginGenerator = load(`${id}/generator`, context) + const pluginGenerator = loadModule(`${id}/generator`, context) if (!pluginGenerator) { throw new Error(`Plugin ${id} does not have a generator.`) } @@ -83,7 +73,7 @@ async function invoke (pluginName, options = {}, context = process.cwd()) { // resolve options if no command line options are passed, and the plugin // contains a prompt module. if (!Object.keys(options).length) { - const pluginPrompts = load(`${id}/prompts`, context) + const pluginPrompts = loadModule(`${id}/prompts`, context) if (pluginPrompts) { options = await inquirer.prompt(pluginPrompts) } diff --git a/packages/@vue/cli/lib/util/module.js b/packages/@vue/cli/lib/util/module.js new file mode 100644 index 0000000000..08d3a490b5 --- /dev/null +++ b/packages/@vue/cli/lib/util/module.js @@ -0,0 +1,16 @@ +const resolve = require('resolve') + +exports.resolveModule = function resolveModule (request, context) { + let resolvedPath + try { + resolvedPath = resolve.sync(request, { basedir: context }) + } catch (e) {} + return resolvedPath +} + +exports.loadModule = function loadModule (request, context) { + const resolvedPath = exports.resolveModule(request, context) + if (resolvedPath) { + return require(resolvedPath) + } +}