extra-asciinema
Version:
asciinema is a terminal screen recorder.
164 lines (158 loc) • 5.18 kB
JavaScript
;
var path = require('path');
var cp = require('child_process');
var fs = require('fs');
var os = require('os');
function _interopNamespaceDefault(e) {
var n = Object.create(null);
if (e) {
Object.keys(e).forEach(function (k) {
if (k !== 'default') {
var d = Object.getOwnPropertyDescriptor(e, k);
Object.defineProperty(n, k, d.get ? d : {
enumerable: true,
get: function () { return e[k]; }
});
}
});
}
n.default = e;
return Object.freeze(n);
}
var path__namespace = /*#__PURE__*/_interopNamespaceDefault(path);
var cp__namespace = /*#__PURE__*/_interopNamespaceDefault(cp);
var fs__namespace = /*#__PURE__*/_interopNamespaceDefault(fs);
var os__namespace = /*#__PURE__*/_interopNamespaceDefault(os);
function escapePath(p) {
return p.replace(/[`$&{}[;|]/g, "");
}
function recCmd(f, o = null) {
var o = o || {};
if (o.input) {
var pth = escapePath(o.input);
var dir = path__namespace.dirname(pth);
var fil = path__namespace.basename(pth);
o.command = `cd "${dir}" && cat "${fil}" | node -i`;
}
o.overwrite = true;
o.yes = true;
var args = ["rec"];
if (f)
args.push(f);
if (o.stdin)
args.push("--stdin");
if (o.append)
args.push("--append");
if (o.raw)
args.push("--raw");
if (o.overwrite)
args.push("--overwrite");
if (o.command)
args.push("--command", o.command);
if (o.env)
args.push("-env", o.env);
if (o.title)
args.push("--title", o.title);
if (o.idleTimeLimit)
args.push("--idle-time-limit", "" + o.idleTimeLimit);
if (o.yes)
args.push("--yes");
if (o.quiet)
args.push("--quiet");
return args;
}
function rec(f = null, o = null, fn = null) {
var f = f || path__namespace.join(fs__namespace.mkdtempSync(path__namespace.join(os__namespace.tmpdir(), "asciinema-")), "0.cast");
var p = new Promise((fres, frej) => {
cp__namespace.execFile("asciinema", recCmd(f, o), { encoding: "utf8" }, (err) => {
if (err)
return frej(err);
fres(f);
});
});
return fn ? p.then(a => fn(null, a), fn) : p;
}
function recSync(f, o = null) {
var f = f || path__namespace.join(fs__namespace.mkdtempSync(path__namespace.join(os__namespace.tmpdir(), "asciinema-")), "0.cast");
cp__namespace.execFileSync("asciinema", recCmd(f, o), { encoding: "utf8" });
return f;
}
function cat(f, fn = null) {
var p = new Promise((fres, frej) => {
cp__namespace.execFile("asciinema", ["cat", f], { encoding: "utf8" }, (err, stdout) => {
if (err)
return frej(err);
fres(stdout);
});
});
return fn ? p.then(a => fn(null, a), fn) : p;
}
function catSync(f) {
return cp__namespace.execFileSync("asciinema", ["cat", f], { encoding: "utf8" });
}
function retimeData(d, o = null) {
var o = o || {};
var { input } = o, i = 0;
var output = "", t = o.delay || 0;
var rate = [o.outputRate || 0.1, o.inputRate || 0.1];
var delay = [o.outputDelay || 0.1, o.inputDelay || 1];
var oldState = 0, state = 0;
for (var l of d.split(/\r?\n/g)) {
if (l.startsWith("{") || l.trim() === "") {
output += l + "\n";
continue;
}
var [, , x] = JSON.parse(l);
var x1 = x.replace(/\r*\n/g, "\n");
if (input) {
var i1 = input.substring(i, i + x1.length);
i += x1 === i1 ? x1.length : 0;
state = x1 === i1 ? 1 : 0;
}
if (state !== oldState)
t += delay[state];
output += JSON.stringify([t, "o", x]) + "\n";
t += rate[state];
oldState = state;
if (!input) {
if (x.endsWith("\u001b[3G"))
state = 1;
else if (x === "\r\r\n")
state = 0;
}
}
return output;
}
async function retime(f, o = null) {
var d = await fs__namespace.promises.readFile(f, "utf8");
d = retimeData(d, o);
await fs__namespace.promises.writeFile(f, d);
}
function retimeSync(f, o = null) {
var d = fs__namespace.readFileSync(f, "utf8");
d = retimeData(d, o);
fs__namespace.writeFileSync(f, d);
}
function upload(f, fn = null) {
var p = new Promise((fres, frej) => {
cp__namespace.execFile("asciinema", ["upload", f], { encoding: "utf8" }, (err, stdout) => {
if (err)
return frej(err);
fres(stdout.replace(/.*?(https?:\S+).*/s, "$1"));
});
});
return fn ? p.then(a => fn(null, a), fn) : p;
}
function uploadSync(f) {
var stdout = cp__namespace.execFileSync("asciinema", ["upload", f], { encoding: "utf8" });
return stdout.replace(/.*?(https?:\S+).*/s, "$1");
}
exports.cat = cat;
exports.catSync = catSync;
exports.rec = rec;
exports.recSync = recSync;
exports.retime = retime;
exports.retimeData = retimeData;
exports.retimeSync = retimeSync;
exports.upload = upload;
exports.uploadSync = uploadSync;