/* eslint-disable no-unused-vars */ export enum LogLevel { Error = "ERROR", Warning = "WARNING", Info = "INFO", Debug = "DEBUG", Trace = "TRACE", } const extractUnitFromStack = (stackOffset: number = 2): string | undefined => { const callingLine = new Error().stack?.split("\n")[stackOffset]?.trim(); return ( callingLine ?.match(/packages\/(.*?):\d+/)?.[1] ?.replace(/\//g, "::") ?.replace(/::src::/, "::") ?.replace(/\.ts$/, "") + "::" + callingLine?.match(/:(\d+):/)?.[1] ); }; const createLogWrapper = ( messageTemplate: (error: unknown) => string, level: LogLevel, stackOffset: number = 2, ) => { return (error: unknown) => { const unit = extractUnitFromStack(stackOffset + 2); log(messageTemplate(error), level, unit); }; }; export const log = ( message: string, level: LogLevel = LogLevel.Info, customUnit?: string, ) => { const timestamp = new Date().toISOString(); const levelColors = { [LogLevel.Error]: "\x1b[31m", [LogLevel.Warning]: "\x1b[33m", [LogLevel.Info]: "\x1b[32m", [LogLevel.Debug]: "\x1b[34m", [LogLevel.Trace]: "\x1b[35m", }; const levelColor = levelColors[level]; const unit = customUnit ?? extractUnitFromStack(3); console.log( `\x1b[37m${timestamp}\x1b[0m ${levelColor}${level}\x1b[0m \x1b[1m${unit}\x1b[22m \x1b[37m> ${message}\x1b[0m`, ); }; export const logUnexpectedDiscordAPIError = createLogWrapper( (error: unknown) => `Unexpected Discord API error: ${error instanceof Error ? error.message : String(error)}`, LogLevel.Error, ); export const logUnexpectedDiscordAPIResult = createLogWrapper( (error: unknown) => `Unexpected Discord API result: ${error instanceof Error ? error.message : String(error)}`, LogLevel.Error, ); export const logUnexpectedAIError = createLogWrapper( (error: unknown) => `Unexpected AI error: ${error instanceof Error ? error.message : String(error)}`, LogLevel.Error, );