123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- /**
- * @type {Object.<string, number>}
- */
- export const LEVELS = {
- debug: 0,
- info: 1,
- warn: 2,
- error: 3,
- fatal: 4,
- };
- /* eslint-disable @typescript-eslint/no-empty-function */
- const logger = Object.assign(
- {
- debug: console?.log ? console.log.bind(console) : function noop() {},
- error: console?.log ? console.log.bind(console) : function noop() {},
- info: console?.log ? console.log.bind(console) : function noop() {},
- warn: console?.log ? console.log.bind(console) : function noop() {},
- },
- console
- );
- /* eslint-enable @typescript-eslint/no-empty-function */
- /**
- * Logs messages to the console.
- * Available loglevels are:
- * - 0: 'debug'
- * - 1: 'info'
- * - 2: 'warn',
- * - 3: 'error'
- * - 4: 'fatal'.
- * When using the 'error' or 'warn' loglevels, a full stacktrace will be logged as well.
- * @namespace log
- */
- const log = {
- /** @type {keyof LEVELS} The current log level */
- loglevel: "info",
- /**
- * Sets the current log level which determines which messages are logged
- * @param {keyof LEVELS} level - The log level to set
- * @throws {Error} If an invalid log level is provided
- */
- setLogLevel(level) {
- if (!["debug", "info", "warn", "error", "fatal"].includes(/** @type {string} */ (level))) {
- throw new Error(`Invalid loglevel: ${level}`);
- }
- this.loglevel = level;
- },
- /**
- * Logs a message at the specified level with optional CSS styling
- * @param {any} message - The message to log
- * @param {keyof LEVELS} level - The log level to use
- * @param {string} [style=""] - Optional CSS styles to apply to the log message
- */
- log(message, level, style = "") {
- if (LEVELS[level] < LEVELS[this.loglevel]) {
- return;
- }
- if (level === "error" || level === "fatal") {
- style = style || "color: maroon";
- } else if (level === "debug") {
- style = style || "color: green";
- }
- if (message instanceof Error) {
- message = message.stack;
- } else if (isElement(message)) {
- message = /** @type {Element} */ (message).outerHTML;
- }
- const prefix = style ? "%c" : "";
- if (level === "error") {
- logger.error(`${prefix} ERROR: ${message}`, style);
- } else if (level === "warn") {
- logger.warn(`${prefix} ${new Date().toISOString()} WARNING: ${message}`, style);
- } else if (level === "fatal") {
- logger.error(`${prefix} FATAL: ${message}`, style);
- } else if (level === "debug") {
- logger.debug(`${prefix} ${new Date().toISOString()} DEBUG: ${message}`, style);
- } else {
- logger.info(`${prefix} ${new Date().toISOString()} INFO: ${message}`, style);
- }
- },
- /**
- * @param {any} message - The message to log
- * @param {string} [style=""] - Optional CSS styles to apply to the log message
- */
- debug(message, style) {
- this.log(message, "debug", style);
- },
- /**
- * @param {any} message - The message to log
- * @param {string} [style=""] - Optional CSS styles to apply to the log message
- */
- error(message, style) {
- this.log(message, "error", style);
- },
- /**
- * @param {any} message - The message to log
- * @param {string} [style=""] - Optional CSS styles to apply to the log message
- */
- info(message, style) {
- this.log(message, "info", style);
- },
- /**
- * @param {any} message - The message to log
- * @param {string} [style=""] - Optional CSS styles to apply to the log message
- */
- warn(message, style) {
- this.log(message, "warn", style);
- },
- /**
- * @param {any} message - The message to log
- * @param {string} [style=""] - Optional CSS styles to apply to the log message
- */
- fatal(message, style) {
- this.log(message, "fatal", style);
- },
- };
- /**
- * @param {unknown} el - The value to check
- * @returns {boolean} True if the value is an Element or Document
- */
- export function isElement(el) {
- return el instanceof Element || el instanceof Document;
- }
- export default log;
|