/* eslint-disable no-console */ /** * Logger used throughout the application to allow configuration of * the log level required for the messages. */ export class Logger { static _CheckLimit(message, limit) { let entry = Logger._LogLimitOutputs[message]; if (!entry) { entry = { limit, current: 1 }; Logger._LogLimitOutputs[message] = entry; } else { entry.current++; } return entry.current <= entry.limit; } static _GenerateLimitMessage(message, level = 1) { const entry = Logger._LogLimitOutputs[message]; if (!entry || !Logger.MessageLimitReached) { return; } const type = this._Levels[level]; if (entry.current === entry.limit) { Logger[type.name](Logger.MessageLimitReached.replace(/%LIMIT%/g, "" + entry.limit).replace(/%TYPE%/g, type.name ?? "")); } } static _AddLogEntry(entry) { Logger._LogCache = entry + Logger._LogCache; if (Logger.OnNewCacheEntry) { Logger.OnNewCacheEntry(entry); } } static _FormatMessage(message) { const padStr = (i) => (i < 10 ? "0" + i : "" + i); const date = new Date(); return "[" + padStr(date.getHours()) + ":" + padStr(date.getMinutes()) + ":" + padStr(date.getSeconds()) + "]: " + message; } // eslint-disable-next-line @typescript-eslint/no-unused-vars static _LogDisabled(message, limit) { // nothing to do } static _LogEnabled(level = 1, message, limit) { // take first message if array const msg = Array.isArray(message) ? message[0] : message; if (limit !== undefined && !Logger._CheckLimit(msg, limit)) { return; } const formattedMessage = Logger._FormatMessage(msg); const type = this._Levels[level]; const optionals = Array.isArray(message) ? message.slice(1) : []; type.logFunc && type.logFunc("BJS - " + formattedMessage, ...optionals); const entry = `
${formattedMessage}

`; Logger._AddLogEntry(entry); Logger._GenerateLimitMessage(msg, level); } /** * Gets current log cache (list of logs) */ static get LogCache() { return Logger._LogCache; } /** * Clears the log cache */ static ClearLogCache() { Logger._LogCache = ""; Logger._LogLimitOutputs = {}; Logger.errorsCount = 0; } /** * Sets the current log level (MessageLogLevel / WarningLogLevel / ErrorLogLevel) */ static set LogLevels(level) { Logger.Log = Logger._LogDisabled; Logger.Warn = Logger._LogDisabled; Logger.Error = Logger._LogDisabled; [Logger.MessageLogLevel, Logger.WarningLogLevel, Logger.ErrorLogLevel].forEach((l) => { if ((level & l) === l) { const type = this._Levels[l]; Logger[type.name] = Logger._LogEnabled.bind(Logger, l); } }); } } /** * No log */ Logger.NoneLogLevel = 0; /** * Only message logs */ Logger.MessageLogLevel = 1; /** * Only warning logs */ Logger.WarningLogLevel = 2; /** * Only error logs */ Logger.ErrorLogLevel = 4; /** * All logs */ Logger.AllLogLevel = 7; /** * Message to display when a message has been logged too many times */ Logger.MessageLimitReached = "Too many %TYPE%s (%LIMIT%), no more %TYPE%s will be reported for this message."; Logger._LogCache = ""; Logger._LogLimitOutputs = {}; // levels according to the (binary) numbering. Logger._Levels = [ {}, { color: "white", logFunc: console.log, name: "Log" }, { color: "orange", logFunc: console.warn, name: "Warn" }, {}, { color: "red", logFunc: console.error, name: "Error" }, ]; /** * Gets a value indicating the number of loading errors * @ignorenaming */ // eslint-disable-next-line @typescript-eslint/naming-convention Logger.errorsCount = 0; /** * Log a message to the console */ Logger.Log = Logger._LogEnabled.bind(Logger, Logger.MessageLogLevel); /** * Write a warning message to the console */ Logger.Warn = Logger._LogEnabled.bind(Logger, Logger.WarningLogLevel); /** * Write an error message to the console */ Logger.Error = Logger._LogEnabled.bind(Logger, Logger.ErrorLogLevel); //# sourceMappingURL=logger.js.map