296 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			296 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| var __defProp = Object.defineProperty;
 | |
| var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
 | |
| var __getOwnPropNames = Object.getOwnPropertyNames;
 | |
| var __hasOwnProp = Object.prototype.hasOwnProperty;
 | |
| var __export = (target, all) => {
 | |
|   for (var name in all)
 | |
|     __defProp(target, name, { get: all[name], enumerable: true });
 | |
| };
 | |
| var __copyProps = (to, from, except, desc) => {
 | |
|   if (from && typeof from === "object" || typeof from === "function") {
 | |
|     for (let key of __getOwnPropNames(from))
 | |
|       if (!__hasOwnProp.call(to, key) && key !== except)
 | |
|         __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
 | |
|   }
 | |
|   return to;
 | |
| };
 | |
| var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
 | |
| 
 | |
| // src/index.ts
 | |
| var src_exports = {};
 | |
| __export(src_exports, {
 | |
|   Logger: () => Logger
 | |
| });
 | |
| module.exports = __toCommonJS(src_exports);
 | |
| var import_is_node_process = require("is-node-process");
 | |
| var import_outvariant = require("outvariant");
 | |
| 
 | |
| // src/colors.ts
 | |
| var colors_exports = {};
 | |
| __export(colors_exports, {
 | |
|   blue: () => blue,
 | |
|   gray: () => gray,
 | |
|   green: () => green,
 | |
|   red: () => red,
 | |
|   yellow: () => yellow
 | |
| });
 | |
| function yellow(text) {
 | |
|   return `\x1B[33m${text}\x1B[0m`;
 | |
| }
 | |
| function blue(text) {
 | |
|   return `\x1B[34m${text}\x1B[0m`;
 | |
| }
 | |
| function gray(text) {
 | |
|   return `\x1B[90m${text}\x1B[0m`;
 | |
| }
 | |
| function red(text) {
 | |
|   return `\x1B[31m${text}\x1B[0m`;
 | |
| }
 | |
| function green(text) {
 | |
|   return `\x1B[32m${text}\x1B[0m`;
 | |
| }
 | |
| 
 | |
| // src/index.ts
 | |
| var IS_NODE = (0, import_is_node_process.isNodeProcess)();
 | |
| var Logger = class {
 | |
|   constructor(name) {
 | |
|     this.name = name;
 | |
|     this.prefix = `[${this.name}]`;
 | |
|     const LOGGER_NAME = getVariable("DEBUG");
 | |
|     const LOGGER_LEVEL = getVariable("LOG_LEVEL");
 | |
|     const isLoggingEnabled = LOGGER_NAME === "1" || LOGGER_NAME === "true" || typeof LOGGER_NAME !== "undefined" && this.name.startsWith(LOGGER_NAME);
 | |
|     if (isLoggingEnabled) {
 | |
|       this.debug = isDefinedAndNotEquals(LOGGER_LEVEL, "debug") ? noop : this.debug;
 | |
|       this.info = isDefinedAndNotEquals(LOGGER_LEVEL, "info") ? noop : this.info;
 | |
|       this.success = isDefinedAndNotEquals(LOGGER_LEVEL, "success") ? noop : this.success;
 | |
|       this.warning = isDefinedAndNotEquals(LOGGER_LEVEL, "warning") ? noop : this.warning;
 | |
|       this.error = isDefinedAndNotEquals(LOGGER_LEVEL, "error") ? noop : this.error;
 | |
|     } else {
 | |
|       this.info = noop;
 | |
|       this.success = noop;
 | |
|       this.warning = noop;
 | |
|       this.error = noop;
 | |
|       this.only = noop;
 | |
|     }
 | |
|   }
 | |
|   prefix;
 | |
|   extend(domain) {
 | |
|     return new Logger(`${this.name}:${domain}`);
 | |
|   }
 | |
|   /**
 | |
|    * Print a debug message.
 | |
|    * @example
 | |
|    * logger.debug('no duplicates found, creating a document...')
 | |
|    */
 | |
|   debug(message, ...positionals) {
 | |
|     this.logEntry({
 | |
|       level: "debug",
 | |
|       message: gray(message),
 | |
|       positionals,
 | |
|       prefix: this.prefix,
 | |
|       colors: {
 | |
|         prefix: "gray"
 | |
|       }
 | |
|     });
 | |
|   }
 | |
|   /**
 | |
|    * Print an info message.
 | |
|    * @example
 | |
|    * logger.info('start parsing...')
 | |
|    */
 | |
|   info(message, ...positionals) {
 | |
|     this.logEntry({
 | |
|       level: "info",
 | |
|       message,
 | |
|       positionals,
 | |
|       prefix: this.prefix,
 | |
|       colors: {
 | |
|         prefix: "blue"
 | |
|       }
 | |
|     });
 | |
|     const performance2 = new PerformanceEntry();
 | |
|     return (message2, ...positionals2) => {
 | |
|       performance2.measure();
 | |
|       this.logEntry({
 | |
|         level: "info",
 | |
|         message: `${message2} ${gray(`${performance2.deltaTime}ms`)}`,
 | |
|         positionals: positionals2,
 | |
|         prefix: this.prefix,
 | |
|         colors: {
 | |
|           prefix: "blue"
 | |
|         }
 | |
|       });
 | |
|     };
 | |
|   }
 | |
|   /**
 | |
|    * Print a success message.
 | |
|    * @example
 | |
|    * logger.success('successfully created document')
 | |
|    */
 | |
|   success(message, ...positionals) {
 | |
|     this.logEntry({
 | |
|       level: "info",
 | |
|       message,
 | |
|       positionals,
 | |
|       prefix: `\u2714 ${this.prefix}`,
 | |
|       colors: {
 | |
|         timestamp: "green",
 | |
|         prefix: "green"
 | |
|       }
 | |
|     });
 | |
|   }
 | |
|   /**
 | |
|    * Print a warning.
 | |
|    * @example
 | |
|    * logger.warning('found legacy document format')
 | |
|    */
 | |
|   warning(message, ...positionals) {
 | |
|     this.logEntry({
 | |
|       level: "warning",
 | |
|       message,
 | |
|       positionals,
 | |
|       prefix: `\u26A0 ${this.prefix}`,
 | |
|       colors: {
 | |
|         timestamp: "yellow",
 | |
|         prefix: "yellow"
 | |
|       }
 | |
|     });
 | |
|   }
 | |
|   /**
 | |
|    * Print an error message.
 | |
|    * @example
 | |
|    * logger.error('something went wrong')
 | |
|    */
 | |
|   error(message, ...positionals) {
 | |
|     this.logEntry({
 | |
|       level: "error",
 | |
|       message,
 | |
|       positionals,
 | |
|       prefix: `\u2716 ${this.prefix}`,
 | |
|       colors: {
 | |
|         timestamp: "red",
 | |
|         prefix: "red"
 | |
|       }
 | |
|     });
 | |
|   }
 | |
|   /**
 | |
|    * Execute the given callback only when the logging is enabled.
 | |
|    * This is skipped in its entirety and has no runtime cost otherwise.
 | |
|    * This executes regardless of the log level.
 | |
|    * @example
 | |
|    * logger.only(() => {
 | |
|    *   logger.info('additional info')
 | |
|    * })
 | |
|    */
 | |
|   only(callback) {
 | |
|     callback();
 | |
|   }
 | |
|   createEntry(level, message) {
 | |
|     return {
 | |
|       timestamp: /* @__PURE__ */ new Date(),
 | |
|       level,
 | |
|       message
 | |
|     };
 | |
|   }
 | |
|   logEntry(args) {
 | |
|     const {
 | |
|       level,
 | |
|       message,
 | |
|       prefix,
 | |
|       colors: customColors,
 | |
|       positionals = []
 | |
|     } = args;
 | |
|     const entry = this.createEntry(level, message);
 | |
|     const timestampColor = customColors?.timestamp || "gray";
 | |
|     const prefixColor = customColors?.prefix || "gray";
 | |
|     const colorize = {
 | |
|       timestamp: colors_exports[timestampColor],
 | |
|       prefix: colors_exports[prefixColor]
 | |
|     };
 | |
|     const write = this.getWriter(level);
 | |
|     write(
 | |
|       [colorize.timestamp(this.formatTimestamp(entry.timestamp))].concat(prefix != null ? colorize.prefix(prefix) : []).concat(serializeInput(message)).join(" "),
 | |
|       ...positionals.map(serializeInput)
 | |
|     );
 | |
|   }
 | |
|   formatTimestamp(timestamp) {
 | |
|     return `${timestamp.toLocaleTimeString(
 | |
|       "en-GB"
 | |
|     )}:${timestamp.getMilliseconds()}`;
 | |
|   }
 | |
|   getWriter(level) {
 | |
|     switch (level) {
 | |
|       case "debug":
 | |
|       case "success":
 | |
|       case "info": {
 | |
|         return log;
 | |
|       }
 | |
|       case "warning": {
 | |
|         return warn;
 | |
|       }
 | |
|       case "error": {
 | |
|         return error;
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| };
 | |
| var PerformanceEntry = class {
 | |
|   startTime;
 | |
|   endTime;
 | |
|   deltaTime;
 | |
|   constructor() {
 | |
|     this.startTime = performance.now();
 | |
|   }
 | |
|   measure() {
 | |
|     this.endTime = performance.now();
 | |
|     const deltaTime = this.endTime - this.startTime;
 | |
|     this.deltaTime = deltaTime.toFixed(2);
 | |
|   }
 | |
| };
 | |
| var noop = () => void 0;
 | |
| function log(message, ...positionals) {
 | |
|   if (IS_NODE) {
 | |
|     process.stdout.write((0, import_outvariant.format)(message, ...positionals) + "\n");
 | |
|     return;
 | |
|   }
 | |
|   console.log(message, ...positionals);
 | |
| }
 | |
| function warn(message, ...positionals) {
 | |
|   if (IS_NODE) {
 | |
|     process.stderr.write((0, import_outvariant.format)(message, ...positionals) + "\n");
 | |
|     return;
 | |
|   }
 | |
|   console.warn(message, ...positionals);
 | |
| }
 | |
| function error(message, ...positionals) {
 | |
|   if (IS_NODE) {
 | |
|     process.stderr.write((0, import_outvariant.format)(message, ...positionals) + "\n");
 | |
|     return;
 | |
|   }
 | |
|   console.error(message, ...positionals);
 | |
| }
 | |
| function getVariable(variableName) {
 | |
|   if (IS_NODE) {
 | |
|     return process.env[variableName];
 | |
|   }
 | |
|   return globalThis[variableName]?.toString();
 | |
| }
 | |
| function isDefinedAndNotEquals(value, expected) {
 | |
|   return value !== void 0 && value !== expected;
 | |
| }
 | |
| function serializeInput(message) {
 | |
|   if (typeof message === "undefined") {
 | |
|     return "undefined";
 | |
|   }
 | |
|   if (message === null) {
 | |
|     return "null";
 | |
|   }
 | |
|   if (typeof message === "string") {
 | |
|     return message;
 | |
|   }
 | |
|   if (typeof message === "object") {
 | |
|     return JSON.stringify(message);
 | |
|   }
 | |
|   return message.toString();
 | |
| }
 |