fh-fhc
Version:
A Command Line Interface for FeedHenry
81 lines (74 loc) • 1.89 kB
JavaScript
/* globals i18n */
module.exports = prompt;
var buffer = "";
var tty = require("tty");
process.stdin.setRawMode = process.stdin.setRawMode || tty.setRawMode;
function prompt(p, def, silent, cb) {
if (!cb) {
cb = silent; silent = false;
}
if (!cb) {
cb = def; def = undefined;
}
if (def) {
p += "("+(silent ? "<hidden>" : def)+") ";
}
var r = (silent ? silentRead : read).bind(null, def, cb);
if (!process.stdout.write(p)) {
process.stdout.on("drain", function D() {
process.stdout.removeListener("drain", D);
r();
});
} else {
r();
}
}
function read(def, cb) {
var stdin = process.openStdin(), val = "";
stdin.resume();
stdin.setEncoding("utf8");
stdin.on("error", cb);
stdin.on("data", function D(chunk) {
val += buffer + chunk;
buffer = "";
val = val.replace(/\r/g, '');
if (val.indexOf("\n") !== -1) {
if (val !== "\n") {
val = val.replace(/^\n+/, "");
}
buffer = val.substr(val.indexOf("\n"));
val = val.substr(0, val.indexOf("\n"));
stdin.pause();
stdin.removeListener("data", D);
stdin.removeListener("error", cb);
val = val.trim() || def;
cb(null, val);
}
});
}
function silentRead(def, cb) {
var stdin = process.openStdin();
var val = "";
process.stdin.setRawMode(true);
stdin.resume();
stdin.on("error", cb);
stdin.on("data", function D(c) {
c = "" + c;
switch (c) {
case "\n": case "\r": case "\r\n": case "\u0004":
process.stdin.setRawMode(false);
stdin.removeListener("data", D);
stdin.removeListener("error", cb);
val = val.trim() || def;
process.stdout.write("\n");
stdin.pause();
return cb(null, val);
case "\u0003": case "\0":
return cb(i18n._("cancelled"));
default:
val += buffer + c;
buffer = "";
break;
}
});
}