evlog 2.17.0 → 2.19.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 (202) hide show
  1. package/README.md +95 -2
  2. package/dist/adapters/axiom.d.mts +1 -1
  3. package/dist/adapters/axiom.mjs +2 -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 +2 -2
  7. package/dist/adapters/datadog.d.mts +1 -1
  8. package/dist/adapters/datadog.mjs +2 -2
  9. package/dist/adapters/fs.d.mts +1 -1
  10. package/dist/adapters/fs.mjs +2 -2
  11. package/dist/adapters/hyperdx.d.mts +1 -1
  12. package/dist/adapters/hyperdx.mjs +1 -1
  13. package/dist/adapters/memory.d.mts +116 -0
  14. package/dist/adapters/memory.d.mts.map +1 -0
  15. package/dist/adapters/memory.mjs +191 -0
  16. package/dist/adapters/memory.mjs.map +1 -0
  17. package/dist/adapters/otlp.d.mts +1 -1
  18. package/dist/adapters/otlp.mjs +4 -4
  19. package/dist/adapters/posthog.d.mts +1 -1
  20. package/dist/adapters/posthog.mjs +2 -2
  21. package/dist/adapters/sentry.d.mts +1 -1
  22. package/dist/adapters/sentry.mjs +3 -3
  23. package/dist/ai/index.d.mts +1 -1
  24. package/dist/{audit-pV5aLGP0.mjs → audit-BFwTUxBJ.mjs} +475 -151
  25. package/dist/audit-BFwTUxBJ.mjs.map +1 -0
  26. package/dist/{audit-CC8nfazi.d.mts → audit-BUAajsPU.d.mts} +126 -35
  27. package/dist/audit-BUAajsPU.d.mts.map +1 -0
  28. package/dist/better-auth/index.d.mts +1 -1
  29. package/dist/browser.d.mts +1 -1
  30. package/dist/{define-D6OJdSUH.mjs → define-Bpaymi-h.mjs} +2 -1
  31. package/dist/define-Bpaymi-h.mjs.map +1 -0
  32. package/dist/{define-MSdhzmXn.d.mts → define-DGwZkZ7x.d.mts} +8 -3
  33. package/dist/define-DGwZkZ7x.d.mts.map +1 -0
  34. package/dist/dev-terminal-D4UaEm17.mjs +54 -0
  35. package/dist/dev-terminal-D4UaEm17.mjs.map +1 -0
  36. package/dist/{dist-H3GIh-KK.mjs → dist-DdQWiZn8.mjs} +1 -1
  37. package/dist/{dist-H3GIh-KK.mjs.map → dist-DdQWiZn8.mjs.map} +1 -1
  38. package/dist/{drain-X7_5szSI.mjs → drain-D_fy7m0n.mjs} +3 -3
  39. package/dist/drain-D_fy7m0n.mjs.map +1 -0
  40. package/dist/elysia/index.d.mts +3 -3
  41. package/dist/elysia/index.d.mts.map +1 -1
  42. package/dist/elysia/index.mjs +8 -5
  43. package/dist/elysia/index.mjs.map +1 -1
  44. package/dist/enrich-drain-CG_2Nix-.mjs +122 -0
  45. package/dist/enrich-drain-CG_2Nix-.mjs.map +1 -0
  46. package/dist/{enricher-DxgML6IC.d.mts → enricher-CuMbbdqp.d.mts} +2 -2
  47. package/dist/{enricher-DxgML6IC.d.mts.map → enricher-CuMbbdqp.d.mts.map} +1 -1
  48. package/dist/{enricher-N0erZS87.mjs → enricher-DAWf2-Fx.mjs} +2 -2
  49. package/dist/{enricher-N0erZS87.mjs.map → enricher-DAWf2-Fx.mjs.map} +1 -1
  50. package/dist/enrichers.d.mts +2 -2
  51. package/dist/enrichers.mjs +2 -2
  52. package/dist/{error-CpbbtyXL.d.mts → error-DwajXSKM.d.mts} +2 -2
  53. package/dist/{error-CpbbtyXL.d.mts.map → error-DwajXSKM.d.mts.map} +1 -1
  54. package/dist/error.d.mts +1 -1
  55. package/dist/{errors-DySW1F9_.d.mts → errors-CAq8pYpW.d.mts} +2 -2
  56. package/dist/{errors-DySW1F9_.d.mts.map → errors-CAq8pYpW.d.mts.map} +1 -1
  57. package/dist/{errors-BQgyQ9xe.mjs → errors-DA0cyr8q.mjs} +1 -1
  58. package/dist/{errors-BQgyQ9xe.mjs.map → errors-DA0cyr8q.mjs.map} +1 -1
  59. package/dist/{event-1BMl7o0k.mjs → event-qwAv-7AZ.mjs} +1 -1
  60. package/dist/{event-1BMl7o0k.mjs.map → event-qwAv-7AZ.mjs.map} +1 -1
  61. package/dist/express/index.d.mts +3 -3
  62. package/dist/express/index.d.mts.map +1 -1
  63. package/dist/express/index.mjs +3 -3
  64. package/dist/express/index.mjs.map +1 -1
  65. package/dist/fastify/index.d.mts +9 -4
  66. package/dist/fastify/index.d.mts.map +1 -1
  67. package/dist/fastify/index.mjs +10 -8
  68. package/dist/fastify/index.mjs.map +1 -1
  69. package/dist/{fork-8u_zFOJq.mjs → fork-CYm453dq.mjs} +40 -14
  70. package/dist/fork-CYm453dq.mjs.map +1 -0
  71. package/dist/{headers-CU-QqnYg.mjs → headers-VtmnWcfn.mjs} +1 -1
  72. package/dist/{headers-CU-QqnYg.mjs.map → headers-VtmnWcfn.mjs.map} +1 -1
  73. package/dist/hono/index.d.mts +2 -2
  74. package/dist/hono/index.d.mts.map +1 -1
  75. package/dist/hono/index.mjs +10 -2
  76. package/dist/hono/index.mjs.map +1 -1
  77. package/dist/{http-6umVAKDW.mjs → http-Bept5EIC.mjs} +2 -2
  78. package/dist/{http-6umVAKDW.mjs.map → http-Bept5EIC.mjs.map} +1 -1
  79. package/dist/http.d.mts +1 -1
  80. package/dist/{index-o1_z4phv.d.mts → index-CE7kH0II.d.mts} +15 -8
  81. package/dist/index-CE7kH0II.d.mts.map +1 -0
  82. package/dist/index.d.mts +9 -9
  83. package/dist/index.mjs +9 -15
  84. package/dist/index.mjs.map +1 -1
  85. package/dist/{integration-DTZtjSqh.mjs → integration-CR601uyW.mjs} +3 -3
  86. package/dist/{integration-DTZtjSqh.mjs.map → integration-CR601uyW.mjs.map} +1 -1
  87. package/dist/{logger-DntcxxHg.d.mts → logger-BccCJUyD.d.mts} +11 -3
  88. package/dist/logger-BccCJUyD.d.mts.map +1 -0
  89. package/dist/logger.d.mts +2 -2
  90. package/dist/logger.mjs +2 -2
  91. package/dist/{middleware-U-lIAzHg.d.mts → middleware-DQ6-h8h0.d.mts} +9 -2
  92. package/dist/middleware-DQ6-h8h0.d.mts.map +1 -0
  93. package/dist/nestjs/index.d.mts +2 -2
  94. package/dist/nestjs/index.mjs +4 -4
  95. package/dist/next/client.d.mts +1 -1
  96. package/dist/next/index.d.mts +6 -5
  97. package/dist/next/index.d.mts.map +1 -1
  98. package/dist/next/index.mjs +36 -38
  99. package/dist/next/index.mjs.map +1 -1
  100. package/dist/next/instrumentation.d.mts +1 -1
  101. package/dist/next/instrumentation.mjs +1 -1
  102. package/dist/next/instrumentation.mjs.map +1 -1
  103. package/dist/nitro/errorHandler.mjs +10 -16
  104. package/dist/nitro/errorHandler.mjs.map +1 -1
  105. package/dist/nitro/module.d.mts +2 -2
  106. package/dist/nitro/module.d.mts.map +1 -1
  107. package/dist/nitro/module.mjs +8 -2
  108. package/dist/nitro/module.mjs.map +1 -1
  109. package/dist/nitro/plugin.mjs +37 -65
  110. package/dist/nitro/plugin.mjs.map +1 -1
  111. package/dist/nitro/v3/errorHandler.d.mts +0 -7
  112. package/dist/nitro/v3/errorHandler.mjs +13 -15
  113. package/dist/nitro/v3/errorHandler.mjs.map +1 -1
  114. package/dist/nitro/v3/index.d.mts +2 -2
  115. package/dist/nitro/v3/module.d.mts +1 -1
  116. package/dist/nitro/v3/module.d.mts.map +1 -1
  117. package/dist/nitro/v3/module.mjs +9 -4
  118. package/dist/nitro/v3/module.mjs.map +1 -1
  119. package/dist/nitro/v3/plugin.mjs +77 -44
  120. package/dist/nitro/v3/plugin.mjs.map +1 -1
  121. package/dist/nitro/v3/useLogger.d.mts +1 -1
  122. package/dist/nitro-ClRZLD1g.mjs +96 -0
  123. package/dist/nitro-ClRZLD1g.mjs.map +1 -0
  124. package/dist/{nitro-oZre8ab3.d.mts → nitro-zCXTylj4.d.mts} +7 -2
  125. package/dist/nitro-zCXTylj4.d.mts.map +1 -0
  126. package/dist/nitroConfigBridge-BkVWnSV3.mjs +164 -0
  127. package/dist/nitroConfigBridge-BkVWnSV3.mjs.map +1 -0
  128. package/dist/{nodeResponse-BkkionWl.mjs → nodeResponse-CIEEbrNE.mjs} +1 -1
  129. package/dist/{nodeResponse-BkkionWl.mjs.map → nodeResponse-CIEEbrNE.mjs.map} +1 -1
  130. package/dist/nuxt/module.d.mts +13 -4
  131. package/dist/nuxt/module.d.mts.map +1 -1
  132. package/dist/nuxt/module.mjs +11 -4
  133. package/dist/nuxt/module.mjs.map +1 -1
  134. package/dist/orpc/index.d.mts +115 -0
  135. package/dist/orpc/index.d.mts.map +1 -0
  136. package/dist/orpc/index.mjs +145 -0
  137. package/dist/orpc/index.mjs.map +1 -0
  138. package/dist/{package-v_MmOZeA.mjs → package-CUhII9DA.mjs} +2 -2
  139. package/dist/package-CUhII9DA.mjs.map +1 -0
  140. package/dist/{parseError-yVZ58wIK.d.mts → parseError-Cagr-Ctc.d.mts} +2 -2
  141. package/dist/parseError-Cagr-Ctc.d.mts.map +1 -0
  142. package/dist/pretty-error-CVVgwlTn.mjs +278 -0
  143. package/dist/pretty-error-CVVgwlTn.mjs.map +1 -0
  144. package/dist/pretty-error-snippet.node-c_bzjg7g.mjs +47 -0
  145. package/dist/pretty-error-snippet.node-c_bzjg7g.mjs.map +1 -0
  146. package/dist/react-router/index.d.mts +2 -2
  147. package/dist/react-router/index.mjs +5 -6
  148. package/dist/react-router/index.mjs.map +1 -1
  149. package/dist/{routes-CnIgYWf8.mjs → routes-4rMzRyTk.mjs} +1 -1
  150. package/dist/{routes-CnIgYWf8.mjs.map → routes-4rMzRyTk.mjs.map} +1 -1
  151. package/dist/runtime/client/log.d.mts +1 -1
  152. package/dist/runtime/server/routes/_evlog/ingest.post.mjs +28 -12
  153. package/dist/runtime/server/routes/_evlog/ingest.post.mjs.map +1 -1
  154. package/dist/runtime/server/useLogger.d.mts +1 -1
  155. package/dist/runtime/utils/parseError.d.mts +2 -2
  156. package/dist/runtime/utils/parseError.mjs +1 -1
  157. package/dist/{severity-R5Egq3qz.mjs → severity-CwXUSHt3.mjs} +1 -1
  158. package/dist/{severity-R5Egq3qz.mjs.map → severity-CwXUSHt3.mjs.map} +1 -1
  159. package/dist/{source-location-Dco0cRTz.mjs → source-location-xkDGiERl.mjs} +1 -1
  160. package/dist/{source-location-Dco0cRTz.mjs.map → source-location-xkDGiERl.mjs.map} +1 -1
  161. package/dist/{storage-Dwinmg8P.mjs → storage-7X37OToT.mjs} +2 -1
  162. package/dist/{storage-Dwinmg8P.mjs.map → storage-7X37OToT.mjs.map} +1 -1
  163. package/dist/stream.d.mts +1 -1
  164. package/dist/stream.mjs +1 -1
  165. package/dist/streamResponse-CmQ3qUbF.mjs +94 -0
  166. package/dist/streamResponse-CmQ3qUbF.mjs.map +1 -0
  167. package/dist/sveltekit/index.d.mts +3 -3
  168. package/dist/sveltekit/index.d.mts.map +1 -1
  169. package/dist/sveltekit/index.mjs +48 -16
  170. package/dist/sveltekit/index.mjs.map +1 -1
  171. package/dist/toolkit.d.mts +38 -7
  172. package/dist/toolkit.d.mts.map +1 -1
  173. package/dist/toolkit.mjs +15 -14
  174. package/dist/types.d.mts +2 -2
  175. package/dist/{useLogger-BsPL4AQm.d.mts → useLogger-Dv52PDpH.d.mts} +2 -2
  176. package/dist/{useLogger-BsPL4AQm.d.mts.map → useLogger-Dv52PDpH.d.mts.map} +1 -1
  177. package/dist/{utils-DLCeShxL.d.mts → utils-DmNbZwBZ.d.mts} +21 -4
  178. package/dist/{utils-DLCeShxL.d.mts.map → utils-DmNbZwBZ.d.mts.map} +1 -1
  179. package/dist/utils.d.mts +2 -2
  180. package/dist/utils.mjs +31 -9
  181. package/dist/utils.mjs.map +1 -1
  182. package/dist/vite/index.d.mts +1 -1
  183. package/dist/vite/index.mjs +1 -1
  184. package/dist/workers.d.mts +1 -1
  185. package/dist/workers.mjs +1 -1
  186. package/package.json +48 -15
  187. package/dist/audit-CC8nfazi.d.mts.map +0 -1
  188. package/dist/audit-pV5aLGP0.mjs.map +0 -1
  189. package/dist/define-D6OJdSUH.mjs.map +0 -1
  190. package/dist/define-MSdhzmXn.d.mts.map +0 -1
  191. package/dist/drain-X7_5szSI.mjs.map +0 -1
  192. package/dist/fork-8u_zFOJq.mjs.map +0 -1
  193. package/dist/index-o1_z4phv.d.mts.map +0 -1
  194. package/dist/logger-DntcxxHg.d.mts.map +0 -1
  195. package/dist/middleware-U-lIAzHg.d.mts.map +0 -1
  196. package/dist/nitro-DErMq_Zj.mjs +0 -34
  197. package/dist/nitro-DErMq_Zj.mjs.map +0 -1
  198. package/dist/nitro-oZre8ab3.d.mts.map +0 -1
  199. package/dist/nitroConfigBridge-DKk7eOn-.mjs +0 -92
  200. package/dist/nitroConfigBridge-DKk7eOn-.mjs.map +0 -1
  201. package/dist/package-v_MmOZeA.mjs.map +0 -1
  202. package/dist/parseError-yVZ58wIK.d.mts.map +0 -1
@@ -1,11 +1,46 @@
1
- import { t as extractSafeHeaders } from "../headers-CU-QqnYg.mjs";
2
1
  import { EvlogError } from "../error.mjs";
3
- import { t as extractErrorStatus } from "../errors-BQgyQ9xe.mjs";
4
- import { n as serializeEvlogErrorResponse, t as resolveEvlogError } from "../nitro-DErMq_Zj.mjs";
5
- import { r as createMiddlewareLogger, t as attachForkToLogger } from "../fork-8u_zFOJq.mjs";
6
- import { t as createLoggerStorage } from "../storage-Dwinmg8P.mjs";
2
+ import { t as extractSafeHeaders } from "../headers-VtmnWcfn.mjs";
3
+ import { t as extractErrorStatus } from "../errors-DA0cyr8q.mjs";
4
+ import { a as serializeEvlogErrorResponse, i as resolveEvlogError } from "../nitro-ClRZLD1g.mjs";
5
+ import { r as createMiddlewareLogger, t as attachForkToLogger } from "../fork-CYm453dq.mjs";
6
+ import { t as createLoggerStorage } from "../storage-7X37OToT.mjs";
7
7
  //#region src/sveltekit/index.ts
8
8
  const { storage, useLogger } = createLoggerStorage("handle context. Make sure evlog() handle is added to your hooks.server.ts.");
9
+ function isPlainObject(value) {
10
+ return typeof value === "object" && value !== null && !Array.isArray(value);
11
+ }
12
+ function isRequestLogger(value) {
13
+ return isPlainObject(value) && typeof value.error === "function" && typeof value.emit === "function";
14
+ }
15
+ function isContextEvlogError(value) {
16
+ return isPlainObject(value) && value.name === "EvlogError" && typeof value.status === "number" && typeof value.message === "string";
17
+ }
18
+ function evlogErrorFromContext(errorData) {
19
+ const nested = isPlainObject(errorData.data) ? errorData.data : void 0;
20
+ const readString = (key) => {
21
+ const direct = errorData[key];
22
+ if (typeof direct === "string") return direct;
23
+ const fromNested = nested?.[key];
24
+ return typeof fromNested === "string" ? fromNested : void 0;
25
+ };
26
+ return new EvlogError({
27
+ message: String(errorData.message),
28
+ status: errorData.status,
29
+ code: readString("code"),
30
+ why: readString("why"),
31
+ fix: readString("fix"),
32
+ link: readString("link")
33
+ });
34
+ }
35
+ function readEvlogResponseData(response) {
36
+ const { data } = response;
37
+ if (!isPlainObject(data)) return {};
38
+ return {
39
+ why: typeof data.why === "string" ? data.why : void 0,
40
+ fix: typeof data.fix === "string" ? data.fix : void 0,
41
+ link: typeof data.link === "string" ? data.link : void 0
42
+ };
43
+ }
9
44
  /**
10
45
  * Create an evlog handle hook for SvelteKit.
11
46
  *
@@ -47,7 +82,7 @@ function evlog(options = {}) {
47
82
  headers: extractSafeHeaders(event.request.headers),
48
83
  ...options
49
84
  };
50
- const { logger, finish, skipped } = createMiddlewareLogger(middlewareOpts);
85
+ const { logger, finish, finishResponse, skipped } = createMiddlewareLogger(middlewareOpts);
51
86
  if (skipped) return await resolve(event);
52
87
  attachForkToLogger(storage, logger, middlewareOpts);
53
88
  event.locals.log = logger;
@@ -55,19 +90,18 @@ function evlog(options = {}) {
55
90
  try {
56
91
  const response = await resolve(event);
57
92
  const errorData = logger.getContext().error;
58
- if (response.status >= 500 && errorData?.name === "EvlogError" && errorData.status) {
93
+ if (response.status >= 500 && isContextEvlogError(errorData)) {
59
94
  const { status } = errorData;
60
95
  await finish({ status });
61
- const body = serializeEvlogErrorResponse(errorData, event.url.pathname);
96
+ const body = serializeEvlogErrorResponse(evlogErrorFromContext(errorData), event.url.pathname);
62
97
  return new Response(JSON.stringify(body), {
63
98
  status,
64
99
  headers: { "content-type": "application/json" }
65
100
  });
66
101
  }
67
- await finish({ status: response.status });
68
- return response;
102
+ return finishResponse(response);
69
103
  } catch (error) {
70
- await finish({ error });
104
+ await finish({ error: error instanceof Error ? error : new Error(String(error)) });
71
105
  if (error instanceof EvlogError) {
72
106
  const status = error.status ?? 500;
73
107
  const body = serializeEvlogErrorResponse(error, event.url.pathname);
@@ -99,18 +133,16 @@ function evlog(options = {}) {
99
133
  */
100
134
  function evlogHandleError() {
101
135
  return ({ error, event, status, message }) => {
102
- const logger = event.locals.log;
136
+ const logger = isRequestLogger(event.locals.log) ? event.locals.log : void 0;
103
137
  if (logger && error instanceof Error) logger.error(error);
104
138
  const evlogError = error instanceof Error ? resolveEvlogError(error) : null;
105
139
  if (evlogError) {
106
140
  const errorStatus = extractErrorStatus(evlogError);
107
141
  const response = serializeEvlogErrorResponse(evlogError, event.url.pathname);
108
142
  return {
109
- message: response.message,
143
+ message: typeof response.message === "string" ? response.message : message,
110
144
  status: errorStatus,
111
- why: response.data?.why,
112
- fix: response.data?.fix,
113
- link: response.data?.link
145
+ ...readEvlogResponseData(response)
114
146
  };
115
147
  }
116
148
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../src/sveltekit/index.ts"],"sourcesContent":["import type { RequestLogger } from '../types'\nimport { createMiddlewareLogger, type BaseEvlogOptions } from '../shared/middleware'\nimport { attachForkToLogger } from '../shared/fork'\nimport { extractSafeHeaders } from '../shared/headers'\nimport { createLoggerStorage } from '../shared/storage'\nimport { resolveEvlogError, extractErrorStatus, serializeEvlogErrorResponse } from '../nitro'\nimport { EvlogError } from '../error'\n\nconst { storage, useLogger } = createLoggerStorage(\n 'handle context. Make sure evlog() handle is added to your hooks.server.ts.',\n)\n\nexport type EvlogSvelteKitOptions = BaseEvlogOptions\n\nexport { useLogger }\n\n/**\n * SvelteKit `Handle` function signature — avoids a hard dependency on `@sveltejs/kit`.\n */\ntype SvelteKitHandle = (input: {\n event: { request: Request; url: URL; locals: Record<string, any> }\n resolve: (event: any) => Promise<Response>\n}) => Promise<Response>\n\n/**\n * SvelteKit `HandleServerError` signature — avoids a hard dependency on `@sveltejs/kit`.\n */\ntype SvelteKitHandleServerError = (input: {\n error: unknown\n event: { request: Request; url: URL; locals: Record<string, any> }\n status: number\n message: string\n}) => MaybePromise<void | AppError>\n\ntype MaybePromise<T> = T | Promise<T>\n\n/** Minimal SvelteKit `App.Error` shape */\ninterface AppError {\n message: string\n [key: string]: unknown\n}\n\n/**\n * Create an evlog handle hook for SvelteKit.\n *\n * Add it to your `src/hooks.server.ts` using SvelteKit's `sequence` helper\n * or as the sole handle export.\n *\n * @example\n * ```ts\n * // src/hooks.server.ts\n * import { initLogger } from 'evlog'\n * import { evlog } from 'evlog/sveltekit'\n * import { createAxiomDrain } from 'evlog/axiom'\n *\n * initLogger({ env: { service: 'my-sveltekit-app' } })\n *\n * export const handle = evlog({\n * drain: createAxiomDrain(),\n * enrich: (ctx) => {\n * ctx.event.region = process.env.FLY_REGION\n * },\n * })\n * ```\n *\n * @example\n * ```ts\n * // Compose with other hooks using sequence\n * import { sequence } from '@sveltejs/kit/hooks'\n * import { evlog } from 'evlog/sveltekit'\n *\n * export const handle = sequence(evlog(), yourOtherHook)\n * ```\n */\nexport function evlog(options: EvlogSvelteKitOptions = {}): SvelteKitHandle {\n return async ({ event, resolve }) => {\n const middlewareOpts = {\n method: event.request.method,\n path: event.url.pathname,\n requestId: event.request.headers.get('x-request-id') || crypto.randomUUID(),\n headers: extractSafeHeaders(event.request.headers),\n ...options,\n }\n const { logger, finish, skipped } = createMiddlewareLogger(middlewareOpts)\n\n if (skipped) {\n return await resolve(event)\n }\n\n attachForkToLogger(storage, logger, middlewareOpts)\n event.locals.log = logger\n\n return storage.run(logger, async () => {\n try {\n const response = await resolve(event)\n\n // SvelteKit catches route errors internally and returns 500.\n // If handleError already logged an EvlogError with a specific status,\n // return a structured JSON response instead of SvelteKit's generic 500.\n const ctx = logger.getContext()\n const errorData = ctx.error as { name?: string; status?: number; message?: string; data?: unknown } | undefined\n if (response.status >= 500 && errorData?.name === 'EvlogError' && errorData.status) {\n const { status } = errorData\n await finish({ status })\n const body = serializeEvlogErrorResponse(errorData as EvlogError, event.url.pathname)\n return new Response(JSON.stringify(body), {\n status,\n headers: { 'content-type': 'application/json' },\n })\n }\n\n await finish({ status: response.status })\n return response\n } catch (error) {\n await finish({ error: error as Error })\n\n // Return structured JSON for EvlogError (like NextJS withEvlog / Nuxt errorHandler)\n if (error instanceof EvlogError) {\n const status = error.status ?? 500\n const body = serializeEvlogErrorResponse(error, event.url.pathname)\n return new Response(JSON.stringify(body), {\n status,\n headers: { 'content-type': 'application/json' },\n })\n }\n\n throw error\n }\n })\n }\n}\n\n/**\n * Create an evlog error handler for SvelteKit.\n *\n * Logs unhandled errors via `event.locals.log` (if available) and returns\n * structured error responses for `EvlogError` instances. For non-evlog errors,\n * returns a generic error response with sanitized messages in production.\n *\n * @example\n * ```ts\n * // src/hooks.server.ts\n * import { evlog, evlogHandleError } from 'evlog/sveltekit'\n *\n * export const handle = evlog()\n * export const handleError = evlogHandleError()\n * ```\n */\nexport function evlogHandleError(): SvelteKitHandleServerError {\n return ({ error, event, status, message }) => {\n const logger = event.locals.log as RequestLogger | undefined\n\n if (logger && error instanceof Error) {\n logger.error(error)\n }\n\n const evlogError = error instanceof Error ? resolveEvlogError(error) : null\n\n if (evlogError) {\n const errorStatus = extractErrorStatus(evlogError)\n const response = serializeEvlogErrorResponse(evlogError, event.url.pathname)\n return {\n message: response.message as string,\n status: errorStatus,\n why: (response.data as { why?: string })?.why,\n fix: (response.data as { fix?: string })?.fix,\n link: (response.data as { link?: string })?.link,\n } as AppError\n }\n\n return { message, status } as AppError\n }\n}\n\n/**\n * Create both `handle` and `handleError` hooks in a single call.\n *\n * This is the recommended setup for SvelteKit — it returns both hooks\n * pre-configured and ready to export from `hooks.server.ts`.\n *\n * @example\n * ```ts\n * // src/hooks.server.ts\n * import { initLogger } from 'evlog'\n * import { createEvlogHooks } from 'evlog/sveltekit'\n * import { createAxiomDrain } from 'evlog/axiom'\n *\n * initLogger({ env: { service: 'my-app' } })\n *\n * export const { handle, handleError } = createEvlogHooks({\n * drain: createAxiomDrain(),\n * enrich: (ctx) => {\n * ctx.event.region = process.env.FLY_REGION\n * },\n * })\n * ```\n *\n * @example\n * ```ts\n * // Compose with other hooks using sequence\n * import { sequence } from '@sveltejs/kit/hooks'\n * import { createEvlogHooks } from 'evlog/sveltekit'\n *\n * const evlogHooks = createEvlogHooks()\n *\n * export const handle = sequence(evlogHooks.handle, yourOtherHook)\n * export const handleError = evlogHooks.handleError\n * ```\n */\nexport function createEvlogHooks(options: EvlogSvelteKitOptions = {}) {\n return {\n handle: evlog(options),\n handleError: evlogHandleError(),\n }\n}\n"],"mappings":";;;;;;;AAQA,MAAM,EAAE,SAAS,cAAc,oBAC7B,6EACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgED,SAAgB,MAAM,UAAiC,EAAE,EAAmB;AAC1E,QAAO,OAAO,EAAE,OAAO,cAAc;EACnC,MAAM,iBAAiB;GACrB,QAAQ,MAAM,QAAQ;GACtB,MAAM,MAAM,IAAI;GAChB,WAAW,MAAM,QAAQ,QAAQ,IAAI,eAAe,IAAI,OAAO,YAAY;GAC3E,SAAS,mBAAmB,MAAM,QAAQ,QAAQ;GAClD,GAAG;GACJ;EACD,MAAM,EAAE,QAAQ,QAAQ,YAAY,uBAAuB,eAAe;AAE1E,MAAI,QACF,QAAO,MAAM,QAAQ,MAAM;AAG7B,qBAAmB,SAAS,QAAQ,eAAe;AACnD,QAAM,OAAO,MAAM;AAEnB,SAAO,QAAQ,IAAI,QAAQ,YAAY;AACrC,OAAI;IACF,MAAM,WAAW,MAAM,QAAQ,MAAM;IAMrC,MAAM,YADM,OAAO,YACE,CAAC;AACtB,QAAI,SAAS,UAAU,OAAO,WAAW,SAAS,gBAAgB,UAAU,QAAQ;KAClF,MAAM,EAAE,WAAW;AACnB,WAAM,OAAO,EAAE,QAAQ,CAAC;KACxB,MAAM,OAAO,4BAA4B,WAAyB,MAAM,IAAI,SAAS;AACrF,YAAO,IAAI,SAAS,KAAK,UAAU,KAAK,EAAE;MACxC;MACA,SAAS,EAAE,gBAAgB,oBAAoB;MAChD,CAAC;;AAGJ,UAAM,OAAO,EAAE,QAAQ,SAAS,QAAQ,CAAC;AACzC,WAAO;YACA,OAAO;AACd,UAAM,OAAO,EAAS,OAAgB,CAAC;AAGvC,QAAI,iBAAiB,YAAY;KAC/B,MAAM,SAAS,MAAM,UAAU;KAC/B,MAAM,OAAO,4BAA4B,OAAO,MAAM,IAAI,SAAS;AACnE,YAAO,IAAI,SAAS,KAAK,UAAU,KAAK,EAAE;MACxC;MACA,SAAS,EAAE,gBAAgB,oBAAoB;MAChD,CAAC;;AAGJ,UAAM;;IAER;;;;;;;;;;;;;;;;;;;AAoBN,SAAgB,mBAA+C;AAC7D,SAAQ,EAAE,OAAO,OAAO,QAAQ,cAAc;EAC5C,MAAM,SAAS,MAAM,OAAO;AAE5B,MAAI,UAAU,iBAAiB,MAC7B,QAAO,MAAM,MAAM;EAGrB,MAAM,aAAa,iBAAiB,QAAQ,kBAAkB,MAAM,GAAG;AAEvE,MAAI,YAAY;GACd,MAAM,cAAc,mBAAmB,WAAW;GAClD,MAAM,WAAW,4BAA4B,YAAY,MAAM,IAAI,SAAS;AAC5E,UAAO;IACL,SAAS,SAAS;IAClB,QAAQ;IACR,KAAM,SAAS,MAA2B;IAC1C,KAAM,SAAS,MAA2B;IAC1C,MAAO,SAAS,MAA4B;IAC7C;;AAGH,SAAO;GAAE;GAAS;GAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuC9B,SAAgB,iBAAiB,UAAiC,EAAE,EAAE;AACpE,QAAO;EACL,QAAQ,MAAM,QAAQ;EACtB,aAAa,kBAAkB;EAChC"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../src/sveltekit/index.ts"],"sourcesContent":["import type { RequestLogger } from '../types'\nimport { createMiddlewareLogger, type BaseEvlogOptions } from '../shared/middleware'\nimport { attachForkToLogger } from '../shared/fork'\nimport { extractSafeHeaders } from '../shared/headers'\nimport { createLoggerStorage } from '../shared/storage'\nimport { resolveEvlogError, extractErrorStatus, serializeEvlogErrorResponse } from '../nitro'\nimport { EvlogError } from '../error'\n\nconst { storage, useLogger } = createLoggerStorage(\n 'handle context. Make sure evlog() handle is added to your hooks.server.ts.',\n)\n\nexport type EvlogSvelteKitOptions = BaseEvlogOptions\n\nexport { useLogger }\n\n/**\n * SvelteKit `Handle` function signature — avoids a hard dependency on `@sveltejs/kit`.\n */\ntype SvelteKitHandle = (input: {\n event: { request: Request; url: URL; locals: Record<string, any> }\n resolve: (...args: any[]) => Response | Promise<Response>\n}) => Promise<Response>\n\n/**\n * SvelteKit `HandleServerError` signature — avoids a hard dependency on `@sveltejs/kit`.\n */\ntype SvelteKitHandleServerError = (input: {\n error: unknown\n event: { request: Request; url: URL; locals: Record<string, any> }\n status: number\n message: string\n}) => MaybePromise<void | AppError>\n\ntype MaybePromise<T> = T | Promise<T>\n\n/** Minimal SvelteKit `App.Error` shape */\ninterface AppError {\n message: string\n [key: string]: unknown\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction isRequestLogger(value: unknown): value is RequestLogger {\n return isPlainObject(value)\n && typeof value.error === 'function'\n && typeof value.emit === 'function'\n}\n\ninterface ContextEvlogError {\n name: 'EvlogError'\n status: number\n message: string\n why?: string\n fix?: string\n link?: string\n code?: string\n}\n\nfunction isContextEvlogError(value: unknown): value is Record<string, unknown> & ContextEvlogError {\n return isPlainObject(value)\n && value.name === 'EvlogError'\n && typeof value.status === 'number'\n && typeof value.message === 'string'\n}\n\nfunction evlogErrorFromContext(errorData: Record<string, unknown>): EvlogError {\n const nested = isPlainObject(errorData.data) ? errorData.data : undefined\n const readString = (key: string): string | undefined => {\n const direct = errorData[key]\n if (typeof direct === 'string') return direct\n const fromNested = nested?.[key]\n return typeof fromNested === 'string' ? fromNested : undefined\n }\n return new EvlogError({\n message: String(errorData.message),\n status: errorData.status as number,\n code: readString('code'),\n why: readString('why'),\n fix: readString('fix'),\n link: readString('link'),\n })\n}\n\nfunction readEvlogResponseData(response: Record<string, unknown>): { why?: string, fix?: string, link?: string } {\n const { data } = response\n if (!isPlainObject(data)) return {}\n return {\n why: typeof data.why === 'string' ? data.why : undefined,\n fix: typeof data.fix === 'string' ? data.fix : undefined,\n link: typeof data.link === 'string' ? data.link : undefined,\n }\n}\n\n/**\n * Create an evlog handle hook for SvelteKit.\n *\n * Add it to your `src/hooks.server.ts` using SvelteKit's `sequence` helper\n * or as the sole handle export.\n *\n * @example\n * ```ts\n * // src/hooks.server.ts\n * import { initLogger } from 'evlog'\n * import { evlog } from 'evlog/sveltekit'\n * import { createAxiomDrain } from 'evlog/axiom'\n *\n * initLogger({ env: { service: 'my-sveltekit-app' } })\n *\n * export const handle = evlog({\n * drain: createAxiomDrain(),\n * enrich: (ctx) => {\n * ctx.event.region = process.env.FLY_REGION\n * },\n * })\n * ```\n *\n * @example\n * ```ts\n * // Compose with other hooks using sequence\n * import { sequence } from '@sveltejs/kit/hooks'\n * import { evlog } from 'evlog/sveltekit'\n *\n * export const handle = sequence(evlog(), yourOtherHook)\n * ```\n */\nexport function evlog(options: EvlogSvelteKitOptions = {}): SvelteKitHandle {\n return async ({ event, resolve }) => {\n const middlewareOpts = {\n method: event.request.method,\n path: event.url.pathname,\n requestId: event.request.headers.get('x-request-id') || crypto.randomUUID(),\n headers: extractSafeHeaders(event.request.headers),\n ...options,\n }\n const { logger, finish, finishResponse, skipped } = createMiddlewareLogger(middlewareOpts)\n\n if (skipped) {\n return await resolve(event)\n }\n\n attachForkToLogger(storage, logger, middlewareOpts)\n event.locals.log = logger\n\n return storage.run(logger, async () => {\n try {\n const response = await resolve(event)\n\n // SvelteKit catches route errors internally and returns 500.\n // If handleError already logged an EvlogError with a specific status,\n // return a structured JSON response instead of SvelteKit's generic 500.\n const ctx = logger.getContext()\n const errorData = ctx.error\n if (response.status >= 500 && isContextEvlogError(errorData)) {\n const { status } = errorData\n await finish({ status })\n const body = serializeEvlogErrorResponse(evlogErrorFromContext(errorData), event.url.pathname)\n return new Response(JSON.stringify(body), {\n status,\n headers: { 'content-type': 'application/json' },\n })\n }\n\n return finishResponse(response)\n } catch (error) {\n await finish({ error: error instanceof Error ? error : new Error(String(error)) })\n\n // Return structured JSON for EvlogError (like NextJS withEvlog / Nuxt errorHandler)\n if (error instanceof EvlogError) {\n const status = error.status ?? 500\n const body = serializeEvlogErrorResponse(error, event.url.pathname)\n return new Response(JSON.stringify(body), {\n status,\n headers: { 'content-type': 'application/json' },\n })\n }\n\n throw error\n }\n })\n }\n}\n\n/**\n * Create an evlog error handler for SvelteKit.\n *\n * Logs unhandled errors via `event.locals.log` (if available) and returns\n * structured error responses for `EvlogError` instances. For non-evlog errors,\n * returns a generic error response with sanitized messages in production.\n *\n * @example\n * ```ts\n * // src/hooks.server.ts\n * import { evlog, evlogHandleError } from 'evlog/sveltekit'\n *\n * export const handle = evlog()\n * export const handleError = evlogHandleError()\n * ```\n */\nexport function evlogHandleError(): SvelteKitHandleServerError {\n return ({ error, event, status, message }) => {\n const logger = isRequestLogger(event.locals.log) ? event.locals.log : undefined\n\n if (logger && error instanceof Error) {\n logger.error(error)\n }\n\n const evlogError = error instanceof Error ? resolveEvlogError(error) : null\n\n if (evlogError) {\n const errorStatus = extractErrorStatus(evlogError)\n const response = serializeEvlogErrorResponse(evlogError, event.url.pathname)\n return {\n message: typeof response.message === 'string' ? response.message : message,\n status: errorStatus,\n ...readEvlogResponseData(response),\n }\n }\n\n return { message, status }\n }\n}\n\n/**\n * Create both `handle` and `handleError` hooks in a single call.\n *\n * This is the recommended setup for SvelteKit — it returns both hooks\n * pre-configured and ready to export from `hooks.server.ts`.\n *\n * @example\n * ```ts\n * // src/hooks.server.ts\n * import { initLogger } from 'evlog'\n * import { createEvlogHooks } from 'evlog/sveltekit'\n * import { createAxiomDrain } from 'evlog/axiom'\n *\n * initLogger({ env: { service: 'my-app' } })\n *\n * export const { handle, handleError } = createEvlogHooks({\n * drain: createAxiomDrain(),\n * enrich: (ctx) => {\n * ctx.event.region = process.env.FLY_REGION\n * },\n * })\n * ```\n *\n * @example\n * ```ts\n * // Compose with other hooks using sequence\n * import { sequence } from '@sveltejs/kit/hooks'\n * import { createEvlogHooks } from 'evlog/sveltekit'\n *\n * const evlogHooks = createEvlogHooks()\n *\n * export const handle = sequence(evlogHooks.handle, yourOtherHook)\n * export const handleError = evlogHooks.handleError\n * ```\n */\nexport function createEvlogHooks(options: EvlogSvelteKitOptions = {}) {\n return {\n handle: evlog(options),\n handleError: evlogHandleError(),\n }\n}\n"],"mappings":"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"}
@@ -1,10 +1,41 @@
1
- import { $ as RequestLogger, I as DrainContext, K as LogLevel, L as EnrichContext, _t as drainPlugin, ct as WideEvent, dt as PluginRunner, ft as PluginSetupContext, gt as definePlugin, ht as createPluginRunner, lt as ClientLogContext, mt as RequestLifecycleContext, ot as TailSamplingContext, pt as RequestFinishContext, ut as EvlogPlugin, vt as enricherPlugin, yt as getEmptyPluginRunner } from "./audit-CC8nfazi.mjs";
2
- import { a as resolveMiddlewarePluginRunner, i as createMiddlewareLogger, n as MiddlewareLoggerOptions, o as runEnrichAndDrain, r as MiddlewareLoggerResult, t as BaseEvlogOptions } from "./middleware-U-lIAzHg.mjs";
3
- import { i as toMiddlewareOptions, n as defineEvlog, r as toLoggerConfig, t as EvlogConfig } from "./define-MSdhzmXn.mjs";
4
- import { n as EnricherOptions, r as defineEnricher, t as EnricherDefinition } from "./enricher-DxgML6IC.mjs";
5
- import { n as getServiceForPath, r as shouldLog, t as extractErrorStatus } from "./errors-DySW1F9_.mjs";
1
+ import { B as DrainContext, Ct as enricherPlugin, St as drainPlugin, V as EnrichContext, X as LogLevel, _t as PluginSetupContext, bt as createPluginRunner, ft as WideEvent, gt as PluginRunner, ht as EvlogPlugin, mt as ClientLogContext, rt as RequestLogger, ut as TailSamplingContext, vt as RequestFinishContext, wt as getEmptyPluginRunner, xt as definePlugin, yt as RequestLifecycleContext } from "./audit-BUAajsPU.mjs";
2
+ import { a as resolveMiddlewarePluginRunner, i as createMiddlewareLogger, n as MiddlewareLoggerOptions, o as runEnrichAndDrain, r as MiddlewareLoggerResult, t as BaseEvlogOptions } from "./middleware-DQ6-h8h0.mjs";
3
+ import { i as toMiddlewareOptions, n as defineEvlog, r as toLoggerConfig, t as EvlogConfig } from "./define-DGwZkZ7x.mjs";
4
+ import { n as EnricherOptions, r as defineEnricher, t as EnricherDefinition } from "./enricher-CuMbbdqp.mjs";
5
+ import { n as getServiceForPath, r as shouldLog, t as extractErrorStatus } from "./errors-CAq8pYpW.mjs";
6
6
  import { AsyncLocalStorage } from "node:async_hooks";
7
7
 
8
+ //#region src/shared/streamResponse.d.ts
9
+ /**
10
+ * Metadata passed to streaming response completion callbacks.
11
+ * Reports the HTTP status and any error that occurred while reading the body.
12
+ */
13
+ interface StreamCompleteMeta {
14
+ /** Final HTTP status code for the response. */
15
+ status: number;
16
+ /** Present when the stream body failed before or during completion. */
17
+ error?: Error;
18
+ }
19
+ /**
20
+ * Whether a {@link Response} carries a stream body that may outlive handler return.
21
+ */
22
+ declare function isStreamingResponse(response: Response): boolean;
23
+ /**
24
+ * Whether framework integrations should defer wide-event emit until the response
25
+ * body finishes. Static string/JSON bodies are excluded even though they use a
26
+ * {@link ReadableStream} under the hood in the Fetch API.
27
+ */
28
+ declare function shouldDeferEmitForResponse(response: Response): boolean;
29
+ /**
30
+ * Observe a streaming {@link Response} body and invoke `onComplete` once when
31
+ * the body closes, errors, or is cancelled. Preserves status, headers, and chunks.
32
+ *
33
+ * Non-streaming responses invoke `onComplete` immediately.
34
+ *
35
+ * @internal Used by framework integrations to defer wide-event emit until streams finish.
36
+ */
37
+ declare function bindStreamingResponseLifecycle(response: Response, onComplete: (meta: StreamCompleteMeta) => void | Promise<void>): Response;
38
+ //#endregion
8
39
  //#region src/shared/compose.d.ts
9
40
  /**
10
41
  * Compose enricher callbacks into one. Runs in registration order; errors are
@@ -35,7 +66,7 @@ declare function composePlugins(...lists: Array<EvlogPlugin[] | undefined>): Evl
35
66
  declare function getRuntimeConfig(): Promise<Record<string, any> | undefined>;
36
67
  /**
37
68
  * Description of a single adapter config field. `env` is the ordered list of
38
- * environment variables to fall back to, e.g. `['NUXT_AXIOM_TOKEN', 'AXIOM_TOKEN']`.
69
+ * environment variables to fall back to, e.g. `['NUXT_AXIOM_API_KEY', 'AXIOM_API_KEY']`.
39
70
  */
40
71
  interface ConfigField<T> {
41
72
  key: keyof T & string;
@@ -382,5 +413,5 @@ declare function createLoggerStorage(contextHint: string): {
382
413
  useLogger: <T extends object = Record<string, unknown>>() => RequestLogger<T>;
383
414
  };
384
415
  //#endregion
385
- export { AttributeValueKind, BaseEvlogOptions, ClientLogContext, ConfigField, DrainOptions, EVLOG_USER_AGENT, EVLOG_VERSION, EnricherDefinition, EnricherOptions, EvlogConfig, EvlogPlugin, ExtractedRequest, ForkBackgroundLoggerOptions, ForkLifecycle, FrameworkIntegrationHelpers, FrameworkIntegrationSpec, FrameworkRequestHandle, HttpDrainOptions, HttpDrainRequest, HttpPostOptions, MiddlewareLoggerOptions, MiddlewareLoggerResult, OTEL_SEVERITY_NUMBER, OTEL_SEVERITY_TEXT, PluginRunner, PluginSetupContext, RequestFinishContext, RequestLifecycleContext, TypedAttributeValue, attachForkToLogger, composeDrains, composeEnrichers, composeKeep, composePlugins, createLoggerStorage, createMiddlewareLogger, createPluginRunner, defineDrain, defineEnricher, defineEvlog, defineFrameworkIntegration, defineHttpDrain, definePlugin, drainPlugin, enricherPlugin, extractErrorStatus, extractSafeHeaders, extractSafeNodeHeaders, forkBackgroundLogger, getEmptyPluginRunner, getHeader, getRuntimeConfig, getServiceForPath, httpPost, mergeEventField, normalizeNumber, resolveAdapterConfig, resolveMiddlewarePluginRunner, runEnrichAndDrain, shouldLog, toLoggerConfig, toMiddlewareOptions, toOtlpAttributeValue, toTypedAttributeValue, withEvlogIdentityHeaders };
416
+ export { AttributeValueKind, BaseEvlogOptions, ClientLogContext, ConfigField, DrainOptions, EVLOG_USER_AGENT, EVLOG_VERSION, EnricherDefinition, EnricherOptions, EvlogConfig, EvlogPlugin, ExtractedRequest, ForkBackgroundLoggerOptions, ForkLifecycle, FrameworkIntegrationHelpers, FrameworkIntegrationSpec, FrameworkRequestHandle, HttpDrainOptions, HttpDrainRequest, HttpPostOptions, MiddlewareLoggerOptions, MiddlewareLoggerResult, OTEL_SEVERITY_NUMBER, OTEL_SEVERITY_TEXT, PluginRunner, PluginSetupContext, RequestFinishContext, RequestLifecycleContext, StreamCompleteMeta, TypedAttributeValue, attachForkToLogger, bindStreamingResponseLifecycle, composeDrains, composeEnrichers, composeKeep, composePlugins, createLoggerStorage, createMiddlewareLogger, createPluginRunner, defineDrain, defineEnricher, defineEvlog, defineFrameworkIntegration, defineHttpDrain, definePlugin, drainPlugin, enricherPlugin, extractErrorStatus, extractSafeHeaders, extractSafeNodeHeaders, forkBackgroundLogger, getEmptyPluginRunner, getHeader, getRuntimeConfig, getServiceForPath, httpPost, isStreamingResponse, mergeEventField, normalizeNumber, resolveAdapterConfig, resolveMiddlewarePluginRunner, runEnrichAndDrain, shouldDeferEmitForResponse, shouldLog, toLoggerConfig, toMiddlewareOptions, toOtlpAttributeValue, toTypedAttributeValue, withEvlogIdentityHeaders };
386
417
  //# sourceMappingURL=toolkit.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"toolkit.d.mts","names":[],"sources":["../src/shared/compose.ts","../src/shared/config.ts","../src/shared/drain.ts","../src/shared/event.ts","../src/shared/fork.ts","../src/shared/headers.ts","../src/shared/http.ts","../src/shared/integration.ts","../src/shared/severity.ts","../src/shared/storage.ts"],"mappings":"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"}
1
+ {"version":3,"file":"toolkit.d.mts","names":[],"sources":["../src/shared/streamResponse.ts","../src/shared/compose.ts","../src/shared/config.ts","../src/shared/drain.ts","../src/shared/event.ts","../src/shared/fork.ts","../src/shared/headers.ts","../src/shared/http.ts","../src/shared/integration.ts","../src/shared/severity.ts","../src/shared/storage.ts"],"mappings":"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"}
package/dist/toolkit.mjs CHANGED
@@ -1,14 +1,15 @@
1
- import { D as drainPlugin, E as definePlugin, O as enricherPlugin, T as createPluginRunner, k as getEmptyPluginRunner } from "./audit-pV5aLGP0.mjs";
2
- import { i as normalizeNumber, n as extractSafeNodeHeaders, r as getHeader, t as extractSafeHeaders } from "./headers-CU-QqnYg.mjs";
3
- import { t as extractErrorStatus } from "./errors-BQgyQ9xe.mjs";
4
- import { n as toLoggerConfig, r as toMiddlewareOptions, t as defineEvlog } from "./define-D6OJdSUH.mjs";
5
- import { n as shouldLog, t as getServiceForPath } from "./routes-CnIgYWf8.mjs";
6
- import { i as withEvlogIdentityHeaders, n as EVLOG_VERSION, r as httpPost, t as EVLOG_USER_AGENT } from "./http-6umVAKDW.mjs";
7
- import { i as resolveAdapterConfig, n as defineHttpDrain, r as getRuntimeConfig, t as defineDrain } from "./drain-X7_5szSI.mjs";
8
- import { n as toOtlpAttributeValue, r as toTypedAttributeValue, t as mergeEventField } from "./event-1BMl7o0k.mjs";
9
- import { n as OTEL_SEVERITY_TEXT, t as OTEL_SEVERITY_NUMBER } from "./severity-R5Egq3qz.mjs";
10
- import { a as composePlugins, i as composeKeep, n as composeDrains, r as composeEnrichers, t as defineEnricher } from "./enricher-N0erZS87.mjs";
11
- import { a as runEnrichAndDrain, i as resolveMiddlewarePluginRunner, n as forkBackgroundLogger, r as createMiddlewareLogger, t as attachForkToLogger } from "./fork-8u_zFOJq.mjs";
12
- import { t as defineFrameworkIntegration } from "./integration-DTZtjSqh.mjs";
13
- import { t as createLoggerStorage } from "./storage-Dwinmg8P.mjs";
14
- export { EVLOG_USER_AGENT, EVLOG_VERSION, OTEL_SEVERITY_NUMBER, OTEL_SEVERITY_TEXT, attachForkToLogger, composeDrains, composeEnrichers, composeKeep, composePlugins, createLoggerStorage, createMiddlewareLogger, createPluginRunner, defineDrain, defineEnricher, defineEvlog, defineFrameworkIntegration, defineHttpDrain, definePlugin, drainPlugin, enricherPlugin, extractErrorStatus, extractSafeHeaders, extractSafeNodeHeaders, forkBackgroundLogger, getEmptyPluginRunner, getHeader, getRuntimeConfig, getServiceForPath, httpPost, mergeEventField, normalizeNumber, resolveAdapterConfig, resolveMiddlewarePluginRunner, runEnrichAndDrain, shouldLog, toLoggerConfig, toMiddlewareOptions, toOtlpAttributeValue, toTypedAttributeValue, withEvlogIdentityHeaders };
1
+ import { A as enricherPlugin, D as createPluginRunner, O as definePlugin, j as getEmptyPluginRunner, k as drainPlugin } from "./audit-BFwTUxBJ.mjs";
2
+ import { i as normalizeNumber, n as extractSafeNodeHeaders, r as getHeader, t as extractSafeHeaders } from "./headers-VtmnWcfn.mjs";
3
+ import { t as extractErrorStatus } from "./errors-DA0cyr8q.mjs";
4
+ import { n as toLoggerConfig, r as toMiddlewareOptions, t as defineEvlog } from "./define-Bpaymi-h.mjs";
5
+ import { n as shouldLog, t as getServiceForPath } from "./routes-4rMzRyTk.mjs";
6
+ import { n as isStreamingResponse, r as shouldDeferEmitForResponse, t as bindStreamingResponseLifecycle } from "./streamResponse-CmQ3qUbF.mjs";
7
+ import { i as withEvlogIdentityHeaders, n as EVLOG_VERSION, r as httpPost, t as EVLOG_USER_AGENT } from "./http-Bept5EIC.mjs";
8
+ import { i as resolveAdapterConfig, n as defineHttpDrain, r as getRuntimeConfig, t as defineDrain } from "./drain-D_fy7m0n.mjs";
9
+ import { n as toOtlpAttributeValue, r as toTypedAttributeValue, t as mergeEventField } from "./event-qwAv-7AZ.mjs";
10
+ import { n as OTEL_SEVERITY_TEXT, t as OTEL_SEVERITY_NUMBER } from "./severity-CwXUSHt3.mjs";
11
+ import { a as composePlugins, i as composeKeep, n as composeDrains, r as composeEnrichers, t as defineEnricher } from "./enricher-DAWf2-Fx.mjs";
12
+ import { a as runEnrichAndDrain, i as resolveMiddlewarePluginRunner, n as forkBackgroundLogger, r as createMiddlewareLogger, t as attachForkToLogger } from "./fork-CYm453dq.mjs";
13
+ import { t as defineFrameworkIntegration } from "./integration-CR601uyW.mjs";
14
+ import { t as createLoggerStorage } from "./storage-7X37OToT.mjs";
15
+ export { EVLOG_USER_AGENT, EVLOG_VERSION, OTEL_SEVERITY_NUMBER, OTEL_SEVERITY_TEXT, attachForkToLogger, bindStreamingResponseLifecycle, composeDrains, composeEnrichers, composeKeep, composePlugins, createLoggerStorage, createMiddlewareLogger, createPluginRunner, defineDrain, defineEnricher, defineEvlog, defineFrameworkIntegration, defineHttpDrain, definePlugin, drainPlugin, enricherPlugin, extractErrorStatus, extractSafeHeaders, extractSafeNodeHeaders, forkBackgroundLogger, getEmptyPluginRunner, getHeader, getRuntimeConfig, getServiceForPath, httpPost, isStreamingResponse, mergeEventField, normalizeNumber, resolveAdapterConfig, resolveMiddlewarePluginRunner, runEnrichAndDrain, shouldDeferEmitForResponse, shouldLog, toLoggerConfig, toMiddlewareOptions, toOtlpAttributeValue, toTypedAttributeValue, withEvlogIdentityHeaders };
package/dist/types.d.mts CHANGED
@@ -1,2 +1,2 @@
1
- import { $ as RequestLogger, A as AuditActor, B as ErrorOptions, F as DeepPartial, G as Log, H as H3EventContext, I as DrainContext, J as ParsedError, K as LogLevel, L as EnrichContext, M as AuditLoggerMethod, N as AuditTarget, P as BaseWideEvent, Q as RequestLogEntry, R as EnvironmentContext, U as IngestPayload, V as FieldContext, W as InternalFields, X as RegisteredAuditCatalogs, Y as RedactConfig, Z as RegisteredErrorCatalogs, at as TailSamplingCondition, ct as WideEvent, et as RequestLoggerOptions, it as ServerEvent, j as AuditFields, k as AuditAction, nt as SamplingConfig, ot as TailSamplingContext, q as LoggerConfig, rt as SamplingRates, st as TransportConfig, tt as RouteConfig, z as ErrorCode } from "./audit-CC8nfazi.mjs";
2
- export { AuditAction, AuditActor, AuditFields, AuditLoggerMethod, AuditTarget, BaseWideEvent, DeepPartial, DrainContext, EnrichContext, EnvironmentContext, ErrorCode, ErrorOptions, FieldContext, H3EventContext, IngestPayload, InternalFields, Log, LogLevel, LoggerConfig, ParsedError, RedactConfig, RegisteredAuditCatalogs, RegisteredErrorCatalogs, RequestLogEntry, RequestLogger, RequestLoggerOptions, RouteConfig, SamplingConfig, SamplingRates, ServerEvent, TailSamplingCondition, TailSamplingContext, TransportConfig, WideEvent };
1
+ import { $ as RedactConfig, A as AuditActionDefinition, B as DrainContext, F as AuditPatchOp, G as FieldContext, H as EnvironmentContext, I as AuditSeverity, J as InternalFields, K as H3EventContext, L as AuditTarget, M as AuditChanges, N as AuditFields, P as AuditLoggerMethod, Q as ParsedError, R as BaseWideEvent, U as ErrorCode, V as EnrichContext, W as ErrorOptions, X as LogLevel, Y as Log, Z as LoggerConfig, at as RouteConfig, ct as ServerEvent, dt as TransportConfig, et as RegisteredAuditCatalogs, ft as WideEvent, it as RequestLoggerOptions, j as AuditActor, k as AuditAction, lt as TailSamplingCondition, nt as RequestLogEntry, ot as SamplingConfig, q as IngestPayload, rt as RequestLogger, st as SamplingRates, tt as RegisteredErrorCatalogs, ut as TailSamplingContext, z as DeepPartial } from "./audit-BUAajsPU.mjs";
2
+ export { AuditAction, AuditActionDefinition, AuditActor, AuditChanges, AuditFields, AuditLoggerMethod, AuditPatchOp, AuditSeverity, AuditTarget, BaseWideEvent, DeepPartial, DrainContext, EnrichContext, EnvironmentContext, ErrorCode, ErrorOptions, FieldContext, H3EventContext, IngestPayload, InternalFields, Log, LogLevel, LoggerConfig, ParsedError, RedactConfig, RegisteredAuditCatalogs, RegisteredErrorCatalogs, RequestLogEntry, RequestLogger, RequestLoggerOptions, RouteConfig, SamplingConfig, SamplingRates, ServerEvent, TailSamplingCondition, TailSamplingContext, TransportConfig, WideEvent };
@@ -1,4 +1,4 @@
1
- import { $ as RequestLogger, it as ServerEvent } from "./audit-CC8nfazi.mjs";
1
+ import { ct as ServerEvent, rt as RequestLogger } from "./audit-BUAajsPU.mjs";
2
2
 
3
3
  //#region src/runtime/server/useLogger.d.ts
4
4
  /**
@@ -36,4 +36,4 @@ import { $ as RequestLogger, it as ServerEvent } from "./audit-CC8nfazi.mjs";
36
36
  declare function useLogger<T extends object = Record<string, unknown>>(event: ServerEvent, service?: string): RequestLogger<T>;
37
37
  //#endregion
38
38
  export { useLogger as t };
39
- //# sourceMappingURL=useLogger-BsPL4AQm.d.mts.map
39
+ //# sourceMappingURL=useLogger-Dv52PDpH.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useLogger-BsPL4AQm.d.mts","names":[],"sources":["../src/runtime/server/useLogger.ts"],"mappings":";;;;;AAkCA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAAgB,SAAA,oBAA6B,MAAA,kBAAA,CAAyB,KAAA,EAAO,WAAA,EAAa,OAAA,YAAmB,aAAA,CAAc,CAAA"}
1
+ {"version":3,"file":"useLogger-Dv52PDpH.d.mts","names":[],"sources":["../src/runtime/server/useLogger.ts"],"mappings":";;;;;AAkCA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAAgB,SAAA,oBAA6B,MAAA,kBAAA,CAAyB,KAAA,EAAO,WAAA,EAAa,OAAA,YAAmB,aAAA,CAAc,CAAA"}
@@ -1,4 +1,4 @@
1
- import { K as LogLevel, R as EnvironmentContext } from "./audit-CC8nfazi.mjs";
1
+ import { H as EnvironmentContext, X as LogLevel } from "./audit-BUAajsPU.mjs";
2
2
 
3
3
  //#region src/utils.d.ts
4
4
  declare function formatDuration(ms: number): string;
@@ -44,12 +44,29 @@ declare function getCssLevelColor(level: string): string;
44
44
  declare function escapeFormatString(str: string): string;
45
45
  /** Headers that should never be passed to hooks for security */
46
46
  declare const SENSITIVE_HEADERS: string[];
47
- declare function filterSafeHeaders(headers: Record<string, string>): Record<string, string>;
47
+ /**
48
+ * Filter out undefined values and sensitive headers from a raw header map.
49
+ *
50
+ * @param headers - Flat header map where values may be `undefined`
51
+ * (e.g. from `IncomingMessage.headers` or a framework's header accessor).
52
+ * @returns A new object containing only the headers whose values are defined
53
+ * and whose lowercased key is not in the built-in sensitive-header list
54
+ * (e.g. `authorization`, `cookie`, `x-api-key`).
55
+ */
56
+ declare function filterSafeHeaders(headers: Partial<Record<string, string | undefined>>): Record<string, string>;
57
+ /**
58
+ * Compile a glob pattern to a anchored RegExp.
59
+ *
60
+ * - `*` matches any characters except the separator
61
+ * - `**` matches any characters including the separator
62
+ * - `?` matches one character except the separator
63
+ */
64
+ declare function globToRegExp(pattern: string, separator?: '/' | '.'): RegExp;
48
65
  /**
49
66
  * Match a path against a glob pattern.
50
67
  * Supports * (any chars except /) and ** (any chars including /).
51
68
  */
52
69
  declare function matchesPattern(path: string, pattern: string): boolean;
53
70
  //#endregion
54
- export { escapeFormatString as a, getConsoleMethod as c, isBrowser as d, isClient as f, matchesPattern as g, isServer as h, detectEnvironment as i, getCssLevelColor as l, isLevelEnabled as m, colors as n, filterSafeHeaders as o, isDev as p, cssColors as r, formatDuration as s, SENSITIVE_HEADERS as t, getLevelColor as u };
55
- //# sourceMappingURL=utils-DLCeShxL.d.mts.map
71
+ export { matchesPattern as _, escapeFormatString as a, getConsoleMethod as c, globToRegExp as d, isBrowser as f, isServer as g, isLevelEnabled as h, detectEnvironment as i, getCssLevelColor as l, isDev as m, colors as n, filterSafeHeaders as o, isClient as p, cssColors as r, formatDuration as s, SENSITIVE_HEADERS as t, getLevelColor as u };
72
+ //# sourceMappingURL=utils-DmNbZwBZ.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils-DLCeShxL.d.mts","names":[],"sources":["../src/utils.ts"],"mappings":";;;iBAEgB,cAAA,CAAe,EAAA;AAAA,iBAOf,QAAA,CAAA;AAAA,iBAIA,QAAA,CAAA;AAAA,iBAIA,SAAA,CAAA;AAAA,iBAOA,KAAA,CAAA;AAAA,iBAUA,iBAAA,CAAA,GAAqB,OAAA,CAAQ,kBAAA;;AAzB7C;;iBAsDgB,cAAA,CAAe,KAAA,EAAO,QAAA,EAAU,QAAA,EAAU,QAAA;AAAA,iBAI1C,gBAAA,CAAiB,KAAA,EAAO,QAAA,GAAW,QAAA;AAAA,cAItC,MAAA;EAAA;;;;;;;;;;;;iBAgBG,aAAA,CAAc,KAAA;AAAA,cAIjB,SAAA;EAAA;;;;;;;;iBAYG,gBAAA,CAAiB,KAAA;;;;;;iBASjB,kBAAA,CAAmB,GAAA;;cAKtB,iBAAA;AAAA,iBASG,iBAAA,CAAkB,OAAA,EAAS,MAAA,mBAAyB,MAAA;;;;;iBAkBpD,cAAA,CAAe,IAAA,UAAc,OAAA"}
1
+ {"version":3,"file":"utils-DmNbZwBZ.d.mts","names":[],"sources":["../src/utils.ts"],"mappings":";;;iBAEgB,cAAA,CAAe,EAAA;AAAA,iBAOf,QAAA,CAAA;AAAA,iBAIA,QAAA,CAAA;AAAA,iBAIA,SAAA,CAAA;AAAA,iBAOA,KAAA,CAAA;AAAA,iBAUA,iBAAA,CAAA,GAAqB,OAAA,CAAQ,kBAAA;;AAzB7C;;iBAsDgB,cAAA,CAAe,KAAA,EAAO,QAAA,EAAU,QAAA,EAAU,QAAA;AAAA,iBAI1C,gBAAA,CAAiB,KAAA,EAAO,QAAA,GAAW,QAAA;AAAA,cAItC,MAAA;EAAA;;;;;;;;;;;;iBAgBG,aAAA,CAAc,KAAA;AAAA,cAIjB,SAAA;EAAA;;;;;;;;iBAYG,gBAAA,CAAiB,KAAA;;;;;;iBASjB,kBAAA,CAAmB,GAAA;;cAKtB,iBAAA;;;;;;;;;AA9Cb;iBAgEgB,iBAAA,CAAkB,OAAA,EAAS,OAAA,CAAQ,MAAA,gCAAsC,MAAA;;;;;;;;iBAqBzE,YAAA,CAAa,OAAA,UAAiB,SAAA,eAA6B,MAAA;;;;;iBAsB3D,cAAA,CAAe,IAAA,UAAc,OAAA"}
package/dist/utils.d.mts CHANGED
@@ -1,2 +1,2 @@
1
- import { a as escapeFormatString, c as getConsoleMethod, d as isBrowser, f as isClient, g as matchesPattern, h as isServer, i as detectEnvironment, l as getCssLevelColor, m as isLevelEnabled, n as colors, o as filterSafeHeaders, p as isDev, r as cssColors, s as formatDuration, t as SENSITIVE_HEADERS, u as getLevelColor } from "./utils-DLCeShxL.mjs";
2
- export { SENSITIVE_HEADERS, colors, cssColors, detectEnvironment, escapeFormatString, filterSafeHeaders, formatDuration, getConsoleMethod, getCssLevelColor, getLevelColor, isBrowser, isClient, isDev, isLevelEnabled, isServer, matchesPattern };
1
+ import { _ as matchesPattern, a as escapeFormatString, c as getConsoleMethod, d as globToRegExp, f as isBrowser, g as isServer, h as isLevelEnabled, i as detectEnvironment, l as getCssLevelColor, m as isDev, n as colors, o as filterSafeHeaders, p as isClient, r as cssColors, s as formatDuration, t as SENSITIVE_HEADERS, u as getLevelColor } from "./utils-DmNbZwBZ.mjs";
2
+ export { SENSITIVE_HEADERS, colors, cssColors, detectEnvironment, escapeFormatString, filterSafeHeaders, formatDuration, getConsoleMethod, getCssLevelColor, getLevelColor, globToRegExp, isBrowser, isClient, isDev, isLevelEnabled, isServer, matchesPattern };
package/dist/utils.mjs CHANGED
@@ -103,26 +103,48 @@ const SENSITIVE_HEADERS = [
103
103
  "x-auth-token",
104
104
  "proxy-authorization"
105
105
  ];
106
+ /**
107
+ * Filter out undefined values and sensitive headers from a raw header map.
108
+ *
109
+ * @param headers - Flat header map where values may be `undefined`
110
+ * (e.g. from `IncomingMessage.headers` or a framework's header accessor).
111
+ * @returns A new object containing only the headers whose values are defined
112
+ * and whose lowercased key is not in the built-in sensitive-header list
113
+ * (e.g. `authorization`, `cookie`, `x-api-key`).
114
+ */
106
115
  function filterSafeHeaders(headers) {
107
116
  const safeHeaders = {};
108
- for (const [key, value] of Object.entries(headers)) if (!SENSITIVE_HEADERS.includes(key.toLowerCase())) safeHeaders[key] = value;
117
+ for (const [key, value] of Object.entries(headers)) if (value !== void 0 && !SENSITIVE_HEADERS.includes(key.toLowerCase())) safeHeaders[key] = value;
109
118
  return safeHeaders;
110
119
  }
111
120
  const patternCache = /* @__PURE__ */ new Map();
112
121
  /**
113
- * Match a path against a glob pattern.
114
- * Supports * (any chars except /) and ** (any chars including /).
122
+ * Compile a glob pattern to a anchored RegExp.
123
+ *
124
+ * - `*` matches any characters except the separator
125
+ * - `**` matches any characters including the separator
126
+ * - `?` matches one character except the separator
115
127
  */
116
- function matchesPattern(path, pattern) {
117
- let regex = patternCache.get(pattern);
128
+ function globToRegExp(pattern, separator = "/") {
129
+ const cacheKey = `${separator}:${pattern}`;
130
+ let regex = patternCache.get(cacheKey);
118
131
  if (!regex) {
119
- const regexPattern = pattern.replace(/[.+^${}()|[\]\\]/g, "\\$&").replace(/\*\*/g, "{{GLOBSTAR}}").replace(/\*/g, "[^/]*").replace(/{{GLOBSTAR}}/g, ".*").replace(/\?/g, "[^/]");
132
+ const segment = separator === "/" ? "[^/]*" : "[^.]*";
133
+ const char = separator === "/" ? "[^/]" : "[^.]";
134
+ const regexPattern = pattern.replace(/[.+^${}()|[\]\\]/g, "\\$&").replace(/\*\*/g, "{{GLOBSTAR}}").replace(/\*/g, segment).replace(/{{GLOBSTAR}}/g, ".*").replace(/\?/g, char);
120
135
  regex = new RegExp(`^${regexPattern}$`);
121
- patternCache.set(pattern, regex);
136
+ patternCache.set(cacheKey, regex);
122
137
  }
123
- return regex.test(path);
138
+ return regex;
139
+ }
140
+ /**
141
+ * Match a path against a glob pattern.
142
+ * Supports * (any chars except /) and ** (any chars including /).
143
+ */
144
+ function matchesPattern(path, pattern) {
145
+ return globToRegExp(pattern, "/").test(path);
124
146
  }
125
147
  //#endregion
126
- export { SENSITIVE_HEADERS, colors, cssColors, detectEnvironment, escapeFormatString, filterSafeHeaders, formatDuration, getConsoleMethod, getCssLevelColor, getLevelColor, isBrowser, isClient, isDev, isLevelEnabled, isServer, matchesPattern };
148
+ export { SENSITIVE_HEADERS, colors, cssColors, detectEnvironment, escapeFormatString, filterSafeHeaders, formatDuration, getConsoleMethod, getCssLevelColor, getLevelColor, globToRegExp, isBrowser, isClient, isDev, isLevelEnabled, isServer, matchesPattern };
127
149
 
128
150
  //# sourceMappingURL=utils.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.mjs","names":[],"sources":["../src/utils.ts"],"sourcesContent":["import type { EnvironmentContext, LogLevel } from './types'\n\nexport function formatDuration(ms: number): string {\n if (ms < 1000) {\n return `${Math.round(ms)}ms`\n }\n return `${(ms / 1000).toFixed(2)}s`\n}\n\nexport function isServer(): boolean {\n return typeof window === 'undefined'\n}\n\nexport function isClient(): boolean {\n return typeof window !== 'undefined'\n}\n\nexport function isBrowser(): boolean {\n if (typeof window === 'undefined') return false\n if (typeof document === 'undefined') return false\n if (typeof navigator !== 'undefined' && navigator.product === 'ReactNative') return false\n return true\n}\n\nexport function isDev(): boolean {\n if (typeof process !== 'undefined') {\n return process.env.NODE_ENV !== 'production'\n }\n if (typeof window !== 'undefined') {\n return true\n }\n return false\n}\n\nexport function detectEnvironment(): Partial<EnvironmentContext> {\n const env = typeof process !== 'undefined' ? process.env : {}\n const defaultEnvironment = isDev() ? 'development' : 'production'\n\n return {\n environment: env.NODE_ENV || defaultEnvironment,\n service: env.SERVICE_NAME || 'app',\n version: env.APP_VERSION,\n commitHash: env.COMMIT_SHA\n || env.GITHUB_SHA\n || env.VERCEL_GIT_COMMIT_SHA\n || env.CF_PAGES_COMMIT_SHA,\n region: env.VERCEL_REGION\n || env.AWS_REGION\n || env.FLY_REGION\n || env.CF_REGION,\n }\n}\n\nconst LEVEL_ORDER: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n}\n\n/**\n * True if `level` is at least as severe as `minLevel` (debug < info < warn < error).\n */\nexport function isLevelEnabled(level: LogLevel, minLevel: LogLevel): boolean {\n return LEVEL_ORDER[level] >= LEVEL_ORDER[minLevel]\n}\n\nexport function getConsoleMethod(level: LogLevel): LogLevel {\n return level\n}\n\nexport const colors = {\n reset: '\\x1B[0m',\n bold: '\\x1B[1m',\n dim: '\\x1B[2m',\n red: '\\x1B[31m',\n green: '\\x1B[32m',\n yellow: '\\x1B[33m',\n blue: '\\x1B[34m',\n magenta: '\\x1B[35m',\n cyan: '\\x1B[36m',\n white: '\\x1B[37m',\n gray: '\\x1B[90m',\n} as const\n\nconst levelColorMap: Record<string, string> = { error: colors.red, warn: colors.yellow, info: colors.cyan, debug: colors.gray }\n\nexport function getLevelColor(level: string): string {\n return levelColorMap[level] ?? colors.white\n}\n\nexport const cssColors = {\n dim: 'color: #6b7280',\n red: 'color: #ef4444; font-weight: bold',\n green: 'color: #22c55e',\n yellow: 'color: #f59e0b; font-weight: bold',\n cyan: 'color: #06b6d4; font-weight: bold',\n gray: 'color: #6b7280; font-weight: bold',\n reset: 'color: inherit; font-weight: normal',\n} as const\n\nconst cssLevelColorMap: Record<string, string> = { error: cssColors.red, warn: cssColors.yellow, info: cssColors.cyan, debug: cssColors.gray }\n\nexport function getCssLevelColor(level: string): string {\n return cssLevelColorMap[level] ?? cssColors.reset\n}\n\n/**\n * Escape `%` in strings interpolated into `console.log` format strings\n * to prevent `%c`, `%s`, `%d` etc. in user data from being interpreted\n * as formatting directives.\n */\nexport function escapeFormatString(str: string): string {\n return str.replace(/%/g, '%%')\n}\n\n/** Headers that should never be passed to hooks for security */\nexport const SENSITIVE_HEADERS = [\n 'authorization',\n 'cookie',\n 'set-cookie',\n 'x-api-key',\n 'x-auth-token',\n 'proxy-authorization',\n]\n\nexport function filterSafeHeaders(headers: Record<string, string>): Record<string, string> {\n const safeHeaders: Record<string, string> = {}\n\n for (const [key, value] of Object.entries(headers)) {\n if (!SENSITIVE_HEADERS.includes(key.toLowerCase())) {\n safeHeaders[key] = value\n }\n }\n\n return safeHeaders\n}\n\nconst patternCache = new Map<string, RegExp>()\n\n/**\n * Match a path against a glob pattern.\n * Supports * (any chars except /) and ** (any chars including /).\n */\nexport function matchesPattern(path: string, pattern: string): boolean {\n let regex = patternCache.get(pattern)\n if (!regex) {\n const regexPattern = pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&')\n .replace(/\\*\\*/g, '{{GLOBSTAR}}')\n .replace(/\\*/g, '[^/]*')\n .replace(/{{GLOBSTAR}}/g, '.*')\n .replace(/\\?/g, '[^/]')\n regex = new RegExp(`^${regexPattern}$`)\n patternCache.set(pattern, regex)\n }\n return regex.test(path)\n}\n"],"mappings":";AAEA,SAAgB,eAAe,IAAoB;AACjD,KAAI,KAAK,IACP,QAAO,GAAG,KAAK,MAAM,GAAG,CAAC;AAE3B,QAAO,IAAI,KAAK,KAAM,QAAQ,EAAE,CAAC;;AAGnC,SAAgB,WAAoB;AAClC,QAAO,OAAO,WAAW;;AAG3B,SAAgB,WAAoB;AAClC,QAAO,OAAO,WAAW;;AAG3B,SAAgB,YAAqB;AACnC,KAAI,OAAO,WAAW,YAAa,QAAO;AAC1C,KAAI,OAAO,aAAa,YAAa,QAAO;AAC5C,KAAI,OAAO,cAAc,eAAe,UAAU,YAAY,cAAe,QAAO;AACpF,QAAO;;AAGT,SAAgB,QAAiB;AAC/B,KAAI,OAAO,YAAY,YACrB,QAAO,QAAQ,IAAI,aAAa;AAElC,KAAI,OAAO,WAAW,YACpB,QAAO;AAET,QAAO;;AAGT,SAAgB,oBAAiD;CAC/D,MAAM,MAAM,OAAO,YAAY,cAAc,QAAQ,MAAM,EAAE;CAC7D,MAAM,qBAAqB,OAAO,GAAG,gBAAgB;AAErD,QAAO;EACL,aAAa,IAAI,YAAY;EAC7B,SAAS,IAAI,gBAAgB;EAC7B,SAAS,IAAI;EACb,YAAY,IAAI,cACX,IAAI,cACJ,IAAI,yBACJ,IAAI;EACT,QAAQ,IAAI,iBACP,IAAI,cACJ,IAAI,cACJ,IAAI;EACV;;AAGH,MAAM,cAAwC;CAC5C,OAAO;CACP,MAAM;CACN,MAAM;CACN,OAAO;CACR;;;;AAKD,SAAgB,eAAe,OAAiB,UAA6B;AAC3E,QAAO,YAAY,UAAU,YAAY;;AAG3C,SAAgB,iBAAiB,OAA2B;AAC1D,QAAO;;AAGT,MAAa,SAAS;CACpB,OAAO;CACP,MAAM;CACN,KAAK;CACL,KAAK;CACL,OAAO;CACP,QAAQ;CACR,MAAM;CACN,SAAS;CACT,MAAM;CACN,OAAO;CACP,MAAM;CACP;AAED,MAAM,gBAAwC;CAAE,OAAO,OAAO;CAAK,MAAM,OAAO;CAAQ,MAAM,OAAO;CAAM,OAAO,OAAO;CAAM;AAE/H,SAAgB,cAAc,OAAuB;AACnD,QAAO,cAAc,UAAU,OAAO;;AAGxC,MAAa,YAAY;CACvB,KAAK;CACL,KAAK;CACL,OAAO;CACP,QAAQ;CACR,MAAM;CACN,MAAM;CACN,OAAO;CACR;AAED,MAAM,mBAA2C;CAAE,OAAO,UAAU;CAAK,MAAM,UAAU;CAAQ,MAAM,UAAU;CAAM,OAAO,UAAU;CAAM;AAE9I,SAAgB,iBAAiB,OAAuB;AACtD,QAAO,iBAAiB,UAAU,UAAU;;;;;;;AAQ9C,SAAgB,mBAAmB,KAAqB;AACtD,QAAO,IAAI,QAAQ,MAAM,KAAK;;;AAIhC,MAAa,oBAAoB;CAC/B;CACA;CACA;CACA;CACA;CACA;CACD;AAED,SAAgB,kBAAkB,SAAyD;CACzF,MAAM,cAAsC,EAAE;AAE9C,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,QAAQ,CAChD,KAAI,CAAC,kBAAkB,SAAS,IAAI,aAAa,CAAC,CAChD,aAAY,OAAO;AAIvB,QAAO;;AAGT,MAAM,+BAAe,IAAI,KAAqB;;;;;AAM9C,SAAgB,eAAe,MAAc,SAA0B;CACrE,IAAI,QAAQ,aAAa,IAAI,QAAQ;AACrC,KAAI,CAAC,OAAO;EACV,MAAM,eAAe,QAClB,QAAQ,qBAAqB,OAAO,CACpC,QAAQ,SAAS,eAAe,CAChC,QAAQ,OAAO,QAAQ,CACvB,QAAQ,iBAAiB,KAAK,CAC9B,QAAQ,OAAO,OAAO;AACzB,UAAQ,IAAI,OAAO,IAAI,aAAa,GAAG;AACvC,eAAa,IAAI,SAAS,MAAM;;AAElC,QAAO,MAAM,KAAK,KAAK"}
1
+ {"version":3,"file":"utils.mjs","names":[],"sources":["../src/utils.ts"],"sourcesContent":["import type { EnvironmentContext, LogLevel } from './types'\n\nexport function formatDuration(ms: number): string {\n if (ms < 1000) {\n return `${Math.round(ms)}ms`\n }\n return `${(ms / 1000).toFixed(2)}s`\n}\n\nexport function isServer(): boolean {\n return typeof window === 'undefined'\n}\n\nexport function isClient(): boolean {\n return typeof window !== 'undefined'\n}\n\nexport function isBrowser(): boolean {\n if (typeof window === 'undefined') return false\n if (typeof document === 'undefined') return false\n if (typeof navigator !== 'undefined' && navigator.product === 'ReactNative') return false\n return true\n}\n\nexport function isDev(): boolean {\n if (typeof process !== 'undefined') {\n return process.env.NODE_ENV !== 'production'\n }\n if (typeof window !== 'undefined') {\n return true\n }\n return false\n}\n\nexport function detectEnvironment(): Partial<EnvironmentContext> {\n const env = typeof process !== 'undefined' ? process.env : {}\n const defaultEnvironment = isDev() ? 'development' : 'production'\n\n return {\n environment: env.NODE_ENV || defaultEnvironment,\n service: env.SERVICE_NAME || 'app',\n version: env.APP_VERSION,\n commitHash: env.COMMIT_SHA\n || env.GITHUB_SHA\n || env.VERCEL_GIT_COMMIT_SHA\n || env.CF_PAGES_COMMIT_SHA,\n region: env.VERCEL_REGION\n || env.AWS_REGION\n || env.FLY_REGION\n || env.CF_REGION,\n }\n}\n\nconst LEVEL_ORDER: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n}\n\n/**\n * True if `level` is at least as severe as `minLevel` (debug < info < warn < error).\n */\nexport function isLevelEnabled(level: LogLevel, minLevel: LogLevel): boolean {\n return LEVEL_ORDER[level] >= LEVEL_ORDER[minLevel]\n}\n\nexport function getConsoleMethod(level: LogLevel): LogLevel {\n return level\n}\n\nexport const colors = {\n reset: '\\x1B[0m',\n bold: '\\x1B[1m',\n dim: '\\x1B[2m',\n red: '\\x1B[31m',\n green: '\\x1B[32m',\n yellow: '\\x1B[33m',\n blue: '\\x1B[34m',\n magenta: '\\x1B[35m',\n cyan: '\\x1B[36m',\n white: '\\x1B[37m',\n gray: '\\x1B[90m',\n} as const\n\nconst levelColorMap: Record<string, string> = { error: colors.red, warn: colors.yellow, info: colors.cyan, debug: colors.gray }\n\nexport function getLevelColor(level: string): string {\n return levelColorMap[level] ?? colors.white\n}\n\nexport const cssColors = {\n dim: 'color: #6b7280',\n red: 'color: #ef4444; font-weight: bold',\n green: 'color: #22c55e',\n yellow: 'color: #f59e0b; font-weight: bold',\n cyan: 'color: #06b6d4; font-weight: bold',\n gray: 'color: #6b7280; font-weight: bold',\n reset: 'color: inherit; font-weight: normal',\n} as const\n\nconst cssLevelColorMap: Record<string, string> = { error: cssColors.red, warn: cssColors.yellow, info: cssColors.cyan, debug: cssColors.gray }\n\nexport function getCssLevelColor(level: string): string {\n return cssLevelColorMap[level] ?? cssColors.reset\n}\n\n/**\n * Escape `%` in strings interpolated into `console.log` format strings\n * to prevent `%c`, `%s`, `%d` etc. in user data from being interpreted\n * as formatting directives.\n */\nexport function escapeFormatString(str: string): string {\n return str.replace(/%/g, '%%')\n}\n\n/** Headers that should never be passed to hooks for security */\nexport const SENSITIVE_HEADERS = [\n 'authorization',\n 'cookie',\n 'set-cookie',\n 'x-api-key',\n 'x-auth-token',\n 'proxy-authorization',\n]\n\n/**\n * Filter out undefined values and sensitive headers from a raw header map.\n *\n * @param headers - Flat header map where values may be `undefined`\n * (e.g. from `IncomingMessage.headers` or a framework's header accessor).\n * @returns A new object containing only the headers whose values are defined\n * and whose lowercased key is not in the built-in sensitive-header list\n * (e.g. `authorization`, `cookie`, `x-api-key`).\n */\nexport function filterSafeHeaders(headers: Partial<Record<string, string | undefined>>): Record<string, string> {\n const safeHeaders: Record<string, string> = {}\n\n for (const [key, value] of Object.entries(headers)) {\n if (value !== undefined && !SENSITIVE_HEADERS.includes(key.toLowerCase())) {\n safeHeaders[key] = value\n }\n }\n\n return safeHeaders\n}\n\nconst patternCache = new Map<string, RegExp>()\n\n/**\n * Compile a glob pattern to a anchored RegExp.\n *\n * - `*` matches any characters except the separator\n * - `**` matches any characters including the separator\n * - `?` matches one character except the separator\n */\nexport function globToRegExp(pattern: string, separator: '/' | '.' = '/'): RegExp {\n const cacheKey = `${separator}:${pattern}`\n let regex = patternCache.get(cacheKey)\n if (!regex) {\n const segment = separator === '/' ? '[^/]*' : '[^.]*'\n const char = separator === '/' ? '[^/]' : '[^.]'\n const regexPattern = pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&')\n .replace(/\\*\\*/g, '{{GLOBSTAR}}')\n .replace(/\\*/g, segment)\n .replace(/{{GLOBSTAR}}/g, '.*')\n .replace(/\\?/g, char)\n regex = new RegExp(`^${regexPattern}$`)\n patternCache.set(cacheKey, regex)\n }\n return regex\n}\n\n/**\n * Match a path against a glob pattern.\n * Supports * (any chars except /) and ** (any chars including /).\n */\nexport function matchesPattern(path: string, pattern: string): boolean {\n return globToRegExp(pattern, '/').test(path)\n}\n"],"mappings":";AAEA,SAAgB,eAAe,IAAoB;AACjD,KAAI,KAAK,IACP,QAAO,GAAG,KAAK,MAAM,GAAG,CAAC;AAE3B,QAAO,IAAI,KAAK,KAAM,QAAQ,EAAE,CAAC;;AAGnC,SAAgB,WAAoB;AAClC,QAAO,OAAO,WAAW;;AAG3B,SAAgB,WAAoB;AAClC,QAAO,OAAO,WAAW;;AAG3B,SAAgB,YAAqB;AACnC,KAAI,OAAO,WAAW,YAAa,QAAO;AAC1C,KAAI,OAAO,aAAa,YAAa,QAAO;AAC5C,KAAI,OAAO,cAAc,eAAe,UAAU,YAAY,cAAe,QAAO;AACpF,QAAO;;AAGT,SAAgB,QAAiB;AAC/B,KAAI,OAAO,YAAY,YACrB,QAAO,QAAQ,IAAI,aAAa;AAElC,KAAI,OAAO,WAAW,YACpB,QAAO;AAET,QAAO;;AAGT,SAAgB,oBAAiD;CAC/D,MAAM,MAAM,OAAO,YAAY,cAAc,QAAQ,MAAM,EAAE;CAC7D,MAAM,qBAAqB,OAAO,GAAG,gBAAgB;AAErD,QAAO;EACL,aAAa,IAAI,YAAY;EAC7B,SAAS,IAAI,gBAAgB;EAC7B,SAAS,IAAI;EACb,YAAY,IAAI,cACX,IAAI,cACJ,IAAI,yBACJ,IAAI;EACT,QAAQ,IAAI,iBACP,IAAI,cACJ,IAAI,cACJ,IAAI;EACV;;AAGH,MAAM,cAAwC;CAC5C,OAAO;CACP,MAAM;CACN,MAAM;CACN,OAAO;CACR;;;;AAKD,SAAgB,eAAe,OAAiB,UAA6B;AAC3E,QAAO,YAAY,UAAU,YAAY;;AAG3C,SAAgB,iBAAiB,OAA2B;AAC1D,QAAO;;AAGT,MAAa,SAAS;CACpB,OAAO;CACP,MAAM;CACN,KAAK;CACL,KAAK;CACL,OAAO;CACP,QAAQ;CACR,MAAM;CACN,SAAS;CACT,MAAM;CACN,OAAO;CACP,MAAM;CACP;AAED,MAAM,gBAAwC;CAAE,OAAO,OAAO;CAAK,MAAM,OAAO;CAAQ,MAAM,OAAO;CAAM,OAAO,OAAO;CAAM;AAE/H,SAAgB,cAAc,OAAuB;AACnD,QAAO,cAAc,UAAU,OAAO;;AAGxC,MAAa,YAAY;CACvB,KAAK;CACL,KAAK;CACL,OAAO;CACP,QAAQ;CACR,MAAM;CACN,MAAM;CACN,OAAO;CACR;AAED,MAAM,mBAA2C;CAAE,OAAO,UAAU;CAAK,MAAM,UAAU;CAAQ,MAAM,UAAU;CAAM,OAAO,UAAU;CAAM;AAE9I,SAAgB,iBAAiB,OAAuB;AACtD,QAAO,iBAAiB,UAAU,UAAU;;;;;;;AAQ9C,SAAgB,mBAAmB,KAAqB;AACtD,QAAO,IAAI,QAAQ,MAAM,KAAK;;;AAIhC,MAAa,oBAAoB;CAC/B;CACA;CACA;CACA;CACA;CACA;CACD;;;;;;;;;;AAWD,SAAgB,kBAAkB,SAA8E;CAC9G,MAAM,cAAsC,EAAE;AAE9C,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,QAAQ,CAChD,KAAI,UAAU,KAAA,KAAa,CAAC,kBAAkB,SAAS,IAAI,aAAa,CAAC,CACvE,aAAY,OAAO;AAIvB,QAAO;;AAGT,MAAM,+BAAe,IAAI,KAAqB;;;;;;;;AAS9C,SAAgB,aAAa,SAAiB,YAAuB,KAAa;CAChF,MAAM,WAAW,GAAG,UAAU,GAAG;CACjC,IAAI,QAAQ,aAAa,IAAI,SAAS;AACtC,KAAI,CAAC,OAAO;EACV,MAAM,UAAU,cAAc,MAAM,UAAU;EAC9C,MAAM,OAAO,cAAc,MAAM,SAAS;EAC1C,MAAM,eAAe,QAClB,QAAQ,qBAAqB,OAAO,CACpC,QAAQ,SAAS,eAAe,CAChC,QAAQ,OAAO,QAAQ,CACvB,QAAQ,iBAAiB,KAAK,CAC9B,QAAQ,OAAO,KAAK;AACvB,UAAQ,IAAI,OAAO,IAAI,aAAa,GAAG;AACvC,eAAa,IAAI,UAAU,MAAM;;AAEnC,QAAO;;;;;;AAOT,SAAgB,eAAe,MAAc,SAA0B;AACrE,QAAO,aAAa,SAAS,IAAI,CAAC,KAAK,KAAK"}
@@ -1,4 +1,4 @@
1
- import { K as LogLevel, nt as SamplingConfig, st as TransportConfig } from "../audit-CC8nfazi.mjs";
1
+ import { X as LogLevel, dt as TransportConfig, ot as SamplingConfig } from "../audit-BUAajsPU.mjs";
2
2
  import { Plugin } from "vite";
3
3
 
4
4
  //#region src/vite/types.d.ts
@@ -1,4 +1,4 @@
1
- import { a as walk, i as shouldTransform, n as createStripPlugin, o as MagicString, r as TRANSFORM_FILTER, t as createSourceLocationPlugin } from "../source-location-Dco0cRTz.mjs";
1
+ import { a as walk, i as shouldTransform, n as createStripPlugin, o as MagicString, r as TRANSFORM_FILTER, t as createSourceLocationPlugin } from "../source-location-xkDGiERl.mjs";
2
2
  import { resolve } from "node:path";
3
3
  import { existsSync, writeFileSync } from "node:fs";
4
4
  //#region src/vite/auto-init.ts
@@ -1,4 +1,4 @@
1
- import { $ as RequestLogger, q as LoggerConfig } from "./audit-CC8nfazi.mjs";
1
+ import { Z as LoggerConfig, rt as RequestLogger } from "./audit-BUAajsPU.mjs";
2
2
 
3
3
  //#region src/workers/index.d.ts
4
4
  /**
package/dist/workers.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { b as initLogger, g as createRequestLogger } from "./audit-pV5aLGP0.mjs";
1
+ import { b as initLogger, g as createRequestLogger } from "./audit-BFwTUxBJ.mjs";
2
2
  //#region src/workers/index.ts
3
3
  function isRecord(value) {
4
4
  return typeof value === "object" && value !== null && !Array.isArray(value);