jsev
Version:
Environment for building Web API's.
146 lines • 4.79 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const bunyan_1 = require("bunyan");
const chalk_1 = __importDefault(require("chalk"));
const lodash_1 = require("lodash");
const stream_1 = require("stream");
const util_1 = require("util");
const defaultOptions = {
omitFromDetails: [
"name",
"hostname",
"pid",
"level",
"component",
"msg",
"time",
"v",
"src",
"err",
"client_req",
"client_res",
"req",
"res",
"req_id",
"table",
],
showProcess: true,
showTime: true,
};
class ConsoleStream extends stream_1.Writable {
constructor(opts) {
super();
this.opts = { ...defaultOptions, ...opts };
}
write(data) {
const dataObj = typeof data === "string" ? JSON.parse(data) : data;
const output = this.format(dataObj);
/* tslint:disable:no-console */
if (dataObj.level < bunyan_1.INFO) {
console.log(output);
}
else if (dataObj.level < bunyan_1.WARN) {
console.info(output);
}
else if (dataObj.level < bunyan_1.ERROR) {
console.warn(output);
}
else {
console.error(output);
}
/* tslint:enable:no-console */
return true;
}
getDetails(data) {
const details = lodash_1.omit(data, this.opts.omitFromDetails);
const output = details && Object.keys(details).length > 0
? util_1.inspect(details, { colors: true })
: "";
return chalk_1.default.cyan(output);
}
getMessage(data) {
const { msg, level } = data;
if (level >= bunyan_1.FATAL) {
return chalk_1.default.bgRed.white(`FTL: ${msg}`);
}
else if (level >= bunyan_1.ERROR) {
return chalk_1.default.redBright(`ERR: ${msg}`);
}
else if (level >= bunyan_1.WARN) {
return chalk_1.default.yellow(`WRN: ${msg}`);
}
else if (level >= bunyan_1.INFO) {
return chalk_1.default.white(`INF: ${msg}`);
}
else if (level >= bunyan_1.DEBUG) {
return chalk_1.default.gray(`DBG: ${msg}`);
}
else if (level >= bunyan_1.TRACE) {
return chalk_1.default.green(`TRC: ${msg}`);
}
return msg;
}
getTable(data) {
const { table } = data;
if (!table) {
return "";
}
const widths = [];
const padDirections = [];
for (let i = 0; i < table.header.length; i++) {
let dir = 0;
const len = table.rows.reduce((a, x) => {
const cLen = x[i].toString().length;
if (!dir) {
dir = isNaN(Number(x[i])) ? 1 : -1;
}
return a > cLen ? a : cLen;
}, table.header[i].length);
widths.push(len);
padDirections.push(dir);
}
const tWidth = widths.reduce((a, x) => a + x + 2, 1);
const header = table.header.reduce((a, x, i) => `${a} ${chalk_1.default.bold.green(x.toString().padEnd(widths[i]))} |`, "|");
const rows = table.rows.reduce((ra, row, ri) => {
const r = row.reduce((a, x, i) => {
let c = x;
if (isNaN(Number(x))) {
c = c.toString().padEnd(widths[i]);
}
else {
c = chalk_1.default.magenta(c.toString().padStart(widths[i]));
}
return `${a} ${c} |`;
}, "|");
const startRow = ri === 0 ? "\t" : "\n\t";
return `${ra}${startRow}${r}`;
}, "");
const str = `
\t+${"-".repeat(tWidth)}+
\t${header}
\t+${"-".repeat(tWidth)}+
${rows}
\t+${"-".repeat(tWidth)}+
`;
return str;
}
getError(data) {
return data.err ? chalk_1.default.red(`\n${data.err.stack}`) : "";
}
format(data) {
const pid = this.opts.showProcess ? ` ${chalk_1.default.gray(data.pid)}` : "";
const reqId = data.req_id ? ` ${chalk_1.default.cyan(data.req_id)}` : "";
const time = this.opts.showTime ? data.time.toISOString() : "";
const msg = this.getMessage(data);
const details = this.getDetails(data);
const table = this.getTable(data);
const error = this.getError(data);
const info = time + pid + reqId;
return `[${info.trim()}] ${msg}${table}${error} ${details}`;
}
}
exports.default = ConsoleStream;
//# sourceMappingURL=ConsoleStream.js.map