3 let Prompt = module.exports;
6 * @param {String} query
7 * @param {Object} [options]
8 * @param {Array<String>} [options.choices]
9 * @param {Boolean} [options.mask]
11 Prompt.prompt = async function (query, options) {
12 let Readline = require("readline");
15 if (options?.choices) {
17 * @param {String} line
19 completer = function (line) {
20 let completions = options.choices || [];
21 let hits = completions.filter(function (c) {
22 return c.startsWith(line);
31 let rl = Readline.createInterface({
33 output: process.stdout,
39 rl.input.on("keypress", function (_char, _modifiers) {
41 // _modifiers = { sequence: 'e', name: 'e', ctrl: false, meta: false, shift: false }
42 let len = rl.line.length;
43 // place cursor at the beginning of the prompt
45 Readline.moveCursor(rl.output, -len, 0);
46 // clear right of the cursor / prompt
48 Readline.clearLine(rl.output, 1);
51 rl.output.write("*".repeat(len));
55 let answer = await new Promise(function (resolve) {
56 return rl.question(query ?? "", resolve);
59 // TODO what if we need control over closing?
60 // ex: Promise.race([getPrompt, getFsEvent, getSocketEvent]);