evlog 2.11.1 → 2.13.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 (173) hide show
  1. package/README.md +42 -2
  2. package/dist/{_drain-YH8ERc5l.mjs → _drain-CmCtsuF6.mjs} +1 -1
  3. package/dist/{_drain-YH8ERc5l.mjs.map → _drain-CmCtsuF6.mjs.map} +1 -1
  4. package/dist/{_http-C_2wbJw3.mjs → _http-CHSsrWDJ.mjs} +2 -2
  5. package/dist/{_http-C_2wbJw3.mjs.map → _http-CHSsrWDJ.mjs.map} +1 -1
  6. package/dist/{_severity-BZhz3f9e.mjs → _severity-CQijvfhU.mjs} +1 -1
  7. package/dist/{_severity-BZhz3f9e.mjs.map → _severity-CQijvfhU.mjs.map} +1 -1
  8. package/dist/adapters/axiom.d.mts +1 -1
  9. package/dist/adapters/axiom.mjs +2 -2
  10. package/dist/adapters/better-stack.d.mts +1 -1
  11. package/dist/adapters/better-stack.mjs +2 -2
  12. package/dist/adapters/datadog.d.mts +1 -1
  13. package/dist/adapters/datadog.mjs +2 -2
  14. package/dist/adapters/fs.d.mts +1 -1
  15. package/dist/adapters/fs.mjs +1 -1
  16. package/dist/adapters/hyperdx.d.mts +1 -1
  17. package/dist/adapters/hyperdx.mjs +2 -2
  18. package/dist/adapters/otlp.d.mts +1 -1
  19. package/dist/adapters/otlp.mjs +3 -3
  20. package/dist/adapters/posthog.d.mts +1 -1
  21. package/dist/adapters/posthog.mjs +2 -2
  22. package/dist/adapters/sentry.d.mts +1 -1
  23. package/dist/adapters/sentry.mjs +3 -3
  24. package/dist/ai/index.d.mts +144 -5
  25. package/dist/ai/index.d.mts.map +1 -1
  26. package/dist/ai/index.mjs +108 -5
  27. package/dist/ai/index.mjs.map +1 -1
  28. package/dist/better-auth/index.d.mts +220 -0
  29. package/dist/better-auth/index.d.mts.map +1 -0
  30. package/dist/better-auth/index.mjs +205 -0
  31. package/dist/better-auth/index.mjs.map +1 -0
  32. package/dist/browser.d.mts +13 -52
  33. package/dist/browser.d.mts.map +1 -1
  34. package/dist/browser.mjs +5 -81
  35. package/dist/browser.mjs.map +1 -1
  36. package/dist/client.d.mts +2 -2
  37. package/dist/client.mjs +2 -2
  38. package/dist/{dist-BFn8qsRC.mjs → dist-Do8P4zWd.mjs} +1 -1
  39. package/dist/{dist-BFn8qsRC.mjs.map → dist-Do8P4zWd.mjs.map} +1 -1
  40. package/dist/elysia/index.d.mts +2 -2
  41. package/dist/elysia/index.d.mts.map +1 -1
  42. package/dist/elysia/index.mjs +16 -4
  43. package/dist/elysia/index.mjs.map +1 -1
  44. package/dist/enrichers.d.mts +1 -1
  45. package/dist/{error-plrBYLQk.d.mts → error-B9CiGK_i.d.mts} +2 -2
  46. package/dist/{error-plrBYLQk.d.mts.map → error-B9CiGK_i.d.mts.map} +1 -1
  47. package/dist/error.d.mts +1 -1
  48. package/dist/{errors-gH4C9KSC.mjs → errors-BJRXUfMg.mjs} +1 -1
  49. package/dist/{errors-gH4C9KSC.mjs.map → errors-BJRXUfMg.mjs.map} +1 -1
  50. package/dist/{errors-bPoj9UZk.d.mts → errors-Dr0r4OpR.d.mts} +2 -2
  51. package/dist/{errors-bPoj9UZk.d.mts.map → errors-Dr0r4OpR.d.mts.map} +1 -1
  52. package/dist/express/index.d.mts +2 -2
  53. package/dist/express/index.d.mts.map +1 -1
  54. package/dist/express/index.mjs +8 -4
  55. package/dist/express/index.mjs.map +1 -1
  56. package/dist/fastify/index.d.mts +2 -2
  57. package/dist/fastify/index.d.mts.map +1 -1
  58. package/dist/fastify/index.mjs +8 -4
  59. package/dist/fastify/index.mjs.map +1 -1
  60. package/dist/fork-Y4z8iHti.mjs +72 -0
  61. package/dist/fork-Y4z8iHti.mjs.map +1 -0
  62. package/dist/headers-D74M0wsg.mjs +30 -0
  63. package/dist/headers-D74M0wsg.mjs.map +1 -0
  64. package/dist/hono/index.d.mts +2 -2
  65. package/dist/hono/index.mjs +2 -1
  66. package/dist/hono/index.mjs.map +1 -1
  67. package/dist/http.d.mts +65 -0
  68. package/dist/http.d.mts.map +1 -0
  69. package/dist/http.mjs +94 -0
  70. package/dist/http.mjs.map +1 -0
  71. package/dist/index.d.mts +7 -6
  72. package/dist/index.mjs +3 -2
  73. package/dist/logger-DnobymUQ.mjs +741 -0
  74. package/dist/logger-DnobymUQ.mjs.map +1 -0
  75. package/dist/{logger-CG1eop2_.d.mts → logger-Dp6nYWjH.d.mts} +6 -2
  76. package/dist/logger-Dp6nYWjH.d.mts.map +1 -0
  77. package/dist/logger.d.mts +1 -1
  78. package/dist/logger.mjs +1 -361
  79. package/dist/{headers-BSi3UHKL.mjs → middleware-BtBuosFV.mjs} +13 -32
  80. package/dist/middleware-BtBuosFV.mjs.map +1 -0
  81. package/dist/{middleware-DojmTj9Y.d.mts → middleware-FgC1OdOD.d.mts} +21 -3
  82. package/dist/middleware-FgC1OdOD.d.mts.map +1 -0
  83. package/dist/nestjs/index.d.mts +2 -2
  84. package/dist/nestjs/index.d.mts.map +1 -1
  85. package/dist/nestjs/index.mjs +8 -4
  86. package/dist/nestjs/index.mjs.map +1 -1
  87. package/dist/next/client.d.mts +9 -3
  88. package/dist/next/client.d.mts.map +1 -1
  89. package/dist/next/client.mjs +5 -3
  90. package/dist/next/client.mjs.map +1 -1
  91. package/dist/next/index.d.mts +9 -4
  92. package/dist/next/index.d.mts.map +1 -1
  93. package/dist/next/index.mjs +17 -2
  94. package/dist/next/index.mjs.map +1 -1
  95. package/dist/next/instrumentation.d.mts +3 -1
  96. package/dist/next/instrumentation.d.mts.map +1 -1
  97. package/dist/next/instrumentation.mjs +2 -1
  98. package/dist/next/instrumentation.mjs.map +1 -1
  99. package/dist/nitro/errorHandler.mjs +2 -2
  100. package/dist/nitro/module.d.mts +2 -2
  101. package/dist/nitro/plugin.mjs +7 -4
  102. package/dist/nitro/plugin.mjs.map +1 -1
  103. package/dist/nitro/v3/errorHandler.mjs +3 -3
  104. package/dist/nitro/v3/index.d.mts +2 -2
  105. package/dist/nitro/v3/module.d.mts +1 -1
  106. package/dist/nitro/v3/plugin.mjs +8 -5
  107. package/dist/nitro/v3/plugin.mjs.map +1 -1
  108. package/dist/nitro/v3/useLogger.d.mts +1 -1
  109. package/dist/{nitro-CfGx0wDJ.d.mts → nitro-CDHLfRdw.d.mts} +13 -2
  110. package/dist/nitro-CDHLfRdw.d.mts.map +1 -0
  111. package/dist/{nitro-Dpq5ZmcM.mjs → nitro-OmT_M4Pb.mjs} +2 -2
  112. package/dist/nitro-OmT_M4Pb.mjs.map +1 -0
  113. package/dist/{nitroConfigBridge-fidbf-Y_.mjs → nitroConfigBridge-C37lXaNm.mjs} +1 -1
  114. package/dist/{nitroConfigBridge-fidbf-Y_.mjs.map → nitroConfigBridge-C37lXaNm.mjs.map} +1 -1
  115. package/dist/nuxt/module.d.mts +26 -1
  116. package/dist/nuxt/module.d.mts.map +1 -1
  117. package/dist/nuxt/module.mjs +7 -2
  118. package/dist/nuxt/module.mjs.map +1 -1
  119. package/dist/{parseError-B_qXj8x4.d.mts → parseError-DM-lyezZ.d.mts} +2 -2
  120. package/dist/parseError-DM-lyezZ.d.mts.map +1 -0
  121. package/dist/react-router/index.d.mts +2 -2
  122. package/dist/react-router/index.d.mts.map +1 -1
  123. package/dist/react-router/index.mjs +8 -4
  124. package/dist/react-router/index.mjs.map +1 -1
  125. package/dist/{routes-CE3_c-iZ.mjs → routes-CGPmbzCZ.mjs} +1 -1
  126. package/dist/{routes-CE3_c-iZ.mjs.map → routes-CGPmbzCZ.mjs.map} +1 -1
  127. package/dist/runtime/client/log.d.mts +7 -2
  128. package/dist/runtime/client/log.d.mts.map +1 -1
  129. package/dist/runtime/client/log.mjs +24 -6
  130. package/dist/runtime/client/log.mjs.map +1 -1
  131. package/dist/runtime/client/plugin.mjs +1 -0
  132. package/dist/runtime/client/plugin.mjs.map +1 -1
  133. package/dist/runtime/server/routes/_evlog/ingest.post.mjs +1 -1
  134. package/dist/runtime/server/useLogger.d.mts +1 -1
  135. package/dist/runtime/utils/parseError.d.mts +2 -2
  136. package/dist/runtime/utils/parseError.mjs +1 -1
  137. package/dist/{source-location-B1VVgXkh.mjs → source-location-DRvDDqfq.mjs} +1 -1
  138. package/dist/{source-location-B1VVgXkh.mjs.map → source-location-DRvDDqfq.mjs.map} +1 -1
  139. package/dist/{storage-B6NPh8rV.mjs → storage-CFGTn37X.mjs} +1 -1
  140. package/dist/{storage-B6NPh8rV.mjs.map → storage-CFGTn37X.mjs.map} +1 -1
  141. package/dist/sveltekit/index.d.mts +2 -2
  142. package/dist/sveltekit/index.d.mts.map +1 -1
  143. package/dist/sveltekit/index.mjs +10 -6
  144. package/dist/sveltekit/index.mjs.map +1 -1
  145. package/dist/toolkit.d.mts +41 -4
  146. package/dist/toolkit.d.mts.map +1 -1
  147. package/dist/toolkit.mjs +7 -5
  148. package/dist/{types-v_JkG_D7.d.mts → types-DbzDln7O.d.mts} +120 -4
  149. package/dist/types-DbzDln7O.d.mts.map +1 -0
  150. package/dist/types.d.mts +2 -2
  151. package/dist/{useLogger-TjKH37BO.d.mts → useLogger-N5A-d5l9.d.mts} +2 -2
  152. package/dist/{useLogger-TjKH37BO.d.mts.map → useLogger-N5A-d5l9.d.mts.map} +1 -1
  153. package/dist/utils-DnX6VMNi.d.mts +54 -0
  154. package/dist/utils-DnX6VMNi.d.mts.map +1 -0
  155. package/dist/utils.d.mts +2 -50
  156. package/dist/utils.mjs +13 -1
  157. package/dist/utils.mjs.map +1 -1
  158. package/dist/vite/index.d.mts +5 -1
  159. package/dist/vite/index.d.mts.map +1 -1
  160. package/dist/vite/index.mjs +3 -1
  161. package/dist/vite/index.mjs.map +1 -1
  162. package/dist/workers.d.mts +1 -1
  163. package/dist/workers.mjs +1 -1
  164. package/package.json +24 -3
  165. package/dist/headers-BSi3UHKL.mjs.map +0 -1
  166. package/dist/logger-CG1eop2_.d.mts.map +0 -1
  167. package/dist/logger.mjs.map +0 -1
  168. package/dist/middleware-DojmTj9Y.d.mts.map +0 -1
  169. package/dist/nitro-CfGx0wDJ.d.mts.map +0 -1
  170. package/dist/nitro-Dpq5ZmcM.mjs.map +0 -1
  171. package/dist/parseError-B_qXj8x4.d.mts.map +0 -1
  172. package/dist/types-v_JkG_D7.d.mts.map +0 -1
  173. package/dist/utils.d.mts.map +0 -1
@@ -1,8 +1,45 @@
1
- import { g as RequestLogger } from "./types-v_JkG_D7.mjs";
2
- import { i as createMiddlewareLogger, n as MiddlewareLoggerOptions, r as MiddlewareLoggerResult, t as BaseEvlogOptions } from "./middleware-DojmTj9Y.mjs";
3
- import { n as getServiceForPath, r as shouldLog, t as extractErrorStatus } from "./errors-bPoj9UZk.mjs";
1
+ import { _ as RequestLogger } from "./types-DbzDln7O.mjs";
2
+ import { a as runEnrichAndDrain, i as createMiddlewareLogger, n as MiddlewareLoggerOptions, r as MiddlewareLoggerResult, t as BaseEvlogOptions } from "./middleware-FgC1OdOD.mjs";
3
+ import { n as getServiceForPath, r as shouldLog, t as extractErrorStatus } from "./errors-Dr0r4OpR.mjs";
4
4
  import { AsyncLocalStorage } from "node:async_hooks";
5
5
 
6
+ //#region src/shared/fork.d.ts
7
+ /**
8
+ * Optional hooks for integrations that track active loggers (e.g. Elysia `activeLoggers`).
9
+ */
10
+ interface ForkLifecycle {
11
+ /** Called after the child logger is installed in storage, before `fn` runs. */
12
+ onChildEnter?: (child: RequestLogger) => void;
13
+ /** Called after the child has finished (emit + enrich/drain), success or failure. */
14
+ onChildExit?: (child: RequestLogger) => void;
15
+ }
16
+ /**
17
+ * Options for {@link forkBackgroundLogger}.
18
+ *
19
+ * @beta Part of `evlog/toolkit`
20
+ */
21
+ interface ForkBackgroundLoggerOptions {
22
+ storage: AsyncLocalStorage<RequestLogger>;
23
+ parent: RequestLogger;
24
+ middlewareOptions: MiddlewareLoggerOptions;
25
+ label: string;
26
+ fn: () => void | Promise<void>;
27
+ lifecycle?: ForkLifecycle;
28
+ }
29
+ /**
30
+ * Attach {@link RequestLogger.fork} to a request logger. Replaces any existing `fork`.
31
+ */
32
+ declare function attachForkToLogger(storage: AsyncLocalStorage<RequestLogger>, parent: RequestLogger, middlewareOptions: MiddlewareLoggerOptions, lifecycle?: ForkLifecycle): void;
33
+ /**
34
+ * Run background work under a child request logger so `useLogger()` resolves to the
35
+ * child while `fn` runs. The child emits a separate wide event when `fn` settles,
36
+ * with `operation` and `_parentRequestId` set for correlation.
37
+ *
38
+ * @beta Part of `evlog/toolkit` — used by framework integrations; prefer `log.fork()`
39
+ * on the request logger when available.
40
+ */
41
+ declare function forkBackgroundLogger(options: ForkBackgroundLoggerOptions): void;
42
+ //#endregion
6
43
  //#region src/shared/headers.d.ts
7
44
  /**
8
45
  * Extract headers from a Web API `Headers` object and filter out sensitive ones.
@@ -34,5 +71,5 @@ declare function createLoggerStorage(contextHint: string): {
34
71
  useLogger: <T extends object = Record<string, unknown>>() => RequestLogger<T>;
35
72
  };
36
73
  //#endregion
37
- export { BaseEvlogOptions, MiddlewareLoggerOptions, MiddlewareLoggerResult, createLoggerStorage, createMiddlewareLogger, extractErrorStatus, extractSafeHeaders, extractSafeNodeHeaders, getServiceForPath, shouldLog };
74
+ export { BaseEvlogOptions, ForkBackgroundLoggerOptions, ForkLifecycle, MiddlewareLoggerOptions, MiddlewareLoggerResult, attachForkToLogger, createLoggerStorage, createMiddlewareLogger, extractErrorStatus, extractSafeHeaders, extractSafeNodeHeaders, forkBackgroundLogger, getServiceForPath, runEnrichAndDrain, shouldLog };
38
75
  //# sourceMappingURL=toolkit.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"toolkit.d.mts","names":[],"sources":["../src/shared/headers.ts","../src/shared/storage.ts"],"mappings":";;;;;;;;;;;iBAOgB,kBAAA,CAAmB,OAAA,EAAS,OAAA,GAAU,MAAA;AAAtD;;;;AAAA,iBAYgB,sBAAA,CAAuB,OAAA,EAAS,MAAA,0CAAgD,MAAA;;;;;;;AAZhG;;;;;;;;iBCQgB,mBAAA,CAAoB,WAAA;;iCAmBC,MAAA,wBAA+B,aAAA,CAAc,CAAA;AAAA"}
1
+ {"version":3,"file":"toolkit.d.mts","names":[],"sources":["../src/shared/fork.ts","../src/shared/headers.ts","../src/shared/storage.ts"],"mappings":";;;;;;;;;UAUiB,aAAA;EAAa;EAE5B,YAAA,IAAgB,KAAA,EAAO,aAAA;EAEY;EAAnC,WAAA,IAAe,KAAA,EAAO,aAAA;AAAA;;;;;;UAQP,2BAAA;EACf,OAAA,EAAS,iBAAA,CAAkB,aAAA;EAC3B,MAAA,EAAQ,aAAA;EACR,iBAAA,EAAmB,uBAAA;EACnB,KAAA;EACA,EAAA,eAAiB,OAAA;EACjB,SAAA,GAAY,aAAA;AAAA;;;;iBAME,kBAAA,CACd,OAAA,EAAS,iBAAA,CAAkB,aAAA,GAC3B,MAAA,EAAQ,aAAA,EACR,iBAAA,EAAmB,uBAAA,EACnB,SAAA,GAAY,aAAA;;;;;;;;;iBAgBE,oBAAA,CAAqB,OAAA,EAAS,2BAAA;;;;;;;;iBC/C9B,kBAAA,CAAmB,OAAA,EAAS,OAAA,GAAU,MAAA;ADGtD;;;;AAAA,iBCSgB,sBAAA,CAAuB,OAAA,EAAS,MAAA,0CAAgD,MAAA;;;;;;;ADThG;;;;;;;;iBEKgB,mBAAA,CAAoB,WAAA;;iCAmBC,MAAA,wBAA+B,aAAA,CAAc,CAAA;AAAA"}
package/dist/toolkit.mjs CHANGED
@@ -1,5 +1,7 @@
1
- import { t as extractErrorStatus } from "./errors-gH4C9KSC.mjs";
2
- import { n as shouldLog, t as getServiceForPath } from "./routes-CE3_c-iZ.mjs";
3
- import { n as extractSafeNodeHeaders, r as createMiddlewareLogger, t as extractSafeHeaders } from "./headers-BSi3UHKL.mjs";
4
- import { t as createLoggerStorage } from "./storage-B6NPh8rV.mjs";
5
- export { createLoggerStorage, createMiddlewareLogger, extractErrorStatus, extractSafeHeaders, extractSafeNodeHeaders, getServiceForPath, shouldLog };
1
+ import { t as extractErrorStatus } from "./errors-BJRXUfMg.mjs";
2
+ import { n as shouldLog, t as getServiceForPath } from "./routes-CGPmbzCZ.mjs";
3
+ import { n as runEnrichAndDrain, t as createMiddlewareLogger } from "./middleware-BtBuosFV.mjs";
4
+ import { n as forkBackgroundLogger, t as attachForkToLogger } from "./fork-Y4z8iHti.mjs";
5
+ import { n as extractSafeNodeHeaders, t as extractSafeHeaders } from "./headers-D74M0wsg.mjs";
6
+ import { t as createLoggerStorage } from "./storage-CFGTn37X.mjs";
7
+ export { attachForkToLogger, createLoggerStorage, createMiddlewareLogger, extractErrorStatus, extractSafeHeaders, extractSafeNodeHeaders, forkBackgroundLogger, getServiceForPath, runEnrichAndDrain, shouldLog };
@@ -81,6 +81,36 @@ interface IngestPayload {
81
81
  level: 'info' | 'error' | 'warn' | 'debug';
82
82
  [key: string]: unknown;
83
83
  }
84
+ /**
85
+ * Auto-redaction configuration for PII protection.
86
+ * Scrubs sensitive data from wide events before console output and draining.
87
+ *
88
+ * Built-in patterns are included by default. Opt out with `builtins: false`
89
+ * or select specific ones with `builtins: ['email', 'creditCard']`.
90
+ */
91
+ interface RedactConfig {
92
+ /** Dot-notation paths to redact (e.g., 'user.email', 'headers.x-forwarded-for') */
93
+ paths?: string[];
94
+ /** Additional regex patterns to match and replace string values anywhere in the event */
95
+ patterns?: RegExp[];
96
+ /**
97
+ * Control built-in PII patterns.
98
+ * - `undefined` / omitted → all built-ins enabled (default)
99
+ * - `false` → no built-ins, only custom `paths`/`patterns`
100
+ * - `['email', 'creditCard', ...]` → only the listed built-ins
101
+ *
102
+ * Available: `'creditCard'`, `'email'`, `'ipv4'`, `'phone'`, `'jwt'`, `'bearer'`, `'iban'`
103
+ */
104
+ builtins?: false | Array<'creditCard' | 'email' | 'ipv4' | 'phone' | 'jwt' | 'bearer' | 'iban'>;
105
+ /**
106
+ * Replacement string used for path-based and custom pattern redaction.
107
+ * Built-in patterns use smart partial masking instead (e.g. `****1111` for credit cards).
108
+ * @default '[REDACTED]'
109
+ */
110
+ replacement?: string;
111
+ /** @internal Resolved masker functions from built-in patterns. Not user-facing. */
112
+ _maskers?: Array<[RegExp, (match: string) => string]>;
113
+ }
84
114
  /**
85
115
  * Sampling rates per log level (0-100 percentage)
86
116
  */
@@ -244,6 +274,13 @@ interface LoggerConfig {
244
274
  pretty?: boolean;
245
275
  /** Sampling configuration for filtering logs */
246
276
  sampling?: SamplingConfig;
277
+ /**
278
+ * Minimum severity for the global `log` API (tagged and object form).
279
+ * Does not apply to `createLogger().emit()` / request wide events (use `sampling` for volume).
280
+ * Order: debug < info < warn < error.
281
+ * @default 'debug' (all levels)
282
+ */
283
+ minLevel?: LogLevel;
247
284
  /**
248
285
  * When pretty is disabled, emit JSON strings (default) or raw objects.
249
286
  * Set to false for environments like Cloudflare Workers that expect objects.
@@ -258,6 +295,38 @@ interface LoggerConfig {
258
295
  * @default false
259
296
  */
260
297
  silent?: boolean;
298
+ /**
299
+ * Auto-redaction configuration for PII protection.
300
+ * Scrubs sensitive data from wide events before console output and before any drain.
301
+ *
302
+ * - `true` → enable with all built-in patterns (email, credit card, IPv4, phone, JWT, Bearer, IBAN)
303
+ * - `{ paths, patterns, builtins }` → fine-grained control
304
+ * - `false` → explicitly disable redaction
305
+ *
306
+ * @default true in production, false in development
307
+ *
308
+ * @example
309
+ * ```ts
310
+ * // Disable in production
311
+ * initLogger({ redact: false })
312
+ *
313
+ * // With custom paths on top of built-ins
314
+ * initLogger({
315
+ * redact: {
316
+ * paths: ['user.password', 'headers.authorization'],
317
+ * },
318
+ * })
319
+ *
320
+ * // Only specific built-ins + custom patterns
321
+ * initLogger({
322
+ * redact: {
323
+ * builtins: ['email', 'creditCard'],
324
+ * patterns: [/SECRET_\w+/g],
325
+ * },
326
+ * })
327
+ * ```
328
+ */
329
+ redact?: boolean | RedactConfig;
261
330
  /**
262
331
  * Drain callback called with every emitted event (fire-and-forget).
263
332
  * Use this to send logs to external services outside of Nitro.
@@ -322,6 +391,10 @@ interface InternalFields {
322
391
  status?: number;
323
392
  service?: string;
324
393
  requestLogs?: RequestLogEntry[];
394
+ /** Label for a forked background wide event (child operation name). */
395
+ operation?: string;
396
+ /** Parent request's `requestId` when this event was produced by `log.fork()`. */
397
+ _parentRequestId?: string;
325
398
  }
326
399
  /**
327
400
  * Request-scoped log entry captured during a request lifecycle.
@@ -341,6 +414,15 @@ type FieldContext<T extends object = Record<string, unknown>> = DeepPartial<Omit
341
414
  /**
342
415
  * Request-scoped logger for building wide events
343
416
  *
417
+ * After {@link RequestLogger.emit} runs (including when head sampling drops the event),
418
+ * the logger is **sealed**: further `set`, `error`, `info`, and `warn` calls log a
419
+ * console warning and do not mutate the wide event. A second `emit` is ignored with
420
+ * a warning. Use {@link RequestLogger.fork} on supported integrations for intentional
421
+ * background work that needs its own wide event.
422
+ *
423
+ * `fork` is only present on request loggers from integrations that attach it (not on
424
+ * standalone `createLogger()` instances).
425
+ *
344
426
  * @example
345
427
  * ```ts
346
428
  * const logger = useLogger(event)
@@ -366,24 +448,38 @@ type FieldContext<T extends object = Record<string, unknown>> = DeepPartial<Omit
366
448
  */
367
449
  interface RequestLogger<T extends object = Record<string, unknown>> {
368
450
  /**
369
- * Add context to the wide event (deep merge via defu)
451
+ * Add context to the wide event. Plain objects are merged recursively.
452
+ * When both the existing and incoming values for a key are arrays, elements are
453
+ * concatenated (existing order preserved, new elements appended). Otherwise the
454
+ * new value replaces the old one (including when only one side is an array).
455
+ *
456
+ * No-ops with a console warning after the wide event has been emitted.
370
457
  */
371
458
  set: (context: FieldContext<T>) => void;
372
459
  /**
373
- * Log an error and capture its details
460
+ * Log an error and capture its details.
461
+ *
462
+ * No-ops with a console warning after the wide event has been emitted.
374
463
  */
375
464
  error: (error: Error | string, context?: FieldContext<T>) => void;
376
465
  /**
377
466
  * Capture an informational message inside the request wide event.
467
+ *
468
+ * No-ops with a console warning after the wide event has been emitted.
378
469
  */
379
470
  info: (message: string, context?: FieldContext<T>) => void;
380
471
  /**
381
472
  * Capture a warning message inside the request wide event.
473
+ *
474
+ * No-ops with a console warning after the wide event has been emitted.
382
475
  */
383
476
  warn: (message: string, context?: FieldContext<T>) => void;
384
477
  /**
385
478
  * Emit the final wide event with all accumulated context.
386
479
  * Returns the emitted WideEvent, or null if the log was sampled out.
480
+ *
481
+ * Seals the logger: after this returns (including when the return value is `null`
482
+ * due to sampling), further mutations are ignored with warnings.
387
483
  */
388
484
  emit: (overrides?: FieldContext<T> & {
389
485
  _forceKeep?: boolean;
@@ -392,6 +488,26 @@ interface RequestLogger<T extends object = Record<string, unknown>> {
392
488
  * Get the current accumulated context
393
489
  */
394
490
  getContext: () => FieldContext<T> & Record<string, unknown>;
491
+ /**
492
+ * Run async (or sync) work in a **child** request logger scope so `useLogger()`
493
+ * resolves to the child logger while `fn` runs. The child emits its own wide event
494
+ * when `fn` settles, with `operation` and `_parentRequestId` set for correlation.
495
+ * Only available on integrations that attach this method (Express, Fastify, NestJS,
496
+ * SvelteKit, React Router, Next.js `withEvlog`, Elysia — see docs).
497
+ *
498
+ * @param label - Value stored as `operation` on the child wide event.
499
+ * @param fn - Function to run; may return a Promise. Errors are captured on the
500
+ * child logger and emitted.
501
+ *
502
+ * @example
503
+ * ```ts
504
+ * log.fork('process_order', async () => {
505
+ * const log = useLogger()
506
+ * log.set({ step: 'charged' })
507
+ * })
508
+ * ```
509
+ */
510
+ fork?: (label: string, fn: () => void | Promise<void>) => void;
395
511
  }
396
512
  /**
397
513
  * Log level type
@@ -514,5 +630,5 @@ interface ParsedError {
514
630
  raw: unknown;
515
631
  }
516
632
  //#endregion
517
- export { TailSamplingContext as C, TailSamplingCondition as S, WideEvent as T, RequestLoggerOptions as _, EnvironmentContext as a, SamplingRates as b, H3EventContext as c, Log as d, LogLevel as f, RequestLogger as g, RequestLogEntry as h, EnrichContext as i, IngestPayload as l, ParsedError as m, DeepPartial as n, ErrorOptions as o, LoggerConfig as p, DrainContext as r, FieldContext as s, BaseWideEvent as t, InternalFields as u, RouteConfig as v, TransportConfig as w, ServerEvent as x, SamplingConfig as y };
518
- //# sourceMappingURL=types-v_JkG_D7.d.mts.map
633
+ export { TailSamplingCondition as C, WideEvent as E, ServerEvent as S, TransportConfig as T, RequestLogger as _, EnvironmentContext as a, SamplingConfig as b, H3EventContext as c, Log as d, LogLevel as f, RequestLogEntry as g, RedactConfig as h, EnrichContext as i, IngestPayload as l, ParsedError as m, DeepPartial as n, ErrorOptions as o, LoggerConfig as p, DrainContext as r, FieldContext as s, BaseWideEvent as t, InternalFields as u, RequestLoggerOptions as v, TailSamplingContext as w, SamplingRates as x, RouteConfig as y };
634
+ //# sourceMappingURL=types-DbzDln7O.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types-DbzDln7O.d.mts","names":[],"sources":["../src/types.ts"],"mappings":"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"}
package/dist/types.d.mts CHANGED
@@ -1,2 +1,2 @@
1
- import { C as TailSamplingContext, S as TailSamplingCondition, T as WideEvent, _ as RequestLoggerOptions, a as EnvironmentContext, b as SamplingRates, c as H3EventContext, d as Log, f as LogLevel, g as RequestLogger, h as RequestLogEntry, i as EnrichContext, l as IngestPayload, m as ParsedError, n as DeepPartial, o as ErrorOptions, p as LoggerConfig, r as DrainContext, s as FieldContext, t as BaseWideEvent, u as InternalFields, v as RouteConfig, w as TransportConfig, x as ServerEvent, y as SamplingConfig } from "./types-v_JkG_D7.mjs";
2
- export { BaseWideEvent, DeepPartial, DrainContext, EnrichContext, EnvironmentContext, ErrorOptions, FieldContext, H3EventContext, IngestPayload, InternalFields, Log, LogLevel, LoggerConfig, ParsedError, RequestLogEntry, RequestLogger, RequestLoggerOptions, RouteConfig, SamplingConfig, SamplingRates, ServerEvent, TailSamplingCondition, TailSamplingContext, TransportConfig, WideEvent };
1
+ import { C as TailSamplingCondition, E as WideEvent, S as ServerEvent, T as TransportConfig, _ as RequestLogger, a as EnvironmentContext, b as SamplingConfig, c as H3EventContext, d as Log, f as LogLevel, g as RequestLogEntry, h as RedactConfig, i as EnrichContext, l as IngestPayload, m as ParsedError, n as DeepPartial, o as ErrorOptions, p as LoggerConfig, r as DrainContext, s as FieldContext, t as BaseWideEvent, u as InternalFields, v as RequestLoggerOptions, w as TailSamplingContext, x as SamplingRates, y as RouteConfig } from "./types-DbzDln7O.mjs";
2
+ export { BaseWideEvent, DeepPartial, DrainContext, EnrichContext, EnvironmentContext, ErrorOptions, FieldContext, H3EventContext, IngestPayload, InternalFields, Log, LogLevel, LoggerConfig, ParsedError, RedactConfig, RequestLogEntry, RequestLogger, RequestLoggerOptions, RouteConfig, SamplingConfig, SamplingRates, ServerEvent, TailSamplingCondition, TailSamplingContext, TransportConfig, WideEvent };
@@ -1,4 +1,4 @@
1
- import { g as RequestLogger, x as ServerEvent } from "./types-v_JkG_D7.mjs";
1
+ import { S as ServerEvent, _ as RequestLogger } from "./types-DbzDln7O.mjs";
2
2
 
3
3
  //#region src/runtime/server/useLogger.d.ts
4
4
  /**
@@ -36,4 +36,4 @@ import { g as RequestLogger, x as ServerEvent } from "./types-v_JkG_D7.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-TjKH37BO.d.mts.map
39
+ //# sourceMappingURL=useLogger-N5A-d5l9.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useLogger-TjKH37BO.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-N5A-d5l9.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"}
@@ -0,0 +1,54 @@
1
+ import { a as EnvironmentContext, f as LogLevel } from "./types-DbzDln7O.mjs";
2
+
3
+ //#region src/utils.d.ts
4
+ declare function formatDuration(ms: number): string;
5
+ declare function isServer(): boolean;
6
+ declare function isClient(): boolean;
7
+ declare function isDev(): boolean;
8
+ declare function detectEnvironment(): Partial<EnvironmentContext>;
9
+ /**
10
+ * True if `level` is at least as severe as `minLevel` (debug < info < warn < error).
11
+ */
12
+ declare function isLevelEnabled(level: LogLevel, minLevel: LogLevel): boolean;
13
+ declare function getConsoleMethod(level: LogLevel): LogLevel;
14
+ declare const colors: {
15
+ readonly reset: "\u001B[0m";
16
+ readonly bold: "\u001B[1m";
17
+ readonly dim: "\u001B[2m";
18
+ readonly red: "\u001B[31m";
19
+ readonly green: "\u001B[32m";
20
+ readonly yellow: "\u001B[33m";
21
+ readonly blue: "\u001B[34m";
22
+ readonly magenta: "\u001B[35m";
23
+ readonly cyan: "\u001B[36m";
24
+ readonly white: "\u001B[37m";
25
+ readonly gray: "\u001B[90m";
26
+ };
27
+ declare function getLevelColor(level: string): string;
28
+ declare const cssColors: {
29
+ readonly dim: "color: #6b7280";
30
+ readonly red: "color: #ef4444; font-weight: bold";
31
+ readonly green: "color: #22c55e";
32
+ readonly yellow: "color: #f59e0b; font-weight: bold";
33
+ readonly cyan: "color: #06b6d4; font-weight: bold";
34
+ readonly gray: "color: #6b7280; font-weight: bold";
35
+ readonly reset: "color: inherit; font-weight: normal";
36
+ };
37
+ declare function getCssLevelColor(level: string): string;
38
+ /**
39
+ * Escape `%` in strings interpolated into `console.log` format strings
40
+ * to prevent `%c`, `%s`, `%d` etc. in user data from being interpreted
41
+ * as formatting directives.
42
+ */
43
+ declare function escapeFormatString(str: string): string;
44
+ /** Headers that should never be passed to hooks for security */
45
+ declare const SENSITIVE_HEADERS: string[];
46
+ declare function filterSafeHeaders(headers: Record<string, string>): Record<string, string>;
47
+ /**
48
+ * Match a path against a glob pattern.
49
+ * Supports * (any chars except /) and ** (any chars including /).
50
+ */
51
+ declare function matchesPattern(path: string, pattern: string): boolean;
52
+ //#endregion
53
+ export { escapeFormatString as a, getConsoleMethod as c, isClient as d, isDev as f, matchesPattern as h, detectEnvironment as i, getCssLevelColor as l, isServer as m, colors as n, filterSafeHeaders as o, isLevelEnabled as p, cssColors as r, formatDuration as s, SENSITIVE_HEADERS as t, getLevelColor as u };
54
+ //# sourceMappingURL=utils-DnX6VMNi.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils-DnX6VMNi.d.mts","names":[],"sources":["../src/utils.ts"],"mappings":";;;iBAEgB,cAAA,CAAe,EAAA;AAAA,iBAOf,QAAA,CAAA;AAAA,iBAIA,QAAA,CAAA;AAAA,iBAIA,KAAA,CAAA;AAAA,iBAUA,iBAAA,CAAA,GAAqB,OAAA,CAAQ,kBAAA;;;AAlB7C;iBA+CgB,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;;;;AApCjC;;iBA6CgB,kBAAA,CAAmB,GAAA;;cAKtB,iBAAA;AAAA,iBASG,iBAAA,CAAkB,OAAA,EAAS,MAAA,mBAAyB,MAAA;;;;AAvDpE;iBAyEgB,cAAA,CAAe,IAAA,UAAc,OAAA"}
package/dist/utils.d.mts CHANGED
@@ -1,50 +1,2 @@
1
- import { a as EnvironmentContext, f as LogLevel } from "./types-v_JkG_D7.mjs";
2
-
3
- //#region src/utils.d.ts
4
- declare function formatDuration(ms: number): string;
5
- declare function isServer(): boolean;
6
- declare function isClient(): boolean;
7
- declare function isDev(): boolean;
8
- declare function detectEnvironment(): Partial<EnvironmentContext>;
9
- declare function getConsoleMethod(level: LogLevel): LogLevel;
10
- declare const colors: {
11
- readonly reset: "\u001B[0m";
12
- readonly bold: "\u001B[1m";
13
- readonly dim: "\u001B[2m";
14
- readonly red: "\u001B[31m";
15
- readonly green: "\u001B[32m";
16
- readonly yellow: "\u001B[33m";
17
- readonly blue: "\u001B[34m";
18
- readonly magenta: "\u001B[35m";
19
- readonly cyan: "\u001B[36m";
20
- readonly white: "\u001B[37m";
21
- readonly gray: "\u001B[90m";
22
- };
23
- declare function getLevelColor(level: string): string;
24
- declare const cssColors: {
25
- readonly dim: "color: #6b7280";
26
- readonly red: "color: #ef4444; font-weight: bold";
27
- readonly green: "color: #22c55e";
28
- readonly yellow: "color: #f59e0b; font-weight: bold";
29
- readonly cyan: "color: #06b6d4; font-weight: bold";
30
- readonly gray: "color: #6b7280; font-weight: bold";
31
- readonly reset: "color: inherit; font-weight: normal";
32
- };
33
- declare function getCssLevelColor(level: string): string;
34
- /**
35
- * Escape `%` in strings interpolated into `console.log` format strings
36
- * to prevent `%c`, `%s`, `%d` etc. in user data from being interpreted
37
- * as formatting directives.
38
- */
39
- declare function escapeFormatString(str: string): string;
40
- /** Headers that should never be passed to hooks for security */
41
- declare const SENSITIVE_HEADERS: string[];
42
- declare function filterSafeHeaders(headers: Record<string, string>): Record<string, string>;
43
- /**
44
- * Match a path against a glob pattern.
45
- * Supports * (any chars except /) and ** (any chars including /).
46
- */
47
- declare function matchesPattern(path: string, pattern: string): boolean;
48
- //#endregion
49
- export { SENSITIVE_HEADERS, colors, cssColors, detectEnvironment, escapeFormatString, filterSafeHeaders, formatDuration, getConsoleMethod, getCssLevelColor, getLevelColor, isClient, isDev, isServer, matchesPattern };
50
- //# sourceMappingURL=utils.d.mts.map
1
+ import { a as escapeFormatString, c as getConsoleMethod, d as isClient, f as isDev, h as matchesPattern, i as detectEnvironment, l as getCssLevelColor, m as isServer, n as colors, o as filterSafeHeaders, p as isLevelEnabled, r as cssColors, s as formatDuration, t as SENSITIVE_HEADERS, u as getLevelColor } from "./utils-DnX6VMNi.mjs";
2
+ export { SENSITIVE_HEADERS, colors, cssColors, detectEnvironment, escapeFormatString, filterSafeHeaders, formatDuration, getConsoleMethod, getCssLevelColor, getLevelColor, isClient, isDev, isLevelEnabled, isServer, matchesPattern };
package/dist/utils.mjs CHANGED
@@ -25,6 +25,18 @@ function detectEnvironment() {
25
25
  region: env.VERCEL_REGION || env.AWS_REGION || env.FLY_REGION || env.CF_REGION
26
26
  };
27
27
  }
28
+ const LEVEL_ORDER = {
29
+ debug: 0,
30
+ info: 1,
31
+ warn: 2,
32
+ error: 3
33
+ };
34
+ /**
35
+ * True if `level` is at least as severe as `minLevel` (debug < info < warn < error).
36
+ */
37
+ function isLevelEnabled(level, minLevel) {
38
+ return LEVEL_ORDER[level] >= LEVEL_ORDER[minLevel];
39
+ }
28
40
  function getConsoleMethod(level) {
29
41
  return level;
30
42
  }
@@ -105,6 +117,6 @@ function matchesPattern(path, pattern) {
105
117
  return regex.test(path);
106
118
  }
107
119
  //#endregion
108
- export { SENSITIVE_HEADERS, colors, cssColors, detectEnvironment, escapeFormatString, filterSafeHeaders, formatDuration, getConsoleMethod, getCssLevelColor, getLevelColor, isClient, isDev, isServer, matchesPattern };
120
+ export { SENSITIVE_HEADERS, colors, cssColors, detectEnvironment, escapeFormatString, filterSafeHeaders, formatDuration, getConsoleMethod, getCssLevelColor, getLevelColor, isClient, isDev, isLevelEnabled, isServer, matchesPattern };
109
121
 
110
122
  //# 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 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\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,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,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 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,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,4 +1,4 @@
1
- import { f as LogLevel, w as TransportConfig, y as SamplingConfig } from "../types-v_JkG_D7.mjs";
1
+ import { T as TransportConfig, b as SamplingConfig, f as LogLevel } from "../types-DbzDln7O.mjs";
2
2
  import { Plugin } from "vite";
3
3
 
4
4
  //#region src/vite/types.d.ts
@@ -15,6 +15,8 @@ interface ClientOptions {
15
15
  pretty?: boolean;
16
16
  /** Enable console output on client @default true */
17
17
  console?: boolean;
18
+ /** Minimum severity for client `log` calls (debug < info < warn < error) @default 'debug' */
19
+ minLevel?: LogLevel;
18
20
  /** Transport configuration for sending client logs to the server */
19
21
  transport?: TransportConfig;
20
22
  }
@@ -31,6 +33,8 @@ interface EvlogViteOptions {
31
33
  silent?: boolean;
32
34
  /** Sampling configuration */
33
35
  sampling?: SamplingConfig;
36
+ /** Minimum severity for the global `log` API (not request wide events) @default 'debug' */
37
+ minLevel?: LogLevel;
34
38
  /** Emit JSON strings or raw objects @default true */
35
39
  stringify?: boolean;
36
40
  /** Opt-in auto-imports for log, createEvlogError, parseError */
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/vite/types.ts","../../src/vite/auto-init.ts","../../src/vite/auto-imports.ts","../../src/vite/client-inject.ts","../../src/vite/strip.ts","../../src/vite/source-location.ts","../../src/vite/index.ts"],"mappings":";;;;UAEiB,kBAAA;;EAEf,OAAA;EAFe;EAIf,GAAA;AAAA;AAAA,UAGe,aAAA;EAHZ;EAKH,OAAA;EAF4B;EAI5B,MAAA;EAI2B;EAF3B,OAAA;EAFA;EAIA,SAAA,GAAY,eAAA;AAAA;AAAA,UAGG,gBAAA;EAHY;EAK3B,OAAA;EAFe;EAIf,WAAA;;EAEA,OAAA;EAUwB;EARxB,MAAA;EAcS;EAZT,MAAA;EAYsB;EAVtB,QAAA,GAAW,cAAA;EARX;EAUA,SAAA;EANA;EAQA,WAAA,aAAwB,kBAAA;EAJxB;EAMA,KAAA,GAAQ,QAAA;EAJR;EAMA,cAAA;EAJwB;EAMxB,MAAA,GAAS,aAAA;AAAA;;;iBCvCK,oBAAA,CAAqB,OAAA,EAAS,gBAAA,GAAmB,MAAA;;;iBCejD,uBAAA,CAAwB,OAAA,GAAS,kBAAA,GAA0B,MAAA;;;iBCf3D,wBAAA,CAAyB,aAAA,EAAe,aAAA,GAAgB,MAAA;;;iBCExD,iBAAA,CAAkB,MAAA,EAAQ,QAAA,KAAa,MAAA;;;iBCAvC,0BAAA,CAA2B,OAAA,aAAoB,MAAA;;;;;ALH/D;;;;;AAOA;;;;;;;;iBMcwB,KAAA,CAAM,OAAA,GAAS,gBAAA,GAAwB,MAAA"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/vite/types.ts","../../src/vite/auto-init.ts","../../src/vite/auto-imports.ts","../../src/vite/client-inject.ts","../../src/vite/strip.ts","../../src/vite/source-location.ts","../../src/vite/index.ts"],"mappings":";;;;UAEiB,kBAAA;;EAEf,OAAA;EAFe;EAIf,GAAA;AAAA;AAAA,UAGe,aAAA;EAHZ;EAKH,OAAA;EAF4B;EAI5B,MAAA;EAM2B;EAJ3B,OAAA;EAFA;EAIA,QAAA,GAAW,QAAA;EAAX;EAEA,SAAA,GAAY,eAAA;AAAA;AAAA,UAGG,gBAAA;EAHY;EAK3B,OAAA;EAFe;EAIf,WAAA;;EAEA,OAAA;EAQW;EANX,MAAA;EAYQ;EAVR,MAAA;EAcsB;EAZtB,QAAA,GAAW,cAAA;EAVX;EAYA,QAAA,GAAW,QAAA;EARX;EAUA,SAAA;EANA;EAQA,WAAA,aAAwB,kBAAA;EANb;EAQX,KAAA,GAAQ,QAAA;EANG;EAQX,cAAA;EAJA;EAMA,MAAA,GAAS,aAAA;AAAA;;;iBC3CK,oBAAA,CAAqB,OAAA,EAAS,gBAAA,GAAmB,MAAA;;;iBCejD,uBAAA,CAAwB,OAAA,GAAS,kBAAA,GAA0B,MAAA;;;iBCf3D,wBAAA,CAAyB,aAAA,EAAe,aAAA,GAAgB,MAAA;;;iBCExD,iBAAA,CAAkB,MAAA,EAAQ,QAAA,KAAa,MAAA;;;iBCAvC,0BAAA,CAA2B,OAAA,aAAoB,MAAA;;;;;ALH/D;;;;;AAOA;;;;;;;;iBMcwB,KAAA,CAAM,OAAA,GAAS,gBAAA,GAAwB,MAAA"}
@@ -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-B1VVgXkh.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-DRvDDqfq.mjs";
2
2
  import { resolve } from "node:path";
3
3
  import { existsSync, writeFileSync } from "node:fs";
4
4
  //#region src/vite/auto-init.ts
@@ -21,6 +21,7 @@ function buildConfig(options) {
21
21
  if (options.pretty !== void 0) config.pretty = options.pretty;
22
22
  if (options.silent !== void 0) config.silent = options.silent;
23
23
  if (options.sampling) config.sampling = options.sampling;
24
+ if (options.minLevel !== void 0) config.minLevel = options.minLevel;
24
25
  if (options.stringify !== void 0) config.stringify = options.stringify;
25
26
  return config;
26
27
  }
@@ -164,6 +165,7 @@ function createClientInjectPlugin(clientOptions) {
164
165
  config.service = clientOptions.service ?? "client";
165
166
  if (clientOptions.console !== void 0) config.console = clientOptions.console;
166
167
  config.pretty = clientOptions.pretty ?? isDev;
168
+ if (clientOptions.minLevel !== void 0) config.minLevel = clientOptions.minLevel;
167
169
  if (clientOptions.transport) config.transport = clientOptions.transport;
168
170
  return [{
169
171
  tag: "script",
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../src/vite/auto-init.ts","../../src/vite/auto-imports.ts","../../src/vite/client-inject.ts","../../src/vite/index.ts"],"sourcesContent":["import type { Plugin } from 'vite'\nimport type { EvlogViteOptions } from './types'\n\nexport function createAutoInitPlugin(options: EvlogViteOptions): Plugin {\n const config = buildConfig(options)\n\n return {\n name: 'evlog:auto-init',\n config() {\n return {\n define: {\n __EVLOG_CONFIG__: JSON.stringify(config),\n },\n }\n },\n }\n}\n\nfunction buildConfig(options: EvlogViteOptions): Record<string, unknown> {\n const env: Record<string, unknown> = {}\n if (options.service) env.service = options.service\n if (options.environment) env.environment = options.environment\n\n const config: Record<string, unknown> = {}\n if (Object.keys(env).length > 0) config.env = env\n if (options.enabled !== undefined) config.enabled = options.enabled\n if (options.pretty !== undefined) config.pretty = options.pretty\n if (options.silent !== undefined) config.silent = options.silent\n if (options.sampling) config.sampling = options.sampling\n if (options.stringify !== undefined) config.stringify = options.stringify\n\n return config\n}\n","import { existsSync, writeFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport type { Plugin } from 'vite'\nimport MagicString from 'magic-string'\nimport type { AutoImportsOptions } from './types'\nimport { TRANSFORM_FILTER, shouldTransform, walk } from './utils'\n\nconst DEFAULT_IMPORTS = ['log', 'createEvlogError', 'parseError']\nconst LOG_METHODS = ['info', 'error', 'warn', 'debug']\n\nconst IMPORT_SOURCES: Record<string, string> = {\n log: 'evlog',\n createEvlogError: 'evlog',\n parseError: 'evlog',\n setIdentity: 'evlog/client',\n clearIdentity: 'evlog/client',\n}\n\nexport function createAutoImportsPlugin(options: AutoImportsOptions = {}): Plugin {\n const symbols = options.imports ?? DEFAULT_IMPORTS\n\n return {\n name: 'evlog:auto-imports',\n\n configResolved(config) {\n if (options.dts === false) return\n if (typeof options.dts === 'string') {\n writeFileSync(resolve(config.root, options.dts), generateDts(symbols))\n return\n }\n const srcDir = resolve(config.root, 'src')\n const dir = existsSync(srcDir) ? srcDir : config.root\n writeFileSync(resolve(dir, 'auto-imports.d.ts'), generateDts(symbols))\n },\n\n transform: {\n filter: TRANSFORM_FILTER,\n handler(code, id) {\n if (!shouldTransform(id)) return\n if (!symbols.some(s => code.includes(s))) return\n\n let ast: any\n try {\n ast = (this as any).parse(code)\n } catch {\n return\n }\n\n const declared = collectTopLevelDeclarations(ast)\n const needed = detectUsedSymbols(ast, symbols, declared)\n\n if (needed.size === 0) return\n\n const grouped = groupBySource(needed)\n const s = new MagicString(code)\n\n for (const [source, names] of grouped) {\n s.prepend(`import { ${names.join(', ')} } from '${source}'\\n`)\n }\n\n return { code: s.toString(), map: s.generateMap({ hires: true }) }\n },\n },\n }\n}\n\nfunction collectBindingNames(pattern: any, out: Set<string>): void {\n if (!pattern) return\n if (pattern.type === 'Identifier') {\n out.add(pattern.name)\n } else if (pattern.type === 'ObjectPattern') {\n for (const prop of pattern.properties) {\n collectBindingNames(prop.type === 'RestElement' ? prop.argument : prop.value, out)\n }\n } else if (pattern.type === 'ArrayPattern') {\n for (const el of pattern.elements) {\n if (el) collectBindingNames(el, out)\n }\n } else if (pattern.type === 'AssignmentPattern') {\n collectBindingNames(pattern.left, out)\n } else if (pattern.type === 'RestElement') {\n collectBindingNames(pattern.argument, out)\n }\n}\n\nfunction collectTopLevelDeclarations(ast: any): Set<string> {\n const declared = new Set<string>()\n for (const node of ast.body) {\n if (node.type === 'VariableDeclaration') {\n for (const decl of node.declarations) {\n collectBindingNames(decl.id, declared)\n }\n }\n if (node.type === 'FunctionDeclaration' && node.id?.name) {\n declared.add(node.id.name)\n }\n if (node.type === 'ImportDeclaration') {\n for (const spec of node.specifiers ?? []) {\n if (spec.local?.name) declared.add(spec.local.name)\n }\n }\n }\n return declared\n}\n\nfunction detectUsedSymbols(ast: any, symbols: string[], declared: Set<string>): Set<string> {\n const needed = new Set<string>()\n\n walk(ast, (node: any) => {\n if (\n symbols.includes('log')\n && !declared.has('log')\n && node.type === 'MemberExpression'\n && node.object?.type === 'Identifier'\n && node.object.name === 'log'\n && node.property?.type === 'Identifier'\n && LOG_METHODS.includes(node.property.name)\n ) {\n needed.add('log')\n }\n\n if (\n node.type === 'CallExpression'\n && node.callee?.type === 'Identifier'\n && symbols.includes(node.callee.name)\n && !declared.has(node.callee.name)\n ) {\n needed.add(node.callee.name)\n }\n })\n\n return needed\n}\n\nfunction groupBySource(symbols: Set<string>): Map<string, string[]> {\n const map = new Map<string, string[]>()\n for (const sym of symbols) {\n const source = IMPORT_SOURCES[sym] ?? 'evlog'\n const list = map.get(source) ?? []\n list.push(sym)\n map.set(source, list)\n }\n return map\n}\n\nfunction generateDts(symbols: string[]): string {\n const lines = [\n '/* eslint-disable */',\n '// Generated by evlog/vite — do not edit',\n 'export {}',\n 'declare global {',\n ]\n\n for (const sym of symbols) {\n switch (sym) {\n case 'log':\n lines.push(' const log: import(\\'evlog\\').Log')\n break\n case 'createEvlogError':\n lines.push(' const createEvlogError: typeof import(\\'evlog\\').createEvlogError')\n break\n case 'parseError':\n lines.push(' const parseError: typeof import(\\'evlog\\').parseError')\n break\n case 'setIdentity':\n lines.push(' const setIdentity: (identity: Record<string, unknown>) => void')\n break\n case 'clearIdentity':\n lines.push(' const clearIdentity: () => void')\n break\n default:\n lines.push(` const ${sym}: typeof import('evlog').${sym}`)\n break\n }\n }\n\n lines.push('}', '')\n return lines.join('\\n')\n}\n","import type { Plugin } from 'vite'\nimport type { ClientOptions } from './types'\n\nexport function createClientInjectPlugin(clientOptions: ClientOptions): Plugin {\n let isDev = true\n\n return {\n name: 'evlog:client-inject',\n\n configResolved(config) {\n isDev = config.command === 'serve'\n },\n\n transformIndexHtml() {\n const config: Record<string, unknown> = {}\n config.service = clientOptions.service ?? 'client'\n if (clientOptions.console !== undefined) config.console = clientOptions.console\n config.pretty = clientOptions.pretty ?? isDev\n if (clientOptions.transport) config.transport = clientOptions.transport\n\n const configJson = JSON.stringify(config)\n\n return [\n {\n tag: 'script',\n attrs: { type: 'module' },\n children: `import{initLog}from'evlog/client'\\ninitLog(${configJson})`,\n injectTo: 'head-prepend',\n },\n ]\n },\n }\n}\n","import type { Plugin } from 'vite'\nimport type { EvlogViteOptions } from './types'\nimport { createAutoInitPlugin } from './auto-init'\nimport { createAutoImportsPlugin } from './auto-imports'\nimport { createClientInjectPlugin } from './client-inject'\nimport { createStripPlugin } from './strip'\nimport { createSourceLocationPlugin } from './source-location'\n\n/**\n * evlog Vite plugin — brings Nuxt-level DX to any Vite-based framework.\n *\n * @example\n * ```ts\n * // vite.config.ts\n * import evlog from 'evlog/vite'\n *\n * export default defineConfig({\n * plugins: [\n * evlog({ service: 'my-app' }),\n * ],\n * })\n * ```\n */\nexport default function evlog(options: EvlogViteOptions = {}): Plugin[] {\n const plugins: Plugin[] = []\n\n plugins.push(createAutoInitPlugin(options))\n\n if (options.autoImports) {\n const autoImportOpts = typeof options.autoImports === 'object' ? options.autoImports : {}\n plugins.push(createAutoImportsPlugin(autoImportOpts))\n }\n\n if (options.client) {\n plugins.push(createClientInjectPlugin(options.client))\n }\n\n const stripLevels = options.strip ?? ['debug']\n if (stripLevels.length > 0) {\n plugins.push(createStripPlugin(stripLevels))\n }\n\n if (options.sourceLocation) {\n const enabled = options.sourceLocation === 'dev' ? undefined : true\n plugins.push(createSourceLocationPlugin(enabled))\n }\n\n return plugins\n}\n\nexport { createAutoInitPlugin } from './auto-init'\nexport { createAutoImportsPlugin } from './auto-imports'\nexport { createClientInjectPlugin } from './client-inject'\nexport { createStripPlugin } from './strip'\nexport { createSourceLocationPlugin } from './source-location'\nexport type { EvlogViteOptions, AutoImportsOptions, ClientOptions } from './types'\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../src/vite/auto-init.ts","../../src/vite/auto-imports.ts","../../src/vite/client-inject.ts","../../src/vite/index.ts"],"sourcesContent":["import type { Plugin } from 'vite'\nimport type { EvlogViteOptions } from './types'\n\nexport function createAutoInitPlugin(options: EvlogViteOptions): Plugin {\n const config = buildConfig(options)\n\n return {\n name: 'evlog:auto-init',\n config() {\n return {\n define: {\n __EVLOG_CONFIG__: JSON.stringify(config),\n },\n }\n },\n }\n}\n\nfunction buildConfig(options: EvlogViteOptions): Record<string, unknown> {\n const env: Record<string, unknown> = {}\n if (options.service) env.service = options.service\n if (options.environment) env.environment = options.environment\n\n const config: Record<string, unknown> = {}\n if (Object.keys(env).length > 0) config.env = env\n if (options.enabled !== undefined) config.enabled = options.enabled\n if (options.pretty !== undefined) config.pretty = options.pretty\n if (options.silent !== undefined) config.silent = options.silent\n if (options.sampling) config.sampling = options.sampling\n if (options.minLevel !== undefined) config.minLevel = options.minLevel\n if (options.stringify !== undefined) config.stringify = options.stringify\n\n return config\n}\n","import { existsSync, writeFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport type { Plugin } from 'vite'\nimport MagicString from 'magic-string'\nimport type { AutoImportsOptions } from './types'\nimport { TRANSFORM_FILTER, shouldTransform, walk } from './utils'\n\nconst DEFAULT_IMPORTS = ['log', 'createEvlogError', 'parseError']\nconst LOG_METHODS = ['info', 'error', 'warn', 'debug']\n\nconst IMPORT_SOURCES: Record<string, string> = {\n log: 'evlog',\n createEvlogError: 'evlog',\n parseError: 'evlog',\n setIdentity: 'evlog/client',\n clearIdentity: 'evlog/client',\n}\n\nexport function createAutoImportsPlugin(options: AutoImportsOptions = {}): Plugin {\n const symbols = options.imports ?? DEFAULT_IMPORTS\n\n return {\n name: 'evlog:auto-imports',\n\n configResolved(config) {\n if (options.dts === false) return\n if (typeof options.dts === 'string') {\n writeFileSync(resolve(config.root, options.dts), generateDts(symbols))\n return\n }\n const srcDir = resolve(config.root, 'src')\n const dir = existsSync(srcDir) ? srcDir : config.root\n writeFileSync(resolve(dir, 'auto-imports.d.ts'), generateDts(symbols))\n },\n\n transform: {\n filter: TRANSFORM_FILTER,\n handler(code, id) {\n if (!shouldTransform(id)) return\n if (!symbols.some(s => code.includes(s))) return\n\n let ast: any\n try {\n ast = (this as any).parse(code)\n } catch {\n return\n }\n\n const declared = collectTopLevelDeclarations(ast)\n const needed = detectUsedSymbols(ast, symbols, declared)\n\n if (needed.size === 0) return\n\n const grouped = groupBySource(needed)\n const s = new MagicString(code)\n\n for (const [source, names] of grouped) {\n s.prepend(`import { ${names.join(', ')} } from '${source}'\\n`)\n }\n\n return { code: s.toString(), map: s.generateMap({ hires: true }) }\n },\n },\n }\n}\n\nfunction collectBindingNames(pattern: any, out: Set<string>): void {\n if (!pattern) return\n if (pattern.type === 'Identifier') {\n out.add(pattern.name)\n } else if (pattern.type === 'ObjectPattern') {\n for (const prop of pattern.properties) {\n collectBindingNames(prop.type === 'RestElement' ? prop.argument : prop.value, out)\n }\n } else if (pattern.type === 'ArrayPattern') {\n for (const el of pattern.elements) {\n if (el) collectBindingNames(el, out)\n }\n } else if (pattern.type === 'AssignmentPattern') {\n collectBindingNames(pattern.left, out)\n } else if (pattern.type === 'RestElement') {\n collectBindingNames(pattern.argument, out)\n }\n}\n\nfunction collectTopLevelDeclarations(ast: any): Set<string> {\n const declared = new Set<string>()\n for (const node of ast.body) {\n if (node.type === 'VariableDeclaration') {\n for (const decl of node.declarations) {\n collectBindingNames(decl.id, declared)\n }\n }\n if (node.type === 'FunctionDeclaration' && node.id?.name) {\n declared.add(node.id.name)\n }\n if (node.type === 'ImportDeclaration') {\n for (const spec of node.specifiers ?? []) {\n if (spec.local?.name) declared.add(spec.local.name)\n }\n }\n }\n return declared\n}\n\nfunction detectUsedSymbols(ast: any, symbols: string[], declared: Set<string>): Set<string> {\n const needed = new Set<string>()\n\n walk(ast, (node: any) => {\n if (\n symbols.includes('log')\n && !declared.has('log')\n && node.type === 'MemberExpression'\n && node.object?.type === 'Identifier'\n && node.object.name === 'log'\n && node.property?.type === 'Identifier'\n && LOG_METHODS.includes(node.property.name)\n ) {\n needed.add('log')\n }\n\n if (\n node.type === 'CallExpression'\n && node.callee?.type === 'Identifier'\n && symbols.includes(node.callee.name)\n && !declared.has(node.callee.name)\n ) {\n needed.add(node.callee.name)\n }\n })\n\n return needed\n}\n\nfunction groupBySource(symbols: Set<string>): Map<string, string[]> {\n const map = new Map<string, string[]>()\n for (const sym of symbols) {\n const source = IMPORT_SOURCES[sym] ?? 'evlog'\n const list = map.get(source) ?? []\n list.push(sym)\n map.set(source, list)\n }\n return map\n}\n\nfunction generateDts(symbols: string[]): string {\n const lines = [\n '/* eslint-disable */',\n '// Generated by evlog/vite — do not edit',\n 'export {}',\n 'declare global {',\n ]\n\n for (const sym of symbols) {\n switch (sym) {\n case 'log':\n lines.push(' const log: import(\\'evlog\\').Log')\n break\n case 'createEvlogError':\n lines.push(' const createEvlogError: typeof import(\\'evlog\\').createEvlogError')\n break\n case 'parseError':\n lines.push(' const parseError: typeof import(\\'evlog\\').parseError')\n break\n case 'setIdentity':\n lines.push(' const setIdentity: (identity: Record<string, unknown>) => void')\n break\n case 'clearIdentity':\n lines.push(' const clearIdentity: () => void')\n break\n default:\n lines.push(` const ${sym}: typeof import('evlog').${sym}`)\n break\n }\n }\n\n lines.push('}', '')\n return lines.join('\\n')\n}\n","import type { Plugin } from 'vite'\nimport type { ClientOptions } from './types'\n\nexport function createClientInjectPlugin(clientOptions: ClientOptions): Plugin {\n let isDev = true\n\n return {\n name: 'evlog:client-inject',\n\n configResolved(config) {\n isDev = config.command === 'serve'\n },\n\n transformIndexHtml() {\n const config: Record<string, unknown> = {}\n config.service = clientOptions.service ?? 'client'\n if (clientOptions.console !== undefined) config.console = clientOptions.console\n config.pretty = clientOptions.pretty ?? isDev\n if (clientOptions.minLevel !== undefined) config.minLevel = clientOptions.minLevel\n if (clientOptions.transport) config.transport = clientOptions.transport\n\n const configJson = JSON.stringify(config)\n\n return [\n {\n tag: 'script',\n attrs: { type: 'module' },\n children: `import{initLog}from'evlog/client'\\ninitLog(${configJson})`,\n injectTo: 'head-prepend',\n },\n ]\n },\n }\n}\n","import type { Plugin } from 'vite'\nimport type { EvlogViteOptions } from './types'\nimport { createAutoInitPlugin } from './auto-init'\nimport { createAutoImportsPlugin } from './auto-imports'\nimport { createClientInjectPlugin } from './client-inject'\nimport { createStripPlugin } from './strip'\nimport { createSourceLocationPlugin } from './source-location'\n\n/**\n * evlog Vite plugin — brings Nuxt-level DX to any Vite-based framework.\n *\n * @example\n * ```ts\n * // vite.config.ts\n * import evlog from 'evlog/vite'\n *\n * export default defineConfig({\n * plugins: [\n * evlog({ service: 'my-app' }),\n * ],\n * })\n * ```\n */\nexport default function evlog(options: EvlogViteOptions = {}): Plugin[] {\n const plugins: Plugin[] = []\n\n plugins.push(createAutoInitPlugin(options))\n\n if (options.autoImports) {\n const autoImportOpts = typeof options.autoImports === 'object' ? options.autoImports : {}\n plugins.push(createAutoImportsPlugin(autoImportOpts))\n }\n\n if (options.client) {\n plugins.push(createClientInjectPlugin(options.client))\n }\n\n const stripLevels = options.strip ?? ['debug']\n if (stripLevels.length > 0) {\n plugins.push(createStripPlugin(stripLevels))\n }\n\n if (options.sourceLocation) {\n const enabled = options.sourceLocation === 'dev' ? undefined : true\n plugins.push(createSourceLocationPlugin(enabled))\n }\n\n return plugins\n}\n\nexport { createAutoInitPlugin } from './auto-init'\nexport { createAutoImportsPlugin } from './auto-imports'\nexport { createClientInjectPlugin } from './client-inject'\nexport { createStripPlugin } from './strip'\nexport { createSourceLocationPlugin } from './source-location'\nexport type { EvlogViteOptions, AutoImportsOptions, ClientOptions } from './types'\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { g as RequestLogger, p as LoggerConfig } from "./types-v_JkG_D7.mjs";
1
+ import { _ as RequestLogger, p as LoggerConfig } from "./types-DbzDln7O.mjs";
2
2
 
3
3
  //#region src/workers/index.d.ts
4
4
  /**
package/dist/workers.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { createRequestLogger, initLogger } from "./logger.mjs";
1
+ import { o as initLogger, r as createRequestLogger } from "./logger-DnobymUQ.mjs";
2
2
  //#region src/workers/index.ts
3
3
  function isRecord(value) {
4
4
  return typeof value === "object" && value !== null && !Array.isArray(value);