31 lines
1.1 KiB
TypeScript
31 lines
1.1 KiB
TypeScript
import { stdin as input, stdout as output } from "node:process";
|
|
import { createInterface } from "node:readline/promises";
|
|
|
|
export async function promptText(question: string, defaultValue = ""): Promise<string> {
|
|
if (!input.isTTY || !output.isTTY) {
|
|
throw new Error("feynman setup requires an interactive terminal.");
|
|
}
|
|
const rl = createInterface({ input, output });
|
|
try {
|
|
const suffix = defaultValue ? ` [${defaultValue}]` : "";
|
|
const value = (await rl.question(`${question}${suffix}: `)).trim();
|
|
return value || defaultValue;
|
|
} finally {
|
|
rl.close();
|
|
}
|
|
}
|
|
|
|
export async function promptChoice(question: string, choices: string[], defaultIndex = 0): Promise<number> {
|
|
console.log(question);
|
|
for (const [index, choice] of choices.entries()) {
|
|
const marker = index === defaultIndex ? "*" : " ";
|
|
console.log(` ${marker} ${index + 1}. ${choice}`);
|
|
}
|
|
const answer = await promptText("Select", String(defaultIndex + 1));
|
|
const parsed = Number(answer);
|
|
if (!Number.isFinite(parsed) || parsed < 1 || parsed > choices.length) {
|
|
return defaultIndex;
|
|
}
|
|
return parsed - 1;
|
|
}
|