2025-05-01 00:55:22 +02:00
|
|
|
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;
|
|
|
|
|
|
2025-05-04 21:00:15 +02:00
|
|
|
let consoleMessageString = `[${this.component}${functionSource ? `::${functionSource}` : ''}]`;
|
2025-05-01 00:55:22 +02:00
|
|
|
const consoleMessageData = []
|
|
|
|
|
|
|
|
|
|
for (const m of message) {
|
|
|
|
|
if (typeof m === 'string') {
|
|
|
|
|
consoleMessageString = `${consoleMessageString} ${m}`;
|
|
|
|
|
} else if (typeof m === 'number') {
|
|
|
|
|
consoleMessageString = `${consoleMessageString} %f`;
|
2025-05-04 21:00:15 +02:00
|
|
|
consoleMessageData.unshift(m);
|
|
|
|
|
} else if (typeof HTMLElement !== 'undefined' && m instanceof HTMLElement) { // HTMLElement does not exist in background script, but this class may
|
2025-05-01 00:55:22 +02:00
|
|
|
consoleMessageString = `${consoleMessageString} %o`;
|
2025-05-04 21:00:15 +02:00
|
|
|
consoleMessageData.unshift(m);
|
2025-05-01 00:55:22 +02:00
|
|
|
} else {
|
|
|
|
|
consoleMessageString = `${consoleMessageString} %O`;
|
2025-05-04 21:00:15 +02:00
|
|
|
consoleMessageData.unshift(m);
|
2025-05-01 00:55:22 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|