log-rank
Version:
A priority-based console logger for Node.js and browser environments. Log messages with custom priorities and control the order they appear — ideal for debugging complex flows, batching logs, or building clean dev tools.
101 lines (100 loc) • 3.93 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Console = void 0;
var logMessagesType;
(function (logMessagesType) {
logMessagesType["ERROR"] = "error";
logMessagesType["WARN"] = "warn";
logMessagesType["LOG"] = "log";
logMessagesType["SUCCESS"] = "success";
logMessagesType["FAILURE"] = "failure";
})(logMessagesType || (logMessagesType = {}));
class Console {
messagesToBeLogged;
totalConsoleMessagesCount;
maximumConsoleAllowed;
isConsoleDisable;
reversePriority;
timeFormat;
showTimestamps;
constructor({ isConsoleDisable = false, maximumConsoleAllowed, reversePriority = false, timeFormat = "ISO", showTimestamps = false, }) {
this.maximumConsoleAllowed = maximumConsoleAllowed;
this.isConsoleDisable = isConsoleDisable;
this.reversePriority = reversePriority;
this.timeFormat = timeFormat;
this.showTimestamps = showTimestamps;
this.messagesToBeLogged = {};
this.totalConsoleMessagesCount = 0;
}
getFormattedTimestamp() {
return this.timeFormat === "ISO"
? new Date().toISOString()
: new Date().toLocaleString();
}
print() {
if (this.isConsoleDisable)
return;
console.clear();
const sortedMessages = Object.entries(this.messagesToBeLogged).sort((a, b) => this.reversePriority
? Number(a[0]) - Number(b[0])
: Number(b[0]) - Number(a[0]));
sortedMessages.forEach(([, messages]) => {
messages.forEach(({ type, message, emoji, timestamp }) => {
const prefix = timestamp ? `${emoji} ${timestamp}:` : `${emoji}`;
switch (type) {
case logMessagesType.ERROR:
console.error(`${prefix} ${message}`);
break;
case logMessagesType.WARN:
console.warn(`${prefix} ${message}`);
break;
case logMessagesType.LOG:
case logMessagesType.SUCCESS:
case logMessagesType.FAILURE:
console.log(`${prefix}`);
console.log(message);
break;
}
});
});
}
addMessage(type, consoleMessage, emoji, { priority = 1, showTimestamp }) {
if (this.isConsoleDisable ||
this.totalConsoleMessagesCount >= this.maximumConsoleAllowed)
return;
const shouldShowTimestamp = showTimestamp !== undefined ? showTimestamp : this.showTimestamps;
const timestamp = shouldShowTimestamp ? this.getFormattedTimestamp() : "";
const message = {
type,
message: consoleMessage,
emoji,
timestamp,
};
if (!this.messagesToBeLogged[priority]) {
this.messagesToBeLogged[priority] = [];
}
this.messagesToBeLogged[priority].push(message);
this.totalConsoleMessagesCount++;
this.print();
}
log(consoleMessage, options = {}) {
this.addMessage(logMessagesType.LOG, consoleMessage, "", options);
}
error(consoleMessage, options = {}) {
this.addMessage(logMessagesType.ERROR, consoleMessage, "", options);
}
warn(consoleMessage, options = {}) {
this.addMessage(logMessagesType.WARN, consoleMessage, "", options);
}
success(consoleMessage, successIcon = "✅️", options = {}) {
this.addMessage(logMessagesType.SUCCESS, consoleMessage, successIcon, options);
}
failure(consoleMessage, failureIcon = "❌", options = {}) {
this.addMessage(logMessagesType.FAILURE, consoleMessage, failureIcon, options);
}
flush() {
this.messagesToBeLogged = {};
this.totalConsoleMessagesCount = 0;
}
}
exports.Console = Console;