UNPKG

ng2-logger

Version:

isomorphic logger for browser/server in typescript

297 lines (292 loc) 8.57 kB
import { Helpers, UtilsOs } from 'tnp-core/browser'; /* */ /* */ //#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 || (Level = {})); //#endregion //#region constants const LevelKey = { [Level.DATA]: 'data', [Level.INFO]: 'info', [Level.WARN]: 'warn', [Level.ERROR]: 'error', [Level.SUCCESS]: 'success', [Level.TASK_STARTED]: 'taskstarted', [Level.TASK_DONE]: 'taskdone', }; const LevelOrder = [ LevelKey[Level.DATA], LevelKey[Level.TASK_STARTED], LevelKey[Level.TASK_DONE], LevelKey[Level.INFO], LevelKey[Level.SUCCESS], LevelKey[Level.WARN], 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 !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 { 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 : LevelKey[level]; this[methodName] = (message, ...data) => { if (this.isMuted) return this; if (globalLevel !== null && level < globalLevel) { return this; } if (this.allowed.length === 0 || Helpers.contain(this.allowed, level)) { displayMsg(message, data.length === 0 ? undefined : data, this.moduleName, this.color, level, this.moduleWidth, permanentlyDisabled); } return this; }; } } //#endregion })(Log || (Log = {})); //#endregion //#region get random color const getRandomColor = () => { /* */ /* */ /* */ /* */ const letters = '0123456789ABCDEF'; return ('#' + Array.from({ length: 6 }) .map(() => letters[Math.floor(Math.random() * 16)]) .join('')); }; //#endregion //#region console log const consoleLog = (data, level) => { /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ }; //#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 @browser if (UtilsOs.isBrowser) { let levelColor = 'gray'; switch (level) { case Level.INFO: levelColor = 'deepskyblue'; break; case Level.WARN: levelColor = 'orange'; break; case Level.ERROR: levelColor = 'red'; break; case Level.SUCCESS: levelColor = 'green'; break; case Level.TASK_STARTED: levelColor = 'purple'; break; case Level.TASK_DONE: levelColor = 'mediumseagreen'; break; case Level.DATA: default: levelColor = 'gray'; } const moduleStyle = `background:${moduleColor};color:white;padding:2px 4px;border-radius:2px;`; const messageStyle = `color:${levelColor};font-weight:${level === Level.ERROR ? 'bold' : 'normal'};`; console.log(`%c ${moduleName} %c ${timestamp}${message}`, moduleStyle, messageStyle, ...(params ?? [])); } //#endregion /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ }; //#endregion /* */ /** * Generated bundle index. Do not edit. */ export { Level, LevelKey, LevelOrder, Log }; //# sourceMappingURL=ng2-logger-browser.mjs.map