projex
Version:
A command line to manage the workflow
110 lines (109 loc) • 4.12 kB
JavaScript
;
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;