@jawis/stdio-filter
Version:
Filter the stdio from console applications.
148 lines (147 loc) • 6.17 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.makeAnsiParser = void 0;
const node_ansiparser_1 = __importDefault(require("node-ansiparser"));
const _jab_1 = require("^jab");
/**
*
*/
const makeAnsiParser = (callbacks) => {
const rawCallbacks = {
inst_p: (str) => {
(0, _jab_1.assert)((0, _jab_1.isString)(str));
callbacks.onPrint(str);
},
inst_x: function (flag) {
// C0 or C1 control codes: https://en.wikipedia.org/wiki/C0_and_C1_control_codes
(0, _jab_1.assert)((0, _jab_1.isString)(flag));
(0, _jab_1.assert)(flag.length === 1);
// eslint-disable-next-line no-control-regex
(0, _jab_1.assert)(flag.match(/^[\x00-\x1F\x80-\x9F]$/) !== null);
switch (flag) {
case "\x00":
case "\t":
callbacks.onPrint(flag);
break;
case "\r":
callbacks.onAction2("erase-to-beginning");
break;
case "\n":
callbacks.onAction("down-beginning", 1);
break;
default:
console.log("unknown control code", flag.charCodeAt(0));
break;
}
},
/**
*
*
* @see https://en.wikipedia.org/wiki/ANSI_escape_code#CSI_(Control_Sequence_Introducer)_sequences
*
* todo
* - it seems the defaults are not quite right.
*/
inst_c: function (collected, params, flag) {
(0, _jab_1.assert)(collected === "" || collected === "=" || collected === "?", "unknown", { collected }); // prettier-ignore
switch (flag) {
case "A":
(0, _jab_1.assert)(params.length === 1);
(0, _jab_1.assert)((0, _jab_1.isInt)(params[0]));
callbacks.onAction("up", params[0] === 0 ? 1 : params[0]);
break;
case "B":
(0, _jab_1.assert)(params.length === 1);
(0, _jab_1.assert)((0, _jab_1.isInt)(params[0]));
callbacks.onAction("down", params[0] === 0 ? 1 : params[0]);
break;
case "C":
(0, _jab_1.assert)(params.length === 1);
(0, _jab_1.assert)((0, _jab_1.isInt)(params[0]));
callbacks.onAction("right", params[0] === 0 ? 1 : params[0]);
break;
case "D":
(0, _jab_1.assert)(params.length === 1);
(0, _jab_1.assert)((0, _jab_1.isInt)(params[0]));
callbacks.onAction("left", params[0] === 0 ? 1 : params[0]);
break;
case "E":
(0, _jab_1.assert)(params.length === 1);
(0, _jab_1.assert)((0, _jab_1.isInt)(params[0]));
callbacks.onAction("down-beginning", params[0] === 0 ? 1 : params[0]);
break;
case "F":
(0, _jab_1.assert)(params.length === 1);
(0, _jab_1.assert)((0, _jab_1.isInt)(params[0]));
callbacks.onAction("up-beginning", params[0] === 0 ? 1 : params[0]);
break;
case "G":
//default is 1. Zero from parser is not valid.
(0, _jab_1.assert)(params.length === 1);
(0, _jab_1.assert)((0, _jab_1.isInt)(params[0]));
callbacks.setPosition(params[0] === 0 ? 1 : params[0]);
break;
case "H": {
(0, _jab_1.assert)(params.length === 1 || params.length === 2);
const x = params[0] || 1; //turns both zero and undefined into default: 1
const y = params[1] || 1;
(0, _jab_1.assert)((0, _jab_1.isInt)(x));
(0, _jab_1.assert)((0, _jab_1.isInt)(y));
callbacks.setPosition(x, y);
break;
}
case "J":
throw new Error("clear display not supported");
case "K":
//works
(0, _jab_1.assert)(params.length === 1);
switch (params[0]) {
case 0:
console.log("erase-to-end");
break;
case 1:
console.log("erase-to-beginning");
break;
case 2:
console.log("erase-line");
break;
default:
throw new Error("unknown param");
}
break;
case "m": {
//params vary
const p = params.join(";");
console.log("\x1b[" + p + "m");
break;
}
case "S":
case "T":
throw new Error("scroll not supported");
default:
console.log("unknown csi", collected, params, flag);
break;
}
},
inst_o: function (s) {
console.log("unkonwn osc", s);
},
inst_e: function (collected, flag) {
console.log("unknown esc", collected, flag);
},
inst_H: function (collected, params, flag) {
console.log("dcs-Hook", collected, params, flag);
},
inst_P: function (dcs) {
console.log("dcs-Put", dcs);
},
inst_U: function () {
console.log("dcs-Unhook");
},
};
return new node_ansiparser_1.default(rawCallbacks);
};
exports.makeAnsiParser = makeAnsiParser;