@evilkiwi/logger
Version:
Pretty-print utility logger for browsers.
172 lines (166 loc) • 4.69 kB
JavaScript
;
const logLevel = {
log: 'log',
debug: 'debug',
error: 'error',
info: 'info',
warn: 'warn',
};
function pad(value) {
return `${value <= 9 ? '0' : ''}${value}`;
}
function timestamp() {
const date = new Date();
return `${pad(date.getHours())}:${pad(date.getMinutes())}:${pad(date.getSeconds())}.${date.getMilliseconds()}`;
}
function decToHex(dec, padding = 6) {
let hex = dec.toString(16);
while (hex.length < padding) {
hex = `0${hex}`;
}
return hex;
}
function normalizeColor(color) {
if (typeof color === 'string') {
return color;
}
if (typeof color === 'number') {
return `#${decToHex(color)}`;
}
return '#FFFFFF';
}
function normalizeStyle(style) {
if (typeof style === 'string') {
return style;
}
return style.join('');
}
const styles = {
base: ['font-size: 11px;', 'font-weight: normal;'],
code: [
'display: inline-block;',
'font-family: ui-monospace, "Cascadia Mono", "Segoe UI Mono", "Liberation Mono", Menlo, Monaco, Consolas, monospace;',
'padding: 1px 4px;',
'font-size: 10px;',
'background-color: #E92063;',
'font-weight: bold;',
'color: #111111;',
'border-radius: 3px;',
'vertical-align: top;',
],
};
function createLogger(props) {
const useProps = {
name: null,
color: null,
...props,
styles: props?.styles === false
? false
: {
...styles,
...(props?.styles ?? {}),
},
};
const setDisabled = (isDisabled) => {
disabled = isDisabled;
};
let disabled = false;
function print(options) {
if (disabled) {
return;
}
const localStyle = useProps.styles !== false ? `${normalizeStyle(useProps.styles.base)} ${options.color ? `color: ${normalizeColor(options.color)};` : ''}` : '';
const startStyle = useProps.styles !== false ? '%c' : '';
const styles = [localStyle];
let loggerPrefix = '';
if (typeof useProps.name === 'string' && useProps.name.length > 0) {
loggerPrefix = `${startStyle}[${useProps.name}] `;
useProps.styles !== false && styles.unshift(`${localStyle} ${useProps.color !== null ? `color: ${normalizeColor(useProps.color)};` : ''}`);
}
let message = `${loggerPrefix}${startStyle}${options.message} @ ${timestamp()}`;
if (useProps.styles !== false) {
const codeRegex = /(`([^`]*)`)+/g;
const total = (message.match(codeRegex) ?? []).length;
for (let i = 0; i < total; i++) {
styles.push(normalizeStyle(useProps.styles.code), localStyle);
}
message = message.replace(codeRegex, `${startStyle}$2${startStyle}`);
}
console[options.call ?? options.level](message, ...(useProps.styles !== false ? styles : []), ...(options.args ?? []));
}
function log(message, ...args) {
print({
level: logLevel.log,
message,
args,
});
}
function debug(message, ...args) {
print({
level: logLevel.debug,
message,
args,
});
}
function info(message, ...args) {
print({
level: logLevel.info,
message,
args,
});
}
function warn(message, ...args) {
print({
level: logLevel.warn,
message,
args,
color: '#FFFFFF',
});
}
function error(message, ...args) {
print({
level: logLevel.error,
message,
args,
color: '#FFFFFF',
});
}
function group(message, context, level, collapsed = false) {
if (disabled) {
return;
}
print({
level: level ?? logLevel.log,
message,
call: collapsed ? 'groupCollapsed' : 'group',
});
if (context) {
context();
groupEnd();
}
}
function groupCollapsed(message, context, level) {
group(message, context, level, true);
}
function groupEnd() {
console.groupEnd();
}
const logger = {
props: useProps,
setDisabled,
disabled,
group,
groupCollapsed,
groupEnd,
log,
debug,
info,
warn,
error,
};
return logger;
}
exports.createLogger = createLogger;
exports.logLevel = logLevel;
exports.styles = styles;
//# sourceMappingURL=index.cjs.map