1 | const semver = require('semver')
|
2 | const inquirer = require('inquirer')
|
3 | const validateName = require('validate-npm-package-name')
|
4 |
|
5 | const Defaults = require('./defaults')
|
6 | const { logger } = require('../common')
|
7 |
|
8 | const setNameValidate = item => {
|
9 | const customValidate = item.validate
|
10 | item.validate = input => {
|
11 | const result = validateName(input)
|
12 | if (!result.validForNewPackages) {
|
13 |
|
14 | return `Sorry, ${(result.errors || []).concat(result.warnings || []).join(' and ')}.`
|
15 | }
|
16 | return typeof customValidate !== 'function' ? true : customValidate(input)
|
17 | }
|
18 | }
|
19 |
|
20 | const 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 |
|
33 |
|
34 |
|
35 |
|
36 |
|
37 | module.exports = async (prompts, dest, save = false) => {
|
38 | const defaultPrompts = { name: { type: 'input', message: 'name' } }
|
39 | prompts = Object.assign(defaultPrompts, prompts)
|
40 |
|
41 |
|
42 | const defaults = await Defaults.init(dest)
|
43 |
|
44 |
|
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 |
|
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 |
|
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 |
|
75 | save && await Defaults.save(answers)
|
76 |
|
77 | return answers
|
78 | }
|