45 lines
1.2 KiB
JavaScript
45 lines
1.2 KiB
JavaScript
const os = require("node:os");
|
|
const path = require("node:path");
|
|
const readline = require("node:readline");
|
|
const process = require("node:process");
|
|
|
|
function expandHome(p) {
|
|
if (!p) return p;
|
|
if (p.startsWith("~")) return path.join(os.homedir(), p.slice(1));
|
|
return p;
|
|
}
|
|
|
|
function createRl() {
|
|
return readline.createInterface({
|
|
input: process.stdin,
|
|
output: process.stdout,
|
|
});
|
|
}
|
|
|
|
function promptQuestion(question) {
|
|
return new Promise((resolve) => {
|
|
const rl = createRl();
|
|
rl.question(question, (answer) => {
|
|
rl.close();
|
|
resolve(answer);
|
|
});
|
|
});
|
|
}
|
|
|
|
async function promptYesNo(question, defaultYes = true) {
|
|
const suffix = defaultYes ? " [Y/n] " : " [y/N] ";
|
|
const ans = (await promptQuestion(`${question}${suffix}`)).trim().toLowerCase();
|
|
if (!ans) return defaultYes;
|
|
if (["y", "yes"].includes(ans)) return true;
|
|
if (["n", "no"].includes(ans)) return false;
|
|
return promptYesNo(question, defaultYes);
|
|
}
|
|
|
|
async function promptPath(question, defaultValue) {
|
|
const prompt = `${question}${defaultValue ? ` (default: ${defaultValue})` : ""}: `;
|
|
const ans = (await promptQuestion(prompt)).trim();
|
|
return expandHome(ans || defaultValue);
|
|
}
|
|
|
|
module.exports = { promptYesNo, promptPath, promptQuestion, expandHome };
|