wuchale
Version:
Protobuf-like i18n from normal code
57 lines • 1.82 kB
JavaScript
// $node %f wuchale
// @ts-check
import readline from 'readline';
import { color } from '../log.js';
export function setupInteractive() {
readline.emitKeypressEvents(process.stdin);
if (process.stdin.isTTY) {
process.stdin.setRawMode(true);
}
}
export async function ask(choices, question, logger) {
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
if (question) {
logger.log(question);
}
const data = {};
for (const [i, c] of choices.entries()) {
const key = i + 1;
logger.log(` ${color.cyan(key)}: ${c}`);
data[key] = c;
}
process.stdout.write(` > ${color.grey('(enter to select the first one)\x1b[3G')}`);
return new Promise((res, rej) => {
const select = (choice) => {
logger.log(` \x1b[K${color.cyan(choice)} selected\r`);
res(choice);
};
const listener = (_, key) => {
process.stdin.off('keypress', listener);
switch (key.name) {
case 'q':
case 'escape':
case 'c': // for Ctrl+C
rl.close();
rej();
break;
case 'return':
rl.close();
select(choices[0]);
break;
default:
rl.close();
if (key.name in data) {
select(data[key.name]);
return;
}
logger.warn(`Wrong key: ${color.cyan(key.name)}`);
ask(choices, question, logger).then(res, rej);
}
};
process.stdin.on('keypress', listener);
});
}
//# sourceMappingURL=input.js.map