From 02a365dc65a3d350e9c741e4c330eb90c228d6b2 Mon Sep 17 00:00:00 2001 From: Haoqun Jiang Date: Tue, 19 May 2020 20:41:06 +0800 Subject: [PATCH] feat(plugin-api): expose `inquirer` to prompts.js, allowing custom prompt types (#5498) --- __mocks__/inquirer.js | 8 ++++++-- packages/@vue/cli/lib/Creator.js | 22 +++++++++++++++++----- packages/@vue/cli/lib/invoke.js | 8 +++++--- 3 files changed, 28 insertions(+), 10 deletions(-) diff --git a/__mocks__/inquirer.js b/__mocks__/inquirer.js index 70384c8597..1ff8fa9c7b 100644 --- a/__mocks__/inquirer.js +++ b/__mocks__/inquirer.js @@ -7,7 +7,7 @@ exports.prompt = prompts => { const answers = {} let skipped = 0 - prompts.forEach((prompt, i) => { + prompts.forEach((prompt, index) => { if (prompt.when && !prompt.when(answers)) { skipped++ return @@ -25,7 +25,7 @@ exports.prompt = prompts => { : val } - const a = pendingAssertions[i - skipped] + const a = pendingAssertions[index - skipped] if (!a) { console.error(`no matching assertion for prompt:`, prompt) console.log(prompts) @@ -88,6 +88,10 @@ exports.prompt = prompts => { return Promise.resolve(answers) } +exports.createPromptModule = () => { + return exports.prompt +} + exports.expectPrompts = assertions => { pendingAssertions = assertions } diff --git a/packages/@vue/cli/lib/Creator.js b/packages/@vue/cli/lib/Creator.js index bdf21d14a1..4e712e120f 100644 --- a/packages/@vue/cli/lib/Creator.js +++ b/packages/@vue/cli/lib/Creator.js @@ -182,7 +182,7 @@ module.exports = class Creator extends EventEmitter { // run generator log(`🚀 Invoking generators...`) this.emit('creation', { event: 'invoking-generators' }) - const plugins = await this.resolvePlugins(preset.plugins) + const plugins = await this.resolvePlugins(preset.plugins, pkg) const generator = new Generator(context, { pkg, plugins, @@ -355,21 +355,33 @@ module.exports = class Creator extends EventEmitter { } // { id: options } => [{ id, apply, options }] - async resolvePlugins (rawPlugins) { + async resolvePlugins (rawPlugins, pkg) { // ensure cli-service is invoked first rawPlugins = sortObject(rawPlugins, ['@vue/cli-service'], true) const plugins = [] for (const id of Object.keys(rawPlugins)) { const apply = loadModule(`${id}/generator`, this.context) || (() => {}) let options = rawPlugins[id] || {} + if (options.prompts) { - const prompts = loadModule(`${id}/prompts`, this.context) - if (prompts) { + let pluginPrompts = loadModule(`${id}/prompts`, this.context) + + if (pluginPrompts) { + const prompt = inquirer.createPromptModule() + + if (typeof pluginPrompts === 'function') { + pluginPrompts = pluginPrompts(pkg, prompt) + } + if (typeof pluginPrompts.getPrompts === 'function') { + pluginPrompts = pluginPrompts.getPrompts(pkg, prompt) + } + log() log(`${chalk.cyan(options._isPreset ? `Preset options:` : id)}`) - options = await inquirer.prompt(prompts) + options = await prompt(pluginPrompts) } } + plugins.push({ id, apply, options }) } return plugins diff --git a/packages/@vue/cli/lib/invoke.js b/packages/@vue/cli/lib/invoke.js index 7f013138b2..ad82e7df26 100644 --- a/packages/@vue/cli/lib/invoke.js +++ b/packages/@vue/cli/lib/invoke.js @@ -68,13 +68,15 @@ async function invoke (pluginName, options = {}, context = process.cwd()) { } else if (!Object.keys(pluginOptions).length) { let pluginPrompts = loadModule(`${id}/prompts`, context) if (pluginPrompts) { + const prompt = inquirer.createPromptModule() + if (typeof pluginPrompts === 'function') { - pluginPrompts = pluginPrompts(pkg) + pluginPrompts = pluginPrompts(pkg, prompt) } if (typeof pluginPrompts.getPrompts === 'function') { - pluginPrompts = pluginPrompts.getPrompts(pkg) + pluginPrompts = pluginPrompts.getPrompts(pkg, prompt) } - pluginOptions = await inquirer.prompt(pluginPrompts) + pluginOptions = await prompt(pluginPrompts) } }