tim-logger 0.0.21 → 0.0.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client.cjs.js.map +1 -1
- package/dist/client.d.ts +1 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.es.js.map +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/server.cjs.js +2 -2
- package/dist/server.cjs.js.map +1 -1
- package/dist/server.d.ts +6 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.es.js +106 -74
- package/dist/server.es.js.map +1 -1
- package/dist/types.d.ts +1 -14
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -1
package/dist/client.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.cjs.js","sources":["../src/client.ts"],"sourcesContent":["import type {\n ClientLoggerConfig,\n ClientTransport,\n Json,\n
|
|
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"}
|
package/dist/client.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ClientLoggerConfig, Json,
|
|
1
|
+
import { ClientLoggerConfig, Json, Logger } from './types';
|
|
2
2
|
|
|
3
3
|
export declare const createClientLogger: (config?: ClientLoggerConfig) => Logger;
|
|
4
4
|
export declare const init: (config?: ClientLoggerConfig) => Logger;
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,kBAAkB,EAElB,IAAI,EACJ,
|
|
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"}
|
package/dist/client.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.es.js","sources":["../src/client.ts"],"sourcesContent":["import type {\n ClientLoggerConfig,\n ClientTransport,\n Json,\n
|
|
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;"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
export { error as clientError, info as clientInfo, log as clientLog, warn as clientWarn, createClientLogger, init as initClientLogger, } from './client';
|
|
2
2
|
export { createServerLogger, init as initServerLogger, error as serverError, info as serverInfo, log as serverLog, warn as serverWarn, } from './server';
|
|
3
3
|
export * from './types';
|
|
4
|
-
export type { LogEvent } from './types';
|
|
5
4
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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,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"}
|
package/dist/server.cjs.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const
|
|
2
|
-
${e}`:
|
|
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;
|
|
3
3
|
//# sourceMappingURL=server.cjs.js.map
|
package/dist/server.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.cjs.js","sources":["../src/server.ts"],"sourcesContent":["import kleur from 'kleur';\nimport type { TransformableInfo } from 'logform';\nimport {\n createLogger as createWinstonLogger,\n format,\n transports,\n} from 'winston';\nimport type TransportStream from 'winston-transport';\nimport type {\n ConsoleInterceptOptions,\n Json,\n LogEvent,\n LogLevel,\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 const timestamp = new Date().toISOString();\n\n // \"name\" in your desired output = source (fallback to LOG)\n const name = String(entry.source ?? 'LOG');\n\n // \"text\" in your desired output = message\n const text = String(entry.message ?? info.message ?? '');\n\n // \"data\" in your desired output = entry.data (fallback {})\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);\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 {\n message: eventOrMessage,\n level,\n source,\n data,\n } 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\n// renamed to avoid clashing with winston's createLogger\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 if (transportsArr.includes('fs')) {\n // Winston's types allow `options?: object` on File transport. :contentReference[oaicite:2]{index=2}\n winstonTransports.push(\n new transports.File({\n filename: config.fsPath ?? 'log.txt',\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 return { log, info, warn, error };\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);\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":["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","baseLogger","createWinstonLogger","log","event","resolvedLevel","payload","error","defaultLogger","init","warn","consoleMethods","serializeConsoleValue","value","interceptConsoleLogs","logger","options","defaults","originals","method","args"],"mappings":"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"}
|
|
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":"8HAAAA,EAAe,CAAA,ECsBTC,EAAiBC,EAAAA,OAAO,QAC1BA,SAAO,UAAU,CAAE,OAAQ,QAAU,KAAA,EAAO,YAAA,EAAe,EAC3DA,SAAO,OAAQC,GAAmB,CAC9B,MAAMC,EAAQD,EAAK,UAAY,CAAA,EAGzBE,EACDF,EAAK,WAAwB,IAAI,KAAA,EAAO,YAAA,EAEvCG,EAAO,OAAOF,EAAM,QAAU,KAAK,EACnCG,EAAO,OAAOH,EAAM,SAAWD,EAAK,SAAW,EAAE,EAEjDK,EAAQJ,EAAM,MAAQ,CAAA,EACtBK,EACFD,GAAQ,OAAOA,GAAS,UAAY,OAAO,KAAKA,CAAI,EAAE,OAChD,MAAM,KAAK,UAAUA,CAAI,CAAC,GAC1B,GAEV,MAAO,IAAIH,CAAS,KAAKC,EAAK,SAAS,EAAE,CAAC,KAAKC,CAAI,GAAGE,CAAU,EACpE,CAAC,CACL,EAEMC,EAA+C,CAAC,SAAS,EAQzDC,EAAiB,CACnBC,EACAC,EACAC,EACAN,IAEI,OAAOI,GAAmB,SACnB,CAAE,QAASA,EAAgB,MAAAC,EAAO,OAAAC,EAAQ,KAAAN,CAAA,EAG9C,CACH,GAAGI,EACH,MAAOA,EAAe,OAASC,EAC/B,OAAQD,EAAe,QAAUE,EACjC,KAAMF,EAAe,MAAQJ,CAAA,EAI/BO,EAAiBP,GAAgB,CACnC,GAAI,CAACA,EAAM,MAAO,GAClB,GAAI,CACA,OAAO,KAAK,UAAUA,CAAI,CAC9B,MAAQ,CACJ,MAAO,uBACX,CACJ,EAEMQ,EAAgBd,EAAAA,OAAO,QACzBA,EAAAA,OAAO,UAAA,EACPA,EAAAA,OAAO,OAAO,CAAE,MAAO,GAAM,EAC7BA,EAAAA,OAAO,SAAS,CAAE,IAAK,GAAM,EAC7BA,SAAO,OAAQC,GAAsB,CACjC,KAAM,CACF,UAAAE,EACA,MAAAQ,EAAQ,OACR,QAAAI,EAAU,GACV,MAAAC,EACA,SAAAC,CAAA,EACAhB,EAEEC,EAA2Be,GAAY,CAAA,EACvCL,EAASV,EAAM,QAAU,MACzBgB,EAAOhB,EAAM,MAAQS,GAAO,iBAAmB,MAE/CQ,EAAe,CAACjB,EAAM,UAAWA,EAAM,SAAS,EAAE,OAAO,OAAO,EAChEkB,EAAMD,EAAa,OACnBE,EAAM,KAAK,KAAKF,EAAa,KAAK,GAAG,CAAC,GAAG,EACzC,GAEAb,EAAOJ,EAAM,KACbmB,EAAM,KAAK,IAAIR,EAAcX,EAAM,IAAI,CAAC,EAAE,EAC1C,GAEAoB,EACF,OAAOpB,EAAM,UAAa,SACpBmB,EAAM,OAAO,IAAInB,EAAM,QAAQ,IAAI,EACnC,GAEJqB,EAAO,GAAGpB,CAAS,IAAIkB,EAAM,KAAK,IAAIT,CAAM,GAAG,CAAC,IAAIS,EAAM,KAC5DH,CAAA,CACH,IAAIH,CAAO,GAAGO,CAAQ,GAAGF,CAAG,GAAGd,CAAI,GAEpC,OAAOU,EAAQ,GAAGO,CAAI;AAAA,EAAKP,CAAK,GAAKO,CACzC,CAAC,CACL,EAEaC,EAAqB,CAACC,EAA6B,KAAe,CAC3E,MAAMC,EAAgBD,EAAO,YAAY,OACnCA,EAAO,WACPjB,EACN,IAAImB,EAAsB,GAE1B,MAAMC,EAAuC,CAAA,EAEzCF,EAAc,SAAS,SAAS,GAChCE,EAAkB,KACd,IAAIC,EAAAA,WAAW,QAAQ,CACnB,OAAQf,CAAA,CACX,CAAA,EAIT,MAAMgB,EAASL,EAAO,QAAU,UAE5BC,EAAc,SAAS,IAAI,GAC3BE,EAAkB,KACd,IAAIC,EAAAA,WAAW,KAAK,CAChB,SAAUC,EACV,QAAS,CAAE,MAAO,GAAA,EAClB,OAAQ/B,CAAA,CACX,CAAA,EAIT,MAAMgC,EAAaC,EAAAA,aAAoB,CACnC,MAAO,OACP,WAAYJ,EAAkB,OACxBA,EACA,CAAC,IAAIC,EAAAA,WAAW,OAAS,CAAA,CAClC,EAEKI,EAAM,MAAOvB,EAAmCJ,IAAgB,CAClE,MAAM4B,EAAQzB,EACVC,EACA,OACAe,EAAO,OACPnB,CAAA,EAEE6B,EAAgBD,EAAM,OAAS,OAE/BE,EAAU,CACZ,GAAGF,EACH,MAAOC,EACP,UAAWD,EAAM,WAAa,KAAK,IAAA,CAAI,EAG3CH,EAAW,IAAI,CACX,MAAOI,EACP,QAASC,EAAQ,QACjB,SAAUA,CAAA,CACb,EAEGV,EAAc,SAAS,QAAQ,IAC3BD,EAAO,OACP,MAAM,QAAQ,QAAQA,EAAO,OAAOW,CAAO,CAAC,EACpCT,IACRA,EAAsB,GACtB,QAAQ,KACJ,iEAAA,GAIhB,EAEM1B,EAAO,MAAOc,EAAiBT,IACjC2B,EAAI,CACA,QAAAlB,EACA,MAAO,OACP,KAAAT,EACA,OAAQmB,EAAO,MAAA,CACN,EAEXY,EAAO,MAAOtB,EAAiBT,IACjC2B,EAAI,CACA,QAAAlB,EACA,MAAO,OACP,KAAAT,EACA,OAAQmB,EAAO,MAAA,CACN,EAmCjB,MAAO,CAAE,IAAAQ,EAAK,KAAAhC,EAAM,KAAAoC,EAAM,MAjCZ,MAAOtB,EAAiBT,IAClC2B,EAAI,CACA,QAAAlB,EACA,MAAO,QACP,KAAAT,EACA,OAAQmB,EAAO,MAAA,CACN,EA2BgB,UArBf,SAAY,CAC1B,GAAKC,EAAc,SAAS,IAAI,EAEhC,GAAI,CAEA,MAAMY,EACD,MAAMC,EAAK,QAAQT,CAAM,EAAG,CACzB,UAAW,EAAA,CACd,EACA,MAAM,IAAM,CAAC,CAAC,EACnB,MAAMQ,EAAG,UAAUR,EAAQ,GAAI,CAAE,KAAM,IAAK,EAC5C,MAAMQ,EAAG,SAASR,EAAQ,CAAC,EAC3B,MAAM7B,EAAK,kBAAmB,CAAE,OAAA6B,EAAQ,CAC5C,OAASU,EAAK,CAEV,MAAMC,EACFD,aAAe,MAAQA,EAAI,QAAU1C,EAAK,OAAO,KAAM0C,CAAG,EAC9D,MAAMH,EAAK,uBAAwB,CAAE,OAAAP,EAAQ,MAAOW,EAAK,CAC7D,CACJ,CAEiCC,CACrC,EAEA,IAAIC,EAAgBnB,EAAA,EAEb,MAAMoB,EAAO,CAACnB,EAA6B,MAC9CkB,EAAgBnB,EAAmBC,CAAM,EAClCkB,GAGEV,EAAM,CAACvB,EAAmCJ,IACnDqC,EAAc,IAAIjC,EAAgBJ,CAAI,EAC7BL,EAAO,CAACc,EAAiBT,IAClCqC,EAAc,KAAK5B,EAAST,CAAI,EACvB+B,EAAO,CAACtB,EAAiBT,IAClCqC,EAAc,KAAK5B,EAAST,CAAI,EACvBuC,EAAQ,CAAC9B,EAAiBT,IACnCqC,EAAc,MAAM5B,EAAST,CAAI,EACxBoC,EAAY,IAAMC,EAAc,YAAA,GAAiB,QAAQ,QAAA,EAEhEG,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,MAAM5C,EACF2C,IAAW,OACL,OACAA,IAAW,QACT,QACA,OAENvC,EAAUwC,EAAK,IAAIR,CAAqB,EAAE,KAAK,GAAG,EACnDG,EAAO,IAAI,CAAE,QAAAnC,EAAS,MAAAJ,EAAO,GAAGyC,EAAU,CACnD,CACJ,CAAC,EAEM,IAAM,CACTN,EAAe,QAASQ,GAAW,CAC/B,QAAQA,CAAM,EAAID,EAAUC,CAAM,CACtC,CAAC,CACL,CACJ,EAGA,IAAIE,EAA0B,GAEvB,SAASC,EAASC,EAAclB,EAAc,CACjD,MAAMzB,EACFyB,aAAe,MACTA,EAAI,OAASA,EAAI,QACjB1C,EAAK,OAAO,KAAM0C,CAAG,EAC1BK,EAAM,KAAKa,CAAI,KAAK3C,CAAO,EAAE,CACtC,CAEO,SAAS4C,EAAsB,CAClC,QAAAC,CACJ,EAA0C,GAAI,CAC1C,GAAIJ,EAAyB,OAC7BA,EAA0B,GAE1B,MAAMK,EAAeH,GAAkBlB,GAAiB,CAEpD,GADAiB,EAASC,EAAMlB,CAAG,EACd,OAAOoB,GAAY,WACnB,GAAI,CACAA,EAAQpB,CAAG,CACf,OAASsB,EAAY,CAEjB,MAAMrB,EACFqB,aAAsB,MAChBA,EAAW,OAASA,EAAW,QAC/BhE,EAAK,OAAO,KAAMgE,CAAU,EACjCjB,EAAM,2BAA2BJ,CAAG,EAAE,CAC/C,CAER,EAEA,QAAQ,GAAG,oBAAqBoB,EAAY,oBAAoB,CAAC,EACjE,QAAQ,GAAG,qBAAsBA,EAAY,qBAAqB,CAAC,CACvE"}
|
package/dist/server.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ConsoleInterceptOptions,
|
|
1
|
+
import { ConsoleInterceptOptions, Logger, ServerLoggerConfig } from './types';
|
|
2
2
|
|
|
3
3
|
export declare const createServerLogger: (config?: ServerLoggerConfig) => Logger;
|
|
4
4
|
export declare const init: (config?: ServerLoggerConfig) => Logger;
|
|
@@ -6,5 +6,10 @@ 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 declare const clearLogs: () => Promise<void>;
|
|
9
10
|
export declare const interceptConsoleLogs: (logger: Logger, options?: ConsoleInterceptOptions) => () => void;
|
|
11
|
+
export declare function logCrash(type: string, err: unknown): void;
|
|
12
|
+
export declare function registerCrashHandlers({ onCrash, }?: {
|
|
13
|
+
onCrash?: (err: unknown) => void;
|
|
14
|
+
}): void;
|
|
10
15
|
//# sourceMappingURL=server.d.ts.map
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"
|
|
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"}
|
package/dist/server.es.js
CHANGED
|
@@ -1,101 +1,109 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { format as l, transports as
|
|
3
|
-
const
|
|
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
4
|
l.timestamp({ format: () => (/* @__PURE__ */ new Date()).toISOString() }),
|
|
5
5
|
l.printf((o) => {
|
|
6
|
-
const t = o.logEvent ?? {},
|
|
7
|
-
return `[${
|
|
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}`;
|
|
8
8
|
})
|
|
9
|
-
),
|
|
10
|
-
message: o,
|
|
11
|
-
level: t,
|
|
12
|
-
source: a,
|
|
13
|
-
data: r
|
|
14
|
-
} : {
|
|
9
|
+
), x = ["console"], R = (o, t, s, n) => typeof o == "string" ? { message: o, level: t, source: s, data: n } : {
|
|
15
10
|
...o,
|
|
16
11
|
level: o.level ?? t,
|
|
17
|
-
source: o.source ??
|
|
18
|
-
data: o.data ??
|
|
19
|
-
},
|
|
12
|
+
source: o.source ?? s,
|
|
13
|
+
data: o.data ?? n
|
|
14
|
+
}, j = (o) => {
|
|
20
15
|
if (!o) return "";
|
|
21
16
|
try {
|
|
22
17
|
return JSON.stringify(o);
|
|
23
18
|
} catch {
|
|
24
19
|
return "[unserializable data]";
|
|
25
20
|
}
|
|
26
|
-
},
|
|
21
|
+
}, F = l.combine(
|
|
27
22
|
l.timestamp(),
|
|
28
23
|
l.errors({ stack: !0 }),
|
|
29
24
|
l.colorize({ all: !0 }),
|
|
30
25
|
l.printf((o) => {
|
|
31
26
|
const {
|
|
32
27
|
timestamp: t,
|
|
33
|
-
level:
|
|
34
|
-
message:
|
|
35
|
-
stack:
|
|
36
|
-
logEvent:
|
|
37
|
-
} = o,
|
|
38
|
-
|
|
39
|
-
)} ${
|
|
40
|
-
return
|
|
41
|
-
${
|
|
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;
|
|
42
37
|
})
|
|
43
|
-
),
|
|
44
|
-
const t = o.transports?.length ? o.transports :
|
|
45
|
-
let
|
|
46
|
-
const
|
|
47
|
-
t.includes("console") &&
|
|
48
|
-
new
|
|
49
|
-
format:
|
|
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
|
|
50
45
|
})
|
|
51
|
-
)
|
|
52
|
-
|
|
53
|
-
|
|
46
|
+
);
|
|
47
|
+
const e = o.fsPath ?? "log.txt";
|
|
48
|
+
t.includes("fs") && n.push(
|
|
49
|
+
new y.File({
|
|
50
|
+
filename: e,
|
|
54
51
|
options: { flags: "a" },
|
|
55
|
-
format:
|
|
52
|
+
format: k
|
|
56
53
|
})
|
|
57
54
|
);
|
|
58
|
-
const
|
|
55
|
+
const c = C({
|
|
59
56
|
level: "info",
|
|
60
|
-
transports:
|
|
61
|
-
}),
|
|
62
|
-
const
|
|
63
|
-
|
|
57
|
+
transports: n.length ? n : [new y.Console()]
|
|
58
|
+
}), r = async (a, i) => {
|
|
59
|
+
const u = R(
|
|
60
|
+
a,
|
|
64
61
|
"info",
|
|
65
62
|
o.source,
|
|
66
63
|
i
|
|
67
|
-
),
|
|
68
|
-
...
|
|
69
|
-
level:
|
|
70
|
-
timestamp:
|
|
64
|
+
), L = u.level ?? "info", h = {
|
|
65
|
+
...u,
|
|
66
|
+
level: L,
|
|
67
|
+
timestamp: u.timestamp ?? Date.now()
|
|
71
68
|
};
|
|
72
|
-
|
|
73
|
-
level:
|
|
74
|
-
message:
|
|
75
|
-
logEvent:
|
|
76
|
-
}), t.includes("custom") && (o.addLog ? await Promise.resolve(o.addLog(
|
|
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(
|
|
77
74
|
"[tim-logger] Custom transport requested without addLog handler."
|
|
78
75
|
)));
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
message: c,
|
|
76
|
+
}, m = async (a, i) => r({
|
|
77
|
+
message: a,
|
|
82
78
|
level: "info",
|
|
83
79
|
data: i,
|
|
84
80
|
source: o.source
|
|
85
|
-
}),
|
|
86
|
-
message:
|
|
81
|
+
}), p = async (a, i) => r({
|
|
82
|
+
message: a,
|
|
87
83
|
level: "warn",
|
|
88
84
|
data: i,
|
|
89
85
|
source: o.source
|
|
90
|
-
})
|
|
91
|
-
|
|
86
|
+
});
|
|
87
|
+
return { log: r, info: m, warn: p, error: async (a, i) => r({
|
|
88
|
+
message: a,
|
|
92
89
|
level: "error",
|
|
93
90
|
data: i,
|
|
94
91
|
source: o.source
|
|
95
|
-
})
|
|
92
|
+
}), clearLogs: async () => {
|
|
93
|
+
if (t.includes("fs"))
|
|
94
|
+
try {
|
|
95
|
+
await g.mkdir(g.dirname(e), {
|
|
96
|
+
recursive: !0
|
|
97
|
+
}).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 });
|
|
102
|
+
}
|
|
103
|
+
} };
|
|
96
104
|
};
|
|
97
|
-
let f =
|
|
98
|
-
const
|
|
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) => {
|
|
99
107
|
if (typeof o == "string") return o;
|
|
100
108
|
if (o instanceof Error)
|
|
101
109
|
return o.stack || o.message || o.toString();
|
|
@@ -104,31 +112,55 @@ const O = (o = {}) => (f = S(o), f), j = (o, t) => f.log(o, t), z = (o, t) => f.
|
|
|
104
112
|
} catch {
|
|
105
113
|
return String(o);
|
|
106
114
|
}
|
|
107
|
-
},
|
|
108
|
-
const { defaults:
|
|
115
|
+
}, G = (o, t = {}) => {
|
|
116
|
+
const { defaults: s = {} } = t, n = {
|
|
109
117
|
log: console.log.bind(console),
|
|
110
118
|
info: console.info.bind(console),
|
|
111
119
|
warn: console.warn.bind(console),
|
|
112
120
|
error: console.error.bind(console)
|
|
113
121
|
};
|
|
114
|
-
return
|
|
115
|
-
console[
|
|
116
|
-
const
|
|
117
|
-
o.log({ message:
|
|
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 });
|
|
118
126
|
};
|
|
119
127
|
}), () => {
|
|
120
|
-
|
|
121
|
-
console[
|
|
128
|
+
S.forEach((e) => {
|
|
129
|
+
console[e] = n[e];
|
|
122
130
|
});
|
|
123
131
|
};
|
|
124
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}`);
|
|
137
|
+
}
|
|
138
|
+
function J({
|
|
139
|
+
onCrash: o
|
|
140
|
+
} = {}) {
|
|
141
|
+
if (E) return;
|
|
142
|
+
E = !0;
|
|
143
|
+
const t = (s) => (n) => {
|
|
144
|
+
if (D(s, n), typeof o == "function")
|
|
145
|
+
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}`);
|
|
150
|
+
}
|
|
151
|
+
};
|
|
152
|
+
process.on("uncaughtException", t("Uncaught Exception")), process.on("unhandledRejection", t("Unhandled Rejection"));
|
|
153
|
+
}
|
|
125
154
|
export {
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
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
|
|
133
165
|
};
|
|
134
166
|
//# sourceMappingURL=server.es.js.map
|
package/dist/server.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.es.js","sources":["../src/server.ts"],"sourcesContent":["import kleur from 'kleur';\nimport type { TransformableInfo } from 'logform';\nimport {\n createLogger as createWinstonLogger,\n format,\n transports,\n} from 'winston';\nimport type TransportStream from 'winston-transport';\nimport type {\n ConsoleInterceptOptions,\n Json,\n LogEvent,\n LogLevel,\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 const timestamp = new Date().toISOString();\n\n // \"name\" in your desired output = source (fallback to LOG)\n const name = String(entry.source ?? 'LOG');\n\n // \"text\" in your desired output = message\n const text = String(entry.message ?? info.message ?? '');\n\n // \"data\" in your desired output = entry.data (fallback {})\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);\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 {\n message: eventOrMessage,\n level,\n source,\n data,\n } 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\n// renamed to avoid clashing with winston's createLogger\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 if (transportsArr.includes('fs')) {\n // Winston's types allow `options?: object` on File transport. :contentReference[oaicite:2]{index=2}\n winstonTransports.push(\n new transports.File({\n filename: config.fsPath ?? 'log.txt',\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 return { log, info, warn, error };\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);\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":["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","baseLogger","createWinstonLogger","log","event","resolvedLevel","payload","error","defaultLogger","init","warn","consoleMethods","serializeConsoleValue","value","interceptConsoleLogs","logger","options","defaults","originals","method","args"],"mappings":"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"}
|
|
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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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,17 +1,3 @@
|
|
|
1
|
-
export type Json = Record<string, any>;
|
|
2
|
-
export type LogLevel = 'info' | 'warn' | 'error';
|
|
3
|
-
export type LogEvent = {
|
|
4
|
-
id?: string;
|
|
5
|
-
message: string;
|
|
6
|
-
verb?: string;
|
|
7
|
-
source?: string;
|
|
8
|
-
data?: Json;
|
|
9
|
-
level?: LogLevel;
|
|
10
|
-
timestamp?: number;
|
|
11
|
-
duration?: number;
|
|
12
|
-
machineId?: string;
|
|
13
|
-
sessionId?: string;
|
|
14
|
-
};
|
|
15
1
|
export type ConsoleInterceptOptions = {
|
|
16
2
|
defaults?: Partial<LogEvent>;
|
|
17
3
|
};
|
|
@@ -34,5 +20,6 @@ export type Logger = {
|
|
|
34
20
|
info: (message: string, data?: Json) => Promise<void>;
|
|
35
21
|
warn: (message: string, data?: Json) => Promise<void>;
|
|
36
22
|
error: (message: string, data?: Json) => Promise<void>;
|
|
23
|
+
clearLogs: () => Promise<void>;
|
|
37
24
|
};
|
|
38
25
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,
|
|
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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tim-logger",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.22",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"private": false,
|
|
6
6
|
"scripts": {
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
"winston-transport": "^4.9.0"
|
|
18
18
|
},
|
|
19
19
|
"devDependencies": {
|
|
20
|
+
"@types/node": "^20.19.25",
|
|
20
21
|
"@types/react": "^18.0.25",
|
|
21
22
|
"@types/react-dom": "^19.2.0",
|
|
22
23
|
"typescript": "^5.4.4",
|