🌳
pt0/deployF/readlineF/guardPromptF.mts
1import readline from 'readline'
3export const doPrompt = async (promptStr: string) => {
4 const rl = readline.createInterface({ input: process.stdin, output: process.stdout })
5 const prompt = (query: string) => new Promise<string>((resolve) => rl.question(query, resolve))
7 const got = await prompt(promptStr)
8 rl.close()
9 return got
12export const guardPromptEq = async (promptStr: string, expected: string | number) => {
13 const got = await doPrompt(promptStr)
14 const expectedStr = expected.toString()
15 if (got != expectedStr) {
16 console.log('Aborted.', {expected: expectedStr, got})
17 process.exit(1)
18 }
21export const guardProdAction = ({
22 gpIsProd,
23 action,
24 name,
25 dangerousActions = ['delete', 'apply'],
26 warnOnlyActions = [],
27}: {
28 gpIsProd: boolean
29 action: string
30 name: string
31 dangerousActions?: string[]
32 warnOnlyActions?: string[]
33}) => {
34 if (!gpIsProd) return
36 const isWarnOnly = warnOnlyActions.includes(action)
37 const isDangerous = dangerousActions.includes(action)
39 if (!isDangerous && !isWarnOnly) return
41 if (isWarnOnly) {
42 console.log(`\nWARNING: ${action} on prod ${name}\n`)
43 return
44 }
46 return guardPromptEq(`\nWARNING: ${action} on prod ${name}. Enter ${name} to confirm: `, name)