diff --git a/packages/@vue/cli-service/lib/PluginAPI.js b/packages/@vue/cli-service/lib/PluginAPI.js index b5ee9b3a9f..23eda96ca6 100644 --- a/packages/@vue/cli-service/lib/PluginAPI.js +++ b/packages/@vue/cli-service/lib/PluginAPI.js @@ -166,8 +166,7 @@ class PluginAPI { } catch (e) { return fs.readFileSync(absolutePath, 'utf-8') } - } - else { + } else { return fs.readFileSync(absolutePath, 'utf-8') } } diff --git a/packages/@vue/cli-ui/apollo-server/connectors/plugins.js b/packages/@vue/cli-ui/apollo-server/connectors/plugins.js index 02c2575aa9..b33085f8c3 100644 --- a/packages/@vue/cli-ui/apollo-server/connectors/plugins.js +++ b/packages/@vue/cli-ui/apollo-server/connectors/plugins.js @@ -27,7 +27,8 @@ const { getPluginLink, resolveModule, loadModule, - clearModule + clearModule, + execa } = require('@vue/cli-shared-utils') const { progress: installProgress, @@ -35,7 +36,6 @@ const { uninstallPackage, updatePackage } = require('@vue/cli/lib/util/installDeps') -const invoke = require('@vue/cli/lib/invoke') const { getCommand } = require('../util/command') const ipc = require('../util/ipc') const { log } = require('../util/logger') @@ -446,7 +446,32 @@ function runInvoke (id, context) { currentPluginId = id // Allow plugins that don't have a generator if (resolveModule(`${id}/generator`, cwd.get())) { - await invoke(id, prompts.getAnswers(), cwd.get()) + const child = execa('vue', [ + 'invoke', + id, + '--$inlineOptions', + JSON.stringify(prompts.getAnswers()) + ], { + cwd: cwd.get(), + stdio: ['inherit', 'pipe', 'inherit'] + }) + + const onData = buffer => { + const text = buffer.toString().trim() + if (text) { + setProgress({ + info: text + }) + logs.add({ + type: 'info', + message: text + }, context) + } + } + + child.stdout.on('data', onData) + + await child } // Run plugin api runPluginApi(id, getApi(cwd.get()), context) diff --git a/packages/@vue/cli/lib/invoke.js b/packages/@vue/cli/lib/invoke.js index 02045cef34..38c5d1f641 100644 --- a/packages/@vue/cli/lib/invoke.js +++ b/packages/@vue/cli/lib/invoke.js @@ -84,8 +84,14 @@ async function invoke (pluginName, options = {}, context = process.cwd()) { // resolve options if no command line options (other than --registry) are passed, // and the plugin contains a prompt module. // eslint-disable-next-line prefer-const - let { registry, ...pluginOptions } = options - if (!Object.keys(pluginOptions).length) { + let { registry, $inlineOptions, ...pluginOptions } = options + if ($inlineOptions) { + try { + pluginOptions = JSON.parse($inlineOptions) + } catch (e) { + throw new Error(`Couldn't parse inline options JSON: ${e.message}`) + } + } else if (!Object.keys(pluginOptions).length) { let pluginPrompts = loadModule(`${id}/prompts`, context) if (pluginPrompts) { if (typeof pluginPrompts === 'function') {