feat(plugin-api): expose inquirer to prompts.js, allowing custom prompt types (#5498)

This commit is contained in:
Haoqun Jiang
2020-05-19 20:41:06 +08:00
committed by GitHub
parent 0295ff6c8a
commit 02a365dc65
3 changed files with 28 additions and 10 deletions
+6 -2
View File
@@ -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
}
+17 -5
View File
@@ -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
+5 -3
View File
@@ -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)
}
}