import type { LogRecord } from "./log-record.ts" /** * @description Describe options consumed by log emitters. */ export interface LogEmitterOptions extends Omit {} /** * @description Define the base emitter contract for dispatching formatted logs. */ export abstract class LogEmitter { readonly tags: string[] readonly messages: unknown[] readonly formattedMessages: string[] constructor(options: LogEmitterOptions) { this.tags = options.tags ?? [] this.messages = options.messages ?? [] this.formattedMessages = [] this.formattedMessages.push(this.tags.map((tag) => `[${tag}]`).join("")) this.formattedMessages.push(this.messages.map((message) => String(message)).join(" ")) } abstract emit(): void } /** * @description Emit `log` records via `console.log`. */ export class ConsoleLogLogEmitter extends LogEmitter { emit(): void { console.log(this.formattedMessages.join(" ")) } } /** * @description Emit `info` records via `console.info`. */ export class ConsoleInfoLogEmitter extends LogEmitter { emit(): void { console.info(this.formattedMessages.join(" ")) } } /** * @description Emit `warn` records via `console.warn`. */ export class ConsoleWarnLogEmitter extends LogEmitter { emit(): void { console.warn(this.formattedMessages.join(" ")) } } /** * @description Emit `error` records via `console.error`. */ export class ConsoleErrorLogEmitter extends LogEmitter { emit(): void { console.error(this.formattedMessages.join(" ")) } } /** * @description Emit `debug` records via `console.debug`. */ export class ConsoleDebugLogEmitter extends LogEmitter { emit(): void { console.debug(this.formattedMessages.join(" ")) } }