UNPKG

ng2-logger

Version:

isomorphic logger for browser/server in typescript

314 lines 9.09 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Log = exports.LevelOrder = exports.LevelKey = exports.Level = void 0; //#region imports const chalk_1 = require("chalk"); // @backend const stringify = require("json-stringify-safe"); const lib_1 = require("tnp-core/lib"); //#region @backend const randomcolor = require('randomcolor').default ?? require('randomcolor'); //#endregion //#endregion //#region level var Level; (function (Level) { Level[Level["DATA"] = 0] = "DATA"; Level[Level["INFO"] = 1] = "INFO"; Level[Level["WARN"] = 2] = "WARN"; Level[Level["ERROR"] = 3] = "ERROR"; Level[Level["SUCCESS"] = 4] = "SUCCESS"; Level[Level["TASK_STARTED"] = 5] = "TASK_STARTED"; Level[Level["TASK_DONE"] = 6] = "TASK_DONE"; })(Level || (exports.Level = Level = {})); //#endregion //#region constants exports.LevelKey = { [Level.DATA]: 'data', [Level.INFO]: 'info', [Level.WARN]: 'warn', [Level.ERROR]: 'error', [Level.SUCCESS]: 'success', [Level.TASK_STARTED]: 'taskstarted', [Level.TASK_DONE]: 'taskdone', }; exports.LevelOrder = [ exports.LevelKey[Level.DATA], exports.LevelKey[Level.TASK_STARTED], exports.LevelKey[Level.TASK_DONE], exports.LevelKey[Level.INFO], exports.LevelKey[Level.SUCCESS], exports.LevelKey[Level.WARN], exports.LevelKey[Level.ERROR], ]; const levelIcon = { [Level.INFO]: 'ℹ️', [Level.ERROR]: '❌', [Level.WARN]: '⚠️', [Level.SUCCESS]: '✅', [Level.TASK_STARTED]: '🚀', [Level.TASK_DONE]: '🏁', [Level.DATA]: '', }; //#endregion //#region log namespace var Log; (function (Log) { //#region internal state const instances = new Map(); let originalConsole = null; let permanentlyDisabled = false; const consoleMethods = ['log', 'info', 'warn', 'error']; let globalLevel = null; //#endregion //#region settings Log.settings = { mutedModules: [], showTimestamp: false, }; //#endregion //#region helpers const isMutedModule = (moduleName) => { if (Log.settings.mutedModules.length === 0) return false; return !lib_1.Helpers.contain(Log.settings.mutedModules, moduleName); }; //#endregion //#region public api Log.create = (moduleName, ...level) => { const log = new Logger(moduleName, getRandomColor(), level, isMutedModule(moduleName), undefined); instances.set(moduleName, log); return log; }; Log.setGlobalLevel = (level) => { globalLevel = level; }; Log.onlyLevel = (...levels) => { instances.forEach(instance => { instance.allowed = levels; }); }; Log.onlyModules = (...modules) => { instances.forEach(instance => { const moduleName = instance.moduleName; const isAllowed = modules.some(m => { if (typeof m === 'string') { return m === moduleName; } if (m instanceof RegExp) { return m.test(moduleName); } return false; }); // mute if NOT allowed instance.isMuted = !isAllowed; }); }; Log.disableAllLogsPermanetly = () => { if (permanentlyDisabled) return; if (!originalConsole) { originalConsole = {}; consoleMethods.forEach(m => { originalConsole[m] = console[m]; }); } consoleMethods.forEach(m => { console[m] = () => { }; }); permanentlyDisabled = true; }; Log.disableAllLogs = () => { if (permanentlyDisabled) return; if (!originalConsole) { originalConsole = {}; consoleMethods.forEach(m => { originalConsole[m] = console[m]; }); } consoleMethods.forEach(m => { console[m] = () => { }; }); }; Log.enableAllLogs = () => { if (permanentlyDisabled) return; if (!originalConsole) return; consoleMethods.forEach(m => { if (originalConsole && originalConsole[m]) { console[m] = originalConsole[m]; } }); }; //#endregion //#region logger class class Logger { moduleName; color; allowed; isMuted; moduleWidth; constructor(moduleName, color, allowed, isMuted, /** * Set how much characters in terminal/console * your module name should take */ moduleWidth) { this.moduleName = moduleName; this.color = color; this.allowed = allowed; this.isMuted = isMuted; this.moduleWidth = moduleWidth; this.createLevelMethod(Level.DATA); this.createLevelMethod(Level.DATA, 'd'); this.createLevelMethod(Level.INFO); this.createLevelMethod(Level.INFO, 'i'); this.createLevelMethod(Level.WARN); this.createLevelMethod(Level.WARN, 'w'); this.createLevelMethod(Level.ERROR); this.createLevelMethod(Level.ERROR, 'er'); this.createLevelMethod(Level.SUCCESS); this.createLevelMethod(Level.TASK_STARTED); this.createLevelMethod(Level.TASK_DONE); } setLevel(l) { this.allowed = [l]; return this; } mute() { this.isMuted = true; return this; } logOnlyWhen(expression) { this.isMuted = typeof expression === 'function' ? !expression() : !expression; } createLevelMethod(level, overrideMethodName) { const methodName = overrideMethodName ? overrideMethodName : exports.LevelKey[level]; this[methodName] = (message, ...data) => { if (this.isMuted) return this; if (globalLevel !== null && level < globalLevel) { return this; } if (this.allowed.length === 0 || lib_1.Helpers.contain(this.allowed, level)) { displayMsg(message, data.length === 0 ? undefined : data, this.moduleName, this.color, level, this.moduleWidth, permanentlyDisabled); } return this; }; } } //#endregion })(Log || (exports.Log = Log = {})); //#endregion //#region get random color const getRandomColor = () => { //#region @backend if (lib_1.UtilsOs.isNode) { return randomcolor({ luminosity: 'light' }); } //#endregion const letters = '0123456789ABCDEF'; return ('#' + Array.from({ length: 6 }) .map(() => letters[Math.floor(Math.random() * 16)]) .join('')); }; //#endregion //#region console log const consoleLog = (data, level) => { //#region @backend if (level === Level.INFO) lib_1.Helpers.info(data); else if (level === Level.ERROR) lib_1.Helpers.error(data, true, true); else if (level === Level.WARN) lib_1.Helpers.warn(data, false); else if (level === Level.SUCCESS) lib_1.Helpers.success(data); else if (level === Level.TASK_STARTED) lib_1.Helpers.taskStarted(data); else if (level === Level.TASK_DONE) lib_1.Helpers.taskDone(data); else lib_1.Helpers.log(data, 0, true); //#endregion }; //#endregion //#region display message const displayMsg = (message, params, moduleName, moduleColor, level, moduleWidth, permanentlyDisabled) => { if (permanentlyDisabled) return; if (message) { message = `${levelIcon[level]} ${message?.toString()}`; } else { message = levelIcon[level]; } const timestamp = Log.settings.showTimestamp ? `[${new Date().toISOString()}] ` : ''; if (moduleWidth) { const diff = moduleWidth - moduleName.length; if (diff > 0) { for (let i = 0; i < diff; i++) { moduleName += ' '; } } } /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ //#region @backend if (lib_1.UtilsOs.isNode) { const header = chalk_1.default.bgHex(moduleColor)(chalk_1.default.black(moduleName)) + ' ' + chalk_1.default.dim(timestamp + message); consoleLog(header, level); if (params) { params.forEach(p => consoleLog(stringify(p, null, 2), level)); } } //#endregion }; //#endregion //# sourceMappingURL=ng2-logger.js.map