evlog 2.15.0 → 2.17.0

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 (169) hide show
  1. package/README.md +7 -7
  2. package/dist/adapters/axiom.d.mts +1 -1
  3. package/dist/adapters/axiom.mjs +4 -2
  4. package/dist/adapters/axiom.mjs.map +1 -1
  5. package/dist/adapters/better-stack.d.mts +1 -1
  6. package/dist/adapters/better-stack.mjs +4 -2
  7. package/dist/adapters/better-stack.mjs.map +1 -1
  8. package/dist/adapters/datadog.d.mts +1 -1
  9. package/dist/adapters/datadog.mjs +4 -2
  10. package/dist/adapters/datadog.mjs.map +1 -1
  11. package/dist/adapters/fs.d.mts +64 -2
  12. package/dist/adapters/fs.d.mts.map +1 -1
  13. package/dist/adapters/fs.mjs +222 -3
  14. package/dist/adapters/fs.mjs.map +1 -1
  15. package/dist/adapters/hyperdx.d.mts +1 -1
  16. package/dist/adapters/hyperdx.mjs +1 -1
  17. package/dist/adapters/otlp.d.mts +1 -1
  18. package/dist/adapters/otlp.mjs +6 -4
  19. package/dist/adapters/otlp.mjs.map +1 -1
  20. package/dist/adapters/posthog.d.mts +1 -1
  21. package/dist/adapters/posthog.mjs +4 -2
  22. package/dist/adapters/posthog.mjs.map +1 -1
  23. package/dist/adapters/sentry.d.mts +1 -1
  24. package/dist/adapters/sentry.mjs +5 -3
  25. package/dist/adapters/sentry.mjs.map +1 -1
  26. package/dist/ai/index.d.mts +15 -1
  27. package/dist/ai/index.d.mts.map +1 -1
  28. package/dist/ai/index.mjs +48 -16
  29. package/dist/ai/index.mjs.map +1 -1
  30. package/dist/{audit-CJl-wZ10.d.mts → audit-CC8nfazi.d.mts} +65 -3
  31. package/dist/{audit-CJl-wZ10.d.mts.map → audit-CC8nfazi.d.mts.map} +1 -1
  32. package/dist/{audit--n0QRR2Y.mjs → audit-pV5aLGP0.mjs} +2 -1
  33. package/dist/audit-pV5aLGP0.mjs.map +1 -0
  34. package/dist/better-auth/index.d.mts +14 -7
  35. package/dist/better-auth/index.d.mts.map +1 -1
  36. package/dist/better-auth/index.mjs +11 -1
  37. package/dist/better-auth/index.mjs.map +1 -1
  38. package/dist/browser.d.mts +1 -1
  39. package/dist/{define-Fp8TrdEB.d.mts → define-MSdhzmXn.d.mts} +3 -3
  40. package/dist/{define-Fp8TrdEB.d.mts.map → define-MSdhzmXn.d.mts.map} +1 -1
  41. package/dist/{dist-BIlS38vi.mjs → dist-H3GIh-KK.mjs} +1 -1
  42. package/dist/{dist-BIlS38vi.mjs.map → dist-H3GIh-KK.mjs.map} +1 -1
  43. package/dist/{drain-ByWUeOQC.mjs → drain-X7_5szSI.mjs} +6 -49
  44. package/dist/drain-X7_5szSI.mjs.map +1 -0
  45. package/dist/elysia/index.d.mts +2 -2
  46. package/dist/elysia/index.mjs +2 -2
  47. package/dist/{enricher-CLSnrzrr.d.mts → enricher-DxgML6IC.d.mts} +4 -4
  48. package/dist/{enricher-CLSnrzrr.d.mts.map → enricher-DxgML6IC.d.mts.map} +1 -1
  49. package/dist/{enricher-BA6viylF.mjs → enricher-N0erZS87.mjs} +2 -2
  50. package/dist/{enricher-BA6viylF.mjs.map → enricher-N0erZS87.mjs.map} +1 -1
  51. package/dist/enrichers.d.mts +2 -2
  52. package/dist/enrichers.mjs +1 -1
  53. package/dist/{error-C-66_G2M.d.mts → error-CpbbtyXL.d.mts} +7 -2
  54. package/dist/error-CpbbtyXL.d.mts.map +1 -0
  55. package/dist/error.d.mts +1 -1
  56. package/dist/error.mjs +8 -1
  57. package/dist/error.mjs.map +1 -1
  58. package/dist/{errors-DQoYsDW1.d.mts → errors-DySW1F9_.d.mts} +2 -2
  59. package/dist/{errors-DQoYsDW1.d.mts.map → errors-DySW1F9_.d.mts.map} +1 -1
  60. package/dist/{event-ef-5Dbxg.mjs → event-1BMl7o0k.mjs} +4 -2
  61. package/dist/event-1BMl7o0k.mjs.map +1 -0
  62. package/dist/express/index.d.mts +2 -2
  63. package/dist/express/index.d.mts.map +1 -1
  64. package/dist/express/index.mjs +5 -6
  65. package/dist/express/index.mjs.map +1 -1
  66. package/dist/fastify/index.d.mts +2 -2
  67. package/dist/fastify/index.mjs +2 -2
  68. package/dist/{fork-D44V93-K.mjs → fork-8u_zFOJq.mjs} +3 -3
  69. package/dist/{fork-D44V93-K.mjs.map → fork-8u_zFOJq.mjs.map} +1 -1
  70. package/dist/hono/index.d.mts +2 -2
  71. package/dist/hono/index.mjs +1 -1
  72. package/dist/http-6umVAKDW.mjs +82 -0
  73. package/dist/http-6umVAKDW.mjs.map +1 -0
  74. package/dist/http.d.mts +1 -1
  75. package/dist/http.mjs +1 -0
  76. package/dist/http.mjs.map +1 -1
  77. package/dist/index-o1_z4phv.d.mts +213 -0
  78. package/dist/index-o1_z4phv.d.mts.map +1 -0
  79. package/dist/index.d.mts +9 -8
  80. package/dist/index.mjs +210 -2
  81. package/dist/index.mjs.map +1 -0
  82. package/dist/{integration-Bz8X6_Lb.mjs → integration-DTZtjSqh.mjs} +2 -2
  83. package/dist/{integration-Bz8X6_Lb.mjs.map → integration-DTZtjSqh.mjs.map} +1 -1
  84. package/dist/{logger-Brt5-WMK.d.mts → logger-DntcxxHg.d.mts} +2 -2
  85. package/dist/{logger-Brt5-WMK.d.mts.map → logger-DntcxxHg.d.mts.map} +1 -1
  86. package/dist/logger.d.mts +1 -1
  87. package/dist/logger.mjs +1 -1
  88. package/dist/{middleware-CGM-bOvE.d.mts → middleware-U-lIAzHg.d.mts} +2 -2
  89. package/dist/{middleware-CGM-bOvE.d.mts.map → middleware-U-lIAzHg.d.mts.map} +1 -1
  90. package/dist/nestjs/index.d.mts +2 -2
  91. package/dist/nestjs/index.d.mts.map +1 -1
  92. package/dist/nestjs/index.mjs +4 -5
  93. package/dist/nestjs/index.mjs.map +1 -1
  94. package/dist/next/client.d.mts +1 -1
  95. package/dist/next/index.d.mts +4 -4
  96. package/dist/next/index.mjs +3 -3
  97. package/dist/next/instrumentation.d.mts +1 -1
  98. package/dist/next/instrumentation.mjs +1 -1
  99. package/dist/next/stream.d.mts +29 -0
  100. package/dist/next/stream.d.mts.map +1 -0
  101. package/dist/next/stream.mjs +78 -0
  102. package/dist/next/stream.mjs.map +1 -0
  103. package/dist/nitro/errorHandler.mjs +1 -1
  104. package/dist/nitro/module.d.mts +2 -2
  105. package/dist/nitro/plugin.mjs +12 -3
  106. package/dist/nitro/plugin.mjs.map +1 -1
  107. package/dist/nitro/v3/errorHandler.mjs +2 -2
  108. package/dist/nitro/v3/index.d.mts +2 -2
  109. package/dist/nitro/v3/module.d.mts +1 -1
  110. package/dist/nitro/v3/plugin.mjs +4 -4
  111. package/dist/nitro/v3/useLogger.d.mts +1 -1
  112. package/dist/{nitro-DavLelNz.mjs → nitro-DErMq_Zj.mjs} +1 -1
  113. package/dist/{nitro-DavLelNz.mjs.map → nitro-DErMq_Zj.mjs.map} +1 -1
  114. package/dist/{nitro-DHPb9dXG.d.mts → nitro-oZre8ab3.d.mts} +2 -2
  115. package/dist/{nitro-DHPb9dXG.d.mts.map → nitro-oZre8ab3.d.mts.map} +1 -1
  116. package/dist/{nitroConfigBridge-aZ1e5upQ.mjs → nitroConfigBridge-DKk7eOn-.mjs} +1 -1
  117. package/dist/{nitroConfigBridge-aZ1e5upQ.mjs.map → nitroConfigBridge-DKk7eOn-.mjs.map} +1 -1
  118. package/dist/nodeResponse-BkkionWl.mjs +42 -0
  119. package/dist/nodeResponse-BkkionWl.mjs.map +1 -0
  120. package/dist/nuxt/module.d.mts +28 -1
  121. package/dist/nuxt/module.d.mts.map +1 -1
  122. package/dist/nuxt/module.mjs +11 -4
  123. package/dist/nuxt/module.mjs.map +1 -1
  124. package/dist/package-v_MmOZeA.mjs +7 -0
  125. package/dist/package-v_MmOZeA.mjs.map +1 -0
  126. package/dist/{parseError-B1zJZvQ5.d.mts → parseError-yVZ58wIK.d.mts} +2 -2
  127. package/dist/parseError-yVZ58wIK.d.mts.map +1 -0
  128. package/dist/react-router/index.d.mts +2 -2
  129. package/dist/react-router/index.mjs +2 -2
  130. package/dist/{routes-B48wm7Pb.mjs → routes-CnIgYWf8.mjs} +1 -1
  131. package/dist/{routes-B48wm7Pb.mjs.map → routes-CnIgYWf8.mjs.map} +1 -1
  132. package/dist/runtime/client/log.d.mts +1 -1
  133. package/dist/runtime/server/routes/_evlog/ingest.post.mjs +1 -1
  134. package/dist/runtime/server/routes/_evlog/stream-info.get.d.mts +18 -0
  135. package/dist/runtime/server/routes/_evlog/stream-info.get.d.mts.map +1 -0
  136. package/dist/runtime/server/routes/_evlog/stream-info.get.mjs +28 -0
  137. package/dist/runtime/server/routes/_evlog/stream-info.get.mjs.map +1 -0
  138. package/dist/runtime/server/useLogger.d.mts +1 -1
  139. package/dist/runtime/utils/parseError.d.mts +2 -2
  140. package/dist/runtime/utils/parseError.mjs +8 -0
  141. package/dist/runtime/utils/parseError.mjs.map +1 -1
  142. package/dist/{severity-BYWZ96Sb.mjs → severity-R5Egq3qz.mjs} +1 -1
  143. package/dist/{severity-BYWZ96Sb.mjs.map → severity-R5Egq3qz.mjs.map} +1 -1
  144. package/dist/{storage-BT-3fT1-.mjs → storage-Dwinmg8P.mjs} +1 -1
  145. package/dist/{storage-BT-3fT1-.mjs.map → storage-Dwinmg8P.mjs.map} +1 -1
  146. package/dist/stream.d.mts +185 -0
  147. package/dist/stream.d.mts.map +1 -0
  148. package/dist/stream.mjs +374 -0
  149. package/dist/stream.mjs.map +1 -0
  150. package/dist/sveltekit/index.d.mts +2 -2
  151. package/dist/sveltekit/index.mjs +3 -3
  152. package/dist/toolkit.d.mts +43 -8
  153. package/dist/toolkit.d.mts.map +1 -1
  154. package/dist/toolkit.mjs +11 -10
  155. package/dist/types.d.mts +2 -2
  156. package/dist/{useLogger-Cb1R6bQE.d.mts → useLogger-BsPL4AQm.d.mts} +2 -2
  157. package/dist/{useLogger-Cb1R6bQE.d.mts.map → useLogger-BsPL4AQm.d.mts.map} +1 -1
  158. package/dist/{utils-gQCeZMbg.d.mts → utils-DLCeShxL.d.mts} +2 -2
  159. package/dist/{utils-gQCeZMbg.d.mts.map → utils-DLCeShxL.d.mts.map} +1 -1
  160. package/dist/utils.d.mts +1 -1
  161. package/dist/vite/index.d.mts +1 -1
  162. package/dist/workers.d.mts +1 -1
  163. package/dist/workers.mjs +1 -1
  164. package/package.json +17 -1
  165. package/dist/audit--n0QRR2Y.mjs.map +0 -1
  166. package/dist/drain-ByWUeOQC.mjs.map +0 -1
  167. package/dist/error-C-66_G2M.d.mts.map +0 -1
  168. package/dist/event-ef-5Dbxg.mjs.map +0 -1
  169. package/dist/parseError-B1zJZvQ5.d.mts.map +0 -1
@@ -1,5 +1,5 @@
1
1
  import { n as extractSafeNodeHeaders, t as extractSafeHeaders } from "./headers-CU-QqnYg.mjs";
2
- import { r as createMiddlewareLogger, t as attachForkToLogger } from "./fork-D44V93-K.mjs";
2
+ import { r as createMiddlewareLogger, t as attachForkToLogger } from "./fork-8u_zFOJq.mjs";
3
3
  //#region src/shared/integration.ts
4
4
  function normalizeHeaders(headers) {
5
5
  if (!headers) return void 0;
@@ -72,4 +72,4 @@ function defineFrameworkIntegration(spec) {
72
72
  //#endregion
73
73
  export { defineFrameworkIntegration as t };
74
74
 
75
- //# sourceMappingURL=integration-Bz8X6_Lb.mjs.map
75
+ //# sourceMappingURL=integration-DTZtjSqh.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"integration-Bz8X6_Lb.mjs","names":[],"sources":["../src/shared/integration.ts"],"sourcesContent":["import type { AsyncLocalStorage } from 'node:async_hooks'\nimport type { RequestLogger } from '../types'\nimport { attachForkToLogger } from './fork'\nimport { extractSafeHeaders, extractSafeNodeHeaders } from './headers'\nimport type { BaseEvlogOptions, MiddlewareLoggerOptions, MiddlewareLoggerResult } from './middleware'\nimport { createMiddlewareLogger } from './middleware'\n\n/** Request shape extracted from a framework context. */\nexport interface ExtractedRequest {\n method: string\n path: string\n /**\n * Either a Web `Headers` (Hono / Elysia / Fetch) or a Node-style\n * `IncomingHttpHeaders` record (Express / Fastify). Whichever is native\n * to the framework — it gets filtered through the safe-header helpers.\n */\n headers?: Headers | Record<string, string | string[] | undefined>\n /** Used as-is when present, otherwise auto-generated. */\n requestId?: string\n}\n\n/** Manifest passed to {@link defineFrameworkIntegration}. */\nexport interface FrameworkIntegrationSpec<TCtx> {\n /** Stable identifier used in error messages. */\n name: string\n extractRequest: (ctx: TCtx) => ExtractedRequest\n /** Attach the request logger to the framework context (`c.set('log', logger)`). */\n attachLogger: (ctx: TCtx, logger: RequestLogger) => void\n /**\n * AsyncLocalStorage instance backing `useLogger()`. Required for frameworks\n * where the logger is accessed off the request context (Express, Fastify,\n * NestJS). When set, `log.fork()` is auto-attached to the request logger.\n */\n storage?: AsyncLocalStorage<RequestLogger>\n /** Fork lifecycle hooks (only used when `storage` is set). */\n forkLifecycle?: import('./fork').ForkLifecycle\n}\n\n/** Result returned by {@link FrameworkIntegrationHelpers.start}. */\nexport interface FrameworkRequestHandle extends MiddlewareLoggerResult {\n middlewareOptions: MiddlewareLoggerOptions\n /**\n * Run the downstream handler inside the integration's storage. When no\n * storage is configured, the callback is invoked directly.\n */\n runWith: <T>(fn: () => T | Promise<T>) => Promise<T>\n}\n\n/** Helpers returned by {@link defineFrameworkIntegration}. */\nexport interface FrameworkIntegrationHelpers<TCtx> {\n start: (ctx: TCtx, options?: BaseEvlogOptions) => FrameworkRequestHandle\n}\n\nfunction normalizeHeaders(headers: ExtractedRequest['headers']): Record<string, string> | undefined {\n if (!headers) return undefined\n if (typeof (headers as Headers).forEach === 'function' && typeof (headers as Headers).get === 'function') {\n return extractSafeHeaders(headers as Headers)\n }\n return extractSafeNodeHeaders(headers as Record<string, string | string[] | undefined>)\n}\n\n/**\n * Build a manifest-driven framework integration. Captures the boilerplate\n * every middleware shares (request extraction, logger setup, attachment,\n * optional AsyncLocalStorage wrapping). The framework still owns its own\n * middleware function — it just declares *what* to extract and *where* to\n * attach the logger.\n *\n * @example\n * ```ts\n * const integration = defineFrameworkIntegration<HonoContext>({\n * name: 'hono',\n * extractRequest: (c) => ({\n * method: c.req.method,\n * path: c.req.path,\n * headers: c.req.raw.headers,\n * requestId: c.req.header('x-request-id'),\n * }),\n * attachLogger: (c, logger) => c.set('log', logger),\n * })\n *\n * export function evlog(options?: BaseEvlogOptions): MiddlewareHandler {\n * return async (c, next) => {\n * const { skipped, finish, runWith } = integration.start(c, options)\n * if (skipped) return next()\n * try {\n * await runWith(() => next())\n * await finish({ status: c.res.status })\n * } catch (error) {\n * await finish({ error: error as Error })\n * throw error\n * }\n * }\n * }\n * ```\n */\nexport function defineFrameworkIntegration<TCtx>(\n spec: FrameworkIntegrationSpec<TCtx>,\n): FrameworkIntegrationHelpers<TCtx> {\n return {\n start(ctx, options = {}) {\n const extracted = spec.extractRequest(ctx)\n const headers = normalizeHeaders(extracted.headers)\n const middlewareOptions: MiddlewareLoggerOptions = {\n method: extracted.method,\n path: extracted.path,\n requestId: extracted.requestId || crypto.randomUUID(),\n headers,\n ...options,\n }\n const result = createMiddlewareLogger(middlewareOptions)\n\n if (!result.skipped) {\n if (spec.storage) {\n attachForkToLogger(spec.storage, result.logger, middlewareOptions, spec.forkLifecycle)\n }\n spec.attachLogger(ctx, result.logger)\n }\n\n const { storage } = spec\n const runWith = async <T>(fn: () => T | Promise<T>): Promise<T> => {\n if (!storage || result.skipped) return await fn()\n return await storage.run(result.logger, fn)\n }\n\n return { ...result, middlewareOptions, runWith }\n },\n }\n}\n"],"mappings":";;;AAqDA,SAAS,iBAAiB,SAA0E;AAClG,KAAI,CAAC,QAAS,QAAO,KAAA;AACrB,KAAI,OAAQ,QAAoB,YAAY,cAAc,OAAQ,QAAoB,QAAQ,WAC5F,QAAO,mBAAmB,QAAmB;AAE/C,QAAO,uBAAuB,QAAyD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsCzF,SAAgB,2BACd,MACmC;AACnC,QAAO,EACL,MAAM,KAAK,UAAU,EAAE,EAAE;EACvB,MAAM,YAAY,KAAK,eAAe,IAAI;EAC1C,MAAM,UAAU,iBAAiB,UAAU,QAAQ;EACnD,MAAM,oBAA6C;GACjD,QAAQ,UAAU;GAClB,MAAM,UAAU;GAChB,WAAW,UAAU,aAAa,OAAO,YAAY;GACrD;GACA,GAAG;GACJ;EACD,MAAM,SAAS,uBAAuB,kBAAkB;AAExD,MAAI,CAAC,OAAO,SAAS;AACnB,OAAI,KAAK,QACP,oBAAmB,KAAK,SAAS,OAAO,QAAQ,mBAAmB,KAAK,cAAc;AAExF,QAAK,aAAa,KAAK,OAAO,OAAO;;EAGvC,MAAM,EAAE,YAAY;EACpB,MAAM,UAAU,OAAU,OAAyC;AACjE,OAAI,CAAC,WAAW,OAAO,QAAS,QAAO,MAAM,IAAI;AACjD,UAAO,MAAM,QAAQ,IAAI,OAAO,QAAQ,GAAG;;AAG7C,SAAO;GAAE,GAAG;GAAQ;GAAmB;GAAS;IAEnD"}
1
+ {"version":3,"file":"integration-DTZtjSqh.mjs","names":[],"sources":["../src/shared/integration.ts"],"sourcesContent":["import type { AsyncLocalStorage } from 'node:async_hooks'\nimport type { RequestLogger } from '../types'\nimport { attachForkToLogger } from './fork'\nimport { extractSafeHeaders, extractSafeNodeHeaders } from './headers'\nimport type { BaseEvlogOptions, MiddlewareLoggerOptions, MiddlewareLoggerResult } from './middleware'\nimport { createMiddlewareLogger } from './middleware'\n\n/** Request shape extracted from a framework context. */\nexport interface ExtractedRequest {\n method: string\n path: string\n /**\n * Either a Web `Headers` (Hono / Elysia / Fetch) or a Node-style\n * `IncomingHttpHeaders` record (Express / Fastify). Whichever is native\n * to the framework — it gets filtered through the safe-header helpers.\n */\n headers?: Headers | Record<string, string | string[] | undefined>\n /** Used as-is when present, otherwise auto-generated. */\n requestId?: string\n}\n\n/** Manifest passed to {@link defineFrameworkIntegration}. */\nexport interface FrameworkIntegrationSpec<TCtx> {\n /** Stable identifier used in error messages. */\n name: string\n extractRequest: (ctx: TCtx) => ExtractedRequest\n /** Attach the request logger to the framework context (`c.set('log', logger)`). */\n attachLogger: (ctx: TCtx, logger: RequestLogger) => void\n /**\n * AsyncLocalStorage instance backing `useLogger()`. Required for frameworks\n * where the logger is accessed off the request context (Express, Fastify,\n * NestJS). When set, `log.fork()` is auto-attached to the request logger.\n */\n storage?: AsyncLocalStorage<RequestLogger>\n /** Fork lifecycle hooks (only used when `storage` is set). */\n forkLifecycle?: import('./fork').ForkLifecycle\n}\n\n/** Result returned by {@link FrameworkIntegrationHelpers.start}. */\nexport interface FrameworkRequestHandle extends MiddlewareLoggerResult {\n middlewareOptions: MiddlewareLoggerOptions\n /**\n * Run the downstream handler inside the integration's storage. When no\n * storage is configured, the callback is invoked directly.\n */\n runWith: <T>(fn: () => T | Promise<T>) => Promise<T>\n}\n\n/** Helpers returned by {@link defineFrameworkIntegration}. */\nexport interface FrameworkIntegrationHelpers<TCtx> {\n start: (ctx: TCtx, options?: BaseEvlogOptions) => FrameworkRequestHandle\n}\n\nfunction normalizeHeaders(headers: ExtractedRequest['headers']): Record<string, string> | undefined {\n if (!headers) return undefined\n if (typeof (headers as Headers).forEach === 'function' && typeof (headers as Headers).get === 'function') {\n return extractSafeHeaders(headers as Headers)\n }\n return extractSafeNodeHeaders(headers as Record<string, string | string[] | undefined>)\n}\n\n/**\n * Build a manifest-driven framework integration. Captures the boilerplate\n * every middleware shares (request extraction, logger setup, attachment,\n * optional AsyncLocalStorage wrapping). The framework still owns its own\n * middleware function — it just declares *what* to extract and *where* to\n * attach the logger.\n *\n * @example\n * ```ts\n * const integration = defineFrameworkIntegration<HonoContext>({\n * name: 'hono',\n * extractRequest: (c) => ({\n * method: c.req.method,\n * path: c.req.path,\n * headers: c.req.raw.headers,\n * requestId: c.req.header('x-request-id'),\n * }),\n * attachLogger: (c, logger) => c.set('log', logger),\n * })\n *\n * export function evlog(options?: BaseEvlogOptions): MiddlewareHandler {\n * return async (c, next) => {\n * const { skipped, finish, runWith } = integration.start(c, options)\n * if (skipped) return next()\n * try {\n * await runWith(() => next())\n * await finish({ status: c.res.status })\n * } catch (error) {\n * await finish({ error: error as Error })\n * throw error\n * }\n * }\n * }\n * ```\n */\nexport function defineFrameworkIntegration<TCtx>(\n spec: FrameworkIntegrationSpec<TCtx>,\n): FrameworkIntegrationHelpers<TCtx> {\n return {\n start(ctx, options = {}) {\n const extracted = spec.extractRequest(ctx)\n const headers = normalizeHeaders(extracted.headers)\n const middlewareOptions: MiddlewareLoggerOptions = {\n method: extracted.method,\n path: extracted.path,\n requestId: extracted.requestId || crypto.randomUUID(),\n headers,\n ...options,\n }\n const result = createMiddlewareLogger(middlewareOptions)\n\n if (!result.skipped) {\n if (spec.storage) {\n attachForkToLogger(spec.storage, result.logger, middlewareOptions, spec.forkLifecycle)\n }\n spec.attachLogger(ctx, result.logger)\n }\n\n const { storage } = spec\n const runWith = async <T>(fn: () => T | Promise<T>): Promise<T> => {\n if (!storage || result.skipped) return await fn()\n return await storage.run(result.logger, fn)\n }\n\n return { ...result, middlewareOptions, runWith }\n },\n }\n}\n"],"mappings":";;;AAqDA,SAAS,iBAAiB,SAA0E;AAClG,KAAI,CAAC,QAAS,QAAO,KAAA;AACrB,KAAI,OAAQ,QAAoB,YAAY,cAAc,OAAQ,QAAoB,QAAQ,WAC5F,QAAO,mBAAmB,QAAmB;AAE/C,QAAO,uBAAuB,QAAyD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsCzF,SAAgB,2BACd,MACmC;AACnC,QAAO,EACL,MAAM,KAAK,UAAU,EAAE,EAAE;EACvB,MAAM,YAAY,KAAK,eAAe,IAAI;EAC1C,MAAM,UAAU,iBAAiB,UAAU,QAAQ;EACnD,MAAM,oBAA6C;GACjD,QAAQ,UAAU;GAClB,MAAM,UAAU;GAChB,WAAW,UAAU,aAAa,OAAO,YAAY;GACrD;GACA,GAAG;GACJ;EACD,MAAM,SAAS,uBAAuB,kBAAkB;AAExD,MAAI,CAAC,OAAO,SAAS;AACnB,OAAI,KAAK,QACP,oBAAmB,KAAK,SAAS,OAAO,QAAQ,mBAAmB,KAAK,cAAc;AAExF,QAAK,aAAa,KAAK,OAAO,OAAO;;EAGvC,MAAM,EAAE,YAAY;EACpB,MAAM,UAAU,OAAU,OAAyC;AACjE,OAAI,CAAC,WAAW,OAAO,QAAS,QAAO,MAAM,IAAI;AACjD,UAAO,MAAM,QAAQ,IAAI,OAAO,QAAQ,GAAG;;AAG7C,SAAO;GAAE,GAAG;GAAQ;GAAmB;GAAS;IAEnD"}
@@ -1,4 +1,4 @@
1
- import { F as DrainContext, G as LoggerConfig, L as EnvironmentContext, U as Log, X as RequestLoggerOptions, nt as TailSamplingContext, st as PluginRunner, u as AuditableLogger } from "./audit-CJl-wZ10.mjs";
1
+ import { G as Log, I as DrainContext, R as EnvironmentContext, dt as PluginRunner, et as RequestLoggerOptions, ot as TailSamplingContext, q as LoggerConfig, u as AuditableLogger } from "./audit-CC8nfazi.mjs";
2
2
 
3
3
  //#region src/logger.d.ts
4
4
  /**
@@ -111,4 +111,4 @@ declare function createRequestLogger<T extends object = Record<string, unknown>>
111
111
  declare function getEnvironment(): EnvironmentContext;
112
112
  //#endregion
113
113
  export { getGlobalDrain as a, isEnabled as c, shouldKeep as d, getEnvironment as i, isLoggerLocked as l, createLogger as n, getGlobalPluginRunner as o, createRequestLogger as r, initLogger as s, _log as t, lockLogger as u };
114
- //# sourceMappingURL=logger-Brt5-WMK.d.mts.map
114
+ //# sourceMappingURL=logger-DntcxxHg.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"logger-Brt5-WMK.d.mts","names":[],"sources":["../src/logger.ts"],"mappings":";;;AAgEA;;;;AAAA,iBAAgB,UAAA,CAAW,MAAA,GAAQ,YAAA;AAsCnC;;;;;AAAA,iBAAgB,qBAAA,CAAA,GAAyB,YAAA;;;;iBAOzB,SAAA,CAAA;AAShB;;;;;AAAA,iBAAgB,UAAA,CAAA;;;;iBAOA,cAAA,CAAA;AAShB;;;;;AAAA,iBAAgB,cAAA,CAAA,KAAoB,GAAA,EAAK,YAAA,YAAwB,OAAA;;;;AA8BjE;iBAAgB,UAAA,CAAW,GAAA,EAAK,mBAAA;;;;AAgB/B;;;;;AAiYqB;cAPhB,IAAA,EAAM,GAAA;;;;UA2BF,2BAAA;EASK;;;AAkBf;EAtBE,WAAA;EAsB0B;;;EAlB1B,SAAA,IAAa,OAAA,EAAS,OAAA;AAAA;;;;;;;;;;;;;;AAgNxB;;iBA9LgB,YAAA,oBAAgC,MAAA,kBAAA,CAAyB,cAAA,GAAgB,MAAA,mBAA8B,eAAA,GAAkB,2BAAA,GAA8B,eAAA,CAAgB,CAAA;;;;;;;;;;;;;;;;;;AA6MvL;;;;;;;;;;iBAfgB,mBAAA,oBAAuC,MAAA,kBAAA,CAAyB,OAAA,GAAS,oBAAA,EAA2B,eAAA,GAAkB,2BAAA,GAA8B,eAAA,CAAgB,CAAA;;;;iBAepK,cAAA,CAAA,GAAkB,kBAAA"}
1
+ {"version":3,"file":"logger-DntcxxHg.d.mts","names":[],"sources":["../src/logger.ts"],"mappings":";;;AAgEA;;;;AAAA,iBAAgB,UAAA,CAAW,MAAA,GAAQ,YAAA;AAsCnC;;;;;AAAA,iBAAgB,qBAAA,CAAA,GAAyB,YAAA;;;;iBAOzB,SAAA,CAAA;AAShB;;;;;AAAA,iBAAgB,UAAA,CAAA;;;;iBAOA,cAAA,CAAA;AAShB;;;;;AAAA,iBAAgB,cAAA,CAAA,KAAoB,GAAA,EAAK,YAAA,YAAwB,OAAA;;;;AA8BjE;iBAAgB,UAAA,CAAW,GAAA,EAAK,mBAAA;;;;AAgB/B;;;;;AAiYqB;cAPhB,IAAA,EAAM,GAAA;;;;UA2BF,2BAAA;EASK;;;AAkBf;EAtBE,WAAA;EAsB0B;;;EAlB1B,SAAA,IAAa,OAAA,EAAS,OAAA;AAAA;;;;;;;;;;;;;;AAgNxB;;iBA9LgB,YAAA,oBAAgC,MAAA,kBAAA,CAAyB,cAAA,GAAgB,MAAA,mBAA8B,eAAA,GAAkB,2BAAA,GAA8B,eAAA,CAAgB,CAAA;;;;;;;;;;;;;;;;;;AA6MvL;;;;;;;;;;iBAfgB,mBAAA,oBAAuC,MAAA,kBAAA,CAAyB,OAAA,GAAS,oBAAA,EAA2B,eAAA,GAAkB,2BAAA,GAA8B,eAAA,CAAgB,CAAA;;;;iBAepK,cAAA,CAAA,GAAkB,kBAAA"}
package/dist/logger.d.mts CHANGED
@@ -1,2 +1,2 @@
1
- import { a as getGlobalDrain, c as isEnabled, d as shouldKeep, i as getEnvironment, l as isLoggerLocked, n as createLogger, o as getGlobalPluginRunner, r as createRequestLogger, s as initLogger, t as _log, u as lockLogger } from "./logger-Brt5-WMK.mjs";
1
+ import { a as getGlobalDrain, c as isEnabled, d as shouldKeep, i as getEnvironment, l as isLoggerLocked, n as createLogger, o as getGlobalPluginRunner, r as createRequestLogger, s as initLogger, t as _log, u as lockLogger } from "./logger-DntcxxHg.mjs";
2
2
  export { createLogger, createRequestLogger, getEnvironment, getGlobalDrain, getGlobalPluginRunner, initLogger, isEnabled, isLoggerLocked, lockLogger, _log as log, shouldKeep };
package/dist/logger.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import { C as lockLogger, S as isLoggerLocked, _ as getEnvironment, b as initLogger, g as createRequestLogger, h as createLogger, m as _log, v as getGlobalDrain, w as shouldKeep, x as isEnabled, y as getGlobalPluginRunner } from "./audit--n0QRR2Y.mjs";
1
+ import { C as lockLogger, S as isLoggerLocked, _ as getEnvironment, b as initLogger, g as createRequestLogger, h as createLogger, m as _log, v as getGlobalDrain, w as shouldKeep, x as isEnabled, y as getGlobalPluginRunner } from "./audit-pV5aLGP0.mjs";
2
2
  export { createLogger, createRequestLogger, getEnvironment, getGlobalDrain, getGlobalPluginRunner, initLogger, isEnabled, isLoggerLocked, lockLogger, _log as log, shouldKeep };
@@ -1,4 +1,4 @@
1
- import { F as DrainContext, I as EnrichContext, Y as RequestLogger, Z as RouteConfig, it as WideEvent, nt as TailSamplingContext, ot as EvlogPlugin, q as RedactConfig, st as PluginRunner } from "./audit-CJl-wZ10.mjs";
1
+ import { $ as RequestLogger, I as DrainContext, L as EnrichContext, Y as RedactConfig, ct as WideEvent, dt as PluginRunner, ot as TailSamplingContext, tt as RouteConfig, ut as EvlogPlugin } from "./audit-CC8nfazi.mjs";
2
2
 
3
3
  //#region src/shared/middleware.d.ts
4
4
  /**
@@ -69,4 +69,4 @@ declare function runEnrichAndDrain(emittedEvent: WideEvent, options: MiddlewareL
69
69
  declare function createMiddlewareLogger(options: MiddlewareLoggerOptions): MiddlewareLoggerResult;
70
70
  //#endregion
71
71
  export { resolveMiddlewarePluginRunner as a, createMiddlewareLogger as i, MiddlewareLoggerOptions as n, runEnrichAndDrain as o, MiddlewareLoggerResult as r, BaseEvlogOptions as t };
72
- //# sourceMappingURL=middleware-CGM-bOvE.d.mts.map
72
+ //# sourceMappingURL=middleware-U-lIAzHg.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"middleware-CGM-bOvE.d.mts","names":[],"sources":["../src/shared/middleware.ts"],"mappings":";;;;AAYA;;;UAAiB,gBAAA;EAMN;EAJT,OAAA;EAMsC;EAJtC,OAAA;EAMwC;EAJxC,MAAA,GAAS,MAAA,SAAe,WAAA;EAMoB;EAJ5C,KAAA,IAAS,GAAA,EAAK,YAAA,YAAwB,OAAA;EAW5B;EATV,MAAA,IAAU,GAAA,EAAK,aAAA,YAAyB,OAAA;EASnB;EAPrB,IAAA,IAAQ,GAAA,EAAK,mBAAA,YAA+B,OAAA;EAR5C;;;;EAaA,MAAA,aAAmB,YAAA;EATL;EAWd,OAAA,GAAU,WAAA;AAAA;;UAIK,uBAAA,SAAgC,gBAAA;EAC/C,MAAA;EACA,IAAA;EACA,SAAA;EAda;EAgBb,OAAA,GAAU,MAAA;AAAA;AAAA,UAGK,sBAAA;EACf,MAAA,EAAQ,aAAA;EACR,MAAA,GAAS,IAAA;IAAS,MAAA;IAAiB,KAAA,GAAQ,KAAA;EAAA,MAAY,OAAA,CAAQ,SAAA;EAC/D,OAAA;AAAA;;;;;iBA6Bc,6BAAA,CAA8B,OAAA;EAAW,OAAA,GAAU,WAAA;AAAA,IAAkB,YAAA;;;;AAhCrF;iBAuDsB,iBAAA,CACpB,YAAA,EAAc,SAAA,EACd,OAAA,EAAS,uBAAA,EACT,WAAA;EAAe,MAAA;EAAgB,IAAA;EAAc,SAAA;AAAA,GAC7C,cAAA,WACA,OAAA,GAAU,YAAA,GACT,OAAA;;;;;;;;;iBA8Da,sBAAA,CAAuB,OAAA,EAAS,uBAAA,GAA0B,sBAAA"}
1
+ {"version":3,"file":"middleware-U-lIAzHg.d.mts","names":[],"sources":["../src/shared/middleware.ts"],"mappings":";;;;AAYA;;;UAAiB,gBAAA;EAMN;EAJT,OAAA;EAMsC;EAJtC,OAAA;EAMwC;EAJxC,MAAA,GAAS,MAAA,SAAe,WAAA;EAMoB;EAJ5C,KAAA,IAAS,GAAA,EAAK,YAAA,YAAwB,OAAA;EAW5B;EATV,MAAA,IAAU,GAAA,EAAK,aAAA,YAAyB,OAAA;EASnB;EAPrB,IAAA,IAAQ,GAAA,EAAK,mBAAA,YAA+B,OAAA;EAR5C;;;;EAaA,MAAA,aAAmB,YAAA;EATL;EAWd,OAAA,GAAU,WAAA;AAAA;;UAIK,uBAAA,SAAgC,gBAAA;EAC/C,MAAA;EACA,IAAA;EACA,SAAA;EAda;EAgBb,OAAA,GAAU,MAAA;AAAA;AAAA,UAGK,sBAAA;EACf,MAAA,EAAQ,aAAA;EACR,MAAA,GAAS,IAAA;IAAS,MAAA;IAAiB,KAAA,GAAQ,KAAA;EAAA,MAAY,OAAA,CAAQ,SAAA;EAC/D,OAAA;AAAA;;;;;iBA6Bc,6BAAA,CAA8B,OAAA;EAAW,OAAA,GAAU,WAAA;AAAA,IAAkB,YAAA;;;;AAhCrF;iBAuDsB,iBAAA,CACpB,YAAA,EAAc,SAAA,EACd,OAAA,EAAS,uBAAA,EACT,WAAA;EAAe,MAAA;EAAgB,IAAA;EAAc,SAAA;AAAA,GAC7C,cAAA,WACA,OAAA,GAAU,YAAA,GACT,OAAA;;;;;;;;;iBA8Da,sBAAA,CAAuB,OAAA,EAAS,uBAAA,GAA0B,sBAAA"}
@@ -1,5 +1,5 @@
1
- import { Y as RequestLogger } from "../audit-CJl-wZ10.mjs";
2
- import { t as BaseEvlogOptions } from "../middleware-CGM-bOvE.mjs";
1
+ import { $ as RequestLogger } from "../audit-CC8nfazi.mjs";
2
+ import { t as BaseEvlogOptions } from "../middleware-U-lIAzHg.mjs";
3
3
  import { DynamicModule, MiddlewareConsumer, NestModule } from "@nestjs/common";
4
4
 
5
5
  //#region src/nestjs/index.d.ts
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/nestjs/index.ts"],"mappings":";;;;;cASiB,SAAA,sBAAS,MAAA,wBAAA,aAAA,CAAA,CAAA;AAAA,KAId,kBAAA,GAAqB,gBAAA;AAAA,UAIhB,uBAAA;EANhB;EAQC,OAAA;EAVwB;EAYxB,UAAA,MAAgB,IAAA,YAAgB,kBAAA,GAAqB,OAAA,CAAQ,kBAAA;EAZrC;EAcxB,MAAA;AAAA;AAAA;EAAA,UAIU,eAAA;IACR,GAAA,GAAM,aAAA;EAAA;AAAA;AAAA;EAAA,UAKE,OAAA;IACR,GAAA,GAAM,aAAA;EAAA;AAAA;AAjBV;;;;;;;;;;;;;;;;;AAOC;;;;;;;AAPD,cA4Ea,WAAA,YAAuB,UAAA;EAAA,eAEnB,OAAA;EAnEM;AAAA;;;;;;;;;;EAAA,OAgFd,OAAA,CAAQ,OAAA,GAAS,kBAAA,GAA0B,aAAA;EAf3B;;;;;;;;;;;;;;EAAA,OAqChB,YAAA,CAAa,YAAA,EAAc,uBAAA,GAA0B,aAAA;EAkB5D,SAAA,CAAU,QAAA,EAAU,kBAAA;AAAA"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/nestjs/index.ts"],"mappings":";;;;;cAUiB,SAAA,sBAAS,MAAA,wBAAA,aAAA,CAAA,CAAA;AAAA,KAId,kBAAA,GAAqB,gBAAA;AAAA,UAIhB,uBAAA;EANhB;EAQC,OAAA;EAVwB;EAYxB,UAAA,MAAgB,IAAA,YAAgB,kBAAA,GAAqB,OAAA,CAAQ,kBAAA;EAZrC;EAcxB,MAAA;AAAA;AAAA;EAAA,UAIU,eAAA;IACR,GAAA,GAAM,aAAA;EAAA;AAAA;AAAA;EAAA,UAKE,OAAA;IACR,GAAA,GAAM,aAAA;EAAA;AAAA;AAjBV;;;;;;;;;;;;;;;;;AAOC;;;;;;;AAPD,cA0Ea,WAAA,YAAuB,UAAA;EAAA,eAEnB,OAAA;EAjEM;AAAA;;;;;;;;;;EAAA,OA8Ed,OAAA,CAAQ,OAAA,GAAS,kBAAA,GAA0B,aAAA;EAf3B;;;;;;;;;;;;;;EAAA,OAqChB,YAAA,CAAa,YAAA,EAAc,uBAAA,GAA0B,aAAA;EAkB5D,SAAA,CAAU,QAAA,EAAU,kBAAA;AAAA"}
@@ -1,6 +1,7 @@
1
1
  import { n as extractSafeNodeHeaders } from "../headers-CU-QqnYg.mjs";
2
- import { r as createMiddlewareLogger, t as attachForkToLogger } from "../fork-D44V93-K.mjs";
3
- import { t as createLoggerStorage } from "../storage-BT-3fT1-.mjs";
2
+ import { r as createMiddlewareLogger, t as attachForkToLogger } from "../fork-8u_zFOJq.mjs";
3
+ import { t as bindNodeResponseLifecycle } from "../nodeResponse-BkkionWl.mjs";
4
+ import { t as createLoggerStorage } from "../storage-Dwinmg8P.mjs";
4
5
  //#region src/nestjs/index.ts
5
6
  const { storage, useLogger } = createLoggerStorage("middleware context. Make sure EvlogModule.forRoot() is imported in your AppModule.");
6
7
  function createEvlogMiddleware(getOptions) {
@@ -22,9 +23,7 @@ function createEvlogMiddleware(getOptions) {
22
23
  }
23
24
  attachForkToLogger(storage, logger, middlewareOpts);
24
25
  req.log = logger;
25
- res.on("finish", () => {
26
- finish({ status: res.statusCode }).catch(() => {});
27
- });
26
+ bindNodeResponseLifecycle(res, logger, finish);
28
27
  storage.run(logger, () => next());
29
28
  };
30
29
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../src/nestjs/index.ts"],"sourcesContent":["import type { ServerResponse } from 'node:http'\nimport type { Request } from 'express'\nimport type { DynamicModule, MiddlewareConsumer, NestModule } from '@nestjs/common'\nimport type { RequestLogger } from '../types'\nimport { createMiddlewareLogger, type BaseEvlogOptions } from '../shared/middleware'\nimport { attachForkToLogger } from '../shared/fork'\nimport { extractSafeNodeHeaders } from '../shared/headers'\nimport { createLoggerStorage } from '../shared/storage'\n\nconst { storage, useLogger } = createLoggerStorage(\n 'middleware context. Make sure EvlogModule.forRoot() is imported in your AppModule.',\n)\n\nexport type EvlogNestJSOptions = BaseEvlogOptions\n\nexport { useLogger }\n\nexport interface EvlogModuleAsyncOptions {\n /** Modules to import (for dependency injection into the factory) */\n imports?: any[]\n /** Factory function that returns evlog options. Can be async. */\n useFactory: (...args: any[]) => EvlogNestJSOptions | Promise<EvlogNestJSOptions>\n /** Injection tokens to resolve and pass to the factory */\n inject?: any[]\n}\n\ndeclare module 'http' {\n interface IncomingMessage {\n log?: RequestLogger\n }\n}\n\ndeclare module 'express-serve-static-core' {\n interface Request {\n log?: RequestLogger\n }\n}\n\nfunction createEvlogMiddleware(getOptions: () => EvlogNestJSOptions) {\n return (req: Request, res: ServerResponse, next: () => void) => {\n const options = getOptions()\n const headers = extractSafeNodeHeaders(req.headers)\n const url = new URL(req.originalUrl || req.url || '/', 'http://localhost')\n\n const middlewareOpts = {\n method: req.method || 'GET',\n path: url.pathname,\n requestId: headers['x-request-id'] || crypto.randomUUID(),\n headers,\n ...options,\n }\n const { logger, finish, skipped } = createMiddlewareLogger(middlewareOpts)\n\n if (skipped) {\n next()\n return\n }\n\n attachForkToLogger(storage, logger, middlewareOpts)\n req.log = logger\n\n res.on('finish', () => {\n finish({ status: res.statusCode }).catch(() => {})\n })\n\n storage.run(logger, () => next())\n }\n}\n\n/**\n * NestJS module for evlog wide event logging.\n *\n * Registers a global middleware that creates a request-scoped logger\n * for every incoming request. Use `useLogger()` to access it anywhere\n * in the call stack, or `req.log` directly in controllers.\n *\n * @example\n * ```ts\n * import { Module } from '@nestjs/common'\n * import { EvlogModule } from 'evlog/nestjs'\n * import { createAxiomDrain } from 'evlog/axiom'\n *\n * @Module({\n * imports: [\n * EvlogModule.forRoot({\n * drain: createAxiomDrain(),\n * exclude: ['/health'],\n * }),\n * ],\n * })\n * export class AppModule {}\n * ```\n */\nexport class EvlogModule implements NestModule {\n\n private static options: EvlogNestJSOptions = {}\n\n /**\n * Register evlog with static configuration.\n *\n * @example\n * ```ts\n * EvlogModule.forRoot({\n * drain: createAxiomDrain(),\n * enrich: (ctx) => { ctx.event.region = process.env.FLY_REGION },\n * })\n * ```\n */\n static forRoot(options: EvlogNestJSOptions = {}): DynamicModule {\n EvlogModule.options = options\n return {\n module: EvlogModule,\n global: true,\n }\n }\n\n /**\n * Register evlog with async configuration (e.g. from `ConfigService`).\n *\n * @example\n * ```ts\n * EvlogModule.forRootAsync({\n * imports: [ConfigModule],\n * inject: [ConfigService],\n * useFactory: (config: ConfigService) => ({\n * drain: createAxiomDrain({ token: config.get('AXIOM_TOKEN') }),\n * }),\n * })\n * ```\n */\n static forRootAsync(asyncOptions: EvlogModuleAsyncOptions): DynamicModule {\n return {\n module: EvlogModule,\n imports: asyncOptions.imports || [],\n providers: [\n {\n provide: 'EVLOG_OPTIONS',\n useFactory: async (...args: any[]) => {\n EvlogModule.options = await asyncOptions.useFactory(...args)\n return EvlogModule.options\n },\n inject: asyncOptions.inject || [],\n },\n ],\n global: true,\n }\n }\n\n configure(consumer: MiddlewareConsumer): void {\n consumer\n .apply(createEvlogMiddleware(() => EvlogModule.options))\n .forRoutes('*')\n }\n\n}\n"],"mappings":";;;;AASA,MAAM,EAAE,SAAS,cAAc,oBAC7B,qFACD;AA2BD,SAAS,sBAAsB,YAAsC;AACnE,SAAQ,KAAc,KAAqB,SAAqB;EAC9D,MAAM,UAAU,YAAY;EAC5B,MAAM,UAAU,uBAAuB,IAAI,QAAQ;EACnD,MAAM,MAAM,IAAI,IAAI,IAAI,eAAe,IAAI,OAAO,KAAK,mBAAmB;EAE1E,MAAM,iBAAiB;GACrB,QAAQ,IAAI,UAAU;GACtB,MAAM,IAAI;GACV,WAAW,QAAQ,mBAAmB,OAAO,YAAY;GACzD;GACA,GAAG;GACJ;EACD,MAAM,EAAE,QAAQ,QAAQ,YAAY,uBAAuB,eAAe;AAE1E,MAAI,SAAS;AACX,SAAM;AACN;;AAGF,qBAAmB,SAAS,QAAQ,eAAe;AACnD,MAAI,MAAM;AAEV,MAAI,GAAG,gBAAgB;AACrB,UAAO,EAAE,QAAQ,IAAI,YAAY,CAAC,CAAC,YAAY,GAAG;IAClD;AAEF,UAAQ,IAAI,cAAc,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BrC,IAAa,cAAb,MAAa,YAAkC;CAE7C,OAAe,UAA8B,EAAE;;;;;;;;;;;;CAa/C,OAAO,QAAQ,UAA8B,EAAE,EAAiB;AAC9D,cAAY,UAAU;AACtB,SAAO;GACL,QAAQ;GACR,QAAQ;GACT;;;;;;;;;;;;;;;;CAiBH,OAAO,aAAa,cAAsD;AACxE,SAAO;GACL,QAAQ;GACR,SAAS,aAAa,WAAW,EAAE;GACnC,WAAW,CACT;IACE,SAAS;IACT,YAAY,OAAO,GAAG,SAAgB;AACpC,iBAAY,UAAU,MAAM,aAAa,WAAW,GAAG,KAAK;AAC5D,YAAO,YAAY;;IAErB,QAAQ,aAAa,UAAU,EAAE;IAClC,CACF;GACD,QAAQ;GACT;;CAGH,UAAU,UAAoC;AAC5C,WACG,MAAM,4BAA4B,YAAY,QAAQ,CAAC,CACvD,UAAU,IAAI"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../src/nestjs/index.ts"],"sourcesContent":["import type { ServerResponse } from 'node:http'\nimport type { Request } from 'express'\nimport type { DynamicModule, MiddlewareConsumer, NestModule } from '@nestjs/common'\nimport type { RequestLogger } from '../types'\nimport { createMiddlewareLogger, type BaseEvlogOptions } from '../shared/middleware'\nimport { attachForkToLogger } from '../shared/fork'\nimport { extractSafeNodeHeaders } from '../shared/headers'\nimport { bindNodeResponseLifecycle } from '../shared/nodeResponse'\nimport { createLoggerStorage } from '../shared/storage'\n\nconst { storage, useLogger } = createLoggerStorage(\n 'middleware context. Make sure EvlogModule.forRoot() is imported in your AppModule.',\n)\n\nexport type EvlogNestJSOptions = BaseEvlogOptions\n\nexport { useLogger }\n\nexport interface EvlogModuleAsyncOptions {\n /** Modules to import (for dependency injection into the factory) */\n imports?: any[]\n /** Factory function that returns evlog options. Can be async. */\n useFactory: (...args: any[]) => EvlogNestJSOptions | Promise<EvlogNestJSOptions>\n /** Injection tokens to resolve and pass to the factory */\n inject?: any[]\n}\n\ndeclare module 'http' {\n interface IncomingMessage {\n log?: RequestLogger\n }\n}\n\ndeclare module 'express-serve-static-core' {\n interface Request {\n log?: RequestLogger\n }\n}\n\nfunction createEvlogMiddleware(getOptions: () => EvlogNestJSOptions) {\n return (req: Request, res: ServerResponse, next: () => void) => {\n const options = getOptions()\n const headers = extractSafeNodeHeaders(req.headers)\n const url = new URL(req.originalUrl || req.url || '/', 'http://localhost')\n\n const middlewareOpts = {\n method: req.method || 'GET',\n path: url.pathname,\n requestId: headers['x-request-id'] || crypto.randomUUID(),\n headers,\n ...options,\n }\n const { logger, finish, skipped } = createMiddlewareLogger(middlewareOpts)\n\n if (skipped) {\n next()\n return\n }\n\n attachForkToLogger(storage, logger, middlewareOpts)\n req.log = logger\n\n bindNodeResponseLifecycle(res, logger, finish)\n\n storage.run(logger, () => next())\n }\n}\n\n/**\n * NestJS module for evlog wide event logging.\n *\n * Registers a global middleware that creates a request-scoped logger\n * for every incoming request. Use `useLogger()` to access it anywhere\n * in the call stack, or `req.log` directly in controllers.\n *\n * @example\n * ```ts\n * import { Module } from '@nestjs/common'\n * import { EvlogModule } from 'evlog/nestjs'\n * import { createAxiomDrain } from 'evlog/axiom'\n *\n * @Module({\n * imports: [\n * EvlogModule.forRoot({\n * drain: createAxiomDrain(),\n * exclude: ['/health'],\n * }),\n * ],\n * })\n * export class AppModule {}\n * ```\n */\nexport class EvlogModule implements NestModule {\n\n private static options: EvlogNestJSOptions = {}\n\n /**\n * Register evlog with static configuration.\n *\n * @example\n * ```ts\n * EvlogModule.forRoot({\n * drain: createAxiomDrain(),\n * enrich: (ctx) => { ctx.event.region = process.env.FLY_REGION },\n * })\n * ```\n */\n static forRoot(options: EvlogNestJSOptions = {}): DynamicModule {\n EvlogModule.options = options\n return {\n module: EvlogModule,\n global: true,\n }\n }\n\n /**\n * Register evlog with async configuration (e.g. from `ConfigService`).\n *\n * @example\n * ```ts\n * EvlogModule.forRootAsync({\n * imports: [ConfigModule],\n * inject: [ConfigService],\n * useFactory: (config: ConfigService) => ({\n * drain: createAxiomDrain({ token: config.get('AXIOM_TOKEN') }),\n * }),\n * })\n * ```\n */\n static forRootAsync(asyncOptions: EvlogModuleAsyncOptions): DynamicModule {\n return {\n module: EvlogModule,\n imports: asyncOptions.imports || [],\n providers: [\n {\n provide: 'EVLOG_OPTIONS',\n useFactory: async (...args: any[]) => {\n EvlogModule.options = await asyncOptions.useFactory(...args)\n return EvlogModule.options\n },\n inject: asyncOptions.inject || [],\n },\n ],\n global: true,\n }\n }\n\n configure(consumer: MiddlewareConsumer): void {\n consumer\n .apply(createEvlogMiddleware(() => EvlogModule.options))\n .forRoutes('*')\n }\n\n}\n"],"mappings":";;;;;AAUA,MAAM,EAAE,SAAS,cAAc,oBAC7B,qFACD;AA2BD,SAAS,sBAAsB,YAAsC;AACnE,SAAQ,KAAc,KAAqB,SAAqB;EAC9D,MAAM,UAAU,YAAY;EAC5B,MAAM,UAAU,uBAAuB,IAAI,QAAQ;EACnD,MAAM,MAAM,IAAI,IAAI,IAAI,eAAe,IAAI,OAAO,KAAK,mBAAmB;EAE1E,MAAM,iBAAiB;GACrB,QAAQ,IAAI,UAAU;GACtB,MAAM,IAAI;GACV,WAAW,QAAQ,mBAAmB,OAAO,YAAY;GACzD;GACA,GAAG;GACJ;EACD,MAAM,EAAE,QAAQ,QAAQ,YAAY,uBAAuB,eAAe;AAE1E,MAAI,SAAS;AACX,SAAM;AACN;;AAGF,qBAAmB,SAAS,QAAQ,eAAe;AACnD,MAAI,MAAM;AAEV,4BAA0B,KAAK,QAAQ,OAAO;AAE9C,UAAQ,IAAI,cAAc,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BrC,IAAa,cAAb,MAAa,YAAkC;CAE7C,OAAe,UAA8B,EAAE;;;;;;;;;;;;CAa/C,OAAO,QAAQ,UAA8B,EAAE,EAAiB;AAC9D,cAAY,UAAU;AACtB,SAAO;GACL,QAAQ;GACR,QAAQ;GACT;;;;;;;;;;;;;;;;CAiBH,OAAO,aAAa,cAAsD;AACxE,SAAO;GACL,QAAQ;GACR,SAAS,aAAa,WAAW,EAAE;GACnC,WAAW,CACT;IACE,SAAS;IACT,YAAY,OAAO,GAAG,SAAgB;AACpC,iBAAY,UAAU,MAAM,aAAa,WAAW,GAAG,KAAK;AAC5D,YAAO,YAAY;;IAErB,QAAQ,aAAa,UAAU,EAAE;IAClC,CACF;GACD,QAAQ;GACT;;CAGH,UAAU,UAAoC;AAC5C,WACG,MAAM,4BAA4B,YAAY,QAAQ,CAAC,CACvD,UAAU,IAAI"}
@@ -1,4 +1,4 @@
1
- import { W as LogLevel, rt as TransportConfig } from "../audit-CJl-wZ10.mjs";
1
+ import { K as LogLevel, st as TransportConfig } from "../audit-CC8nfazi.mjs";
2
2
  import { clearIdentity, log as _clientLog, setIdentity, setMinLevel } from "../runtime/client/log.mjs";
3
3
  import * as _$react from "react";
4
4
 
@@ -1,7 +1,7 @@
1
- import { L as EnvironmentContext, Q as SamplingConfig, U as Log, W as LogLevel, Y as RequestLogger } from "../audit-CJl-wZ10.mjs";
2
- import { n as createError } from "../error-C-66_G2M.mjs";
3
- import { t as _log } from "../logger-Brt5-WMK.mjs";
4
- import { t as BaseEvlogOptions } from "../middleware-CGM-bOvE.mjs";
1
+ import { $ as RequestLogger, G as Log, K as LogLevel, R as EnvironmentContext, nt as SamplingConfig } from "../audit-CC8nfazi.mjs";
2
+ import { n as createError } from "../error-CpbbtyXL.mjs";
3
+ import { t as _log } from "../logger-DntcxxHg.mjs";
4
+ import { t as BaseEvlogOptions } from "../middleware-U-lIAzHg.mjs";
5
5
  import { AsyncLocalStorage } from "node:async_hooks";
6
6
 
7
7
  //#region src/next/types.d.ts
@@ -1,8 +1,8 @@
1
- import { S as isLoggerLocked, b as initLogger, g as createRequestLogger, m as _log, v as getGlobalDrain, x as isEnabled } from "../audit--n0QRR2Y.mjs";
1
+ import { S as isLoggerLocked, b as initLogger, g as createRequestLogger, m as _log, v as getGlobalDrain, x as isEnabled } from "../audit-pV5aLGP0.mjs";
2
2
  import { filterSafeHeaders } from "../utils.mjs";
3
3
  import { EvlogError, createError } from "../error.mjs";
4
- import { n as shouldLog, t as getServiceForPath } from "../routes-B48wm7Pb.mjs";
5
- import { t as attachForkToLogger } from "../fork-D44V93-K.mjs";
4
+ import { n as shouldLog, t as getServiceForPath } from "../routes-CnIgYWf8.mjs";
5
+ import { t as attachForkToLogger } from "../fork-8u_zFOJq.mjs";
6
6
  import { AsyncLocalStorage } from "node:async_hooks";
7
7
  //#region src/next/storage.ts
8
8
  const evlogStorage = new AsyncLocalStorage();
@@ -1,4 +1,4 @@
1
- import { F as DrainContext, L as EnvironmentContext, Q as SamplingConfig, W as LogLevel } from "../audit-CJl-wZ10.mjs";
1
+ import { I as DrainContext, K as LogLevel, R as EnvironmentContext, nt as SamplingConfig } from "../audit-CC8nfazi.mjs";
2
2
 
3
3
  //#region src/next/instrumentation.d.ts
4
4
  /** Request payload passed to Next.js `onRequestError` (App Router). */
@@ -1,4 +1,4 @@
1
- import { C as lockLogger, b as initLogger, m as _log } from "../audit--n0QRR2Y.mjs";
1
+ import { C as lockLogger, b as initLogger, m as _log } from "../audit-pV5aLGP0.mjs";
2
2
  //#region src/next/instrumentation.ts
3
3
  /**
4
4
  * Root `instrumentation.ts` entry: load your real config only in the Node.js runtime so Edge
@@ -0,0 +1,29 @@
1
+ import { InstrumentationOptions, createInstrumentation } from "./instrumentation.mjs";
2
+ import { StreamServerOptions } from "../stream.mjs";
3
+
4
+ //#region src/next/stream.d.ts
5
+ interface StreamedInstrumentationOptions extends InstrumentationOptions {
6
+ /**
7
+ * Live stream server.
8
+ *
9
+ * Strict opt-in — nothing starts unless this is set explicitly.
10
+ *
11
+ * - `true` — enable with defaults
12
+ * - `false` — off (same as omitting)
13
+ * - `StreamServerOptions` — full config (port, host, token, ...)
14
+ * - `undefined` (default) — off
15
+ */
16
+ stream?: boolean | StreamServerOptions;
17
+ }
18
+ interface InstrumentationResult {
19
+ register: () => Promise<void>;
20
+ onRequestError: ReturnType<typeof createInstrumentation>['onRequestError'];
21
+ }
22
+ /**
23
+ * Drop-in replacement for `createInstrumentation` that adds the local
24
+ * stream server lifecycle.
25
+ */
26
+ declare function defineStreamedInstrumentation(options?: StreamedInstrumentationOptions): InstrumentationResult;
27
+ //#endregion
28
+ export { StreamedInstrumentationOptions, defineStreamedInstrumentation };
29
+ //# sourceMappingURL=stream.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream.d.mts","names":[],"sources":["../../src/next/stream.ts"],"mappings":";;;;UAkCiB,8BAAA,SAAuC,sBAAA;EAuBD;;;;;;;;;;EAZrD,MAAA,aAAmB,mBAAA;AAAA;AAAA,UAGX,qBAAA;EACR,QAAA,QAAgB,OAAA;EAChB,cAAA,EAAgB,UAAA,QAAkB,qBAAA;AAAA;;;;;iBAOpB,6BAAA,CAA8B,OAAA,GAAS,8BAAA,GAAsC,qBAAA"}
@@ -0,0 +1,78 @@
1
+ import { startStreamServer } from "../stream.mjs";
2
+ import { createInstrumentation } from "./instrumentation.mjs";
3
+ //#region src/next/stream.ts
4
+ /**
5
+ * Next.js helper that wires the local stream server into the standard
6
+ * `instrumentation.ts` pattern. Strict opt-in: nothing starts unless
7
+ * `stream: true` (or a config object) is passed explicitly.
8
+ *
9
+ * @example
10
+ * ```ts
11
+ * // lib/evlog.ts
12
+ * import { defineStreamedInstrumentation } from 'evlog/next/stream'
13
+ *
14
+ * export const { register, onRequestError } = defineStreamedInstrumentation({
15
+ * service: 'my-app',
16
+ * stream: true, // opt in to the local SSE stream server
17
+ * })
18
+ * ```
19
+ *
20
+ * ```ts
21
+ * // instrumentation.ts
22
+ * import { defineNodeInstrumentation } from 'evlog/next/instrumentation'
23
+ *
24
+ * export const { register, onRequestError } = defineNodeInstrumentation(() =>
25
+ * import('./lib/evlog')
26
+ * )
27
+ * ```
28
+ *
29
+ * When enabled, the mini server boots on first `register()` call and prints
30
+ * `[evlog] Stream → http://127.0.0.1:<port>`. Without `stream`, this is a
31
+ * straight pass-through to `createInstrumentation()`.
32
+ */
33
+ /**
34
+ * Drop-in replacement for `createInstrumentation` that adds the local
35
+ * stream server lifecycle.
36
+ */
37
+ function defineStreamedInstrumentation(options = {}) {
38
+ const { stream: streamOpt, drain: userDrain, ...rest } = options;
39
+ function shouldStartServer() {
40
+ if (streamOpt === true) return true;
41
+ if (streamOpt && typeof streamOpt === "object") return true;
42
+ return false;
43
+ }
44
+ const start = shouldStartServer();
45
+ let serverDrain = null;
46
+ async function register() {
47
+ if (start) {
48
+ const cfg = streamOpt && typeof streamOpt === "object" ? streamOpt : {};
49
+ try {
50
+ const server = await startStreamServer(cfg);
51
+ serverDrain = (ctx) => server.drain(ctx);
52
+ } catch (err) {
53
+ console.error("[evlog/next] failed to start stream server:", err);
54
+ }
55
+ }
56
+ const composedDrain = composeDrains(userDrain, serverDrain);
57
+ createInstrumentation({
58
+ ...rest,
59
+ drain: composedDrain
60
+ }).register();
61
+ }
62
+ return {
63
+ register,
64
+ onRequestError: createInstrumentation({ ...rest }).onRequestError
65
+ };
66
+ }
67
+ function composeDrains(user, server) {
68
+ if (!user && !server) return void 0;
69
+ if (!user) return server;
70
+ if (!server) return user;
71
+ return async (ctx) => {
72
+ await Promise.all([Promise.resolve(user(ctx)), Promise.resolve(server(ctx))]);
73
+ };
74
+ }
75
+ //#endregion
76
+ export { defineStreamedInstrumentation };
77
+
78
+ //# sourceMappingURL=stream.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream.mjs","names":[],"sources":["../../src/next/stream.ts"],"sourcesContent":["/**\n * Next.js helper that wires the local stream server into the standard\n * `instrumentation.ts` pattern. Strict opt-in: nothing starts unless\n * `stream: true` (or a config object) is passed explicitly.\n *\n * @example\n * ```ts\n * // lib/evlog.ts\n * import { defineStreamedInstrumentation } from 'evlog/next/stream'\n *\n * export const { register, onRequestError } = defineStreamedInstrumentation({\n * service: 'my-app',\n * stream: true, // opt in to the local SSE stream server\n * })\n * ```\n *\n * ```ts\n * // instrumentation.ts\n * import { defineNodeInstrumentation } from 'evlog/next/instrumentation'\n *\n * export const { register, onRequestError } = defineNodeInstrumentation(() =>\n * import('./lib/evlog')\n * )\n * ```\n *\n * When enabled, the mini server boots on first `register()` call and prints\n * `[evlog] Stream → http://127.0.0.1:<port>`. Without `stream`, this is a\n * straight pass-through to `createInstrumentation()`.\n */\n\nimport { startStreamServer, type StreamServerOptions } from '../stream'\nimport type { DrainContext } from '../types'\nimport { createInstrumentation, type InstrumentationOptions } from './instrumentation'\n\nexport interface StreamedInstrumentationOptions extends InstrumentationOptions {\n /**\n * Live stream server.\n *\n * Strict opt-in — nothing starts unless this is set explicitly.\n *\n * - `true` — enable with defaults\n * - `false` — off (same as omitting)\n * - `StreamServerOptions` — full config (port, host, token, ...)\n * - `undefined` (default) — off\n */\n stream?: boolean | StreamServerOptions\n}\n\ninterface InstrumentationResult {\n register: () => Promise<void>\n onRequestError: ReturnType<typeof createInstrumentation>['onRequestError']\n}\n\n/**\n * Drop-in replacement for `createInstrumentation` that adds the local\n * stream server lifecycle.\n */\nexport function defineStreamedInstrumentation(options: StreamedInstrumentationOptions = {}): InstrumentationResult {\n const { stream: streamOpt, drain: userDrain, ...rest } = options\n\n function shouldStartServer(): boolean {\n if (streamOpt === true) return true\n if (streamOpt && typeof streamOpt === 'object') return true\n return false\n }\n\n const start: boolean = shouldStartServer()\n let serverDrain: ((ctx: DrainContext) => void | Promise<void>) | null = null\n\n async function register(): Promise<void> {\n if (start) {\n const cfg: StreamServerOptions = streamOpt && typeof streamOpt === 'object' ? streamOpt : {}\n try {\n const server = await startStreamServer(cfg)\n serverDrain = ctx => server.drain(ctx)\n } catch (err) {\n console.error('[evlog/next] failed to start stream server:', err)\n }\n }\n\n const composedDrain = composeDrains(userDrain, serverDrain)\n const inner = createInstrumentation({ ...rest, drain: composedDrain })\n inner.register()\n }\n\n // We intentionally instantiate a \"zero-time\" inner just for onRequestError —\n // it wires `log.error` which doesn't depend on the drain.\n const errorOnly = createInstrumentation({ ...rest })\n\n return {\n register,\n onRequestError: errorOnly.onRequestError,\n }\n}\n\nfunction composeDrains(\n user: ((ctx: DrainContext) => void | Promise<void>) | undefined,\n server: ((ctx: DrainContext) => void | Promise<void>) | null,\n): ((ctx: DrainContext) => void | Promise<void>) | undefined {\n if (!user && !server) return undefined\n if (!user) return server!\n if (!server) return user\n return async (ctx) => {\n await Promise.all([\n Promise.resolve(user(ctx)),\n Promise.resolve(server(ctx)),\n ])\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyDA,SAAgB,8BAA8B,UAA0C,EAAE,EAAyB;CACjH,MAAM,EAAE,QAAQ,WAAW,OAAO,WAAW,GAAG,SAAS;CAEzD,SAAS,oBAA6B;AACpC,MAAI,cAAc,KAAM,QAAO;AAC/B,MAAI,aAAa,OAAO,cAAc,SAAU,QAAO;AACvD,SAAO;;CAGT,MAAM,QAAiB,mBAAmB;CAC1C,IAAI,cAAoE;CAExE,eAAe,WAA0B;AACvC,MAAI,OAAO;GACT,MAAM,MAA2B,aAAa,OAAO,cAAc,WAAW,YAAY,EAAE;AAC5F,OAAI;IACF,MAAM,SAAS,MAAM,kBAAkB,IAAI;AAC3C,mBAAc,QAAO,OAAO,MAAM,IAAI;YAC/B,KAAK;AACZ,YAAQ,MAAM,+CAA+C,IAAI;;;EAIrE,MAAM,gBAAgB,cAAc,WAAW,YAAY;AAC7C,wBAAsB;GAAE,GAAG;GAAM,OAAO;GAAe,CAChE,CAAC,UAAU;;AAOlB,QAAO;EACL;EACA,gBAJgB,sBAAsB,EAAE,GAAG,MAAM,CAIxB,CAAC;EAC3B;;AAGH,SAAS,cACP,MACA,QAC2D;AAC3D,KAAI,CAAC,QAAQ,CAAC,OAAQ,QAAO,KAAA;AAC7B,KAAI,CAAC,KAAM,QAAO;AAClB,KAAI,CAAC,OAAQ,QAAO;AACpB,QAAO,OAAO,QAAQ;AACpB,QAAM,QAAQ,IAAI,CAChB,QAAQ,QAAQ,KAAK,IAAI,CAAC,EAC1B,QAAQ,QAAQ,OAAO,IAAI,CAAC,CAC7B,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { t as extractErrorStatus } from "../errors-BQgyQ9xe.mjs";
2
- import { n as serializeEvlogErrorResponse, t as resolveEvlogError } from "../nitro-DavLelNz.mjs";
2
+ import { n as serializeEvlogErrorResponse, t as resolveEvlogError } from "../nitro-DErMq_Zj.mjs";
3
3
  import { getRequestURL, send, setResponseHeader, setResponseStatus } from "h3";
4
4
  import { defineNitroErrorHandler } from "nitropack/runtime/internal/error/utils";
5
5
  //#region src/nitro/errorHandler.ts
@@ -1,5 +1,5 @@
1
- import { t as useLogger } from "../useLogger-Cb1R6bQE.mjs";
2
- import { t as NitroModuleOptions } from "../nitro-DHPb9dXG.mjs";
1
+ import { t as useLogger } from "../useLogger-BsPL4AQm.mjs";
2
+ import { t as NitroModuleOptions } from "../nitro-oZre8ab3.mjs";
3
3
  import { Nitro } from "nitropack";
4
4
 
5
5
  //#region src/nitro/module.d.ts
@@ -1,8 +1,9 @@
1
- import { A as normalizeRedactConfig, b as initLogger, g as createRequestLogger, x as isEnabled, y as getGlobalPluginRunner } from "../audit--n0QRR2Y.mjs";
1
+ import { A as normalizeRedactConfig, b as initLogger, g as createRequestLogger, x as isEnabled, y as getGlobalPluginRunner } from "../audit-pV5aLGP0.mjs";
2
2
  import { filterSafeHeaders } from "../utils.mjs";
3
3
  import { t as extractErrorStatus } from "../errors-BQgyQ9xe.mjs";
4
- import { n as shouldLog, t as getServiceForPath } from "../routes-B48wm7Pb.mjs";
5
- import { n as resolveEvlogConfigForNitroPlugin } from "../nitroConfigBridge-aZ1e5upQ.mjs";
4
+ import { n as shouldLog, t as getServiceForPath } from "../routes-CnIgYWf8.mjs";
5
+ import { n as resolveEvlogConfigForNitroPlugin } from "../nitroConfigBridge-DKk7eOn-.mjs";
6
+ import { startStreamServer } from "../stream.mjs";
6
7
  import { defineNitroPlugin } from "nitropack/runtime/internal/plugin";
7
8
  import { getHeaders } from "h3";
8
9
  //#region src/nitro/plugin.ts
@@ -83,6 +84,14 @@ var plugin_default = defineNitroPlugin(async (nitroApp) => {
83
84
  redact,
84
85
  _suppressDrainWarning: true
85
86
  });
87
+ const streamSetting = evlogConfig?.stream;
88
+ if (streamSetting === true || streamSetting && typeof streamSetting === "object") startStreamServer(streamSetting === true ? {} : streamSetting).then((server) => {
89
+ nitroApp.hooks.hook("evlog:drain", (ctx) => {
90
+ if (ctx?.event) server.drain(ctx);
91
+ });
92
+ }).catch((err) => {
93
+ console.error("[evlog] failed to start stream server:", err);
94
+ });
86
95
  if (!isEnabled()) {
87
96
  nitroApp.hooks.hook("request", (event) => {
88
97
  const e = event;
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.mjs","names":[],"sources":["../../src/nitro/plugin.ts"],"sourcesContent":["import type { NitroApp } from 'nitropack/types'\n// Import from specific subpaths to avoid the barrel 'nitropack/runtime' which\n// re-exports from internal/app.mjs — that file imports #nitro-internal-virtual/*\n// modules that only exist inside rollup builds and crash when loaded externally\n// (nitropack dev loads plugins outside the bundle via Worker threads).\nimport { defineNitroPlugin } from 'nitropack/runtime/internal/plugin'\nimport { getHeaders } from 'h3'\nimport { createRequestLogger, getGlobalPluginRunner, initLogger, isEnabled } from '../logger'\nimport { shouldLog, getServiceForPath, extractErrorStatus } from '../nitro'\nimport { normalizeRedactConfig } from '../redact'\nimport { resolveEvlogConfigForNitroPlugin } from '../shared/nitroConfigBridge'\nimport type { EnrichContext, RequestLogger, ServerEvent, TailSamplingContext, WideEvent } from '../types'\nimport { filterSafeHeaders } from '../utils'\n\nfunction getSafeHeaders(event: ServerEvent): Record<string, string> {\n const allHeaders = getHeaders(event as Parameters<typeof getHeaders>[0])\n return filterSafeHeaders(allHeaders)\n}\n\nfunction getSafeResponseHeaders(event: ServerEvent): Record<string, string> | undefined {\n const headers: Record<string, string> = {}\n const nodeRes = event.node?.res as { getHeaders?: () => Record<string, unknown> } | undefined\n\n if (nodeRes?.getHeaders) {\n for (const [key, value] of Object.entries(nodeRes.getHeaders())) {\n if (value === undefined) continue\n headers[key] = Array.isArray(value) ? value.join(', ') : String(value)\n }\n }\n\n if (event.response?.headers) {\n event.response.headers.forEach((value, key) => {\n headers[key] = value\n })\n }\n\n if (Object.keys(headers).length === 0) return undefined\n return filterSafeHeaders(headers)\n}\n\nfunction getResponseStatus(event: ServerEvent): number {\n // Node.js style\n if (event.node?.res?.statusCode) {\n return event.node.res.statusCode\n }\n\n // Web Standard\n if (event.response?.status) {\n return event.response.status\n }\n\n // Context-based\n if (typeof event.context.status === 'number') {\n return event.context.status\n }\n\n return 200\n}\n\nfunction buildHookContext(event: ServerEvent): Omit<EnrichContext, 'event'> {\n const responseHeaders = getSafeResponseHeaders(event)\n return {\n request: { method: event.method, path: event.path },\n headers: getSafeHeaders(event),\n response: {\n status: getResponseStatus(event),\n headers: responseHeaders,\n },\n }\n}\n\nasync function callEnrichAndDrain(\n nitroApp: NitroApp,\n emittedEvent: WideEvent | null,\n event: ServerEvent,\n): Promise<void> {\n if (!emittedEvent) return\n\n const hookContext = buildHookContext(event)\n const enrichCtx: EnrichContext = { event: emittedEvent, ...hookContext }\n const runner = getGlobalPluginRunner()\n\n try {\n await nitroApp.hooks.callHook('evlog:enrich', enrichCtx)\n } catch (err) {\n console.error('[evlog] enrich failed:', err)\n }\n if (runner.hasEnrich) {\n await runner.runEnrich(enrichCtx)\n }\n\n const drainCtx = {\n event: emittedEvent,\n request: hookContext.request,\n headers: hookContext.headers,\n }\n const drainTasks: Array<Promise<unknown>> = [\n nitroApp.hooks.callHook('evlog:drain', drainCtx).catch((err) => {\n console.error('[evlog] drain failed:', err)\n }),\n ]\n if (runner.hasDrain) {\n drainTasks.push(runner.runDrain(drainCtx))\n }\n const drainPromise = Promise.all(drainTasks)\n\n // Use waitUntil if available (Cloudflare Workers, Vercel Edge, etc.)\n // This keeps the runtime alive for background work without blocking the response\n const waitUntilCtx = event.context.cloudflare?.context ?? event.context\n if (typeof waitUntilCtx?.waitUntil === 'function') {\n waitUntilCtx.waitUntil(drainPromise)\n } else {\n // Fallback: await drain to prevent lost logs in serverless environments\n // (e.g. Vercel Fluid Compute). On the normal path this runs from\n // afterResponse (response already sent); on the error path it may run\n // before the error response is finalized.\n await drainPromise\n }\n}\n\nexport default defineNitroPlugin(async (nitroApp) => {\n const evlogConfig = await resolveEvlogConfigForNitroPlugin()\n\n const redact = normalizeRedactConfig(evlogConfig?.redact as boolean | Record<string, unknown> | undefined)\n\n initLogger({\n enabled: evlogConfig?.enabled,\n env: evlogConfig?.env,\n pretty: evlogConfig?.pretty,\n silent: evlogConfig?.silent,\n sampling: evlogConfig?.sampling,\n minLevel: evlogConfig?.minLevel,\n redact,\n _suppressDrainWarning: true,\n })\n\n // When globally disabled, createRequestLogger returns a no-op logger — still\n // attach it so handlers can call useLogger(event) without throwing.\n if (!isEnabled()) {\n nitroApp.hooks.hook('request', (event) => {\n const e = event as ServerEvent\n let requestIdOverride: string | undefined\n if (globalThis.navigator?.userAgent === 'Cloudflare-Workers') {\n const cfRay = getSafeHeaders(e)?.['cf-ray']\n if (cfRay) requestIdOverride = cfRay\n }\n e.context.log = createRequestLogger({\n method: e.method,\n path: e.path,\n requestId: requestIdOverride || e.context.requestId || crypto.randomUUID(),\n }, { _deferDrain: true })\n })\n return\n }\n\n nitroApp.hooks.hook('request', (event) => {\n const e = event as ServerEvent\n\n // Evaluate route filtering but always create the logger so that server\n // middleware (which runs for every request) can call useLogger(event)\n // without throwing. Filtering is enforced at emit time instead.\n e.context._evlogShouldEmit = shouldLog(e.path, evlogConfig?.include, evlogConfig?.exclude)\n\n // Store start time for duration calculation in tail sampling\n e.context._evlogStartTime = Date.now()\n\n let requestIdOverride: string | undefined = undefined\n if (globalThis.navigator?.userAgent === 'Cloudflare-Workers') {\n const cfRay = getSafeHeaders(e)?.['cf-ray']\n if (cfRay) requestIdOverride = cfRay\n }\n\n const requestLog = createRequestLogger({\n method: e.method,\n path: e.path,\n requestId: requestIdOverride || e.context.requestId || crypto.randomUUID(),\n }, { _deferDrain: true })\n\n // Apply route-based service configuration if a matching route is found\n const routeService = getServiceForPath(e.path, evlogConfig?.routes)\n if (routeService) {\n requestLog.set({ service: routeService })\n }\n\n e.context.log = requestLog\n })\n\n nitroApp.hooks.hook('error', async (error, { event }) => {\n const e = event as ServerEvent | undefined\n if (!e) return\n if (!e.context._evlogShouldEmit) return\n\n const requestLog = e.context.log as RequestLogger | undefined\n if (requestLog) {\n requestLog.error(error as Error)\n\n const errorStatus = extractErrorStatus(error)\n requestLog.set({ status: errorStatus })\n\n // Build tail sampling context\n const startTime = e.context._evlogStartTime as number | undefined\n const durationMs = startTime ? Date.now() - startTime : undefined\n\n const tailCtx: TailSamplingContext = {\n status: errorStatus,\n duration: durationMs,\n path: e.path,\n method: e.method,\n context: requestLog.getContext(),\n shouldKeep: false,\n }\n\n // Call evlog:emit:keep hook + plugin runner keep hook\n await nitroApp.hooks.callHook('evlog:emit:keep', tailCtx)\n const runner = getGlobalPluginRunner()\n if (runner.hasKeep) await runner.runKeep(tailCtx)\n\n e.context._evlogEmitted = true\n\n const emittedEvent = requestLog.emit({ _forceKeep: tailCtx.shouldKeep })\n await callEnrichAndDrain(nitroApp, emittedEvent, e)\n }\n })\n\n nitroApp.hooks.hook('afterResponse', async (event) => {\n const e = event as ServerEvent\n // Skip if already emitted by error hook or route was filtered out\n if (e.context._evlogEmitted || !e.context._evlogShouldEmit) return\n\n const requestLog = e.context.log as RequestLogger | undefined\n if (requestLog) {\n const status = getResponseStatus(e)\n requestLog.set({ status })\n\n const startTime = e.context._evlogStartTime as number | undefined\n const durationMs = startTime ? Date.now() - startTime : undefined\n\n const tailCtx: TailSamplingContext = {\n status,\n duration: durationMs,\n path: e.path,\n method: e.method,\n context: requestLog.getContext(),\n shouldKeep: false,\n }\n\n await nitroApp.hooks.callHook('evlog:emit:keep', tailCtx)\n const runner = getGlobalPluginRunner()\n if (runner.hasKeep) await runner.runKeep(tailCtx)\n\n const emittedEvent = requestLog.emit({ _forceKeep: tailCtx.shouldKeep })\n await callEnrichAndDrain(nitroApp, emittedEvent, e)\n }\n })\n})\n"],"mappings":"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"}
1
+ {"version":3,"file":"plugin.mjs","names":[],"sources":["../../src/nitro/plugin.ts"],"sourcesContent":["import type { NitroApp } from 'nitropack/types'\n// Import from specific subpaths to avoid the barrel 'nitropack/runtime' which\n// re-exports from internal/app.mjs — that file imports #nitro-internal-virtual/*\n// modules that only exist inside rollup builds and crash when loaded externally\n// (nitropack dev loads plugins outside the bundle via Worker threads).\nimport { defineNitroPlugin } from 'nitropack/runtime/internal/plugin'\nimport { getHeaders } from 'h3'\nimport { createRequestLogger, getGlobalPluginRunner, initLogger, isEnabled } from '../logger'\nimport { shouldLog, getServiceForPath, extractErrorStatus } from '../nitro'\nimport { normalizeRedactConfig } from '../redact'\nimport { resolveEvlogConfigForNitroPlugin } from '../shared/nitroConfigBridge'\nimport { startStreamServer, type StreamServerOptions } from '../stream'\nimport type { EnrichContext, RequestLogger, ServerEvent, TailSamplingContext, WideEvent } from '../types'\nimport { filterSafeHeaders } from '../utils'\n\nfunction getSafeHeaders(event: ServerEvent): Record<string, string> {\n const allHeaders = getHeaders(event as Parameters<typeof getHeaders>[0])\n return filterSafeHeaders(allHeaders)\n}\n\nfunction getSafeResponseHeaders(event: ServerEvent): Record<string, string> | undefined {\n const headers: Record<string, string> = {}\n const nodeRes = event.node?.res as { getHeaders?: () => Record<string, unknown> } | undefined\n\n if (nodeRes?.getHeaders) {\n for (const [key, value] of Object.entries(nodeRes.getHeaders())) {\n if (value === undefined) continue\n headers[key] = Array.isArray(value) ? value.join(', ') : String(value)\n }\n }\n\n if (event.response?.headers) {\n event.response.headers.forEach((value, key) => {\n headers[key] = value\n })\n }\n\n if (Object.keys(headers).length === 0) return undefined\n return filterSafeHeaders(headers)\n}\n\nfunction getResponseStatus(event: ServerEvent): number {\n // Node.js style\n if (event.node?.res?.statusCode) {\n return event.node.res.statusCode\n }\n\n // Web Standard\n if (event.response?.status) {\n return event.response.status\n }\n\n // Context-based\n if (typeof event.context.status === 'number') {\n return event.context.status\n }\n\n return 200\n}\n\nfunction buildHookContext(event: ServerEvent): Omit<EnrichContext, 'event'> {\n const responseHeaders = getSafeResponseHeaders(event)\n return {\n request: { method: event.method, path: event.path },\n headers: getSafeHeaders(event),\n response: {\n status: getResponseStatus(event),\n headers: responseHeaders,\n },\n }\n}\n\nasync function callEnrichAndDrain(\n nitroApp: NitroApp,\n emittedEvent: WideEvent | null,\n event: ServerEvent,\n): Promise<void> {\n if (!emittedEvent) return\n\n const hookContext = buildHookContext(event)\n const enrichCtx: EnrichContext = { event: emittedEvent, ...hookContext }\n const runner = getGlobalPluginRunner()\n\n try {\n await nitroApp.hooks.callHook('evlog:enrich', enrichCtx)\n } catch (err) {\n console.error('[evlog] enrich failed:', err)\n }\n if (runner.hasEnrich) {\n await runner.runEnrich(enrichCtx)\n }\n\n const drainCtx = {\n event: emittedEvent,\n request: hookContext.request,\n headers: hookContext.headers,\n }\n const drainTasks: Array<Promise<unknown>> = [\n nitroApp.hooks.callHook('evlog:drain', drainCtx).catch((err) => {\n console.error('[evlog] drain failed:', err)\n }),\n ]\n if (runner.hasDrain) {\n drainTasks.push(runner.runDrain(drainCtx))\n }\n const drainPromise = Promise.all(drainTasks)\n\n // Use waitUntil if available (Cloudflare Workers, Vercel Edge, etc.)\n // This keeps the runtime alive for background work without blocking the response\n const waitUntilCtx = event.context.cloudflare?.context ?? event.context\n if (typeof waitUntilCtx?.waitUntil === 'function') {\n waitUntilCtx.waitUntil(drainPromise)\n } else {\n // Fallback: await drain to prevent lost logs in serverless environments\n // (e.g. Vercel Fluid Compute). On the normal path this runs from\n // afterResponse (response already sent); on the error path it may run\n // before the error response is finalized.\n await drainPromise\n }\n}\n\nexport default defineNitroPlugin(async (nitroApp) => {\n const evlogConfig = await resolveEvlogConfigForNitroPlugin()\n\n const redact = normalizeRedactConfig(evlogConfig?.redact as boolean | Record<string, unknown> | undefined)\n\n initLogger({\n enabled: evlogConfig?.enabled,\n env: evlogConfig?.env,\n pretty: evlogConfig?.pretty,\n silent: evlogConfig?.silent,\n sampling: evlogConfig?.sampling,\n minLevel: evlogConfig?.minLevel,\n redact,\n _suppressDrainWarning: true,\n })\n\n // When `evlog.stream` is set (or auto-on in dev), boot the mini stream\n // server and hook every drained event into it. The server runs on its\n // own ephemeral port — the user's API surface is untouched.\n const streamSetting = (evlogConfig as { stream?: boolean | StreamServerOptions } | undefined)?.stream\n if (streamSetting === true || (streamSetting && typeof streamSetting === 'object')) {\n const streamOpts: StreamServerOptions = streamSetting === true ? {} : streamSetting\n startStreamServer(streamOpts).then((server) => {\n nitroApp.hooks.hook('evlog:drain', (ctx) => {\n if (ctx?.event) server.drain(ctx)\n })\n }).catch((err) => {\n console.error('[evlog] failed to start stream server:', err)\n })\n }\n\n // When globally disabled, createRequestLogger returns a no-op logger — still\n // attach it so handlers can call useLogger(event) without throwing.\n if (!isEnabled()) {\n nitroApp.hooks.hook('request', (event) => {\n const e = event as ServerEvent\n let requestIdOverride: string | undefined\n if (globalThis.navigator?.userAgent === 'Cloudflare-Workers') {\n const cfRay = getSafeHeaders(e)?.['cf-ray']\n if (cfRay) requestIdOverride = cfRay\n }\n e.context.log = createRequestLogger({\n method: e.method,\n path: e.path,\n requestId: requestIdOverride || e.context.requestId || crypto.randomUUID(),\n }, { _deferDrain: true })\n })\n return\n }\n\n nitroApp.hooks.hook('request', (event) => {\n const e = event as ServerEvent\n\n // Evaluate route filtering but always create the logger so that server\n // middleware (which runs for every request) can call useLogger(event)\n // without throwing. Filtering is enforced at emit time instead.\n e.context._evlogShouldEmit = shouldLog(e.path, evlogConfig?.include, evlogConfig?.exclude)\n\n // Store start time for duration calculation in tail sampling\n e.context._evlogStartTime = Date.now()\n\n let requestIdOverride: string | undefined = undefined\n if (globalThis.navigator?.userAgent === 'Cloudflare-Workers') {\n const cfRay = getSafeHeaders(e)?.['cf-ray']\n if (cfRay) requestIdOverride = cfRay\n }\n\n const requestLog = createRequestLogger({\n method: e.method,\n path: e.path,\n requestId: requestIdOverride || e.context.requestId || crypto.randomUUID(),\n }, { _deferDrain: true })\n\n // Apply route-based service configuration if a matching route is found\n const routeService = getServiceForPath(e.path, evlogConfig?.routes)\n if (routeService) {\n requestLog.set({ service: routeService })\n }\n\n e.context.log = requestLog\n })\n\n nitroApp.hooks.hook('error', async (error, { event }) => {\n const e = event as ServerEvent | undefined\n if (!e) return\n if (!e.context._evlogShouldEmit) return\n\n const requestLog = e.context.log as RequestLogger | undefined\n if (requestLog) {\n requestLog.error(error as Error)\n\n const errorStatus = extractErrorStatus(error)\n requestLog.set({ status: errorStatus })\n\n // Build tail sampling context\n const startTime = e.context._evlogStartTime as number | undefined\n const durationMs = startTime ? Date.now() - startTime : undefined\n\n const tailCtx: TailSamplingContext = {\n status: errorStatus,\n duration: durationMs,\n path: e.path,\n method: e.method,\n context: requestLog.getContext(),\n shouldKeep: false,\n }\n\n // Call evlog:emit:keep hook + plugin runner keep hook\n await nitroApp.hooks.callHook('evlog:emit:keep', tailCtx)\n const runner = getGlobalPluginRunner()\n if (runner.hasKeep) await runner.runKeep(tailCtx)\n\n e.context._evlogEmitted = true\n\n const emittedEvent = requestLog.emit({ _forceKeep: tailCtx.shouldKeep })\n await callEnrichAndDrain(nitroApp, emittedEvent, e)\n }\n })\n\n nitroApp.hooks.hook('afterResponse', async (event) => {\n const e = event as ServerEvent\n // Skip if already emitted by error hook or route was filtered out\n if (e.context._evlogEmitted || !e.context._evlogShouldEmit) return\n\n const requestLog = e.context.log as RequestLogger | undefined\n if (requestLog) {\n const status = getResponseStatus(e)\n requestLog.set({ status })\n\n const startTime = e.context._evlogStartTime as number | undefined\n const durationMs = startTime ? Date.now() - startTime : undefined\n\n const tailCtx: TailSamplingContext = {\n status,\n duration: durationMs,\n path: e.path,\n method: e.method,\n context: requestLog.getContext(),\n shouldKeep: false,\n }\n\n await nitroApp.hooks.callHook('evlog:emit:keep', tailCtx)\n const runner = getGlobalPluginRunner()\n if (runner.hasKeep) await runner.runKeep(tailCtx)\n\n const emittedEvent = requestLog.emit({ _forceKeep: tailCtx.shouldKeep })\n await callEnrichAndDrain(nitroApp, emittedEvent, e)\n }\n })\n})\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { t as extractErrorStatus } from "../../errors-BQgyQ9xe.mjs";
2
- import { n as serializeEvlogErrorResponse, t as resolveEvlogError } from "../../nitro-DavLelNz.mjs";
3
- import { t as parseURL } from "../../dist-BIlS38vi.mjs";
2
+ import { n as serializeEvlogErrorResponse, t as resolveEvlogError } from "../../nitro-DErMq_Zj.mjs";
3
+ import { t as parseURL } from "../../dist-H3GIh-KK.mjs";
4
4
  import { defineErrorHandler } from "nitro";
5
5
  //#region src/nitro-v3/errorHandler.ts
6
6
  /**
@@ -1,5 +1,5 @@
1
- import { n as createError, t as EvlogError } from "../../error-C-66_G2M.mjs";
2
- import { t as parseError } from "../../parseError-B1zJZvQ5.mjs";
1
+ import { n as createError, t as EvlogError } from "../../error-CpbbtyXL.mjs";
2
+ import { t as parseError } from "../../parseError-yVZ58wIK.mjs";
3
3
  import evlog from "./module.mjs";
4
4
  import { useLogger } from "./useLogger.mjs";
5
5
  import { evlogErrorHandler } from "./middleware.mjs";
@@ -1,4 +1,4 @@
1
- import { t as NitroModuleOptions } from "../../nitro-DHPb9dXG.mjs";
1
+ import { t as NitroModuleOptions } from "../../nitro-oZre8ab3.mjs";
2
2
  import { Nitro } from "nitro/types";
3
3
 
4
4
  //#region src/nitro-v3/module.d.ts
@@ -1,9 +1,9 @@
1
- import { A as normalizeRedactConfig, b as initLogger, g as createRequestLogger, x as isEnabled, y as getGlobalPluginRunner } from "../../audit--n0QRR2Y.mjs";
1
+ import { A as normalizeRedactConfig, b as initLogger, g as createRequestLogger, x as isEnabled, y as getGlobalPluginRunner } from "../../audit-pV5aLGP0.mjs";
2
2
  import { filterSafeHeaders } from "../../utils.mjs";
3
3
  import { t as extractErrorStatus } from "../../errors-BQgyQ9xe.mjs";
4
- import { n as shouldLog, t as getServiceForPath } from "../../routes-B48wm7Pb.mjs";
5
- import { n as resolveEvlogConfigForNitroPlugin } from "../../nitroConfigBridge-aZ1e5upQ.mjs";
6
- import { t as parseURL } from "../../dist-BIlS38vi.mjs";
4
+ import { n as shouldLog, t as getServiceForPath } from "../../routes-CnIgYWf8.mjs";
5
+ import { n as resolveEvlogConfigForNitroPlugin } from "../../nitroConfigBridge-DKk7eOn-.mjs";
6
+ import { t as parseURL } from "../../dist-H3GIh-KK.mjs";
7
7
  import { definePlugin } from "nitro";
8
8
  //#region src/nitro-v3/plugin.ts
9
9
  function getContext(event) {
@@ -1,4 +1,4 @@
1
- import { Y as RequestLogger } from "../../audit-CJl-wZ10.mjs";
1
+ import { $ as RequestLogger } from "../../audit-CC8nfazi.mjs";
2
2
  import { HTTPEvent } from "nitro/h3";
3
3
 
4
4
  //#region src/nitro-v3/useLogger.d.ts
@@ -31,4 +31,4 @@ function serializeEvlogErrorResponse(error, url) {
31
31
  //#endregion
32
32
  export { serializeEvlogErrorResponse as n, resolveEvlogError as t };
33
33
 
34
- //# sourceMappingURL=nitro-DavLelNz.mjs.map
34
+ //# sourceMappingURL=nitro-DErMq_Zj.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"nitro-DavLelNz.mjs","names":[],"sources":["../src/nitro.ts"],"sourcesContent":["import type { EnvironmentContext, LogLevel, RedactConfig, RouteConfig, SamplingConfig } from './types'\nimport { extractErrorStatus } from './shared/errors'\n\nexport { shouldLog, getServiceForPath } from './shared/routes'\n\nexport interface NitroModuleOptions {\n /**\n * Enable or disable all logging globally.\n * @default true\n */\n enabled?: boolean\n\n /**\n * Environment context overrides.\n */\n env?: Partial<EnvironmentContext>\n\n /**\n * Enable pretty printing.\n * @default true in development, false in production\n */\n pretty?: boolean\n\n /**\n * Suppress built-in console output.\n * When true, events are still built, sampled, and passed to drains,\n * but nothing is written to console. Use when drains own the output\n * channel (e.g., stdout-based platforms like GCP Cloud Run, AWS Lambda).\n * @default false\n */\n silent?: boolean\n\n /**\n * Route patterns to include in logging.\n * Supports glob patterns like '/api/**'.\n * If not set, all routes are logged.\n */\n include?: string[]\n\n /**\n * Route patterns to exclude from logging.\n * Supports glob patterns like '/_nitro/**'.\n * Exclusions take precedence over inclusions.\n */\n exclude?: string[]\n\n /**\n * Route-specific service configuration.\n */\n routes?: Record<string, RouteConfig>\n\n /**\n * Sampling configuration for filtering logs.\n */\n sampling?: SamplingConfig\n\n /**\n * Minimum severity for the global `log` API (not request wide events).\n * Order: debug < info < warn < error.\n * @default 'debug'\n */\n minLevel?: LogLevel\n\n /**\n * Auto-redaction configuration for PII protection.\n * `true` enables all built-in PII patterns. Pass an object for fine-grained control.\n */\n redact?: boolean | RedactConfig\n}\n\n/**\n * JSON-friendly subset of evlog Nitro plugin options consumed by the Nitro/Nuxt\n * runtime (read from `runtimeConfig.evlog` or the `__EVLOG_CONFIG` env bridge).\n *\n * @internal Internal Nitro contract — do not use from application code. Use\n * {@link import('./shared/define').EvlogConfig} for the canonical user-facing\n * config shape.\n */\nexport interface NitroPluginEvlogConfig {\n enabled?: boolean\n env?: Record<string, unknown>\n pretty?: boolean\n silent?: boolean\n include?: string[]\n exclude?: string[]\n routes?: Record<string, RouteConfig>\n sampling?: SamplingConfig\n minLevel?: LogLevel\n redact?: boolean | RedactConfig | Record<string, unknown>\n}\n\n/** @deprecated Renamed to {@link NitroPluginEvlogConfig}. Kept for backward compat. */\nexport type EvlogConfig = NitroPluginEvlogConfig\n\n/**\n * Resolve an EvlogError from an error or its cause chain.\n * Both Nitro v2 (h3) and v3 wrap thrown errors — this unwraps them.\n */\nexport function resolveEvlogError(error: Error): Error | null {\n if (error.name === 'EvlogError') return error\n if ((error.cause as Error)?.name === 'EvlogError') return error.cause as Error\n return null\n}\n\nexport { extractErrorStatus } from './shared/errors'\n\n/**\n * Build a standard evlog error JSON response body.\n * Used by both v2 and v3 error handlers to ensure consistent shape.\n */\nexport function serializeEvlogErrorResponse(error: Error, url: string): Record<string, unknown> {\n const status = extractErrorStatus(error)\n const { data } = error as { data?: unknown }\n const statusMessage = (error as { statusMessage?: string }).statusMessage || error.message\n return {\n url,\n status,\n statusCode: status,\n statusText: statusMessage,\n statusMessage,\n message: error.message,\n error: true,\n ...(data !== undefined && { data }),\n }\n}\n\n"],"mappings":";;;;;;AAkGA,SAAgB,kBAAkB,OAA4B;AAC5D,KAAI,MAAM,SAAS,aAAc,QAAO;AACxC,KAAK,MAAM,OAAiB,SAAS,aAAc,QAAO,MAAM;AAChE,QAAO;;;;;;AAST,SAAgB,4BAA4B,OAAc,KAAsC;CAC9F,MAAM,SAAS,mBAAmB,MAAM;CACxC,MAAM,EAAE,SAAS;CACjB,MAAM,gBAAiB,MAAqC,iBAAiB,MAAM;AACnF,QAAO;EACL;EACA;EACA,YAAY;EACZ,YAAY;EACZ;EACA,SAAS,MAAM;EACf,OAAO;EACP,GAAI,SAAS,KAAA,KAAa,EAAE,MAAM;EACnC"}
1
+ {"version":3,"file":"nitro-DErMq_Zj.mjs","names":[],"sources":["../src/nitro.ts"],"sourcesContent":["import type { EnvironmentContext, LogLevel, RedactConfig, RouteConfig, SamplingConfig } from './types'\nimport { extractErrorStatus } from './shared/errors'\n\nexport { shouldLog, getServiceForPath } from './shared/routes'\n\nexport interface NitroModuleOptions {\n /**\n * Enable or disable all logging globally.\n * @default true\n */\n enabled?: boolean\n\n /**\n * Environment context overrides.\n */\n env?: Partial<EnvironmentContext>\n\n /**\n * Enable pretty printing.\n * @default true in development, false in production\n */\n pretty?: boolean\n\n /**\n * Suppress built-in console output.\n * When true, events are still built, sampled, and passed to drains,\n * but nothing is written to console. Use when drains own the output\n * channel (e.g., stdout-based platforms like GCP Cloud Run, AWS Lambda).\n * @default false\n */\n silent?: boolean\n\n /**\n * Route patterns to include in logging.\n * Supports glob patterns like '/api/**'.\n * If not set, all routes are logged.\n */\n include?: string[]\n\n /**\n * Route patterns to exclude from logging.\n * Supports glob patterns like '/_nitro/**'.\n * Exclusions take precedence over inclusions.\n */\n exclude?: string[]\n\n /**\n * Route-specific service configuration.\n */\n routes?: Record<string, RouteConfig>\n\n /**\n * Sampling configuration for filtering logs.\n */\n sampling?: SamplingConfig\n\n /**\n * Minimum severity for the global `log` API (not request wide events).\n * Order: debug < info < warn < error.\n * @default 'debug'\n */\n minLevel?: LogLevel\n\n /**\n * Auto-redaction configuration for PII protection.\n * `true` enables all built-in PII patterns. Pass an object for fine-grained control.\n */\n redact?: boolean | RedactConfig\n}\n\n/**\n * JSON-friendly subset of evlog Nitro plugin options consumed by the Nitro/Nuxt\n * runtime (read from `runtimeConfig.evlog` or the `__EVLOG_CONFIG` env bridge).\n *\n * @internal Internal Nitro contract — do not use from application code. Use\n * {@link import('./shared/define').EvlogConfig} for the canonical user-facing\n * config shape.\n */\nexport interface NitroPluginEvlogConfig {\n enabled?: boolean\n env?: Record<string, unknown>\n pretty?: boolean\n silent?: boolean\n include?: string[]\n exclude?: string[]\n routes?: Record<string, RouteConfig>\n sampling?: SamplingConfig\n minLevel?: LogLevel\n redact?: boolean | RedactConfig | Record<string, unknown>\n}\n\n/** @deprecated Renamed to {@link NitroPluginEvlogConfig}. Kept for backward compat. */\nexport type EvlogConfig = NitroPluginEvlogConfig\n\n/**\n * Resolve an EvlogError from an error or its cause chain.\n * Both Nitro v2 (h3) and v3 wrap thrown errors — this unwraps them.\n */\nexport function resolveEvlogError(error: Error): Error | null {\n if (error.name === 'EvlogError') return error\n if ((error.cause as Error)?.name === 'EvlogError') return error.cause as Error\n return null\n}\n\nexport { extractErrorStatus } from './shared/errors'\n\n/**\n * Build a standard evlog error JSON response body.\n * Used by both v2 and v3 error handlers to ensure consistent shape.\n */\nexport function serializeEvlogErrorResponse(error: Error, url: string): Record<string, unknown> {\n const status = extractErrorStatus(error)\n const { data } = error as { data?: unknown }\n const statusMessage = (error as { statusMessage?: string }).statusMessage || error.message\n return {\n url,\n status,\n statusCode: status,\n statusText: statusMessage,\n statusMessage,\n message: error.message,\n error: true,\n ...(data !== undefined && { data }),\n }\n}\n\n"],"mappings":";;;;;;AAkGA,SAAgB,kBAAkB,OAA4B;AAC5D,KAAI,MAAM,SAAS,aAAc,QAAO;AACxC,KAAK,MAAM,OAAiB,SAAS,aAAc,QAAO,MAAM;AAChE,QAAO;;;;;;AAST,SAAgB,4BAA4B,OAAc,KAAsC;CAC9F,MAAM,SAAS,mBAAmB,MAAM;CACxC,MAAM,EAAE,SAAS;CACjB,MAAM,gBAAiB,MAAqC,iBAAiB,MAAM;AACnF,QAAO;EACL;EACA;EACA,YAAY;EACZ,YAAY;EACZ;EACA,SAAS,MAAM;EACf,OAAO;EACP,GAAI,SAAS,KAAA,KAAa,EAAE,MAAM;EACnC"}
@@ -1,4 +1,4 @@
1
- import { L as EnvironmentContext, Q as SamplingConfig, W as LogLevel, Z as RouteConfig, q as RedactConfig } from "./audit-CJl-wZ10.mjs";
1
+ import { K as LogLevel, R as EnvironmentContext, Y as RedactConfig, nt as SamplingConfig, tt as RouteConfig } from "./audit-CC8nfazi.mjs";
2
2
  //#region src/nitro.d.ts
3
3
  interface NitroModuleOptions {
4
4
  /**
@@ -57,4 +57,4 @@ interface NitroModuleOptions {
57
57
  }
58
58
  //#endregion
59
59
  export { NitroModuleOptions as t };
60
- //# sourceMappingURL=nitro-DHPb9dXG.d.mts.map
60
+ //# sourceMappingURL=nitro-oZre8ab3.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"nitro-DHPb9dXG.d.mts","names":[],"sources":["../src/nitro.ts"],"mappings":";;UAKiB,kBAAA;;AAAjB;;;EAKE,OAAA;EAKM;;;EAAN,GAAA,GAAM,OAAA,CAAQ,kBAAA;EA8CH;;;;EAxCX,MAAA;EANA;;;;;;;EAeA,MAAA;EAmBS;;;;;EAZT,OAAA;EA8BA;;;;;EAvBA,OAAA;;;;EAKA,MAAA,GAAS,MAAA,SAAe,WAAA;;;;EAKxB,QAAA,GAAW,cAAA;;;;;;EAOX,QAAA,GAAW,QAAA;;;;;EAMX,MAAA,aAAmB,YAAA;AAAA"}
1
+ {"version":3,"file":"nitro-oZre8ab3.d.mts","names":[],"sources":["../src/nitro.ts"],"mappings":";;UAKiB,kBAAA;;AAAjB;;;EAKE,OAAA;EAKM;;;EAAN,GAAA,GAAM,OAAA,CAAQ,kBAAA;EA8CH;;;;EAxCX,MAAA;EANA;;;;;;;EAeA,MAAA;EAmBS;;;;;EAZT,OAAA;EA8BA;;;;;EAvBA,OAAA;;;;EAKA,MAAA,GAAS,MAAA,SAAe,WAAA;;;;EAKxB,QAAA,GAAW,cAAA;;;;;;EAOX,QAAA,GAAW,QAAA;;;;;EAMX,MAAA,aAAmB,YAAA;AAAA"}
@@ -89,4 +89,4 @@ async function getNitroRuntimeConfigRecord() {
89
89
  //#endregion
90
90
  export { resolveEvlogConfigForNitroPlugin as n, getNitroRuntimeConfigRecord as t };
91
91
 
92
- //# sourceMappingURL=nitroConfigBridge-aZ1e5upQ.mjs.map
92
+ //# sourceMappingURL=nitroConfigBridge-DKk7eOn-.mjs.map