UNPKG

@ima/dev-utils

Version:

IMA.js dev utils used used mainly in @ima/cli and other dev-related utilities.

134 lines (133 loc) 4.67 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.createLogger = exports.logger = exports.Logger = exports.printTime = exports.time = void 0; const chalk_1 = __importDefault(require("chalk")); const pretty_ms_1 = __importDefault(require("pretty-ms")); /** * Returns time utility function, which when called returns * formatted elapsed time from it's creation. * * @returns {() => string} Callback to return formatted elapsed time. */ function time() { const start = process.hrtime.bigint(); return () => (0, pretty_ms_1.default)(Number((process.hrtime.bigint() - start) / BigInt(1e6))); } exports.time = time; /** * Prints current time in HH:MM:SS format. */ function printTime() { const d = new Date(), h = (d.getHours() < 10 ? '0' : '') + d.getHours(), m = (d.getMinutes() < 10 ? '0' : '') + d.getMinutes(), s = (d.getSeconds() < 10 ? '0' : '') + d.getSeconds(); return chalk_1.default.gray(`[${h}:${m}:${s}]`); } exports.printTime = printTime; class Logger { #identifier; #globalLogger; #isSilent = false; innerElapsed; constructor(identifier, globalLogger) { this.#identifier = identifier; this.#globalLogger = globalLogger; } #log(prefix, chalkFn, message, { newLine = true, trackTime = false, elapsed } = {}) { // Don't continue if logger is silenced if (this.#isSilent) { return; } // Print elapsed if previously timed this.endTracking(); // Track time if (trackTime) { this.innerElapsed = time(); } // Write prefix (optionally with identifier) if (prefix) { process.stdout.write(chalkFn(`${prefix}: ${this.#identifier ? `(${this.#identifier}) ` : ''}`)); } try { // Write message message = message ?? typeof message; process.stdout.write(message); } catch (error) { console.error(error); } // Write elapsed time if provided if (elapsed) { this.writeElapsed(elapsed); } // Write newline (ignore when some kind of time tracking is enabled) if (newLine && !this.innerElapsed && !elapsed) { process.stdout.write('\n'); } } endTracking() { // Write elapsed for previous log if (this.innerElapsed) { this.writeElapsed(this.innerElapsed); this.innerElapsed = undefined; return; } // Write elapsed for previous log if (this.#globalLogger?.innerElapsed) { this.writeElapsed(this.#globalLogger.innerElapsed); this.#globalLogger.innerElapsed = undefined; return; } } info(message, options) { this.#log('info', chalk_1.default.bold.cyan, message, options); } success(message, options) { this.#log('success', chalk_1.default.bold.green, message, options); } error(message, options) { if (message instanceof Error) { // eslint-disable-next-line @typescript-eslint/no-unused-vars const [_, ...stackLines] = message.stack?.split('\n') ?? ''; // Print error name and message this.#log('error', chalk_1.default.bold.red, `${chalk_1.default.underline(message.name)}: ${message.message.trim()}`, options); // Print stack this.write(`\n${chalk_1.default.gray(stackLines.join('\n'))}\n`); } else { this.#log('error', chalk_1.default.bold.red, message, options); } } warn(message, options) { this.#log('warn', chalk_1.default.bold.yellow, message, options); } sync(message, options) { this.#log('sync', chalk_1.default.bold.magenta, message, options); } plugin(message, options) { this.#log('plugin', chalk_1.default.bold.blue, message, options); } write(message, options) { this.#log('', chalk_1.default.bold.blue, message, options); } writeElapsed(elapsed) { process.stdout.write(chalk_1.default.gray(` [${elapsed()}]\n`)); } setSilent(isSilent) { this.#isSilent = isSilent; } isSilent() { return this.#isSilent; } } exports.Logger = Logger; /** * Create global logger instance */ const globalLogger = new Logger(); exports.logger = globalLogger; function createLogger(name) { return new Logger(name, globalLogger); } exports.createLogger = createLogger;