UNPKG

1.95 kBJavaScriptView Raw
1const inquirer = require('inquirer')
2const resolveFrom = require('resolve-from')
3const logger = require('./logger')
4const store = require('./store')
5const renderTemplate = require('./utils/renderTemplate')
6
7/**
8 * @param {Object} config
9 * @param {Object} context
10 */
11module.exports = async (config, context) => {
12 const prompts =
13 typeof config.prompts === 'function'
14 ? await config.prompts.call(context, context)
15 : config.prompts
16
17 const pkgPath = resolveFrom.silent(context.generator.path, './package.json')
18 const pkgVersion = pkgPath ? require(pkgPath).version : ''
19 const STORED_ANSWERS_ID = `answers.${context.generator.hash +
20 '__npm__' +
21 pkgVersion.replace(/\./g, '\\.')}`
22 const storedAnswers = store.get(STORED_ANSWERS_ID) || {}
23
24 const { mock, yes } = context.sao.opts
25 if (!mock) {
26 logger.debug('Reusing cached answers:', storedAnswers)
27 }
28
29 if (yes) {
30 logger.warn(
31 `The yes flag has been set. This will automatically answer default value to all questions, which may have security implications.`
32 )
33 }
34
35 const prompt =
36 mock || yes
37 ? require('./utils/mockPrompt')(mock && mock.answers)
38 : inquirer.prompt.bind(inquirer)
39 const answers = await prompt(
40 prompts.map(p => {
41 if (typeof p.default === 'string') {
42 p.default = renderTemplate(p.default, context)
43 }
44 if (!mock && p.store && storedAnswers[p.name] !== undefined) {
45 p.default = storedAnswers[p.name]
46 }
47 return p
48 })
49 )
50
51 logger.debug(`Retrived answers:`, answers)
52
53 const answersToStore = {}
54 for (const p of prompts) {
55 if (!Object.prototype.hasOwnProperty.call(answers, p.name)) {
56 answers[p.name] = undefined
57 }
58 if (p.store) {
59 answersToStore[p.name] = answers[p.name]
60 }
61 }
62 if (!mock) {
63 store.set(STORED_ANSWERS_ID, answersToStore)
64 logger.debug('Cached prompt answers:', answersToStore)
65 }
66
67 context._answers = answers
68}