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 +1 @@
1
- {"version":3,"file":"nitroConfigBridge-aZ1e5upQ.mjs","names":[],"sources":["../src/shared/nitroConfigBridge.ts"],"sourcesContent":["/**\n * How evlog reads Nitro runtime config from **published** ESM.\n *\n * **Why not** `import('nitro/runtime-config')` as a string literal in source?\n * Those subpaths are virtual or specially resolved. App Rollup can resolve them\n * for first-party code; for dependency chunks (`node_modules/evlog/dist/...`),\n * strict presets (e.g. `cloudflare-durable`) may fail with “externals are not\n * allowed”. A literal dynamic import is enough for Rollup to pre-resolve.\n *\n * **Strategy**\n *\n * 1. `process.env.__EVLOG_CONFIG` — JSON set by evlog Nitro modules (no virtual\n * modules; preferred in production Workers builds).\n * 2. Computed module IDs — `['a','b'].join('/')` passed to `import()` so emitted\n * JS does not contain a static `import(\"a/b\")`.\n * 3. Plugin resolution tries Nitro v3 first, then nitropack internal config (v2).\n * 4. Adapter resolution keeps historical order: nitropack runtime barrel, then v3.\n *\n * Not exported from `evlog/toolkit` — package-internal only.\n */\n\nimport type { NitroPluginEvlogConfig } from '../nitro'\n\ntype EvlogConfig = NitroPluginEvlogConfig\n\nconst EVLOG_NITRO_ENV = '__EVLOG_CONFIG' as const\n\ntype NitroRuntimeConfigModule = {\n useRuntimeConfig: () => Record<string, any>\n}\n\nfunction nitroV3RuntimeConfigSpecifier(): string {\n return ['nitro', 'runtime-config'].join('/')\n}\n\nfunction nitropackRuntimeSpecifier(): string {\n return ['nitropack', 'runtime'].join('/')\n}\n\nfunction nitropackInternalRuntimeConfigSpecifier(): string {\n return ['nitropack', 'runtime', 'internal', 'config'].join('/')\n}\n\nasync function importOrNull(specifier: string): Promise<unknown> {\n try {\n return await import(specifier)\n } catch {\n return null\n }\n}\n\nfunction isRuntimeConfigModule(mod: unknown): mod is NitroRuntimeConfigModule {\n return (\n typeof mod === 'object'\n && mod !== null\n && 'useRuntimeConfig' in mod\n && typeof (mod as NitroRuntimeConfigModule).useRuntimeConfig === 'function'\n )\n}\n\n/** Snapshot from env, or `undefined` if unset / invalid JSON. */\nexport function readEvlogConfigFromNitroEnv(): EvlogConfig | undefined {\n const raw = process.env[EVLOG_NITRO_ENV]\n if (raw === undefined || raw === '') return undefined\n try {\n return JSON.parse(raw) as EvlogConfig\n } catch {\n return undefined\n }\n}\n\nlet cachedNitropackRuntime: NitroRuntimeConfigModule | null | undefined\nlet cachedNitroV3Runtime: NitroRuntimeConfigModule | null | undefined\nlet cachedNitropackInternalConfig: NitroRuntimeConfigModule | null | undefined\n\nasync function getNitropackRuntime(): Promise<NitroRuntimeConfigModule | null> {\n if (cachedNitropackRuntime !== undefined) return cachedNitropackRuntime\n const mod = await importOrNull(nitropackRuntimeSpecifier())\n cachedNitropackRuntime = isRuntimeConfigModule(mod) ? mod : null\n return cachedNitropackRuntime\n}\n\nasync function getNitroV3Runtime(): Promise<NitroRuntimeConfigModule | null> {\n if (cachedNitroV3Runtime !== undefined) return cachedNitroV3Runtime\n const mod = await importOrNull(nitroV3RuntimeConfigSpecifier())\n cachedNitroV3Runtime = isRuntimeConfigModule(mod) ? mod : null\n return cachedNitroV3Runtime\n}\n\nasync function getNitropackInternalRuntimeConfig(): Promise<NitroRuntimeConfigModule | null> {\n if (cachedNitropackInternalConfig !== undefined) return cachedNitropackInternalConfig\n const mod = await importOrNull(nitropackInternalRuntimeConfigSpecifier())\n cachedNitropackInternalConfig = isRuntimeConfigModule(mod) ? mod : null\n return cachedNitropackInternalConfig\n}\n\nfunction evlogSlice(config: Record<string, any>): EvlogConfig | undefined {\n const { evlog } = config\n if (evlog && typeof evlog === 'object') return evlog as EvlogConfig\n return undefined\n}\n\n/**\n * Options for evlog Nitro plugins (nitropack v2 and Nitro v3).\n * Env bridge first; then Nitro v3 `runtime-config`; then nitropack internal config.\n */\nexport async function resolveEvlogConfigForNitroPlugin(): Promise<EvlogConfig | undefined> {\n const fromEnv = readEvlogConfigFromNitroEnv()\n if (fromEnv !== undefined) return fromEnv\n\n const v3 = await getNitroV3Runtime()\n if (v3) {\n const slice = evlogSlice(v3.useRuntimeConfig())\n if (slice !== undefined) return slice\n }\n\n const internal = await getNitropackInternalRuntimeConfig()\n if (internal) {\n const slice = evlogSlice(internal.useRuntimeConfig())\n if (slice !== undefined) return slice\n }\n\n return undefined\n}\n\n/**\n * Full `useRuntimeConfig()` object for drain adapters (nitropack first, then v3).\n */\nexport async function getNitroRuntimeConfigRecord(): Promise<Record<string, any> | undefined> {\n const nitropack = await getNitropackRuntime()\n if (nitropack) return nitropack.useRuntimeConfig()\n\n const v3 = await getNitroV3Runtime()\n if (v3) return v3.useRuntimeConfig()\n\n return undefined\n}\n"],"mappings":";AAyBA,MAAM,kBAAkB;AAMxB,SAAS,gCAAwC;AAC/C,QAAO,CAAC,SAAS,iBAAiB,CAAC,KAAK,IAAI;;AAG9C,SAAS,4BAAoC;AAC3C,QAAO,CAAC,aAAa,UAAU,CAAC,KAAK,IAAI;;AAG3C,SAAS,0CAAkD;AACzD,QAAO;EAAC;EAAa;EAAW;EAAY;EAAS,CAAC,KAAK,IAAI;;AAGjE,eAAe,aAAa,WAAqC;AAC/D,KAAI;AACF,SAAO,MAAM,OAAO;SACd;AACN,SAAO;;;AAIX,SAAS,sBAAsB,KAA+C;AAC5E,QACE,OAAO,QAAQ,YACZ,QAAQ,QACR,sBAAsB,OACtB,OAAQ,IAAiC,qBAAqB;;;AAKrE,SAAgB,8BAAuD;CACrE,MAAM,MAAM,QAAQ,IAAI;AACxB,KAAI,QAAQ,KAAA,KAAa,QAAQ,GAAI,QAAO,KAAA;AAC5C,KAAI;AACF,SAAO,KAAK,MAAM,IAAI;SAChB;AACN;;;AAIJ,IAAI;AACJ,IAAI;AACJ,IAAI;AAEJ,eAAe,sBAAgE;AAC7E,KAAI,2BAA2B,KAAA,EAAW,QAAO;CACjD,MAAM,MAAM,MAAM,aAAa,2BAA2B,CAAC;AAC3D,0BAAyB,sBAAsB,IAAI,GAAG,MAAM;AAC5D,QAAO;;AAGT,eAAe,oBAA8D;AAC3E,KAAI,yBAAyB,KAAA,EAAW,QAAO;CAC/C,MAAM,MAAM,MAAM,aAAa,+BAA+B,CAAC;AAC/D,wBAAuB,sBAAsB,IAAI,GAAG,MAAM;AAC1D,QAAO;;AAGT,eAAe,oCAA8E;AAC3F,KAAI,kCAAkC,KAAA,EAAW,QAAO;CACxD,MAAM,MAAM,MAAM,aAAa,yCAAyC,CAAC;AACzE,iCAAgC,sBAAsB,IAAI,GAAG,MAAM;AACnE,QAAO;;AAGT,SAAS,WAAW,QAAsD;CACxE,MAAM,EAAE,UAAU;AAClB,KAAI,SAAS,OAAO,UAAU,SAAU,QAAO;;;;;;AAQjD,eAAsB,mCAAqE;CACzF,MAAM,UAAU,6BAA6B;AAC7C,KAAI,YAAY,KAAA,EAAW,QAAO;CAElC,MAAM,KAAK,MAAM,mBAAmB;AACpC,KAAI,IAAI;EACN,MAAM,QAAQ,WAAW,GAAG,kBAAkB,CAAC;AAC/C,MAAI,UAAU,KAAA,EAAW,QAAO;;CAGlC,MAAM,WAAW,MAAM,mCAAmC;AAC1D,KAAI,UAAU;EACZ,MAAM,QAAQ,WAAW,SAAS,kBAAkB,CAAC;AACrD,MAAI,UAAU,KAAA,EAAW,QAAO;;;;;;AASpC,eAAsB,8BAAwE;CAC5F,MAAM,YAAY,MAAM,qBAAqB;AAC7C,KAAI,UAAW,QAAO,UAAU,kBAAkB;CAElD,MAAM,KAAK,MAAM,mBAAmB;AACpC,KAAI,GAAI,QAAO,GAAG,kBAAkB"}
1
+ {"version":3,"file":"nitroConfigBridge-DKk7eOn-.mjs","names":[],"sources":["../src/shared/nitroConfigBridge.ts"],"sourcesContent":["/**\n * How evlog reads Nitro runtime config from **published** ESM.\n *\n * **Why not** `import('nitro/runtime-config')` as a string literal in source?\n * Those subpaths are virtual or specially resolved. App Rollup can resolve them\n * for first-party code; for dependency chunks (`node_modules/evlog/dist/...`),\n * strict presets (e.g. `cloudflare-durable`) may fail with “externals are not\n * allowed”. A literal dynamic import is enough for Rollup to pre-resolve.\n *\n * **Strategy**\n *\n * 1. `process.env.__EVLOG_CONFIG` — JSON set by evlog Nitro modules (no virtual\n * modules; preferred in production Workers builds).\n * 2. Computed module IDs — `['a','b'].join('/')` passed to `import()` so emitted\n * JS does not contain a static `import(\"a/b\")`.\n * 3. Plugin resolution tries Nitro v3 first, then nitropack internal config (v2).\n * 4. Adapter resolution keeps historical order: nitropack runtime barrel, then v3.\n *\n * Not exported from `evlog/toolkit` — package-internal only.\n */\n\nimport type { NitroPluginEvlogConfig } from '../nitro'\n\ntype EvlogConfig = NitroPluginEvlogConfig\n\nconst EVLOG_NITRO_ENV = '__EVLOG_CONFIG' as const\n\ntype NitroRuntimeConfigModule = {\n useRuntimeConfig: () => Record<string, any>\n}\n\nfunction nitroV3RuntimeConfigSpecifier(): string {\n return ['nitro', 'runtime-config'].join('/')\n}\n\nfunction nitropackRuntimeSpecifier(): string {\n return ['nitropack', 'runtime'].join('/')\n}\n\nfunction nitropackInternalRuntimeConfigSpecifier(): string {\n return ['nitropack', 'runtime', 'internal', 'config'].join('/')\n}\n\nasync function importOrNull(specifier: string): Promise<unknown> {\n try {\n return await import(specifier)\n } catch {\n return null\n }\n}\n\nfunction isRuntimeConfigModule(mod: unknown): mod is NitroRuntimeConfigModule {\n return (\n typeof mod === 'object'\n && mod !== null\n && 'useRuntimeConfig' in mod\n && typeof (mod as NitroRuntimeConfigModule).useRuntimeConfig === 'function'\n )\n}\n\n/** Snapshot from env, or `undefined` if unset / invalid JSON. */\nexport function readEvlogConfigFromNitroEnv(): EvlogConfig | undefined {\n const raw = process.env[EVLOG_NITRO_ENV]\n if (raw === undefined || raw === '') return undefined\n try {\n return JSON.parse(raw) as EvlogConfig\n } catch {\n return undefined\n }\n}\n\nlet cachedNitropackRuntime: NitroRuntimeConfigModule | null | undefined\nlet cachedNitroV3Runtime: NitroRuntimeConfigModule | null | undefined\nlet cachedNitropackInternalConfig: NitroRuntimeConfigModule | null | undefined\n\nasync function getNitropackRuntime(): Promise<NitroRuntimeConfigModule | null> {\n if (cachedNitropackRuntime !== undefined) return cachedNitropackRuntime\n const mod = await importOrNull(nitropackRuntimeSpecifier())\n cachedNitropackRuntime = isRuntimeConfigModule(mod) ? mod : null\n return cachedNitropackRuntime\n}\n\nasync function getNitroV3Runtime(): Promise<NitroRuntimeConfigModule | null> {\n if (cachedNitroV3Runtime !== undefined) return cachedNitroV3Runtime\n const mod = await importOrNull(nitroV3RuntimeConfigSpecifier())\n cachedNitroV3Runtime = isRuntimeConfigModule(mod) ? mod : null\n return cachedNitroV3Runtime\n}\n\nasync function getNitropackInternalRuntimeConfig(): Promise<NitroRuntimeConfigModule | null> {\n if (cachedNitropackInternalConfig !== undefined) return cachedNitropackInternalConfig\n const mod = await importOrNull(nitropackInternalRuntimeConfigSpecifier())\n cachedNitropackInternalConfig = isRuntimeConfigModule(mod) ? mod : null\n return cachedNitropackInternalConfig\n}\n\nfunction evlogSlice(config: Record<string, any>): EvlogConfig | undefined {\n const { evlog } = config\n if (evlog && typeof evlog === 'object') return evlog as EvlogConfig\n return undefined\n}\n\n/**\n * Options for evlog Nitro plugins (nitropack v2 and Nitro v3).\n * Env bridge first; then Nitro v3 `runtime-config`; then nitropack internal config.\n */\nexport async function resolveEvlogConfigForNitroPlugin(): Promise<EvlogConfig | undefined> {\n const fromEnv = readEvlogConfigFromNitroEnv()\n if (fromEnv !== undefined) return fromEnv\n\n const v3 = await getNitroV3Runtime()\n if (v3) {\n const slice = evlogSlice(v3.useRuntimeConfig())\n if (slice !== undefined) return slice\n }\n\n const internal = await getNitropackInternalRuntimeConfig()\n if (internal) {\n const slice = evlogSlice(internal.useRuntimeConfig())\n if (slice !== undefined) return slice\n }\n\n return undefined\n}\n\n/**\n * Full `useRuntimeConfig()` object for drain adapters (nitropack first, then v3).\n */\nexport async function getNitroRuntimeConfigRecord(): Promise<Record<string, any> | undefined> {\n const nitropack = await getNitropackRuntime()\n if (nitropack) return nitropack.useRuntimeConfig()\n\n const v3 = await getNitroV3Runtime()\n if (v3) return v3.useRuntimeConfig()\n\n return undefined\n}\n"],"mappings":";AAyBA,MAAM,kBAAkB;AAMxB,SAAS,gCAAwC;AAC/C,QAAO,CAAC,SAAS,iBAAiB,CAAC,KAAK,IAAI;;AAG9C,SAAS,4BAAoC;AAC3C,QAAO,CAAC,aAAa,UAAU,CAAC,KAAK,IAAI;;AAG3C,SAAS,0CAAkD;AACzD,QAAO;EAAC;EAAa;EAAW;EAAY;EAAS,CAAC,KAAK,IAAI;;AAGjE,eAAe,aAAa,WAAqC;AAC/D,KAAI;AACF,SAAO,MAAM,OAAO;SACd;AACN,SAAO;;;AAIX,SAAS,sBAAsB,KAA+C;AAC5E,QACE,OAAO,QAAQ,YACZ,QAAQ,QACR,sBAAsB,OACtB,OAAQ,IAAiC,qBAAqB;;;AAKrE,SAAgB,8BAAuD;CACrE,MAAM,MAAM,QAAQ,IAAI;AACxB,KAAI,QAAQ,KAAA,KAAa,QAAQ,GAAI,QAAO,KAAA;AAC5C,KAAI;AACF,SAAO,KAAK,MAAM,IAAI;SAChB;AACN;;;AAIJ,IAAI;AACJ,IAAI;AACJ,IAAI;AAEJ,eAAe,sBAAgE;AAC7E,KAAI,2BAA2B,KAAA,EAAW,QAAO;CACjD,MAAM,MAAM,MAAM,aAAa,2BAA2B,CAAC;AAC3D,0BAAyB,sBAAsB,IAAI,GAAG,MAAM;AAC5D,QAAO;;AAGT,eAAe,oBAA8D;AAC3E,KAAI,yBAAyB,KAAA,EAAW,QAAO;CAC/C,MAAM,MAAM,MAAM,aAAa,+BAA+B,CAAC;AAC/D,wBAAuB,sBAAsB,IAAI,GAAG,MAAM;AAC1D,QAAO;;AAGT,eAAe,oCAA8E;AAC3F,KAAI,kCAAkC,KAAA,EAAW,QAAO;CACxD,MAAM,MAAM,MAAM,aAAa,yCAAyC,CAAC;AACzE,iCAAgC,sBAAsB,IAAI,GAAG,MAAM;AACnE,QAAO;;AAGT,SAAS,WAAW,QAAsD;CACxE,MAAM,EAAE,UAAU;AAClB,KAAI,SAAS,OAAO,UAAU,SAAU,QAAO;;;;;;AAQjD,eAAsB,mCAAqE;CACzF,MAAM,UAAU,6BAA6B;AAC7C,KAAI,YAAY,KAAA,EAAW,QAAO;CAElC,MAAM,KAAK,MAAM,mBAAmB;AACpC,KAAI,IAAI;EACN,MAAM,QAAQ,WAAW,GAAG,kBAAkB,CAAC;AAC/C,MAAI,UAAU,KAAA,EAAW,QAAO;;CAGlC,MAAM,WAAW,MAAM,mCAAmC;AAC1D,KAAI,UAAU;EACZ,MAAM,QAAQ,WAAW,SAAS,kBAAkB,CAAC;AACrD,MAAI,UAAU,KAAA,EAAW,QAAO;;;;;;AASpC,eAAsB,8BAAwE;CAC5F,MAAM,YAAY,MAAM,qBAAqB;AAC7C,KAAI,UAAW,QAAO,UAAU,kBAAkB;CAElD,MAAM,KAAK,MAAM,mBAAmB;AACpC,KAAI,GAAI,QAAO,GAAG,kBAAkB"}
@@ -0,0 +1,42 @@
1
+ //#region src/shared/nodeResponse.ts
2
+ /**
3
+ * Bind an evlog middleware {@link MiddlewareLoggerResult.finish | `finish()`}
4
+ * to a Node {@link ServerResponse} lifecycle.
5
+ *
6
+ * Listens to **both** `finish` (response fully transmitted) and `close`
7
+ * (underlying socket closed — including client disconnects mid-response).
8
+ * Idempotent: only the first event to fire calls `finish()`.
9
+ *
10
+ * When `close` fires before `finish`, the client disconnected before the
11
+ * response could complete. In that case the wide event is marked with
12
+ * `connectionClosed: true` so disconnects are observable in the drain.
13
+ *
14
+ * @remarks
15
+ * For background work that must outlive the HTTP response (e.g. resumable
16
+ * streams, post-response usage accounting), use
17
+ * {@link RequestLogger.fork | `req.log.fork(label, fn)`} instead of mutating
18
+ * the request logger after the response has closed — once `finish()` has run,
19
+ * the request logger is sealed.
20
+ *
21
+ * @internal Used by the Express and NestJS integrations.
22
+ */
23
+ function bindNodeResponseLifecycle(res, logger, finish) {
24
+ let settled = false;
25
+ const onFinish = () => {
26
+ if (settled) return;
27
+ settled = true;
28
+ finish({ status: res.statusCode }).catch(() => {});
29
+ };
30
+ const onClose = () => {
31
+ if (settled) return;
32
+ settled = true;
33
+ logger.set({ connectionClosed: true });
34
+ finish({ status: res.statusCode }).catch(() => {});
35
+ };
36
+ res.once("finish", onFinish);
37
+ res.once("close", onClose);
38
+ }
39
+ //#endregion
40
+ export { bindNodeResponseLifecycle as t };
41
+
42
+ //# sourceMappingURL=nodeResponse-BkkionWl.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nodeResponse-BkkionWl.mjs","names":[],"sources":["../src/shared/nodeResponse.ts"],"sourcesContent":["import type { ServerResponse } from 'node:http'\nimport type { RequestLogger } from '../types'\nimport type { MiddlewareLoggerResult } from './middleware'\n\n/**\n * Bind an evlog middleware {@link MiddlewareLoggerResult.finish | `finish()`}\n * to a Node {@link ServerResponse} lifecycle.\n *\n * Listens to **both** `finish` (response fully transmitted) and `close`\n * (underlying socket closed — including client disconnects mid-response).\n * Idempotent: only the first event to fire calls `finish()`.\n *\n * When `close` fires before `finish`, the client disconnected before the\n * response could complete. In that case the wide event is marked with\n * `connectionClosed: true` so disconnects are observable in the drain.\n *\n * @remarks\n * For background work that must outlive the HTTP response (e.g. resumable\n * streams, post-response usage accounting), use\n * {@link RequestLogger.fork | `req.log.fork(label, fn)`} instead of mutating\n * the request logger after the response has closed — once `finish()` has run,\n * the request logger is sealed.\n *\n * @internal Used by the Express and NestJS integrations.\n */\nexport function bindNodeResponseLifecycle(\n res: ServerResponse,\n logger: RequestLogger,\n finish: MiddlewareLoggerResult['finish'],\n): void {\n let settled = false\n\n const onFinish = (): void => {\n if (settled) return\n settled = true\n finish({ status: res.statusCode }).catch(() => {})\n }\n\n const onClose = (): void => {\n if (settled) return\n settled = true\n logger.set({ connectionClosed: true })\n finish({ status: res.statusCode }).catch(() => {})\n }\n\n res.once('finish', onFinish)\n res.once('close', onClose)\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAyBA,SAAgB,0BACd,KACA,QACA,QACM;CACN,IAAI,UAAU;CAEd,MAAM,iBAAuB;AAC3B,MAAI,QAAS;AACb,YAAU;AACV,SAAO,EAAE,QAAQ,IAAI,YAAY,CAAC,CAAC,YAAY,GAAG;;CAGpD,MAAM,gBAAsB;AAC1B,MAAI,QAAS;AACb,YAAU;AACV,SAAO,IAAI,EAAE,kBAAkB,MAAM,CAAC;AACtC,SAAO,EAAE,QAAQ,IAAI,YAAY,CAAC,CAAC,YAAY,GAAG;;AAGpD,KAAI,KAAK,UAAU,SAAS;AAC5B,KAAI,KAAK,SAAS,QAAQ"}
@@ -1,4 +1,5 @@
1
- import { L as EnvironmentContext, Q as SamplingConfig, W as LogLevel, Z as RouteConfig, q as RedactConfig, rt as TransportConfig } from "../audit-CJl-wZ10.mjs";
1
+ import { K as LogLevel, R as EnvironmentContext, Y as RedactConfig, nt as SamplingConfig, st as TransportConfig, tt as RouteConfig } from "../audit-CC8nfazi.mjs";
2
+ import { StreamServerOptions } from "../stream.mjs";
2
3
  import * as _$_nuxt_schema0 from "@nuxt/schema";
3
4
 
4
5
  //#region src/nuxt/module.d.ts
@@ -124,6 +125,32 @@ interface ModuleOptions {
124
125
  * ```
125
126
  */
126
127
  transport?: TransportConfig;
128
+ /**
129
+ * Live stream of wide events, exposed by a small local HTTP server on
130
+ * an ephemeral port. Any consumer (browser tab, CLI, devtool) can
131
+ * subscribe via Server-Sent Events. The URL is printed at startup and
132
+ * written to `.evlog/stream.url`.
133
+ *
134
+ * Strict opt-in — nothing starts unless this is set.
135
+ *
136
+ * - `true` — enable with defaults
137
+ * - `false` — off (same as omitting)
138
+ * - `StreamServerOptions` — full config (port, host, token, ...)
139
+ * - `undefined` (default) — off
140
+ *
141
+ * Local-only: binds to `127.0.0.1` and does not work on serverless
142
+ * platforms (each invocation is isolated).
143
+ *
144
+ * @example
145
+ * ```ts
146
+ * // Enable with defaults
147
+ * evlog: { stream: true }
148
+ *
149
+ * // Custom port + auth token
150
+ * evlog: { stream: { port: 4317, token: process.env.EVLOG_STREAM_TOKEN } }
151
+ * ```
152
+ */
153
+ stream?: boolean | StreamServerOptions;
127
154
  /**
128
155
  * Axiom adapter configuration.
129
156
  * When configured, use `createAxiomDrain()` from `evlog/axiom` to send logs.
@@ -1 +1 @@
1
- {"version":3,"file":"module.d.mts","names":[],"sources":["../../src/nuxt/module.ts"],"mappings":";;;;UAgBU,qBAAA;;EAER,OAAA;EAFQ;EAIR,KAAA;;EAEA,KAAA;EAJA;EAMA,OAAA;AAAA;AAAA,UAGQ,qBAAA;EAHD;;AAAA;;;EASP,OAAA;EAEO;EAAP,OAAA;AAAA;AAAA,UAGQ,yBAAA;EAER;EAAA,OAAA;EAKG;EAHH,OAAA;AAAA;AAAA,KAGG,iBAAA,GAAoB,qBAAA,IAAyB,qBAAA,GAAwB,yBAAA;AAAA,UAEzD,aAAA;EAFyD;;;;;EAQxE,OAAA;EARiG;;AAEnG;EAWE,GAAA,GAAM,OAAA,CAAQ,kBAAA;;;;;;;EAQd,OAAA;EAqFY;;;;EA/EZ,MAAA;EAyLmB;;;;;;;EAhLnB,MAAA;EAfA;;;;;;EAuBA,OAAA;EAuBwB;;;;;;EAfxB,OAAA;EAoEA;;;;;;;;;;;;;EArDA,MAAA,GAAS,MAAA,SAAe,WAAA;EAkHxB;;;;;;;;;;;;;;;AAqDD;EArJC,QAAA,GAAW,cAAA;;;;;;EAOX,QAAA,GAAW,QAAA;;;;;;;;;;;;;EAcX,SAAA,GAAY,eAAA;;;;;;;;;;;;;EAcZ,KAAA,GAAQ,iBAAA;;;;;;;;;;;;;;;EAgBR,IAAA;2DAEE,QAAA;IAEA,WAAA;IAEA,kBAAA,GAAqB,MAAA;IAErB,OAAA,GAAU,MAAA;IAEV,OAAA;EAAA;;;;;;;;;;;;;EAeF,OAAA;kCAEE,MAAA;IAEA,IAAA;IAEA,OAAA;EAAA;;;;;;;;;;;;EAcF,MAAA;qBAEE,GAAA;IAEA,WAAA;IAEA,OAAA;IAEA,IAAA,GAAO,MAAA;IAEP,OAAA;EAAA;;;;;;;;;;;;;;;;;;;EAqBF,MAAA,aAAmB,YAAA;;;;;EAMnB,KAAA,GAAQ,QAAA;;;;;;;EAQR,cAAA;;;;;;EAOA,SAAA;AAAA;AAAA,cACD,QAAA"}
1
+ {"version":3,"file":"module.d.mts","names":[],"sources":["../../src/nuxt/module.ts"],"mappings":";;;;;UAgBU,qBAAA;;EAER,OAAA;;EAEA,KAAA;EAJ6B;EAM7B,KAAA;EAN6B;EAQ7B,OAAA;AAAA;AAAA,UAGQ,qBAAA;EAHR;;;AAAO;;EASP,OAAA;EAAA;EAEA,OAAA;AAAA;AAAA,UAGQ,yBAAA;;EAER,OAAA;EAEO;EAAP,OAAA;AAAA;AAAA,KAGG,iBAAA,GAAoB,qBAAA,IAAyB,qBAAA,GAAwB,yBAAA;AAAA,UAEzD,aAAA;EAFiC;;;;;EAQhD,OAAA;EARwE;;;EAaxE,GAAA,GAAM,OAAA,CAAQ,kBAAA;EAXc;;;;;;EAmB5B,OAAA;EAuEW;;;;EAjEX,MAAA;EAgJY;;;;;;;EAvIZ,MAAA;EAvBM;;;;;;EA+BN,OAAA;EAuBA;;;;;;EAfA,OAAA;EAsDA;;;;;;;;;;;;;EAvCA,MAAA,GAAS,MAAA,SAAe,WAAA;EAyHxB;;;;;;;;;;;;;;;;EAvGA,QAAA,GAAW,cAAA;EA+KF;;AACV;;;EAzKC,QAAA,GAAW,QAAA;;;;;;;;;;;;;EAcX,SAAA,GAAY,eAAA;;;;;;;;;;;;;;;;;;;;;;;;;;EA2BZ,MAAA,aA3B2B,mBAAA;;;;;;;;;;;;;EAyC3B,KAAA,GAAQ,iBAAA;;;;;;;;;;;;;;;EAgBR,IAAA;2DAEE,QAAA;IAEA,WAAA;IAEA,kBAAA,GAAqB,MAAA;IAErB,OAAA,GAAU,MAAA;IAEV,OAAA;EAAA;;;;;;;;;;;;;EAeF,OAAA;kCAEE,MAAA;IAEA,IAAA;IAEA,OAAA;EAAA;;;;;;;;;;;;EAcF,MAAA;qBAEE,GAAA;IAEA,WAAA;IAEA,OAAA;IAEA,IAAA,GAAO,MAAA;IAEP,OAAA;EAAA;;;;;;;;;;;;;;;;;;;EAqBF,MAAA,aAAmB,YAAA;;;;;EAMnB,KAAA,GAAQ,QAAA;;;;;;;EAQR,cAAA;;;;;;EAOA,SAAA;AAAA;AAAA,cACD,QAAA"}
@@ -1,13 +1,11 @@
1
1
  import { n as createStripPlugin, t as createSourceLocationPlugin } from "../source-location-Dco0cRTz.mjs";
2
+ import { n as version, t as name } from "../package-v_MmOZeA.mjs";
2
3
  import { addImports, addPlugin, addServerHandler, addServerImports, addServerPlugin, addVitePlugin, createResolver, defineNuxtModule } from "@nuxt/kit";
3
- //#region package.json
4
- var name = "evlog";
5
- //#endregion
6
4
  //#region src/nuxt/module.ts
7
5
  var module_default = defineNuxtModule({
8
6
  meta: {
9
7
  name,
10
- version: "2.15.0",
8
+ version,
11
9
  configKey: name,
12
10
  docs: "https://evlog.dev"
13
11
  },
@@ -17,6 +15,10 @@ var module_default = defineNuxtModule({
17
15
  const transportEnabled = options.transport?.enabled ?? false;
18
16
  const transportEndpoint = options.transport?.endpoint ?? "/api/_evlog/ingest";
19
17
  const transportCredentials = options.transport?.credentials ?? "same-origin";
18
+ const streamRaw = options.stream;
19
+ const normalizedStream = streamRaw === true ? true : streamRaw && typeof streamRaw === "object" ? streamRaw : false;
20
+ const streamEnabled = normalizedStream !== false;
21
+ options.stream = normalizedStream;
20
22
  nuxt.options.runtimeConfig.evlog = options;
21
23
  nuxt.hook("nitro:config", (nitroConfig) => {
22
24
  nitroConfig.errorHandler = nitroConfig.errorHandler || resolver.resolve("../nitro/errorHandler");
@@ -39,6 +41,11 @@ var module_default = defineNuxtModule({
39
41
  method: "post",
40
42
  handler: resolver.resolve("../runtime/server/routes/_evlog/ingest.post")
41
43
  });
44
+ if (streamEnabled) addServerHandler({
45
+ route: "/api/_evlog/stream-info",
46
+ method: "get",
47
+ handler: resolver.resolve("../runtime/server/routes/_evlog/stream-info.get")
48
+ });
42
49
  addServerPlugin(resolver.resolve("../nitro/plugin"));
43
50
  addPlugin({
44
51
  src: resolver.resolve("../runtime/client/plugin"),
@@ -1 +1 @@
1
- {"version":3,"file":"module.mjs","names":[],"sources":["../../package.json","../../src/nuxt/module.ts"],"sourcesContent":["","import {\n addImports,\n addPlugin,\n addServerHandler,\n addServerImports,\n addServerPlugin,\n addVitePlugin,\n createResolver,\n defineNuxtModule,\n} from '@nuxt/kit'\nimport type { NitroConfig } from 'nitropack'\nimport type { EnvironmentContext, LogLevel, RedactConfig, RouteConfig, SamplingConfig, TransportConfig } from '../types'\nimport { createStripPlugin } from '../vite/strip'\nimport { createSourceLocationPlugin } from '../vite/source-location'\nimport { name, version } from '../../package.json'\n\ninterface ModuleAxiomBaseConfig {\n /** Axiom dataset name */\n dataset: string\n /** Axiom API token */\n token: string\n /** Organization ID (required for Personal Access Tokens) */\n orgId?: string\n /** Request timeout in milliseconds. Default: 5000 */\n timeout?: number\n}\n\ninterface ModuleAxiomEdgeConfig {\n /**\n * Edge URL for Axiom ingest/query endpoints.\n * If no path is provided, uses /v1/ingest/{dataset}.\n * If a custom path is provided, it is used as-is (trailing slash trimmed).\n */\n edgeUrl: string\n /** Mutually exclusive with edgeUrl. */\n baseUrl?: never\n}\n\ninterface ModuleAxiomEndpointConfig {\n /** Base URL for Axiom API. Uses /v1/datasets/{dataset}/ingest. */\n baseUrl?: string\n /** Mutually exclusive with baseUrl. */\n edgeUrl?: never\n}\n\ntype ModuleAxiomConfig = ModuleAxiomBaseConfig & (ModuleAxiomEdgeConfig | ModuleAxiomEndpointConfig)\n\nexport interface ModuleOptions {\n /**\n * Enable or disable all logging globally.\n * When false, all emits, tagged logs, and request logger operations become no-ops.\n * @default true\n */\n enabled?: boolean\n\n /**\n * Environment context overrides.\n */\n env?: Partial<EnvironmentContext>\n\n /**\n * Enable or disable browser console output.\n * When false, client-side logs are suppressed in the browser DevTools console\n * but still sent to the server via transport (if enabled).\n * @default true\n */\n console?: boolean\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 * @example ['/api/**', '/auth/**']\n */\n include?: string[]\n\n /**\n * Route patterns to exclude from logging.\n * Supports glob patterns like '/api/_nuxt_icon/**'.\n * Exclusions take precedence over inclusions.\n * @example ['/api/_nuxt_icon/**', '/health']\n */\n exclude?: string[]\n\n /**\n * Route-specific service configuration.\n * Allows setting different service names for different routes.\n * Patterns are matched using glob syntax.\n *\n * @example\n * ```ts\n * routes: {\n * '/api/foo/**': { service: 'service1' },\n * '/api/bar/**': { service: 'service2' }\n * }\n * ```\n */\n routes?: Record<string, RouteConfig>\n\n /**\n * Sampling configuration for filtering logs.\n * Allows configuring what percentage of logs to keep per level.\n *\n * @example\n * ```ts\n * sampling: {\n * rates: {\n * info: 10, // Keep 10% of info logs\n * warn: 50, // Keep 50% of warning logs\n * debug: 5, // Keep 5% of debug logs\n * error: 100, // Always keep errors (default)\n * }\n * }\n * ```\n */\n sampling?: SamplingConfig\n\n /**\n * Minimum severity for the global `log` API on server and client (not request wide events).\n * Order: debug < info < warn < error.\n * @default 'debug'\n */\n minLevel?: LogLevel\n\n /**\n * Transport configuration for sending client logs to the server.\n *\n * @example\n * ```ts\n * transport: {\n * enabled: true, // send client logs to server via API endpoint\n * endpoint: '/api/_evlog/ingest', // default endpoint (or custom endpoint)\n * credentials: 'include', // optional: cross-origin ingest\n * }\n * ```\n */\n transport?: TransportConfig\n\n /**\n * Axiom adapter configuration.\n * When configured, use `createAxiomDrain()` from `evlog/axiom` to send logs.\n *\n * @example\n * ```ts\n * axiom: {\n * dataset: 'my-app-logs',\n * token: process.env.AXIOM_TOKEN,\n * }\n * ```\n */\n axiom?: ModuleAxiomConfig\n\n /**\n * OTLP adapter configuration.\n * When configured, use `createOTLPDrain()` from `evlog/otlp` to send logs.\n *\n * @example\n * ```ts\n * otlp: {\n * endpoint: 'http://localhost:4318',\n * headers: {\n * 'Authorization': `Basic ${process.env.GRAFANA_TOKEN}`,\n * },\n * }\n * ```\n */\n otlp?: {\n /** OTLP HTTP endpoint (e.g., http://localhost:4318) */\n endpoint: string\n /** Override service name (defaults to event.service) */\n serviceName?: string\n /** Additional resource attributes */\n resourceAttributes?: Record<string, string | number | boolean>\n /** Custom headers (e.g., for authentication) */\n headers?: Record<string, string>\n /** Request timeout in milliseconds. Default: 5000 */\n timeout?: number\n }\n\n /**\n * PostHog adapter configuration.\n * When configured, use `createPostHogDrain()` from `evlog/posthog` to send logs\n * via PostHog Logs (OTLP).\n *\n * @example\n * ```ts\n * posthog: {\n * apiKey: process.env.POSTHOG_API_KEY,\n * }\n * ```\n */\n posthog?: {\n /** PostHog project API key */\n apiKey: string\n /** PostHog host URL. Default: https://us.i.posthog.com */\n host?: string\n /** Request timeout in milliseconds. Default: 5000 */\n timeout?: number\n }\n\n /**\n * Sentry adapter configuration.\n * When configured, use `createSentryDrain()` from `evlog/sentry` to send logs.\n *\n * @example\n * ```ts\n * sentry: {\n * dsn: process.env.SENTRY_DSN,\n * }\n * ```\n */\n sentry?: {\n /** Sentry DSN */\n dsn: string\n /** Environment override (defaults to event.environment) */\n environment?: string\n /** Release version override (defaults to event.version) */\n release?: string\n /** Additional tags to attach as attributes */\n tags?: Record<string, string>\n /** Request timeout in milliseconds. Default: 5000 */\n timeout?: number\n }\n\n /**\n * Auto-redaction configuration for PII protection.\n * `true` enables all built-in PII patterns (email, credit card, IPv4, phone, SSN).\n * Pass an object for fine-grained control.\n *\n * @example\n * ```ts\n * // Enable all built-in PII patterns\n * evlog: { redact: true }\n *\n * // Add custom paths on top of built-ins\n * evlog: {\n * redact: {\n * paths: ['user.password', 'headers.authorization'],\n * }\n * }\n * ```\n */\n redact?: boolean | RedactConfig\n\n /**\n * Log levels to strip from production builds. Set to [] to disable.\n * @default ['debug']\n */\n strip?: LogLevel[]\n\n /**\n * Inject source file:line into log calls.\n * When true, active in both dev and prod.\n * When 'dev', active only in development.\n * @default 'dev'\n */\n sourceLocation?: boolean | 'dev'\n\n /**\n * How long to retain events before cleanup (used by @evlog/nuxthub).\n * Supports \"30d\" (days), \"24h\" (hours), \"60m\" (minutes).\n * @default '30d'\n */\n retention?: string\n}\n\nexport default defineNuxtModule<ModuleOptions>({\n meta: {\n name,\n version,\n configKey: name,\n docs: 'https://evlog.dev',\n },\n defaults: {},\n setup(options, nuxt) {\n const resolver = createResolver(import.meta.url)\n\n const transportEnabled = options.transport?.enabled ?? false\n const transportEndpoint = options.transport?.endpoint ?? '/api/_evlog/ingest'\n const transportCredentials = options.transport?.credentials ?? 'same-origin'\n\n nuxt.options.runtimeConfig.evlog = options\n\n // Register custom error handler for proper EvlogError serialization\n // Only set if not already configured to avoid overwriting user's custom handler\n // Mirror standalone Nitro modules: serialize evlog options into __EVLOG_CONFIG so\n // resolveEvlogConfigForNitroPlugin() picks them up in dev (Nitro worker threads\n // often cannot resolve useRuntimeConfig().evlog via dynamic import reliably).\n // @ts-expect-error nitro:config hook exists but is not in NuxtHooks type\n nuxt.hook('nitro:config', (nitroConfig: NitroConfig) => {\n nitroConfig.errorHandler = nitroConfig.errorHandler || resolver.resolve('../nitro/errorHandler')\n\n const evlogForNitro = nuxt.options.runtimeConfig.evlog ?? options\n if (evlogForNitro !== undefined && typeof evlogForNitro === 'object') {\n process.env.__EVLOG_CONFIG = JSON.stringify(evlogForNitro)\n }\n })\n nuxt.options.runtimeConfig.public.evlog = {\n enabled: options.enabled ?? true,\n console: options.console,\n pretty: options.pretty,\n minLevel: options.minLevel,\n transport: {\n enabled: transportEnabled,\n endpoint: transportEndpoint,\n credentials: transportCredentials,\n },\n }\n\n if (transportEnabled) {\n addServerHandler({\n route: transportEndpoint,\n method: 'post',\n handler: resolver.resolve('../runtime/server/routes/_evlog/ingest.post'),\n })\n }\n\n addServerPlugin(resolver.resolve('../nitro/plugin'))\n\n addPlugin({\n src: resolver.resolve('../runtime/client/plugin'),\n mode: 'client',\n })\n\n addImports([\n {\n name: 'log',\n from: resolver.resolve('../runtime/client/log'),\n },\n {\n name: 'setIdentity',\n from: resolver.resolve('../runtime/client/log'),\n },\n {\n name: 'clearIdentity',\n from: resolver.resolve('../runtime/client/log'),\n },\n {\n name: 'setMinLevel',\n from: resolver.resolve('../runtime/client/log'),\n },\n {\n name: 'createEvlogError',\n from: resolver.resolve('../error'),\n },\n {\n name: 'parseError',\n from: resolver.resolve('../runtime/utils/parseError'),\n },\n ])\n\n addServerImports([\n {\n name: 'useLogger',\n from: resolver.resolve('../runtime/server/useLogger'),\n },\n {\n name: 'log',\n from: resolver.resolve('../logger'),\n },\n {\n name: 'createEvlogError',\n from: resolver.resolve('../error'),\n },\n ])\n\n const stripLevels = options.strip ?? ['debug']\n if (stripLevels.length > 0) {\n addVitePlugin(createStripPlugin(stripLevels))\n }\n\n const srcLoc = options.sourceLocation ?? 'dev'\n if (srcLoc === true || (srcLoc === 'dev' && nuxt.options.dev)) {\n addVitePlugin(createSourceLocationPlugin(true))\n }\n },\n})\n"],"mappings":";;;;;;ACyRA,IAAA,iBAAe,iBAAgC;CAC7C,MAAM;EACJ;EACA;EACA,WAAW;EACX,MAAM;EACP;CACD,UAAU,EAAE;CACZ,MAAM,SAAS,MAAM;EACnB,MAAM,WAAW,eAAe,OAAO,KAAK,IAAI;EAEhD,MAAM,mBAAmB,QAAQ,WAAW,WAAW;EACvD,MAAM,oBAAoB,QAAQ,WAAW,YAAY;EACzD,MAAM,uBAAuB,QAAQ,WAAW,eAAe;AAE/D,OAAK,QAAQ,cAAc,QAAQ;AAQnC,OAAK,KAAK,iBAAiB,gBAA6B;AACtD,eAAY,eAAe,YAAY,gBAAgB,SAAS,QAAQ,wBAAwB;GAEhG,MAAM,gBAAgB,KAAK,QAAQ,cAAc,SAAS;AAC1D,OAAI,kBAAkB,KAAA,KAAa,OAAO,kBAAkB,SAC1D,SAAQ,IAAI,iBAAiB,KAAK,UAAU,cAAc;IAE5D;AACF,OAAK,QAAQ,cAAc,OAAO,QAAQ;GACxC,SAAS,QAAQ,WAAW;GAC5B,SAAS,QAAQ;GACjB,QAAQ,QAAQ;GAChB,UAAU,QAAQ;GAClB,WAAW;IACT,SAAS;IACT,UAAU;IACV,aAAa;IACd;GACF;AAED,MAAI,iBACF,kBAAiB;GACf,OAAO;GACP,QAAQ;GACR,SAAS,SAAS,QAAQ,8CAA8C;GACzE,CAAC;AAGJ,kBAAgB,SAAS,QAAQ,kBAAkB,CAAC;AAEpD,YAAU;GACR,KAAK,SAAS,QAAQ,2BAA2B;GACjD,MAAM;GACP,CAAC;AAEF,aAAW;GACT;IACE,MAAM;IACN,MAAM,SAAS,QAAQ,wBAAwB;IAChD;GACD;IACE,MAAM;IACN,MAAM,SAAS,QAAQ,wBAAwB;IAChD;GACD;IACE,MAAM;IACN,MAAM,SAAS,QAAQ,wBAAwB;IAChD;GACD;IACE,MAAM;IACN,MAAM,SAAS,QAAQ,wBAAwB;IAChD;GACD;IACE,MAAM;IACN,MAAM,SAAS,QAAQ,WAAW;IACnC;GACD;IACE,MAAM;IACN,MAAM,SAAS,QAAQ,8BAA8B;IACtD;GACF,CAAC;AAEF,mBAAiB;GACf;IACE,MAAM;IACN,MAAM,SAAS,QAAQ,8BAA8B;IACtD;GACD;IACE,MAAM;IACN,MAAM,SAAS,QAAQ,YAAY;IACpC;GACD;IACE,MAAM;IACN,MAAM,SAAS,QAAQ,WAAW;IACnC;GACF,CAAC;EAEF,MAAM,cAAc,QAAQ,SAAS,CAAC,QAAQ;AAC9C,MAAI,YAAY,SAAS,EACvB,eAAc,kBAAkB,YAAY,CAAC;EAG/C,MAAM,SAAS,QAAQ,kBAAkB;AACzC,MAAI,WAAW,QAAS,WAAW,SAAS,KAAK,QAAQ,IACvD,eAAc,2BAA2B,KAAK,CAAC;;CAGpD,CAAC"}
1
+ {"version":3,"file":"module.mjs","names":[],"sources":["../../src/nuxt/module.ts"],"sourcesContent":["import {\n addImports,\n addPlugin,\n addServerHandler,\n addServerImports,\n addServerPlugin,\n addVitePlugin,\n createResolver,\n defineNuxtModule,\n} from '@nuxt/kit'\nimport type { NitroConfig } from 'nitropack'\nimport type { EnvironmentContext, LogLevel, RedactConfig, RouteConfig, SamplingConfig, TransportConfig } from '../types'\nimport { createStripPlugin } from '../vite/strip'\nimport { createSourceLocationPlugin } from '../vite/source-location'\nimport { name, version } from '../../package.json'\n\ninterface ModuleAxiomBaseConfig {\n /** Axiom dataset name */\n dataset: string\n /** Axiom API token */\n token: string\n /** Organization ID (required for Personal Access Tokens) */\n orgId?: string\n /** Request timeout in milliseconds. Default: 5000 */\n timeout?: number\n}\n\ninterface ModuleAxiomEdgeConfig {\n /**\n * Edge URL for Axiom ingest/query endpoints.\n * If no path is provided, uses /v1/ingest/{dataset}.\n * If a custom path is provided, it is used as-is (trailing slash trimmed).\n */\n edgeUrl: string\n /** Mutually exclusive with edgeUrl. */\n baseUrl?: never\n}\n\ninterface ModuleAxiomEndpointConfig {\n /** Base URL for Axiom API. Uses /v1/datasets/{dataset}/ingest. */\n baseUrl?: string\n /** Mutually exclusive with baseUrl. */\n edgeUrl?: never\n}\n\ntype ModuleAxiomConfig = ModuleAxiomBaseConfig & (ModuleAxiomEdgeConfig | ModuleAxiomEndpointConfig)\n\nexport interface ModuleOptions {\n /**\n * Enable or disable all logging globally.\n * When false, all emits, tagged logs, and request logger operations become no-ops.\n * @default true\n */\n enabled?: boolean\n\n /**\n * Environment context overrides.\n */\n env?: Partial<EnvironmentContext>\n\n /**\n * Enable or disable browser console output.\n * When false, client-side logs are suppressed in the browser DevTools console\n * but still sent to the server via transport (if enabled).\n * @default true\n */\n console?: boolean\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 * @example ['/api/**', '/auth/**']\n */\n include?: string[]\n\n /**\n * Route patterns to exclude from logging.\n * Supports glob patterns like '/api/_nuxt_icon/**'.\n * Exclusions take precedence over inclusions.\n * @example ['/api/_nuxt_icon/**', '/health']\n */\n exclude?: string[]\n\n /**\n * Route-specific service configuration.\n * Allows setting different service names for different routes.\n * Patterns are matched using glob syntax.\n *\n * @example\n * ```ts\n * routes: {\n * '/api/foo/**': { service: 'service1' },\n * '/api/bar/**': { service: 'service2' }\n * }\n * ```\n */\n routes?: Record<string, RouteConfig>\n\n /**\n * Sampling configuration for filtering logs.\n * Allows configuring what percentage of logs to keep per level.\n *\n * @example\n * ```ts\n * sampling: {\n * rates: {\n * info: 10, // Keep 10% of info logs\n * warn: 50, // Keep 50% of warning logs\n * debug: 5, // Keep 5% of debug logs\n * error: 100, // Always keep errors (default)\n * }\n * }\n * ```\n */\n sampling?: SamplingConfig\n\n /**\n * Minimum severity for the global `log` API on server and client (not request wide events).\n * Order: debug < info < warn < error.\n * @default 'debug'\n */\n minLevel?: LogLevel\n\n /**\n * Transport configuration for sending client logs to the server.\n *\n * @example\n * ```ts\n * transport: {\n * enabled: true, // send client logs to server via API endpoint\n * endpoint: '/api/_evlog/ingest', // default endpoint (or custom endpoint)\n * credentials: 'include', // optional: cross-origin ingest\n * }\n * ```\n */\n transport?: TransportConfig\n\n /**\n * Live stream of wide events, exposed by a small local HTTP server on\n * an ephemeral port. Any consumer (browser tab, CLI, devtool) can\n * subscribe via Server-Sent Events. The URL is printed at startup and\n * written to `.evlog/stream.url`.\n *\n * Strict opt-in — nothing starts unless this is set.\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 * Local-only: binds to `127.0.0.1` and does not work on serverless\n * platforms (each invocation is isolated).\n *\n * @example\n * ```ts\n * // Enable with defaults\n * evlog: { stream: true }\n *\n * // Custom port + auth token\n * evlog: { stream: { port: 4317, token: process.env.EVLOG_STREAM_TOKEN } }\n * ```\n */\n stream?: boolean | import('../stream').StreamServerOptions\n\n /**\n * Axiom adapter configuration.\n * When configured, use `createAxiomDrain()` from `evlog/axiom` to send logs.\n *\n * @example\n * ```ts\n * axiom: {\n * dataset: 'my-app-logs',\n * token: process.env.AXIOM_TOKEN,\n * }\n * ```\n */\n axiom?: ModuleAxiomConfig\n\n /**\n * OTLP adapter configuration.\n * When configured, use `createOTLPDrain()` from `evlog/otlp` to send logs.\n *\n * @example\n * ```ts\n * otlp: {\n * endpoint: 'http://localhost:4318',\n * headers: {\n * 'Authorization': `Basic ${process.env.GRAFANA_TOKEN}`,\n * },\n * }\n * ```\n */\n otlp?: {\n /** OTLP HTTP endpoint (e.g., http://localhost:4318) */\n endpoint: string\n /** Override service name (defaults to event.service) */\n serviceName?: string\n /** Additional resource attributes */\n resourceAttributes?: Record<string, string | number | boolean>\n /** Custom headers (e.g., for authentication) */\n headers?: Record<string, string>\n /** Request timeout in milliseconds. Default: 5000 */\n timeout?: number\n }\n\n /**\n * PostHog adapter configuration.\n * When configured, use `createPostHogDrain()` from `evlog/posthog` to send logs\n * via PostHog Logs (OTLP).\n *\n * @example\n * ```ts\n * posthog: {\n * apiKey: process.env.POSTHOG_API_KEY,\n * }\n * ```\n */\n posthog?: {\n /** PostHog project API key */\n apiKey: string\n /** PostHog host URL. Default: https://us.i.posthog.com */\n host?: string\n /** Request timeout in milliseconds. Default: 5000 */\n timeout?: number\n }\n\n /**\n * Sentry adapter configuration.\n * When configured, use `createSentryDrain()` from `evlog/sentry` to send logs.\n *\n * @example\n * ```ts\n * sentry: {\n * dsn: process.env.SENTRY_DSN,\n * }\n * ```\n */\n sentry?: {\n /** Sentry DSN */\n dsn: string\n /** Environment override (defaults to event.environment) */\n environment?: string\n /** Release version override (defaults to event.version) */\n release?: string\n /** Additional tags to attach as attributes */\n tags?: Record<string, string>\n /** Request timeout in milliseconds. Default: 5000 */\n timeout?: number\n }\n\n /**\n * Auto-redaction configuration for PII protection.\n * `true` enables all built-in PII patterns (email, credit card, IPv4, phone, SSN).\n * Pass an object for fine-grained control.\n *\n * @example\n * ```ts\n * // Enable all built-in PII patterns\n * evlog: { redact: true }\n *\n * // Add custom paths on top of built-ins\n * evlog: {\n * redact: {\n * paths: ['user.password', 'headers.authorization'],\n * }\n * }\n * ```\n */\n redact?: boolean | RedactConfig\n\n /**\n * Log levels to strip from production builds. Set to [] to disable.\n * @default ['debug']\n */\n strip?: LogLevel[]\n\n /**\n * Inject source file:line into log calls.\n * When true, active in both dev and prod.\n * When 'dev', active only in development.\n * @default 'dev'\n */\n sourceLocation?: boolean | 'dev'\n\n /**\n * How long to retain events before cleanup (used by @evlog/nuxthub).\n * Supports \"30d\" (days), \"24h\" (hours), \"60m\" (minutes).\n * @default '30d'\n */\n retention?: string\n}\n\nexport default defineNuxtModule<ModuleOptions>({\n meta: {\n name,\n version,\n configKey: name,\n docs: 'https://evlog.dev',\n },\n defaults: {},\n setup(options, nuxt) {\n const resolver = createResolver(import.meta.url)\n\n const transportEnabled = options.transport?.enabled ?? false\n const transportEndpoint = options.transport?.endpoint ?? '/api/_evlog/ingest'\n const transportCredentials = options.transport?.credentials ?? 'same-origin'\n\n // Normalize `evlog.stream` into a single canonical shape so the Nitro\n // plugin (which reads runtimeConfig.evlog at server boot) sees a\n // consistent value.\n //\n // The stream is exposed by a separate mini HTTP server on its own\n // ephemeral port (see `evlog/stream` → `startStreamServer`). It does\n // NOT register a route in the user's app.\n //\n // Strict opt-in: nothing starts unless the user explicitly asks for it.\n // - `stream === true` → enabled with defaults\n // - `stream === false` → off (alias for undefined)\n // - `stream: { ... }` → enabled with user options\n // - `stream === undefined` → off\n const streamRaw = options.stream\n const normalizedStream\n = streamRaw === true\n ? true\n : streamRaw && typeof streamRaw === 'object'\n ? streamRaw\n : false\n const streamEnabled = normalizedStream !== false\n options.stream = normalizedStream\n\n nuxt.options.runtimeConfig.evlog = options\n\n // Register custom error handler for proper EvlogError serialization\n // Only set if not already configured to avoid overwriting user's custom handler\n // Mirror standalone Nitro modules: serialize evlog options into __EVLOG_CONFIG so\n // resolveEvlogConfigForNitroPlugin() picks them up in dev (Nitro worker threads\n // often cannot resolve useRuntimeConfig().evlog via dynamic import reliably).\n // @ts-expect-error nitro:config hook exists but is not in NuxtHooks type\n nuxt.hook('nitro:config', (nitroConfig: NitroConfig) => {\n nitroConfig.errorHandler = nitroConfig.errorHandler || resolver.resolve('../nitro/errorHandler')\n\n const evlogForNitro = nuxt.options.runtimeConfig.evlog ?? options\n if (evlogForNitro !== undefined && typeof evlogForNitro === 'object') {\n process.env.__EVLOG_CONFIG = JSON.stringify(evlogForNitro)\n }\n })\n nuxt.options.runtimeConfig.public.evlog = {\n enabled: options.enabled ?? true,\n console: options.console,\n pretty: options.pretty,\n minLevel: options.minLevel,\n transport: {\n enabled: transportEnabled,\n endpoint: transportEndpoint,\n credentials: transportCredentials,\n },\n }\n\n if (transportEnabled) {\n addServerHandler({\n route: transportEndpoint,\n method: 'post',\n handler: resolver.resolve('../runtime/server/routes/_evlog/ingest.post'),\n })\n }\n\n if (streamEnabled) {\n // The stream itself is served by an out-of-band HTTP mini-server\n // started in the Nitro plugin — see startStreamServer() in\n // packages/evlog/src/stream.ts. Here we only register a discovery\n // route so a browser tab on the user's app can find the mini-server\n // URL without having to read `.evlog/stream.url` directly.\n addServerHandler({\n route: '/api/_evlog/stream-info',\n method: 'get',\n handler: resolver.resolve('../runtime/server/routes/_evlog/stream-info.get'),\n })\n }\n\n addServerPlugin(resolver.resolve('../nitro/plugin'))\n\n addPlugin({\n src: resolver.resolve('../runtime/client/plugin'),\n mode: 'client',\n })\n\n addImports([\n {\n name: 'log',\n from: resolver.resolve('../runtime/client/log'),\n },\n {\n name: 'setIdentity',\n from: resolver.resolve('../runtime/client/log'),\n },\n {\n name: 'clearIdentity',\n from: resolver.resolve('../runtime/client/log'),\n },\n {\n name: 'setMinLevel',\n from: resolver.resolve('../runtime/client/log'),\n },\n {\n name: 'createEvlogError',\n from: resolver.resolve('../error'),\n },\n {\n name: 'parseError',\n from: resolver.resolve('../runtime/utils/parseError'),\n },\n ])\n\n addServerImports([\n {\n name: 'useLogger',\n from: resolver.resolve('../runtime/server/useLogger'),\n },\n {\n name: 'log',\n from: resolver.resolve('../logger'),\n },\n {\n name: 'createEvlogError',\n from: resolver.resolve('../error'),\n },\n ])\n\n const stripLevels = options.strip ?? ['debug']\n if (stripLevels.length > 0) {\n addVitePlugin(createStripPlugin(stripLevels))\n }\n\n const srcLoc = options.sourceLocation ?? 'dev'\n if (srcLoc === true || (srcLoc === 'dev' && nuxt.options.dev)) {\n addVitePlugin(createSourceLocationPlugin(true))\n }\n },\n})\n"],"mappings":";;;;AAoTA,IAAA,iBAAe,iBAAgC;CAC7C,MAAM;EACJ;EACA;EACA,WAAW;EACX,MAAM;EACP;CACD,UAAU,EAAE;CACZ,MAAM,SAAS,MAAM;EACnB,MAAM,WAAW,eAAe,OAAO,KAAK,IAAI;EAEhD,MAAM,mBAAmB,QAAQ,WAAW,WAAW;EACvD,MAAM,oBAAoB,QAAQ,WAAW,YAAY;EACzD,MAAM,uBAAuB,QAAQ,WAAW,eAAe;EAe/D,MAAM,YAAY,QAAQ;EAC1B,MAAM,mBACF,cAAc,OACZ,OACA,aAAa,OAAO,cAAc,WAChC,YACA;EACR,MAAM,gBAAgB,qBAAqB;AAC3C,UAAQ,SAAS;AAEjB,OAAK,QAAQ,cAAc,QAAQ;AAQnC,OAAK,KAAK,iBAAiB,gBAA6B;AACtD,eAAY,eAAe,YAAY,gBAAgB,SAAS,QAAQ,wBAAwB;GAEhG,MAAM,gBAAgB,KAAK,QAAQ,cAAc,SAAS;AAC1D,OAAI,kBAAkB,KAAA,KAAa,OAAO,kBAAkB,SAC1D,SAAQ,IAAI,iBAAiB,KAAK,UAAU,cAAc;IAE5D;AACF,OAAK,QAAQ,cAAc,OAAO,QAAQ;GACxC,SAAS,QAAQ,WAAW;GAC5B,SAAS,QAAQ;GACjB,QAAQ,QAAQ;GAChB,UAAU,QAAQ;GAClB,WAAW;IACT,SAAS;IACT,UAAU;IACV,aAAa;IACd;GACF;AAED,MAAI,iBACF,kBAAiB;GACf,OAAO;GACP,QAAQ;GACR,SAAS,SAAS,QAAQ,8CAA8C;GACzE,CAAC;AAGJ,MAAI,cAMF,kBAAiB;GACf,OAAO;GACP,QAAQ;GACR,SAAS,SAAS,QAAQ,kDAAkD;GAC7E,CAAC;AAGJ,kBAAgB,SAAS,QAAQ,kBAAkB,CAAC;AAEpD,YAAU;GACR,KAAK,SAAS,QAAQ,2BAA2B;GACjD,MAAM;GACP,CAAC;AAEF,aAAW;GACT;IACE,MAAM;IACN,MAAM,SAAS,QAAQ,wBAAwB;IAChD;GACD;IACE,MAAM;IACN,MAAM,SAAS,QAAQ,wBAAwB;IAChD;GACD;IACE,MAAM;IACN,MAAM,SAAS,QAAQ,wBAAwB;IAChD;GACD;IACE,MAAM;IACN,MAAM,SAAS,QAAQ,wBAAwB;IAChD;GACD;IACE,MAAM;IACN,MAAM,SAAS,QAAQ,WAAW;IACnC;GACD;IACE,MAAM;IACN,MAAM,SAAS,QAAQ,8BAA8B;IACtD;GACF,CAAC;AAEF,mBAAiB;GACf;IACE,MAAM;IACN,MAAM,SAAS,QAAQ,8BAA8B;IACtD;GACD;IACE,MAAM;IACN,MAAM,SAAS,QAAQ,YAAY;IACpC;GACD;IACE,MAAM;IACN,MAAM,SAAS,QAAQ,WAAW;IACnC;GACF,CAAC;EAEF,MAAM,cAAc,QAAQ,SAAS,CAAC,QAAQ;AAC9C,MAAI,YAAY,SAAS,EACvB,eAAc,kBAAkB,YAAY,CAAC;EAG/C,MAAM,SAAS,QAAQ,kBAAkB;AACzC,MAAI,WAAW,QAAS,WAAW,SAAS,KAAK,QAAQ,IACvD,eAAc,2BAA2B,KAAK,CAAC;;CAGpD,CAAC"}
@@ -0,0 +1,7 @@
1
+ //#region package.json
2
+ var name = "evlog";
3
+ var version = "2.17.0";
4
+ //#endregion
5
+ export { version as n, name as t };
6
+
7
+ //# sourceMappingURL=package-v_MmOZeA.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-v_MmOZeA.mjs","names":[],"sources":["../package.json"],"sourcesContent":[""],"mappings":""}
@@ -1,7 +1,7 @@
1
- import { K as ParsedError } from "./audit-CJl-wZ10.mjs";
1
+ import { J as ParsedError } from "./audit-CC8nfazi.mjs";
2
2
 
3
3
  //#region src/runtime/utils/parseError.d.ts
4
4
  declare function parseError(error: unknown): ParsedError;
5
5
  //#endregion
6
6
  export { parseError as t };
7
- //# sourceMappingURL=parseError-B1zJZvQ5.d.mts.map
7
+ //# sourceMappingURL=parseError-yVZ58wIK.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseError-yVZ58wIK.d.mts","names":[],"sources":["../src/runtime/utils/parseError.ts"],"mappings":";;;iBAcgB,UAAA,CAAW,KAAA,YAAiB,WAAA"}
@@ -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 * as _$react_router0 from "react-router";
4
4
 
5
5
  //#region src/react-router/index.d.ts
@@ -1,6 +1,6 @@
1
1
  import { t as extractSafeHeaders } 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 createLoggerStorage } from "../storage-Dwinmg8P.mjs";
4
4
  import { createContext } from "react-router";
5
5
  //#region src/react-router/index.ts
6
6
  const { storage, useLogger } = createLoggerStorage("middleware context. Make sure the evlog middleware is added to your route.");
@@ -35,4 +35,4 @@ function getServiceForPath(path, routes) {
35
35
  //#endregion
36
36
  export { shouldLog as n, getServiceForPath as t };
37
37
 
38
- //# sourceMappingURL=routes-B48wm7Pb.mjs.map
38
+ //# sourceMappingURL=routes-CnIgYWf8.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"routes-B48wm7Pb.mjs","names":[],"sources":["../src/shared/routes.ts"],"sourcesContent":["import type { RouteConfig } from '../types'\nimport { matchesPattern } from '../utils'\n\nexport function shouldLog(path: string, include?: string[], exclude?: string[]): boolean {\n // Check exclusions first (they take precedence)\n if (exclude && exclude.length > 0) {\n if (exclude.some(pattern => matchesPattern(path, pattern))) {\n return false\n }\n }\n\n // If no include patterns, log everything (that wasn't excluded)\n if (!include || include.length === 0) {\n return true\n }\n\n // Log only if path matches at least one include pattern\n return include.some(pattern => matchesPattern(path, pattern))\n}\n\n/**\n * Find the service name for a given path based on route patterns.\n *\n * When multiple patterns match the same path, the first matching pattern wins\n * based on object iteration order. To ensure predictable behavior, order your\n * route patterns from most specific to most general.\n *\n * @param path - The request path to match\n * @param routes - Route configuration mapping patterns to service names\n * @returns The service name for the matching route, or undefined if no match\n *\n * @example\n * ```ts\n * // Good: specific patterns first, general patterns last\n * routes: {\n * '/api/auth/admin/**': { service: 'admin-service' },\n * '/api/auth/**': { service: 'auth-service' },\n * '/api/**': { service: 'api-service' },\n * }\n * ```\n */\nexport function getServiceForPath(path: string, routes?: Record<string, RouteConfig>): string | undefined {\n if (!routes) return undefined\n\n for (const [pattern, config] of Object.entries(routes)) {\n if (matchesPattern(path, pattern)) {\n return config.service\n }\n }\n\n return undefined\n}\n"],"mappings":";;AAGA,SAAgB,UAAU,MAAc,SAAoB,SAA6B;AAEvF,KAAI,WAAW,QAAQ,SAAS;MAC1B,QAAQ,MAAK,YAAW,eAAe,MAAM,QAAQ,CAAC,CACxD,QAAO;;AAKX,KAAI,CAAC,WAAW,QAAQ,WAAW,EACjC,QAAO;AAIT,QAAO,QAAQ,MAAK,YAAW,eAAe,MAAM,QAAQ,CAAC;;;;;;;;;;;;;;;;;;;;;;;AAwB/D,SAAgB,kBAAkB,MAAc,QAA0D;AACxG,KAAI,CAAC,OAAQ,QAAO,KAAA;AAEpB,MAAK,MAAM,CAAC,SAAS,WAAW,OAAO,QAAQ,OAAO,CACpD,KAAI,eAAe,MAAM,QAAQ,CAC/B,QAAO,OAAO"}
1
+ {"version":3,"file":"routes-CnIgYWf8.mjs","names":[],"sources":["../src/shared/routes.ts"],"sourcesContent":["import type { RouteConfig } from '../types'\nimport { matchesPattern } from '../utils'\n\nexport function shouldLog(path: string, include?: string[], exclude?: string[]): boolean {\n // Check exclusions first (they take precedence)\n if (exclude && exclude.length > 0) {\n if (exclude.some(pattern => matchesPattern(path, pattern))) {\n return false\n }\n }\n\n // If no include patterns, log everything (that wasn't excluded)\n if (!include || include.length === 0) {\n return true\n }\n\n // Log only if path matches at least one include pattern\n return include.some(pattern => matchesPattern(path, pattern))\n}\n\n/**\n * Find the service name for a given path based on route patterns.\n *\n * When multiple patterns match the same path, the first matching pattern wins\n * based on object iteration order. To ensure predictable behavior, order your\n * route patterns from most specific to most general.\n *\n * @param path - The request path to match\n * @param routes - Route configuration mapping patterns to service names\n * @returns The service name for the matching route, or undefined if no match\n *\n * @example\n * ```ts\n * // Good: specific patterns first, general patterns last\n * routes: {\n * '/api/auth/admin/**': { service: 'admin-service' },\n * '/api/auth/**': { service: 'auth-service' },\n * '/api/**': { service: 'api-service' },\n * }\n * ```\n */\nexport function getServiceForPath(path: string, routes?: Record<string, RouteConfig>): string | undefined {\n if (!routes) return undefined\n\n for (const [pattern, config] of Object.entries(routes)) {\n if (matchesPattern(path, pattern)) {\n return config.service\n }\n }\n\n return undefined\n}\n"],"mappings":";;AAGA,SAAgB,UAAU,MAAc,SAAoB,SAA6B;AAEvF,KAAI,WAAW,QAAQ,SAAS;MAC1B,QAAQ,MAAK,YAAW,eAAe,MAAM,QAAQ,CAAC,CACxD,QAAO;;AAKX,KAAI,CAAC,WAAW,QAAQ,WAAW,EACjC,QAAO;AAIT,QAAO,QAAQ,MAAK,YAAW,eAAe,MAAM,QAAQ,CAAC;;;;;;;;;;;;;;;;;;;;;;;AAwB/D,SAAgB,kBAAkB,MAAc,QAA0D;AACxG,KAAI,CAAC,OAAQ,QAAO,KAAA;AAEpB,MAAK,MAAM,CAAC,SAAS,WAAW,OAAO,QAAQ,OAAO,CACpD,KAAI,eAAe,MAAM,QAAQ,CAC/B,QAAO,OAAO"}
@@ -1,4 +1,4 @@
1
- import { U as Log, W as LogLevel, rt as TransportConfig } from "../../audit-CJl-wZ10.mjs";
1
+ import { G as Log, K as LogLevel, st as TransportConfig } from "../../audit-CC8nfazi.mjs";
2
2
 
3
3
  //#region src/runtime/client/log.d.ts
4
4
  declare function setIdentity(identity: Record<string, unknown>): void;
@@ -1,4 +1,4 @@
1
- import { _ as getEnvironment, y as getGlobalPluginRunner } from "../../../../audit--n0QRR2Y.mjs";
1
+ import { _ as getEnvironment, y as getGlobalPluginRunner } from "../../../../audit-pV5aLGP0.mjs";
2
2
  import { filterSafeHeaders } from "../../../../utils.mjs";
3
3
  import { createError, defineEventHandler, getHeader, getHeaders, getRequestHost, readBody, setResponseStatus } from "h3";
4
4
  import { useNitroApp } from "nitropack/runtime";
@@ -0,0 +1,18 @@
1
+ import * as _$h3 from "h3";
2
+
3
+ //#region src/runtime/server/routes/_evlog/stream-info.get.d.ts
4
+ /**
5
+ * Discovery endpoint for the local evlog stream server. Reads
6
+ * `<cwd>/.evlog/stream.url` and returns the URL so a browser tab (or any
7
+ * other consumer that reaches the user's HTTP server) can find the
8
+ * mini-server's port without hard-coding it.
9
+ *
10
+ * Returns `{ url: null }` when the stream server isn't running — the
11
+ * consumer should treat that as "not available" and not error.
12
+ */
13
+ declare const _default: _$h3.EventHandler<_$h3.EventHandlerRequest, Promise<{
14
+ url: string | null;
15
+ }>>;
16
+ //#endregion
17
+ export { _default as default };
18
+ //# sourceMappingURL=stream-info.get.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream-info.get.d.mts","names":[],"sources":["../../../../../src/runtime/server/routes/_evlog/stream-info.get.ts"],"mappings":""}
@@ -0,0 +1,28 @@
1
+ import { join } from "node:path";
2
+ import { defineEventHandler, setResponseHeaders } from "h3";
3
+ import { readFile } from "node:fs/promises";
4
+ //#region src/runtime/server/routes/_evlog/stream-info.get.ts
5
+ /**
6
+ * Discovery endpoint for the local evlog stream server. Reads
7
+ * `<cwd>/.evlog/stream.url` and returns the URL so a browser tab (or any
8
+ * other consumer that reaches the user's HTTP server) can find the
9
+ * mini-server's port without hard-coding it.
10
+ *
11
+ * Returns `{ url: null }` when the stream server isn't running — the
12
+ * consumer should treat that as "not available" and not error.
13
+ */
14
+ var stream_info_get_default = defineEventHandler(async (event) => {
15
+ setResponseHeaders(event, {
16
+ "Cache-Control": "no-store",
17
+ "Access-Control-Allow-Origin": "*"
18
+ });
19
+ try {
20
+ return { url: (await readFile(join(process.cwd(), ".evlog", "stream.url"), "utf-8")).trim() || null };
21
+ } catch {
22
+ return { url: null };
23
+ }
24
+ });
25
+ //#endregion
26
+ export { stream_info_get_default as default };
27
+
28
+ //# sourceMappingURL=stream-info.get.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream-info.get.mjs","names":[],"sources":["../../../../../src/runtime/server/routes/_evlog/stream-info.get.ts"],"sourcesContent":["import { readFile } from 'node:fs/promises'\nimport { join } from 'node:path'\nimport { defineEventHandler, setResponseHeaders } from 'h3'\n\n/**\n * Discovery endpoint for the local evlog stream server. Reads\n * `<cwd>/.evlog/stream.url` and returns the URL so a browser tab (or any\n * other consumer that reaches the user's HTTP server) can find the\n * mini-server's port without hard-coding it.\n *\n * Returns `{ url: null }` when the stream server isn't running — the\n * consumer should treat that as \"not available\" and not error.\n */\nexport default defineEventHandler(async (event) => {\n setResponseHeaders(event, {\n 'Cache-Control': 'no-store',\n 'Access-Control-Allow-Origin': '*',\n })\n\n try {\n const path = join(process.cwd(), '.evlog', 'stream.url')\n const url = (await readFile(path, 'utf-8')).trim()\n return { url: url || null }\n } catch {\n return { url: null }\n }\n})\n"],"mappings":";;;;;;;;;;;;;AAaA,IAAA,0BAAe,mBAAmB,OAAO,UAAU;AACjD,oBAAmB,OAAO;EACxB,iBAAiB;EACjB,+BAA+B;EAChC,CAAC;AAEF,KAAI;AAGF,SAAO,EAAE,MADI,MAAM,SADN,KAAK,QAAQ,KAAK,EAAE,UAAU,aACX,EAAE,QAAQ,EAAE,MAC3B,IAAI,MAAM;SACrB;AACN,SAAO,EAAE,KAAK,MAAM;;EAEtB"}
@@ -1,2 +1,2 @@
1
- import { t as useLogger } from "../../useLogger-Cb1R6bQE.mjs";
1
+ import { t as useLogger } from "../../useLogger-BsPL4AQm.mjs";
2
2
  export { useLogger };
@@ -1,3 +1,3 @@
1
- import { K as ParsedError } from "../../audit-CJl-wZ10.mjs";
2
- import { t as parseError } from "../../parseError-B1zJZvQ5.mjs";
1
+ import { J as ParsedError } from "../../audit-CC8nfazi.mjs";
2
+ import { t as parseError } from "../../parseError-yVZ58wIK.mjs";
3
3
  export { ParsedError, parseError };
@@ -1,5 +1,11 @@
1
1
  import { t as extractErrorStatus } from "../../errors-BQgyQ9xe.mjs";
2
2
  //#region src/runtime/utils/parseError.ts
3
+ function pickCode(value) {
4
+ if (value && typeof value === "object" && "code" in value) {
5
+ const { code } = value;
6
+ if (typeof code === "string") return code;
7
+ }
8
+ }
3
9
  function parseError(error) {
4
10
  if (error && typeof error === "object" && "data" in error) {
5
11
  const { data, message: fetchMessage, statusCode: fetchStatusCode, status: fetchStatus } = error;
@@ -7,6 +13,7 @@ function parseError(error) {
7
13
  return {
8
14
  message: data?.statusText || data?.statusMessage || data?.message || fetchMessage || "An error occurred",
9
15
  status: data?.status || data?.statusCode || fetchStatus || fetchStatusCode || 500,
16
+ code: pickCode(evlogData) ?? pickCode(data) ?? pickCode(error),
10
17
  why: evlogData?.why,
11
18
  fix: evlogData?.fix,
12
19
  link: evlogData?.link,
@@ -16,6 +23,7 @@ function parseError(error) {
16
23
  if (error instanceof Error) return {
17
24
  message: error.message,
18
25
  status: extractErrorStatus(error),
26
+ code: pickCode(error),
19
27
  raw: error
20
28
  };
21
29
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"parseError.mjs","names":[],"sources":["../../../src/runtime/utils/parseError.ts"],"sourcesContent":["import type { FetchError } from 'ofetch'\nimport type { ParsedError } from '../../types'\nimport { extractErrorStatus } from '../../shared/errors'\n\nexport type { ParsedError }\n\nexport function parseError(error: unknown): ParsedError {\n if (error && typeof error === 'object' && 'data' in error) {\n const { data, message: fetchMessage, statusCode: fetchStatusCode, status: fetchStatus } = error as FetchError & { status?: number }\n\n // Support both nested data.data (fetch response) and direct data (EvlogError)\n const evlogData = (data?.data ?? data) as { why?: string, fix?: string, link?: string } | undefined\n\n return {\n // Prefer statusText, then statusMessage (or message) for the error message\n message: data?.statusText || data?.statusMessage || data?.message || fetchMessage || 'An error occurred',\n // Prefer status, then statusCode for the status value\n status: data?.status || data?.statusCode || fetchStatus || fetchStatusCode || 500,\n why: evlogData?.why,\n fix: evlogData?.fix,\n link: evlogData?.link,\n raw: error,\n }\n }\n\n if (error instanceof Error) {\n return {\n message: error.message,\n status: extractErrorStatus(error),\n raw: error,\n }\n }\n\n return {\n message: String(error),\n status: 500,\n raw: error,\n }\n}\n"],"mappings":";;AAMA,SAAgB,WAAW,OAA6B;AACtD,KAAI,SAAS,OAAO,UAAU,YAAY,UAAU,OAAO;EACzD,MAAM,EAAE,MAAM,SAAS,cAAc,YAAY,iBAAiB,QAAQ,gBAAgB;EAG1F,MAAM,YAAa,MAAM,QAAQ;AAEjC,SAAO;GAEL,SAAS,MAAM,cAAc,MAAM,iBAAiB,MAAM,WAAW,gBAAgB;GAErF,QAAQ,MAAM,UAAU,MAAM,cAAc,eAAe,mBAAmB;GAC9E,KAAK,WAAW;GAChB,KAAK,WAAW;GAChB,MAAM,WAAW;GACjB,KAAK;GACN;;AAGH,KAAI,iBAAiB,MACnB,QAAO;EACL,SAAS,MAAM;EACf,QAAQ,mBAAmB,MAAM;EACjC,KAAK;EACN;AAGH,QAAO;EACL,SAAS,OAAO,MAAM;EACtB,QAAQ;EACR,KAAK;EACN"}
1
+ {"version":3,"file":"parseError.mjs","names":[],"sources":["../../../src/runtime/utils/parseError.ts"],"sourcesContent":["import type { FetchError } from 'ofetch'\nimport type { ParsedError } from '../../types'\nimport { extractErrorStatus } from '../../shared/errors'\n\nexport type { ParsedError }\n\nfunction pickCode(value: unknown): string | undefined {\n if (value && typeof value === 'object' && 'code' in value) {\n const { code } = value as { code?: unknown }\n if (typeof code === 'string') return code\n }\n return undefined\n}\n\nexport function parseError(error: unknown): ParsedError {\n if (error && typeof error === 'object' && 'data' in error) {\n const { data, message: fetchMessage, statusCode: fetchStatusCode, status: fetchStatus } = error as FetchError & { status?: number }\n\n // Support both nested data.data (fetch response) and direct data (EvlogError)\n const evlogData = (data?.data ?? data) as { code?: string, why?: string, fix?: string, link?: string } | undefined\n\n return {\n // Prefer statusText, then statusMessage (or message) for the error message\n message: data?.statusText || data?.statusMessage || data?.message || fetchMessage || 'An error occurred',\n // Prefer status, then statusCode for the status value\n status: data?.status || data?.statusCode || fetchStatus || fetchStatusCode || 500,\n // Prefer the structured `data.code`, then `data.code` directly, then a top-level `error.code`\n code: pickCode(evlogData) ?? pickCode(data) ?? pickCode(error),\n why: evlogData?.why,\n fix: evlogData?.fix,\n link: evlogData?.link,\n raw: error,\n }\n }\n\n if (error instanceof Error) {\n return {\n message: error.message,\n status: extractErrorStatus(error),\n code: pickCode(error),\n raw: error,\n }\n }\n\n return {\n message: String(error),\n status: 500,\n raw: error,\n }\n}\n"],"mappings":";;AAMA,SAAS,SAAS,OAAoC;AACpD,KAAI,SAAS,OAAO,UAAU,YAAY,UAAU,OAAO;EACzD,MAAM,EAAE,SAAS;AACjB,MAAI,OAAO,SAAS,SAAU,QAAO;;;AAKzC,SAAgB,WAAW,OAA6B;AACtD,KAAI,SAAS,OAAO,UAAU,YAAY,UAAU,OAAO;EACzD,MAAM,EAAE,MAAM,SAAS,cAAc,YAAY,iBAAiB,QAAQ,gBAAgB;EAG1F,MAAM,YAAa,MAAM,QAAQ;AAEjC,SAAO;GAEL,SAAS,MAAM,cAAc,MAAM,iBAAiB,MAAM,WAAW,gBAAgB;GAErF,QAAQ,MAAM,UAAU,MAAM,cAAc,eAAe,mBAAmB;GAE9E,MAAM,SAAS,UAAU,IAAI,SAAS,KAAK,IAAI,SAAS,MAAM;GAC9D,KAAK,WAAW;GAChB,KAAK,WAAW;GAChB,MAAM,WAAW;GACjB,KAAK;GACN;;AAGH,KAAI,iBAAiB,MACnB,QAAO;EACL,SAAS,MAAM;EACf,QAAQ,mBAAmB,MAAM;EACjC,MAAM,SAAS,MAAM;EACrB,KAAK;EACN;AAGH,QAAO;EACL,SAAS,OAAO,MAAM;EACtB,QAAQ;EACR,KAAK;EACN"}
@@ -18,4 +18,4 @@ const OTEL_SEVERITY_TEXT = {
18
18
  //#endregion
19
19
  export { OTEL_SEVERITY_TEXT as n, OTEL_SEVERITY_NUMBER as t };
20
20
 
21
- //# sourceMappingURL=severity-BYWZ96Sb.mjs.map
21
+ //# sourceMappingURL=severity-R5Egq3qz.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"severity-BYWZ96Sb.mjs","names":[],"sources":["../src/shared/severity.ts"],"sourcesContent":["import type { LogLevel } from '../types'\n\n/**\n * OpenTelemetry severity numbers per evlog log level.\n * @see https://opentelemetry.io/docs/specs/otel/logs/data-model/#field-severitynumber\n */\nexport const OTEL_SEVERITY_NUMBER: Record<LogLevel, number> = {\n debug: 5,\n info: 9,\n warn: 13,\n error: 17,\n}\n\nexport const OTEL_SEVERITY_TEXT: Record<LogLevel, string> = {\n debug: 'DEBUG',\n info: 'INFO',\n warn: 'WARN',\n error: 'ERROR',\n}\n"],"mappings":";;;;;AAMA,MAAa,uBAAiD;CAC5D,OAAO;CACP,MAAM;CACN,MAAM;CACN,OAAO;CACR;AAED,MAAa,qBAA+C;CAC1D,OAAO;CACP,MAAM;CACN,MAAM;CACN,OAAO;CACR"}
1
+ {"version":3,"file":"severity-R5Egq3qz.mjs","names":[],"sources":["../src/shared/severity.ts"],"sourcesContent":["import type { LogLevel } from '../types'\n\n/**\n * OpenTelemetry severity numbers per evlog log level.\n * @see https://opentelemetry.io/docs/specs/otel/logs/data-model/#field-severitynumber\n */\nexport const OTEL_SEVERITY_NUMBER: Record<LogLevel, number> = {\n debug: 5,\n info: 9,\n warn: 13,\n error: 17,\n}\n\nexport const OTEL_SEVERITY_TEXT: Record<LogLevel, string> = {\n debug: 'DEBUG',\n info: 'INFO',\n warn: 'WARN',\n error: 'ERROR',\n}\n"],"mappings":";;;;;AAMA,MAAa,uBAAiD;CAC5D,OAAO;CACP,MAAM;CACN,MAAM;CACN,OAAO;CACR;AAED,MAAa,qBAA+C;CAC1D,OAAO;CACP,MAAM;CACN,MAAM;CACN,OAAO;CACR"}
@@ -24,4 +24,4 @@ function createLoggerStorage(contextHint) {
24
24
  //#endregion
25
25
  export { createLoggerStorage as t };
26
26
 
27
- //# sourceMappingURL=storage-BT-3fT1-.mjs.map
27
+ //# sourceMappingURL=storage-Dwinmg8P.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"storage-BT-3fT1-.mjs","names":[],"sources":["../src/shared/storage.ts"],"sourcesContent":["import { AsyncLocalStorage } from 'node:async_hooks'\nimport type { RequestLogger } from '../types'\n\n/**\n * Create a request-scoped `AsyncLocalStorage` and matching `useLogger`\n * accessor. Every framework that exposes `useLogger()` (Express, Fastify,\n * NestJS, SvelteKit) calls this once at module level.\n *\n * @param contextHint - Appended to the error message when `useLogger()` is\n * called outside of a request, e.g. `\"middleware context. Make sure\n * app.use(evlog()) is registered before your routes.\"`.\n */\nexport function createLoggerStorage(contextHint: string) {\n const storage = new AsyncLocalStorage<RequestLogger>()\n\n function useLogger<T extends object = Record<string, unknown>>(): RequestLogger<T> {\n const logger = storage.getStore()\n if (!logger) {\n throw new Error(\n `[evlog] useLogger() was called outside of an evlog ${contextHint}`,\n )\n }\n return logger as RequestLogger<T>\n }\n\n return { storage, useLogger }\n}\n"],"mappings":";;;;;;;;;;;AAYA,SAAgB,oBAAoB,aAAqB;CACvD,MAAM,UAAU,IAAI,mBAAkC;CAEtD,SAAS,YAA0E;EACjF,MAAM,SAAS,QAAQ,UAAU;AACjC,MAAI,CAAC,OACH,OAAM,IAAI,MACR,sDAAsD,cACvD;AAEH,SAAO;;AAGT,QAAO;EAAE;EAAS;EAAW"}
1
+ {"version":3,"file":"storage-Dwinmg8P.mjs","names":[],"sources":["../src/shared/storage.ts"],"sourcesContent":["import { AsyncLocalStorage } from 'node:async_hooks'\nimport type { RequestLogger } from '../types'\n\n/**\n * Create a request-scoped `AsyncLocalStorage` and matching `useLogger`\n * accessor. Every framework that exposes `useLogger()` (Express, Fastify,\n * NestJS, SvelteKit) calls this once at module level.\n *\n * @param contextHint - Appended to the error message when `useLogger()` is\n * called outside of a request, e.g. `\"middleware context. Make sure\n * app.use(evlog()) is registered before your routes.\"`.\n */\nexport function createLoggerStorage(contextHint: string) {\n const storage = new AsyncLocalStorage<RequestLogger>()\n\n function useLogger<T extends object = Record<string, unknown>>(): RequestLogger<T> {\n const logger = storage.getStore()\n if (!logger) {\n throw new Error(\n `[evlog] useLogger() was called outside of an evlog ${contextHint}`,\n )\n }\n return logger as RequestLogger<T>\n }\n\n return { storage, useLogger }\n}\n"],"mappings":";;;;;;;;;;;AAYA,SAAgB,oBAAoB,aAAqB;CACvD,MAAM,UAAU,IAAI,mBAAkC;CAEtD,SAAS,YAA0E;EACjF,MAAM,SAAS,QAAQ,UAAU;AACjC,MAAI,CAAC,OACH,OAAM,IAAI,MACR,sDAAsD,cACvD;AAEH,SAAO;;AAGT,QAAO;EAAE;EAAS;EAAW"}