/
prompt.ts
64 lines (57 loc) · 1.41 KB
/
prompt.ts
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
import path from 'path'
import fs from 'fs'
import type { Prompter } from './types'
import helpers from './helpers'
const hooksfiles = [
'index.js',
'index.ts',
'prompt.cjs',
'prompt.js',
'prompt.ts',
]
const prompt = async <Q, T>(
createPrompter: () => Prompter<Q, T>,
actionfolder: string,
args: Record<string, any>,
): Promise<T | object> => {
const hooksfile = hooksfiles
.map((f) => path.resolve(path.join(actionfolder, f)))
.find((f) => fs.existsSync(f))
if (!hooksfile) {
return Promise.resolve({})
}
const isTypeScriptHook = /\.ts$/.test(hooksfile)
// Lazily support TS hook files
if (isTypeScriptHook) {
require('ts-node/register/transpile-only')
}
// shortcircuit without prompter
let hooksModule = await import(hooksfile)
if (hooksModule.default) {
hooksModule = hooksModule.default
}
if (hooksModule.params) {
return hooksModule.params({ args, h: helpers })
}
// lazy loads prompter
// everything below requires it
const prompter = createPrompter()
if (hooksModule.prompt) {
return hooksModule.prompt({
prompter,
inquirer: prompter,
args,
h: helpers,
})
}
return prompter.prompt(
// prompt _only_ for things we've not seen on the CLI
hooksModule.filter(
(p) =>
args[p.name] === undefined ||
args[p.name] === null ||
args[p.name].length === 0,
),
)
}
export default prompt