import type { LogEvent, LogSink } from "./types.js"; export interface SentryScopeLike { setLevel(level: string): void; setTag(key: string, value: string): void; setExtras(extras: Record): void; } export interface SentryLike { withScope(callback: (scope: SentryScopeLike) => void): void; captureException(error: Error): void; captureMessage(message: string, level: string): void; } /** Creates an optional Sentry adapter without adding a Sentry SDK dependency to this package. */ export function createSentrySink(sentry: SentryLike): LogSink { return { emit(event: LogEvent) { if (event.level !== "error") return; const error = event.arguments.find((item): item is Error => item instanceof Error); const extras = Object.fromEntries( event.arguments .filter((item) => item && typeof item === "object" && !(item instanceof Error)) .map((item, index) => [`context_${index}`, item]), ); const message = event.arguments.filter((item) => typeof item === "string").join(" ") || "Logger error"; sentry.withScope((scope) => { scope.setLevel("error"); if (event.namespace) scope.setTag("logger.namespace", event.namespace); scope.setExtras(extras); if (error) sentry.captureException(error); else sentry.captureMessage(message, "error"); }); }, }; }