tim-logger 0.0.30 → 0.0.34

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.
package/dist/object.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export declare const cleanObject: <T extends Json>(obj?: T) => Partial<T>;
1
+ export declare function cleanObject<T extends Record<string, unknown>>(obj?: T): Partial<T>;
2
2
  //# sourceMappingURL=object.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"object.d.ts","sourceRoot":"","sources":["../src/object.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,GAAI,CAAC,SAAS,IAAI,EAAE,MAAK,CAAM,KAAG,OAAO,CAAC,CAAC,CASlE,CAAC"}
1
+ {"version":3,"file":"object.d.ts","sourceRoot":"","sources":["../src/object.ts"],"names":[],"mappings":"AAAA,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACzD,GAAG,CAAC,EAAE,CAAC,GACR,OAAO,CAAC,CAAC,CAAC,CAQZ"}
@@ -1,4 +1,4 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const d=require("kleur"),D=require("node:fs/promises"),O=require("node:path"),j=require("node:util"),l=require("winston"),k=require("winston-transport"),_=require("./console-intercept-CL_BfKQo.cjs");function S(t){const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const o in t)if(o!=="default"){const r=Object.getOwnPropertyDescriptor(t,o);Object.defineProperty(e,o,r.get?r:{enumerable:!0,get:()=>t[o]})}}return e.default=t,Object.freeze(e)}const g=S(D),h=S(O),y=S(j),q=(t={})=>Object.keys(t).reduce((e,o)=>(t[o]!==void 0&&(e[o]=t[o]),e),{}),T=Symbol.for("message"),x=t=>{if(!t||typeof t!="object")return;const e=t.logPath;return typeof e=="string"&&e.length?e:void 0};class R extends k{defaultLogPath;ensuredDirs=new Set;lineFormat;constructor({defaultLogPath:e,format:o}){super(),this.defaultLogPath=e,this.lineFormat=o}log(e,o){setImmediate(()=>this.emit("logged",e));const r=x(e.logEvent?.data)??this.defaultLogPath;if(!r){o();return}(async()=>{console.log({path:typeof h,logPath:typeof h.dirname,fs:typeof g,mkdir:typeof g.mkdir,lineFormat:typeof this.lineFormat,transform:typeof this.lineFormat.transform}),console.log("1 ->",1);const n=h.dirname(r);this.ensuredDirs.has(n)||(this.ensuredDirs.add(n),await g.mkdir(n,{recursive:!0}).catch(()=>{})),console.log("2 ->",2);const s=this.lineFormat.transform({...e},this.lineFormat.options??{});console.log("3 ->",3);const u=s[T]??s.message??"";console.log("4 ->",4),await g.appendFile(r,`${u}
2
- `,"utf8")})().catch(n=>{const s=n instanceof Error?n.message:y.format("%o",n);console.warn("[tim-logger] Failed to write log file",{logPath:r,error:s})}).finally(o)}}const I=l.format.combine(l.format.timestamp({format:()=>new Date().toISOString()}),l.format.printf(t=>{const e=t.logEvent??{},o=t.timestamp??new Date().toISOString(),r=String(e.source??"LOG"),a=String(e.message??t.message??""),n=e.data??{},s=n&&typeof n=="object"&&Object.keys(n).length?` | ${JSON.stringify(n)}`:"";return`[${o}] ${r.padStart(12)}: ${a}${s}`})),z=["console"],A=(t,e,o,r)=>typeof t=="string"?{message:t,level:e,source:o,data:r}:{...t,level:t.level??e,source:t.source??o,data:t.data??r},G=t=>{if(!t)return"";try{return JSON.stringify(t)}catch{return"[unserializable data]"}},N=l.format.combine(l.format.timestamp(),l.format.errors({stack:!0}),l.format.colorize({all:!0}),l.format.printf(t=>{const{timestamp:e,level:o="info",message:r="",stack:a,logEvent:n}=t,s=n??{},u=s.source??"LOG",p=s.verb??o?.toUpperCase?.()??"LOG",w=[s.machineId,s.sessionId].filter(Boolean),P=w.length?d.gray(` [${w.join(" ")}]`):"",c=s.data?d.gray(` ${G(s.data)}`):"",i=typeof s.duration=="number"?d.yellow(` ${s.duration}ms`):"",f=`${e} ${d.bold(`[${u}]`)} ${d.cyan(p)} ${r}${i}${P}${c}`;return a?`${f}
3
- ${a}`:f})),$=(t={})=>{const e=t.transports?.length?t.transports:z;let o=!1;const r=[];e.includes("console")&&r.push(new l.transports.Console({format:N}));const a=t.logPath??t.fsPath??"log.txt";e.includes("fs")&&r.push(new R({defaultLogPath:a,format:I}));const n=l.createLogger({level:"info",transports:r.length?r:[new l.transports.Console]}),s=async(c,i)=>{const f=A(c,"info",t.source,i),E=f.level??"info",L={...f,level:E,timestamp:f.timestamp??Date.now()};if(n.log({level:E,message:L.message,logEvent:L}),e.includes("custom"))if(t.addLog){const v={...L};v.data=q(v.data),await Promise.resolve(t.addLog(v))}else o||(o=!0,console.warn("[tim-logger] Custom transport requested without addLog handler."))},u=async(c,i)=>s({message:c,level:"info",data:i,source:t.source}),p=async(c,i)=>s({message:c,level:"warn",data:i,source:t.source});return{log:s,info:u,warn:p,error:async(c,i)=>s({message:c,level:"error",data:i,source:t.source}),clearLogs:async()=>{if(e.includes("fs"))try{await g.mkdir(h.dirname(a),{recursive:!0}).catch(()=>{}),await g.writeFile(a,"",{flag:"a"}),await g.truncate(a,0),await u("🧹 Logs cleared",{logPath:a})}catch(c){const i=c instanceof Error?c.message:y.format("%o",c);await p("Failed to clear logs",{logPath:a,error:i})}}}};let m=$();const U=(t={})=>(m=$(t),m),H=(t,e)=>m.log(t,e),J=(t,e)=>m.info(t,e),B=(t,e)=>m.warn(t,e),b=(t,e)=>m.error(t,e),V=()=>m.clearLogs?.()??Promise.resolve();let F=!1;function C(t,e){const o=e instanceof Error?e.stack||e.message:y.format("%o",e);b(`❌ ${t}: ${o}`)}function K({onCrash:t}={}){if(F)return;F=!0;const e=o=>r=>{if(C(o,r),typeof t=="function")try{t(r)}catch(a){const n=a instanceof Error?a.stack||a.message:y.format("%o",a);b(`❌ Crash handler failed: ${n}`)}};process.on("uncaughtException",e("Uncaught Exception")),process.on("unhandledRejection",e("Unhandled Rejection"))}exports.interceptConsoleLogs=_.interceptConsoleLogs;exports.clearLogs=V;exports.createServerLogger=$;exports.error=b;exports.info=J;exports.init=U;exports.log=H;exports.logCrash=C;exports.registerCrashHandlers=K;exports.warn=B;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const d=require("kleur"),C=require("node:fs/promises"),D=require("node:path"),O=require("node:util"),l=require("winston"),k=require("winston-transport"),_=require("./console-intercept-CL_BfKQo.cjs");function S(t){const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const o in t)if(o!=="default"){const r=Object.getOwnPropertyDescriptor(t,o);Object.defineProperty(e,o,r.get?r:{enumerable:!0,get:()=>t[o]})}}return e.default=t,Object.freeze(e)}const m=S(C),h=S(D),y=S(O);function q(t){if(!t)return{};const e={};for(const[o,r]of Object.entries(t))r!==void 0&&(e[o]=r);return e}const T=Symbol.for("message"),x=t=>{if(!t||typeof t!="object")return;const e=t.logPath;return typeof e=="string"&&e.length?e:void 0};class R extends k{defaultLogPath;ensuredDirs=new Set;lineFormat;constructor({defaultLogPath:e,format:o}){super(),this.defaultLogPath=e,this.lineFormat=o}log(e,o){setImmediate(()=>this.emit("logged",e));const r=x(e.logEvent?.data)??this.defaultLogPath;if(!r){o();return}(async()=>{console.log({path:typeof h,logPath:typeof h.dirname,fs:typeof m,mkdir:typeof m.mkdir,lineFormat:typeof this.lineFormat,transform:typeof this.lineFormat.transform});const n=h.dirname(r);this.ensuredDirs.has(n)||(this.ensuredDirs.add(n),await m.mkdir(n,{recursive:!0}).catch(()=>{}));const s=this.lineFormat.transform({...e},this.lineFormat.options??{}),f=s[T]??s.message??"";await m.appendFile(r,`${f}
2
+ `,"utf8")})().catch(n=>{const s=n instanceof Error?n.message:y.format("%o",n);console.warn("[tim-logger] Failed to write log file",{logPath:r,error:s})}).finally(o)}}const I=l.format.combine(l.format.timestamp({format:()=>new Date().toISOString()}),l.format.printf(t=>{const e=t.logEvent??{},o=t.timestamp??new Date().toISOString(),r=String(e.source??"LOG"),a=String(e.message??t.message??""),n=e.data??{},s=n&&typeof n=="object"&&Object.keys(n).length?` | ${JSON.stringify(n)}`:"";return`[${o}] ${r.padStart(12)}: ${a}${s}`})),z=["console"],A=(t,e,o,r)=>typeof t=="string"?{message:t,level:e,source:o,data:r}:{...t,level:t.level??e,source:t.source??o,data:t.data??r},G=t=>{if(!t)return"";try{return JSON.stringify(t)}catch{return"[unserializable data]"}},N=l.format.combine(l.format.timestamp(),l.format.errors({stack:!0}),l.format.colorize({all:!0}),l.format.printf(t=>{const{timestamp:e,level:o="info",message:r="",stack:a,logEvent:n}=t,s=n??{},f=s.source??"LOG",p=s.verb??o?.toUpperCase?.()??"LOG",w=[s.machineId,s.sessionId].filter(Boolean),P=w.length?d.gray(` [${w.join(" ")}]`):"",i=s.data?d.gray(` ${G(s.data)}`):"",c=typeof s.duration=="number"?d.yellow(` ${s.duration}ms`):"",u=`${e} ${d.bold(`[${f}]`)} ${d.cyan(p)} ${r}${c}${P}${i}`;return a?`${u}
3
+ ${a}`:u})),b=(t={})=>{const e=t.transports?.length?t.transports:z;let o=!1;const r=[];e.includes("console")&&r.push(new l.transports.Console({format:N}));const a=t.logPath??t.fsPath??"log.txt";e.includes("fs")&&r.push(new R({defaultLogPath:a,format:I}));const n=l.createLogger({level:"info",transports:r.length?r:[new l.transports.Console]}),s=async(i,c)=>{const u=A(i,"info",t.source,c),E=u.level??"info",L={...u,level:E,timestamp:u.timestamp??Date.now()};if(n.log({level:E,message:L.message,logEvent:L}),e.includes("custom"))if(t.addLog){const v={...L};v.data=q(v.data),await Promise.resolve(t.addLog(v))}else o||(o=!0,console.warn("[tim-logger] Custom transport requested without addLog handler."))},f=async(i,c)=>s({message:i,level:"info",data:c,source:t.source}),p=async(i,c)=>s({message:i,level:"warn",data:c,source:t.source});return{log:s,info:f,warn:p,error:async(i,c)=>s({message:i,level:"error",data:c,source:t.source}),clearLogs:async(i=()=>!0)=>{if(e.includes("fs"))try{await m.mkdir(h.dirname(a),{recursive:!0}).catch(()=>{}),await m.writeFile(a,"",{flag:"a"}),await m.truncate(a,0),await f("🧹 Logs cleared",{logPath:a})}catch(c){const u=c instanceof Error?c.message:y.format("%o",c);await p("Failed to clear logs",{logPath:a,error:u})}e.includes("custom")&&t.clearLogs&&await t.clearLogs(i)}}};let g=b();const U=(t={})=>(g=b(t),g),H=(t,e)=>g.log(t,e),J=(t,e)=>g.info(t,e),B=(t,e)=>g.warn(t,e),$=(t,e)=>g.error(t,e),V=()=>g.clearLogs?.()??Promise.resolve();let F=!1;function j(t,e){const o=e instanceof Error?e.stack||e.message:y.format("%o",e);$(`❌ ${t}: ${o}`)}function K({onCrash:t}={}){if(F)return;F=!0;const e=o=>r=>{if(j(o,r),typeof t=="function")try{t(r)}catch(a){const n=a instanceof Error?a.stack||a.message:y.format("%o",a);$(`❌ Crash handler failed: ${n}`)}};process.on("uncaughtException",e("Uncaught Exception")),process.on("unhandledRejection",e("Unhandled Rejection"))}exports.interceptConsoleLogs=_.interceptConsoleLogs;exports.clearLogs=V;exports.createServerLogger=b;exports.error=$;exports.info=J;exports.init=U;exports.log=H;exports.logCrash=j;exports.registerCrashHandlers=K;exports.warn=B;
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 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":["cleanObject","obj","acc","key","MESSAGE","getLogPathFromData","data","maybeLogPath","DynamicFileTransport","TransportStream","defaultLogPath","format","info","callback","logPath","path","fs","dir","formatted","message","err","msg","util","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","clearLogs","defaultLogger","init","error","crashHandlersRegistered","logCrash","type","registerCrashHandlers","onCrash","handleCrash","handlerErr"],"mappings":"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"}
1
+ {"version":3,"file":"server.cjs.js","sources":["../src/object.ts","../src/server.ts"],"sourcesContent":["export function cleanObject<T extends Record<string, unknown>>(\n obj?: T\n): Partial<T> {\n if (!obj) return {};\n\n const out: Partial<T> = {};\n for (const [key, value] of Object.entries(obj) as [keyof T, T[keyof T]][]) {\n if (value !== undefined) out[key] = value;\n }\n return out;\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 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 (predicate = () => true) => {\n if (transportsArr.includes('fs')) {\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 if (transportsArr.includes('custom') && config.clearLogs) {\n await config.clearLogs(predicate);\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","out","key","value","MESSAGE","getLogPathFromData","data","maybeLogPath","DynamicFileTransport","TransportStream","defaultLogPath","format","info","callback","logPath","path","fs","dir","formatted","message","err","msg","util","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","predicate","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;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"}
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;AAsL3E,eAAO,MAAM,kBAAkB,GAAI,SAAQ,kBAAuB,KAAG,MA8HpE,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,72 +1,77 @@
1
- import u from "kleur";
2
- import * as m from "node:fs/promises";
1
+ import d from "kleur";
2
+ import * as g from "node:fs/promises";
3
3
  import * as h from "node:path";
4
4
  import * as y from "node:util";
5
- import { format as l, transports as E, createLogger as D } from "winston";
6
- import x from "winston-transport";
5
+ import { format as m, transports as E, createLogger as k } from "winston";
6
+ import D from "winston-transport";
7
7
  import { i as X } from "./console-intercept-ByhsZ0kO.js";
8
- const C = (t = {}) => Object.keys(t).reduce((e, o) => (t[o] !== void 0 && (e[o] = t[o]), e), {}), k = Symbol.for("message"), R = (t) => {
8
+ function x(t) {
9
+ if (!t) return {};
10
+ const e = {};
11
+ for (const [r, o] of Object.entries(t))
12
+ o !== void 0 && (e[r] = o);
13
+ return e;
14
+ }
15
+ const C = Symbol.for("message"), j = (t) => {
9
16
  if (!t || typeof t != "object") return;
10
17
  const e = t.logPath;
11
18
  return typeof e == "string" && e.length ? e : void 0;
12
19
  };
13
- class j extends x {
20
+ class R extends D {
14
21
  defaultLogPath;
15
22
  ensuredDirs = /* @__PURE__ */ new Set();
16
23
  lineFormat;
17
24
  constructor({
18
25
  defaultLogPath: e,
19
- format: o
26
+ format: r
20
27
  }) {
21
- super(), this.defaultLogPath = e, this.lineFormat = o;
28
+ super(), this.defaultLogPath = e, this.lineFormat = r;
22
29
  }
23
- log(e, o) {
30
+ log(e, r) {
24
31
  setImmediate(() => this.emit("logged", e));
25
- const s = R(e.logEvent?.data) ?? this.defaultLogPath;
26
- if (!s) {
27
- o();
32
+ const o = j(e.logEvent?.data) ?? this.defaultLogPath;
33
+ if (!o) {
34
+ r();
28
35
  return;
29
36
  }
30
37
  (async () => {
31
38
  console.log({
32
39
  path: typeof h,
33
40
  logPath: typeof h.dirname,
34
- fs: typeof m,
35
- mkdir: typeof m.mkdir,
41
+ fs: typeof g,
42
+ mkdir: typeof g.mkdir,
36
43
  lineFormat: typeof this.lineFormat,
37
44
  transform: typeof this.lineFormat.transform
38
- }), console.log("1 ->", 1);
39
- const n = h.dirname(s);
40
- this.ensuredDirs.has(n) || (this.ensuredDirs.add(n), await m.mkdir(n, { recursive: !0 }).catch(() => {
41
- })), console.log("2 ->", 2);
42
- const r = this.lineFormat.transform(
45
+ });
46
+ const a = h.dirname(o);
47
+ this.ensuredDirs.has(a) || (this.ensuredDirs.add(a), await g.mkdir(a, { recursive: !0 }).catch(() => {
48
+ }));
49
+ const s = this.lineFormat.transform(
43
50
  { ...e },
44
51
  this.lineFormat.options ?? {}
45
- );
46
- console.log("3 ->", 3);
47
- const d = r[k] ?? r.message ?? "";
48
- console.log("4 ->", 4), await m.appendFile(s, `${d}
52
+ ), f = s[C] ?? s.message ?? "";
53
+ await g.appendFile(o, `${f}
49
54
  `, "utf8");
50
- })().catch((n) => {
51
- const r = n instanceof Error ? n.message : y.format("%o", n);
55
+ })().catch((a) => {
56
+ const s = a instanceof Error ? a.message : y.format("%o", a);
52
57
  console.warn("[tim-logger] Failed to write log file", {
53
- logPath: s,
54
- error: r
58
+ logPath: o,
59
+ error: s
55
60
  });
56
- }).finally(o);
61
+ }).finally(r);
57
62
  }
58
63
  }
59
- const O = l.combine(
60
- l.timestamp({ format: () => (/* @__PURE__ */ new Date()).toISOString() }),
61
- l.printf((t) => {
62
- const e = t.logEvent ?? {}, o = t.timestamp ?? (/* @__PURE__ */ new Date()).toISOString(), s = String(e.source ?? "LOG"), a = String(e.message ?? t.message ?? ""), n = e.data ?? {}, r = n && typeof n == "object" && Object.keys(n).length ? ` | ${JSON.stringify(n)}` : "";
63
- return `[${o}] ${s.padStart(12)}: ${a}${r}`;
64
+ const O = m.combine(
65
+ m.timestamp({ format: () => (/* @__PURE__ */ new Date()).toISOString() }),
66
+ m.printf((t) => {
67
+ const e = t.logEvent ?? {}, r = t.timestamp ?? (/* @__PURE__ */ new Date()).toISOString(), o = 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)}` : "";
68
+ return `[${r}] ${o.padStart(12)}: ${n}${s}`;
64
69
  })
65
- ), T = ["console"], I = (t, e, o, s) => typeof t == "string" ? { message: t, level: e, source: o, data: s } : {
70
+ ), T = ["console"], I = (t, e, r, o) => typeof t == "string" ? { message: t, level: e, source: r, data: o } : {
66
71
  ...t,
67
72
  level: t.level ?? e,
68
- source: t.source ?? o,
69
- data: t.data ?? s
73
+ source: t.source ?? r,
74
+ data: t.data ?? o
70
75
  }, A = (t) => {
71
76
  if (!t) return "";
72
77
  try {
@@ -74,115 +79,116 @@ const O = l.combine(
74
79
  } catch {
75
80
  return "[unserializable data]";
76
81
  }
77
- }, G = l.combine(
78
- l.timestamp(),
79
- l.errors({ stack: !0 }),
80
- l.colorize({ all: !0 }),
81
- l.printf((t) => {
82
+ }, G = m.combine(
83
+ m.timestamp(),
84
+ m.errors({ stack: !0 }),
85
+ m.colorize({ all: !0 }),
86
+ m.printf((t) => {
82
87
  const {
83
88
  timestamp: e,
84
- level: o = "info",
85
- message: s = "",
86
- stack: a,
87
- logEvent: n
88
- } = t, r = n ?? {}, d = r.source ?? "LOG", p = r.verb ?? o?.toUpperCase?.() ?? "LOG", w = [r.machineId, r.sessionId].filter(Boolean), $ = w.length ? u.gray(` [${w.join(" ")}]`) : "", i = r.data ? u.gray(` ${A(r.data)}`) : "", c = typeof r.duration == "number" ? u.yellow(` ${r.duration}ms`) : "", f = `${e} ${u.bold(`[${d}]`)} ${u.cyan(
89
+ level: r = "info",
90
+ message: o = "",
91
+ stack: n,
92
+ logEvent: a
93
+ } = t, s = a ?? {}, f = s.source ?? "LOG", p = s.verb ?? r?.toUpperCase?.() ?? "LOG", w = [s.machineId, s.sessionId].filter(Boolean), $ = w.length ? d.gray(` [${w.join(" ")}]`) : "", c = s.data ? d.gray(` ${A(s.data)}`) : "", i = typeof s.duration == "number" ? d.yellow(` ${s.duration}ms`) : "", l = `${e} ${d.bold(`[${f}]`)} ${d.cyan(
89
94
  p
90
- )} ${s}${c}${$}${i}`;
91
- return a ? `${f}
92
- ${a}` : f;
95
+ )} ${o}${i}${$}${c}`;
96
+ return n ? `${l}
97
+ ${n}` : l;
93
98
  })
94
99
  ), F = (t = {}) => {
95
100
  const e = t.transports?.length ? t.transports : T;
96
- let o = !1;
97
- const s = [];
98
- e.includes("console") && s.push(
101
+ let r = !1;
102
+ const o = [];
103
+ e.includes("console") && o.push(
99
104
  new E.Console({
100
105
  format: G
101
106
  })
102
107
  );
103
- const a = t.logPath ?? t.fsPath ?? "log.txt";
104
- e.includes("fs") && s.push(
105
- new j({
106
- defaultLogPath: a,
108
+ const n = t.logPath ?? t.fsPath ?? "log.txt";
109
+ e.includes("fs") && o.push(
110
+ new R({
111
+ defaultLogPath: n,
107
112
  format: O
108
113
  })
109
114
  );
110
- const n = D({
115
+ const a = k({
111
116
  level: "info",
112
- transports: s.length ? s : [new E.Console()]
113
- }), r = async (i, c) => {
114
- const f = I(
115
- i,
117
+ transports: o.length ? o : [new E.Console()]
118
+ }), s = async (c, i) => {
119
+ const l = I(
120
+ c,
116
121
  "info",
117
122
  t.source,
118
- c
119
- ), S = f.level ?? "info", L = {
120
- ...f,
123
+ i
124
+ ), S = l.level ?? "info", L = {
125
+ ...l,
121
126
  level: S,
122
- timestamp: f.timestamp ?? Date.now()
127
+ timestamp: l.timestamp ?? Date.now()
123
128
  };
124
- if (n.log({
129
+ if (a.log({
125
130
  level: S,
126
131
  message: L.message,
127
132
  logEvent: L
128
133
  }), e.includes("custom"))
129
134
  if (t.addLog) {
130
135
  const v = { ...L };
131
- v.data = C(v.data), await Promise.resolve(t.addLog(v));
132
- } else o || (o = !0, console.warn(
136
+ v.data = x(v.data), await Promise.resolve(t.addLog(v));
137
+ } else r || (r = !0, console.warn(
133
138
  "[tim-logger] Custom transport requested without addLog handler."
134
139
  ));
135
- }, d = async (i, c) => r({
136
- message: i,
140
+ }, f = async (c, i) => s({
141
+ message: c,
137
142
  level: "info",
138
- data: c,
143
+ data: i,
139
144
  source: t.source
140
- }), p = async (i, c) => r({
141
- message: i,
145
+ }), p = async (c, i) => s({
146
+ message: c,
142
147
  level: "warn",
143
- data: c,
148
+ data: i,
144
149
  source: t.source
145
150
  });
146
- return { log: r, info: d, warn: p, error: async (i, c) => r({
147
- message: i,
151
+ return { log: s, info: f, warn: p, error: async (c, i) => s({
152
+ message: c,
148
153
  level: "error",
149
- data: c,
154
+ data: i,
150
155
  source: t.source
151
- }), clearLogs: async () => {
156
+ }), clearLogs: async (c = () => !0) => {
152
157
  if (e.includes("fs"))
153
158
  try {
154
- await m.mkdir(h.dirname(a), {
159
+ await g.mkdir(h.dirname(n), {
155
160
  recursive: !0
156
161
  }).catch(() => {
157
- }), await m.writeFile(a, "", { flag: "a" }), await m.truncate(a, 0), await d("🧹 Logs cleared", { logPath: a });
162
+ }), await g.writeFile(n, "", { flag: "a" }), await g.truncate(n, 0), await f("🧹 Logs cleared", { logPath: n });
158
163
  } catch (i) {
159
- const c = i instanceof Error ? i.message : y.format("%o", i);
164
+ const l = i instanceof Error ? i.message : y.format("%o", i);
160
165
  await p("Failed to clear logs", {
161
- logPath: a,
162
- error: c
166
+ logPath: n,
167
+ error: l
163
168
  });
164
169
  }
170
+ e.includes("custom") && t.clearLogs && await t.clearLogs(c);
165
171
  } };
166
172
  };
167
- let g = F();
168
- const J = (t = {}) => (g = F(t), g), _ = (t, e) => g.log(t, e), q = (t, e) => g.info(t, e), B = (t, e) => g.warn(t, e), b = (t, e) => g.error(t, e), V = () => g.clearLogs?.() ?? Promise.resolve();
173
+ let u = F();
174
+ const J = (t = {}) => (u = F(t), u), _ = (t, e) => u.log(t, e), q = (t, e) => u.info(t, e), B = (t, e) => u.warn(t, e), b = (t, e) => u.error(t, e), V = () => u.clearLogs?.() ?? Promise.resolve();
169
175
  let P = !1;
170
176
  function U(t, e) {
171
- const o = e instanceof Error ? e.stack || e.message : y.format("%o", e);
172
- b(`❌ ${t}: ${o}`);
177
+ const r = e instanceof Error ? e.stack || e.message : y.format("%o", e);
178
+ b(`❌ ${t}: ${r}`);
173
179
  }
174
180
  function K({
175
181
  onCrash: t
176
182
  } = {}) {
177
183
  if (P) return;
178
184
  P = !0;
179
- const e = (o) => (s) => {
180
- if (U(o, s), typeof t == "function")
185
+ const e = (r) => (o) => {
186
+ if (U(r, o), typeof t == "function")
181
187
  try {
182
- t(s);
183
- } catch (a) {
184
- const n = a instanceof Error ? a.stack || a.message : y.format("%o", a);
185
- b(`❌ Crash handler failed: ${n}`);
188
+ t(o);
189
+ } catch (n) {
190
+ const a = n instanceof Error ? n.stack || n.message : y.format("%o", n);
191
+ b(`❌ Crash handler failed: ${a}`);
186
192
  }
187
193
  };
188
194
  process.on("uncaughtException", e("Uncaught Exception")), process.on("unhandledRejection", e("Unhandled Rejection"));
@@ -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 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":["cleanObject","obj","acc","key","MESSAGE","getLogPathFromData","data","maybeLogPath","DynamicFileTransport","TransportStream","defaultLogPath","format","info","callback","logPath","path","fs","dir","formatted","message","err","msg","util","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","clearLogs","defaultLogger","init","error","crashHandlersRegistered","logCrash","type","registerCrashHandlers","onCrash","handleCrash","handlerErr"],"mappings":";;;;;;;AAAO,MAAMA,IAAc,CAAiBC,IAAS,OAE1C,OAAO,KAAKA,CAAG,EAAE,OAAO,CAACC,GAAQC,OAChCF,EAAIE,CAAG,MAAM,WAEbD,EAAIC,CAAG,IAAIF,EAAIE,CAAG,IAEfD,IACR,CAAA,CAAO,GCURE,IAAU,OAAO,IAAI,SAAS,GAE9BC,IAAqB,CAACC,MAAgB;AACxC,MAAI,CAACA,KAAQ,OAAOA,KAAS,SAAU;AACvC,QAAMC,IAAgBD,EAAiC;AACvD,SAAO,OAAOC,KAAiB,YAAYA,EAAa,SAClDA,IACA;AACV;AAEA,MAAMC,UAA6BC,EAAgB;AAAA,EACvC;AAAA,EACA,kCAAkB,IAAA;AAAA,EAClB;AAAA,EAER,YAAY;AAAA,IACR,gBAAAC;AAAA,IACA,QAAAC;AAAA,EAAA,GAID;AAEC,UAAA,GACA,KAAK,iBAAiBD,GACtB,KAAK,aAAaC;AAAA,EACtB;AAAA,EAES,IAAIC,GAAgBC,GAAsB;AAC/C,iBAAa,MAAM,KAAK,KAAK,UAAUD,CAAI,CAAC;AAE5C,UAAME,IACFT,EAAmBO,EAAK,UAAU,IAAI,KAAK,KAAK;AAEpD,QAAI,CAACE,GAAS;AACV,MAAAD,EAAA;AACA;AAAA,IACJ;AAqCA,KAnCc,YAAY;AACtB,cAAQ,IAAI;AAAA,QACR,MAAM,OAAOE;AAAA,QACb,SAAS,OAAOA,EAAK;AAAA,QACrB,IAAI,OAAOC;AAAA,QACX,OAAO,OAAOA,EAAG;AAAA,QACjB,YAAY,OAAO,KAAK;AAAA,QACxB,WAAW,OAAO,KAAK,WAAW;AAAA,MAAA,CACrC,GAED,QAAQ,IAAI,QAAQ,CAAC;AAErB,YAAMC,IAAMF,EAAK,QAAQD,CAAO;AAChC,MAAK,KAAK,YAAY,IAAIG,CAAG,MACzB,KAAK,YAAY,IAAIA,CAAG,GACxB,MAAMD,EAAG,MAAMC,GAAK,EAAE,WAAW,GAAA,CAAM,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC,IAG3D,QAAQ,IAAI,QAAQ,CAAC;AAGrB,YAAMC,IAAY,KAAK,WAAW;AAAA,QAC9B,EAAE,GAAGN,EAAAA;AAAAA,QACL,KAAK,WAAW,WAAW,CAAA;AAAA,MAAC;AAEhC,cAAQ,IAAI,QAAQ,CAAC;AAErB,YAAMO,IACDD,EAAkBd,CAAO,KAAKc,EAAU,WAAW;AAExD,cAAQ,IAAI,QAAQ,CAAC,GAErB,MAAMF,EAAG,WAAWF,GAAS,GAAGK,CAAO;AAAA,GAAM,MAAM;AAAA,IACvD,GAEK,EACA,MAAM,CAACC,MAAQ;AACZ,YAAMC,IACFD,aAAe,QAAQA,EAAI,UAAUE,EAAK,OAAO,MAAMF,CAAG;AAC9D,cAAQ,KAAK,yCAAyC;AAAA,QAClD,SAAAN;AAAA,QACA,OAAOO;AAAA,MAAA,CACV;AAAA,IACL,CAAC,EACA,QAAQR,CAAQ;AAAA,EACzB;AACJ;AAEA,MAAMU,IAAiBC,EAAc;AAAA,EACjCA,EAAc,UAAU,EAAE,QAAQ,2BAAU,KAAA,GAAO,YAAA,GAAe;AAAA,EAClEA,EAAc,OAAO,CAACZ,MAAmB;AACrC,UAAMa,IAAQb,EAAK,YAAY,CAAA,GAGzBc,IACDd,EAAK,cAAwB,oBAAI,KAAA,GAAO,YAAA,GAEvCe,IAAO,OAAOF,EAAM,UAAU,KAAK,GACnCG,IAAO,OAAOH,EAAM,WAAWb,EAAK,WAAW,EAAE,GAEjDN,IAAQmB,EAAM,QAAQ,CAAA,GACtBI,IACFvB,KAAQ,OAAOA,KAAS,YAAY,OAAO,KAAKA,CAAI,EAAE,SAChD,MAAM,KAAK,UAAUA,CAAI,CAAC,KAC1B;AAEV,WAAO,IAAIoB,CAAS,KAAKC,EAAK,SAAS,EAAE,CAAC,KAAKC,CAAI,GAAGC,CAAU;AAAA,EACpE,CAAC;AACL,GAEMC,IAA+C,CAAC,SAAS,GAQzDC,IAAiB,CACnBC,GACAC,GACAC,GACA5B,MAEI,OAAO0B,KAAmB,WACnB,EAAE,SAASA,GAAgB,OAAAC,GAAO,QAAAC,GAAQ,MAAA5B,EAAA,IAG9C;AAAA,EACH,GAAG0B;AAAA,EACH,OAAOA,EAAe,SAASC;AAAA,EAC/B,QAAQD,EAAe,UAAUE;AAAA,EACjC,MAAMF,EAAe,QAAQ1B;AAAA,GAI/B6B,IAAgB,CAAC7B,MAAgB;AACnC,MAAI,CAACA,EAAM,QAAO;AAClB,MAAI;AACA,WAAO,KAAK,UAAUA,CAAI;AAAA,EAC9B,QAAQ;AACJ,WAAO;AAAA,EACX;AACJ,GAEM8B,IAAgBZ,EAAc;AAAA,EAChCA,EAAc,UAAA;AAAA,EACdA,EAAc,OAAO,EAAE,OAAO,IAAM;AAAA,EACpCA,EAAc,SAAS,EAAE,KAAK,IAAM;AAAA,EACpCA,EAAc,OAAO,CAACZ,MAAsB;AACxC,UAAM;AAAA,MACF,WAAAc;AAAA,MACA,OAAAO,IAAQ;AAAA,MACR,SAAAd,IAAU;AAAA,MACV,OAAAkB;AAAA,MACA,UAAAC;AAAA,IAAA,IACA1B,GAEEa,IAA2Ba,KAAY,CAAA,GACvCJ,IAAST,EAAM,UAAU,OACzBc,IAAOd,EAAM,QAAQQ,GAAO,mBAAmB,OAE/CO,IAAe,CAACf,EAAM,WAAWA,EAAM,SAAS,EAAE,OAAO,OAAO,GAChEgB,IAAMD,EAAa,SACnBE,EAAM,KAAK,KAAKF,EAAa,KAAK,GAAG,CAAC,GAAG,IACzC,IAEAlC,IAAOmB,EAAM,OACbiB,EAAM,KAAK,IAAIP,EAAcV,EAAM,IAAI,CAAC,EAAE,IAC1C,IAEAkB,IACF,OAAOlB,EAAM,YAAa,WACpBiB,EAAM,OAAO,IAAIjB,EAAM,QAAQ,IAAI,IACnC,IAEJmB,IAAO,GAAGlB,CAAS,IAAIgB,EAAM,KAAK,IAAIR,CAAM,GAAG,CAAC,IAAIQ,EAAM;AAAA,MAC5DH;AAAA,IAAA,CACH,IAAIpB,CAAO,GAAGwB,CAAQ,GAAGF,CAAG,GAAGnC,CAAI;AAEpC,WAAO+B,IAAQ,GAAGO,CAAI;AAAA,EAAKP,CAAK,KAAKO;AAAA,EACzC,CAAC;AACL,GAEaC,IAAqB,CAACC,IAA6B,OAAe;AAC3E,QAAMC,IAAgBD,EAAO,YAAY,SACnCA,EAAO,aACPhB;AACN,MAAIkB,IAAsB;AAE1B,QAAMC,IAAuC,CAAA;AAE7C,EAAIF,EAAc,SAAS,SAAS,KAChCE,EAAkB;AAAA,IACd,IAAIC,EAAW,QAAQ;AAAA,MACnB,QAAQd;AAAA,IAAA,CACX;AAAA,EAAA;AAIT,QAAM1B,IAAiBoC,EAAO,WAAWA,EAAO,UAAU;AAE1D,EAAIC,EAAc,SAAS,IAAI,KAC3BE,EAAkB;AAAA,IACd,IAAIzC,EAAqB;AAAA,MACrB,gBAAAE;AAAA,MACA,QAAQa;AAAA,IAAA,CACX;AAAA,EAAA;AAIT,QAAM4B,IAAaC,EAAoB;AAAA,IACnC,OAAO;AAAA,IACP,YAAYH,EAAkB,SACxBA,IACA,CAAC,IAAIC,EAAW,SAAS;AAAA,EAAA,CAClC,GAEKG,IAAM,OAAOrB,GAAmC1B,MAAgB;AAClE,UAAMgD,IAAQvB;AAAA,MACVC;AAAA,MACA;AAAA,MACAc,EAAO;AAAA,MACPxC;AAAA,IAAA,GAEEiD,IAAgBD,EAAM,SAAS,QAE/BE,IAAU;AAAA,MACZ,GAAGF;AAAA,MACH,OAAOC;AAAA,MACP,WAAWD,EAAM,aAAa,KAAK,IAAA;AAAA,IAAI;AAS3C,QANAH,EAAW,IAAI;AAAA,MACX,OAAOI;AAAA,MACP,SAASC,EAAQ;AAAA,MACjB,UAAUA;AAAA,IAAA,CACb,GAEGT,EAAc,SAAS,QAAQ;AAC/B,UAAID,EAAO,QAAQ;AACf,cAAMW,IAAQ,EAAE,GAAGD,EAAA;AACnB,QAAAC,EAAM,OAAOzD,EAAYyD,EAAM,IAAI,GACnC,MAAM,QAAQ,QAAQX,EAAO,OAAOW,CAAK,CAAC;AAAA,MAC9C,MAAA,CAAYT,MACRA,IAAsB,IACtB,QAAQ;AAAA,QACJ;AAAA,MAAA;AAAA,EAIhB,GAEMpC,IAAO,OAAOO,GAAiBb,MACjC+C,EAAI;AAAA,IACA,SAAAlC;AAAA,IACA,OAAO;AAAA,IACP,MAAAb;AAAA,IACA,QAAQwC,EAAO;AAAA,EAAA,CACN,GAEXY,IAAO,OAAOvC,GAAiBb,MACjC+C,EAAI;AAAA,IACA,SAAAlC;AAAA,IACA,OAAO;AAAA,IACP,MAAAb;AAAA,IACA,QAAQwC,EAAO;AAAA,EAAA,CACN;AAsCjB,SAAO,EAAE,KAAAO,GAAK,MAAAzC,GAAM,MAAA8C,GAAM,OApCZ,OAAOvC,GAAiBb,MAClC+C,EAAI;AAAA,IACA,SAAAlC;AAAA,IACA,OAAO;AAAA,IACP,MAAAb;AAAA,IACA,QAAQwC,EAAO;AAAA,EAAA,CACN,GA8BgB,WAxBf,YAAY;AAC1B,QAAKC,EAAc,SAAS,IAAI;AAEhC,UAAI;AAEA,cAAM/B,EACD,MAAMD,EAAK,QAAQL,CAAc,GAAG;AAAA,UACjC,WAAW;AAAA,QAAA,CACd,EACA,MAAM,MAAM;AAAA,QAAC,CAAC,GACnB,MAAMM,EAAG,UAAUN,GAAgB,IAAI,EAAE,MAAM,KAAK,GACpD,MAAMM,EAAG,SAASN,GAAgB,CAAC,GACnC,MAAME,EAAK,mBAAmB,EAAE,SAASF,GAAgB;AAAA,MAC7D,SAASU,GAAK;AAEV,cAAMC,IACFD,aAAe,QAAQA,EAAI,UAAUE,EAAK,OAAO,MAAMF,CAAG;AAC9D,cAAMsC,EAAK,wBAAwB;AAAA,UAC/B,SAAShD;AAAA,UACT,OAAOW;AAAA,QAAA,CACV;AAAA,MACL;AAAA,EACJ,EAEiCsC;AACrC;AAEA,IAAIC,IAAgBf,EAAA;AAEb,MAAMgB,IAAO,CAACf,IAA6B,QAC9Cc,IAAgBf,EAAmBC,CAAM,GAClCc,IAGEP,IAAM,CAACrB,GAAmC1B,MACnDsD,EAAc,IAAI5B,GAAgB1B,CAAI,GAC7BM,IAAO,CAACO,GAAiBb,MAClCsD,EAAc,KAAKzC,GAASb,CAAI,GACvBoD,IAAO,CAACvC,GAAiBb,MAClCsD,EAAc,KAAKzC,GAASb,CAAI,GACvBwD,IAAQ,CAAC3C,GAAiBb,MACnCsD,EAAc,MAAMzC,GAASb,CAAI,GACxBqD,IAAY,MAAMC,EAAc,YAAA,KAAiB,QAAQ,QAAA;AAItE,IAAIG,IAA0B;AAEvB,SAASC,EAASC,GAAc7C,GAAc;AACjD,QAAMD,IACFC,aAAe,QACTA,EAAI,SAASA,EAAI,UACjBE,EAAK,OAAO,MAAMF,CAAG;AAC/B,EAAK0C,EAAM,KAAKG,CAAI,KAAK9C,CAAO,EAAE;AACtC;AAEO,SAAS+C,EAAsB;AAAA,EAClC,SAAAC;AACJ,IAA0C,IAAI;AAC1C,MAAIJ,EAAyB;AAC7B,EAAAA,IAA0B;AAE1B,QAAMK,IAAc,CAACH,MAAiB,CAAC7C,MAAiB;AAEpD,QADA4C,EAASC,GAAM7C,CAAG,GACd,OAAO+C,KAAY;AACnB,UAAI;AACA,QAAAA,EAAQ/C,CAAG;AAAA,MACf,SAASiD,GAAY;AAEjB,cAAMhD,IACFgD,aAAsB,QAChBA,EAAW,SAASA,EAAW,UAC/B/C,EAAK,OAAO,MAAM+C,CAAU;AACtC,QAAKP,EAAM,2BAA2BzC,CAAG,EAAE;AAAA,MAC/C;AAAA,EAER;AAEA,UAAQ,GAAG,qBAAqB+C,EAAY,oBAAoB,CAAC,GACjE,QAAQ,GAAG,sBAAsBA,EAAY,qBAAqB,CAAC;AACvE;"}
1
+ {"version":3,"file":"server.es.js","sources":["../src/object.ts","../src/server.ts"],"sourcesContent":["export function cleanObject<T extends Record<string, unknown>>(\n obj?: T\n): Partial<T> {\n if (!obj) return {};\n\n const out: Partial<T> = {};\n for (const [key, value] of Object.entries(obj) as [keyof T, T[keyof T]][]) {\n if (value !== undefined) out[key] = value;\n }\n return out;\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 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 (predicate = () => true) => {\n if (transportsArr.includes('fs')) {\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 if (transportsArr.includes('custom') && config.clearLogs) {\n await config.clearLogs(predicate);\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","out","key","value","MESSAGE","getLogPathFromData","data","maybeLogPath","DynamicFileTransport","TransportStream","defaultLogPath","format","info","callback","logPath","path","fs","dir","formatted","message","err","msg","util","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","predicate","clearLogs","defaultLogger","init","error","crashHandlersRegistered","logCrash","type","registerCrashHandlers","onCrash","handleCrash","handlerErr"],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -8,6 +8,7 @@ export type BaseLoggerConfig = {
8
8
  source?: string;
9
9
  transports?: string[];
10
10
  addLog?: (event: LogEvent) => Promise<void> | void;
11
+ clearLogs?: (predicate: any) => Promise<void> | void;
11
12
  };
12
13
  export type ClientLoggerConfig = BaseLoggerConfig & {
13
14
  transports?: ClientTransport[];
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,WAAW,CAAC;AAEnB,MAAM,MAAM,uBAAuB,GAAG;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,QAAQ,CAAC;AACnD,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,IAAI,GAAG,QAAQ,CAAC;AAE1D,MAAM,MAAM,gBAAgB,GAAG;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CACtD,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,gBAAgB,GAAG;IAChD,UAAU,CAAC,EAAE,eAAe,EAAE,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,gBAAgB,GAAG;IAChD,UAAU,CAAC,EAAE,eAAe,EAAE,CAAC;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG;IACjB,GAAG,EAAE,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,EAAE,IAAI,CAAC,EAAE,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9D,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtD,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtD,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAClC,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,WAAW,CAAC;AAEnB,MAAM,MAAM,uBAAuB,GAAG;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,QAAQ,CAAC;AACnD,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,IAAI,GAAG,QAAQ,CAAC;AAE1D,MAAM,MAAM,gBAAgB,GAAG;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACnD,SAAS,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CACxD,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,gBAAgB,GAAG;IAChD,UAAU,CAAC,EAAE,eAAe,EAAE,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,gBAAgB,GAAG;IAChD,UAAU,CAAC,EAAE,eAAe,EAAE,CAAC;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG;IACjB,GAAG,EAAE,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,EAAE,IAAI,CAAC,EAAE,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9D,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtD,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtD,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAClC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tim-logger",
3
- "version": "0.0.30",
3
+ "version": "0.0.34",
4
4
  "type": "module",
5
5
  "private": false,
6
6
  "scripts": {