UNPKG

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