tim-logger 0.0.28 → 0.0.29

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const m=require("kleur"),l=require("winston"),E=require("winston-transport"),b=require("./console-intercept-CL_BfKQo.cjs"),C=(e={})=>Object.keys(e).reduce((t,o)=>(e[o]!==void 0&&(t[o]=e[o]),t),{}),D=Symbol.for("message"),F=e=>{if(!e||typeof e!="object")return;const t=e.logPath;return typeof t=="string"&&t.length?t:void 0};class j extends E{defaultLogPath;ensuredDirs=new Set;lineFormat;constructor({defaultLogPath:t,format:o}){super(),this.defaultLogPath=t,this.lineFormat=o}log(t,o){setImmediate(()=>this.emit("logged",t));const r=F(t.logEvent?.data)??this.defaultLogPath;if(!r){o();return}(async()=>{const a=(void 0)(r);this.ensuredDirs.has(a)||(this.ensuredDirs.add(a),await(void 0)(a,{recursive:!0}).catch(()=>{}));const n=this.lineFormat.transform({...t},this.lineFormat.options??{}),u=n[D]??n.message??"";await(void 0)(r,`${u}
2
- `,"utf8")})().finally(o)}}const x=l.format.combine(l.format.timestamp({format:()=>new Date().toISOString()}),l.format.printf(e=>{const t=e.logEvent??{},o=e.timestamp??new Date().toISOString(),r=String(t.source??"LOG"),s=String(t.message??e.message??""),a=t.data??{},n=a&&typeof a=="object"&&Object.keys(a).length?` | ${JSON.stringify(a)}`:"";return`[${o}] ${r.padStart(12)}: ${s}${n}`})),O=["console"],R=(e,t,o,r)=>typeof e=="string"?{message:e,level:t,source:o,data:r}:{...e,level:e.level??t,source:e.source??o,data:e.data??r},T=e=>{if(!e)return"";try{return JSON.stringify(e)}catch{return"[unserializable data]"}},I=l.format.combine(l.format.timestamp(),l.format.errors({stack:!0}),l.format.colorize({all:!0}),l.format.printf(e=>{const{timestamp:t,level:o="info",message:r="",stack:s,logEvent:a}=e,n=a??{},u=n.source??"LOG",f=n.verb??o?.toUpperCase?.()??"LOG",h=[n.machineId,n.sessionId].filter(Boolean),v=h.length?m.gray(` [${h.join(" ")}]`):"",i=n.data?m.gray(` ${T(n.data)}`):"",c=typeof n.duration=="number"?m.yellow(` ${n.duration}ms`):"",g=`${t} ${m.bold(`[${u}]`)} ${m.cyan(f)} ${r}${c}${v}${i}`;return s?`${g}
3
- ${s}`:g})),w=(e={})=>{const t=e.transports?.length?e.transports:O;let o=!1;const r=[];t.includes("console")&&r.push(new l.transports.Console({format:I}));const s=e.logPath??e.fsPath??"log.txt";t.includes("fs")&&r.push(new j({defaultLogPath:s,format:x}));const a=l.createLogger({level:"info",transports:r.length?r:[new l.transports.Console]}),n=async(i,c)=>{const g=R(i,"info",e.source,c),S=g.level??"info",p={...g,level:S,timestamp:g.timestamp??Date.now()};if(a.log({level:S,message:p.message,logEvent:p}),t.includes("custom"))if(e.addLog){const y={...p};y.data=C(y.data),await Promise.resolve(e.addLog(y))}else o||(o=!0,console.warn("[tim-logger] Custom transport requested without addLog handler."))},u=async(i,c)=>n({message:i,level:"info",data:c,source:e.source}),f=async(i,c)=>n({message:i,level:"warn",data:c,source:e.source});return{log:n,info:u,warn:f,error:async(i,c)=>n({message:i,level:"error",data:c,source:e.source}),clearLogs:async()=>{if(t.includes("fs"))try{await(void 0)((void 0)(s),{recursive:!0}).catch(()=>{}),await(void 0)(s,"",{flag:"a"}),await(void 0)(s,0),await u("🧹 Logs cleared",{logPath:s})}catch(i){const c=i instanceof Error?i.message:(void 0)("%o",i);await f("Failed to clear logs",{logPath:s,error:c})}}}};let d=w();const q=(e={})=>(d=w(e),d),k=(e,t)=>d.log(e,t),A=(e,t)=>d.info(e,t),G=(e,t)=>d.warn(e,t),L=(e,t)=>d.error(e,t),U=()=>d.clearLogs?.()??Promise.resolve();let $=!1;function P(e,t){const o=t instanceof Error?t.stack||t.message:(void 0)("%o",t);L(`❌ ${e}: ${o}`)}function z({onCrash:e}={}){if($)return;$=!0;const t=o=>r=>{if(P(o,r),typeof e=="function")try{e(r)}catch(s){const a=s instanceof Error?s.stack||s.message:(void 0)("%o",s);L(`❌ Crash handler failed: ${a}`)}};process.on("uncaughtException",t("Uncaught Exception")),process.on("unhandledRejection",t("Unhandled Rejection"))}exports.interceptConsoleLogs=b.interceptConsoleLogs;exports.clearLogs=U;exports.createServerLogger=w;exports.error=L;exports.info=A;exports.init=q;exports.log=k;exports.logCrash=P;exports.registerCrashHandlers=z;exports.warn=G;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const f=require("kleur"),l=require("winston"),E=require("winston-transport"),F=require("./console-intercept-CL_BfKQo.cjs"),C={},$=Object.freeze(Object.defineProperty({__proto__:null,default:C},Symbol.toStringTag,{value:"Module"})),D=(e={})=>Object.keys(e).reduce((t,o)=>(e[o]!==void 0&&(t[o]=e[o]),t),{}),j=Symbol.for("message"),O=e=>{if(!e||typeof e!="object")return;const t=e.logPath;return typeof t=="string"&&t.length?t:void 0};class x extends E{defaultLogPath;ensuredDirs=new Set;lineFormat;constructor({defaultLogPath:t,format:o}){super(),this.defaultLogPath=t,this.lineFormat=o}log(t,o){setImmediate(()=>this.emit("logged",t));const r=O(t.logEvent?.data)??this.defaultLogPath;if(!r){o();return}(async()=>{console.log({path:typeof $,logPath:"undefined",fs:typeof $,mkdir:"undefined",lineFormat:typeof this.lineFormat,transform:typeof this.lineFormat.transform}),console.log("1 ->",1);const a=(void 0)(r);this.ensuredDirs.has(a)||(this.ensuredDirs.add(a),await(void 0)(a,{recursive:!0}).catch(()=>{})),console.log("2 ->",2);const n=this.lineFormat.transform({...t},this.lineFormat.options??{});console.log("3 ->",3);const u=n[j]??n.message??"";console.log("4 ->",4),await(void 0)(r,`${u}
2
+ `,"utf8")})().finally(o)}}const T=l.format.combine(l.format.timestamp({format:()=>new Date().toISOString()}),l.format.printf(e=>{const t=e.logEvent??{},o=e.timestamp??new Date().toISOString(),r=String(t.source??"LOG"),s=String(t.message??e.message??""),a=t.data??{},n=a&&typeof a=="object"&&Object.keys(a).length?` | ${JSON.stringify(a)}`:"";return`[${o}] ${r.padStart(12)}: ${s}${n}`})),_=["console"],R=(e,t,o,r)=>typeof e=="string"?{message:e,level:t,source:o,data:r}:{...e,level:e.level??t,source:e.source??o,data:e.data??r},I=e=>{if(!e)return"";try{return JSON.stringify(e)}catch{return"[unserializable data]"}},k=l.format.combine(l.format.timestamp(),l.format.errors({stack:!0}),l.format.colorize({all:!0}),l.format.printf(e=>{const{timestamp:t,level:o="info",message:r="",stack:s,logEvent:a}=e,n=a??{},u=n.source??"LOG",m=n.verb??o?.toUpperCase?.()??"LOG",h=[n.machineId,n.sessionId].filter(Boolean),L=h.length?f.gray(` [${h.join(" ")}]`):"",i=n.data?f.gray(` ${I(n.data)}`):"",c=typeof n.duration=="number"?f.yellow(` ${n.duration}ms`):"",g=`${t} ${f.bold(`[${u}]`)} ${f.cyan(m)} ${r}${c}${L}${i}`;return s?`${g}
3
+ ${s}`:g})),w=(e={})=>{const t=e.transports?.length?e.transports:_;let o=!1;const r=[];t.includes("console")&&r.push(new l.transports.Console({format:k}));const s=e.logPath??e.fsPath??"log.txt";t.includes("fs")&&r.push(new x({defaultLogPath:s,format:T}));const a=l.createLogger({level:"info",transports:r.length?r:[new l.transports.Console]}),n=async(i,c)=>{const g=R(i,"info",e.source,c),S=g.level??"info",p={...g,level:S,timestamp:g.timestamp??Date.now()};if(a.log({level:S,message:p.message,logEvent:p}),t.includes("custom"))if(e.addLog){const y={...p};y.data=D(y.data),await Promise.resolve(e.addLog(y))}else o||(o=!0,console.warn("[tim-logger] Custom transport requested without addLog handler."))},u=async(i,c)=>n({message:i,level:"info",data:c,source:e.source}),m=async(i,c)=>n({message:i,level:"warn",data:c,source:e.source});return{log:n,info:u,warn:m,error:async(i,c)=>n({message:i,level:"error",data:c,source:e.source}),clearLogs:async()=>{if(t.includes("fs"))try{await(void 0)((void 0)(s),{recursive:!0}).catch(()=>{}),await(void 0)(s,"",{flag:"a"}),await(void 0)(s,0),await u("🧹 Logs cleared",{logPath:s})}catch(i){const c=i instanceof Error?i.message:(void 0)("%o",i);await m("Failed to clear logs",{logPath:s,error:c})}}}};let d=w();const q=(e={})=>(d=w(e),d),z=(e,t)=>d.log(e,t),A=(e,t)=>d.info(e,t),G=(e,t)=>d.warn(e,t),v=(e,t)=>d.error(e,t),U=()=>d.clearLogs?.()??Promise.resolve();let P=!1;function b(e,t){const o=t instanceof Error?t.stack||t.message:(void 0)("%o",t);v(`❌ ${e}: ${o}`)}function H({onCrash:e}={}){if(P)return;P=!0;const t=o=>r=>{if(b(o,r),typeof e=="function")try{e(r)}catch(s){const a=s instanceof Error?s.stack||s.message:(void 0)("%o",s);v(`❌ Crash handler failed: ${a}`)}};process.on("uncaughtException",t("Uncaught Exception")),process.on("unhandledRejection",t("Unhandled Rejection"))}exports.interceptConsoleLogs=F.interceptConsoleLogs;exports.clearLogs=U;exports.createServerLogger=w;exports.error=v;exports.info=A;exports.init=q;exports.log=z;exports.logCrash=b;exports.registerCrashHandlers=H;exports.warn=G;
4
4
  //# sourceMappingURL=server.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.cjs.js","sources":["../src/object.ts","../src/server.ts"],"sourcesContent":["export const cleanObject = <T extends Json>(obj: T = {}): Partial<T> => {\n // remove keys with undefined values\n return Object.keys(obj).reduce((acc: T, key) => {\n if (obj[key] !== undefined) {\n // @ts-ignore\n acc[key] = obj[key];\n }\n return acc as T;\n }, {} as T);\n};\n","import kleur from 'kleur';\nimport type { TransformableInfo } from 'logform';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport * as util from 'node:util';\nimport {\n createLogger as createWinstonLogger,\n transports,\n format as winstonFormat,\n} from 'winston';\nimport TransportStream from 'winston-transport';\nimport { cleanObject } from './object';\nimport type { Logger, ServerLoggerConfig, ServerTransport } from './types';\n\ntype FileInfo = TransformableInfo & {\n logEvent?: Partial<LogEvent>;\n};\n\nconst MESSAGE = Symbol.for('message');\n\nconst getLogPathFromData = (data?: Json) => {\n if (!data || typeof data !== 'object') return undefined;\n const maybeLogPath = (data as Record<string, unknown>).logPath;\n return typeof maybeLogPath === 'string' && maybeLogPath.length\n ? maybeLogPath\n : undefined;\n};\n\nclass DynamicFileTransport extends TransportStream {\n private defaultLogPath: string;\n private ensuredDirs = new Set<string>();\n private lineFormat: ReturnType<typeof winstonFormat.combine>;\n\n constructor({\n defaultLogPath,\n format,\n }: {\n defaultLogPath: string;\n format: ReturnType<typeof winstonFormat.combine>;\n }) {\n // IMPORTANT: don't pass `format` into super if you're going to transform manually\n super();\n this.defaultLogPath = defaultLogPath;\n this.lineFormat = format;\n }\n\n override log(info: FileInfo, callback: () => void) {\n setImmediate(() => this.emit('logged', info));\n\n const logPath =\n getLogPathFromData(info.logEvent?.data) ?? this.defaultLogPath;\n\n if (!logPath) {\n callback();\n return;\n }\n\n const write = async () => {\n const dir = path.dirname(logPath);\n if (!this.ensuredDirs.has(dir)) {\n this.ensuredDirs.add(dir);\n await fs.mkdir(dir, { recursive: true }).catch(() => {});\n }\n\n // clone because logform formats mutate `info`\n const formatted = this.lineFormat.transform(\n { ...info },\n this.lineFormat.options ?? {}\n ) as FileInfo;\n\n const message =\n (formatted as any)[MESSAGE] ?? formatted.message ?? '';\n\n await fs.appendFile(logPath, `${message}\\n`, 'utf8');\n };\n\n void write()\n // .catch((err) => {\n // const msg =\n // err instanceof Error ? err.message : util.format('%o', err);\n // console.warn('[tim-logger] Failed to write log file', {\n // logPath,\n // error: msg,\n // });\n // })\n .finally(callback);\n }\n}\n\nconst fileLineFormat = winstonFormat.combine(\n winstonFormat.timestamp({ format: () => new Date().toISOString() }),\n winstonFormat.printf((info: FileInfo) => {\n const entry = info.logEvent ?? {};\n\n // Use the formatter timestamp (or fallback), instead of generating a new one.\n const timestamp =\n (info.timestamp as string) ?? new Date().toISOString();\n\n const name = String(entry.source ?? 'LOG');\n const text = String(entry.message ?? info.message ?? '');\n\n const data = (entry.data ?? {}) as Record<string, unknown>;\n const dataString =\n data && typeof data === 'object' && Object.keys(data).length\n ? ` | ${JSON.stringify(data)}`\n : '';\n\n return `[${timestamp}] ${name.padStart(12)}: ${text}${dataString}`;\n })\n);\n\nconst DEFAULT_SERVER_TRANSPORTS: ServerTransport[] = ['console'];\n\ntype ConsoleInfo = TransformableInfo & {\n timestamp?: string;\n stack?: string;\n logEvent?: Partial<LogEvent>;\n};\n\nconst normalizeEvent = (\n eventOrMessage: LogEvent | string,\n level?: LogLevel,\n source?: string,\n data?: Json\n): LogEvent => {\n if (typeof eventOrMessage === 'string') {\n return { message: eventOrMessage, level, source, data } as LogEvent;\n }\n\n return {\n ...eventOrMessage,\n level: eventOrMessage.level ?? level,\n source: eventOrMessage.source ?? source,\n data: eventOrMessage.data ?? data,\n };\n};\n\nconst stringifyData = (data?: Json) => {\n if (!data) return '';\n try {\n return JSON.stringify(data);\n } catch {\n return '[unserializable data]';\n }\n};\n\nconst consoleFormat = winstonFormat.combine(\n winstonFormat.timestamp(),\n winstonFormat.errors({ stack: true }),\n winstonFormat.colorize({ all: true }),\n winstonFormat.printf((info: ConsoleInfo) => {\n const {\n timestamp,\n level = 'info',\n message = '',\n stack,\n logEvent,\n } = info;\n\n const entry: Partial<LogEvent> = logEvent ?? {};\n const source = entry.source ?? 'LOG';\n const verb = entry.verb ?? level?.toUpperCase?.() ?? 'LOG';\n\n const contextParts = [entry.machineId, entry.sessionId].filter(Boolean);\n const ctx = contextParts.length\n ? kleur.gray(` [${contextParts.join(' ')}]`)\n : '';\n\n const data = entry.data\n ? kleur.gray(` ${stringifyData(entry.data)}`)\n : '';\n\n const duration =\n typeof entry.duration === 'number'\n ? kleur.yellow(` ${entry.duration}ms`)\n : '';\n\n const base = `${timestamp} ${kleur.bold(`[${source}]`)} ${kleur.cyan(\n verb\n )} ${message}${duration}${ctx}${data}`;\n\n return stack ? `${base}\\n${stack}` : base;\n })\n);\n\nexport const createServerLogger = (config: ServerLoggerConfig = {}): Logger => {\n const transportsArr = config.transports?.length\n ? config.transports\n : DEFAULT_SERVER_TRANSPORTS;\n let warnedMissingCustom = false;\n\n const winstonTransports: TransportStream[] = [];\n\n if (transportsArr.includes('console')) {\n winstonTransports.push(\n new transports.Console({\n format: consoleFormat,\n })\n );\n }\n\n const defaultLogPath = config.logPath ?? config.fsPath ?? 'log.txt';\n\n if (transportsArr.includes('fs')) {\n winstonTransports.push(\n new DynamicFileTransport({\n defaultLogPath,\n format: fileLineFormat,\n })\n );\n }\n\n const baseLogger = createWinstonLogger({\n level: 'info',\n transports: winstonTransports.length\n ? winstonTransports\n : [new transports.Console()],\n });\n\n const log = async (eventOrMessage: LogEvent | string, data?: Json) => {\n const event = normalizeEvent(\n eventOrMessage,\n 'info',\n config.source,\n data\n );\n const resolvedLevel = event.level ?? 'info';\n\n const payload = {\n ...event,\n level: resolvedLevel,\n timestamp: event.timestamp ?? Date.now(),\n };\n\n baseLogger.log({\n level: resolvedLevel,\n message: payload.message,\n logEvent: payload,\n });\n\n if (transportsArr.includes('custom')) {\n if (config.addLog) {\n const clean = { ...payload };\n clean.data = cleanObject(clean.data);\n await Promise.resolve(config.addLog(clean));\n } else if (!warnedMissingCustom) {\n warnedMissingCustom = true;\n console.warn(\n '[tim-logger] Custom transport requested without addLog handler.'\n );\n }\n }\n };\n\n const info = async (message: string, data?: Json) =>\n log({\n message,\n level: 'info',\n data,\n source: config.source,\n } as LogEvent);\n\n const warn = async (message: string, data?: Json) =>\n log({\n message,\n level: 'warn',\n data,\n source: config.source,\n } as LogEvent);\n\n const error = async (message: string, data?: Json) =>\n log({\n message,\n level: 'error',\n data,\n source: config.source,\n } as LogEvent);\n\n /**\n * Clears the fs transport logs by truncating the file.\n * No-op if 'fs' transport is not enabled.\n */\n const clearLogs = async () => {\n if (!transportsArr.includes('fs')) return;\n\n try {\n // Ensure file exists, then truncate.\n await fs\n .mkdir(path.dirname(defaultLogPath), {\n recursive: true,\n })\n .catch(() => {});\n await fs.writeFile(defaultLogPath, '', { flag: 'a' }); // touch\n await fs.truncate(defaultLogPath, 0);\n await info('🧹 Logs cleared', { logPath: defaultLogPath });\n } catch (err) {\n // Don’t throw; log the failure instead.\n const msg =\n err instanceof Error ? err.message : util.format('%o', err);\n await warn('Failed to clear logs', {\n logPath: defaultLogPath,\n error: msg,\n });\n }\n };\n\n return { log, info, warn, error, clearLogs };\n};\n\nlet defaultLogger = createServerLogger();\n\nexport const init = (config: ServerLoggerConfig = {}) => {\n defaultLogger = createServerLogger(config);\n return defaultLogger;\n};\n\nexport const log = (eventOrMessage: LogEvent | string, data?: Json) =>\n defaultLogger.log(eventOrMessage, data);\nexport const info = (message: string, data?: Json) =>\n defaultLogger.info(message, data);\nexport const warn = (message: string, data?: Json) =>\n defaultLogger.warn(message, data);\nexport const error = (message: string, data?: Json) =>\n defaultLogger.error(message, data);\nexport const clearLogs = () => defaultLogger.clearLogs?.() ?? Promise.resolve();\nexport { interceptConsoleLogs } from './console-intercept';\n\n// newly added\nlet crashHandlersRegistered = false;\n\nexport function logCrash(type: string, err: unknown) {\n const message =\n err instanceof Error\n ? err.stack || err.message\n : util.format('%o', err);\n void error(`❌ ${type}: ${message}`);\n}\n\nexport function registerCrashHandlers({\n onCrash,\n}: { onCrash?: (err: unknown) => void } = {}) {\n if (crashHandlersRegistered) return;\n crashHandlersRegistered = true;\n\n const handleCrash = (type: string) => (err: unknown) => {\n logCrash(type, err);\n if (typeof onCrash === 'function') {\n try {\n onCrash(err);\n } catch (handlerErr) {\n // FIX: was `log.error(...)` (wrong symbol). Use our logger.\n const msg =\n handlerErr instanceof Error\n ? handlerErr.stack || handlerErr.message\n : util.format('%o', handlerErr);\n void error(`❌ Crash handler failed: ${msg}`);\n }\n }\n };\n\n process.on('uncaughtException', handleCrash('Uncaught Exception'));\n process.on('unhandledRejection', handleCrash('Unhandled Rejection'));\n}\n"],"names":["cleanObject","obj","acc","key","MESSAGE","getLogPathFromData","data","maybeLogPath","DynamicFileTransport","TransportStream","defaultLogPath","format","info","callback","logPath","dir","path.dirname","fs.mkdir","formatted","message","fs.appendFile","fileLineFormat","winstonFormat","entry","timestamp","name","text","dataString","DEFAULT_SERVER_TRANSPORTS","normalizeEvent","eventOrMessage","level","source","stringifyData","consoleFormat","stack","logEvent","verb","contextParts","ctx","kleur","duration","base","createServerLogger","config","transportsArr","warnedMissingCustom","winstonTransports","transports","baseLogger","createWinstonLogger","log","event","resolvedLevel","payload","clean","warn","fs.writeFile","fs.truncate","err","msg","util.format","clearLogs","defaultLogger","init","error","crashHandlersRegistered","logCrash","type","registerCrashHandlers","onCrash","handleCrash","handlerErr"],"mappings":"2MAAaA,EAAc,CAAiBC,EAAS,KAE1C,OAAO,KAAKA,CAAG,EAAE,OAAO,CAACC,EAAQC,KAChCF,EAAIE,CAAG,IAAM,SAEbD,EAAIC,CAAG,EAAIF,EAAIE,CAAG,GAEfD,GACR,CAAA,CAAO,ECURE,EAAU,OAAO,IAAI,SAAS,EAE9BC,EAAsBC,GAAgB,CACxC,GAAI,CAACA,GAAQ,OAAOA,GAAS,SAAU,OACvC,MAAMC,EAAgBD,EAAiC,QACvD,OAAO,OAAOC,GAAiB,UAAYA,EAAa,OAClDA,EACA,MACV,EAEA,MAAMC,UAA6BC,CAAgB,CACvC,eACA,gBAAkB,IAClB,WAER,YAAY,CACR,eAAAC,EACA,OAAAC,CAAA,EAID,CAEC,MAAA,EACA,KAAK,eAAiBD,EACtB,KAAK,WAAaC,CACtB,CAES,IAAIC,EAAgBC,EAAsB,CAC/C,aAAa,IAAM,KAAK,KAAK,SAAUD,CAAI,CAAC,EAE5C,MAAME,EACFT,EAAmBO,EAAK,UAAU,IAAI,GAAK,KAAK,eAEpD,GAAI,CAACE,EAAS,CACVD,EAAA,EACA,MACJ,EAEc,SAAY,CACtB,MAAME,EAAMC,SAAaF,CAAO,EAC3B,KAAK,YAAY,IAAIC,CAAG,IACzB,KAAK,YAAY,IAAIA,CAAG,EACxB,KAAME,SAASF,EAAK,CAAE,UAAW,EAAA,CAAM,EAAE,MAAM,IAAM,CAAC,CAAC,GAI3D,MAAMG,EAAY,KAAK,WAAW,UAC9B,CAAE,GAAGN,CAAAA,EACL,KAAK,WAAW,SAAW,CAAA,CAAC,EAG1BO,EACDD,EAAkBd,CAAO,GAAKc,EAAU,SAAW,GAExD,KAAME,SAAcN,EAAS,GAAGK,CAAO;AAAA,EAAM,MAAM,CACvD,GAEK,EASA,QAAQN,CAAQ,CACzB,CACJ,CAEA,MAAMQ,EAAiBC,EAAAA,OAAc,QACjCA,SAAc,UAAU,CAAE,OAAQ,QAAU,KAAA,EAAO,YAAA,EAAe,EAClEA,SAAc,OAAQV,GAAmB,CACrC,MAAMW,EAAQX,EAAK,UAAY,CAAA,EAGzBY,EACDZ,EAAK,WAAwB,IAAI,KAAA,EAAO,YAAA,EAEvCa,EAAO,OAAOF,EAAM,QAAU,KAAK,EACnCG,EAAO,OAAOH,EAAM,SAAWX,EAAK,SAAW,EAAE,EAEjDN,EAAQiB,EAAM,MAAQ,CAAA,EACtBI,EACFrB,GAAQ,OAAOA,GAAS,UAAY,OAAO,KAAKA,CAAI,EAAE,OAChD,MAAM,KAAK,UAAUA,CAAI,CAAC,GAC1B,GAEV,MAAO,IAAIkB,CAAS,KAAKC,EAAK,SAAS,EAAE,CAAC,KAAKC,CAAI,GAAGC,CAAU,EACpE,CAAC,CACL,EAEMC,EAA+C,CAAC,SAAS,EAQzDC,EAAiB,CACnBC,EACAC,EACAC,EACA1B,IAEI,OAAOwB,GAAmB,SACnB,CAAE,QAASA,EAAgB,MAAAC,EAAO,OAAAC,EAAQ,KAAA1B,CAAA,EAG9C,CACH,GAAGwB,EACH,MAAOA,EAAe,OAASC,EAC/B,OAAQD,EAAe,QAAUE,EACjC,KAAMF,EAAe,MAAQxB,CAAA,EAI/B2B,EAAiB3B,GAAgB,CACnC,GAAI,CAACA,EAAM,MAAO,GAClB,GAAI,CACA,OAAO,KAAK,UAAUA,CAAI,CAC9B,MAAQ,CACJ,MAAO,uBACX,CACJ,EAEM4B,EAAgBZ,EAAAA,OAAc,QAChCA,EAAAA,OAAc,UAAA,EACdA,EAAAA,OAAc,OAAO,CAAE,MAAO,GAAM,EACpCA,EAAAA,OAAc,SAAS,CAAE,IAAK,GAAM,EACpCA,SAAc,OAAQV,GAAsB,CACxC,KAAM,CACF,UAAAY,EACA,MAAAO,EAAQ,OACR,QAAAZ,EAAU,GACV,MAAAgB,EACA,SAAAC,CAAA,EACAxB,EAEEW,EAA2Ba,GAAY,CAAA,EACvCJ,EAAST,EAAM,QAAU,MACzBc,EAAOd,EAAM,MAAQQ,GAAO,iBAAmB,MAE/CO,EAAe,CAACf,EAAM,UAAWA,EAAM,SAAS,EAAE,OAAO,OAAO,EAChEgB,EAAMD,EAAa,OACnBE,EAAM,KAAK,KAAKF,EAAa,KAAK,GAAG,CAAC,GAAG,EACzC,GAEAhC,EAAOiB,EAAM,KACbiB,EAAM,KAAK,IAAIP,EAAcV,EAAM,IAAI,CAAC,EAAE,EAC1C,GAEAkB,EACF,OAAOlB,EAAM,UAAa,SACpBiB,EAAM,OAAO,IAAIjB,EAAM,QAAQ,IAAI,EACnC,GAEJmB,EAAO,GAAGlB,CAAS,IAAIgB,EAAM,KAAK,IAAIR,CAAM,GAAG,CAAC,IAAIQ,EAAM,KAC5DH,CAAA,CACH,IAAIlB,CAAO,GAAGsB,CAAQ,GAAGF,CAAG,GAAGjC,CAAI,GAEpC,OAAO6B,EAAQ,GAAGO,CAAI;AAAA,EAAKP,CAAK,GAAKO,CACzC,CAAC,CACL,EAEaC,EAAqB,CAACC,EAA6B,KAAe,CAC3E,MAAMC,EAAgBD,EAAO,YAAY,OACnCA,EAAO,WACPhB,EACN,IAAIkB,EAAsB,GAE1B,MAAMC,EAAuC,CAAA,EAEzCF,EAAc,SAAS,SAAS,GAChCE,EAAkB,KACd,IAAIC,EAAAA,WAAW,QAAQ,CACnB,OAAQd,CAAA,CACX,CAAA,EAIT,MAAMxB,EAAiBkC,EAAO,SAAWA,EAAO,QAAU,UAEtDC,EAAc,SAAS,IAAI,GAC3BE,EAAkB,KACd,IAAIvC,EAAqB,CACrB,eAAAE,EACA,OAAQW,CAAA,CACX,CAAA,EAIT,MAAM4B,EAAaC,EAAAA,aAAoB,CACnC,MAAO,OACP,WAAYH,EAAkB,OACxBA,EACA,CAAC,IAAIC,EAAAA,WAAW,OAAS,CAAA,CAClC,EAEKG,EAAM,MAAOrB,EAAmCxB,IAAgB,CAClE,MAAM8C,EAAQvB,EACVC,EACA,OACAc,EAAO,OACPtC,CAAA,EAEE+C,EAAgBD,EAAM,OAAS,OAE/BE,EAAU,CACZ,GAAGF,EACH,MAAOC,EACP,UAAWD,EAAM,WAAa,KAAK,IAAA,CAAI,EAS3C,GANAH,EAAW,IAAI,CACX,MAAOI,EACP,QAASC,EAAQ,QACjB,SAAUA,CAAA,CACb,EAEGT,EAAc,SAAS,QAAQ,EAC/B,GAAID,EAAO,OAAQ,CACf,MAAMW,EAAQ,CAAE,GAAGD,CAAA,EACnBC,EAAM,KAAOvD,EAAYuD,EAAM,IAAI,EACnC,MAAM,QAAQ,QAAQX,EAAO,OAAOW,CAAK,CAAC,CAC9C,MAAYT,IACRA,EAAsB,GACtB,QAAQ,KACJ,iEAAA,EAIhB,EAEMlC,EAAO,MAAOO,EAAiBb,IACjC6C,EAAI,CACA,QAAAhC,EACA,MAAO,OACP,KAAAb,EACA,OAAQsC,EAAO,MAAA,CACN,EAEXY,EAAO,MAAOrC,EAAiBb,IACjC6C,EAAI,CACA,QAAAhC,EACA,MAAO,OACP,KAAAb,EACA,OAAQsC,EAAO,MAAA,CACN,EAsCjB,MAAO,CAAE,IAAAO,EAAK,KAAAvC,EAAM,KAAA4C,EAAM,MApCZ,MAAOrC,EAAiBb,IAClC6C,EAAI,CACA,QAAAhC,EACA,MAAO,QACP,KAAAb,EACA,OAAQsC,EAAO,MAAA,CACN,EA8BgB,UAxBf,SAAY,CAC1B,GAAKC,EAAc,SAAS,IAAI,EAEhC,GAAI,CAEA,KAAM5B,SACKD,SAAaN,CAAc,EAAG,CACjC,UAAW,EAAA,CACd,EACA,MAAM,IAAM,CAAC,CAAC,EACnB,KAAM+C,SAAa/C,EAAgB,GAAI,CAAE,KAAM,IAAK,EACpD,KAAMgD,SAAYhD,EAAgB,CAAC,EACnC,MAAME,EAAK,kBAAmB,CAAE,QAASF,EAAgB,CAC7D,OAASiD,EAAK,CAEV,MAAMC,EACFD,aAAe,MAAQA,EAAI,QAAUE,SAAY,KAAMF,CAAG,EAC9D,MAAMH,EAAK,uBAAwB,CAC/B,QAAS9C,EACT,MAAOkD,CAAA,CACV,CACL,CACJ,CAEiCE,CACrC,EAEA,IAAIC,EAAgBpB,EAAA,EAEb,MAAMqB,EAAO,CAACpB,EAA6B,MAC9CmB,EAAgBpB,EAAmBC,CAAM,EAClCmB,GAGEZ,EAAM,CAACrB,EAAmCxB,IACnDyD,EAAc,IAAIjC,EAAgBxB,CAAI,EAC7BM,EAAO,CAACO,EAAiBb,IAClCyD,EAAc,KAAK5C,EAASb,CAAI,EACvBkD,EAAO,CAACrC,EAAiBb,IAClCyD,EAAc,KAAK5C,EAASb,CAAI,EACvB2D,EAAQ,CAAC9C,EAAiBb,IACnCyD,EAAc,MAAM5C,EAASb,CAAI,EACxBwD,EAAY,IAAMC,EAAc,YAAA,GAAiB,QAAQ,QAAA,EAItE,IAAIG,EAA0B,GAEvB,SAASC,EAASC,EAAcT,EAAc,CACjD,MAAMxC,EACFwC,aAAe,MACTA,EAAI,OAASA,EAAI,QACjBE,SAAY,KAAMF,CAAG,EAC1BM,EAAM,KAAKG,CAAI,KAAKjD,CAAO,EAAE,CACtC,CAEO,SAASkD,EAAsB,CAClC,QAAAC,CACJ,EAA0C,GAAI,CAC1C,GAAIJ,EAAyB,OAC7BA,EAA0B,GAE1B,MAAMK,EAAeH,GAAkBT,GAAiB,CAEpD,GADAQ,EAASC,EAAMT,CAAG,EACd,OAAOW,GAAY,WACnB,GAAI,CACAA,EAAQX,CAAG,CACf,OAASa,EAAY,CAEjB,MAAMZ,EACFY,aAAsB,MAChBA,EAAW,OAASA,EAAW,QAC/BX,SAAY,KAAMW,CAAU,EACjCP,EAAM,2BAA2BL,CAAG,EAAE,CAC/C,CAER,EAEA,QAAQ,GAAG,oBAAqBW,EAAY,oBAAoB,CAAC,EACjE,QAAQ,GAAG,qBAAsBA,EAAY,qBAAqB,CAAC,CACvE"}
1
+ {"version":3,"file":"server.cjs.js","sources":["../__vite-browser-external","../src/object.ts","../src/server.ts"],"sourcesContent":["export default {}","export const cleanObject = <T extends Json>(obj: T = {}): Partial<T> => {\n // remove keys with undefined values\n return Object.keys(obj).reduce((acc: T, key) => {\n if (obj[key] !== undefined) {\n // @ts-ignore\n acc[key] = obj[key];\n }\n return acc as T;\n }, {} as T);\n};\n","import kleur from 'kleur';\nimport type { TransformableInfo } from 'logform';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport * as util from 'node:util';\nimport {\n createLogger as createWinstonLogger,\n transports,\n format as winstonFormat,\n} from 'winston';\nimport TransportStream from 'winston-transport';\nimport { cleanObject } from './object';\nimport type { Logger, ServerLoggerConfig, ServerTransport } from './types';\n\ntype FileInfo = TransformableInfo & {\n logEvent?: Partial<LogEvent>;\n};\n\nconst MESSAGE = Symbol.for('message');\n\nconst getLogPathFromData = (data?: Json) => {\n if (!data || typeof data !== 'object') return undefined;\n const maybeLogPath = (data as Record<string, unknown>).logPath;\n return typeof maybeLogPath === 'string' && maybeLogPath.length\n ? maybeLogPath\n : undefined;\n};\n\nclass DynamicFileTransport extends TransportStream {\n private defaultLogPath: string;\n private ensuredDirs = new Set<string>();\n private lineFormat: ReturnType<typeof winstonFormat.combine>;\n\n constructor({\n defaultLogPath,\n format,\n }: {\n defaultLogPath: string;\n format: ReturnType<typeof winstonFormat.combine>;\n }) {\n // IMPORTANT: don't pass `format` into super if you're going to transform manually\n super();\n this.defaultLogPath = defaultLogPath;\n this.lineFormat = format;\n }\n\n override log(info: FileInfo, callback: () => void) {\n setImmediate(() => this.emit('logged', info));\n\n const logPath =\n getLogPathFromData(info.logEvent?.data) ?? this.defaultLogPath;\n\n if (!logPath) {\n callback();\n return;\n }\n\n const write = async () => {\n console.log({\n path: typeof path,\n logPath: typeof path.dirname,\n fs: typeof fs,\n mkdir: typeof fs.mkdir,\n lineFormat: typeof this.lineFormat,\n transform: typeof this.lineFormat.transform,\n });\n\n console.log('1 ->', 1);\n\n const dir = path.dirname(logPath);\n if (!this.ensuredDirs.has(dir)) {\n this.ensuredDirs.add(dir);\n await fs.mkdir(dir, { recursive: true }).catch(() => {});\n }\n\n console.log('2 ->', 2);\n\n // clone because logform formats mutate `info`\n const formatted = this.lineFormat.transform(\n { ...info },\n this.lineFormat.options ?? {}\n ) as FileInfo;\n console.log('3 ->', 3);\n\n const message =\n (formatted as any)[MESSAGE] ?? formatted.message ?? '';\n\n console.log('4 ->', 4);\n\n await fs.appendFile(logPath, `${message}\\n`, 'utf8');\n };\n\n void write()\n // .catch((err) => {\n // const msg =\n // err instanceof Error ? err.message : util.format('%o', err);\n // console.warn('[tim-logger] Failed to write log file', {\n // logPath,\n // error: msg,\n // });\n // })\n .finally(callback);\n }\n}\n\nconst fileLineFormat = winstonFormat.combine(\n winstonFormat.timestamp({ format: () => new Date().toISOString() }),\n winstonFormat.printf((info: FileInfo) => {\n const entry = info.logEvent ?? {};\n\n // Use the formatter timestamp (or fallback), instead of generating a new one.\n const timestamp =\n (info.timestamp as string) ?? new Date().toISOString();\n\n const name = String(entry.source ?? 'LOG');\n const text = String(entry.message ?? info.message ?? '');\n\n const data = (entry.data ?? {}) as Record<string, unknown>;\n const dataString =\n data && typeof data === 'object' && Object.keys(data).length\n ? ` | ${JSON.stringify(data)}`\n : '';\n\n return `[${timestamp}] ${name.padStart(12)}: ${text}${dataString}`;\n })\n);\n\nconst DEFAULT_SERVER_TRANSPORTS: ServerTransport[] = ['console'];\n\ntype ConsoleInfo = TransformableInfo & {\n timestamp?: string;\n stack?: string;\n logEvent?: Partial<LogEvent>;\n};\n\nconst normalizeEvent = (\n eventOrMessage: LogEvent | string,\n level?: LogLevel,\n source?: string,\n data?: Json\n): LogEvent => {\n if (typeof eventOrMessage === 'string') {\n return { message: eventOrMessage, level, source, data } as LogEvent;\n }\n\n return {\n ...eventOrMessage,\n level: eventOrMessage.level ?? level,\n source: eventOrMessage.source ?? source,\n data: eventOrMessage.data ?? data,\n };\n};\n\nconst stringifyData = (data?: Json) => {\n if (!data) return '';\n try {\n return JSON.stringify(data);\n } catch {\n return '[unserializable data]';\n }\n};\n\nconst consoleFormat = winstonFormat.combine(\n winstonFormat.timestamp(),\n winstonFormat.errors({ stack: true }),\n winstonFormat.colorize({ all: true }),\n winstonFormat.printf((info: ConsoleInfo) => {\n const {\n timestamp,\n level = 'info',\n message = '',\n stack,\n logEvent,\n } = info;\n\n const entry: Partial<LogEvent> = logEvent ?? {};\n const source = entry.source ?? 'LOG';\n const verb = entry.verb ?? level?.toUpperCase?.() ?? 'LOG';\n\n const contextParts = [entry.machineId, entry.sessionId].filter(Boolean);\n const ctx = contextParts.length\n ? kleur.gray(` [${contextParts.join(' ')}]`)\n : '';\n\n const data = entry.data\n ? kleur.gray(` ${stringifyData(entry.data)}`)\n : '';\n\n const duration =\n typeof entry.duration === 'number'\n ? kleur.yellow(` ${entry.duration}ms`)\n : '';\n\n const base = `${timestamp} ${kleur.bold(`[${source}]`)} ${kleur.cyan(\n verb\n )} ${message}${duration}${ctx}${data}`;\n\n return stack ? `${base}\\n${stack}` : base;\n })\n);\n\nexport const createServerLogger = (config: ServerLoggerConfig = {}): Logger => {\n const transportsArr = config.transports?.length\n ? config.transports\n : DEFAULT_SERVER_TRANSPORTS;\n let warnedMissingCustom = false;\n\n const winstonTransports: TransportStream[] = [];\n\n if (transportsArr.includes('console')) {\n winstonTransports.push(\n new transports.Console({\n format: consoleFormat,\n })\n );\n }\n\n const defaultLogPath = config.logPath ?? config.fsPath ?? 'log.txt';\n\n if (transportsArr.includes('fs')) {\n winstonTransports.push(\n new DynamicFileTransport({\n defaultLogPath,\n format: fileLineFormat,\n })\n );\n }\n\n const baseLogger = createWinstonLogger({\n level: 'info',\n transports: winstonTransports.length\n ? winstonTransports\n : [new transports.Console()],\n });\n\n const log = async (eventOrMessage: LogEvent | string, data?: Json) => {\n const event = normalizeEvent(\n eventOrMessage,\n 'info',\n config.source,\n data\n );\n const resolvedLevel = event.level ?? 'info';\n\n const payload = {\n ...event,\n level: resolvedLevel,\n timestamp: event.timestamp ?? Date.now(),\n };\n\n baseLogger.log({\n level: resolvedLevel,\n message: payload.message,\n logEvent: payload,\n });\n\n if (transportsArr.includes('custom')) {\n if (config.addLog) {\n const clean = { ...payload };\n clean.data = cleanObject(clean.data);\n await Promise.resolve(config.addLog(clean));\n } else if (!warnedMissingCustom) {\n warnedMissingCustom = true;\n console.warn(\n '[tim-logger] Custom transport requested without addLog handler.'\n );\n }\n }\n };\n\n const info = async (message: string, data?: Json) =>\n log({\n message,\n level: 'info',\n data,\n source: config.source,\n } as LogEvent);\n\n const warn = async (message: string, data?: Json) =>\n log({\n message,\n level: 'warn',\n data,\n source: config.source,\n } as LogEvent);\n\n const error = async (message: string, data?: Json) =>\n log({\n message,\n level: 'error',\n data,\n source: config.source,\n } as LogEvent);\n\n /**\n * Clears the fs transport logs by truncating the file.\n * No-op if 'fs' transport is not enabled.\n */\n const clearLogs = async () => {\n if (!transportsArr.includes('fs')) return;\n\n try {\n // Ensure file exists, then truncate.\n await fs\n .mkdir(path.dirname(defaultLogPath), {\n recursive: true,\n })\n .catch(() => {});\n await fs.writeFile(defaultLogPath, '', { flag: 'a' }); // touch\n await fs.truncate(defaultLogPath, 0);\n await info('🧹 Logs cleared', { logPath: defaultLogPath });\n } catch (err) {\n // Don’t throw; log the failure instead.\n const msg =\n err instanceof Error ? err.message : util.format('%o', err);\n await warn('Failed to clear logs', {\n logPath: defaultLogPath,\n error: msg,\n });\n }\n };\n\n return { log, info, warn, error, clearLogs };\n};\n\nlet defaultLogger = createServerLogger();\n\nexport const init = (config: ServerLoggerConfig = {}) => {\n defaultLogger = createServerLogger(config);\n return defaultLogger;\n};\n\nexport const log = (eventOrMessage: LogEvent | string, data?: Json) =>\n defaultLogger.log(eventOrMessage, data);\nexport const info = (message: string, data?: Json) =>\n defaultLogger.info(message, data);\nexport const warn = (message: string, data?: Json) =>\n defaultLogger.warn(message, data);\nexport const error = (message: string, data?: Json) =>\n defaultLogger.error(message, data);\nexport const clearLogs = () => defaultLogger.clearLogs?.() ?? Promise.resolve();\nexport { interceptConsoleLogs } from './console-intercept';\n\n// newly added\nlet crashHandlersRegistered = false;\n\nexport function logCrash(type: string, err: unknown) {\n const message =\n err instanceof Error\n ? err.stack || err.message\n : util.format('%o', err);\n void error(`❌ ${type}: ${message}`);\n}\n\nexport function registerCrashHandlers({\n onCrash,\n}: { onCrash?: (err: unknown) => void } = {}) {\n if (crashHandlersRegistered) return;\n crashHandlersRegistered = true;\n\n const handleCrash = (type: string) => (err: unknown) => {\n logCrash(type, err);\n if (typeof onCrash === 'function') {\n try {\n onCrash(err);\n } catch (handlerErr) {\n // FIX: was `log.error(...)` (wrong symbol). Use our logger.\n const msg =\n handlerErr instanceof Error\n ? handlerErr.stack || handlerErr.message\n : util.format('%o', handlerErr);\n void error(`❌ Crash handler failed: ${msg}`);\n }\n }\n };\n\n process.on('uncaughtException', handleCrash('Uncaught Exception'));\n process.on('unhandledRejection', handleCrash('Unhandled Rejection'));\n}\n"],"names":["__viteBrowserExternal","cleanObject","obj","acc","key","MESSAGE","getLogPathFromData","data","maybeLogPath","DynamicFileTransport","TransportStream","defaultLogPath","format","info","callback","logPath","path","fs","dir","path.dirname","fs.mkdir","formatted","message","fs.appendFile","fileLineFormat","winstonFormat","entry","timestamp","name","text","dataString","DEFAULT_SERVER_TRANSPORTS","normalizeEvent","eventOrMessage","level","source","stringifyData","consoleFormat","stack","logEvent","verb","contextParts","ctx","kleur","duration","base","createServerLogger","config","transportsArr","warnedMissingCustom","winstonTransports","transports","baseLogger","createWinstonLogger","log","event","resolvedLevel","payload","clean","warn","fs.writeFile","fs.truncate","err","msg","util.format","clearLogs","defaultLogger","init","error","crashHandlersRegistered","logCrash","type","registerCrashHandlers","onCrash","handleCrash","handlerErr"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAmB,MAAM,SAAS,CAAC;AA6K3E,eAAO,MAAM,kBAAkB,GAAI,SAAQ,kBAAuB,KAAG,MA0HpE,CAAC;AAIF,eAAO,MAAM,IAAI,GAAI,SAAQ,kBAAuB,WAGnD,CAAC;AAEF,eAAO,MAAM,GAAG,GAAI,gBAAgB,QAAQ,GAAG,MAAM,EAAE,OAAO,IAAI,kBACvB,CAAC;AAC5C,eAAO,MAAM,IAAI,GAAI,SAAS,MAAM,EAAE,OAAO,IAAI,kBACZ,CAAC;AACtC,eAAO,MAAM,IAAI,GAAI,SAAS,MAAM,EAAE,OAAO,IAAI,kBACZ,CAAC;AACtC,eAAO,MAAM,KAAK,GAAI,SAAS,MAAM,EAAE,OAAO,IAAI,kBACZ,CAAC;AACvC,eAAO,MAAM,SAAS,qBAAyD,CAAC;AAChF,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAK3D,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,QAMlD;AAED,wBAAgB,qBAAqB,CAAC,EAClC,OAAO,GACV,GAAE;IAAE,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAA;CAAO,QAsB3C"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAmB,MAAM,SAAS,CAAC;AA6L3E,eAAO,MAAM,kBAAkB,GAAI,SAAQ,kBAAuB,KAAG,MA0HpE,CAAC;AAIF,eAAO,MAAM,IAAI,GAAI,SAAQ,kBAAuB,WAGnD,CAAC;AAEF,eAAO,MAAM,GAAG,GAAI,gBAAgB,QAAQ,GAAG,MAAM,EAAE,OAAO,IAAI,kBACvB,CAAC;AAC5C,eAAO,MAAM,IAAI,GAAI,SAAS,MAAM,EAAE,OAAO,IAAI,kBACZ,CAAC;AACtC,eAAO,MAAM,IAAI,GAAI,SAAS,MAAM,EAAE,OAAO,IAAI,kBACZ,CAAC;AACtC,eAAO,MAAM,KAAK,GAAI,SAAS,MAAM,EAAE,OAAO,IAAI,kBACZ,CAAC;AACvC,eAAO,MAAM,SAAS,qBAAyD,CAAC;AAChF,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAK3D,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,QAMlD;AAED,wBAAgB,qBAAqB,CAAC,EAClC,OAAO,GACV,GAAE;IAAE,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAA;CAAO,QAsB3C"}
package/dist/server.es.js CHANGED
@@ -1,57 +1,70 @@
1
- import m from "kleur";
2
- import { format as l, transports as v, createLogger as P } from "winston";
3
- import b from "winston-transport";
4
- import { i as K } from "./console-intercept-ByhsZ0kO.js";
5
- const D = (t = {}) => Object.keys(t).reduce((e, o) => (t[o] !== void 0 && (e[o] = t[o]), e), {}), F = Symbol.for("message"), x = (t) => {
6
- if (!t || typeof t != "object") return;
7
- const e = t.logPath;
8
- return typeof e == "string" && e.length ? e : void 0;
1
+ import f from "kleur";
2
+ import { format as l, transports as L, createLogger as b } from "winston";
3
+ import F from "winston-transport";
4
+ import { i as W } from "./console-intercept-ByhsZ0kO.js";
5
+ const x = {}, $ = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
6
+ __proto__: null,
7
+ default: x
8
+ }, Symbol.toStringTag, { value: "Module" })), D = (e = {}) => Object.keys(e).reduce((t, o) => (e[o] !== void 0 && (t[o] = e[o]), t), {}), C = Symbol.for("message"), j = (e) => {
9
+ if (!e || typeof e != "object") return;
10
+ const t = e.logPath;
11
+ return typeof t == "string" && t.length ? t : void 0;
9
12
  };
10
- class C extends b {
13
+ class O extends F {
11
14
  defaultLogPath;
12
15
  ensuredDirs = /* @__PURE__ */ new Set();
13
16
  lineFormat;
14
17
  constructor({
15
- defaultLogPath: e,
18
+ defaultLogPath: t,
16
19
  format: o
17
20
  }) {
18
- super(), this.defaultLogPath = e, this.lineFormat = o;
21
+ super(), this.defaultLogPath = t, this.lineFormat = o;
19
22
  }
20
- log(e, o) {
21
- setImmediate(() => this.emit("logged", e));
22
- const r = x(e.logEvent?.data) ?? this.defaultLogPath;
23
- if (!r) {
23
+ log(t, o) {
24
+ setImmediate(() => this.emit("logged", t));
25
+ const n = j(t.logEvent?.data) ?? this.defaultLogPath;
26
+ if (!n) {
24
27
  o();
25
28
  return;
26
29
  }
27
30
  (async () => {
28
- const a = (void 0)(r);
31
+ console.log({
32
+ path: typeof $,
33
+ logPath: "undefined",
34
+ fs: typeof $,
35
+ mkdir: "undefined",
36
+ lineFormat: typeof this.lineFormat,
37
+ transform: typeof this.lineFormat.transform
38
+ }), console.log("1 ->", 1);
39
+ const a = (void 0)(n);
29
40
  this.ensuredDirs.has(a) || (this.ensuredDirs.add(a), await (void 0)(a, { recursive: !0 }).catch(() => {
30
- }));
31
- const s = this.lineFormat.transform(
32
- { ...e },
41
+ })), console.log("2 ->", 2);
42
+ const r = this.lineFormat.transform(
43
+ { ...t },
33
44
  this.lineFormat.options ?? {}
34
- ), u = s[F] ?? s.message ?? "";
35
- await (void 0)(r, `${u}
45
+ );
46
+ console.log("3 ->", 3);
47
+ const u = r[C] ?? r.message ?? "";
48
+ console.log("4 ->", 4), await (void 0)(n, `${u}
36
49
  `, "utf8");
37
50
  })().finally(o);
38
51
  }
39
52
  }
40
- const R = l.combine(
53
+ const _ = l.combine(
41
54
  l.timestamp({ format: () => (/* @__PURE__ */ new Date()).toISOString() }),
42
- l.printf((t) => {
43
- const e = t.logEvent ?? {}, o = t.timestamp ?? (/* @__PURE__ */ new Date()).toISOString(), r = String(e.source ?? "LOG"), n = String(e.message ?? t.message ?? ""), a = e.data ?? {}, s = a && typeof a == "object" && Object.keys(a).length ? ` | ${JSON.stringify(a)}` : "";
44
- return `[${o}] ${r.padStart(12)}: ${n}${s}`;
55
+ l.printf((e) => {
56
+ const t = e.logEvent ?? {}, o = e.timestamp ?? (/* @__PURE__ */ new Date()).toISOString(), n = String(t.source ?? "LOG"), s = String(t.message ?? e.message ?? ""), a = t.data ?? {}, r = a && typeof a == "object" && Object.keys(a).length ? ` | ${JSON.stringify(a)}` : "";
57
+ return `[${o}] ${n.padStart(12)}: ${s}${r}`;
45
58
  })
46
- ), j = ["console"], O = (t, e, o, r) => typeof t == "string" ? { message: t, level: e, source: o, data: r } : {
47
- ...t,
48
- level: t.level ?? e,
49
- source: t.source ?? o,
50
- data: t.data ?? r
51
- }, T = (t) => {
52
- if (!t) return "";
59
+ ), R = ["console"], T = (e, t, o, n) => typeof e == "string" ? { message: e, level: t, source: o, data: n } : {
60
+ ...e,
61
+ level: e.level ?? t,
62
+ source: e.source ?? o,
63
+ data: e.data ?? n
64
+ }, k = (e) => {
65
+ if (!e) return "";
53
66
  try {
54
- return JSON.stringify(t);
67
+ return JSON.stringify(e);
55
68
  } catch {
56
69
  return "[unserializable data]";
57
70
  }
@@ -59,125 +72,125 @@ const R = l.combine(
59
72
  l.timestamp(),
60
73
  l.errors({ stack: !0 }),
61
74
  l.colorize({ all: !0 }),
62
- l.printf((t) => {
75
+ l.printf((e) => {
63
76
  const {
64
- timestamp: e,
77
+ timestamp: t,
65
78
  level: o = "info",
66
- message: r = "",
67
- stack: n,
79
+ message: n = "",
80
+ stack: s,
68
81
  logEvent: a
69
- } = t, s = a ?? {}, u = s.source ?? "LOG", f = s.verb ?? o?.toUpperCase?.() ?? "LOG", h = [s.machineId, s.sessionId].filter(Boolean), w = h.length ? m.gray(` [${h.join(" ")}]`) : "", i = s.data ? m.gray(` ${T(s.data)}`) : "", c = typeof s.duration == "number" ? m.yellow(` ${s.duration}ms`) : "", g = `${e} ${m.bold(`[${u}]`)} ${m.cyan(
70
- f
71
- )} ${r}${c}${w}${i}`;
72
- return n ? `${g}
73
- ${n}` : g;
82
+ } = e, r = a ?? {}, u = r.source ?? "LOG", m = r.verb ?? o?.toUpperCase?.() ?? "LOG", h = [r.machineId, r.sessionId].filter(Boolean), w = h.length ? f.gray(` [${h.join(" ")}]`) : "", i = r.data ? f.gray(` ${k(r.data)}`) : "", c = typeof r.duration == "number" ? f.yellow(` ${r.duration}ms`) : "", g = `${t} ${f.bold(`[${u}]`)} ${f.cyan(
83
+ m
84
+ )} ${n}${c}${w}${i}`;
85
+ return s ? `${g}
86
+ ${s}` : g;
74
87
  })
75
- ), S = (t = {}) => {
76
- const e = t.transports?.length ? t.transports : j;
88
+ ), P = (e = {}) => {
89
+ const t = e.transports?.length ? e.transports : R;
77
90
  let o = !1;
78
- const r = [];
79
- e.includes("console") && r.push(
80
- new v.Console({
91
+ const n = [];
92
+ t.includes("console") && n.push(
93
+ new L.Console({
81
94
  format: I
82
95
  })
83
96
  );
84
- const n = t.logPath ?? t.fsPath ?? "log.txt";
85
- e.includes("fs") && r.push(
86
- new C({
87
- defaultLogPath: n,
88
- format: R
97
+ const s = e.logPath ?? e.fsPath ?? "log.txt";
98
+ t.includes("fs") && n.push(
99
+ new O({
100
+ defaultLogPath: s,
101
+ format: _
89
102
  })
90
103
  );
91
- const a = P({
104
+ const a = b({
92
105
  level: "info",
93
- transports: r.length ? r : [new v.Console()]
94
- }), s = async (i, c) => {
95
- const g = O(
106
+ transports: n.length ? n : [new L.Console()]
107
+ }), r = async (i, c) => {
108
+ const g = T(
96
109
  i,
97
110
  "info",
98
- t.source,
111
+ e.source,
99
112
  c
100
- ), L = g.level ?? "info", p = {
113
+ ), v = g.level ?? "info", p = {
101
114
  ...g,
102
- level: L,
115
+ level: v,
103
116
  timestamp: g.timestamp ?? Date.now()
104
117
  };
105
118
  if (a.log({
106
- level: L,
119
+ level: v,
107
120
  message: p.message,
108
121
  logEvent: p
109
- }), e.includes("custom"))
110
- if (t.addLog) {
122
+ }), t.includes("custom"))
123
+ if (e.addLog) {
111
124
  const y = { ...p };
112
- y.data = D(y.data), await Promise.resolve(t.addLog(y));
125
+ y.data = D(y.data), await Promise.resolve(e.addLog(y));
113
126
  } else o || (o = !0, console.warn(
114
127
  "[tim-logger] Custom transport requested without addLog handler."
115
128
  ));
116
- }, u = async (i, c) => s({
129
+ }, u = async (i, c) => r({
117
130
  message: i,
118
131
  level: "info",
119
132
  data: c,
120
- source: t.source
121
- }), f = async (i, c) => s({
133
+ source: e.source
134
+ }), m = async (i, c) => r({
122
135
  message: i,
123
136
  level: "warn",
124
137
  data: c,
125
- source: t.source
138
+ source: e.source
126
139
  });
127
- return { log: s, info: u, warn: f, error: async (i, c) => s({
140
+ return { log: r, info: u, warn: m, error: async (i, c) => r({
128
141
  message: i,
129
142
  level: "error",
130
143
  data: c,
131
- source: t.source
144
+ source: e.source
132
145
  }), clearLogs: async () => {
133
- if (e.includes("fs"))
146
+ if (t.includes("fs"))
134
147
  try {
135
- await (void 0)((void 0)(n), {
148
+ await (void 0)((void 0)(s), {
136
149
  recursive: !0
137
150
  }).catch(() => {
138
- }), await (void 0)(n, "", { flag: "a" }), await (void 0)(n, 0), await u("🧹 Logs cleared", { logPath: n });
151
+ }), await (void 0)(s, "", { flag: "a" }), await (void 0)(s, 0), await u("🧹 Logs cleared", { logPath: s });
139
152
  } catch (i) {
140
153
  const c = i instanceof Error ? i.message : (void 0)("%o", i);
141
- await f("Failed to clear logs", {
142
- logPath: n,
154
+ await m("Failed to clear logs", {
155
+ logPath: s,
143
156
  error: c
144
157
  });
145
158
  }
146
159
  } };
147
160
  };
148
- let d = S();
149
- const z = (t = {}) => (d = S(t), d), N = (t, e) => d.log(t, e), H = (t, e) => d.info(t, e), J = (t, e) => d.warn(t, e), E = (t, e) => d.error(t, e), _ = () => d.clearLogs?.() ?? Promise.resolve();
150
- let $ = !1;
151
- function k(t, e) {
152
- const o = e instanceof Error ? e.stack || e.message : (void 0)("%o", e);
153
- E(`❌ ${t}: ${o}`);
161
+ let d = P();
162
+ const N = (e = {}) => (d = P(e), d), B = (e, t) => d.log(e, t), H = (e, t) => d.info(e, t), J = (e, t) => d.warn(e, t), E = (e, t) => d.error(e, t), q = () => d.clearLogs?.() ?? Promise.resolve();
163
+ let S = !1;
164
+ function z(e, t) {
165
+ const o = t instanceof Error ? t.stack || t.message : (void 0)("%o", t);
166
+ E(`❌ ${e}: ${o}`);
154
167
  }
155
- function q({
156
- onCrash: t
168
+ function V({
169
+ onCrash: e
157
170
  } = {}) {
158
- if ($) return;
159
- $ = !0;
160
- const e = (o) => (r) => {
161
- if (k(o, r), typeof t == "function")
171
+ if (S) return;
172
+ S = !0;
173
+ const t = (o) => (n) => {
174
+ if (z(o, n), typeof e == "function")
162
175
  try {
163
- t(r);
164
- } catch (n) {
165
- const a = n instanceof Error ? n.stack || n.message : (void 0)("%o", n);
176
+ e(n);
177
+ } catch (s) {
178
+ const a = s instanceof Error ? s.stack || s.message : (void 0)("%o", s);
166
179
  E(`❌ Crash handler failed: ${a}`);
167
180
  }
168
181
  };
169
- process.on("uncaughtException", e("Uncaught Exception")), process.on("unhandledRejection", e("Unhandled Rejection"));
182
+ process.on("uncaughtException", t("Uncaught Exception")), process.on("unhandledRejection", t("Unhandled Rejection"));
170
183
  }
171
184
  export {
172
- _ as clearLogs,
173
- S as createServerLogger,
185
+ q as clearLogs,
186
+ P as createServerLogger,
174
187
  E as error,
175
188
  H as info,
176
- z as init,
177
- K as interceptConsoleLogs,
178
- N as log,
179
- k as logCrash,
180
- q as registerCrashHandlers,
189
+ N as init,
190
+ W as interceptConsoleLogs,
191
+ B as log,
192
+ z as logCrash,
193
+ V as registerCrashHandlers,
181
194
  J as warn
182
195
  };
183
196
  //# sourceMappingURL=server.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.es.js","sources":["../src/object.ts","../src/server.ts"],"sourcesContent":["export const cleanObject = <T extends Json>(obj: T = {}): Partial<T> => {\n // remove keys with undefined values\n return Object.keys(obj).reduce((acc: T, key) => {\n if (obj[key] !== undefined) {\n // @ts-ignore\n acc[key] = obj[key];\n }\n return acc as T;\n }, {} as T);\n};\n","import kleur from 'kleur';\nimport type { TransformableInfo } from 'logform';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport * as util from 'node:util';\nimport {\n createLogger as createWinstonLogger,\n transports,\n format as winstonFormat,\n} from 'winston';\nimport TransportStream from 'winston-transport';\nimport { cleanObject } from './object';\nimport type { Logger, ServerLoggerConfig, ServerTransport } from './types';\n\ntype FileInfo = TransformableInfo & {\n logEvent?: Partial<LogEvent>;\n};\n\nconst MESSAGE = Symbol.for('message');\n\nconst getLogPathFromData = (data?: Json) => {\n if (!data || typeof data !== 'object') return undefined;\n const maybeLogPath = (data as Record<string, unknown>).logPath;\n return typeof maybeLogPath === 'string' && maybeLogPath.length\n ? maybeLogPath\n : undefined;\n};\n\nclass DynamicFileTransport extends TransportStream {\n private defaultLogPath: string;\n private ensuredDirs = new Set<string>();\n private lineFormat: ReturnType<typeof winstonFormat.combine>;\n\n constructor({\n defaultLogPath,\n format,\n }: {\n defaultLogPath: string;\n format: ReturnType<typeof winstonFormat.combine>;\n }) {\n // IMPORTANT: don't pass `format` into super if you're going to transform manually\n super();\n this.defaultLogPath = defaultLogPath;\n this.lineFormat = format;\n }\n\n override log(info: FileInfo, callback: () => void) {\n setImmediate(() => this.emit('logged', info));\n\n const logPath =\n getLogPathFromData(info.logEvent?.data) ?? this.defaultLogPath;\n\n if (!logPath) {\n callback();\n return;\n }\n\n const write = async () => {\n const dir = path.dirname(logPath);\n if (!this.ensuredDirs.has(dir)) {\n this.ensuredDirs.add(dir);\n await fs.mkdir(dir, { recursive: true }).catch(() => {});\n }\n\n // clone because logform formats mutate `info`\n const formatted = this.lineFormat.transform(\n { ...info },\n this.lineFormat.options ?? {}\n ) as FileInfo;\n\n const message =\n (formatted as any)[MESSAGE] ?? formatted.message ?? '';\n\n await fs.appendFile(logPath, `${message}\\n`, 'utf8');\n };\n\n void write()\n // .catch((err) => {\n // const msg =\n // err instanceof Error ? err.message : util.format('%o', err);\n // console.warn('[tim-logger] Failed to write log file', {\n // logPath,\n // error: msg,\n // });\n // })\n .finally(callback);\n }\n}\n\nconst fileLineFormat = winstonFormat.combine(\n winstonFormat.timestamp({ format: () => new Date().toISOString() }),\n winstonFormat.printf((info: FileInfo) => {\n const entry = info.logEvent ?? {};\n\n // Use the formatter timestamp (or fallback), instead of generating a new one.\n const timestamp =\n (info.timestamp as string) ?? new Date().toISOString();\n\n const name = String(entry.source ?? 'LOG');\n const text = String(entry.message ?? info.message ?? '');\n\n const data = (entry.data ?? {}) as Record<string, unknown>;\n const dataString =\n data && typeof data === 'object' && Object.keys(data).length\n ? ` | ${JSON.stringify(data)}`\n : '';\n\n return `[${timestamp}] ${name.padStart(12)}: ${text}${dataString}`;\n })\n);\n\nconst DEFAULT_SERVER_TRANSPORTS: ServerTransport[] = ['console'];\n\ntype ConsoleInfo = TransformableInfo & {\n timestamp?: string;\n stack?: string;\n logEvent?: Partial<LogEvent>;\n};\n\nconst normalizeEvent = (\n eventOrMessage: LogEvent | string,\n level?: LogLevel,\n source?: string,\n data?: Json\n): LogEvent => {\n if (typeof eventOrMessage === 'string') {\n return { message: eventOrMessage, level, source, data } as LogEvent;\n }\n\n return {\n ...eventOrMessage,\n level: eventOrMessage.level ?? level,\n source: eventOrMessage.source ?? source,\n data: eventOrMessage.data ?? data,\n };\n};\n\nconst stringifyData = (data?: Json) => {\n if (!data) return '';\n try {\n return JSON.stringify(data);\n } catch {\n return '[unserializable data]';\n }\n};\n\nconst consoleFormat = winstonFormat.combine(\n winstonFormat.timestamp(),\n winstonFormat.errors({ stack: true }),\n winstonFormat.colorize({ all: true }),\n winstonFormat.printf((info: ConsoleInfo) => {\n const {\n timestamp,\n level = 'info',\n message = '',\n stack,\n logEvent,\n } = info;\n\n const entry: Partial<LogEvent> = logEvent ?? {};\n const source = entry.source ?? 'LOG';\n const verb = entry.verb ?? level?.toUpperCase?.() ?? 'LOG';\n\n const contextParts = [entry.machineId, entry.sessionId].filter(Boolean);\n const ctx = contextParts.length\n ? kleur.gray(` [${contextParts.join(' ')}]`)\n : '';\n\n const data = entry.data\n ? kleur.gray(` ${stringifyData(entry.data)}`)\n : '';\n\n const duration =\n typeof entry.duration === 'number'\n ? kleur.yellow(` ${entry.duration}ms`)\n : '';\n\n const base = `${timestamp} ${kleur.bold(`[${source}]`)} ${kleur.cyan(\n verb\n )} ${message}${duration}${ctx}${data}`;\n\n return stack ? `${base}\\n${stack}` : base;\n })\n);\n\nexport const createServerLogger = (config: ServerLoggerConfig = {}): Logger => {\n const transportsArr = config.transports?.length\n ? config.transports\n : DEFAULT_SERVER_TRANSPORTS;\n let warnedMissingCustom = false;\n\n const winstonTransports: TransportStream[] = [];\n\n if (transportsArr.includes('console')) {\n winstonTransports.push(\n new transports.Console({\n format: consoleFormat,\n })\n );\n }\n\n const defaultLogPath = config.logPath ?? config.fsPath ?? 'log.txt';\n\n if (transportsArr.includes('fs')) {\n winstonTransports.push(\n new DynamicFileTransport({\n defaultLogPath,\n format: fileLineFormat,\n })\n );\n }\n\n const baseLogger = createWinstonLogger({\n level: 'info',\n transports: winstonTransports.length\n ? winstonTransports\n : [new transports.Console()],\n });\n\n const log = async (eventOrMessage: LogEvent | string, data?: Json) => {\n const event = normalizeEvent(\n eventOrMessage,\n 'info',\n config.source,\n data\n );\n const resolvedLevel = event.level ?? 'info';\n\n const payload = {\n ...event,\n level: resolvedLevel,\n timestamp: event.timestamp ?? Date.now(),\n };\n\n baseLogger.log({\n level: resolvedLevel,\n message: payload.message,\n logEvent: payload,\n });\n\n if (transportsArr.includes('custom')) {\n if (config.addLog) {\n const clean = { ...payload };\n clean.data = cleanObject(clean.data);\n await Promise.resolve(config.addLog(clean));\n } else if (!warnedMissingCustom) {\n warnedMissingCustom = true;\n console.warn(\n '[tim-logger] Custom transport requested without addLog handler.'\n );\n }\n }\n };\n\n const info = async (message: string, data?: Json) =>\n log({\n message,\n level: 'info',\n data,\n source: config.source,\n } as LogEvent);\n\n const warn = async (message: string, data?: Json) =>\n log({\n message,\n level: 'warn',\n data,\n source: config.source,\n } as LogEvent);\n\n const error = async (message: string, data?: Json) =>\n log({\n message,\n level: 'error',\n data,\n source: config.source,\n } as LogEvent);\n\n /**\n * Clears the fs transport logs by truncating the file.\n * No-op if 'fs' transport is not enabled.\n */\n const clearLogs = async () => {\n if (!transportsArr.includes('fs')) return;\n\n try {\n // Ensure file exists, then truncate.\n await fs\n .mkdir(path.dirname(defaultLogPath), {\n recursive: true,\n })\n .catch(() => {});\n await fs.writeFile(defaultLogPath, '', { flag: 'a' }); // touch\n await fs.truncate(defaultLogPath, 0);\n await info('🧹 Logs cleared', { logPath: defaultLogPath });\n } catch (err) {\n // Don’t throw; log the failure instead.\n const msg =\n err instanceof Error ? err.message : util.format('%o', err);\n await warn('Failed to clear logs', {\n logPath: defaultLogPath,\n error: msg,\n });\n }\n };\n\n return { log, info, warn, error, clearLogs };\n};\n\nlet defaultLogger = createServerLogger();\n\nexport const init = (config: ServerLoggerConfig = {}) => {\n defaultLogger = createServerLogger(config);\n return defaultLogger;\n};\n\nexport const log = (eventOrMessage: LogEvent | string, data?: Json) =>\n defaultLogger.log(eventOrMessage, data);\nexport const info = (message: string, data?: Json) =>\n defaultLogger.info(message, data);\nexport const warn = (message: string, data?: Json) =>\n defaultLogger.warn(message, data);\nexport const error = (message: string, data?: Json) =>\n defaultLogger.error(message, data);\nexport const clearLogs = () => defaultLogger.clearLogs?.() ?? Promise.resolve();\nexport { interceptConsoleLogs } from './console-intercept';\n\n// newly added\nlet crashHandlersRegistered = false;\n\nexport function logCrash(type: string, err: unknown) {\n const message =\n err instanceof Error\n ? err.stack || err.message\n : util.format('%o', err);\n void error(`❌ ${type}: ${message}`);\n}\n\nexport function registerCrashHandlers({\n onCrash,\n}: { onCrash?: (err: unknown) => void } = {}) {\n if (crashHandlersRegistered) return;\n crashHandlersRegistered = true;\n\n const handleCrash = (type: string) => (err: unknown) => {\n logCrash(type, err);\n if (typeof onCrash === 'function') {\n try {\n onCrash(err);\n } catch (handlerErr) {\n // FIX: was `log.error(...)` (wrong symbol). Use our logger.\n const msg =\n handlerErr instanceof Error\n ? handlerErr.stack || handlerErr.message\n : util.format('%o', handlerErr);\n void error(`❌ Crash handler failed: ${msg}`);\n }\n }\n };\n\n process.on('uncaughtException', handleCrash('Uncaught Exception'));\n process.on('unhandledRejection', handleCrash('Unhandled Rejection'));\n}\n"],"names":["cleanObject","obj","acc","key","MESSAGE","getLogPathFromData","data","maybeLogPath","DynamicFileTransport","TransportStream","defaultLogPath","format","info","callback","logPath","dir","path.dirname","fs.mkdir","formatted","message","fs.appendFile","fileLineFormat","winstonFormat","entry","timestamp","name","text","dataString","DEFAULT_SERVER_TRANSPORTS","normalizeEvent","eventOrMessage","level","source","stringifyData","consoleFormat","stack","logEvent","verb","contextParts","ctx","kleur","duration","base","createServerLogger","config","transportsArr","warnedMissingCustom","winstonTransports","transports","baseLogger","createWinstonLogger","log","event","resolvedLevel","payload","clean","warn","fs.writeFile","fs.truncate","err","msg","util.format","clearLogs","defaultLogger","init","error","crashHandlersRegistered","logCrash","type","registerCrashHandlers","onCrash","handleCrash","handlerErr"],"mappings":"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"}
1
+ {"version":3,"file":"server.es.js","sources":["../__vite-browser-external","../src/object.ts","../src/server.ts"],"sourcesContent":["export default {}","export const cleanObject = <T extends Json>(obj: T = {}): Partial<T> => {\n // remove keys with undefined values\n return Object.keys(obj).reduce((acc: T, key) => {\n if (obj[key] !== undefined) {\n // @ts-ignore\n acc[key] = obj[key];\n }\n return acc as T;\n }, {} as T);\n};\n","import kleur from 'kleur';\nimport type { TransformableInfo } from 'logform';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport * as util from 'node:util';\nimport {\n createLogger as createWinstonLogger,\n transports,\n format as winstonFormat,\n} from 'winston';\nimport TransportStream from 'winston-transport';\nimport { cleanObject } from './object';\nimport type { Logger, ServerLoggerConfig, ServerTransport } from './types';\n\ntype FileInfo = TransformableInfo & {\n logEvent?: Partial<LogEvent>;\n};\n\nconst MESSAGE = Symbol.for('message');\n\nconst getLogPathFromData = (data?: Json) => {\n if (!data || typeof data !== 'object') return undefined;\n const maybeLogPath = (data as Record<string, unknown>).logPath;\n return typeof maybeLogPath === 'string' && maybeLogPath.length\n ? maybeLogPath\n : undefined;\n};\n\nclass DynamicFileTransport extends TransportStream {\n private defaultLogPath: string;\n private ensuredDirs = new Set<string>();\n private lineFormat: ReturnType<typeof winstonFormat.combine>;\n\n constructor({\n defaultLogPath,\n format,\n }: {\n defaultLogPath: string;\n format: ReturnType<typeof winstonFormat.combine>;\n }) {\n // IMPORTANT: don't pass `format` into super if you're going to transform manually\n super();\n this.defaultLogPath = defaultLogPath;\n this.lineFormat = format;\n }\n\n override log(info: FileInfo, callback: () => void) {\n setImmediate(() => this.emit('logged', info));\n\n const logPath =\n getLogPathFromData(info.logEvent?.data) ?? this.defaultLogPath;\n\n if (!logPath) {\n callback();\n return;\n }\n\n const write = async () => {\n console.log({\n path: typeof path,\n logPath: typeof path.dirname,\n fs: typeof fs,\n mkdir: typeof fs.mkdir,\n lineFormat: typeof this.lineFormat,\n transform: typeof this.lineFormat.transform,\n });\n\n console.log('1 ->', 1);\n\n const dir = path.dirname(logPath);\n if (!this.ensuredDirs.has(dir)) {\n this.ensuredDirs.add(dir);\n await fs.mkdir(dir, { recursive: true }).catch(() => {});\n }\n\n console.log('2 ->', 2);\n\n // clone because logform formats mutate `info`\n const formatted = this.lineFormat.transform(\n { ...info },\n this.lineFormat.options ?? {}\n ) as FileInfo;\n console.log('3 ->', 3);\n\n const message =\n (formatted as any)[MESSAGE] ?? formatted.message ?? '';\n\n console.log('4 ->', 4);\n\n await fs.appendFile(logPath, `${message}\\n`, 'utf8');\n };\n\n void write()\n // .catch((err) => {\n // const msg =\n // err instanceof Error ? err.message : util.format('%o', err);\n // console.warn('[tim-logger] Failed to write log file', {\n // logPath,\n // error: msg,\n // });\n // })\n .finally(callback);\n }\n}\n\nconst fileLineFormat = winstonFormat.combine(\n winstonFormat.timestamp({ format: () => new Date().toISOString() }),\n winstonFormat.printf((info: FileInfo) => {\n const entry = info.logEvent ?? {};\n\n // Use the formatter timestamp (or fallback), instead of generating a new one.\n const timestamp =\n (info.timestamp as string) ?? new Date().toISOString();\n\n const name = String(entry.source ?? 'LOG');\n const text = String(entry.message ?? info.message ?? '');\n\n const data = (entry.data ?? {}) as Record<string, unknown>;\n const dataString =\n data && typeof data === 'object' && Object.keys(data).length\n ? ` | ${JSON.stringify(data)}`\n : '';\n\n return `[${timestamp}] ${name.padStart(12)}: ${text}${dataString}`;\n })\n);\n\nconst DEFAULT_SERVER_TRANSPORTS: ServerTransport[] = ['console'];\n\ntype ConsoleInfo = TransformableInfo & {\n timestamp?: string;\n stack?: string;\n logEvent?: Partial<LogEvent>;\n};\n\nconst normalizeEvent = (\n eventOrMessage: LogEvent | string,\n level?: LogLevel,\n source?: string,\n data?: Json\n): LogEvent => {\n if (typeof eventOrMessage === 'string') {\n return { message: eventOrMessage, level, source, data } as LogEvent;\n }\n\n return {\n ...eventOrMessage,\n level: eventOrMessage.level ?? level,\n source: eventOrMessage.source ?? source,\n data: eventOrMessage.data ?? data,\n };\n};\n\nconst stringifyData = (data?: Json) => {\n if (!data) return '';\n try {\n return JSON.stringify(data);\n } catch {\n return '[unserializable data]';\n }\n};\n\nconst consoleFormat = winstonFormat.combine(\n winstonFormat.timestamp(),\n winstonFormat.errors({ stack: true }),\n winstonFormat.colorize({ all: true }),\n winstonFormat.printf((info: ConsoleInfo) => {\n const {\n timestamp,\n level = 'info',\n message = '',\n stack,\n logEvent,\n } = info;\n\n const entry: Partial<LogEvent> = logEvent ?? {};\n const source = entry.source ?? 'LOG';\n const verb = entry.verb ?? level?.toUpperCase?.() ?? 'LOG';\n\n const contextParts = [entry.machineId, entry.sessionId].filter(Boolean);\n const ctx = contextParts.length\n ? kleur.gray(` [${contextParts.join(' ')}]`)\n : '';\n\n const data = entry.data\n ? kleur.gray(` ${stringifyData(entry.data)}`)\n : '';\n\n const duration =\n typeof entry.duration === 'number'\n ? kleur.yellow(` ${entry.duration}ms`)\n : '';\n\n const base = `${timestamp} ${kleur.bold(`[${source}]`)} ${kleur.cyan(\n verb\n )} ${message}${duration}${ctx}${data}`;\n\n return stack ? `${base}\\n${stack}` : base;\n })\n);\n\nexport const createServerLogger = (config: ServerLoggerConfig = {}): Logger => {\n const transportsArr = config.transports?.length\n ? config.transports\n : DEFAULT_SERVER_TRANSPORTS;\n let warnedMissingCustom = false;\n\n const winstonTransports: TransportStream[] = [];\n\n if (transportsArr.includes('console')) {\n winstonTransports.push(\n new transports.Console({\n format: consoleFormat,\n })\n );\n }\n\n const defaultLogPath = config.logPath ?? config.fsPath ?? 'log.txt';\n\n if (transportsArr.includes('fs')) {\n winstonTransports.push(\n new DynamicFileTransport({\n defaultLogPath,\n format: fileLineFormat,\n })\n );\n }\n\n const baseLogger = createWinstonLogger({\n level: 'info',\n transports: winstonTransports.length\n ? winstonTransports\n : [new transports.Console()],\n });\n\n const log = async (eventOrMessage: LogEvent | string, data?: Json) => {\n const event = normalizeEvent(\n eventOrMessage,\n 'info',\n config.source,\n data\n );\n const resolvedLevel = event.level ?? 'info';\n\n const payload = {\n ...event,\n level: resolvedLevel,\n timestamp: event.timestamp ?? Date.now(),\n };\n\n baseLogger.log({\n level: resolvedLevel,\n message: payload.message,\n logEvent: payload,\n });\n\n if (transportsArr.includes('custom')) {\n if (config.addLog) {\n const clean = { ...payload };\n clean.data = cleanObject(clean.data);\n await Promise.resolve(config.addLog(clean));\n } else if (!warnedMissingCustom) {\n warnedMissingCustom = true;\n console.warn(\n '[tim-logger] Custom transport requested without addLog handler.'\n );\n }\n }\n };\n\n const info = async (message: string, data?: Json) =>\n log({\n message,\n level: 'info',\n data,\n source: config.source,\n } as LogEvent);\n\n const warn = async (message: string, data?: Json) =>\n log({\n message,\n level: 'warn',\n data,\n source: config.source,\n } as LogEvent);\n\n const error = async (message: string, data?: Json) =>\n log({\n message,\n level: 'error',\n data,\n source: config.source,\n } as LogEvent);\n\n /**\n * Clears the fs transport logs by truncating the file.\n * No-op if 'fs' transport is not enabled.\n */\n const clearLogs = async () => {\n if (!transportsArr.includes('fs')) return;\n\n try {\n // Ensure file exists, then truncate.\n await fs\n .mkdir(path.dirname(defaultLogPath), {\n recursive: true,\n })\n .catch(() => {});\n await fs.writeFile(defaultLogPath, '', { flag: 'a' }); // touch\n await fs.truncate(defaultLogPath, 0);\n await info('🧹 Logs cleared', { logPath: defaultLogPath });\n } catch (err) {\n // Don’t throw; log the failure instead.\n const msg =\n err instanceof Error ? err.message : util.format('%o', err);\n await warn('Failed to clear logs', {\n logPath: defaultLogPath,\n error: msg,\n });\n }\n };\n\n return { log, info, warn, error, clearLogs };\n};\n\nlet defaultLogger = createServerLogger();\n\nexport const init = (config: ServerLoggerConfig = {}) => {\n defaultLogger = createServerLogger(config);\n return defaultLogger;\n};\n\nexport const log = (eventOrMessage: LogEvent | string, data?: Json) =>\n defaultLogger.log(eventOrMessage, data);\nexport const info = (message: string, data?: Json) =>\n defaultLogger.info(message, data);\nexport const warn = (message: string, data?: Json) =>\n defaultLogger.warn(message, data);\nexport const error = (message: string, data?: Json) =>\n defaultLogger.error(message, data);\nexport const clearLogs = () => defaultLogger.clearLogs?.() ?? Promise.resolve();\nexport { interceptConsoleLogs } from './console-intercept';\n\n// newly added\nlet crashHandlersRegistered = false;\n\nexport function logCrash(type: string, err: unknown) {\n const message =\n err instanceof Error\n ? err.stack || err.message\n : util.format('%o', err);\n void error(`❌ ${type}: ${message}`);\n}\n\nexport function registerCrashHandlers({\n onCrash,\n}: { onCrash?: (err: unknown) => void } = {}) {\n if (crashHandlersRegistered) return;\n crashHandlersRegistered = true;\n\n const handleCrash = (type: string) => (err: unknown) => {\n logCrash(type, err);\n if (typeof onCrash === 'function') {\n try {\n onCrash(err);\n } catch (handlerErr) {\n // FIX: was `log.error(...)` (wrong symbol). Use our logger.\n const msg =\n handlerErr instanceof Error\n ? handlerErr.stack || handlerErr.message\n : util.format('%o', handlerErr);\n void error(`❌ Crash handler failed: ${msg}`);\n }\n }\n };\n\n process.on('uncaughtException', handleCrash('Uncaught Exception'));\n process.on('unhandledRejection', handleCrash('Unhandled Rejection'));\n}\n"],"names":["__viteBrowserExternal","cleanObject","obj","acc","key","MESSAGE","getLogPathFromData","data","maybeLogPath","DynamicFileTransport","TransportStream","defaultLogPath","format","info","callback","logPath","path","fs","dir","path.dirname","fs.mkdir","formatted","message","fs.appendFile","fileLineFormat","winstonFormat","entry","timestamp","name","text","dataString","DEFAULT_SERVER_TRANSPORTS","normalizeEvent","eventOrMessage","level","source","stringifyData","consoleFormat","stack","logEvent","verb","contextParts","ctx","kleur","duration","base","createServerLogger","config","transportsArr","warnedMissingCustom","winstonTransports","transports","baseLogger","createWinstonLogger","log","event","resolvedLevel","payload","clean","warn","fs.writeFile","fs.truncate","err","msg","util.format","clearLogs","defaultLogger","init","error","crashHandlersRegistered","logCrash","type","registerCrashHandlers","onCrash","handleCrash","handlerErr"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tim-logger",
3
- "version": "0.0.28",
3
+ "version": "0.0.29",
4
4
  "type": "module",
5
5
  "private": false,
6
6
  "scripts": {