import { LogAggregator, LogSourceOptions } from './LogAggregator'; export enum LogLevel { Debug = 'debug', Info = 'info', Log = 'log', Warn = 'warn', Error = 'error', } export type ComponentLoggerOptions = { styles?: { [x in LogLevel]?: string; } } export class ComponentLogger { private logAggregator: LogAggregator; private component: string; private componentOptions?: ComponentLoggerOptions; constructor(logAggregator: LogAggregator, component: string, componentOptions?: ComponentLoggerOptions) { this.logAggregator = logAggregator; this.component = component; } private handleLog(logLevel: LogLevel, sourceFunction: string | LogSourceOptions, ...message: any) { let functionSource = typeof sourceFunction === 'string' ? sourceFunction : sourceFunction?.src; let consoleMessageString = `[${this.component}${functionSource ? `::${functionSource}` : ''}] `; const consoleMessageData = [] for (const m of message) { if (typeof m === 'string') { consoleMessageString = `${consoleMessageString} ${m}`; } else if (typeof m === 'number') { consoleMessageString = `${consoleMessageString} %f`; } else if (m instanceof HTMLElement) { consoleMessageString = `${consoleMessageString} %o`; } else { consoleMessageString = `${consoleMessageString} %O`; } } const style = this.componentOptions?.styles?.[logLevel] ?? this.componentOptions?.styles?.[LogLevel.Log]; if (style) { consoleMessageString = `%c${consoleMessageString}`; consoleMessageData.unshift(style); } this.logAggregator.log(this.component, logLevel, typeof sourceFunction === 'object' ? sourceFunction : undefined, consoleMessageString, ...consoleMessageData); } debug(sourceFunction: string | LogSourceOptions, ...message: any[]) { this.handleLog(LogLevel.Debug, sourceFunction, ...message); } info(sourceFunction: string | LogSourceOptions, ...message: any[]) { this.handleLog(LogLevel.Info, sourceFunction, ...message); } log(sourceFunction: string | LogSourceOptions, ...message: any[]) { this.handleLog(LogLevel.Log, sourceFunction, ...message); } warn(sourceFunction: string | LogSourceOptions, ...message: any[]) { this.handleLog(LogLevel.Warn, sourceFunction, ...message); } error(sourceFunction: string | LogSourceOptions, ...message: any[]) { this.handleLog(LogLevel.Error, sourceFunction, ...message); } }