@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
JavaScript
;
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;