UNPKG

@evilkiwi/logger

Version:

Pretty-print utility logger for browsers.

172 lines (166 loc) 4.69 kB
'use strict'; 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