ng2-logger
Version:
isomorphic logger for browser/server in typescript
314 lines • 9.09 kB
JavaScript
;
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