UNPKG

jsev

Version:

Environment for building Web API's.

146 lines 4.79 kB
"use strict"; 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