evlog 2.17.0 → 2.18.1

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 (150) 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 +1 -1
  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 +2 -2
  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 +2 -2
  23. package/dist/ai/index.d.mts +1 -1
  24. package/dist/{audit-pV5aLGP0.mjs → audit-BUI3af4w.mjs} +121 -53
  25. package/dist/audit-BUI3af4w.mjs.map +1 -0
  26. package/dist/{audit-CC8nfazi.d.mts → audit-DVdkntSO.d.mts} +21 -1
  27. package/dist/audit-DVdkntSO.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-MSdhzmXn.d.mts → define-D-BVMf2l.d.mts} +3 -3
  31. package/dist/{define-MSdhzmXn.d.mts.map → define-D-BVMf2l.d.mts.map} +1 -1
  32. package/dist/define-D6OJdSUH.mjs.map +1 -1
  33. package/dist/{drain-X7_5szSI.mjs → drain-7n3K6kPe.mjs} +3 -3
  34. package/dist/drain-7n3K6kPe.mjs.map +1 -0
  35. package/dist/elysia/index.d.mts +2 -2
  36. package/dist/elysia/index.mjs +2 -2
  37. package/dist/{enricher-DxgML6IC.d.mts → enricher-UW9npoB2.d.mts} +2 -2
  38. package/dist/{enricher-DxgML6IC.d.mts.map → enricher-UW9npoB2.d.mts.map} +1 -1
  39. package/dist/enrichers.d.mts +2 -2
  40. package/dist/{error-CpbbtyXL.d.mts → error-CVtn5U7b.d.mts} +2 -2
  41. package/dist/{error-CpbbtyXL.d.mts.map → error-CVtn5U7b.d.mts.map} +1 -1
  42. package/dist/error.d.mts +1 -1
  43. package/dist/{errors-DySW1F9_.d.mts → errors-dEMNQCiL.d.mts} +2 -2
  44. package/dist/{errors-DySW1F9_.d.mts.map → errors-dEMNQCiL.d.mts.map} +1 -1
  45. package/dist/express/index.d.mts +3 -3
  46. package/dist/express/index.d.mts.map +1 -1
  47. package/dist/express/index.mjs +2 -2
  48. package/dist/express/index.mjs.map +1 -1
  49. package/dist/fastify/index.d.mts +9 -4
  50. package/dist/fastify/index.d.mts.map +1 -1
  51. package/dist/fastify/index.mjs +10 -8
  52. package/dist/fastify/index.mjs.map +1 -1
  53. package/dist/{fork-8u_zFOJq.mjs → fork-Bga8x-X4.mjs} +3 -2
  54. package/dist/fork-Bga8x-X4.mjs.map +1 -0
  55. package/dist/hono/index.d.mts +2 -2
  56. package/dist/hono/index.mjs +1 -1
  57. package/dist/{http-6umVAKDW.mjs → http-B6YgAhyN.mjs} +2 -2
  58. package/dist/{http-6umVAKDW.mjs.map → http-B6YgAhyN.mjs.map} +1 -1
  59. package/dist/http.d.mts +1 -1
  60. package/dist/{index-o1_z4phv.d.mts → index-ZSRQP_BI.d.mts} +3 -3
  61. package/dist/{index-o1_z4phv.d.mts.map → index-ZSRQP_BI.d.mts.map} +1 -1
  62. package/dist/index.d.mts +8 -8
  63. package/dist/index.mjs +1 -1
  64. package/dist/index.mjs.map +1 -1
  65. package/dist/{integration-DTZtjSqh.mjs → integration-Dhig7ae6.mjs} +2 -2
  66. package/dist/{integration-DTZtjSqh.mjs.map → integration-Dhig7ae6.mjs.map} +1 -1
  67. package/dist/{logger-DntcxxHg.d.mts → logger-CTcvd5Cc.d.mts} +7 -3
  68. package/dist/logger-CTcvd5Cc.d.mts.map +1 -0
  69. package/dist/logger.d.mts +2 -2
  70. package/dist/logger.mjs +2 -2
  71. package/dist/{middleware-U-lIAzHg.d.mts → middleware-31KhtiEF.d.mts} +2 -2
  72. package/dist/{middleware-U-lIAzHg.d.mts.map → middleware-31KhtiEF.d.mts.map} +1 -1
  73. package/dist/nestjs/index.d.mts +2 -2
  74. package/dist/nestjs/index.mjs +2 -2
  75. package/dist/next/client.d.mts +1 -1
  76. package/dist/next/index.d.mts +6 -5
  77. package/dist/next/index.d.mts.map +1 -1
  78. package/dist/next/index.mjs +3 -3
  79. package/dist/next/index.mjs.map +1 -1
  80. package/dist/next/instrumentation.d.mts +1 -1
  81. package/dist/next/instrumentation.mjs +1 -1
  82. package/dist/next/instrumentation.mjs.map +1 -1
  83. package/dist/nitro/module.d.mts +2 -2
  84. package/dist/nitro/module.d.mts.map +1 -1
  85. package/dist/nitro/module.mjs +7 -2
  86. package/dist/nitro/module.mjs.map +1 -1
  87. package/dist/nitro/plugin.mjs +3 -2
  88. package/dist/nitro/plugin.mjs.map +1 -1
  89. package/dist/nitro/v3/index.d.mts +2 -2
  90. package/dist/nitro/v3/module.d.mts +1 -1
  91. package/dist/nitro/v3/module.d.mts.map +1 -1
  92. package/dist/nitro/v3/module.mjs +9 -4
  93. package/dist/nitro/v3/module.mjs.map +1 -1
  94. package/dist/nitro/v3/plugin.mjs +3 -2
  95. package/dist/nitro/v3/plugin.mjs.map +1 -1
  96. package/dist/nitro/v3/useLogger.d.mts +1 -1
  97. package/dist/{nitro-oZre8ab3.d.mts → nitro-BRddgqSb.d.mts} +2 -2
  98. package/dist/{nitro-oZre8ab3.d.mts.map → nitro-BRddgqSb.d.mts.map} +1 -1
  99. package/dist/nitroConfigBridge-NbFn-sIK.mjs +157 -0
  100. package/dist/nitroConfigBridge-NbFn-sIK.mjs.map +1 -0
  101. package/dist/nuxt/module.d.mts +8 -4
  102. package/dist/nuxt/module.d.mts.map +1 -1
  103. package/dist/nuxt/module.mjs +1 -1
  104. package/dist/nuxt/module.mjs.map +1 -1
  105. package/dist/orpc/index.d.mts +115 -0
  106. package/dist/orpc/index.d.mts.map +1 -0
  107. package/dist/orpc/index.mjs +144 -0
  108. package/dist/orpc/index.mjs.map +1 -0
  109. package/dist/{package-v_MmOZeA.mjs → package-B23bR3tK.mjs} +2 -2
  110. package/dist/package-B23bR3tK.mjs.map +1 -0
  111. package/dist/{parseError-yVZ58wIK.d.mts → parseError-D4PIxEWo.d.mts} +2 -2
  112. package/dist/parseError-D4PIxEWo.d.mts.map +1 -0
  113. package/dist/react-router/index.d.mts +2 -2
  114. package/dist/react-router/index.mjs +2 -2
  115. package/dist/runtime/client/log.d.mts +1 -1
  116. package/dist/runtime/server/routes/_evlog/ingest.post.mjs +28 -12
  117. package/dist/runtime/server/routes/_evlog/ingest.post.mjs.map +1 -1
  118. package/dist/runtime/server/useLogger.d.mts +1 -1
  119. package/dist/runtime/utils/parseError.d.mts +2 -2
  120. package/dist/{storage-Dwinmg8P.mjs → storage-BNubsWwz.mjs} +2 -1
  121. package/dist/{storage-Dwinmg8P.mjs.map → storage-BNubsWwz.mjs.map} +1 -1
  122. package/dist/stream.d.mts +1 -1
  123. package/dist/stream.mjs +1 -1
  124. package/dist/sveltekit/index.d.mts +3 -3
  125. package/dist/sveltekit/index.d.mts.map +1 -1
  126. package/dist/sveltekit/index.mjs +43 -10
  127. package/dist/sveltekit/index.mjs.map +1 -1
  128. package/dist/toolkit.d.mts +6 -6
  129. package/dist/toolkit.mjs +6 -6
  130. package/dist/types.d.mts +1 -1
  131. package/dist/{useLogger-BsPL4AQm.d.mts → useLogger-CqvH6qOf.d.mts} +2 -2
  132. package/dist/{useLogger-BsPL4AQm.d.mts.map → useLogger-CqvH6qOf.d.mts.map} +1 -1
  133. package/dist/{utils-DLCeShxL.d.mts → utils-DxqvIOyR.d.mts} +12 -3
  134. package/dist/{utils-DLCeShxL.d.mts.map → utils-DxqvIOyR.d.mts.map} +1 -1
  135. package/dist/utils.d.mts +1 -1
  136. package/dist/utils.mjs +10 -1
  137. package/dist/utils.mjs.map +1 -1
  138. package/dist/vite/index.d.mts +1 -1
  139. package/dist/workers.d.mts +1 -1
  140. package/dist/workers.mjs +1 -1
  141. package/package.json +48 -15
  142. package/dist/audit-CC8nfazi.d.mts.map +0 -1
  143. package/dist/audit-pV5aLGP0.mjs.map +0 -1
  144. package/dist/drain-X7_5szSI.mjs.map +0 -1
  145. package/dist/fork-8u_zFOJq.mjs.map +0 -1
  146. package/dist/logger-DntcxxHg.d.mts.map +0 -1
  147. package/dist/nitroConfigBridge-DKk7eOn-.mjs +0 -92
  148. package/dist/nitroConfigBridge-DKk7eOn-.mjs.map +0 -1
  149. package/dist/package-v_MmOZeA.mjs.map +0 -1
  150. package/dist/parseError-yVZ58wIK.d.mts.map +0 -1
@@ -2,10 +2,45 @@ import { t as extractSafeHeaders } from "../headers-CU-QqnYg.mjs";
2
2
  import { EvlogError } from "../error.mjs";
3
3
  import { t as extractErrorStatus } from "../errors-BQgyQ9xe.mjs";
4
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";
5
+ import { r as createMiddlewareLogger, t as attachForkToLogger } from "../fork-Bga8x-X4.mjs";
6
+ import { t as createLoggerStorage } from "../storage-BNubsWwz.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
  *
@@ -55,10 +90,10 @@ 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" }
@@ -67,7 +102,7 @@ function evlog(options = {}) {
67
102
  await finish({ status: response.status });
68
103
  return response;
69
104
  } catch (error) {
70
- await finish({ error });
105
+ await finish({ error: error instanceof Error ? error : new Error(String(error)) });
71
106
  if (error instanceof EvlogError) {
72
107
  const status = error.status ?? 500;
73
108
  const body = serializeEvlogErrorResponse(error, event.url.pathname);
@@ -99,18 +134,16 @@ function evlog(options = {}) {
99
134
  */
100
135
  function evlogHandleError() {
101
136
  return ({ error, event, status, message }) => {
102
- const logger = event.locals.log;
137
+ const logger = isRequestLogger(event.locals.log) ? event.locals.log : void 0;
103
138
  if (logger && error instanceof Error) logger.error(error);
104
139
  const evlogError = error instanceof Error ? resolveEvlogError(error) : null;
105
140
  if (evlogError) {
106
141
  const errorStatus = extractErrorStatus(evlogError);
107
142
  const response = serializeEvlogErrorResponse(evlogError, event.url.pathname);
108
143
  return {
109
- message: response.message,
144
+ message: typeof response.message === "string" ? response.message : message,
110
145
  status: errorStatus,
111
- why: response.data?.why,
112
- fix: response.data?.fix,
113
- link: response.data?.link
146
+ ...readEvlogResponseData(response)
114
147
  };
115
148
  }
116
149
  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, 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 await finish({ status: response.status })\n return 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,8 +1,8 @@
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 { $ 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-DVdkntSO.mjs";
2
+ import { a as resolveMiddlewarePluginRunner, i as createMiddlewareLogger, n as MiddlewareLoggerOptions, o as runEnrichAndDrain, r as MiddlewareLoggerResult, t as BaseEvlogOptions } from "./middleware-31KhtiEF.mjs";
3
+ import { i as toMiddlewareOptions, n as defineEvlog, r as toLoggerConfig, t as EvlogConfig } from "./define-D-BVMf2l.mjs";
4
+ import { n as EnricherOptions, r as defineEnricher, t as EnricherDefinition } from "./enricher-UW9npoB2.mjs";
5
+ import { n as getServiceForPath, r as shouldLog, t as extractErrorStatus } from "./errors-dEMNQCiL.mjs";
6
6
  import { AsyncLocalStorage } from "node:async_hooks";
7
7
 
8
8
  //#region src/shared/compose.d.ts
@@ -35,7 +35,7 @@ declare function composePlugins(...lists: Array<EvlogPlugin[] | undefined>): Evl
35
35
  declare function getRuntimeConfig(): Promise<Record<string, any> | undefined>;
36
36
  /**
37
37
  * 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']`.
38
+ * environment variables to fall back to, e.g. `['NUXT_AXIOM_API_KEY', 'AXIOM_API_KEY']`.
39
39
  */
40
40
  interface ConfigField<T> {
41
41
  key: keyof T & string;
package/dist/toolkit.mjs CHANGED
@@ -1,14 +1,14 @@
1
- import { D as drainPlugin, E as definePlugin, O as enricherPlugin, T as createPluginRunner, k as getEmptyPluginRunner } from "./audit-pV5aLGP0.mjs";
1
+ import { A as getEmptyPluginRunner, D as definePlugin, E as createPluginRunner, O as drainPlugin, k as enricherPlugin } from "./audit-BUI3af4w.mjs";
2
2
  import { i as normalizeNumber, n as extractSafeNodeHeaders, r as getHeader, t as extractSafeHeaders } from "./headers-CU-QqnYg.mjs";
3
3
  import { t as extractErrorStatus } from "./errors-BQgyQ9xe.mjs";
4
4
  import { n as toLoggerConfig, r as toMiddlewareOptions, t as defineEvlog } from "./define-D6OJdSUH.mjs";
5
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";
6
+ import { i as withEvlogIdentityHeaders, n as EVLOG_VERSION, r as httpPost, t as EVLOG_USER_AGENT } from "./http-B6YgAhyN.mjs";
7
+ import { i as resolveAdapterConfig, n as defineHttpDrain, r as getRuntimeConfig, t as defineDrain } from "./drain-7n3K6kPe.mjs";
8
8
  import { n as toOtlpAttributeValue, r as toTypedAttributeValue, t as mergeEventField } from "./event-1BMl7o0k.mjs";
9
9
  import { n as OTEL_SEVERITY_TEXT, t as OTEL_SEVERITY_NUMBER } from "./severity-R5Egq3qz.mjs";
10
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";
11
+ import { a as runEnrichAndDrain, i as resolveMiddlewarePluginRunner, n as forkBackgroundLogger, r as createMiddlewareLogger, t as attachForkToLogger } from "./fork-Bga8x-X4.mjs";
12
+ import { t as defineFrameworkIntegration } from "./integration-Dhig7ae6.mjs";
13
+ import { t as createLoggerStorage } from "./storage-BNubsWwz.mjs";
14
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 };
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";
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-DVdkntSO.mjs";
2
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,4 +1,4 @@
1
- import { $ as RequestLogger, it as ServerEvent } from "./audit-CC8nfazi.mjs";
1
+ import { $ as RequestLogger, it as ServerEvent } from "./audit-DVdkntSO.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-CqvH6qOf.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-CqvH6qOf.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 { K as LogLevel, R as EnvironmentContext } from "./audit-DVdkntSO.mjs";
2
2
 
3
3
  //#region src/utils.d.ts
4
4
  declare function formatDuration(ms: number): string;
@@ -44,7 +44,16 @@ 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>;
48
57
  /**
49
58
  * Match a path against a glob pattern.
50
59
  * Supports * (any chars except /) and ** (any chars including /).
@@ -52,4 +61,4 @@ declare function filterSafeHeaders(headers: Record<string, string>): Record<stri
52
61
  declare function matchesPattern(path: string, pattern: string): boolean;
53
62
  //#endregion
54
63
  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
64
+ //# sourceMappingURL=utils-DxqvIOyR.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-DxqvIOyR.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;;;;;iBAkBzE,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";
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-DxqvIOyR.mjs";
2
2
  export { SENSITIVE_HEADERS, colors, cssColors, detectEnvironment, escapeFormatString, filterSafeHeaders, formatDuration, getConsoleMethod, getCssLevelColor, getLevelColor, isBrowser, isClient, isDev, isLevelEnabled, isServer, matchesPattern };
package/dist/utils.mjs CHANGED
@@ -103,9 +103,18 @@ 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();
@@ -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 * 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;;;;;;;;;;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;;;;;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,4 +1,4 @@
1
- import { K as LogLevel, nt as SamplingConfig, st as TransportConfig } from "../audit-CC8nfazi.mjs";
1
+ import { K as LogLevel, nt as SamplingConfig, st as TransportConfig } from "../audit-DVdkntSO.mjs";
2
2
  import { Plugin } from "vite";
3
3
 
4
4
  //#region src/vite/types.d.ts
@@ -1,4 +1,4 @@
1
- import { $ as RequestLogger, q as LoggerConfig } from "./audit-CC8nfazi.mjs";
1
+ import { $ as RequestLogger, q as LoggerConfig } from "./audit-DVdkntSO.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-BUI3af4w.mjs";
2
2
  //#region src/workers/index.ts
3
3
  function isRecord(value) {
4
4
  return typeof value === "object" && value !== null && !Array.isArray(value);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "evlog",
3
- "version": "2.17.0",
3
+ "version": "2.18.1",
4
4
  "description": "Modern TypeScript logger — simple logs, wide events, structured errors. Built for scripts, libraries, jobs, edge, and HTTP. One drain pipeline everywhere.",
5
5
  "author": "HugoRCD <contact@hrcd.fr>",
6
6
  "homepage": "https://evlog.dev",
@@ -24,6 +24,7 @@
24
24
  "hono",
25
25
  "elysia",
26
26
  "nestjs",
27
+ "orpc",
27
28
  "sveltekit",
28
29
  "react-router",
29
30
  "vite",
@@ -100,6 +101,11 @@
100
101
  "import": "./dist/adapters/fs.mjs",
101
102
  "default": "./dist/adapters/fs.mjs"
102
103
  },
104
+ "./memory": {
105
+ "types": "./dist/adapters/memory.d.mts",
106
+ "import": "./dist/adapters/memory.mjs",
107
+ "default": "./dist/adapters/memory.mjs"
108
+ },
103
109
  "./enrichers": {
104
110
  "types": "./dist/enrichers.d.mts",
105
111
  "import": "./dist/enrichers.mjs",
@@ -170,6 +176,11 @@
170
176
  "import": "./dist/nestjs/index.mjs",
171
177
  "default": "./dist/nestjs/index.mjs"
172
178
  },
179
+ "./orpc": {
180
+ "types": "./dist/orpc/index.d.mts",
181
+ "import": "./dist/orpc/index.mjs",
182
+ "default": "./dist/orpc/index.mjs"
183
+ },
173
184
  "./react-router": {
174
185
  "types": "./dist/react-router/index.d.mts",
175
186
  "import": "./dist/react-router/index.mjs",
@@ -249,6 +260,9 @@
249
260
  "fs": [
250
261
  "./dist/adapters/fs.d.mts"
251
262
  ],
263
+ "memory": [
264
+ "./dist/adapters/memory.d.mts"
265
+ ],
252
266
  "enrichers": [
253
267
  "./dist/enrichers.d.mts"
254
268
  ],
@@ -291,6 +305,9 @@
291
305
  "nestjs": [
292
306
  "./dist/nestjs/index.d.mts"
293
307
  ],
308
+ "orpc": [
309
+ "./dist/orpc/index.d.mts"
310
+ ],
294
311
  "react-router": [
295
312
  "./dist/react-router/index.d.mts"
296
313
  ],
@@ -319,15 +336,25 @@
319
336
  "README.md"
320
337
  ],
321
338
  "devDependencies": {
322
- "@tanstack/start-client-core": "^1.167.20",
323
- "acorn": "^8.16.0",
324
339
  "@codspeed/vitest-plugin": "^5.3.0",
325
340
  "@nestjs/common": "^11.1.19",
341
+ "@nestjs/core": "^11.1.19",
342
+ "@nestjs/platform-express": "^11.1.19",
343
+ "@nestjs/testing": "^11",
326
344
  "@nuxt/devtools": "^3.2.4",
327
345
  "@nuxt/schema": "^4.4.2",
328
346
  "@nuxt/test-utils": "^4.0.3",
347
+ "@orpc/client": "^1.14.2",
348
+ "@orpc/server": "^1.14.2",
349
+ "@stryker-mutator/core": "^9.6.1",
350
+ "@stryker-mutator/vitest-runner": "^9.6.1",
351
+ "@sveltejs/kit": "^2.59.0",
352
+ "@swc/core": "^1.15.33",
353
+ "@tanstack/start-client-core": "^1.167.20",
329
354
  "@types/express": "^5.0.6",
330
355
  "@types/supertest": "^7.2.0",
356
+ "@vitest/coverage-v8": "^4.1.5",
357
+ "acorn": "^8.16.0",
331
358
  "changelogen": "^0.6.2",
332
359
  "consola": "^3.4.2",
333
360
  "elysia": "^1.4.28",
@@ -335,6 +362,7 @@
335
362
  "fastify": "^5.8.5",
336
363
  "h3": "^1.15.11",
337
364
  "happy-dom": "^20.9.0",
365
+ "magic-string": "^0.30.21",
338
366
  "nitro": "^3.0.260311-beta",
339
367
  "nitropack": "^2.13.3",
340
368
  "nuxt": "^4.4.2",
@@ -344,29 +372,30 @@
344
372
  "tinyglobby": "^0.2.16",
345
373
  "tsdown": "^0.21.10",
346
374
  "tsx": "^4.20.7",
347
- "magic-string": "^0.30.21",
348
375
  "typescript": "^6.0.3",
349
- "vite": "^8.0.10",
350
376
  "ufo": "^1.6.3",
377
+ "unplugin-swc": "^1.5.9",
378
+ "vite": "^8.0.10",
351
379
  "winston": "^3.19.0"
352
380
  },
353
381
  "peerDependencies": {
382
+ "@nestjs/common": ">=11.1.19",
354
383
  "@nuxt/kit": "^4.4.2",
384
+ "@orpc/server": ">=1.14.0",
385
+ "@tanstack/start-client-core": "^1.167.20",
386
+ "ai": ">=6.0.168",
387
+ "elysia": ">=1.4.28",
388
+ "express": ">=5.2.1",
389
+ "fastify": ">=5.8.5",
355
390
  "h3": "^1.15.11",
391
+ "hono": ">=4.11.0",
392
+ "next": ">=16.2.4",
393
+ "nitro": "^3.0.260311-beta",
356
394
  "nitropack": "^2.13.3",
357
395
  "ofetch": "^1.5.1",
358
- "nitro": "^3.0.260311-beta",
359
- "next": ">=16.2.4",
360
396
  "react": ">=19.2.5",
361
- "hono": "",
362
- "express": ">=5.2.1",
363
- "elysia": ">=1.4.28",
364
- "fastify": ">=5.8.5",
365
- "@nestjs/common": ">=11.1.19",
366
397
  "react-router": ">=7.14.2",
367
- "vite": "^7.0.0 || ^8.0.0",
368
- "ai": ">=6.0.168",
369
- "@tanstack/start-client-core": "^1.167.20"
398
+ "vite": "^7.0.0 || ^8.0.0"
370
399
  },
371
400
  "peerDependenciesMeta": {
372
401
  "@nuxt/kit": {
@@ -405,6 +434,9 @@
405
434
  "@nestjs/common": {
406
435
  "optional": true
407
436
  },
437
+ "@orpc/server": {
438
+ "optional": true
439
+ },
408
440
  "react-router": {
409
441
  "optional": true
410
442
  },
@@ -433,6 +465,7 @@
433
465
  "test:watch": "vitest watch",
434
466
  "test:coverage": "vitest run --coverage",
435
467
  "test:e2e": "vitest run --config vitest.e2e.config.ts",
468
+ "mutate": "stryker run",
436
469
  "typecheck": "echo 'Typecheck handled by build'"
437
470
  }
438
471
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"audit-CC8nfazi.d.mts","names":[],"sources":["../src/shared/plugin.ts","../src/types.ts","../src/audit.ts"],"mappings":"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"}