UNPKG

2.13 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 let promptTransformer = prompt.transformer
50 if (typeof prompt.transformer === 'function') {
51 promptTransformer = function (input) {
52 return prompt.transformer.bind(this)(input, data)
53 }
54 }
55
56 let promptFilter = prompt.filter
57 if (typeof prompt.filter === 'function') {
58 promptFilter = function (input) {
59 return prompt.filter.bind(this)(input, data)
60 }
61 }
62
63 inquirer.prompt([{
64 type: promptMapping[prompt.type] || prompt.type,
65 name: key,
66 message: prompt.message || prompt.label || key,
67 default: promptDefault,
68 choices: prompt.choices || [],
69 validate: prompt.validate || (() => true),
70 transformer: promptTransformer,
71 filter: promptFilter
72 }]).then(answers => {
73 if (Array.isArray(answers[key])) {
74 data[key] = {}
75 answers[key].forEach(multiChoiceAnswer => {
76 data[key][multiChoiceAnswer] = true
77 })
78 }
79 else if (typeof answers[key] === 'string') {
80 data[key] = answers[key].replace(/"/g, '\\"')
81 }
82 else {
83 data[key] = answers[key]
84 }
85 done()
86 }).catch(done)
87}