UNPKG

2.13 kBJavaScriptView Raw
1const semver = require('semver')
2const inquirer = require('inquirer')
3const validateName = require('validate-npm-package-name')
4
5const Defaults = require('./defaults')
6const { logger } = require('../common')
7
8const setNameValidate = item => {
9 const customValidate = item.validate
10 item.validate = input => {
11 const result = validateName(input)
12 if (!result.validForNewPackages) {
13 // istanbul ignore next
14 return `Sorry, ${(result.errors || []).concat(result.warnings || []).join(' and ')}.`
15 }
16 return typeof customValidate !== 'function' ? true : customValidate(input)
17 }
18}
19
20const setVersionValidate = item => {
21 const customValidate = item.validate
22 item.validate = input => {
23 const result = semver.valid(input)
24 if (!result) {
25 return `Sorry, The '${input}' is not a semantic version.`
26 }
27 return typeof customValidate !== 'function' ? true : customValidate(input)
28 }
29}
30
31/**
32 * Ask Questions
33 * @param {Object} prompts prompts
34 * @param {String} dest destination path
35 * @param {Boolean} save save anwsers
36 */
37module.exports = async (prompts, dest, save = false) => {
38 const defaultPrompts = { name: { type: 'input', message: 'name' } }
39 prompts = Object.assign(defaultPrompts, prompts)
40
41 // defaults
42 const defaults = await Defaults.init(dest)
43
44 // set prompt defaults
45 for (const name in prompts) {
46 const item = prompts[name]
47 if ('default' in item) continue
48
49 const def = defaults[name]
50 if (def === undefined) continue
51
52 item.default = typeof def === 'function'
53 ? def.bind(defaults)
54 : def
55 }
56
57 // set prompt validates
58 for (const name in prompts) {
59 if (name === 'name') {
60 setNameValidate(prompts[name])
61 } else if (name === 'version') {
62 setVersionValidate(prompts[name])
63 }
64 }
65
66 // clear console
67 logger.clear()
68 logger.log('\n🍭 Press ^C at any time to quit.\n')
69
70 const questions = Object.keys(prompts).map(key => Object.assign({}, prompts[key], { name: key }))
71
72 const answers = await inquirer.prompt(questions)
73
74 // save this answers
75 save && await Defaults.save(answers)
76
77 return answers
78}