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 };
|