@visulima/pail
Version:
Highly configurable Logger for Node.js, Edge and Browser.
163 lines (160 loc) • 5.76 kB
JavaScript
import colorize, { grey, white, underline, bold } from '@visulima/colorize/browser';
import { format } from '@visulima/fmt';
import { E as EMPTY_SYMBOL } from './constants-BYYZ5WNW.mjs';
import { A as AbstractPrettyReporter, g as getLongestBadge } from './abstract-pretty-reporter-izJgxoMv.mjs';
import { g as getLongestLabel } from './get-longest-label-CM8kLFWH.mjs';
import { w as writeConsoleLogBasedOnLevel } from './write-console-log-Tptfzg9D.mjs';
var __defProp = Object.defineProperty;
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
class PrettyReporter extends AbstractPrettyReporter {
static {
__name(this, "PrettyReporter");
}
constructor(options = {}) {
super({
uppercase: {
label: true,
...options.uppercase
},
...options
});
}
// eslint-disable-next-line sonarjs/cognitive-complexity
log(meta) {
const isNotBrowser = typeof window !== "undefined" && typeof window.document !== "undefined";
const consoleLogFunction = writeConsoleLogBasedOnLevel(meta.type.level);
const { badge, context, date, error, groups, label, message, prefix, repeated, scope, suffix, type } = meta;
const { color } = this._loggerTypes[type.name];
const colorized = color ? colorize[color] : white;
const items = [];
if (isNotBrowser && groups.length > 0) {
const groupSpaces = groups.map(() => " ").join("");
const cGroup = grey("[" + groups.at(-1) + "]");
items.push(format(groupSpaces + cGroup[0], cGroup.slice(1)));
}
if (date) {
const cDate = grey(this._styles.dateFormatter(typeof date === "string" ? new Date(date) : date));
if (isNotBrowser) {
items.push(format(cDate[0], cDate.slice(1)));
} else {
items.push([cDate[0] + " ", ...cDate.slice(1)]);
}
}
if (badge) {
const cBadge = colorized(badge);
if (isNotBrowser) {
items.push(format(cBadge[0], cBadge.slice(1)));
} else {
items.push([cBadge[0] + " ", ...cBadge.slice(1)]);
}
} else {
const longestBadge = getLongestBadge(this._loggerTypes);
if (longestBadge.length > 0) {
const cBadgePlaceholder = grey(".".repeat(longestBadge.length));
if (isNotBrowser) {
items.push(format(cBadgePlaceholder[0] + " ", cBadgePlaceholder.slice(1)));
} else {
items.push([cBadgePlaceholder[0] + " ", ...cBadgePlaceholder.slice(1)]);
}
}
}
const longestLabel = getLongestLabel(this._loggerTypes);
let repeatedMessage;
if (repeated) {
const cRepeated = white("[" + repeated + "x]");
repeatedMessage = isNotBrowser ? format(cRepeated[0], cRepeated.slice(1)) : [cRepeated[0], ...cRepeated.slice(1)];
}
if (label) {
const cLabel = colorized(this._formatLabel(label));
if (isNotBrowser) {
items.push(format(cLabel[0], cLabel.slice(1)));
} else {
items.push([cLabel[0], ...cLabel.slice(1)]);
}
if (repeatedMessage) {
items.push(repeatedMessage);
}
let lengthDiff = longestLabel.length - label.length;
if (repeated) {
lengthDiff -= String(repeated).length + 3;
} else {
lengthDiff += 1;
}
if (lengthDiff > 0) {
const cLabelSpacer = grey(".".repeat(lengthDiff));
if (isNotBrowser) {
items.push(format(cLabelSpacer[0], cLabelSpacer.slice(1)));
} else {
items.push([" " + cLabelSpacer[0], ...cLabelSpacer.slice(1)]);
}
}
} else {
const cSpacer = grey(".".repeat(longestLabel.length + 1));
if (isNotBrowser) {
items.push(format(cSpacer[0], cSpacer.slice(1)));
} else {
items.push([cSpacer[0], ...cSpacer.slice(1)]);
}
}
if (Array.isArray(scope) && scope.length > 0) {
const cScope = grey("[" + scope.join(" > ") + "]");
if (isNotBrowser) {
items.push(format(cScope[0], cScope.slice(1)));
} else {
items.push([cScope[0], ...cScope.slice(1)]);
}
}
if (prefix) {
const cPrefix = grey(
(Array.isArray(scope) && scope.length > 0 ? ". " : " ") + "[" + (this._styles.underline.prefix ? underline(prefix) : prefix) + "] "
);
if (isNotBrowser) {
items.push(format(cPrefix[0], cPrefix.slice(1)));
} else {
items.push([cPrefix[0], ...cPrefix.slice(1)]);
}
}
if (message !== EMPTY_SYMBOL) {
items.push(message);
}
if (context) {
items.push(...context);
}
if (error) {
items.push(error, "\n\n");
}
if (suffix) {
const cSuffix = grey(this._styles.underline.suffix ? underline(suffix) : suffix);
if (isNotBrowser) {
items.push(format("\n" + cSuffix[0], cSuffix.slice(1)));
} else {
items.push(["\n" + cSuffix[0], ...cSuffix.slice(1)]);
}
}
if (isNotBrowser) {
consoleLogFunction(...items);
} else {
let logMessage = "";
const css = [];
const arguments_ = [];
for (const value of items) {
if (Array.isArray(value) && value.length > 1 && value[0].includes("%c")) {
logMessage += value[0];
css.push(...value.slice(1));
} else {
arguments_.push(value);
}
}
consoleLogFunction(logMessage + "%c", ...css, "", ...arguments_);
}
}
_formatLabel(label) {
let formattedLabel = this._styles.uppercase.label ? label.toUpperCase() : label;
formattedLabel = this._styles.underline.label ? underline(formattedLabel) : formattedLabel;
if (this._styles.bold.label) {
formattedLabel = bold(formattedLabel);
}
return formattedLabel;
}
}
export { PrettyReporter as default };