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