@lssm/lib.logger 0.0.0-canary-20251120170226

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.
Files changed (56) hide show
  1. package/README.md +51 -0
  2. package/dist/_virtual/rolldown_runtime.cjs +1 -0
  3. package/dist/context.cjs +1 -0
  4. package/dist/context.d.cts +44 -0
  5. package/dist/context.d.cts.map +1 -0
  6. package/dist/context.d.ts +44 -0
  7. package/dist/context.d.ts.map +1 -0
  8. package/dist/context.js +2 -0
  9. package/dist/context.js.map +1 -0
  10. package/dist/elysia-plugin.cjs +1 -0
  11. package/dist/elysia-plugin.d.cts +64 -0
  12. package/dist/elysia-plugin.d.cts.map +1 -0
  13. package/dist/elysia-plugin.d.ts +64 -0
  14. package/dist/elysia-plugin.d.ts.map +1 -0
  15. package/dist/elysia-plugin.js +2 -0
  16. package/dist/elysia-plugin.js.map +1 -0
  17. package/dist/formatters.cjs +9 -0
  18. package/dist/formatters.d.cts +29 -0
  19. package/dist/formatters.d.cts.map +1 -0
  20. package/dist/formatters.d.ts +29 -0
  21. package/dist/formatters.d.ts.map +1 -0
  22. package/dist/formatters.js +10 -0
  23. package/dist/formatters.js.map +1 -0
  24. package/dist/index.cjs +1 -0
  25. package/dist/index.d.cts +8 -0
  26. package/dist/index.d.ts +8 -0
  27. package/dist/index.js +1 -0
  28. package/dist/logger.cjs +1 -0
  29. package/dist/logger.d.cts +51 -0
  30. package/dist/logger.d.cts.map +1 -0
  31. package/dist/logger.d.ts +51 -0
  32. package/dist/logger.d.ts.map +1 -0
  33. package/dist/logger.js +2 -0
  34. package/dist/logger.js.map +1 -0
  35. package/dist/timer.cjs +1 -0
  36. package/dist/timer.d.cts +103 -0
  37. package/dist/timer.d.cts.map +1 -0
  38. package/dist/timer.d.ts +103 -0
  39. package/dist/timer.d.ts.map +1 -0
  40. package/dist/timer.js +2 -0
  41. package/dist/timer.js.map +1 -0
  42. package/dist/tracer.cjs +1 -0
  43. package/dist/tracer.d.cts +51 -0
  44. package/dist/tracer.d.cts.map +1 -0
  45. package/dist/tracer.d.ts +51 -0
  46. package/dist/tracer.d.ts.map +1 -0
  47. package/dist/tracer.js +2 -0
  48. package/dist/tracer.js.map +1 -0
  49. package/dist/types.cjs +1 -0
  50. package/dist/types.d.cts +71 -0
  51. package/dist/types.d.cts.map +1 -0
  52. package/dist/types.d.ts +71 -0
  53. package/dist/types.d.ts.map +1 -0
  54. package/dist/types.js +2 -0
  55. package/dist/types.js.map +1 -0
  56. package/package.json +79 -0
package/README.md ADDED
@@ -0,0 +1,51 @@
1
+ # @lssm/lib.logger
2
+
3
+ High-performance logging library optimized for Bun, with native ElysiaJS integration.
4
+
5
+ ## Purpose
6
+
7
+ To provide structured, performant logging with support for request tracing, timing, and varied output formats (JSON/Pretty). It includes a plugin for ElysiaJS to automatically log HTTP requests.
8
+
9
+ ## Installation
10
+
11
+ ```bash
12
+ npm install @lssm/lib.logger
13
+ # or
14
+ bun add @lssm/lib.logger
15
+ ```
16
+
17
+ ## Key Concepts
18
+
19
+ - **Structured Logging**: Logs are JSON objects by default for easy parsing.
20
+ - **Context Awareness**: Supports AsyncLocalStorage for request-scoped context (Trace IDs).
21
+ - **Elysia Plugin**: Drop-in middleware for Elysia apps.
22
+
23
+ ## Exports
24
+
25
+ - `logger`: The main logger instance.
26
+ - `elysiaPlugin`: Middleware for Elysia.
27
+ - `timer`: Utilities for measuring execution time.
28
+ - `tracer`: Request tracing utilities.
29
+
30
+ ## Usage
31
+
32
+ ### Basic Logging
33
+
34
+ ```ts
35
+ import { logger } from '@lssm/lib.logger';
36
+
37
+ logger.info('Server started', { port: 3000 });
38
+ logger.error('Database connection failed', { error: err });
39
+ ```
40
+
41
+ ### With Elysia
42
+
43
+ ```ts
44
+ import { Elysia } from 'elysia';
45
+ import { elysiaLogger } from '@lssm/lib.logger/elysia-plugin';
46
+
47
+ new Elysia()
48
+ .use(elysiaLogger())
49
+ .get('/', () => 'Hello World')
50
+ .listen(3000);
51
+ ```
@@ -0,0 +1 @@
1
+ var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));exports.__toESM=s;
@@ -0,0 +1 @@
1
+ const e=require(`./_virtual/rolldown_runtime.cjs`);let t=require(`node:async_hooks`);t=e.__toESM(t);var n=class e{static instance;storage;constructor(){this.storage=new t.AsyncLocalStorage}static getInstance(){return e.instance||=new e,e.instance}run(e,t){let n={context:{...e},trace:this.getCurrentTrace()};return this.storage.run(n,t)}extend(e,t){let n={...this.getContext(),...e};return this.run(n,t)}set(e,t){let n=this.storage.getStore();n&&(n.context[e]=t)}get(e){return this.storage.getStore()?.context?.[e]}getContext(){return this.storage.getStore()?.context||{}}setTrace(e){let t=this.storage.getStore();t&&(t.trace=e)}getCurrentTrace(){return this.storage.getStore()?.trace}generateId(){return crypto.randomUUID()}};exports.LogContext=n;
@@ -0,0 +1,44 @@
1
+ import { ContextData, TraceContext } from "./types.cjs";
2
+
3
+ //#region src/context.d.ts
4
+ declare class LogContext {
5
+ private static instance;
6
+ private storage;
7
+ constructor();
8
+ static getInstance(): LogContext;
9
+ /**
10
+ * Run a function with a new context
11
+ */
12
+ run<T>(context: ContextData, fn: () => T): T;
13
+ /**
14
+ * Run a function with an extended context (merges with current)
15
+ */
16
+ extend<T>(additionalContext: Partial<ContextData>, fn: () => T): T;
17
+ /**
18
+ * Set context data for the current execution context
19
+ */
20
+ set(key: string, value: any): void;
21
+ /**
22
+ * Get a specific context value
23
+ */
24
+ get<T>(key: string): T | undefined;
25
+ /**
26
+ * Get all context data
27
+ */
28
+ getContext(): ContextData;
29
+ /**
30
+ * Set trace context
31
+ */
32
+ setTrace(trace: TraceContext): void;
33
+ /**
34
+ * Get current trace context
35
+ */
36
+ getCurrentTrace(): TraceContext | undefined;
37
+ /**
38
+ * Generate a unique ID for requests/operations
39
+ */
40
+ generateId(): string;
41
+ }
42
+ //#endregion
43
+ export { LogContext };
44
+ //# sourceMappingURL=context.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.cts","names":[],"sources":["../src/context.ts"],"sourcesContent":[],"mappings":";;;cAQa,UAAA;;EAAA,QAAA,OAAU;EAQC,WAAA,CAAA;EAUN,OAAA,WAAA,CAAA,CAAA,EAVM,UAUN;EAAuB;;;EAWV,GAAA,CAAA,CAAA,CAAA,CAAA,OAAA,EAXb,WAWa,EAAA,EAAA,EAAA,GAAA,GAXU,CAWV,CAAA,EAXc,CAWd;EAAgC;;;EA+B/C,MAAA,CAAA,CAAA,CAAA,CAAA,iBAAA,EA/Be,OA+Bf,CA/BuB,WA+BvB,CAAA,EAAA,EAAA,EAAA,GAAA,GA/B+C,CA+B/C,CAAA,EA/BmD,CA+BnD;EAQE;;;;;;;uBAhBK;;;;gBAQP;;;;kBAQE;;;;qBAUG"}
@@ -0,0 +1,44 @@
1
+ import { ContextData, TraceContext } from "./types.js";
2
+
3
+ //#region src/context.d.ts
4
+ declare class LogContext {
5
+ private static instance;
6
+ private storage;
7
+ constructor();
8
+ static getInstance(): LogContext;
9
+ /**
10
+ * Run a function with a new context
11
+ */
12
+ run<T>(context: ContextData, fn: () => T): T;
13
+ /**
14
+ * Run a function with an extended context (merges with current)
15
+ */
16
+ extend<T>(additionalContext: Partial<ContextData>, fn: () => T): T;
17
+ /**
18
+ * Set context data for the current execution context
19
+ */
20
+ set(key: string, value: any): void;
21
+ /**
22
+ * Get a specific context value
23
+ */
24
+ get<T>(key: string): T | undefined;
25
+ /**
26
+ * Get all context data
27
+ */
28
+ getContext(): ContextData;
29
+ /**
30
+ * Set trace context
31
+ */
32
+ setTrace(trace: TraceContext): void;
33
+ /**
34
+ * Get current trace context
35
+ */
36
+ getCurrentTrace(): TraceContext | undefined;
37
+ /**
38
+ * Generate a unique ID for requests/operations
39
+ */
40
+ generateId(): string;
41
+ }
42
+ //#endregion
43
+ export { LogContext };
44
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","names":[],"sources":["../src/context.ts"],"sourcesContent":[],"mappings":";;;cAQa,UAAA;;EAAA,QAAA,OAAU;EAQC,WAAA,CAAA;EAUN,OAAA,WAAA,CAAA,CAAA,EAVM,UAUN;EAAuB;;;EAWV,GAAA,CAAA,CAAA,CAAA,CAAA,OAAA,EAXb,WAWa,EAAA,EAAA,EAAA,GAAA,GAXU,CAWV,CAAA,EAXc,CAWd;EAAgC;;;EA+B/C,MAAA,CAAA,CAAA,CAAA,CAAA,iBAAA,EA/Be,OA+Bf,CA/BuB,WA+BvB,CAAA,EAAA,EAAA,EAAA,GAAA,GA/B+C,CA+B/C,CAAA,EA/BmD,CA+BnD;EAQE;;;;;;;uBAhBK;;;;gBAQP;;;;kBAQE;;;;qBAUG"}
@@ -0,0 +1,2 @@
1
+ import{AsyncLocalStorage as e}from"node:async_hooks";var t=class t{static instance;storage;constructor(){this.storage=new e}static getInstance(){return t.instance||=new t,t.instance}run(e,t){let n={context:{...e},trace:this.getCurrentTrace()};return this.storage.run(n,t)}extend(e,t){let n={...this.getContext(),...e};return this.run(n,t)}set(e,t){let n=this.storage.getStore();n&&(n.context[e]=t)}get(e){return this.storage.getStore()?.context?.[e]}getContext(){return this.storage.getStore()?.context||{}}setTrace(e){let t=this.storage.getStore();t&&(t.trace=e)}getCurrentTrace(){return this.storage.getStore()?.trace}generateId(){return crypto.randomUUID()}};export{t as LogContext};
2
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","names":["contextData: LogContextData","mergedContext: ContextData"],"sources":["../src/context.ts"],"sourcesContent":["import { AsyncLocalStorage } from 'node:async_hooks';\nimport type { ContextData, TraceContext } from './types';\n\ninterface LogContextData {\n context: ContextData;\n trace?: TraceContext;\n}\n\nexport class LogContext {\n private static instance: LogContext;\n private storage: AsyncLocalStorage<LogContextData>;\n\n constructor() {\n this.storage = new AsyncLocalStorage<LogContextData>();\n }\n\n static getInstance(): LogContext {\n if (!LogContext.instance) {\n LogContext.instance = new LogContext();\n }\n return LogContext.instance;\n }\n\n /**\n * Run a function with a new context\n */\n run<T>(context: ContextData, fn: () => T): T {\n const contextData: LogContextData = {\n context: { ...context },\n trace: this.getCurrentTrace(),\n };\n return this.storage.run(contextData, fn) as T;\n }\n\n /**\n * Run a function with an extended context (merges with current)\n */\n extend<T>(additionalContext: Partial<ContextData>, fn: () => T): T {\n const currentContext = this.getContext();\n const mergedContext: ContextData = {\n ...currentContext,\n ...additionalContext,\n };\n return this.run(mergedContext, fn);\n }\n\n /**\n * Set context data for the current execution context\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n set(key: string, value: any): void {\n const current = this.storage.getStore();\n if (current) {\n current.context[key] = value;\n }\n }\n\n /**\n * Get a specific context value\n */\n get<T>(key: string): T | undefined {\n const current = this.storage.getStore();\n return current?.context?.[key];\n }\n\n /**\n * Get all context data\n */\n getContext(): ContextData {\n const current = this.storage.getStore();\n return current?.context || {};\n }\n\n /**\n * Set trace context\n */\n setTrace(trace: TraceContext): void {\n const current = this.storage.getStore();\n if (current) {\n current.trace = trace;\n }\n }\n\n /**\n * Get current trace context\n */\n getCurrentTrace(): TraceContext | undefined {\n const current = this.storage.getStore();\n return current?.trace;\n }\n /**\n * Generate a unique ID for requests/operations\n */\n generateId(): string {\n return crypto.randomUUID();\n }\n}\n"],"mappings":"qDAQA,IAAa,EAAb,MAAa,CAAW,CACtB,OAAe,SACf,QAEA,aAAc,CACZ,KAAK,QAAU,IAAI,EAGrB,OAAO,aAA0B,CAI/B,MAHA,CACE,EAAW,WAAW,IAAI,EAErB,EAAW,SAMpB,IAAO,EAAsB,EAAgB,CAC3C,IAAMA,EAA8B,CAClC,QAAS,CAAE,GAAG,EAAS,CACvB,MAAO,KAAK,iBAAiB,CAC9B,CACD,OAAO,KAAK,QAAQ,IAAI,EAAa,EAAG,CAM1C,OAAU,EAAyC,EAAgB,CAEjE,IAAMC,EAA6B,CACjC,GAFqB,KAAK,YAAY,CAGtC,GAAG,EACJ,CACD,OAAO,KAAK,IAAI,EAAe,EAAG,CAOpC,IAAI,EAAa,EAAkB,CACjC,IAAM,EAAU,KAAK,QAAQ,UAAU,CACnC,IACF,EAAQ,QAAQ,GAAO,GAO3B,IAAO,EAA4B,CAEjC,OADgB,KAAK,QAAQ,UAAU,EACvB,UAAU,GAM5B,YAA0B,CAExB,OADgB,KAAK,QAAQ,UAAU,EACvB,SAAW,EAAE,CAM/B,SAAS,EAA2B,CAClC,IAAM,EAAU,KAAK,QAAQ,UAAU,CACnC,IACF,EAAQ,MAAQ,GAOpB,iBAA4C,CAE1C,OADgB,KAAK,QAAQ,UAAU,EACvB,MAKlB,YAAqB,CACnB,OAAO,OAAO,YAAY"}
@@ -0,0 +1 @@
1
+ const e=require(`./_virtual/rolldown_runtime.cjs`),t=require(`./context.cjs`),n=require(`./logger.cjs`);require(`elysia`);function r(e={}){let{logger:r=new n.Logger,logRequests:i=!0,logResponses:a=!0,excludePaths:o=[`/health`,`/metrics`]}=e,s=t.LogContext.getInstance();return function(e){return e.derive(e=>{let{request:t,path:n}=e;if(o.some(e=>n.startsWith(e)))return{logger:r};let a=new URL(t.url),c={requestId:s.generateId(),method:t.method,url:t.url,path:a.pathname,userAgent:t.headers.get(`user-agent`)||void 0,timestamp:new Date().toISOString()},l=performance.now();return s.run(c,()=>{i&&r.info(`→ ${t.method} ${n}`,{method:t.method,path:n,userAgent:c.userAgent,requestId:c.requestId})}),{logger:r,requestContext:c,startTime:l}}).onAfterHandle(e=>{let{request:t,startTime:n,requestContext:r,logger:i}=e;if(!n||!r)return;let o=performance.now()-n,s=new URL(t.url).pathname;a&&i.info(`← 200 ${t.method} ${s}`,{method:t.method,path:s,duration:`${o.toFixed(2)}ms`,requestId:r.requestId})}).onError(e=>{let{request:t,error:n,code:r,startTime:i,requestContext:a,logger:o}=e;if(!i||!a)return;let s=performance.now()-i,c=new URL(t.url).pathname;o?.error(`✖ ${r} ${t.method} ${c}`,{method:t.method,path:c,error:n?.toString?.()||`Unknown error`,code:r,duration:`${s.toFixed(2)}ms`,requestId:a.requestId})}).derive(()=>({logInfo:(e,t)=>{r.info(e,t)},logError:(e,t,n)=>{r.error(e,n,t)},traceOperation:async(e,t)=>r.trace({operationType:`custom`,operationName:e,autoTiming:!0},t)}))}}const i=r;exports.createElysiaLogger=i,exports.elysiaLogger=r;
@@ -0,0 +1,64 @@
1
+ import { ContextData } from "./types.cjs";
2
+ import { Logger } from "./logger.cjs";
3
+ import * as elysia0 from "elysia";
4
+ import { Elysia } from "elysia";
5
+
6
+ //#region src/elysia-plugin.d.ts
7
+ interface ElysiaLoggerConfig {
8
+ logger?: Logger;
9
+ logRequests?: boolean;
10
+ logResponses?: boolean;
11
+ excludePaths?: string[];
12
+ }
13
+ /**
14
+ * Simple ElysiaJS Logger Plugin
15
+ * Provides automatic request logging and tracing
16
+ */
17
+ declare function elysiaLogger<T extends Elysia>(config?: ElysiaLoggerConfig): (app: T) => Elysia<"", {
18
+ decorator: {};
19
+ store: {};
20
+ derive: {};
21
+ resolve: {};
22
+ }, {
23
+ typebox: {};
24
+ error: {};
25
+ }, {
26
+ schema: {};
27
+ standaloneSchema: {};
28
+ macro: {};
29
+ macroFn: {};
30
+ parser: {};
31
+ response: {};
32
+ }, {}, {
33
+ derive: {};
34
+ resolve: {};
35
+ schema: {};
36
+ standaloneSchema: {};
37
+ response: {};
38
+ }, {
39
+ derive: ({
40
+ readonly logger: Logger;
41
+ readonly requestContext?: undefined;
42
+ readonly startTime?: undefined;
43
+ } | {
44
+ readonly logger: Logger;
45
+ readonly requestContext: ContextData;
46
+ readonly startTime: number;
47
+ }) & {
48
+ readonly logInfo: (message: string, metadata?: Record<string, any>) => void;
49
+ readonly logError: (message: string, error?: Error, metadata?: Record<string, any>) => void;
50
+ readonly traceOperation: <T_1>(operationName: string, operation: () => T_1 | Promise<T_1>) => Promise<T_1>;
51
+ };
52
+ resolve: {};
53
+ schema: {};
54
+ standaloneSchema: {};
55
+ response: elysia0.ExtractErrorFromHandle<{
56
+ readonly logInfo: (message: string, metadata?: Record<string, any>) => void;
57
+ readonly logError: (message: string, error?: Error, metadata?: Record<string, any>) => void;
58
+ readonly traceOperation: <T_1>(operationName: string, operation: () => T_1 | Promise<T_1>) => Promise<T_1>;
59
+ }>;
60
+ }>;
61
+ declare const createElysiaLogger: typeof elysiaLogger;
62
+ //#endregion
63
+ export { ElysiaLoggerConfig, createElysiaLogger, elysiaLogger };
64
+ //# sourceMappingURL=elysia-plugin.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"elysia-plugin.d.cts","names":[],"sources":["../src/elysia-plugin.ts"],"sourcesContent":[],"mappings":";;;;;;UAKiB,kBAAA;WACN;;EADM,YAAA,CAAA,EAAA,OAAkB;EAWnB,YAAA,CAAA,EAAY,MAAA,EAAA;;;;;;iBAAZ,uBAAuB,iBAC7B,2BAYc,MAAC;EA+EqB,SAAA,EAAA,CAAA,CAAA;EAK5B,KAAA,EAAA,CAAA,CAAA;EAEG,MAAA,EAAA,CAAA,CAAA;EAMM,OAAA,EAAA,CAAA,CAAA;CAAY,EAAA;EAAR,OAAA,EAAA,CAAA,CAAA;EACZ,KAAA,EAAA,CAAA,CAAA;CAAR,EAAA;EAdmC,MAAA,EAAA,CAAA,CAAA;EAK5B,gBAAA,EAAA,CAAA,CAAA;EAEG,KAAA,EAAA,CAAA,CAAA;EAMM,OAAA,EAAA,CAAA,CAAA;EAAY,MAAA,EAAA,CAAA,CAAA;EAAR,QAAA,EAAA,CAAA,CAAA;CACZ,EAAA,CAAA,CAAA,EAAA;EAAR,MAAA,EAAA,CAAA,CAAA;EAAO,OAAA,EAAA,CAAA,CAAA;EA7FO,MAAA,EAAA,CAAA,CAAA;EAAA,gBAAA,EAAA,CAAA,CAAA;EA4GZ,QAAA,EAAA,CAAA,CAAA;;;;;;;;;;;mDA7BiC;iDAK5B,kBAEG;2EAMM,MAAI,QAAQ,SAC5B,QAAQ;;;;;YAAD,OAAA,CAAA;mDAd4B;iDAK5B,kBAEG;2EAMM,MAAI,QAAQ,SAC5B,QAAQ;;;cAeN,2BAAkB"}
@@ -0,0 +1,64 @@
1
+ import { ContextData } from "./types.js";
2
+ import { Logger } from "./logger.js";
3
+ import * as elysia0 from "elysia";
4
+ import { Elysia } from "elysia";
5
+
6
+ //#region src/elysia-plugin.d.ts
7
+ interface ElysiaLoggerConfig {
8
+ logger?: Logger;
9
+ logRequests?: boolean;
10
+ logResponses?: boolean;
11
+ excludePaths?: string[];
12
+ }
13
+ /**
14
+ * Simple ElysiaJS Logger Plugin
15
+ * Provides automatic request logging and tracing
16
+ */
17
+ declare function elysiaLogger<T extends Elysia>(config?: ElysiaLoggerConfig): (app: T) => Elysia<"", {
18
+ decorator: {};
19
+ store: {};
20
+ derive: {};
21
+ resolve: {};
22
+ }, {
23
+ typebox: {};
24
+ error: {};
25
+ }, {
26
+ schema: {};
27
+ standaloneSchema: {};
28
+ macro: {};
29
+ macroFn: {};
30
+ parser: {};
31
+ response: {};
32
+ }, {}, {
33
+ derive: {};
34
+ resolve: {};
35
+ schema: {};
36
+ standaloneSchema: {};
37
+ response: {};
38
+ }, {
39
+ derive: ({
40
+ readonly logger: Logger;
41
+ readonly requestContext?: undefined;
42
+ readonly startTime?: undefined;
43
+ } | {
44
+ readonly logger: Logger;
45
+ readonly requestContext: ContextData;
46
+ readonly startTime: number;
47
+ }) & {
48
+ readonly logInfo: (message: string, metadata?: Record<string, any>) => void;
49
+ readonly logError: (message: string, error?: Error, metadata?: Record<string, any>) => void;
50
+ readonly traceOperation: <T_1>(operationName: string, operation: () => T_1 | Promise<T_1>) => Promise<T_1>;
51
+ };
52
+ resolve: {};
53
+ schema: {};
54
+ standaloneSchema: {};
55
+ response: elysia0.ExtractErrorFromHandle<{
56
+ readonly logInfo: (message: string, metadata?: Record<string, any>) => void;
57
+ readonly logError: (message: string, error?: Error, metadata?: Record<string, any>) => void;
58
+ readonly traceOperation: <T_1>(operationName: string, operation: () => T_1 | Promise<T_1>) => Promise<T_1>;
59
+ }>;
60
+ }>;
61
+ declare const createElysiaLogger: typeof elysiaLogger;
62
+ //#endregion
63
+ export { ElysiaLoggerConfig, createElysiaLogger, elysiaLogger };
64
+ //# sourceMappingURL=elysia-plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"elysia-plugin.d.ts","names":[],"sources":["../src/elysia-plugin.ts"],"sourcesContent":[],"mappings":";;;;;;UAKiB,kBAAA;WACN;;EADM,YAAA,CAAA,EAAA,OAAkB;EAWnB,YAAA,CAAA,EAAY,MAAA,EAAA;;;;;;iBAAZ,uBAAuB,iBAC7B,2BAYc,MAAC;EA+EqB,SAAA,EAAA,CAAA,CAAA;EAK5B,KAAA,EAAA,CAAA,CAAA;EAEG,MAAA,EAAA,CAAA,CAAA;EAMM,OAAA,EAAA,CAAA,CAAA;CAAY,EAAA;EAAR,OAAA,EAAA,CAAA,CAAA;EACZ,KAAA,EAAA,CAAA,CAAA;CAAR,EAAA;EAdmC,MAAA,EAAA,CAAA,CAAA;EAK5B,gBAAA,EAAA,CAAA,CAAA;EAEG,KAAA,EAAA,CAAA,CAAA;EAMM,OAAA,EAAA,CAAA,CAAA;EAAY,MAAA,EAAA,CAAA,CAAA;EAAR,QAAA,EAAA,CAAA,CAAA;CACZ,EAAA,CAAA,CAAA,EAAA;EAAR,MAAA,EAAA,CAAA,CAAA;EAAO,OAAA,EAAA,CAAA,CAAA;EA7FO,MAAA,EAAA,CAAA,CAAA;EAAA,gBAAA,EAAA,CAAA,CAAA;EA4GZ,QAAA,EAAA,CAAA,CAAA;;;;;;;;;;;mDA7BiC;iDAK5B,kBAEG;2EAMM,MAAI,QAAQ,SAC5B,QAAQ;;;;;YAAD,OAAA,CAAA;mDAd4B;iDAK5B,kBAEG;2EAMM,MAAI,QAAQ,SAC5B,QAAQ;;;cAeN,2BAAkB"}
@@ -0,0 +1,2 @@
1
+ import{LogContext as e}from"./context.js";import{Logger as t}from"./logger.js";import{Elysia as n}from"elysia";function r(n={}){let{logger:r=new t,logRequests:i=!0,logResponses:a=!0,excludePaths:o=[`/health`,`/metrics`]}=n,s=e.getInstance();return function(e){return e.derive(e=>{let{request:t,path:n}=e;if(o.some(e=>n.startsWith(e)))return{logger:r};let a=new URL(t.url),c={requestId:s.generateId(),method:t.method,url:t.url,path:a.pathname,userAgent:t.headers.get(`user-agent`)||void 0,timestamp:new Date().toISOString()},l=performance.now();return s.run(c,()=>{i&&r.info(`→ ${t.method} ${n}`,{method:t.method,path:n,userAgent:c.userAgent,requestId:c.requestId})}),{logger:r,requestContext:c,startTime:l}}).onAfterHandle(e=>{let{request:t,startTime:n,requestContext:r,logger:i}=e;if(!n||!r)return;let o=performance.now()-n,s=new URL(t.url).pathname;a&&i.info(`← 200 ${t.method} ${s}`,{method:t.method,path:s,duration:`${o.toFixed(2)}ms`,requestId:r.requestId})}).onError(e=>{let{request:t,error:n,code:r,startTime:i,requestContext:a,logger:o}=e;if(!i||!a)return;let s=performance.now()-i,c=new URL(t.url).pathname;o?.error(`✖ ${r} ${t.method} ${c}`,{method:t.method,path:c,error:n?.toString?.()||`Unknown error`,code:r,duration:`${s.toFixed(2)}ms`,requestId:a.requestId})}).derive(()=>({logInfo:(e,t)=>{r.info(e,t)},logError:(e,t,n)=>{r.error(e,n,t)},traceOperation:async(e,t)=>r.trace({operationType:`custom`,operationName:e,autoTiming:!0},t)}))}}const i=r;export{i as createElysiaLogger,r as elysiaLogger};
2
+ //# sourceMappingURL=elysia-plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"elysia-plugin.js","names":["requestContext: ContextData"],"sources":["../src/elysia-plugin.ts"],"sourcesContent":["import { Logger } from './logger';\nimport { LogContext } from './context';\nimport type { ContextData } from './types';\nimport { Elysia } from 'elysia';\n\nexport interface ElysiaLoggerConfig {\n logger?: Logger;\n logRequests?: boolean;\n logResponses?: boolean;\n excludePaths?: string[];\n}\n\n/**\n * Simple ElysiaJS Logger Plugin\n * Provides automatic request logging and tracing\n */\nexport function elysiaLogger<T extends Elysia>(\n config: ElysiaLoggerConfig = {}\n) {\n const {\n logger = new Logger(),\n logRequests = true,\n logResponses = true,\n excludePaths = ['/health', '/metrics'],\n } = config;\n\n const context = LogContext.getInstance();\n\n // For type compatibility, we use a factory function\n return function (app: T) {\n return app\n .derive((ctx) => {\n const { request, path } = ctx;\n\n // Skip excluded paths\n if (excludePaths.some((excludePath) => path.startsWith(excludePath))) {\n return { logger };\n }\n\n // Create request context\n const url = new URL(request.url);\n const requestContext: ContextData = {\n requestId: context.generateId(),\n method: request.method,\n url: request.url,\n path: url.pathname,\n userAgent: request.headers.get('user-agent') || undefined,\n timestamp: new Date().toISOString(),\n };\n\n const startTime = performance.now();\n\n // Run in context\n context.run(requestContext, () => {\n // Log request\n if (logRequests) {\n logger.info(`→ ${request.method} ${path}`, {\n method: request.method,\n path,\n userAgent: requestContext.userAgent,\n requestId: requestContext.requestId,\n });\n }\n });\n\n return {\n logger,\n requestContext,\n startTime,\n };\n })\n .onAfterHandle((ctx) => {\n const { request, startTime, requestContext, logger } = ctx;\n\n if (!startTime || !requestContext) return;\n\n const duration = performance.now() - startTime;\n const path = new URL(request.url).pathname;\n\n if (logResponses) {\n logger.info(`← 200 ${request.method} ${path}`, {\n method: request.method,\n path,\n duration: `${duration.toFixed(2)}ms`,\n requestId: requestContext.requestId,\n });\n }\n })\n .onError((ctx) => {\n const { request, error, code, startTime, requestContext, logger } = ctx;\n\n if (!startTime || !requestContext) return;\n\n const duration = performance.now() - startTime;\n const path = new URL(request.url).pathname;\n\n logger?.error(`✖ ${code} ${request.method} ${path}`, {\n method: request.method,\n path,\n error: error?.toString?.() || 'Unknown error',\n code,\n duration: `${duration.toFixed(2)}ms`,\n requestId: requestContext.requestId,\n });\n })\n .derive(() => ({\n // Helper functions available in route handlers\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n logInfo: (message: string, metadata?: Record<string, any>) => {\n logger.info(message, metadata);\n },\n logError: (\n message: string,\n error?: Error,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n metadata?: Record<string, any>\n ) => {\n logger.error(message, metadata, error);\n },\n traceOperation: async <T>(\n operationName: string,\n operation: () => T | Promise<T>\n ): Promise<T> => {\n return logger.trace(\n {\n operationType: 'custom',\n operationName,\n autoTiming: true,\n },\n operation\n );\n },\n }));\n };\n}\n\n// Export convenience functions\nexport const createElysiaLogger = elysiaLogger;\n"],"mappings":"+GAgBA,SAAgB,EACd,EAA6B,EAAE,CAC/B,CACA,GAAM,CACJ,SAAS,IAAI,EACb,cAAc,GACd,eAAe,GACf,eAAe,CAAC,UAAW,WAAW,EACpC,EAEE,EAAU,EAAW,aAAa,CAGxC,OAAO,SAAU,EAAQ,CACvB,OAAO,EACJ,OAAQ,GAAQ,CACf,GAAM,CAAE,UAAS,QAAS,EAG1B,GAAI,EAAa,KAAM,GAAgB,EAAK,WAAW,EAAY,CAAC,CAClE,MAAO,CAAE,SAAQ,CAInB,IAAM,EAAM,IAAI,IAAI,EAAQ,IAAI,CAC1BA,EAA8B,CAClC,UAAW,EAAQ,YAAY,CAC/B,OAAQ,EAAQ,OAChB,IAAK,EAAQ,IACb,KAAM,EAAI,SACV,UAAW,EAAQ,QAAQ,IAAI,aAAa,EAAI,IAAA,GAChD,UAAW,IAAI,MAAM,CAAC,aAAa,CACpC,CAEK,EAAY,YAAY,KAAK,CAenC,OAZA,EAAQ,IAAI,MAAsB,CAE5B,GACF,EAAO,KAAK,KAAK,EAAQ,OAAO,GAAG,IAAQ,CACzC,OAAQ,EAAQ,OAChB,OACA,UAAW,EAAe,UAC1B,UAAW,EAAe,UAC3B,CAAC,EAEJ,CAEK,CACL,SACA,iBACA,YACD,EACD,CACD,cAAe,GAAQ,CACtB,GAAM,CAAE,UAAS,YAAW,iBAAgB,OAAA,GAAW,EAEvD,GAAI,CAAC,GAAa,CAAC,EAAgB,OAEnC,IAAM,EAAW,YAAY,KAAK,CAAG,EAC/B,EAAO,IAAI,IAAI,EAAQ,IAAI,CAAC,SAE9B,GACF,EAAO,KAAK,SAAS,EAAQ,OAAO,GAAG,IAAQ,CAC7C,OAAQ,EAAQ,OAChB,OACA,SAAU,GAAG,EAAS,QAAQ,EAAE,CAAC,IACjC,UAAW,EAAe,UAC3B,CAAC,EAEJ,CACD,QAAS,GAAQ,CAChB,GAAM,CAAE,UAAS,QAAO,OAAM,YAAW,iBAAgB,OAAA,GAAW,EAEpE,GAAI,CAAC,GAAa,CAAC,EAAgB,OAEnC,IAAM,EAAW,YAAY,KAAK,CAAG,EAC/B,EAAO,IAAI,IAAI,EAAQ,IAAI,CAAC,SAElC,GAAQ,MAAM,KAAK,EAAK,GAAG,EAAQ,OAAO,GAAG,IAAQ,CACnD,OAAQ,EAAQ,OAChB,OACA,MAAO,GAAO,YAAY,EAAI,gBAC9B,OACA,SAAU,GAAG,EAAS,QAAQ,EAAE,CAAC,IACjC,UAAW,EAAe,UAC3B,CAAC,EACF,CACD,YAAc,CAGb,SAAU,EAAiB,IAAmC,CAC5D,EAAO,KAAK,EAAS,EAAS,EAEhC,UACE,EACA,EAEA,IACG,CACH,EAAO,MAAM,EAAS,EAAU,EAAM,EAExC,eAAgB,MACd,EACA,IAEO,EAAO,MACZ,CACE,cAAe,SACf,gBACA,WAAY,GACb,CACD,EACD,CAEJ,EAAE,EAKT,MAAa,EAAqB"}
@@ -0,0 +1,9 @@
1
+ const e=require(`./types.cjs`),t={reset:`\x1B[0m`,bright:`\x1B[1m`,dim:`\x1B[2m`,red:`\x1B[31m`,green:`\x1B[32m`,yellow:`\x1B[33m`,blue:`\x1B[34m`,magenta:`\x1B[35m`,cyan:`\x1B[36m`,white:`\x1B[37m`,gray:`\x1B[90m`,bgRed:`\x1B[41m`,bgYellow:`\x1B[43m`},n={[e.LogLevel.TRACE]:{color:t.gray,symbol:`○`,name:`TRACE`},[e.LogLevel.DEBUG]:{color:t.blue,symbol:`●`,name:`DEBUG`},[e.LogLevel.INFO]:{color:t.green,symbol:`●`,name:`INFO `},[e.LogLevel.WARN]:{color:t.yellow,symbol:`▲`,name:`WARN `},[e.LogLevel.ERROR]:{color:t.red,symbol:`✖`,name:`ERROR`},[e.LogLevel.FATAL]:{color:t.bgRed+t.white,symbol:`💀`,name:`FATAL`}};var r=class{enableColors;constructor(e=!0){this.enableColors=e}format(e){let r=[],i=n[e.level],a=this.formatTimestamp(e.timestamp);r.push(this.colorize(a,t.gray));let o=`${i.symbol} ${i.name}`;if(r.push(this.colorize(o,i.color)),e.traceId){let n=this.formatTraceInfo(e);r.push(this.colorize(n,t.cyan))}if(r.push(this.colorize(e.message,t.white)),e.duration!==void 0){let n=`(${this.formatDuration(e.duration)})`;r.push(this.colorize(n,t.magenta))}let s=r.join(` `);if(e.context&&Object.keys(e.context).length>0&&(s+=`
2
+ `+this.formatContext(e.context)),e.metadata&&Object.keys(e.metadata).length>0&&(s+=`
3
+ `+this.formatMetadata(e.metadata)),e.error&&(s+=`
4
+ `+this.formatError(e.error)),e.tags&&e.tags.length>0){let n=e.tags.map(e=>`#${e}`).join(` `);s+=`
5
+ `+this.colorize(`Tags: ${n}`,t.blue)}return s}formatTimestamp(e){return e.toISOString().substring(11,23)}formatTraceInfo(e){let t=[`trace:${e.traceId?.substring(0,8)||`unknown`}`];return e.spanId&&e.spanId.length>=8&&t.push(`span:${e.spanId.substring(0,8)}`),e.parentId&&e.parentId.length>=8&&t.push(`parent:${e.parentId.substring(0,8)}`),`[${t.join(`|`)}]`}formatDuration(e){return e<1?`${(e*1e3).toFixed(0)}μs`:e<1e3?`${e.toFixed(2)}ms`:`${(e/1e3).toFixed(2)}s`}formatContext(e){let n=this.formatObject(e,2);return this.colorize(`Context: ${n}`,t.cyan)}formatMetadata(e){let n=this.formatObject(e,2);return this.colorize(`Metadata: ${n}`,t.blue)}formatError(e){let n=this.colorize(`Error: ${e.name}: ${e.message}`,t.red);if(e.stack){let r=e.stack.split(`
6
+ `).slice(1,6).map(e=>` ${e}`).join(`
7
+ `);n+=`
8
+ `+this.colorize(r,t.gray)}return n}formatObject(e,t=0){let n=` `.repeat(t),r=Object.entries(e);return r.length===0?`{}`:r[0]&&typeof r[0][1]!=`object`?`{ ${r[0][0]}: ${this.formatValue(r[0][1])} }`:`{\n${r.map(([e,r])=>`${n} ${e}: ${this.formatValue(r,t+2)}`).join(`
9
+ `)}\n${n}}`}formatValue(e,t=0){return e===null?`null`:e===void 0?`undefined`:typeof e==`string`?`"${e}"`:typeof e==`boolean`||typeof e==`number`?String(e):e instanceof Date?e.toISOString():Array.isArray(e)?e.length===0?`[]`:`[${e.map(e=>this.formatValue(e)).join(`, `)}]`:typeof e==`object`?this.formatObject(e,t):String(e)}colorize(e,n){return this.enableColors?`${n}${e}${t.reset}`:e}},i=class{format(e){let t={timestamp:e.timestamp,level:e.level,message:e.message};return e.traceId&&(t.traceId=e.traceId),e.spanId&&(t.spanId=e.spanId),e.parentId&&(t.parentId=e.parentId),e.duration!==void 0&&(t.duration=e.duration),e.context&&Object.keys(e.context).length>0&&(t.context=e.context),e.metadata&&Object.keys(e.metadata).length>0&&(t.metadata=e.metadata),e.error&&(t.error={name:e.error.name,message:e.error.message,stack:e.error.stack}),e.tags&&e.tags.length>0&&(t.tags=e.tags),JSON.stringify(t)}},a=class{template;dateFormat;constructor(e=`{timestamp} [{level}] {message}`,t){this.template=e,this.dateFormat=t||(e=>e.toISOString())}format(t){let n=e.LogLevel[t.level],r=this.dateFormat(t.timestamp),i=this.template.replace(`{timestamp}`,r).replace(`{level}`,n).replace(`{message}`,t.message).replace(`{traceId}`,t.traceId||``).replace(`{spanId}`,t.spanId||``).replace(`{duration}`,t.duration?.toString()||``);return t.context&&(i=i.replace(`{context}`,JSON.stringify(t.context))),t.metadata&&(i=i.replace(`{metadata}`,JSON.stringify(t.metadata))),i}};exports.CustomFormatter=a,exports.DevFormatter=r,exports.ProductionFormatter=i;
@@ -0,0 +1,29 @@
1
+ import { Formatter, LogEntry } from "./types.cjs";
2
+
3
+ //#region src/formatters.d.ts
4
+ declare class DevFormatter implements Formatter {
5
+ private enableColors;
6
+ constructor(enableColors?: boolean);
7
+ format(entry: LogEntry): string;
8
+ private formatTimestamp;
9
+ private formatTraceInfo;
10
+ private formatDuration;
11
+ private formatContext;
12
+ private formatMetadata;
13
+ private formatError;
14
+ private formatObject;
15
+ private formatValue;
16
+ private colorize;
17
+ }
18
+ declare class ProductionFormatter implements Formatter {
19
+ format(entry: LogEntry): string;
20
+ }
21
+ declare class CustomFormatter implements Formatter {
22
+ private template;
23
+ private dateFormat;
24
+ constructor(template?: string, dateFormat?: (date: Date) => string);
25
+ format(entry: LogEntry): string;
26
+ }
27
+ //#endregion
28
+ export { CustomFormatter, DevFormatter, ProductionFormatter };
29
+ //# sourceMappingURL=formatters.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatters.d.cts","names":[],"sources":["../src/formatters.ts"],"sourcesContent":[],"mappings":";;;cAkCa,YAAA,YAAwB;;EAAxB,WAAA,CAAA,YAOG,CAPU,EAOV,OAAA;EAkJH,MAAA,CAAA,KAAA,EAlJG,QAkJiB,CAAA,EAAA,MAAA;EAkDpB,QAAA,eAAgB;EAML,QAAA,eAAA;EAMR,QAAA,cAAA;EAZwB,QAAA,aAAA;EAAS,QAAA,cAAA;;;;;;cAlDpC,mBAAA,YAA+B;gBAC5B;;cAiDH,eAAA,YAA2B;;;qDAMhB;gBAMR"}
@@ -0,0 +1,29 @@
1
+ import { Formatter, LogEntry } from "./types.js";
2
+
3
+ //#region src/formatters.d.ts
4
+ declare class DevFormatter implements Formatter {
5
+ private enableColors;
6
+ constructor(enableColors?: boolean);
7
+ format(entry: LogEntry): string;
8
+ private formatTimestamp;
9
+ private formatTraceInfo;
10
+ private formatDuration;
11
+ private formatContext;
12
+ private formatMetadata;
13
+ private formatError;
14
+ private formatObject;
15
+ private formatValue;
16
+ private colorize;
17
+ }
18
+ declare class ProductionFormatter implements Formatter {
19
+ format(entry: LogEntry): string;
20
+ }
21
+ declare class CustomFormatter implements Formatter {
22
+ private template;
23
+ private dateFormat;
24
+ constructor(template?: string, dateFormat?: (date: Date) => string);
25
+ format(entry: LogEntry): string;
26
+ }
27
+ //#endregion
28
+ export { CustomFormatter, DevFormatter, ProductionFormatter };
29
+ //# sourceMappingURL=formatters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatters.d.ts","names":[],"sources":["../src/formatters.ts"],"sourcesContent":[],"mappings":";;;cAkCa,YAAA,YAAwB;;EAAxB,WAAA,CAAA,YAOG,CAPU,EAOV,OAAA;EAkJH,MAAA,CAAA,KAAA,EAlJG,QAkJiB,CAAA,EAAA,MAAA;EAkDpB,QAAA,eAAgB;EAML,QAAA,eAAA;EAMR,QAAA,cAAA;EAZwB,QAAA,aAAA;EAAS,QAAA,cAAA;;;;;;cAlDpC,mBAAA,YAA+B;gBAC5B;;cAiDH,eAAA,YAA2B;;;qDAMhB;gBAMR"}
@@ -0,0 +1,10 @@
1
+ import{LogLevel as e}from"./types.js";const t={reset:`\x1B[0m`,bright:`\x1B[1m`,dim:`\x1B[2m`,red:`\x1B[31m`,green:`\x1B[32m`,yellow:`\x1B[33m`,blue:`\x1B[34m`,magenta:`\x1B[35m`,cyan:`\x1B[36m`,white:`\x1B[37m`,gray:`\x1B[90m`,bgRed:`\x1B[41m`,bgYellow:`\x1B[43m`},n={[e.TRACE]:{color:t.gray,symbol:`○`,name:`TRACE`},[e.DEBUG]:{color:t.blue,symbol:`●`,name:`DEBUG`},[e.INFO]:{color:t.green,symbol:`●`,name:`INFO `},[e.WARN]:{color:t.yellow,symbol:`▲`,name:`WARN `},[e.ERROR]:{color:t.red,symbol:`✖`,name:`ERROR`},[e.FATAL]:{color:t.bgRed+t.white,symbol:`💀`,name:`FATAL`}};var r=class{enableColors;constructor(e=!0){this.enableColors=e}format(e){let r=[],i=n[e.level],a=this.formatTimestamp(e.timestamp);r.push(this.colorize(a,t.gray));let o=`${i.symbol} ${i.name}`;if(r.push(this.colorize(o,i.color)),e.traceId){let n=this.formatTraceInfo(e);r.push(this.colorize(n,t.cyan))}if(r.push(this.colorize(e.message,t.white)),e.duration!==void 0){let n=`(${this.formatDuration(e.duration)})`;r.push(this.colorize(n,t.magenta))}let s=r.join(` `);if(e.context&&Object.keys(e.context).length>0&&(s+=`
2
+ `+this.formatContext(e.context)),e.metadata&&Object.keys(e.metadata).length>0&&(s+=`
3
+ `+this.formatMetadata(e.metadata)),e.error&&(s+=`
4
+ `+this.formatError(e.error)),e.tags&&e.tags.length>0){let n=e.tags.map(e=>`#${e}`).join(` `);s+=`
5
+ `+this.colorize(`Tags: ${n}`,t.blue)}return s}formatTimestamp(e){return e.toISOString().substring(11,23)}formatTraceInfo(e){let t=[`trace:${e.traceId?.substring(0,8)||`unknown`}`];return e.spanId&&e.spanId.length>=8&&t.push(`span:${e.spanId.substring(0,8)}`),e.parentId&&e.parentId.length>=8&&t.push(`parent:${e.parentId.substring(0,8)}`),`[${t.join(`|`)}]`}formatDuration(e){return e<1?`${(e*1e3).toFixed(0)}μs`:e<1e3?`${e.toFixed(2)}ms`:`${(e/1e3).toFixed(2)}s`}formatContext(e){let n=this.formatObject(e,2);return this.colorize(`Context: ${n}`,t.cyan)}formatMetadata(e){let n=this.formatObject(e,2);return this.colorize(`Metadata: ${n}`,t.blue)}formatError(e){let n=this.colorize(`Error: ${e.name}: ${e.message}`,t.red);if(e.stack){let r=e.stack.split(`
6
+ `).slice(1,6).map(e=>` ${e}`).join(`
7
+ `);n+=`
8
+ `+this.colorize(r,t.gray)}return n}formatObject(e,t=0){let n=` `.repeat(t),r=Object.entries(e);return r.length===0?`{}`:r[0]&&typeof r[0][1]!=`object`?`{ ${r[0][0]}: ${this.formatValue(r[0][1])} }`:`{\n${r.map(([e,r])=>`${n} ${e}: ${this.formatValue(r,t+2)}`).join(`
9
+ `)}\n${n}}`}formatValue(e,t=0){return e===null?`null`:e===void 0?`undefined`:typeof e==`string`?`"${e}"`:typeof e==`boolean`||typeof e==`number`?String(e):e instanceof Date?e.toISOString():Array.isArray(e)?e.length===0?`[]`:`[${e.map(e=>this.formatValue(e)).join(`, `)}]`:typeof e==`object`?this.formatObject(e,t):String(e)}colorize(e,n){return this.enableColors?`${n}${e}${t.reset}`:e}},i=class{format(e){let t={timestamp:e.timestamp,level:e.level,message:e.message};return e.traceId&&(t.traceId=e.traceId),e.spanId&&(t.spanId=e.spanId),e.parentId&&(t.parentId=e.parentId),e.duration!==void 0&&(t.duration=e.duration),e.context&&Object.keys(e.context).length>0&&(t.context=e.context),e.metadata&&Object.keys(e.metadata).length>0&&(t.metadata=e.metadata),e.error&&(t.error={name:e.error.name,message:e.error.message,stack:e.error.stack}),e.tags&&e.tags.length>0&&(t.tags=e.tags),JSON.stringify(t)}},a=class{template;dateFormat;constructor(e=`{timestamp} [{level}] {message}`,t){this.template=e,this.dateFormat=t||(e=>e.toISOString())}format(t){let n=e[t.level],r=this.dateFormat(t.timestamp),i=this.template.replace(`{timestamp}`,r).replace(`{level}`,n).replace(`{message}`,t.message).replace(`{traceId}`,t.traceId||``).replace(`{spanId}`,t.spanId||``).replace(`{duration}`,t.duration?.toString()||``);return t.context&&(i=i.replace(`{context}`,JSON.stringify(t.context))),t.metadata&&(i=i.replace(`{metadata}`,JSON.stringify(t.metadata))),i}};export{a as CustomFormatter,r as DevFormatter,i as ProductionFormatter};
10
+ //# sourceMappingURL=formatters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatters.js","names":["parts: string[]","logObject: LogEntry"],"sources":["../src/formatters.ts"],"sourcesContent":["import type { Formatter, LogEntry } from './types';\nimport { LogLevel } from './types';\n\n// ANSI color codes for terminal output\nconst colors = {\n reset: '\\x1b[0m',\n bright: '\\x1b[1m',\n dim: '\\x1b[2m',\n red: '\\x1b[31m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n magenta: '\\x1b[35m',\n cyan: '\\x1b[36m',\n white: '\\x1b[37m',\n gray: '\\x1b[90m',\n bgRed: '\\x1b[41m',\n bgYellow: '\\x1b[43m',\n};\n\n// Log level colors and symbols\nconst levelConfig = {\n [LogLevel.TRACE]: { color: colors.gray, symbol: '○', name: 'TRACE' },\n [LogLevel.DEBUG]: { color: colors.blue, symbol: '●', name: 'DEBUG' },\n [LogLevel.INFO]: { color: colors.green, symbol: '●', name: 'INFO ' },\n [LogLevel.WARN]: { color: colors.yellow, symbol: '▲', name: 'WARN ' },\n [LogLevel.ERROR]: { color: colors.red, symbol: '✖', name: 'ERROR' },\n [LogLevel.FATAL]: {\n color: colors.bgRed + colors.white,\n symbol: '💀',\n name: 'FATAL',\n },\n};\n\nexport class DevFormatter implements Formatter {\n private enableColors: boolean;\n\n constructor(enableColors = true) {\n this.enableColors = enableColors;\n }\n\n format(entry: LogEntry): string {\n const parts: string[] = [];\n const config = levelConfig[entry.level];\n\n // Timestamp\n const timestamp = this.formatTimestamp(entry.timestamp);\n parts.push(this.colorize(timestamp, colors.gray));\n\n // Log level with symbol\n const levelText = `${config.symbol} ${config.name}`;\n parts.push(this.colorize(levelText, config.color));\n\n // Trace information\n if (entry.traceId) {\n const traceInfo = this.formatTraceInfo(entry);\n parts.push(this.colorize(traceInfo, colors.cyan));\n }\n\n // Main message\n parts.push(this.colorize(entry.message, colors.white));\n\n // Duration (if present)\n if (entry.duration !== undefined) {\n const durationText = `(${this.formatDuration(entry.duration)})`;\n parts.push(this.colorize(durationText, colors.magenta));\n }\n\n let output = parts.join(' ');\n\n // Context and metadata (on new lines for readability)\n if (entry.context && Object.keys(entry.context).length > 0) {\n output += '\\n' + this.formatContext(entry.context);\n }\n\n if (entry.metadata && Object.keys(entry.metadata).length > 0) {\n output += '\\n' + this.formatMetadata(entry.metadata);\n }\n\n // Error details\n if (entry.error) {\n output += '\\n' + this.formatError(entry.error);\n }\n\n // Tags\n if (entry.tags && entry.tags.length > 0) {\n const tagsText = entry.tags.map((tag) => `#${tag}`).join(' ');\n output += '\\n' + this.colorize(`Tags: ${tagsText}`, colors.blue);\n }\n\n return output;\n }\n\n private formatTimestamp(timestamp: Date): string {\n return timestamp.toISOString().substring(11, 23); // Just time with milliseconds\n }\n\n private formatTraceInfo(entry: LogEntry): string {\n const parts = [`trace:${entry.traceId?.substring(0, 8) || 'unknown'}`];\n if (entry.spanId && entry.spanId.length >= 8) {\n parts.push(`span:${entry.spanId.substring(0, 8)}`);\n }\n if (entry.parentId && entry.parentId.length >= 8) {\n parts.push(`parent:${entry.parentId.substring(0, 8)}`);\n }\n return `[${parts.join('|')}]`;\n }\n\n private formatDuration(duration: number): string {\n if (duration < 1) {\n return `${(duration * 1000).toFixed(0)}μs`;\n } else if (duration < 1000) {\n return `${duration.toFixed(2)}ms`;\n } else {\n return `${(duration / 1000).toFixed(2)}s`;\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private formatContext(context: Record<string, any>): string {\n const formatted = this.formatObject(context, 2);\n return this.colorize(`Context: ${formatted}`, colors.cyan);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private formatMetadata(metadata: Record<string, any>): string {\n const formatted = this.formatObject(metadata, 2);\n return this.colorize(`Metadata: ${formatted}`, colors.blue);\n }\n\n private formatError(error: Error): string {\n let output = this.colorize(\n `Error: ${error.name}: ${error.message}`,\n colors.red\n );\n if (error.stack) {\n const stackLines = error.stack.split('\\n').slice(1, 6); // First 5 stack frames\n const indentedStack = stackLines.map((line) => ` ${line}`).join('\\n');\n output += '\\n' + this.colorize(indentedStack, colors.gray);\n }\n return output;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private formatObject(obj: Record<string, any>, indent = 0): string {\n const spaces = ' '.repeat(indent);\n const entries = Object.entries(obj);\n\n if (entries.length === 0) return '{}';\n\n if (entries[0] && typeof entries[0][1] !== 'object') {\n return `{ ${entries[0][0]}: ${this.formatValue(entries[0][1])} }`;\n }\n\n const formatted = entries\n .map(([key, value]) => {\n return `${spaces} ${key}: ${this.formatValue(value, indent + 2)}`;\n })\n .join('\\n');\n\n return `{\\n${formatted}\\n${spaces}}`;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private formatValue(value: any, indent = 0): string {\n if (value === null) return 'null';\n if (value === undefined) return 'undefined';\n if (typeof value === 'string') return `\"${value}\"`;\n if (typeof value === 'boolean' || typeof value === 'number')\n return String(value);\n if (value instanceof Date) return value.toISOString();\n if (Array.isArray(value)) {\n if (value.length === 0) return '[]';\n return `[${value.map((v) => this.formatValue(v)).join(', ')}]`;\n }\n if (typeof value === 'object') {\n return this.formatObject(value, indent);\n }\n return String(value);\n }\n\n private colorize(text: string, color: string): string {\n if (!this.enableColors) return text;\n return `${color}${text}${colors.reset}`;\n }\n}\n\nexport class ProductionFormatter implements Formatter {\n format(entry: LogEntry): string {\n const logObject: LogEntry = {\n timestamp: entry.timestamp,\n level: entry.level,\n message: entry.message,\n };\n\n // Add trace information\n if (entry.traceId) {\n logObject.traceId = entry.traceId;\n }\n if (entry.spanId) {\n logObject.spanId = entry.spanId;\n }\n if (entry.parentId) {\n logObject.parentId = entry.parentId;\n }\n\n // Add timing information\n if (entry.duration !== undefined) {\n logObject.duration = entry.duration;\n }\n\n // Add context and metadata\n if (entry.context && Object.keys(entry.context).length > 0) {\n logObject.context = entry.context;\n }\n if (entry.metadata && Object.keys(entry.metadata).length > 0) {\n logObject.metadata = entry.metadata;\n }\n\n // Add error information\n if (entry.error) {\n logObject.error = {\n name: entry.error.name,\n message: entry.error.message,\n stack: entry.error.stack,\n };\n }\n\n // Add tags\n if (entry.tags && entry.tags.length > 0) {\n logObject.tags = entry.tags;\n }\n\n return JSON.stringify(logObject);\n }\n}\n\nexport class CustomFormatter implements Formatter {\n private template: string;\n private dateFormat: (date: Date) => string;\n\n constructor(\n template = '{timestamp} [{level}] {message}',\n dateFormat?: (date: Date) => string\n ) {\n this.template = template;\n this.dateFormat = dateFormat || ((date: Date) => date.toISOString());\n }\n\n format(entry: LogEntry): string {\n const levelName = LogLevel[entry.level];\n const timestamp = this.dateFormat(entry.timestamp);\n\n let formatted = this.template\n .replace('{timestamp}', timestamp)\n .replace('{level}', levelName)\n .replace('{message}', entry.message)\n .replace('{traceId}', entry.traceId || '')\n .replace('{spanId}', entry.spanId || '')\n .replace('{duration}', entry.duration?.toString() || '');\n\n // Handle context and metadata placeholders\n if (entry.context) {\n formatted = formatted.replace('{context}', JSON.stringify(entry.context));\n }\n if (entry.metadata) {\n formatted = formatted.replace(\n '{metadata}',\n JSON.stringify(entry.metadata)\n );\n }\n\n return formatted;\n }\n}\n"],"mappings":"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"}
package/dist/index.cjs ADDED
@@ -0,0 +1 @@
1
+ const e=require(`./context.cjs`),t=require(`./types.cjs`),n=require(`./timer.cjs`),r=require(`./tracer.cjs`),i=require(`./formatters.cjs`),a=require(`./logger.cjs`),o=require(`./elysia-plugin.cjs`);exports.DevFormatter=i.DevFormatter,exports.LogContext=e.LogContext,exports.LogLevel=t.LogLevel,exports.Logger=a.Logger,exports.ProductionFormatter=i.ProductionFormatter,exports.Timer=n.Timer,exports.Tracer=r.Tracer,exports.createElysiaLogger=o.createElysiaLogger,exports.elysiaLogger=o.elysiaLogger;
@@ -0,0 +1,8 @@
1
+ import { LogEntry, LogLevel, TraceContext, TracingOptions } from "./types.cjs";
2
+ import { LogContext } from "./context.cjs";
3
+ import { Timer } from "./timer.cjs";
4
+ import { Logger } from "./logger.cjs";
5
+ import { createElysiaLogger, elysiaLogger } from "./elysia-plugin.cjs";
6
+ import { DevFormatter, ProductionFormatter } from "./formatters.cjs";
7
+ import { Tracer } from "./tracer.cjs";
8
+ export { DevFormatter, LogContext, type LogEntry, LogLevel, Logger, ProductionFormatter, Timer, type TraceContext, Tracer, type TracingOptions, createElysiaLogger, elysiaLogger };
@@ -0,0 +1,8 @@
1
+ import { LogEntry, LogLevel, TraceContext, TracingOptions } from "./types.js";
2
+ import { LogContext } from "./context.js";
3
+ import { Timer } from "./timer.js";
4
+ import { Logger } from "./logger.js";
5
+ import { createElysiaLogger, elysiaLogger } from "./elysia-plugin.js";
6
+ import { DevFormatter, ProductionFormatter } from "./formatters.js";
7
+ import { Tracer } from "./tracer.js";
8
+ export { DevFormatter, LogContext, type LogEntry, LogLevel, Logger, ProductionFormatter, Timer, type TraceContext, Tracer, type TracingOptions, createElysiaLogger, elysiaLogger };
package/dist/index.js ADDED
@@ -0,0 +1 @@
1
+ import{LogContext as e}from"./context.js";import{LogLevel as t}from"./types.js";import{Timer as n}from"./timer.js";import{Tracer as r}from"./tracer.js";import{DevFormatter as i,ProductionFormatter as a}from"./formatters.js";import{Logger as o}from"./logger.js";import{createElysiaLogger as s,elysiaLogger as c}from"./elysia-plugin.js";export{i as DevFormatter,e as LogContext,t as LogLevel,o as Logger,a as ProductionFormatter,n as Timer,r as Tracer,s as createElysiaLogger,c as elysiaLogger};
@@ -0,0 +1 @@
1
+ const e=require(`./context.cjs`),t=require(`./types.cjs`),n=require(`./timer.cjs`),r=require(`./tracer.cjs`),i=require(`./formatters.cjs`);var a=class a{config;formatter;context;tracer;timerManager;constructor(a){this.config={level:t.LogLevel.INFO,environment:process.env.NODE_ENV||`development`,enableTracing:!0,enableTiming:!0,enableContext:!0,enableColors:!0,maxContextDepth:10,timestampFormat:`iso`,...a},this.context=e.LogContext.getInstance(),this.tracer=new r.Tracer,this.timerManager=new n.TimerManager,this.formatter=this.config.environment===`production`?new i.ProductionFormatter:new i.DevFormatter(this.config.enableColors)}traceLog(e,n){this.log(t.LogLevel.TRACE,e,n)}debug(e,n){this.log(t.LogLevel.DEBUG,e,n)}info(e,n){this.log(t.LogLevel.INFO,e,n)}warn(e,n){this.log(t.LogLevel.WARN,e,n)}error(e,n,r){this.log(t.LogLevel.ERROR,e,n,r)}fatal(e,n,r){this.log(t.LogLevel.FATAL,e,n,r)}withContext(e,t){return this.context.run(e,t)}extendContext(e,t){return this.context.extend(e,t)}setContext(e,t){this.context.set(e,t)}getContext(){return this.context.getContext()}trace=async(e,t)=>this.config.enableTracing?this.tracer.trace(e,t):await t();getTraceId(){return this.tracer.getCurrentTrace()?.traceId}startSpan(e){return this.config.enableTracing?this.tracer.startSpan(e):null}finishSpan(e){if(this.config.enableTracing)return this.tracer.finishSpan(e)}addTraceMetadata(e,t){this.config.enableTracing&&this.tracer.addMetadata(e,t)}addTraceTags(...e){this.config.enableTracing&&this.tracer.addTags(...e)}startTimer(e){return this.config.enableTiming?this.timerManager.start(e):null}stopTimer(e){if(this.config.enableTiming)return this.timerManager.stop(e)}getTimer(e){return this.timerManager.get(e)}child(e){let t=new a(this.config);return Object.entries(e).forEach(([e,n])=>{t.setContext(e,n)}),t}setLevel(e){this.config.level=e}setFormatter(e){this.formatter=e}async profile(e,n,r){let i=this.startTimer(`profile-${e}`),a=performance.now();try{let o=await this.tracer.trace({operationType:`custom`,operationName:`profile:${e}`,autoTiming:!0},n),s=performance.now()-a;i?.stop();let c=r?.logLevel||t.LogLevel.DEBUG;return this.log(c,`Profile: ${e} completed`,{operation:e,duration:`${s.toFixed(2)}ms`,result:r?.logResult?o:`[result hidden]`}),o}catch(t){let n=performance.now()-a;throw i?.stop(),this.error(`Profile: ${e} failed`,{operation:e,duration:`${n.toFixed(2)}ms`,error:t.message},t),t}}logRequest(e,t,n,r){let i=this.getHttpLogLevel(n),a=`${e.toUpperCase()} ${t}${n?` ${n}`:``}`;this.log(i,a,{method:e,url:t,statusCode:n,duration:r?`${r.toFixed(2)}ms`:void 0,type:`http_request`})}async flush(){this.timerManager.clear()}getStats(){return{activeTimers:this.timerManager.getActive().length,activeSpans:this.tracer.getActiveSpans().length,config:{...this.config}}}output(e,n){n>=t.LogLevel.ERROR?console.error(e):console.log(e)}log(e,t,n,r){if(e<this.config.level)return;let i=this.config.enableTracing?this.tracer.getCurrentTrace():void 0,a=this.config.enableContext?this.context.getContext():void 0,o={level:e,message:t,timestamp:new Date,traceId:i?.traceId,parentId:i?.parentId,spanId:i?.spanId,context:a,metadata:n,error:r,tags:i?.tags};i?.metadata?.duration&&(o.duration=i.metadata.duration);let s=this.formatter.format(o);this.output(s,e)}getHttpLogLevel(e){return e?e>=500?t.LogLevel.ERROR:e>=400?t.LogLevel.WARN:t.LogLevel.INFO:t.LogLevel.INFO}};exports.Logger=a;
@@ -0,0 +1,51 @@
1
+ import { ContextData, Formatter, LogLevel, LoggerConfig, TraceContext, TraceMethod, TracingOptions } from "./types.cjs";
2
+ import { Timer } from "./timer.cjs";
3
+
4
+ //#region src/logger.d.ts
5
+ declare class Logger {
6
+ private config;
7
+ private formatter;
8
+ private context;
9
+ private tracer;
10
+ private timerManager;
11
+ constructor(config?: Partial<LoggerConfig>);
12
+ traceLog(message: string, metadata?: Record<string, any>): void;
13
+ debug(message: string, metadata?: Record<string, any>): void;
14
+ info(message: string, metadata?: Record<string, any>): void;
15
+ warn(message: string, metadata?: Record<string, any>): void;
16
+ error(message: string, metadata?: Record<string, any>, error?: Error): void;
17
+ fatal(message: string, metadata?: Record<string, any>, error?: Error): void;
18
+ withContext<T>(context: ContextData, fn: () => T): T;
19
+ extendContext<T>(additionalContext: Partial<ContextData>, fn: () => T): T;
20
+ setContext(key: string, value: any): void;
21
+ getContext(): ContextData;
22
+ trace: TraceMethod;
23
+ getTraceId(): string | undefined;
24
+ startSpan(options: TracingOptions): TraceContext | null;
25
+ finishSpan(spanId: string): number | undefined;
26
+ addTraceMetadata(key: string, value: any): void;
27
+ addTraceTags(...tags: string[]): void;
28
+ startTimer(id?: string): Timer | null;
29
+ stopTimer(id: string): number | undefined;
30
+ getTimer(id: string): Timer | undefined;
31
+ child(context: Partial<ContextData>): Logger;
32
+ setLevel(level: LogLevel): void;
33
+ setFormatter(formatter: Formatter): void;
34
+ profile<T>(operationName: string, fn: () => T | Promise<T>, options?: {
35
+ logResult?: boolean;
36
+ logLevel?: LogLevel;
37
+ }): Promise<T>;
38
+ logRequest(method: string, url: string, statusCode?: number, duration?: number): void;
39
+ flush(): Promise<void>;
40
+ getStats(): {
41
+ activeTimers: number;
42
+ activeSpans: number;
43
+ config: LoggerConfig;
44
+ };
45
+ protected output(message: string, level: LogLevel): void;
46
+ private log;
47
+ private getHttpLogLevel;
48
+ }
49
+ //#endregion
50
+ export { Logger };
51
+ //# sourceMappingURL=logger.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.cts","names":[],"sources":["../src/logger.ts"],"sourcesContent":[],"mappings":";;;;cAca,MAAA;EAAA,QAAA,MAAM;EAOY,QAAA,SAAA;EAAR,QAAA,OAAA;EA2BgB,QAAA,MAAA;EAKH,QAAA,YAAA;EAKD,WAAA,CAAA,MAAA,CAAA,EArCZ,OAqCY,CArCJ,YAqCI,CAAA;EAKA,QAAA,CAAA,OAAA,EAAA,MAAA,EAAA,QAAA,CAAA,EAfI,MAeJ,CAAA,MAAA,EAAA,GAAA,CAAA,CAAA,EAAA,IAAA;EAKC,KAAA,CAAA,OAAA,EAAA,MAAA,EAAA,QAAA,CAAA,EAfA,MAeA,CAAA,MAAA,EAAA,GAAA,CAAA,CAAA,EAAA,IAAA;EAA6B,IAAA,CAAA,OAAA,EAAA,MAAA,EAAA,QAAA,CAAA,EAV9B,MAU8B,CAAA,MAAA,EAAA,GAAA,CAAA,CAAA,EAAA,IAAA;EAK7B,IAAA,CAAA,OAAA,EAAA,MAAA,EAAA,QAAA,CAAA,EAVD,MAUC,CAAA,MAAA,EAAA,GAAA,CAAA,CAAA,EAAA,IAAA;EAA6B,KAAA,CAAA,OAAA,EAAA,MAAA,EAAA,QAAA,CAAA,EAL7B,MAK6B,CAAA,MAAA,EAAA,GAAA,CAAA,EAAA,KAAA,CAAA,EALA,KAKA,CAAA,EAAA,IAAA;EAKvC,KAAA,CAAA,OAAA,EAAA,MAAA,EAAA,QAAA,CAAA,EALU,MAKV,CAAA,MAAA,EAAA,GAAA,CAAA,EAAA,KAAA,CAAA,EALuC,KAKvC,CAAA,EAAA,IAAA;EAAuB,WAAA,CAAA,CAAA,CAAA,CAAA,OAAA,EAAvB,WAAuB,EAAA,EAAA,EAAA,GAAA,GAAA,CAAA,CAAA,EAAI,CAAJ;EAAI,aAAA,CAAA,CAAA,CAAA,CAAA,iBAAA,EAIf,OAJe,CAIP,WAJO,CAAA,EAAA,EAAA,EAAA,GAAA,GAIiB,CAJjB,CAAA,EAIqB,CAJrB;EAIP,UAAA,CAAA,GAAA,EAAA,MAAA,EAAA,KAAA,EAAA,GAAA,CAAA,EAAA,IAAA;EAAR,UAAA,CAAA,CAAA,EAStB,WATsB;EAAgC,KAAA,EAc7D,WAd6D;EAAI,UAAA,CAAA,CAAA,EAAA,MAAA,GAAA,SAAA;EAS1D,SAAA,CAAA,OAAA,EAoBK,cApBL,CAAA,EAoBmB,YAAA,GApBnB,IAAA;EAKP,UAAA,CAAA,MAAA,EAAA,MAAA,CAAA,EAAA,MAAA,GAAA,SAAA;EAeY,gBAAA,CAAA,GAAA,EAAA,MAAA,EAAA,KAAA,EAAA,GAAA,CAAA,EAAA,IAAA;EAAc,YAAA,CAAA,GAAA,IAAA,EAAA,MAAA,EAAA,CAAA,EAAA,IAAA;EA4BR,UAAA,CAAA,EAAA,CAAA,EAAA,MAAA,CAAA,EAAA,KAAA,GAAA,IAAA;EAcH,SAAA,CAAA,EAAA,EAAA,MAAA,CAAA,EAAA,MAAA,GAAA,SAAA;EAKC,QAAA,CAAA,EAAA,EAAA,MAAA,CAAA,EALD,KAKC,GAAA,SAAA;EAAR,KAAA,CAAA,OAAA,EAAA,OAAA,CAAQ,WAAR,CAAA,CAAA,EAAuB,MAAvB;EAAuB,QAAA,CAAA,KAAA,EAQtB,QARsB,CAAA,EAAA,IAAA;EAQtB,YAAA,CAAA,SAAA,EAIQ,SAJR,CAAA,EAAA,IAAA;EAIQ,OAAA,CAAA,CAAA,CAAA,CAAA,aAAA,EAAA,MAAA,EAAA,EAAA,EAAA,GAAA,GAOZ,CAPY,GAOR,OAPQ,CAOA,CAPA,CAAA,EAAA,OAOR,CAPQ,EAAA;IAOZ,SAAA,CAAA,EAAA,OAAA;IAAY,QAAA,CAAA,EACsB,QADtB;EAAR,CAAA,CAAA,EAEb,OAFa,CAEL,CAFK,CAAA;EAC8B,UAAA,CAAA,MAAA,EAAA,MAAA,EAAA,GAAA,EAAA,MAAA,EAAA,UAAA,CAAA,EAAA,MAAA,EAAA,QAAA,CAAA,EAAA,MAAA,CAAA,EAAA,IAAA;EACnC,KAAA,CAAA,CAAA,EA+DI,OA/DJ,CAAA,IAAA,CAAA;EAAR,QAAA,CAAA,CAAA,EAAA;IA+DY,YAAA,EAAA,MAAA;IAWL,WAAA,EAAA,MAAA;IAU+B,MAAA,EAV/B,YAU+B;EAAQ,CAAA;2CAAR"}
@@ -0,0 +1,51 @@
1
+ import { ContextData, Formatter, LogLevel, LoggerConfig, TraceContext, TraceMethod, TracingOptions } from "./types.js";
2
+ import { Timer } from "./timer.js";
3
+
4
+ //#region src/logger.d.ts
5
+ declare class Logger {
6
+ private config;
7
+ private formatter;
8
+ private context;
9
+ private tracer;
10
+ private timerManager;
11
+ constructor(config?: Partial<LoggerConfig>);
12
+ traceLog(message: string, metadata?: Record<string, any>): void;
13
+ debug(message: string, metadata?: Record<string, any>): void;
14
+ info(message: string, metadata?: Record<string, any>): void;
15
+ warn(message: string, metadata?: Record<string, any>): void;
16
+ error(message: string, metadata?: Record<string, any>, error?: Error): void;
17
+ fatal(message: string, metadata?: Record<string, any>, error?: Error): void;
18
+ withContext<T>(context: ContextData, fn: () => T): T;
19
+ extendContext<T>(additionalContext: Partial<ContextData>, fn: () => T): T;
20
+ setContext(key: string, value: any): void;
21
+ getContext(): ContextData;
22
+ trace: TraceMethod;
23
+ getTraceId(): string | undefined;
24
+ startSpan(options: TracingOptions): TraceContext | null;
25
+ finishSpan(spanId: string): number | undefined;
26
+ addTraceMetadata(key: string, value: any): void;
27
+ addTraceTags(...tags: string[]): void;
28
+ startTimer(id?: string): Timer | null;
29
+ stopTimer(id: string): number | undefined;
30
+ getTimer(id: string): Timer | undefined;
31
+ child(context: Partial<ContextData>): Logger;
32
+ setLevel(level: LogLevel): void;
33
+ setFormatter(formatter: Formatter): void;
34
+ profile<T>(operationName: string, fn: () => T | Promise<T>, options?: {
35
+ logResult?: boolean;
36
+ logLevel?: LogLevel;
37
+ }): Promise<T>;
38
+ logRequest(method: string, url: string, statusCode?: number, duration?: number): void;
39
+ flush(): Promise<void>;
40
+ getStats(): {
41
+ activeTimers: number;
42
+ activeSpans: number;
43
+ config: LoggerConfig;
44
+ };
45
+ protected output(message: string, level: LogLevel): void;
46
+ private log;
47
+ private getHttpLogLevel;
48
+ }
49
+ //#endregion
50
+ export { Logger };
51
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","names":[],"sources":["../src/logger.ts"],"sourcesContent":[],"mappings":"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"}