UNPKG

projex

Version:
110 lines (109 loc) 4.12 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.log = exports.fileLoggerLevel = exports.consoleLoggerLevel = exports.DEBUG_LOG_FILE_PATH = void 0; const _api_1 = require("../api/index"); const path_1 = require("path"); const util_1 = require("util"); const winston_1 = require("winston"); const paths_1 = require("./constants/paths"); const verbose_1 = require("./verbose"); const chalk_1 = __importDefault(require("chalk")); var LogLevelIcons; (function (LogLevelIcons) { LogLevelIcons["info"] = "\u2714"; LogLevelIcons["warn"] = "\u25B2"; LogLevelIcons["error"] = "\u2716"; LogLevelIcons["debug"] = "i"; LogLevelIcons["silly"] = "\u2716"; LogLevelIcons["verbose"] = "i"; })(LogLevelIcons || (LogLevelIcons = {})); const getLevelIcon = (level) => { const color = _api_1.LogLevelColors[level]; const icon = LogLevelIcons[level]; return icon ? chalk_1.default.hex(color)(icon) : ''; }; // The debug file is likely to be on ~/.config/configstore/pco_debug.txt exports.DEBUG_LOG_FILE_PATH = (0, path_1.join)(paths_1.LOGS_FOLDER, 'debug.json'); const addArgs = (0, winston_1.format)((info) => { // @ts-ignore const args = info[Symbol.for('splat')]; info.args = args ? [...args] : []; return info; }); const messageFormatter = winston_1.format.printf((info) => { const { sender = '', message, args = [] } = info; const formattedMsgWithArgs = (0, util_1.formatWithOptions)({ colors: true }, message, ...args); const logIcon = getLevelIcon(info.level); const msg = `${logIcon} ${formattedMsgWithArgs} ${chalk_1.default.gray(sender)}`; return msg; }); const consoleLoggerLevel = () => { return verbose_1.isVerbose ? 'debug' : 'info'; }; exports.consoleLoggerLevel = consoleLoggerLevel; const fileLoggerLevel = () => { return 'debug'; }; exports.fileLoggerLevel = fileLoggerLevel; const isObject = (a) => { return !!a && a.constructor === Object; }; // JSON.stringify doesn't get non-enumerable properties // This is a workaround based on https://stackoverflow.com/a/18391400/11452359 const errorJsonReplacer = (key, value) => { if (key === '' && isObject(value) && value.args != null) { value.args = value.args.map((arg) => { if (arg instanceof Error) { const error = {}; Object.getOwnPropertyNames(arg).forEach((objKey) => { // @ts-ignore error[objKey] = arg[objKey]; }); return error; } return arg; }); } return value; }; // create formatter for dates used as timestamps HH:mm:ss.SSS const logger = (0, winston_1.createLogger)({ format: winston_1.format.combine(addArgs(), winston_1.format.timestamp({ format: 'HH:mm:ss.SSS' })), transports: [ new winston_1.transports.Console({ format: messageFormatter, level: (0, exports.consoleLoggerLevel)(), }), new winston_1.transports.File({ filename: exports.DEBUG_LOG_FILE_PATH, format: winston_1.format.combine(winston_1.format.json({ replacer: errorJsonReplacer, space: 2 })), level: (0, exports.fileLoggerLevel)(), maxsize: 5e6, maxFiles: 2, }), ], }); const levels = ['debug', 'info', 'error', 'warn', 'verbose', 'silly']; levels.forEach((level) => { // @ts-ignore logger[level] = (msg, ...remains) => { if (remains.length > 0 && isObject(remains[0]) && remains[0].message) { msg = `${msg}`; } if (typeof msg !== 'string') { return logger.log(level, '', msg, ...remains); } logger.log(level, msg, ...remains); }; }); logger.on('error', (err) => { console.error('A problem occurred with the logger:'); console.error(err); }); logger.on('finish', (info) => { console.log(`Logging has finished: ${info}`); }); exports.log = logger;