UNPKG

1.68 kBJavaScriptView Raw
1// Following is adapted from Vue CLI v2 "init" command
2
3const async = require('async')
4const inquirer = require('inquirer')
5const evaluate = require('./eval')
6
7// Support types from prompt-for which was used before
8const promptMapping = {
9 string: 'input',
10 boolean: 'confirm'
11}
12
13/**
14 * Ask questions, return results.
15 *
16 * @param {Object} prompts
17 * @param {Object} data
18 * @param {Function} done
19 */
20
21module.exports = function ask (prompts, data, done) {
22 async.eachSeries(Object.keys(prompts), (key, next) => {
23 prompt(data, key, prompts[key], next)
24 }, done)
25}
26
27/**
28 * Inquirer prompt wrapper.
29 *
30 * @param {Object} data
31 * @param {String} key
32 * @param {Object} prompt
33 * @param {Function} done
34 */
35
36function prompt (data, key, prompt, done) {
37 // skip prompts whose when condition is not met
38 if (prompt.when && !evaluate(prompt.when, data)) {
39 return done()
40 }
41
42 let promptDefault = prompt.default
43 if (typeof prompt.default === 'function') {
44 promptDefault = function () {
45 return prompt.default.bind(this)(data)
46 }
47 }
48
49 inquirer.prompt([{
50 type: promptMapping[prompt.type] || prompt.type,
51 name: key,
52 message: prompt.message || prompt.label || key,
53 default: promptDefault,
54 choices: prompt.choices || [],
55 validate: prompt.validate || (() => true)
56 }]).then(answers => {
57 if (Array.isArray(answers[key])) {
58 data[key] = {}
59 answers[key].forEach(multiChoiceAnswer => {
60 data[key][multiChoiceAnswer] = true
61 })
62 }
63 else if (typeof answers[key] === 'string') {
64 data[key] = answers[key].replace(/"/g, '\\"')
65 }
66 else {
67 data[key] = answers[key]
68 }
69 done()
70 }).catch(done)
71}