ng2-logger
Version:
isomorphic logger for browser/server in typescript
297 lines (292 loc) • 8.57 kB
JavaScript
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