import { type LogLevel, FormatLogger, logLevelPrefix, LogContext, } from '@rocicorp/logger'; function maybeStringifyForLogs( unk: unknown, allowNewlines: boolean, ): unknown | string { if (typeof unk !== 'object') { return unk; } let s = JSON.stringify(unk, null, 1); if (!allowNewlines) { s = s.replace(/\n/g, ''); } return s; } // A LogContext that's appropriate for server-side logging. It: // - prepends the log level // - readably stringifies objects // - optionally removes newlines // // TODO once the dust settles on this move it to @rocicorp/logger. It's here // for faster development for the time being. export function newLogContext( level: LogLevel, allowNewlines = true, ): LogContext { const fl = new FormatLogger( (lvl: LogLevel, ...args: unknown[]): unknown[] => { return [ logLevelPrefix[lvl], ...args.map(unk => maybeStringifyForLogs(unk, allowNewlines)), ]; }, ); return new LogContext(level, undefined, fl); }