UNPKG

1.6 kBJavaScriptView Raw
1var async = require('async')
2var inquirer = require('inquirer')
3var evaluate = require('./eval')
4
5// Support types from prompt-for which was used before
6var promptMapping = {
7 string: 'input',
8 boolean: 'confirm'
9}
10
11/**
12 * Ask questions, return results.
13 *
14 * @param {Object} prompts
15 * @param {Object} data
16 * @param {Function} done
17 */
18
19module.exports = function ask (prompts, data, done) {
20
21 async.eachSeries(Object.keys(prompts), function (key, next) {
22
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
38 // skip prompts whose when condition is not met
39 if (prompt.when && !evaluate(prompt.when, data)) {
40 return done()
41 }
42
43 var promptDefault = prompt.default
44 if (typeof prompt.default === 'function') {
45 promptDefault = function () {
46 return prompt.default.bind(this)(data)
47 }
48 }
49
50 inquirer.prompt([{
51 type: promptMapping[prompt.type] || prompt.type,
52 name: key,
53 message: prompt.message || prompt.label || key,
54 default: promptDefault,
55 choices: prompt.choices || [],
56 validate: prompt.validate || function () { return true }
57 }]).then( function (answers) {
58 if (Array.isArray(answers[key])) {
59 data[key] = {}
60 answers[key].forEach(function (multiChoiceAnswer) {
61 data[key][multiChoiceAnswer] = true
62 })
63 } else {
64 data[key] = answers[key]
65 }
66 done()
67 })
68}