tim-logger 0.0.24 → 0.0.25

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.
@@ -0,0 +1,2 @@
1
+ export declare const cleanObject: <T extends Json>(obj?: T) => Partial<T>;
2
+ //# sourceMappingURL=object.d.ts.map
@@ -0,0 +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,4 +1,4 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const f=require("kleur"),l=require("winston"),P=require("winston-transport"),b=require("./console-intercept-CL_BfKQo.cjs"),g={},C=Symbol.for("message"),D=t=>{if(!t||typeof t!="object")return;const e=t.logPath;return typeof e=="string"&&e.length?e:void 0};class F extends P{defaultLogPath;ensuredDirs=new Set;constructor({defaultLogPath:e,format:s}){super({format:s}),this.defaultLogPath=e}log(e,s){setImmediate(()=>this.emit("logged",e));const r=D(e.logEvent?.data)??this.defaultLogPath;if(!r){s();return}(async()=>{const n=g.dirname(r);this.ensuredDirs.has(n)||(this.ensuredDirs.add(n),await g.mkdir(n,{recursive:!0}).catch(()=>{}));const o=this.format?this.format.transform(e,this.format.options):e,u=o[C]??o.message??"";await g.appendFile(r,`${u}
2
- `)})().catch(n=>{const o=n instanceof Error?n.message:g.format("%o",n);console.warn("[tim-logger] Failed to write log file",{logPath:r,error:o})}).finally(s)}}const j=l.format.combine(l.format.timestamp({format:()=>new Date().toISOString()}),l.format.printf(t=>{const e=t.logEvent??{},s=t.timestamp??new Date().toISOString(),r=String(e.source??"LOG"),a=String(e.message??t.message??""),n=e.data??{},o=n&&typeof n=="object"&&Object.keys(n).length?` | ${JSON.stringify(n)}`:"";return`[${s}] ${r.padStart(12)}: ${a}${o}`})),k=["console"],x=(t,e,s,r)=>typeof t=="string"?{message:t,level:e,source:s,data:r}:{...t,level:t.level??e,source:t.source??s,data:t.data??r},R=t=>{if(!t)return"";try{return JSON.stringify(t)}catch{return"[unserializable data]"}},T=l.format.combine(l.format.timestamp(),l.format.errors({stack:!0}),l.format.colorize({all:!0}),l.format.printf(t=>{const{timestamp:e,level:s="info",message:r="",stack:a,logEvent:n}=t,o=n??{},u=o.source??"LOG",h=o.verb??s?.toUpperCase?.()??"LOG",p=[o.machineId,o.sessionId].filter(Boolean),v=p.length?f.gray(` [${p.join(" ")}]`):"",c=o.data?f.gray(` ${R(o.data)}`):"",i=typeof o.duration=="number"?f.yellow(` ${o.duration}ms`):"",d=`${e} ${f.bold(`[${u}]`)} ${f.cyan(h)} ${r}${i}${v}${c}`;return a?`${d}
3
- ${a}`:d})),y=(t={})=>{const e=t.transports?.length?t.transports:k;let s=!1;const r=[];e.includes("console")&&r.push(new l.transports.Console({format:T}));const a=t.logPath??t.fsPath??"log.txt";e.includes("fs")&&r.push(new F({defaultLogPath:a,format:j}));const n=l.createLogger({level:"info",transports:r.length?r:[new l.transports.Console]}),o=async(c,i)=>{const d=x(c,"info",t.source,i),S=d.level??"info",w={...d,level:S,timestamp:d.timestamp??Date.now()};n.log({level:S,message:w.message,logEvent:w}),e.includes("custom")&&(t.addLog?await Promise.resolve(t.addLog(w)):s||(s=!0,console.warn("[tim-logger] Custom transport requested without addLog handler.")))},u=async(c,i)=>o({message:c,level:"info",data:i,source:t.source}),h=async(c,i)=>o({message:c,level:"warn",data:i,source:t.source});return{log:o,info:u,warn:h,error:async(c,i)=>o({message:c,level:"error",data:i,source:t.source}),clearLogs:async()=>{if(e.includes("fs"))try{await g.mkdir(g.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:g.format("%o",c);await h("Failed to clear logs",{logPath:a,error:i})}}}};let m=y();const I=(t={})=>(m=y(t),m),q=(t,e)=>m.log(t,e),O=(t,e)=>m.info(t,e),A=(t,e)=>m.warn(t,e),L=(t,e)=>m.error(t,e),G=()=>m.clearLogs?.()??Promise.resolve();let $=!1;function E(t,e){const s=e instanceof Error?e.stack||e.message:g.format("%o",e);L(`❌ ${t}: ${s}`)}function U({onCrash:t}={}){if($)return;$=!0;const e=s=>r=>{if(E(s,r),typeof t=="function")try{t(r)}catch(a){const n=a instanceof Error?a.stack||a.message:g.format("%o",a);L(`❌ Crash handler failed: ${n}`)}};process.on("uncaughtException",e("Uncaught Exception")),process.on("unhandledRejection",e("Unhandled Rejection"))}exports.interceptConsoleLogs=b.interceptConsoleLogs;exports.clearLogs=G;exports.createServerLogger=y;exports.error=L;exports.info=O;exports.init=I;exports.log=q;exports.logCrash=E;exports.registerCrashHandlers=U;exports.warn=A;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const f=require("kleur"),l=require("winston"),b=require("winston-transport"),C=require("./console-intercept-CL_BfKQo.cjs"),g={},D=(t={})=>Object.keys(t).reduce((e,o)=>(t[o]!==void 0&&(e[o]=t[o]),e),{}),F=Symbol.for("message"),j=t=>{if(!t||typeof t!="object")return;const e=t.logPath;return typeof e=="string"&&e.length?e:void 0};class x extends b{defaultLogPath;ensuredDirs=new Set;constructor({defaultLogPath:e,format:o}){super({format:o}),this.defaultLogPath=e}log(e,o){setImmediate(()=>this.emit("logged",e));const s=j(e.logEvent?.data)??this.defaultLogPath;if(!s){o();return}(async()=>{const n=(void 0)(s);this.ensuredDirs.has(n)||(this.ensuredDirs.add(n),await g.mkdir(n,{recursive:!0}).catch(()=>{}));const r=this.format?this.format.transform(e,this.format.options):e,m=r[F]??r.message??"";await g.appendFile(s,`${m}
2
+ `)})().catch(n=>{const r=n instanceof Error?n.message:g.format("%o",n);console.warn("[tim-logger] Failed to write log file",{logPath:s,error:r})}).finally(o)}}const O=l.format.combine(l.format.timestamp({format:()=>new Date().toISOString()}),l.format.printf(t=>{const e=t.logEvent??{},o=t.timestamp??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)}`:"";return`[${o}] ${s.padStart(12)}: ${a}${r}`})),R=["console"],T=(t,e,o,s)=>typeof t=="string"?{message:t,level:e,source:o,data:s}:{...t,level:t.level??e,source:t.source??o,data:t.data??s},k=t=>{if(!t)return"";try{return JSON.stringify(t)}catch{return"[unserializable data]"}},I=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:s="",stack:a,logEvent:n}=t,r=n??{},m=r.source??"LOG",h=r.verb??o?.toUpperCase?.()??"LOG",p=[r.machineId,r.sessionId].filter(Boolean),S=p.length?f.gray(` [${p.join(" ")}]`):"",c=r.data?f.gray(` ${k(r.data)}`):"",i=typeof r.duration=="number"?f.yellow(` ${r.duration}ms`):"",d=`${e} ${f.bold(`[${m}]`)} ${f.cyan(h)} ${s}${i}${S}${c}`;return a?`${d}
3
+ ${a}`:d})),L=(t={})=>{const e=t.transports?.length?t.transports:R;let o=!1;const s=[];e.includes("console")&&s.push(new l.transports.Console({format:I}));const a=t.logPath??t.fsPath??"log.txt";e.includes("fs")&&s.push(new x({defaultLogPath:a,format:O}));const n=l.createLogger({level:"info",transports:s.length?s:[new l.transports.Console]}),r=async(c,i)=>{const d=T(c,"info",t.source,i),$=d.level??"info",w={...d,level:$,timestamp:d.timestamp??Date.now()};if(n.log({level:$,message:w.message,logEvent:w}),e.includes("custom"))if(t.addLog){const y={...w};y.data=D(y.data),await Promise.resolve(t.addLog(y))}else o||(o=!0,console.warn("[tim-logger] Custom transport requested without addLog handler."))},m=async(c,i)=>r({message:c,level:"info",data:i,source:t.source}),h=async(c,i)=>r({message:c,level:"warn",data:i,source:t.source});return{log:r,info:m,warn:h,error:async(c,i)=>r({message:c,level:"error",data:i,source:t.source}),clearLogs:async()=>{if(e.includes("fs"))try{await g.mkdir((void 0)(a),{recursive:!0}).catch(()=>{}),await g.writeFile(a,"",{flag:"a"}),await g.truncate(a,0),await m("🧹 Logs cleared",{logPath:a})}catch(c){const i=c instanceof Error?c.message:g.format("%o",c);await h("Failed to clear logs",{logPath:a,error:i})}}}};let u=L();const q=(t={})=>(u=L(t),u),A=(t,e)=>u.log(t,e),G=(t,e)=>u.info(t,e),U=(t,e)=>u.warn(t,e),v=(t,e)=>u.error(t,e),z=()=>u.clearLogs?.()??Promise.resolve();let E=!1;function P(t,e){const o=e instanceof Error?e.stack||e.message:g.format("%o",e);v(`❌ ${t}: ${o}`)}function H({onCrash:t}={}){if(E)return;E=!0;const e=o=>s=>{if(P(o,s),typeof t=="function")try{t(s)}catch(a){const n=a instanceof Error?a.stack||a.message:g.format("%o",a);v(`❌ Crash handler failed: ${n}`)}};process.on("uncaughtException",e("Uncaught Exception")),process.on("unhandledRejection",e("Unhandled Rejection"))}exports.interceptConsoleLogs=C.interceptConsoleLogs;exports.clearLogs=z;exports.createServerLogger=L;exports.error=v;exports.info=G;exports.init=q;exports.log=A;exports.logCrash=P;exports.registerCrashHandlers=H;exports.warn=U;
4
4
  //# sourceMappingURL=server.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.cjs.js","sources":["../__vite-browser-external","../src/server.ts"],"sourcesContent":["export default {}","import kleur from 'kleur';\nimport type { TransformableInfo } from 'logform';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport util from 'node:util';\nimport {\n createLogger as createWinstonLogger,\n format as winstonFormat,\n transports,\n} from 'winston';\nimport TransportStream from 'winston-transport';\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\n constructor({\n defaultLogPath,\n format: logFormat,\n }: {\n defaultLogPath: string;\n format: ReturnType<typeof winstonFormat.combine>;\n }) {\n super({ format: logFormat });\n this.defaultLogPath = defaultLogPath;\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 const formatted = this.format\n ? (this.format.transform(info, this.format.options) as FileInfo)\n : info;\n const message =\n (formatted as { [MESSAGE]?: string })[MESSAGE] ??\n formatted.message ??\n '';\n await fs.appendFile(logPath, `${message}\\n`);\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 await Promise.resolve(config.addLog(payload));\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":["util","MESSAGE","getLogPathFromData","data","maybeLogPath","DynamicFileTransport","TransportStream","defaultLogPath","logFormat","info","callback","logPath","dir","path","fs","formatted","message","err","msg","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","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":["../__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 fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport 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\n constructor({\n defaultLogPath,\n format: logFormat,\n }: {\n defaultLogPath: string;\n format: ReturnType<typeof winstonFormat.combine>;\n }) {\n super({ format: logFormat });\n this.defaultLogPath = defaultLogPath;\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 const formatted = this.format\n ? (this.format.transform(info, this.format.options) as FileInfo)\n : info;\n const message =\n (formatted as { [MESSAGE]?: string })[MESSAGE] ??\n formatted.message ??\n '';\n await fs.appendFile(logPath, `${message}\\n`);\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":["util","cleanObject","obj","acc","key","MESSAGE","getLogPathFromData","data","maybeLogPath","DynamicFileTransport","TransportStream","defaultLogPath","logFormat","info","callback","logPath","dir","path.dirname","fs","formatted","message","err","msg","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 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAmB,MAAM,SAAS,CAAC;AAwK3E,eAAO,MAAM,kBAAkB,GAAI,SAAQ,kBAAuB,KAAG,MAwHpE,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;AAwK3E,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,128 +1,132 @@
1
1
  import f from "kleur";
2
- import { format as m, transports as v, createLogger as P } from "winston";
3
- import b from "winston-transport";
4
- import { i as V } from "./console-intercept-ByhsZ0kO.js";
5
- const l = {}, D = Symbol.for("message"), x = (t) => {
2
+ import { format as m, transports as $, createLogger as b } from "winston";
3
+ import D from "winston-transport";
4
+ import { i as Q } from "./console-intercept-ByhsZ0kO.js";
5
+ const l = {}, x = (t = {}) => Object.keys(t).reduce((e, o) => (t[o] !== void 0 && (e[o] = t[o]), e), {}), C = Symbol.for("message"), F = (t) => {
6
6
  if (!t || typeof t != "object") return;
7
7
  const e = t.logPath;
8
8
  return typeof e == "string" && e.length ? e : void 0;
9
9
  };
10
- class C extends b {
10
+ class R extends D {
11
11
  defaultLogPath;
12
12
  ensuredDirs = /* @__PURE__ */ new Set();
13
13
  constructor({
14
14
  defaultLogPath: e,
15
- format: s
15
+ format: o
16
16
  }) {
17
- super({ format: s }), this.defaultLogPath = e;
17
+ super({ format: o }), this.defaultLogPath = e;
18
18
  }
19
- log(e, s) {
19
+ log(e, o) {
20
20
  setImmediate(() => this.emit("logged", e));
21
- const r = x(e.logEvent?.data) ?? this.defaultLogPath;
22
- if (!r) {
23
- s();
21
+ const s = F(e.logEvent?.data) ?? this.defaultLogPath;
22
+ if (!s) {
23
+ o();
24
24
  return;
25
25
  }
26
26
  (async () => {
27
- const n = l.dirname(r);
27
+ const n = (void 0)(s);
28
28
  this.ensuredDirs.has(n) || (this.ensuredDirs.add(n), await l.mkdir(n, { recursive: !0 }).catch(() => {
29
29
  }));
30
- const o = this.format ? this.format.transform(e, this.format.options) : e, u = o[D] ?? o.message ?? "";
31
- await l.appendFile(r, `${u}
30
+ const r = this.format ? this.format.transform(e, this.format.options) : e, u = r[C] ?? r.message ?? "";
31
+ await l.appendFile(s, `${u}
32
32
  `);
33
33
  })().catch((n) => {
34
- const o = n instanceof Error ? n.message : l.format("%o", n);
34
+ const r = n instanceof Error ? n.message : l.format("%o", n);
35
35
  console.warn("[tim-logger] Failed to write log file", {
36
- logPath: r,
37
- error: o
36
+ logPath: s,
37
+ error: r
38
38
  });
39
- }).finally(s);
39
+ }).finally(o);
40
40
  }
41
41
  }
42
- const F = m.combine(
42
+ const j = m.combine(
43
43
  m.timestamp({ format: () => (/* @__PURE__ */ new Date()).toISOString() }),
44
44
  m.printf((t) => {
45
- const e = t.logEvent ?? {}, s = t.timestamp ?? (/* @__PURE__ */ new Date()).toISOString(), r = String(e.source ?? "LOG"), a = String(e.message ?? t.message ?? ""), n = e.data ?? {}, o = n && typeof n == "object" && Object.keys(n).length ? ` | ${JSON.stringify(n)}` : "";
46
- return `[${s}] ${r.padStart(12)}: ${a}${o}`;
45
+ 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)}` : "";
46
+ return `[${o}] ${s.padStart(12)}: ${a}${r}`;
47
47
  })
48
- ), k = ["console"], R = (t, e, s, r) => typeof t == "string" ? { message: t, level: e, source: s, data: r } : {
48
+ ), k = ["console"], O = (t, e, o, s) => typeof t == "string" ? { message: t, level: e, source: o, data: s } : {
49
49
  ...t,
50
50
  level: t.level ?? e,
51
- source: t.source ?? s,
52
- data: t.data ?? r
53
- }, j = (t) => {
51
+ source: t.source ?? o,
52
+ data: t.data ?? s
53
+ }, T = (t) => {
54
54
  if (!t) return "";
55
55
  try {
56
56
  return JSON.stringify(t);
57
57
  } catch {
58
58
  return "[unserializable data]";
59
59
  }
60
- }, T = m.combine(
60
+ }, I = m.combine(
61
61
  m.timestamp(),
62
62
  m.errors({ stack: !0 }),
63
63
  m.colorize({ all: !0 }),
64
64
  m.printf((t) => {
65
65
  const {
66
66
  timestamp: e,
67
- level: s = "info",
68
- message: r = "",
67
+ level: o = "info",
68
+ message: s = "",
69
69
  stack: a,
70
70
  logEvent: n
71
- } = t, o = n ?? {}, u = o.source ?? "LOG", h = o.verb ?? s?.toUpperCase?.() ?? "LOG", p = [o.machineId, o.sessionId].filter(Boolean), y = p.length ? f.gray(` [${p.join(" ")}]`) : "", c = o.data ? f.gray(` ${j(o.data)}`) : "", i = typeof o.duration == "number" ? f.yellow(` ${o.duration}ms`) : "", d = `${e} ${f.bold(`[${u}]`)} ${f.cyan(
71
+ } = t, r = n ?? {}, u = r.source ?? "LOG", h = r.verb ?? o?.toUpperCase?.() ?? "LOG", p = [r.machineId, r.sessionId].filter(Boolean), L = p.length ? f.gray(` [${p.join(" ")}]`) : "", c = r.data ? f.gray(` ${T(r.data)}`) : "", i = typeof r.duration == "number" ? f.yellow(` ${r.duration}ms`) : "", d = `${e} ${f.bold(`[${u}]`)} ${f.cyan(
72
72
  h
73
- )} ${r}${i}${y}${c}`;
73
+ )} ${s}${i}${L}${c}`;
74
74
  return a ? `${d}
75
75
  ${a}` : d;
76
76
  })
77
- ), S = (t = {}) => {
77
+ ), E = (t = {}) => {
78
78
  const e = t.transports?.length ? t.transports : k;
79
- let s = !1;
80
- const r = [];
81
- e.includes("console") && r.push(
82
- new v.Console({
83
- format: T
79
+ let o = !1;
80
+ const s = [];
81
+ e.includes("console") && s.push(
82
+ new $.Console({
83
+ format: I
84
84
  })
85
85
  );
86
86
  const a = t.logPath ?? t.fsPath ?? "log.txt";
87
- e.includes("fs") && r.push(
88
- new C({
87
+ e.includes("fs") && s.push(
88
+ new R({
89
89
  defaultLogPath: a,
90
- format: F
90
+ format: j
91
91
  })
92
92
  );
93
- const n = P({
93
+ const n = b({
94
94
  level: "info",
95
- transports: r.length ? r : [new v.Console()]
96
- }), o = async (c, i) => {
97
- const d = R(
95
+ transports: s.length ? s : [new $.Console()]
96
+ }), r = async (c, i) => {
97
+ const d = O(
98
98
  c,
99
99
  "info",
100
100
  t.source,
101
101
  i
102
- ), L = d.level ?? "info", w = {
102
+ ), v = d.level ?? "info", w = {
103
103
  ...d,
104
- level: L,
104
+ level: v,
105
105
  timestamp: d.timestamp ?? Date.now()
106
106
  };
107
- n.log({
108
- level: L,
107
+ if (n.log({
108
+ level: v,
109
109
  message: w.message,
110
110
  logEvent: w
111
- }), e.includes("custom") && (t.addLog ? await Promise.resolve(t.addLog(w)) : s || (s = !0, console.warn(
112
- "[tim-logger] Custom transport requested without addLog handler."
113
- )));
114
- }, u = async (c, i) => o({
111
+ }), e.includes("custom"))
112
+ if (t.addLog) {
113
+ const y = { ...w };
114
+ y.data = x(y.data), await Promise.resolve(t.addLog(y));
115
+ } else o || (o = !0, console.warn(
116
+ "[tim-logger] Custom transport requested without addLog handler."
117
+ ));
118
+ }, u = async (c, i) => r({
115
119
  message: c,
116
120
  level: "info",
117
121
  data: i,
118
122
  source: t.source
119
- }), h = async (c, i) => o({
123
+ }), h = async (c, i) => r({
120
124
  message: c,
121
125
  level: "warn",
122
126
  data: i,
123
127
  source: t.source
124
128
  });
125
- return { log: o, info: u, warn: h, error: async (c, i) => o({
129
+ return { log: r, info: u, warn: h, error: async (c, i) => r({
126
130
  message: c,
127
131
  level: "error",
128
132
  data: i,
@@ -130,7 +134,7 @@ ${a}` : d;
130
134
  }), clearLogs: async () => {
131
135
  if (e.includes("fs"))
132
136
  try {
133
- await l.mkdir(l.dirname(a), {
137
+ await l.mkdir((void 0)(a), {
134
138
  recursive: !0
135
139
  }).catch(() => {
136
140
  }), await l.writeFile(a, "", { flag: "a" }), await l.truncate(a, 0), await u("🧹 Logs cleared", { logPath: a });
@@ -143,39 +147,39 @@ ${a}` : d;
143
147
  }
144
148
  } };
145
149
  };
146
- let g = S();
147
- const U = (t = {}) => (g = S(t), g), z = (t, e) => g.log(t, e), N = (t, e) => g.info(t, e), H = (t, e) => g.warn(t, e), E = (t, e) => g.error(t, e), J = () => g.clearLogs?.() ?? Promise.resolve();
148
- let $ = !1;
149
- function I(t, e) {
150
- const s = e instanceof Error ? e.stack || e.message : l.format("%o", e);
151
- E(`❌ ${t}: ${s}`);
150
+ let g = E();
151
+ const N = (t = {}) => (g = E(t), g), H = (t, e) => g.log(t, e), J = (t, e) => g.info(t, e), _ = (t, e) => g.warn(t, e), P = (t, e) => g.error(t, e), q = () => g.clearLogs?.() ?? Promise.resolve();
152
+ let S = !1;
153
+ function A(t, e) {
154
+ const o = e instanceof Error ? e.stack || e.message : l.format("%o", e);
155
+ P(`❌ ${t}: ${o}`);
152
156
  }
153
- function _({
157
+ function B({
154
158
  onCrash: t
155
159
  } = {}) {
156
- if ($) return;
157
- $ = !0;
158
- const e = (s) => (r) => {
159
- if (I(s, r), typeof t == "function")
160
+ if (S) return;
161
+ S = !0;
162
+ const e = (o) => (s) => {
163
+ if (A(o, s), typeof t == "function")
160
164
  try {
161
- t(r);
165
+ t(s);
162
166
  } catch (a) {
163
167
  const n = a instanceof Error ? a.stack || a.message : l.format("%o", a);
164
- E(`❌ Crash handler failed: ${n}`);
168
+ P(`❌ Crash handler failed: ${n}`);
165
169
  }
166
170
  };
167
171
  process.on("uncaughtException", e("Uncaught Exception")), process.on("unhandledRejection", e("Unhandled Rejection"));
168
172
  }
169
173
  export {
170
- J as clearLogs,
171
- S as createServerLogger,
172
- E as error,
173
- N as info,
174
- U as init,
175
- V as interceptConsoleLogs,
176
- z as log,
177
- I as logCrash,
178
- _ as registerCrashHandlers,
179
- H as warn
174
+ q as clearLogs,
175
+ E as createServerLogger,
176
+ P as error,
177
+ J as info,
178
+ N as init,
179
+ Q as interceptConsoleLogs,
180
+ H as log,
181
+ A as logCrash,
182
+ B as registerCrashHandlers,
183
+ _ as warn
180
184
  };
181
185
  //# sourceMappingURL=server.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.es.js","sources":["../__vite-browser-external","../src/server.ts"],"sourcesContent":["export default {}","import kleur from 'kleur';\nimport type { TransformableInfo } from 'logform';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport util from 'node:util';\nimport {\n createLogger as createWinstonLogger,\n format as winstonFormat,\n transports,\n} from 'winston';\nimport TransportStream from 'winston-transport';\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\n constructor({\n defaultLogPath,\n format: logFormat,\n }: {\n defaultLogPath: string;\n format: ReturnType<typeof winstonFormat.combine>;\n }) {\n super({ format: logFormat });\n this.defaultLogPath = defaultLogPath;\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 const formatted = this.format\n ? (this.format.transform(info, this.format.options) as FileInfo)\n : info;\n const message =\n (formatted as { [MESSAGE]?: string })[MESSAGE] ??\n formatted.message ??\n '';\n await fs.appendFile(logPath, `${message}\\n`);\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 await Promise.resolve(config.addLog(payload));\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":["util","MESSAGE","getLogPathFromData","data","maybeLogPath","DynamicFileTransport","TransportStream","defaultLogPath","logFormat","info","callback","logPath","dir","path","fs","formatted","message","err","msg","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","warn","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 fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport 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\n constructor({\n defaultLogPath,\n format: logFormat,\n }: {\n defaultLogPath: string;\n format: ReturnType<typeof winstonFormat.combine>;\n }) {\n super({ format: logFormat });\n this.defaultLogPath = defaultLogPath;\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 const formatted = this.format\n ? (this.format.transform(info, this.format.options) as FileInfo)\n : info;\n const message =\n (formatted as { [MESSAGE]?: string })[MESSAGE] ??\n formatted.message ??\n '';\n await fs.appendFile(logPath, `${message}\\n`);\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":["util","cleanObject","obj","acc","key","MESSAGE","getLogPathFromData","data","maybeLogPath","DynamicFileTransport","TransportStream","defaultLogPath","logFormat","info","callback","logPath","dir","path.dirname","fs","formatted","message","err","msg","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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tim-logger",
3
- "version": "0.0.24",
3
+ "version": "0.0.25",
4
4
  "type": "module",
5
5
  "private": false,
6
6
  "scripts": {