1 | const { inquirer, logger, store } = require('sherry-utils')
|
2 | const resolveFrom = require('resolve-from')
|
3 | const renderTemplate = require('./utils/renderTemplate')
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 | module.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 | }
|