import { LogLevel, createCatalogDiagnostics, type DiagnosticCatalog, type DiagnosticEvent, type Diagnostics, type Logger } from '$libs/logger'; import { SIUM_MODULE, SIUM_DIAGNOSTIC_EVENTS, SIUM_LOG_MSG_VALIDATION_FAILED } from './consts'; import { SIUM_LOG_MSG_RESOLVE_FALLBACK } from './errors'; import type { Issue } from './core'; export type SiumDiagnosticType = (typeof SIUM_DIAGNOSTIC_EVENTS)[keyof typeof SIUM_DIAGNOSTIC_EVENTS]; export interface SiumDiagnosticMeta { readonly message?: string; readonly error?: unknown; readonly issueCount?: number; readonly issues?: ReadonlyArray<{ readonly path: ReadonlyArray; readonly code: string; readonly message: string; readonly params?: Record; }>; } export type SiumDiagnosticEvent = DiagnosticEvent; export type SiumDiagnostics = Diagnostics; const SIUM_DIAGNOSTIC_LOGS: DiagnosticCatalog = { [SIUM_DIAGNOSTIC_EVENTS.VALIDATION_FAILED]: { level: LogLevel.DEBUG, message: SIUM_LOG_MSG_VALIDATION_FAILED }, [SIUM_DIAGNOSTIC_EVENTS.RESOLVE_FALLBACK]: { level: LogLevel.WARN, message: SIUM_LOG_MSG_RESOLVE_FALLBACK } }; export function issueDiagnosticMeta(issues: ReadonlyArray): SiumDiagnosticMeta { return { issueCount: issues.length, issues: issues.map((entry) => ({ path: [...entry.path], code: entry.code, message: entry.message, ...(entry.params === undefined ? {} : { params: entry.params }) })) }; } export function createSiumDiagnostics(logger?: Logger): SiumDiagnostics { return createCatalogDiagnostics({ logger, defaultCategory: SIUM_MODULE, catalog: SIUM_DIAGNOSTIC_LOGS }); } export function emitSiumDiagnostic( diagnostics: SiumDiagnostics, type: SiumDiagnosticType, meta: SiumDiagnosticMeta ): void { diagnostics.emit({ artifact: SIUM_MODULE, type, meta }); }