/** * Custom Vite logger that routes Vite's build/dev-server messages * through our LogTape-powered logger for consistent formatting. * * Usage in vite.config.ts: * import { createViteLogger } from './src/lib/core/utils/vite-logger'; * export default defineConfig({ * customLogger: createViteLogger(), * // ... * }); */ import type { LogOptions, LogErrorOptions } from 'vite'; import type { Logger } from 'vite'; import { logger } from './logger'; export function createViteLogger(): Logger { const warnedMessages = new Set(); return { get hasWarned() { return warnedMessages.size > 0; }, info(msg: string, options?: LogOptions) { const prefix = options?.environment ? `[${options.environment}]` : ''; if (prefix) { logger.info(`${prefix} ${msg}`); } else if (options?.timestamp) { logger.info(`[vite] ${msg}`); } else { logger.info(msg); } }, warn(msg: string, options?: LogOptions) { warnedMessages.add(msg); const prefix = options?.environment ? `[${options.environment}]` : ''; if (prefix) { logger.warn(`${prefix} ${msg}`); } else { logger.warn(msg); } }, warnOnce(msg: string, options?: LogOptions) { if (warnedMessages.has(msg)) return; this.warn(msg, options); }, error(msg: string, options?: LogErrorOptions) { const prefix = options?.environment ? `[${options.environment}]` : ''; const err = options?.error; const fullMsg = prefix ? `${prefix} ${msg}` : msg; if (err && err instanceof Error) { logger.error(fullMsg, err); } else { logger.error(fullMsg); } }, clearScreen() { // Let Vite handle screen clearing itself }, hasErrorLogged(_error: Error | import('rollup').RollupError): boolean { // Don't keep error state — always re-report return false; }, }; }