tim-logger 0.0.22 → 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.
package/README.md CHANGED
@@ -0,0 +1,148 @@
1
+ # tim-logger
2
+
3
+ Tiny logger for Tim apps with shared event shape from `tim-types`.
4
+
5
+ ## Interface
6
+
7
+ The core event is `LogEvent` (from `tim-types`):
8
+
9
+ - `message` (string, required)
10
+ - `level` ('info' | 'warn' | 'error')
11
+ - `source` (string)
12
+ - `verb` (string)
13
+ - `data` (Json)
14
+ - `timestamp` (number)
15
+ - `duration` (number)
16
+ - `machineId` / `sessionId` (string)
17
+
18
+ Common functions (client + server):
19
+
20
+ - `createClientLogger(config)` / `createServerLogger(config)`
21
+ - `initClientLogger(config)` / `initServerLogger(config)`
22
+ - `log(eventOrMessage, data?)`
23
+ - `info(message, data?)`
24
+ - `warn(message, data?)`
25
+ - `error(message, data?)`
26
+ - `interceptConsoleLogs(logger, options?)`
27
+
28
+ Configs:
29
+
30
+ - `source?: string` (default source tag)
31
+ - `transports?: ('console' | 'custom' | 'fs')[]` (client: console/custom, server: console/custom/fs)
32
+ - `addLog?: (event: LogEvent) => Promise<void> | void` (required for `custom`)
33
+ - `fsPath?: string` (server only, for `fs` transport)
34
+
35
+ ## Client usage
36
+
37
+ Procedure:
38
+
39
+ 1) Initialize a logger (or use the default logger).
40
+ 2) Call `log`/`info`/`warn`/`error`.
41
+ 3) Optional: use a custom transport via `addLog`.
42
+ 4) Optional: intercept `console.*` and pipe through your logger.
43
+
44
+ ```ts
45
+ import {
46
+ createClientLogger,
47
+ initClientLogger,
48
+ log,
49
+ info,
50
+ warn,
51
+ error,
52
+ interceptConsoleLogs,
53
+ } from 'tim-logger';
54
+
55
+ // Option A: create a dedicated instance
56
+ const clientLogger = createClientLogger({
57
+ source: 'web-ui',
58
+ transports: ['console', 'custom'],
59
+ addLog: async (event) => {
60
+ // send to your API
61
+ await fetch('/api/log', {
62
+ method: 'POST',
63
+ headers: { 'content-type': 'application/json' },
64
+ body: JSON.stringify(event),
65
+ });
66
+ },
67
+ });
68
+
69
+ await clientLogger.info('UI ready', { route: '/' });
70
+
71
+ // Option B: initialize the default singleton
72
+ initClientLogger({ source: 'web-ui' });
73
+ await info('Loaded', { route: '/' });
74
+ await warn('Slow render', { ms: 1200 });
75
+ await error('Failed to load widget', { id: 'w-12' });
76
+
77
+ // You can also pass a full LogEvent:
78
+ await log({ message: 'Clicked', verb: 'CLICK', data: { id: 'btn-1' } });
79
+
80
+ // Intercept console on the client (returns a restore function)
81
+ const restoreConsole = interceptConsoleLogs(clientLogger, {
82
+ defaults: { source: 'web-ui' },
83
+ });
84
+ console.log('Hello from console');
85
+ restoreConsole();
86
+ ```
87
+
88
+ ## Server usage
89
+
90
+ Procedure:
91
+
92
+ 1) Create/initialize a server logger with desired transports.
93
+ 2) Call `log`/`info`/`warn`/`error`.
94
+ 3) Optional: use `fs` for file output or `custom` with `addLog`.
95
+ 4) Optional: install crash handlers.
96
+ 5) Optional: intercept `console.*` and pipe through your logger.
97
+
98
+ ```ts
99
+ import {
100
+ createServerLogger,
101
+ initServerLogger,
102
+ log,
103
+ info,
104
+ warn,
105
+ error,
106
+ clearLogs,
107
+ registerCrashHandlers,
108
+ interceptConsoleLogs,
109
+ } from 'tim-logger';
110
+
111
+ // Option A: create a dedicated instance
112
+ const serverLogger = createServerLogger({
113
+ source: 'api',
114
+ transports: ['console', 'fs'],
115
+ fsPath: 'logs/server.log',
116
+ });
117
+
118
+ await serverLogger.info('Server started', { port: 3000 });
119
+
120
+ // Option B: initialize the default singleton
121
+ initServerLogger({ source: 'api', transports: ['console', 'fs'] });
122
+ await info('Listening', { port: 3000 });
123
+ await warn('High memory', { rssMb: 512 });
124
+ await error('Unhandled request', { path: '/bad' });
125
+
126
+ // Clear file logs (no-op if fs transport is off)
127
+ await clearLogs();
128
+
129
+ // Intercept console on the server (returns a restore function)
130
+ const restoreConsole = interceptConsoleLogs(serverLogger, {
131
+ defaults: { source: 'api' },
132
+ });
133
+ console.warn('Deprecated path');
134
+ restoreConsole();
135
+
136
+ // Crash handlers (optional)
137
+ registerCrashHandlers({
138
+ onCrash: (err) => {
139
+ // send to Sentry or persist
140
+ },
141
+ });
142
+ ```
143
+
144
+ ## Notes
145
+
146
+ - `log(eventOrMessage, data?)` accepts either a `LogEvent` or a string message.
147
+ - `custom` transport requires `addLog`; if missing, it logs a one-time warning.
148
+ - Server `fs` transport writes readable text lines to the file.
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const w=["console"],f=(o,r,l,e)=>typeof o=="string"?{message:o,level:r,source:l,data:e}:{...o,level:o.level??r,source:o.source??l,data:o.data??e},i=(o={})=>{const r=o.transports?.length?o.transports:w;let l=!1;const e=async(n,t)=>{const u=f(n,"info",o.source,t),c=u.level??"info",d={...u,level:c},a=[];r.includes("console")&&(c==="error"?console.error:c==="warn"?console.warn:console.log)(d),r.includes("custom")&&(o.addLog?a.push(Promise.resolve(o.addLog(d))):l||(l=!0,console.warn("[tim-logger] Custom transport requested without addLog handler."))),a.length&&await Promise.all(a)};return{log:e,info:async(n,t)=>e({message:n,level:"info",data:t,source:o.source}),warn:async(n,t)=>e({message:n,level:"warn",data:t,source:o.source}),error:async(n,t)=>e({message:n,level:"error",data:t,source:o.source})}};let s=i();const g=(o={})=>(s=i(o),s),m=(o,r)=>s.log(o,r),L=(o,r)=>s.info(o,r),p=(o,r)=>s.warn(o,r),y=(o,r)=>s.error(o,r);exports.createClientLogger=i;exports.error=y;exports.info=L;exports.init=g;exports.log=m;exports.warn=p;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const g=require("./console-intercept-CL_BfKQo.cjs"),w=["console"],L=(o,e,l,r)=>typeof o=="string"?{message:o,level:e,source:l,data:r}:{...o,level:o.level??e,source:o.source??l,data:o.data??r},i=(o={})=>{const e=o.transports?.length?o.transports:w;let l=!1;const r=async(n,s)=>{const u=L(n,"info",o.source,s),c=u.level??"info",d={...u,level:c},a=[];e.includes("console")&&(c==="error"?console.error:c==="warn"?console.warn:console.log)(d),e.includes("custom")&&(o.addLog?a.push(Promise.resolve(o.addLog(d))):l||(l=!0,console.warn("[tim-logger] Custom transport requested without addLog handler."))),a.length&&await Promise.all(a)};return{log:r,info:async(n,s)=>r({message:n,level:"info",data:s,source:o.source}),warn:async(n,s)=>r({message:n,level:"warn",data:s,source:o.source}),error:async(n,s)=>r({message:n,level:"error",data:s,source:o.source}),clearLogs:async()=>{}}};let t=i();const f=(o={})=>(t=i(o),t),p=(o,e)=>t.log(o,e),m=(o,e)=>t.info(o,e),y=(o,e)=>t.warn(o,e),h=(o,e)=>t.error(o,e);exports.interceptConsoleLogs=g.interceptConsoleLogs;exports.createClientLogger=i;exports.error=h;exports.info=m;exports.init=f;exports.log=p;exports.warn=y;
2
2
  //# sourceMappingURL=client.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.cjs.js","sources":["../src/client.ts"],"sourcesContent":["import type {\n ClientLoggerConfig,\n ClientTransport,\n Json,\n Logger,\n} from './types';\n\nconst DEFAULT_CLIENT_TRANSPORTS: ClientTransport[] = ['console'];\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 {\n message: eventOrMessage,\n level,\n source,\n data,\n };\n }\n\n return {\n ...eventOrMessage,\n level: eventOrMessage.level ?? level,\n source: eventOrMessage.source ?? source,\n data: eventOrMessage.data ?? data,\n };\n};\n\nexport const createClientLogger = (config: ClientLoggerConfig = {}): Logger => {\n const transports = config.transports?.length\n ? config.transports\n : DEFAULT_CLIENT_TRANSPORTS;\n let warnedMissingCustom = false;\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 const payload = { ...event, level: resolvedLevel };\n\n const tasks: Promise<void>[] = [];\n\n if (transports.includes('console')) {\n const consoleMethod =\n resolvedLevel === 'error'\n ? console.error\n : resolvedLevel === 'warn'\n ? console.warn\n : console.log;\n consoleMethod(payload);\n }\n\n if (transports.includes('custom')) {\n if (config.addLog) {\n tasks.push(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 if (tasks.length) {\n await Promise.all(tasks);\n }\n };\n\n const info = async (message: string, data?: Json) =>\n log({ message, level: 'info', data, source: config.source });\n const warn = async (message: string, data?: Json) =>\n log({ message, level: 'warn', data, source: config.source });\n const error = async (message: string, data?: Json) =>\n log({ message, level: 'error', data, source: config.source });\n\n return { log, info, warn, error };\n};\n\nlet defaultLogger = createClientLogger();\n\nexport const init = (config: ClientLoggerConfig = {}) => {\n defaultLogger = createClientLogger(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);\n"],"names":["DEFAULT_CLIENT_TRANSPORTS","normalizeEvent","eventOrMessage","level","source","data","createClientLogger","config","transports","warnedMissingCustom","log","event","resolvedLevel","payload","tasks","message","error","defaultLogger","init","info","warn"],"mappings":"gFAOA,MAAMA,EAA+C,CAAC,SAAS,EAEzDC,EAAiB,CACnBC,EACAC,EACAC,EACAC,IAEI,OAAOH,GAAmB,SACnB,CACH,QAASA,EACT,MAAAC,EACA,OAAAC,EACA,KAAAC,CAAA,EAID,CACH,GAAGH,EACH,MAAOA,EAAe,OAASC,EAC/B,OAAQD,EAAe,QAAUE,EACjC,KAAMF,EAAe,MAAQG,CAAA,EAIxBC,EAAqB,CAACC,EAA6B,KAAe,CAC3E,MAAMC,EAAaD,EAAO,YAAY,OAChCA,EAAO,WACPP,EACN,IAAIS,EAAsB,GAE1B,MAAMC,EAAM,MAAOR,EAAmCG,IAAgB,CAClE,MAAMM,EAAQV,EACVC,EACA,OACAK,EAAO,OACPF,CAAA,EAEEO,EAAgBD,EAAM,OAAS,OAC/BE,EAAU,CAAE,GAAGF,EAAO,MAAOC,CAAA,EAE7BE,EAAyB,CAAA,EAE3BN,EAAW,SAAS,SAAS,IAEzBI,IAAkB,QACZ,QAAQ,MACRA,IAAkB,OAChB,QAAQ,KACR,QAAQ,KACNC,CAAO,EAGrBL,EAAW,SAAS,QAAQ,IACxBD,EAAO,OACPO,EAAM,KAAK,QAAQ,QAAQP,EAAO,OAAOM,CAAO,CAAC,CAAC,EAC1CJ,IACRA,EAAsB,GACtB,QAAQ,KACJ,iEAAA,IAKRK,EAAM,QACN,MAAM,QAAQ,IAAIA,CAAK,CAE/B,EASA,MAAO,CAAE,IAAAJ,EAAK,KAPD,MAAOK,EAAiBV,IACjCK,EAAI,CAAE,QAAAK,EAAS,MAAO,OAAQ,KAAAV,EAAM,OAAQE,EAAO,OAAQ,EAM3C,KALP,MAAOQ,EAAiBV,IACjCK,EAAI,CAAE,QAAAK,EAAS,MAAO,OAAQ,KAAAV,EAAM,OAAQE,EAAO,OAAQ,EAIrC,MAHZ,MAAOQ,EAAiBV,IAClCK,EAAI,CAAE,QAAAK,EAAS,MAAO,QAAS,KAAAV,EAAM,OAAQE,EAAO,OAAQ,CAEtCS,CAC9B,EAEA,IAAIC,EAAgBX,EAAA,EAEb,MAAMY,EAAO,CAACX,EAA6B,MAC9CU,EAAgBX,EAAmBC,CAAM,EAClCU,GAGEP,EAAM,CAACR,EAAmCG,IACnDY,EAAc,IAAIf,EAAgBG,CAAI,EAC7Bc,EAAO,CAACJ,EAAiBV,IAClCY,EAAc,KAAKF,EAASV,CAAI,EACvBe,EAAO,CAACL,EAAiBV,IAClCY,EAAc,KAAKF,EAASV,CAAI,EACvBW,EAAQ,CAACD,EAAiBV,IACnCY,EAAc,MAAMF,EAASV,CAAI"}
1
+ {"version":3,"file":"client.cjs.js","sources":["../src/client.ts"],"sourcesContent":["import type {\n ClientLoggerConfig,\n ClientTransport,\n Logger,\n} from './types';\n\nconst DEFAULT_CLIENT_TRANSPORTS: ClientTransport[] = ['console'];\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 {\n message: eventOrMessage,\n level,\n source,\n data,\n };\n }\n\n return {\n ...eventOrMessage,\n level: eventOrMessage.level ?? level,\n source: eventOrMessage.source ?? source,\n data: eventOrMessage.data ?? data,\n };\n};\n\nexport const createClientLogger = (config: ClientLoggerConfig = {}): Logger => {\n const transports = config.transports?.length\n ? config.transports\n : DEFAULT_CLIENT_TRANSPORTS;\n let warnedMissingCustom = false;\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 const payload = { ...event, level: resolvedLevel };\n\n const tasks: Promise<void>[] = [];\n\n if (transports.includes('console')) {\n const consoleMethod =\n resolvedLevel === 'error'\n ? console.error\n : resolvedLevel === 'warn'\n ? console.warn\n : console.log;\n consoleMethod(payload);\n }\n\n if (transports.includes('custom')) {\n if (config.addLog) {\n tasks.push(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 if (tasks.length) {\n await Promise.all(tasks);\n }\n };\n\n const info = async (message: string, data?: Json) =>\n log({ message, level: 'info', data, source: config.source });\n const warn = async (message: string, data?: Json) =>\n log({ message, level: 'warn', data, source: config.source });\n const error = async (message: string, data?: Json) =>\n log({ message, level: 'error', data, source: config.source });\n\n const clearLogs = async () => {};\n\n return { log, info, warn, error, clearLogs };\n};\n\nlet defaultLogger = createClientLogger();\n\nexport const init = (config: ClientLoggerConfig = {}) => {\n defaultLogger = createClientLogger(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 { interceptConsoleLogs } from './console-intercept';\n"],"names":["DEFAULT_CLIENT_TRANSPORTS","normalizeEvent","eventOrMessage","level","source","data","createClientLogger","config","transports","warnedMissingCustom","log","event","resolvedLevel","payload","tasks","message","defaultLogger","init","info","warn","error"],"mappings":"oIAMMA,EAA+C,CAAC,SAAS,EAEzDC,EAAiB,CACnBC,EACAC,EACAC,EACAC,IAEI,OAAOH,GAAmB,SACnB,CACH,QAASA,EACT,MAAAC,EACA,OAAAC,EACA,KAAAC,CAAA,EAID,CACH,GAAGH,EACH,MAAOA,EAAe,OAASC,EAC/B,OAAQD,EAAe,QAAUE,EACjC,KAAMF,EAAe,MAAQG,CAAA,EAIxBC,EAAqB,CAACC,EAA6B,KAAe,CAC3E,MAAMC,EAAaD,EAAO,YAAY,OAChCA,EAAO,WACPP,EACN,IAAIS,EAAsB,GAE1B,MAAMC,EAAM,MAAOR,EAAmCG,IAAgB,CAClE,MAAMM,EAAQV,EACVC,EACA,OACAK,EAAO,OACPF,CAAA,EAEEO,EAAgBD,EAAM,OAAS,OAC/BE,EAAU,CAAE,GAAGF,EAAO,MAAOC,CAAA,EAE7BE,EAAyB,CAAA,EAE3BN,EAAW,SAAS,SAAS,IAEzBI,IAAkB,QACZ,QAAQ,MACRA,IAAkB,OAChB,QAAQ,KACR,QAAQ,KACNC,CAAO,EAGrBL,EAAW,SAAS,QAAQ,IACxBD,EAAO,OACPO,EAAM,KAAK,QAAQ,QAAQP,EAAO,OAAOM,CAAO,CAAC,CAAC,EAC1CJ,IACRA,EAAsB,GACtB,QAAQ,KACJ,iEAAA,IAKRK,EAAM,QACN,MAAM,QAAQ,IAAIA,CAAK,CAE/B,EAWA,MAAO,CAAE,IAAAJ,EAAK,KATD,MAAOK,EAAiBV,IACjCK,EAAI,CAAE,QAAAK,EAAS,MAAO,OAAQ,KAAAV,EAAM,OAAQE,EAAO,OAAQ,EAQ3C,KAPP,MAAOQ,EAAiBV,IACjCK,EAAI,CAAE,QAAAK,EAAS,MAAO,OAAQ,KAAAV,EAAM,OAAQE,EAAO,OAAQ,EAMrC,MALZ,MAAOQ,EAAiBV,IAClCK,EAAI,CAAE,QAAAK,EAAS,MAAO,QAAS,KAAAV,EAAM,OAAQE,EAAO,OAAQ,EAI/B,UAFf,SAAY,CAAC,CAEE,CACrC,EAEA,IAAIS,EAAgBV,EAAA,EAEb,MAAMW,EAAO,CAACV,EAA6B,MAC9CS,EAAgBV,EAAmBC,CAAM,EAClCS,GAGEN,EAAM,CAACR,EAAmCG,IACnDW,EAAc,IAAId,EAAgBG,CAAI,EAC7Ba,EAAO,CAACH,EAAiBV,IAClCW,EAAc,KAAKD,EAASV,CAAI,EACvBc,EAAO,CAACJ,EAAiBV,IAClCW,EAAc,KAAKD,EAASV,CAAI,EACvBe,EAAQ,CAACL,EAAiBV,IACnCW,EAAc,MAAMD,EAASV,CAAI"}
package/dist/client.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { ClientLoggerConfig, Json, Logger } from './types';
1
+ import { ClientLoggerConfig, Logger } from './types';
2
2
 
3
3
  export declare const createClientLogger: (config?: ClientLoggerConfig) => Logger;
4
4
  export declare const init: (config?: ClientLoggerConfig) => Logger;
@@ -6,4 +6,5 @@ export declare const log: (eventOrMessage: LogEvent | string, data?: Json) => Pr
6
6
  export declare const info: (message: string, data?: Json) => Promise<void>;
7
7
  export declare const warn: (message: string, data?: Json) => Promise<void>;
8
8
  export declare const error: (message: string, data?: Json) => Promise<void>;
9
+ export { interceptConsoleLogs } from './console-intercept';
9
10
  //# sourceMappingURL=client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,kBAAkB,EAElB,IAAI,EACJ,MAAM,EACT,MAAM,SAAS,CAAC;AA2BjB,eAAO,MAAM,kBAAkB,GAAI,SAAQ,kBAAuB,KAAG,MAoDpE,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"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,kBAAkB,EAElB,MAAM,EACT,MAAM,SAAS,CAAC;AA2BjB,eAAO,MAAM,kBAAkB,GAAI,SAAQ,kBAAuB,KAAG,MAsDpE,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,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC"}
package/dist/client.es.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { i as A } from "./console-intercept-ByhsZ0kO.js";
1
2
  const w = ["console"], f = (o, r, l, e) => typeof o == "string" ? {
2
3
  message: o,
3
4
  level: r,
@@ -11,27 +12,29 @@ const w = ["console"], f = (o, r, l, e) => typeof o == "string" ? {
11
12
  }, d = (o = {}) => {
12
13
  const r = o.transports?.length ? o.transports : w;
13
14
  let l = !1;
14
- const e = async (n, s) => {
15
- const u = f(
16
- n,
15
+ const e = async (s, n) => {
16
+ const i = f(
17
+ s,
17
18
  "info",
18
19
  o.source,
19
- s
20
- ), c = u.level ?? "info", i = { ...u, level: c }, a = [];
21
- r.includes("console") && (c === "error" ? console.error : c === "warn" ? console.warn : console.log)(i), r.includes("custom") && (o.addLog ? a.push(Promise.resolve(o.addLog(i))) : l || (l = !0, console.warn(
20
+ n
21
+ ), c = i.level ?? "info", u = { ...i, level: c }, a = [];
22
+ r.includes("console") && (c === "error" ? console.error : c === "warn" ? console.warn : console.log)(u), r.includes("custom") && (o.addLog ? a.push(Promise.resolve(o.addLog(u))) : l || (l = !0, console.warn(
22
23
  "[tim-logger] Custom transport requested without addLog handler."
23
24
  ))), a.length && await Promise.all(a);
24
25
  };
25
- return { log: e, info: async (n, s) => e({ message: n, level: "info", data: s, source: o.source }), warn: async (n, s) => e({ message: n, level: "warn", data: s, source: o.source }), error: async (n, s) => e({ message: n, level: "error", data: s, source: o.source }) };
26
+ return { log: e, info: async (s, n) => e({ message: s, level: "info", data: n, source: o.source }), warn: async (s, n) => e({ message: s, level: "warn", data: n, source: o.source }), error: async (s, n) => e({ message: s, level: "error", data: n, source: o.source }), clearLogs: async () => {
27
+ } };
26
28
  };
27
29
  let t = d();
28
- const h = (o = {}) => (t = d(o), t), v = (o, r) => t.log(o, r), y = (o, r) => t.info(o, r), C = (o, r) => t.warn(o, r), T = (o, r) => t.error(o, r);
30
+ const y = (o = {}) => (t = d(o), t), v = (o, r) => t.log(o, r), C = (o, r) => t.info(o, r), T = (o, r) => t.warn(o, r), E = (o, r) => t.error(o, r);
29
31
  export {
30
32
  d as createClientLogger,
31
- T as error,
32
- y as info,
33
- h as init,
33
+ E as error,
34
+ C as info,
35
+ y as init,
36
+ A as interceptConsoleLogs,
34
37
  v as log,
35
- C as warn
38
+ T as warn
36
39
  };
37
40
  //# sourceMappingURL=client.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.es.js","sources":["../src/client.ts"],"sourcesContent":["import type {\n ClientLoggerConfig,\n ClientTransport,\n Json,\n Logger,\n} from './types';\n\nconst DEFAULT_CLIENT_TRANSPORTS: ClientTransport[] = ['console'];\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 {\n message: eventOrMessage,\n level,\n source,\n data,\n };\n }\n\n return {\n ...eventOrMessage,\n level: eventOrMessage.level ?? level,\n source: eventOrMessage.source ?? source,\n data: eventOrMessage.data ?? data,\n };\n};\n\nexport const createClientLogger = (config: ClientLoggerConfig = {}): Logger => {\n const transports = config.transports?.length\n ? config.transports\n : DEFAULT_CLIENT_TRANSPORTS;\n let warnedMissingCustom = false;\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 const payload = { ...event, level: resolvedLevel };\n\n const tasks: Promise<void>[] = [];\n\n if (transports.includes('console')) {\n const consoleMethod =\n resolvedLevel === 'error'\n ? console.error\n : resolvedLevel === 'warn'\n ? console.warn\n : console.log;\n consoleMethod(payload);\n }\n\n if (transports.includes('custom')) {\n if (config.addLog) {\n tasks.push(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 if (tasks.length) {\n await Promise.all(tasks);\n }\n };\n\n const info = async (message: string, data?: Json) =>\n log({ message, level: 'info', data, source: config.source });\n const warn = async (message: string, data?: Json) =>\n log({ message, level: 'warn', data, source: config.source });\n const error = async (message: string, data?: Json) =>\n log({ message, level: 'error', data, source: config.source });\n\n return { log, info, warn, error };\n};\n\nlet defaultLogger = createClientLogger();\n\nexport const init = (config: ClientLoggerConfig = {}) => {\n defaultLogger = createClientLogger(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);\n"],"names":["DEFAULT_CLIENT_TRANSPORTS","normalizeEvent","eventOrMessage","level","source","data","createClientLogger","config","transports","warnedMissingCustom","log","event","resolvedLevel","payload","tasks","message","error","defaultLogger","init","info","warn"],"mappings":"AAOA,MAAMA,IAA+C,CAAC,SAAS,GAEzDC,IAAiB,CACnBC,GACAC,GACAC,GACAC,MAEI,OAAOH,KAAmB,WACnB;AAAA,EACH,SAASA;AAAA,EACT,OAAAC;AAAA,EACA,QAAAC;AAAA,EACA,MAAAC;AAAA,IAID;AAAA,EACH,GAAGH;AAAA,EACH,OAAOA,EAAe,SAASC;AAAA,EAC/B,QAAQD,EAAe,UAAUE;AAAA,EACjC,MAAMF,EAAe,QAAQG;AAAA,GAIxBC,IAAqB,CAACC,IAA6B,OAAe;AAC3E,QAAMC,IAAaD,EAAO,YAAY,SAChCA,EAAO,aACPP;AACN,MAAIS,IAAsB;AAE1B,QAAMC,IAAM,OAAOR,GAAmCG,MAAgB;AAClE,UAAMM,IAAQV;AAAA,MACVC;AAAA,MACA;AAAA,MACAK,EAAO;AAAA,MACPF;AAAA,IAAA,GAEEO,IAAgBD,EAAM,SAAS,QAC/BE,IAAU,EAAE,GAAGF,GAAO,OAAOC,EAAA,GAE7BE,IAAyB,CAAA;AAE/B,IAAIN,EAAW,SAAS,SAAS,MAEzBI,MAAkB,UACZ,QAAQ,QACRA,MAAkB,SAChB,QAAQ,OACR,QAAQ,KACNC,CAAO,GAGrBL,EAAW,SAAS,QAAQ,MACxBD,EAAO,SACPO,EAAM,KAAK,QAAQ,QAAQP,EAAO,OAAOM,CAAO,CAAC,CAAC,IAC1CJ,MACRA,IAAsB,IACtB,QAAQ;AAAA,MACJ;AAAA,IAAA,KAKRK,EAAM,UACN,MAAM,QAAQ,IAAIA,CAAK;AAAA,EAE/B;AASA,SAAO,EAAE,KAAAJ,GAAK,MAPD,OAAOK,GAAiBV,MACjCK,EAAI,EAAE,SAAAK,GAAS,OAAO,QAAQ,MAAAV,GAAM,QAAQE,EAAO,QAAQ,GAM3C,MALP,OAAOQ,GAAiBV,MACjCK,EAAI,EAAE,SAAAK,GAAS,OAAO,QAAQ,MAAAV,GAAM,QAAQE,EAAO,QAAQ,GAIrC,OAHZ,OAAOQ,GAAiBV,MAClCK,EAAI,EAAE,SAAAK,GAAS,OAAO,SAAS,MAAAV,GAAM,QAAQE,EAAO,QAAQ,EAEtCS;AAC9B;AAEA,IAAIC,IAAgBX,EAAA;AAEb,MAAMY,IAAO,CAACX,IAA6B,QAC9CU,IAAgBX,EAAmBC,CAAM,GAClCU,IAGEP,IAAM,CAACR,GAAmCG,MACnDY,EAAc,IAAIf,GAAgBG,CAAI,GAC7Bc,IAAO,CAACJ,GAAiBV,MAClCY,EAAc,KAAKF,GAASV,CAAI,GACvBe,IAAO,CAACL,GAAiBV,MAClCY,EAAc,KAAKF,GAASV,CAAI,GACvBW,IAAQ,CAACD,GAAiBV,MACnCY,EAAc,MAAMF,GAASV,CAAI;"}
1
+ {"version":3,"file":"client.es.js","sources":["../src/client.ts"],"sourcesContent":["import type {\n ClientLoggerConfig,\n ClientTransport,\n Logger,\n} from './types';\n\nconst DEFAULT_CLIENT_TRANSPORTS: ClientTransport[] = ['console'];\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 {\n message: eventOrMessage,\n level,\n source,\n data,\n };\n }\n\n return {\n ...eventOrMessage,\n level: eventOrMessage.level ?? level,\n source: eventOrMessage.source ?? source,\n data: eventOrMessage.data ?? data,\n };\n};\n\nexport const createClientLogger = (config: ClientLoggerConfig = {}): Logger => {\n const transports = config.transports?.length\n ? config.transports\n : DEFAULT_CLIENT_TRANSPORTS;\n let warnedMissingCustom = false;\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 const payload = { ...event, level: resolvedLevel };\n\n const tasks: Promise<void>[] = [];\n\n if (transports.includes('console')) {\n const consoleMethod =\n resolvedLevel === 'error'\n ? console.error\n : resolvedLevel === 'warn'\n ? console.warn\n : console.log;\n consoleMethod(payload);\n }\n\n if (transports.includes('custom')) {\n if (config.addLog) {\n tasks.push(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 if (tasks.length) {\n await Promise.all(tasks);\n }\n };\n\n const info = async (message: string, data?: Json) =>\n log({ message, level: 'info', data, source: config.source });\n const warn = async (message: string, data?: Json) =>\n log({ message, level: 'warn', data, source: config.source });\n const error = async (message: string, data?: Json) =>\n log({ message, level: 'error', data, source: config.source });\n\n const clearLogs = async () => {};\n\n return { log, info, warn, error, clearLogs };\n};\n\nlet defaultLogger = createClientLogger();\n\nexport const init = (config: ClientLoggerConfig = {}) => {\n defaultLogger = createClientLogger(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 { interceptConsoleLogs } from './console-intercept';\n"],"names":["DEFAULT_CLIENT_TRANSPORTS","normalizeEvent","eventOrMessage","level","source","data","createClientLogger","config","transports","warnedMissingCustom","log","event","resolvedLevel","payload","tasks","message","defaultLogger","init","info","warn","error"],"mappings":";AAMA,MAAMA,IAA+C,CAAC,SAAS,GAEzDC,IAAiB,CACnBC,GACAC,GACAC,GACAC,MAEI,OAAOH,KAAmB,WACnB;AAAA,EACH,SAASA;AAAA,EACT,OAAAC;AAAA,EACA,QAAAC;AAAA,EACA,MAAAC;AAAA,IAID;AAAA,EACH,GAAGH;AAAA,EACH,OAAOA,EAAe,SAASC;AAAA,EAC/B,QAAQD,EAAe,UAAUE;AAAA,EACjC,MAAMF,EAAe,QAAQG;AAAA,GAIxBC,IAAqB,CAACC,IAA6B,OAAe;AAC3E,QAAMC,IAAaD,EAAO,YAAY,SAChCA,EAAO,aACPP;AACN,MAAIS,IAAsB;AAE1B,QAAMC,IAAM,OAAOR,GAAmCG,MAAgB;AAClE,UAAMM,IAAQV;AAAA,MACVC;AAAA,MACA;AAAA,MACAK,EAAO;AAAA,MACPF;AAAA,IAAA,GAEEO,IAAgBD,EAAM,SAAS,QAC/BE,IAAU,EAAE,GAAGF,GAAO,OAAOC,EAAA,GAE7BE,IAAyB,CAAA;AAE/B,IAAIN,EAAW,SAAS,SAAS,MAEzBI,MAAkB,UACZ,QAAQ,QACRA,MAAkB,SAChB,QAAQ,OACR,QAAQ,KACNC,CAAO,GAGrBL,EAAW,SAAS,QAAQ,MACxBD,EAAO,SACPO,EAAM,KAAK,QAAQ,QAAQP,EAAO,OAAOM,CAAO,CAAC,CAAC,IAC1CJ,MACRA,IAAsB,IACtB,QAAQ;AAAA,MACJ;AAAA,IAAA,KAKRK,EAAM,UACN,MAAM,QAAQ,IAAIA,CAAK;AAAA,EAE/B;AAWA,SAAO,EAAE,KAAAJ,GAAK,MATD,OAAOK,GAAiBV,MACjCK,EAAI,EAAE,SAAAK,GAAS,OAAO,QAAQ,MAAAV,GAAM,QAAQE,EAAO,QAAQ,GAQ3C,MAPP,OAAOQ,GAAiBV,MACjCK,EAAI,EAAE,SAAAK,GAAS,OAAO,QAAQ,MAAAV,GAAM,QAAQE,EAAO,QAAQ,GAMrC,OALZ,OAAOQ,GAAiBV,MAClCK,EAAI,EAAE,SAAAK,GAAS,OAAO,SAAS,MAAAV,GAAM,QAAQE,EAAO,QAAQ,GAI/B,WAFf,YAAY;AAAA,EAAC,EAEE;AACrC;AAEA,IAAIS,IAAgBV,EAAA;AAEb,MAAMW,IAAO,CAACV,IAA6B,QAC9CS,IAAgBV,EAAmBC,CAAM,GAClCS,IAGEN,IAAM,CAACR,GAAmCG,MACnDW,EAAc,IAAId,GAAgBG,CAAI,GAC7Ba,IAAO,CAACH,GAAiBV,MAClCW,EAAc,KAAKD,GAASV,CAAI,GACvBc,IAAO,CAACJ,GAAiBV,MAClCW,EAAc,KAAKD,GAASV,CAAI,GACvBe,IAAQ,CAACL,GAAiBV,MACnCW,EAAc,MAAMD,GAASV,CAAI;"}
@@ -0,0 +1,31 @@
1
+ const r = ["log", "info", "warn", "error"], f = (o) => {
2
+ if (typeof o == "string") return o;
3
+ if (o instanceof Error)
4
+ return o.stack || o.message || o.toString();
5
+ try {
6
+ return JSON.stringify(o);
7
+ } catch {
8
+ return String(o);
9
+ }
10
+ }, g = (o, s = {}) => {
11
+ const { defaults: e = {} } = s, c = {
12
+ log: console.log.bind(console),
13
+ info: console.info.bind(console),
14
+ warn: console.warn.bind(console),
15
+ error: console.error.bind(console)
16
+ };
17
+ return r.forEach((n) => {
18
+ console[n] = (...i) => {
19
+ const t = n === "warn" ? "warn" : n === "error" ? "error" : "info", l = i.map(f).join(" ");
20
+ o.log({ message: l, level: t, ...e });
21
+ };
22
+ }), () => {
23
+ r.forEach((n) => {
24
+ console[n] = c[n];
25
+ });
26
+ };
27
+ };
28
+ export {
29
+ g as i
30
+ };
31
+ //# sourceMappingURL=console-intercept-ByhsZ0kO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"console-intercept-ByhsZ0kO.js","sources":["../src/console-intercept.ts"],"sourcesContent":["import type { ConsoleInterceptOptions, Logger } from './types';\n\nconst consoleMethods = ['log', 'info', 'warn', 'error'] as const;\ntype ConsoleMethod = (typeof consoleMethods)[number];\n\nconst serializeConsoleValue = (value: unknown) => {\n if (typeof value === 'string') return value;\n if (value instanceof Error)\n return value.stack || value.message || value.toString();\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n};\n\nexport const interceptConsoleLogs = (\n logger: Logger,\n options: ConsoleInterceptOptions = {}\n) => {\n const { defaults = {} } = options;\n\n const originals: Record<ConsoleMethod, (...args: any[]) => void> = {\n log: console.log.bind(console),\n info: console.info.bind(console),\n warn: console.warn.bind(console),\n error: console.error.bind(console),\n };\n\n consoleMethods.forEach((method) => {\n console[method] = (...args: any[]) => {\n const level: LogLevel =\n method === 'warn'\n ? 'warn'\n : method === 'error'\n ? 'error'\n : 'info';\n\n const message = args.map(serializeConsoleValue).join(' ');\n void logger.log({ message, level, ...defaults });\n };\n });\n\n return () => {\n consoleMethods.forEach((method) => {\n console[method] = originals[method];\n });\n };\n};\n"],"names":["consoleMethods","serializeConsoleValue","value","interceptConsoleLogs","logger","options","defaults","originals","method","args","level","message"],"mappings":"AAEA,MAAMA,IAAiB,CAAC,OAAO,QAAQ,QAAQ,OAAO,GAGhDC,IAAwB,CAACC,MAAmB;AAC9C,MAAI,OAAOA,KAAU,SAAU,QAAOA;AACtC,MAAIA,aAAiB;AACjB,WAAOA,EAAM,SAASA,EAAM,WAAWA,EAAM,SAAA;AACjD,MAAI;AACA,WAAO,KAAK,UAAUA,CAAK;AAAA,EAC/B,QAAQ;AACJ,WAAO,OAAOA,CAAK;AAAA,EACvB;AACJ,GAEaC,IAAuB,CAChCC,GACAC,IAAmC,OAClC;AACD,QAAM,EAAE,UAAAC,IAAW,CAAA,EAAC,IAAMD,GAEpBE,IAA6D;AAAA,IAC/D,KAAK,QAAQ,IAAI,KAAK,OAAO;AAAA,IAC7B,MAAM,QAAQ,KAAK,KAAK,OAAO;AAAA,IAC/B,MAAM,QAAQ,KAAK,KAAK,OAAO;AAAA,IAC/B,OAAO,QAAQ,MAAM,KAAK,OAAO;AAAA,EAAA;AAGrC,SAAAP,EAAe,QAAQ,CAACQ,MAAW;AAC/B,YAAQA,CAAM,IAAI,IAAIC,MAAgB;AAClC,YAAMC,IACFF,MAAW,SACL,SACAA,MAAW,UACT,UACA,QAENG,IAAUF,EAAK,IAAIR,CAAqB,EAAE,KAAK,GAAG;AACxD,MAAKG,EAAO,IAAI,EAAE,SAAAO,GAAS,OAAAD,GAAO,GAAGJ,GAAU;AAAA,IACnD;AAAA,EACJ,CAAC,GAEM,MAAM;AACT,IAAAN,EAAe,QAAQ,CAACQ,MAAW;AAC/B,cAAQA,CAAM,IAAID,EAAUC,CAAM;AAAA,IACtC,CAAC;AAAA,EACL;AACJ;"}
@@ -0,0 +1,2 @@
1
+ "use strict";const r=["log","info","warn","error"],g=o=>{if(typeof o=="string")return o;if(o instanceof Error)return o.stack||o.message||o.toString();try{return JSON.stringify(o)}catch{return String(o)}},f=(o,s={})=>{const{defaults:e={}}=s,c={log:console.log.bind(console),info:console.info.bind(console),warn:console.warn.bind(console),error:console.error.bind(console)};return r.forEach(n=>{console[n]=(...t)=>{const i=n==="warn"?"warn":n==="error"?"error":"info",l=t.map(g).join(" ");o.log({message:l,level:i,...e})}}),()=>{r.forEach(n=>{console[n]=c[n]})}};exports.interceptConsoleLogs=f;
2
+ //# sourceMappingURL=console-intercept-CL_BfKQo.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"console-intercept-CL_BfKQo.cjs","sources":["../src/console-intercept.ts"],"sourcesContent":["import type { ConsoleInterceptOptions, Logger } from './types';\n\nconst consoleMethods = ['log', 'info', 'warn', 'error'] as const;\ntype ConsoleMethod = (typeof consoleMethods)[number];\n\nconst serializeConsoleValue = (value: unknown) => {\n if (typeof value === 'string') return value;\n if (value instanceof Error)\n return value.stack || value.message || value.toString();\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n};\n\nexport const interceptConsoleLogs = (\n logger: Logger,\n options: ConsoleInterceptOptions = {}\n) => {\n const { defaults = {} } = options;\n\n const originals: Record<ConsoleMethod, (...args: any[]) => void> = {\n log: console.log.bind(console),\n info: console.info.bind(console),\n warn: console.warn.bind(console),\n error: console.error.bind(console),\n };\n\n consoleMethods.forEach((method) => {\n console[method] = (...args: any[]) => {\n const level: LogLevel =\n method === 'warn'\n ? 'warn'\n : method === 'error'\n ? 'error'\n : 'info';\n\n const message = args.map(serializeConsoleValue).join(' ');\n void logger.log({ message, level, ...defaults });\n };\n });\n\n return () => {\n consoleMethods.forEach((method) => {\n console[method] = originals[method];\n });\n };\n};\n"],"names":["consoleMethods","serializeConsoleValue","value","interceptConsoleLogs","logger","options","defaults","originals","method","args","level","message"],"mappings":"aAEA,MAAMA,EAAiB,CAAC,MAAO,OAAQ,OAAQ,OAAO,EAGhDC,EAAyBC,GAAmB,CAC9C,GAAI,OAAOA,GAAU,SAAU,OAAOA,EACtC,GAAIA,aAAiB,MACjB,OAAOA,EAAM,OAASA,EAAM,SAAWA,EAAM,SAAA,EACjD,GAAI,CACA,OAAO,KAAK,UAAUA,CAAK,CAC/B,MAAQ,CACJ,OAAO,OAAOA,CAAK,CACvB,CACJ,EAEaC,EAAuB,CAChCC,EACAC,EAAmC,KAClC,CACD,KAAM,CAAE,SAAAC,EAAW,CAAA,CAAC,EAAMD,EAEpBE,EAA6D,CAC/D,IAAK,QAAQ,IAAI,KAAK,OAAO,EAC7B,KAAM,QAAQ,KAAK,KAAK,OAAO,EAC/B,KAAM,QAAQ,KAAK,KAAK,OAAO,EAC/B,MAAO,QAAQ,MAAM,KAAK,OAAO,CAAA,EAGrC,OAAAP,EAAe,QAASQ,GAAW,CAC/B,QAAQA,CAAM,EAAI,IAAIC,IAAgB,CAClC,MAAMC,EACFF,IAAW,OACL,OACAA,IAAW,QACT,QACA,OAENG,EAAUF,EAAK,IAAIR,CAAqB,EAAE,KAAK,GAAG,EACnDG,EAAO,IAAI,CAAE,QAAAO,EAAS,MAAAD,EAAO,GAAGJ,EAAU,CACnD,CACJ,CAAC,EAEM,IAAM,CACTN,EAAe,QAASQ,GAAW,CAC/B,QAAQA,CAAM,EAAID,EAAUC,CAAM,CACtC,CAAC,CACL,CACJ"}
@@ -0,0 +1,4 @@
1
+ import { ConsoleInterceptOptions, Logger } from './types';
2
+
3
+ export declare const interceptConsoleLogs: (logger: Logger, options?: ConsoleInterceptOptions) => () => void;
4
+ //# sourceMappingURL=console-intercept.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"console-intercept.d.ts","sourceRoot":"","sources":["../src/console-intercept.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAgB/D,eAAO,MAAM,oBAAoB,GAC7B,QAAQ,MAAM,EACd,UAAS,uBAA4B,eA8BxC,CAAC"}
package/dist/index.cjs.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./client.cjs.js"),r=require("./server.cjs.js");exports.clientError=e.error;exports.clientInfo=e.info;exports.clientLog=e.log;exports.clientWarn=e.warn;exports.createClientLogger=e.createClientLogger;exports.initClientLogger=e.init;exports.createServerLogger=r.createServerLogger;exports.initServerLogger=r.init;exports.serverError=r.error;exports.serverInfo=r.info;exports.serverLog=r.log;exports.serverWarn=r.warn;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("./client.cjs.js"),e=require("./server.cjs.js");require("tim-types");const o=require("./console-intercept-CL_BfKQo.cjs");exports.clientError=r.error;exports.clientInfo=r.info;exports.clientLog=r.log;exports.clientWarn=r.warn;exports.createClientLogger=r.createClientLogger;exports.initClientLogger=r.init;exports.createServerLogger=e.createServerLogger;exports.initServerLogger=e.init;exports.registerCrashHandlers=e.registerCrashHandlers;exports.serverError=e.error;exports.serverInfo=e.info;exports.serverLog=e.log;exports.serverWarn=e.warn;exports.interceptClientConsoleLogs=o.interceptConsoleLogs;exports.interceptServerConsoleLogs=o.interceptConsoleLogs;
2
2
  //# sourceMappingURL=index.cjs.js.map
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { error as clientError, info as clientInfo, log as clientLog, warn as clientWarn, createClientLogger, init as initClientLogger, } from './client';
2
- export { createServerLogger, init as initServerLogger, error as serverError, info as serverInfo, log as serverLog, warn as serverWarn, } from './server';
1
+ export { error as clientError, info as clientInfo, log as clientLog, warn as clientWarn, createClientLogger, init as initClientLogger, interceptConsoleLogs as interceptClientConsoleLogs, } from './client';
2
+ export { createServerLogger, init as initServerLogger, interceptConsoleLogs as interceptServerConsoleLogs, registerCrashHandlers, error as serverError, info as serverInfo, log as serverLog, warn as serverWarn, } from './server';
3
3
  export * from './types';
4
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,KAAK,IAAI,WAAW,EACpB,IAAI,IAAI,UAAU,EAClB,GAAG,IAAI,SAAS,EAChB,IAAI,IAAI,UAAU,EAClB,kBAAkB,EAClB,IAAI,IAAI,gBAAgB,GAC3B,MAAM,UAAU,CAAC;AAClB,OAAO,EACH,kBAAkB,EAClB,IAAI,IAAI,gBAAgB,EACxB,KAAK,IAAI,WAAW,EACpB,IAAI,IAAI,UAAU,EAClB,GAAG,IAAI,SAAS,EAChB,IAAI,IAAI,UAAU,GACrB,MAAM,UAAU,CAAC;AAClB,cAAc,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,KAAK,IAAI,WAAW,EACpB,IAAI,IAAI,UAAU,EAClB,GAAG,IAAI,SAAS,EAChB,IAAI,IAAI,UAAU,EAClB,kBAAkB,EAClB,IAAI,IAAI,gBAAgB,EACxB,oBAAoB,IAAI,0BAA0B,GACrD,MAAM,UAAU,CAAC;AAClB,OAAO,EACH,kBAAkB,EAClB,IAAI,IAAI,gBAAgB,EACxB,oBAAoB,IAAI,0BAA0B,EAClD,qBAAqB,EACrB,KAAK,IAAI,WAAW,EACpB,IAAI,IAAI,UAAU,EAClB,GAAG,IAAI,SAAS,EAChB,IAAI,IAAI,UAAU,GACrB,MAAM,UAAU,CAAC;AAClB,cAAc,SAAS,CAAC"}
package/dist/index.es.js CHANGED
@@ -1,17 +1,22 @@
1
- import { error as o, info as n, log as a, warn as i, createClientLogger as s, init as t } from "./client.es.js";
2
- import { createServerLogger as l, init as c, error as f, info as v, log as L, warn as m } from "./server.es.js";
1
+ import { error as n, info as i, log as s, warn as t, createClientLogger as a, init as g } from "./client.es.js";
2
+ import { createServerLogger as c, init as L, registerCrashHandlers as f, error as v, info as p, log as C, warn as m } from "./server.es.js";
3
+ import "tim-types";
4
+ import { i as S, i as w } from "./console-intercept-ByhsZ0kO.js";
3
5
  export {
4
- o as clientError,
5
- n as clientInfo,
6
- a as clientLog,
7
- i as clientWarn,
8
- s as createClientLogger,
9
- l as createServerLogger,
10
- t as initClientLogger,
11
- c as initServerLogger,
12
- f as serverError,
13
- v as serverInfo,
14
- L as serverLog,
6
+ n as clientError,
7
+ i as clientInfo,
8
+ s as clientLog,
9
+ t as clientWarn,
10
+ a as createClientLogger,
11
+ c as createServerLogger,
12
+ g as initClientLogger,
13
+ L as initServerLogger,
14
+ S as interceptClientConsoleLogs,
15
+ w as interceptServerConsoleLogs,
16
+ f as registerCrashHandlers,
17
+ v as serverError,
18
+ p as serverInfo,
19
+ C as serverLog,
15
20
  m as serverWarn
16
21
  };
17
22
  //# sourceMappingURL=index.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
1
+ {"version":3,"file":"index.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -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,3 +1,4 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const d=require("kleur"),i=require("winston"),g={},C=i.format.combine(i.format.timestamp({format:()=>new Date().toISOString()}),i.format.printf(o=>{const t=o.logEvent??{},s=o.timestamp??new Date().toISOString(),n=String(t.source??"LOG"),e=String(t.message??o.message??""),c=t.data??{},r=c&&typeof c=="object"&&Object.keys(c).length?` | ${JSON.stringify(c)}`:"";return`[${s}] ${n.padStart(12)}: ${e}${r}`})),k=["console"],j=(o,t,s,n)=>typeof o=="string"?{message:o,level:t,source:s,data:n}:{...o,level:o.level??t,source:o.source??s,data:o.data??n},P=o=>{if(!o)return"";try{return JSON.stringify(o)}catch{return"[unserializable data]"}},R=i.format.combine(i.format.timestamp(),i.format.errors({stack:!0}),i.format.colorize({all:!0}),i.format.printf(o=>{const{timestamp:t,level:s="info",message:n="",stack:e,logEvent:c}=o,r=c??{},u=r.source??"LOG",p=r.verb??s?.toUpperCase?.()??"LOG",w=[r.machineId,r.sessionId].filter(Boolean),$=w.length?d.gray(` [${w.join(" ")}]`):"",a=r.data?d.gray(` ${P(r.data)}`):"",l=typeof r.duration=="number"?d.yellow(` ${r.duration}ms`):"",m=`${t} ${d.bold(`[${u}]`)} ${d.cyan(p)} ${n}${l}${$}${a}`;return e?`${m}
2
- ${e}`:m})),y=(o={})=>{const t=o.transports?.length?o.transports:k;let s=!1;const n=[];t.includes("console")&&n.push(new i.transports.Console({format:R}));const e=o.fsPath??"log.txt";t.includes("fs")&&n.push(new i.transports.File({filename:e,options:{flags:"a"},format:C}));const c=i.createLogger({level:"info",transports:n.length?n:[new i.transports.Console]}),r=async(a,l)=>{const m=j(a,"info",o.source,l),S=m.level??"info",h={...m,level:S,timestamp:m.timestamp??Date.now()};c.log({level:S,message:h.message,logEvent:h}),t.includes("custom")&&(o.addLog?await Promise.resolve(o.addLog(h)):s||(s=!0,console.warn("[tim-logger] Custom transport requested without addLog handler.")))},u=async(a,l)=>r({message:a,level:"info",data:l,source:o.source}),p=async(a,l)=>r({message:a,level:"warn",data:l,source:o.source});return{log:r,info:u,warn:p,error:async(a,l)=>r({message:a,level:"error",data:l,source:o.source}),clearLogs:async()=>{if(t.includes("fs"))try{await g.mkdir(g.dirname(e),{recursive:!0}).catch(()=>{}),await g.writeFile(e,"",{flag:"a"}),await g.truncate(e,0),await u("🧹 Logs cleared",{fsPath:e})}catch(a){const l=a instanceof Error?a.message:g.format("%o",a);await p("Failed to clear logs",{fsPath:e,error:l})}}}};let f=y();const x=(o={})=>(f=y(o),f),F=(o,t)=>f.log(o,t),O=(o,t)=>f.info(o,t),D=(o,t)=>f.warn(o,t),L=(o,t)=>f.error(o,t),T=()=>f.clearLogs?.()??Promise.resolve(),b=["log","info","warn","error"],z=o=>{if(typeof o=="string")return o;if(o instanceof Error)return o.stack||o.message||o.toString();try{return JSON.stringify(o)}catch{return String(o)}},I=(o,t={})=>{const{defaults:s={}}=t,n={log:console.log.bind(console),info:console.info.bind(console),warn:console.warn.bind(console),error:console.error.bind(console)};return b.forEach(e=>{console[e]=(...c)=>{const r=e==="warn"?"warn":e==="error"?"error":"info",u=c.map(z).join(" ");o.log({message:u,level:r,...s})}}),()=>{b.forEach(e=>{console[e]=n[e]})}};let v=!1;function E(o,t){const s=t instanceof Error?t.stack||t.message:g.format("%o",t);L(`❌ ${o}: ${s}`)}function N({onCrash:o}={}){if(v)return;v=!0;const t=s=>n=>{if(E(s,n),typeof o=="function")try{o(n)}catch(e){const c=e instanceof Error?e.stack||e.message:g.format("%o",e);L(`❌ Crash handler failed: ${c}`)}};process.on("uncaughtException",t("Uncaught Exception")),process.on("unhandledRejection",t("Unhandled Rejection"))}exports.clearLogs=T;exports.createServerLogger=y;exports.error=L;exports.info=O;exports.init=x;exports.interceptConsoleLogs=I;exports.log=F;exports.logCrash=E;exports.registerCrashHandlers=N;exports.warn=D;
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;
3
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,\n transports,\n} from 'winston';\nimport type TransportStream from 'winston-transport';\nimport type {\n ConsoleInterceptOptions,\n Logger,\n ServerLoggerConfig,\n ServerTransport,\n} from './types';\n\ntype FileInfo = TransformableInfo & {\n logEvent?: Partial<LogEvent>;\n};\n\nconst fileLineFormat = format.combine(\n format.timestamp({ format: () => new Date().toISOString() }),\n format.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 = format.combine(\n format.timestamp(),\n format.errors({ stack: true }),\n format.colorize({ all: true }),\n format.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 fsPath = config.fsPath ?? 'log.txt';\n\n if (transportsArr.includes('fs')) {\n winstonTransports.push(\n new transports.File({\n filename: fsPath,\n options: { flags: 'a' },\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(fsPath), {\n recursive: true,\n })\n .catch(() => {});\n await fs.writeFile(fsPath, '', { flag: 'a' }); // touch\n await fs.truncate(fsPath, 0);\n await info('🧹 Logs cleared', { fsPath });\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', { fsPath, error: msg });\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();\n\nconst consoleMethods = ['log', 'info', 'warn', 'error'] as const;\ntype ConsoleMethod = (typeof consoleMethods)[number];\n\nconst serializeConsoleValue = (value: unknown) => {\n if (typeof value === 'string') return value;\n if (value instanceof Error)\n return value.stack || value.message || value.toString();\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n};\n\nexport const interceptConsoleLogs = (\n logger: Logger,\n options: ConsoleInterceptOptions = {}\n) => {\n const { defaults = {} } = options;\n\n const originals: Record<ConsoleMethod, (...args: any[]) => void> = {\n log: console.log.bind(console),\n info: console.info.bind(console),\n warn: console.warn.bind(console),\n error: console.error.bind(console),\n };\n\n consoleMethods.forEach((method) => {\n console[method] = (...args: any[]) => {\n const level: LogLevel =\n method === 'warn'\n ? 'warn'\n : method === 'error'\n ? 'error'\n : 'info';\n\n const message = args.map(serializeConsoleValue).join(' ');\n void logger.log({ message, level, ...defaults });\n };\n });\n\n return () => {\n consoleMethods.forEach((method) => {\n console[method] = originals[method];\n });\n };\n};\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","fileLineFormat","format","info","entry","timestamp","name","text","data","dataString","DEFAULT_SERVER_TRANSPORTS","normalizeEvent","eventOrMessage","level","source","stringifyData","consoleFormat","message","stack","logEvent","verb","contextParts","ctx","kleur","duration","base","createServerLogger","config","transportsArr","warnedMissingCustom","winstonTransports","transports","fsPath","baseLogger","createWinstonLogger","log","event","resolvedLevel","payload","warn","fs","path","err","msg","clearLogs","defaultLogger","init","error","consoleMethods","serializeConsoleValue","value","interceptConsoleLogs","logger","options","defaults","originals","method","args","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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"}
package/dist/server.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { ConsoleInterceptOptions, Logger, ServerLoggerConfig } from './types';
1
+ import { Logger, ServerLoggerConfig } from './types';
2
2
 
3
3
  export declare const createServerLogger: (config?: ServerLoggerConfig) => Logger;
4
4
  export declare const init: (config?: ServerLoggerConfig) => Logger;
@@ -7,7 +7,7 @@ export declare const info: (message: string, data?: Json) => Promise<void>;
7
7
  export declare const warn: (message: string, data?: Json) => Promise<void>;
8
8
  export declare const error: (message: string, data?: Json) => Promise<void>;
9
9
  export declare const clearLogs: () => Promise<void>;
10
- export declare const interceptConsoleLogs: (logger: Logger, options?: ConsoleInterceptOptions) => () => void;
10
+ export { interceptConsoleLogs } from './console-intercept';
11
11
  export declare function logCrash(type: string, err: unknown): void;
12
12
  export declare function registerCrashHandlers({ onCrash, }?: {
13
13
  onCrash?: (err: unknown) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EACR,uBAAuB,EACvB,MAAM,EACN,kBAAkB,EAErB,MAAM,SAAS,CAAC;AAsGjB,eAAO,MAAM,kBAAkB,GAAI,SAAQ,kBAAuB,KAAG,MAsHpE,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;AAgBhF,eAAO,MAAM,oBAAoB,GAC7B,QAAQ,MAAM,EACd,UAAS,uBAA4B,eA8BxC,CAAC;AAKF,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,166 +1,185 @@
1
- import d from "kleur";
2
- import { format as l, transports as y, createLogger as C } from "winston";
3
- const g = {}, k = l.combine(
4
- l.timestamp({ format: () => (/* @__PURE__ */ new Date()).toISOString() }),
5
- l.printf((o) => {
6
- const t = o.logEvent ?? {}, s = o.timestamp ?? (/* @__PURE__ */ new Date()).toISOString(), n = String(t.source ?? "LOG"), e = String(t.message ?? o.message ?? ""), c = t.data ?? {}, r = c && typeof c == "object" && Object.keys(c).length ? ` | ${JSON.stringify(c)}` : "";
7
- return `[${s}] ${n.padStart(12)}: ${e}${r}`;
1
+ import f from "kleur";
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
+ if (!t || typeof t != "object") return;
7
+ const e = t.logPath;
8
+ return typeof e == "string" && e.length ? e : void 0;
9
+ };
10
+ class R extends D {
11
+ defaultLogPath;
12
+ ensuredDirs = /* @__PURE__ */ new Set();
13
+ constructor({
14
+ defaultLogPath: e,
15
+ format: o
16
+ }) {
17
+ super({ format: o }), this.defaultLogPath = e;
18
+ }
19
+ log(e, o) {
20
+ setImmediate(() => this.emit("logged", e));
21
+ const s = F(e.logEvent?.data) ?? this.defaultLogPath;
22
+ if (!s) {
23
+ o();
24
+ return;
25
+ }
26
+ (async () => {
27
+ const n = (void 0)(s);
28
+ this.ensuredDirs.has(n) || (this.ensuredDirs.add(n), await l.mkdir(n, { recursive: !0 }).catch(() => {
29
+ }));
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
+ `);
33
+ })().catch((n) => {
34
+ const r = n instanceof Error ? n.message : l.format("%o", n);
35
+ console.warn("[tim-logger] Failed to write log file", {
36
+ logPath: s,
37
+ error: r
38
+ });
39
+ }).finally(o);
40
+ }
41
+ }
42
+ const j = m.combine(
43
+ m.timestamp({ format: () => (/* @__PURE__ */ new Date()).toISOString() }),
44
+ m.printf((t) => {
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}`;
8
47
  })
9
- ), x = ["console"], R = (o, t, s, n) => typeof o == "string" ? { message: o, level: t, source: s, data: n } : {
10
- ...o,
11
- level: o.level ?? t,
12
- source: o.source ?? s,
13
- data: o.data ?? n
14
- }, j = (o) => {
15
- if (!o) return "";
48
+ ), k = ["console"], O = (t, e, o, s) => typeof t == "string" ? { message: t, level: e, source: o, data: s } : {
49
+ ...t,
50
+ level: t.level ?? e,
51
+ source: t.source ?? o,
52
+ data: t.data ?? s
53
+ }, T = (t) => {
54
+ if (!t) return "";
16
55
  try {
17
- return JSON.stringify(o);
56
+ return JSON.stringify(t);
18
57
  } catch {
19
58
  return "[unserializable data]";
20
59
  }
21
- }, F = l.combine(
22
- l.timestamp(),
23
- l.errors({ stack: !0 }),
24
- l.colorize({ all: !0 }),
25
- l.printf((o) => {
60
+ }, I = m.combine(
61
+ m.timestamp(),
62
+ m.errors({ stack: !0 }),
63
+ m.colorize({ all: !0 }),
64
+ m.printf((t) => {
26
65
  const {
27
- timestamp: t,
28
- level: s = "info",
29
- message: n = "",
30
- stack: e,
31
- logEvent: c
32
- } = o, r = c ?? {}, m = r.source ?? "LOG", p = r.verb ?? s?.toUpperCase?.() ?? "LOG", w = [r.machineId, r.sessionId].filter(Boolean), $ = w.length ? d.gray(` [${w.join(" ")}]`) : "", a = r.data ? d.gray(` ${j(r.data)}`) : "", i = typeof r.duration == "number" ? d.yellow(` ${r.duration}ms`) : "", u = `${t} ${d.bold(`[${m}]`)} ${d.cyan(
33
- p
34
- )} ${n}${i}${$}${a}`;
35
- return e ? `${u}
36
- ${e}` : u;
66
+ timestamp: e,
67
+ level: o = "info",
68
+ message: s = "",
69
+ stack: a,
70
+ logEvent: n
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
+ h
73
+ )} ${s}${i}${L}${c}`;
74
+ return a ? `${d}
75
+ ${a}` : d;
37
76
  })
38
- ), b = (o = {}) => {
39
- const t = o.transports?.length ? o.transports : x;
40
- let s = !1;
41
- const n = [];
42
- t.includes("console") && n.push(
43
- new y.Console({
44
- format: F
77
+ ), E = (t = {}) => {
78
+ const e = t.transports?.length ? t.transports : k;
79
+ let o = !1;
80
+ const s = [];
81
+ e.includes("console") && s.push(
82
+ new $.Console({
83
+ format: I
45
84
  })
46
85
  );
47
- const e = o.fsPath ?? "log.txt";
48
- t.includes("fs") && n.push(
49
- new y.File({
50
- filename: e,
51
- options: { flags: "a" },
52
- format: k
86
+ const a = t.logPath ?? t.fsPath ?? "log.txt";
87
+ e.includes("fs") && s.push(
88
+ new R({
89
+ defaultLogPath: a,
90
+ format: j
53
91
  })
54
92
  );
55
- const c = C({
93
+ const n = b({
56
94
  level: "info",
57
- transports: n.length ? n : [new y.Console()]
58
- }), r = async (a, i) => {
59
- const u = R(
60
- a,
95
+ transports: s.length ? s : [new $.Console()]
96
+ }), r = async (c, i) => {
97
+ const d = O(
98
+ c,
61
99
  "info",
62
- o.source,
100
+ t.source,
63
101
  i
64
- ), L = u.level ?? "info", h = {
65
- ...u,
66
- level: L,
67
- timestamp: u.timestamp ?? Date.now()
102
+ ), v = d.level ?? "info", w = {
103
+ ...d,
104
+ level: v,
105
+ timestamp: d.timestamp ?? Date.now()
68
106
  };
69
- c.log({
70
- level: L,
71
- message: h.message,
72
- logEvent: h
73
- }), t.includes("custom") && (o.addLog ? await Promise.resolve(o.addLog(h)) : s || (s = !0, console.warn(
74
- "[tim-logger] Custom transport requested without addLog handler."
75
- )));
76
- }, m = async (a, i) => r({
77
- message: a,
107
+ if (n.log({
108
+ level: v,
109
+ message: w.message,
110
+ logEvent: w
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({
119
+ message: c,
78
120
  level: "info",
79
121
  data: i,
80
- source: o.source
81
- }), p = async (a, i) => r({
82
- message: a,
122
+ source: t.source
123
+ }), h = async (c, i) => r({
124
+ message: c,
83
125
  level: "warn",
84
126
  data: i,
85
- source: o.source
127
+ source: t.source
86
128
  });
87
- return { log: r, info: m, warn: p, error: async (a, i) => r({
88
- message: a,
129
+ return { log: r, info: u, warn: h, error: async (c, i) => r({
130
+ message: c,
89
131
  level: "error",
90
132
  data: i,
91
- source: o.source
133
+ source: t.source
92
134
  }), clearLogs: async () => {
93
- if (t.includes("fs"))
135
+ if (e.includes("fs"))
94
136
  try {
95
- await g.mkdir(g.dirname(e), {
137
+ await l.mkdir((void 0)(a), {
96
138
  recursive: !0
97
139
  }).catch(() => {
98
- }), await g.writeFile(e, "", { flag: "a" }), await g.truncate(e, 0), await m("🧹 Logs cleared", { fsPath: e });
99
- } catch (a) {
100
- const i = a instanceof Error ? a.message : g.format("%o", a);
101
- await p("Failed to clear logs", { fsPath: e, error: i });
140
+ }), await l.writeFile(a, "", { flag: "a" }), await l.truncate(a, 0), await u("🧹 Logs cleared", { logPath: a });
141
+ } catch (c) {
142
+ const i = c instanceof Error ? c.message : l.format("%o", c);
143
+ await h("Failed to clear logs", {
144
+ logPath: a,
145
+ error: i
146
+ });
102
147
  }
103
148
  } };
104
149
  };
105
- let f = b();
106
- const I = (o = {}) => (f = b(o), f), N = (o, t) => f.log(o, t), T = (o, t) => f.info(o, t), U = (o, t) => f.warn(o, t), v = (o, t) => f.error(o, t), A = () => f.clearLogs?.() ?? Promise.resolve(), S = ["log", "info", "warn", "error"], P = (o) => {
107
- if (typeof o == "string") return o;
108
- if (o instanceof Error)
109
- return o.stack || o.message || o.toString();
110
- try {
111
- return JSON.stringify(o);
112
- } catch {
113
- return String(o);
114
- }
115
- }, G = (o, t = {}) => {
116
- const { defaults: s = {} } = t, n = {
117
- log: console.log.bind(console),
118
- info: console.info.bind(console),
119
- warn: console.warn.bind(console),
120
- error: console.error.bind(console)
121
- };
122
- return S.forEach((e) => {
123
- console[e] = (...c) => {
124
- const r = e === "warn" ? "warn" : e === "error" ? "error" : "info", m = c.map(P).join(" ");
125
- o.log({ message: m, level: r, ...s });
126
- };
127
- }), () => {
128
- S.forEach((e) => {
129
- console[e] = n[e];
130
- });
131
- };
132
- };
133
- let E = !1;
134
- function D(o, t) {
135
- const s = t instanceof Error ? t.stack || t.message : g.format("%o", t);
136
- v(`❌ ${o}: ${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}`);
137
156
  }
138
- function J({
139
- onCrash: o
157
+ function B({
158
+ onCrash: t
140
159
  } = {}) {
141
- if (E) return;
142
- E = !0;
143
- const t = (s) => (n) => {
144
- if (D(s, n), typeof o == "function")
160
+ if (S) return;
161
+ S = !0;
162
+ const e = (o) => (s) => {
163
+ if (A(o, s), typeof t == "function")
145
164
  try {
146
- o(n);
147
- } catch (e) {
148
- const c = e instanceof Error ? e.stack || e.message : g.format("%o", e);
149
- v(`❌ Crash handler failed: ${c}`);
165
+ t(s);
166
+ } catch (a) {
167
+ const n = a instanceof Error ? a.stack || a.message : l.format("%o", a);
168
+ P(`❌ Crash handler failed: ${n}`);
150
169
  }
151
170
  };
152
- process.on("uncaughtException", t("Uncaught Exception")), process.on("unhandledRejection", t("Unhandled Rejection"));
171
+ process.on("uncaughtException", e("Uncaught Exception")), process.on("unhandledRejection", e("Unhandled Rejection"));
153
172
  }
154
173
  export {
155
- A as clearLogs,
156
- b as createServerLogger,
157
- v as error,
158
- T as info,
159
- I as init,
160
- G as interceptConsoleLogs,
161
- N as log,
162
- D as logCrash,
163
- J as registerCrashHandlers,
164
- U 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
165
184
  };
166
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,\n transports,\n} from 'winston';\nimport type TransportStream from 'winston-transport';\nimport type {\n ConsoleInterceptOptions,\n Logger,\n ServerLoggerConfig,\n ServerTransport,\n} from './types';\n\ntype FileInfo = TransformableInfo & {\n logEvent?: Partial<LogEvent>;\n};\n\nconst fileLineFormat = format.combine(\n format.timestamp({ format: () => new Date().toISOString() }),\n format.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 = format.combine(\n format.timestamp(),\n format.errors({ stack: true }),\n format.colorize({ all: true }),\n format.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 fsPath = config.fsPath ?? 'log.txt';\n\n if (transportsArr.includes('fs')) {\n winstonTransports.push(\n new transports.File({\n filename: fsPath,\n options: { flags: 'a' },\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(fsPath), {\n recursive: true,\n })\n .catch(() => {});\n await fs.writeFile(fsPath, '', { flag: 'a' }); // touch\n await fs.truncate(fsPath, 0);\n await info('🧹 Logs cleared', { fsPath });\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', { fsPath, error: msg });\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();\n\nconst consoleMethods = ['log', 'info', 'warn', 'error'] as const;\ntype ConsoleMethod = (typeof consoleMethods)[number];\n\nconst serializeConsoleValue = (value: unknown) => {\n if (typeof value === 'string') return value;\n if (value instanceof Error)\n return value.stack || value.message || value.toString();\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n};\n\nexport const interceptConsoleLogs = (\n logger: Logger,\n options: ConsoleInterceptOptions = {}\n) => {\n const { defaults = {} } = options;\n\n const originals: Record<ConsoleMethod, (...args: any[]) => void> = {\n log: console.log.bind(console),\n info: console.info.bind(console),\n warn: console.warn.bind(console),\n error: console.error.bind(console),\n };\n\n consoleMethods.forEach((method) => {\n console[method] = (...args: any[]) => {\n const level: LogLevel =\n method === 'warn'\n ? 'warn'\n : method === 'error'\n ? 'error'\n : 'info';\n\n const message = args.map(serializeConsoleValue).join(' ');\n void logger.log({ message, level, ...defaults });\n };\n });\n\n return () => {\n consoleMethods.forEach((method) => {\n console[method] = originals[method];\n });\n };\n};\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","fileLineFormat","format","info","entry","timestamp","name","text","data","dataString","DEFAULT_SERVER_TRANSPORTS","normalizeEvent","eventOrMessage","level","source","stringifyData","consoleFormat","message","stack","logEvent","verb","contextParts","ctx","kleur","duration","base","createServerLogger","config","transportsArr","warnedMissingCustom","winstonTransports","transports","fsPath","baseLogger","createWinstonLogger","log","event","resolvedLevel","payload","warn","fs","path","err","msg","clearLogs","defaultLogger","init","error","consoleMethods","serializeConsoleValue","value","interceptConsoleLogs","logger","options","defaults","originals","method","args","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/dist/types.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+
1
2
  export type ConsoleInterceptOptions = {
2
3
  defaults?: Partial<LogEvent>;
3
4
  };
@@ -13,6 +14,7 @@ export type ClientLoggerConfig = BaseLoggerConfig & {
13
14
  };
14
15
  export type ServerLoggerConfig = BaseLoggerConfig & {
15
16
  transports?: ServerTransport[];
17
+ logPath?: string;
16
18
  fsPath?: string;
17
19
  };
18
20
  export type Logger = {
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,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,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;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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tim-logger",
3
- "version": "0.0.22",
3
+ "version": "0.0.25",
4
4
  "type": "module",
5
5
  "private": false,
6
6
  "scripts": {