-
Notifications
You must be signed in to change notification settings - Fork 0
/
prompt.js
72 lines (65 loc) · 1.6 KB
/
prompt.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import { confirm, input, select } from '@inquirer/prompts' // https://github.com/SBoudrias/Inquirer.js/
export async function prompt(questions, data = {}) {
for (const question of questions) {
const {
type = 'input',
name,
message,
when,
validate,
filter,
choices = [],
required = false,
before,
after,
} = question
if (when && !(await when(data))) continue
const defaultValue =
typeof question.default === 'boolean' ||
typeof question.default === 'string'
? question.default
: question.default instanceof Function
? await question.default(data)
: ''
let answer
if (before) await before(data)
try {
switch (type) {
case 'confirm':
answer = await confirm({
message,
default: defaultValue,
})
break
case 'select':
answer = await select({
message,
choices,
default: defaultValue,
})
break
case 'input':
answer = await input({
message,
validate,
default: defaultValue,
required,
})
break
default:
console.log('Unknown question type:', type)
break
}
} catch (e) {
// CTRL+C throws - Exit quietly
if (e.name !== 'ExitPromptError') {
console.error(e)
}
process.exit(1)
}
if (filter) answer = await filter(answer)
data[name] = answer
if (after) await after(data)
}
return data
}