evlog 2.14.0 → 2.14.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 (129) hide show
  1. package/README.md +45 -15
  2. package/dist/{_http-CHSsrWDJ.mjs → _http-BY1e9pwC.mjs} +9 -2
  3. package/dist/_http-BY1e9pwC.mjs.map +1 -0
  4. package/dist/adapters/axiom.d.mts +1 -1
  5. package/dist/adapters/axiom.mjs +1 -1
  6. package/dist/adapters/axiom.mjs.map +1 -1
  7. package/dist/adapters/better-stack.d.mts +1 -1
  8. package/dist/adapters/better-stack.mjs +1 -1
  9. package/dist/adapters/better-stack.mjs.map +1 -1
  10. package/dist/adapters/datadog.d.mts +1 -1
  11. package/dist/adapters/datadog.mjs +1 -1
  12. package/dist/adapters/datadog.mjs.map +1 -1
  13. package/dist/adapters/fs.d.mts +1 -1
  14. package/dist/adapters/fs.mjs.map +1 -1
  15. package/dist/adapters/hyperdx.d.mts +1 -1
  16. package/dist/adapters/hyperdx.mjs +1 -1
  17. package/dist/adapters/otlp.d.mts +1 -1
  18. package/dist/adapters/otlp.mjs +1 -1
  19. package/dist/adapters/otlp.mjs.map +1 -1
  20. package/dist/adapters/posthog.d.mts +1 -1
  21. package/dist/adapters/posthog.mjs +1 -1
  22. package/dist/adapters/posthog.mjs.map +1 -1
  23. package/dist/adapters/sentry.d.mts +1 -1
  24. package/dist/adapters/sentry.mjs +1 -1
  25. package/dist/adapters/sentry.mjs.map +1 -1
  26. package/dist/ai/index.d.mts +1 -1
  27. package/dist/{audit-mUutdf6A.d.mts → audit-CTIviX3P.d.mts} +11 -1
  28. package/dist/audit-CTIviX3P.d.mts.map +1 -0
  29. package/dist/{audit-d9esRZOK.mjs → audit-DQoBo7Dl.mjs} +56 -13
  30. package/dist/audit-DQoBo7Dl.mjs.map +1 -0
  31. package/dist/better-auth/index.d.mts +1 -1
  32. package/dist/better-auth/index.mjs.map +1 -1
  33. package/dist/browser.d.mts +1 -1
  34. package/dist/elysia/index.d.mts +2 -2
  35. package/dist/elysia/index.mjs +2 -2
  36. package/dist/enrichers.d.mts +1 -1
  37. package/dist/enrichers.mjs.map +1 -1
  38. package/dist/{error-D1FZI2Kd.d.mts → error-C7gSQVqk.d.mts} +2 -2
  39. package/dist/{error-D1FZI2Kd.d.mts.map → error-C7gSQVqk.d.mts.map} +1 -1
  40. package/dist/error.d.mts +1 -1
  41. package/dist/{errors-NIXCyk6I.d.mts → errors-4MPmTzjY.d.mts} +2 -2
  42. package/dist/{errors-NIXCyk6I.d.mts.map → errors-4MPmTzjY.d.mts.map} +1 -1
  43. package/dist/express/index.d.mts +2 -2
  44. package/dist/express/index.mjs +2 -2
  45. package/dist/fastify/index.d.mts +2 -2
  46. package/dist/fastify/index.mjs +2 -2
  47. package/dist/{fork-CTJXnpl8.mjs → fork-D1j1Fuzy.mjs} +3 -3
  48. package/dist/{fork-CTJXnpl8.mjs.map → fork-D1j1Fuzy.mjs.map} +1 -1
  49. package/dist/hono/index.d.mts +2 -2
  50. package/dist/hono/index.mjs +1 -1
  51. package/dist/http.d.mts +1 -1
  52. package/dist/http.d.mts.map +1 -1
  53. package/dist/http.mjs +3 -2
  54. package/dist/http.mjs.map +1 -1
  55. package/dist/index.d.mts +6 -6
  56. package/dist/index.mjs +1 -1
  57. package/dist/{logger-b3epPH0N.d.mts → logger-DttRJRGa.d.mts} +21 -2
  58. package/dist/logger-DttRJRGa.d.mts.map +1 -0
  59. package/dist/logger.d.mts +1 -1
  60. package/dist/logger.mjs +1 -1
  61. package/dist/{middleware-BYf26Lfu.d.mts → middleware-CTnDsST-.d.mts} +2 -2
  62. package/dist/{middleware-BYf26Lfu.d.mts.map → middleware-CTnDsST-.d.mts.map} +1 -1
  63. package/dist/{middleware-BWOJ7JI0.mjs → middleware-oAccqyPp.mjs} +2 -2
  64. package/dist/{middleware-BWOJ7JI0.mjs.map → middleware-oAccqyPp.mjs.map} +1 -1
  65. package/dist/nestjs/index.d.mts +2 -2
  66. package/dist/nestjs/index.mjs +2 -2
  67. package/dist/next/client.d.mts +1 -1
  68. package/dist/next/index.d.mts +4 -4
  69. package/dist/next/index.mjs +2 -2
  70. package/dist/next/index.mjs.map +1 -1
  71. package/dist/next/instrumentation.d.mts +1 -1
  72. package/dist/next/instrumentation.mjs +1 -1
  73. package/dist/next/instrumentation.mjs.map +1 -1
  74. package/dist/nitro/errorHandler.mjs.map +1 -1
  75. package/dist/nitro/module.d.mts +2 -2
  76. package/dist/nitro/plugin.mjs +1 -1
  77. package/dist/nitro/plugin.mjs.map +1 -1
  78. package/dist/nitro/v3/index.d.mts +2 -2
  79. package/dist/nitro/v3/middleware.mjs.map +1 -1
  80. package/dist/nitro/v3/module.d.mts +1 -1
  81. package/dist/nitro/v3/plugin.mjs +1 -1
  82. package/dist/nitro/v3/plugin.mjs.map +1 -1
  83. package/dist/nitro/v3/useLogger.d.mts +1 -1
  84. package/dist/nitro/v3/useLogger.mjs.map +1 -1
  85. package/dist/{nitro-DenB86W6.d.mts → nitro-CPPRCPbG.d.mts} +2 -2
  86. package/dist/{nitro-DenB86W6.d.mts.map → nitro-CPPRCPbG.d.mts.map} +1 -1
  87. package/dist/nuxt/module.d.mts +1 -1
  88. package/dist/nuxt/module.mjs +1 -1
  89. package/dist/{parseError-BR9pocvY.d.mts → parseError-o1GpZEOR.d.mts} +2 -2
  90. package/dist/parseError-o1GpZEOR.d.mts.map +1 -0
  91. package/dist/pipeline.mjs.map +1 -1
  92. package/dist/react-router/index.d.mts +2 -2
  93. package/dist/react-router/index.mjs +2 -2
  94. package/dist/runtime/client/log.d.mts +1 -1
  95. package/dist/runtime/client/log.mjs +2 -2
  96. package/dist/runtime/client/log.mjs.map +1 -1
  97. package/dist/runtime/client/plugin.mjs.map +1 -1
  98. package/dist/runtime/server/routes/_evlog/ingest.post.mjs +1 -1
  99. package/dist/runtime/server/routes/_evlog/ingest.post.mjs.map +1 -1
  100. package/dist/runtime/server/useLogger.d.mts +1 -1
  101. package/dist/runtime/server/useLogger.mjs.map +1 -1
  102. package/dist/runtime/utils/parseError.d.mts +2 -2
  103. package/dist/source-location-DRvDDqfq.mjs.map +1 -1
  104. package/dist/sveltekit/index.d.mts +2 -2
  105. package/dist/sveltekit/index.mjs +2 -2
  106. package/dist/sveltekit/index.mjs.map +1 -1
  107. package/dist/toolkit.d.mts +3 -3
  108. package/dist/toolkit.mjs +2 -2
  109. package/dist/types.d.mts +1 -1
  110. package/dist/{useLogger-C56tDPwf.d.mts → useLogger-CyPP1sVB.d.mts} +2 -2
  111. package/dist/{useLogger-C56tDPwf.d.mts.map → useLogger-CyPP1sVB.d.mts.map} +1 -1
  112. package/dist/{utils-DzGCLRFe.d.mts → utils-Dmin7wVL.d.mts} +4 -3
  113. package/dist/utils-Dmin7wVL.d.mts.map +1 -0
  114. package/dist/utils.d.mts +2 -2
  115. package/dist/utils.mjs +7 -1
  116. package/dist/utils.mjs.map +1 -1
  117. package/dist/vite/index.d.mts +1 -1
  118. package/dist/vite/index.mjs.map +1 -1
  119. package/dist/workers.d.mts +48 -4
  120. package/dist/workers.d.mts.map +1 -1
  121. package/dist/workers.mjs +32 -5
  122. package/dist/workers.mjs.map +1 -1
  123. package/package.json +17 -21
  124. package/dist/_http-CHSsrWDJ.mjs.map +0 -1
  125. package/dist/audit-d9esRZOK.mjs.map +0 -1
  126. package/dist/audit-mUutdf6A.d.mts.map +0 -1
  127. package/dist/logger-b3epPH0N.d.mts.map +0 -1
  128. package/dist/parseError-BR9pocvY.d.mts.map +0 -1
  129. package/dist/utils-DzGCLRFe.d.mts.map +0 -1
package/dist/utils.mjs CHANGED
@@ -9,6 +9,12 @@ function isServer() {
9
9
  function isClient() {
10
10
  return typeof window !== "undefined";
11
11
  }
12
+ function isBrowser() {
13
+ if (typeof window === "undefined") return false;
14
+ if (typeof document === "undefined") return false;
15
+ if (typeof navigator !== "undefined" && navigator.product === "ReactNative") return false;
16
+ return true;
17
+ }
12
18
  function isDev() {
13
19
  if (typeof process !== "undefined") return process.env.NODE_ENV !== "production";
14
20
  if (typeof window !== "undefined") return true;
@@ -117,6 +123,6 @@ function matchesPattern(path, pattern) {
117
123
  return regex.test(path);
118
124
  }
119
125
  //#endregion
120
- export { SENSITIVE_HEADERS, colors, cssColors, detectEnvironment, escapeFormatString, filterSafeHeaders, formatDuration, getConsoleMethod, getCssLevelColor, getLevelColor, isClient, isDev, isLevelEnabled, isServer, matchesPattern };
126
+ export { SENSITIVE_HEADERS, colors, cssColors, detectEnvironment, escapeFormatString, filterSafeHeaders, formatDuration, getConsoleMethod, getCssLevelColor, getLevelColor, isBrowser, isClient, isDev, isLevelEnabled, isServer, matchesPattern };
121
127
 
122
128
  //# 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\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
+ {"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,4 +1,4 @@
1
- import { Q as SamplingConfig, W as LogLevel, rt as TransportConfig } from "../audit-mUutdf6A.mjs";
1
+ import { Q as SamplingConfig, W as LogLevel, rt as TransportConfig } from "../audit-CTIviX3P.mjs";
2
2
  import { Plugin } from "vite";
3
3
 
4
4
  //#region src/vite/types.d.ts
@@ -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.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
+ {"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,6 +1,13 @@
1
- import { G as LoggerConfig, Y as RequestLogger } from "./audit-mUutdf6A.mjs";
1
+ import { G as LoggerConfig, Y as RequestLogger } from "./audit-CTIviX3P.mjs";
2
2
 
3
3
  //#region src/workers/index.d.ts
4
+ /**
5
+ * Minimal Cloudflare Workers execution context (`fetch` third argument).
6
+ * Matches Cloudflare `ExecutionContext` without requiring `@cloudflare/workers-types`.
7
+ */
8
+ interface WorkerExecutionContext {
9
+ waitUntil(promise: Promise<unknown>): void;
10
+ }
4
11
  /**
5
12
  * Options for createWorkersLogger
6
13
  */
@@ -9,6 +16,21 @@ interface WorkersLoggerOptions {
9
16
  requestId?: string;
10
17
  /** Headers to include in logs (default: none) */
11
18
  headers?: string[];
19
+ /**
20
+ * Cloudflare Workers `ExecutionContext` from the `fetch` handler
21
+ * (`async fetch(request, env, ctx)`). When set, async `initLogger({ drain })`
22
+ * work from `log.emit()` is registered with `ctx.waitUntil` so drains (HTTP to
23
+ * Axiom, PostHog, etc.) complete after the response is returned.
24
+ *
25
+ * Prefer {@link defineWorkerFetch} when you want this wired automatically.
26
+ */
27
+ executionCtx?: WorkerExecutionContext;
28
+ /**
29
+ * Lower-level alternative to `executionCtx`: same function Cloudflare assigns to
30
+ * `ExecutionContext#waitUntil` (must be bound if you extract the method), e.g.
31
+ * `waitUntil: ctx.waitUntil.bind(ctx)`.
32
+ */
33
+ waitUntil?: (promise: Promise<unknown>) => void;
12
34
  }
13
35
  /**
14
36
  * Initialize evlog for Cloudflare Workers.
@@ -22,6 +44,28 @@ interface WorkersLoggerOptions {
22
44
  * ```
23
45
  */
24
46
  declare function initWorkersLogger(options?: LoggerConfig): void;
47
+ /**
48
+ * Wraps a Workers `fetch` handler so {@link createWorkersLogger} receives
49
+ * `executionCtx` automatically for async drains (`initWorkersLogger({ drain })`).
50
+ *
51
+ * Cloudflare does not expose `ExecutionContext` globally — only as the third
52
+ * `fetch` argument — so evlog cannot discover it without either this helper or
53
+ * an explicit `{ executionCtx: ctx }` / `waitUntil` option.
54
+ *
55
+ * @example
56
+ * ```ts
57
+ * initWorkersLogger({ env: { service: 'my-api' }, drain: myDrain })
58
+ *
59
+ * export default defineWorkerFetch(async (request, env, ctx, log) => {
60
+ * log.set({ route: '/health' })
61
+ * log.emit({ status: 200 })
62
+ * return new Response('ok')
63
+ * })
64
+ * ```
65
+ */
66
+ declare function defineWorkerFetch<TEnv = unknown>(handler: (request: Request, env: TEnv, ctx: WorkerExecutionContext, log: RequestLogger) => Response | Promise<Response>): {
67
+ fetch: (request: Request, env: TEnv, ctx: WorkerExecutionContext) => Promise<Response>;
68
+ };
25
69
  /**
26
70
  * Create a request-scoped logger for Cloudflare Workers.
27
71
  * Auto-extracts cf-ray, request.cf context, method, and path.
@@ -29,8 +73,8 @@ declare function initWorkersLogger(options?: LoggerConfig): void;
29
73
  * @example
30
74
  * ```ts
31
75
  * export default {
32
- * async fetch(request: Request) {
33
- * const log = createWorkersLogger(request)
76
+ * async fetch(request: Request, env: Env, ctx: ExecutionContext) {
77
+ * const log = createWorkersLogger(request, { executionCtx: ctx })
34
78
  *
35
79
  * log.set({ user: { id: '123' } })
36
80
  * log.emit({ status: 200 })
@@ -42,5 +86,5 @@ declare function initWorkersLogger(options?: LoggerConfig): void;
42
86
  */
43
87
  declare function createWorkersLogger<T extends object = Record<string, unknown>>(request: Request, options?: WorkersLoggerOptions): RequestLogger<T>;
44
88
  //#endregion
45
- export { WorkersLoggerOptions, createWorkersLogger, initWorkersLogger };
89
+ export { WorkerExecutionContext, WorkersLoggerOptions, createWorkersLogger, defineWorkerFetch, initWorkersLogger };
46
90
  //# sourceMappingURL=workers.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"workers.d.mts","names":[],"sources":["../src/workers/index.ts"],"mappings":";;;;;AAMA;UAAiB,oBAAA;;EAEf,SAAA;EAEO;EAAP,OAAA;AAAA;;;;AAsEF;;;;;;;;iBArCgB,iBAAA,CAAkB,OAAA,GAAS,YAAA;;;;;;;;;;;;;;;;;;;iBAqC3B,mBAAA,oBAAuC,MAAA,kBAAA,CAAyB,OAAA,EAAS,OAAA,EAAS,OAAA,GAAS,oBAAA,GAA4B,aAAA,CAAc,CAAA"}
1
+ {"version":3,"file":"workers.d.mts","names":[],"sources":["../src/workers/index.ts"],"mappings":";;;;;AAOA;;UAAiB,sBAAA;EACf,SAAA,CAAU,OAAA,EAAS,OAAA;AAAA;;;;UAMJ,oBAAA;EAAA;EAEf,SAAA;;EAEA,OAAA;EAFA;;;;;;;;EAWA,YAAA,GAAe,sBAAA;EAuCD;;;;;EAjCd,SAAA,IAAa,OAAA,EAAS,OAAA;AAAA;;;;;;;;;;;;iBAiCR,iBAAA,CAAkB,OAAA,GAAS,YAAA;;;;;;;;;;;;;;;;;;;;iBA2B3B,iBAAA,gBAAA,CACd,OAAA,GACE,OAAA,EAAS,OAAA,EACT,GAAA,EAAK,IAAA,EACL,GAAA,EAAK,sBAAA,EACL,GAAA,EAAK,aAAA,KACF,QAAA,GAAW,OAAA,CAAQ,QAAA;EAExB,KAAA,GAAQ,OAAA,EAAS,OAAA,EAAS,GAAA,EAAK,IAAA,EAAM,GAAA,EAAK,sBAAA,KAA2B,OAAA,CAAQ,QAAA;AAAA;;;;;;AAuC/E;;;;;;;;;;;;;iBAAgB,mBAAA,oBAAuC,MAAA,kBAAA,CAAyB,OAAA,EAAS,OAAA,EAAS,OAAA,GAAS,oBAAA,GAA4B,aAAA,CAAc,CAAA"}
package/dist/workers.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { g as createRequestLogger, y as initLogger } from "./audit-d9esRZOK.mjs";
1
+ import { g as createRequestLogger, y as initLogger } from "./audit-DQoBo7Dl.mjs";
2
2
  //#region src/workers/index.ts
3
3
  function isRecord(value) {
4
4
  return typeof value === "object" && value !== null && !Array.isArray(value);
@@ -30,6 +30,31 @@ function initWorkersLogger(options = {}) {
30
30
  stringify: false
31
31
  });
32
32
  }
33
+ /**
34
+ * Wraps a Workers `fetch` handler so {@link createWorkersLogger} receives
35
+ * `executionCtx` automatically for async drains (`initWorkersLogger({ drain })`).
36
+ *
37
+ * Cloudflare does not expose `ExecutionContext` globally — only as the third
38
+ * `fetch` argument — so evlog cannot discover it without either this helper or
39
+ * an explicit `{ executionCtx: ctx }` / `waitUntil` option.
40
+ *
41
+ * @example
42
+ * ```ts
43
+ * initWorkersLogger({ env: { service: 'my-api' }, drain: myDrain })
44
+ *
45
+ * export default defineWorkerFetch(async (request, env, ctx, log) => {
46
+ * log.set({ route: '/health' })
47
+ * log.emit({ status: 200 })
48
+ * return new Response('ok')
49
+ * })
50
+ * ```
51
+ */
52
+ function defineWorkerFetch(handler) {
53
+ return { fetch(request, env, ctx) {
54
+ const log = createWorkersLogger(request, { executionCtx: ctx });
55
+ return Promise.resolve(handler(request, env, ctx, log));
56
+ } };
57
+ }
33
58
  function pickCfContext(request) {
34
59
  const cf = Reflect.get(request, "cf");
35
60
  if (!isRecord(cf)) return {};
@@ -46,8 +71,8 @@ function pickCfContext(request) {
46
71
  * @example
47
72
  * ```ts
48
73
  * export default {
49
- * async fetch(request: Request) {
50
- * const log = createWorkersLogger(request)
74
+ * async fetch(request: Request, env: Env, ctx: ExecutionContext) {
75
+ * const log = createWorkersLogger(request, { executionCtx: ctx })
51
76
  *
52
77
  * log.set({ user: { id: '123' } })
53
78
  * log.emit({ status: 200 })
@@ -61,10 +86,12 @@ function createWorkersLogger(request, options = {}) {
61
86
  const url = new URL(request.url);
62
87
  const cfRay = request.headers.get("cf-ray") ?? void 0;
63
88
  const traceparent = request.headers.get("traceparent") ?? void 0;
89
+ const waitUntil = options.waitUntil ?? (options.executionCtx ? options.executionCtx.waitUntil.bind(options.executionCtx) : void 0);
64
90
  const log = createRequestLogger({
65
91
  method: request.method,
66
92
  path: url.pathname,
67
- requestId: options.requestId ?? cfRay
93
+ requestId: options.requestId ?? cfRay,
94
+ waitUntil
68
95
  });
69
96
  log.set({
70
97
  cfRay,
@@ -75,6 +102,6 @@ function createWorkersLogger(request, options = {}) {
75
102
  return log;
76
103
  }
77
104
  //#endregion
78
- export { createWorkersLogger, initWorkersLogger };
105
+ export { createWorkersLogger, defineWorkerFetch, initWorkersLogger };
79
106
 
80
107
  //# sourceMappingURL=workers.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"workers.mjs","names":[],"sources":["../src/workers/index.ts"],"sourcesContent":["import { initLogger, createRequestLogger } from '../logger'\nimport type { LoggerConfig, RequestLogger } from '../types'\n\n/**\n * Options for createWorkersLogger\n */\nexport interface WorkersLoggerOptions {\n /** Override the request ID (default: cf-ray header) */\n requestId?: string\n /** Headers to include in logs (default: none) */\n headers?: string[]\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction collectHeaders(headers: Headers, include: string[] | undefined): Record<string, string> | undefined {\n if (!include || include.length === 0) return undefined\n\n const normalized = new Set(include.map(h => h.toLowerCase()))\n const result: Record<string, string> = {}\n\n headers.forEach((value, key) => {\n if (normalized.has(key.toLowerCase())) {\n result[key] = value\n }\n })\n\n return Object.keys(result).length > 0 ? result : undefined\n}\n\n/**\n * Initialize evlog for Cloudflare Workers.\n * Call once at module scope.\n *\n * @example\n * ```ts\n * initWorkersLogger({\n * env: { service: 'my-api' },\n * })\n * ```\n */\nexport function initWorkersLogger(options: LoggerConfig = {}): void {\n initLogger({\n ...options,\n pretty: false,\n stringify: false,\n })\n}\n\nfunction pickCfContext(request: Request): Record<string, unknown> {\n const cf = Reflect.get(request, 'cf')\n if (!isRecord(cf)) return {}\n\n const out: Record<string, unknown> = {}\n if (typeof cf.colo === 'string') out.colo = cf.colo\n if (typeof cf.country === 'string') out.country = cf.country\n if (typeof cf.asn === 'number') out.asn = cf.asn\n return out\n}\n\n/**\n * Create a request-scoped logger for Cloudflare Workers.\n * Auto-extracts cf-ray, request.cf context, method, and path.\n *\n * @example\n * ```ts\n * export default {\n * async fetch(request: Request) {\n * const log = createWorkersLogger(request)\n *\n * log.set({ user: { id: '123' } })\n * log.emit({ status: 200 })\n *\n * return new Response('ok')\n * }\n * }\n * ```\n */\nexport function createWorkersLogger<T extends object = Record<string, unknown>>(request: Request, options: WorkersLoggerOptions = {}): RequestLogger<T> {\n const url = new URL(request.url)\n const cfRay = request.headers.get('cf-ray') ?? undefined\n const traceparent = request.headers.get('traceparent') ?? undefined\n\n const log = createRequestLogger<T>({\n method: request.method,\n path: url.pathname,\n requestId: options.requestId ?? cfRay,\n })\n\n // Cast needed: CF-specific enrichment fields (cfRay, traceparent, etc.) aren't in user's T\n const untyped = log as unknown as RequestLogger\n untyped.set({\n cfRay,\n traceparent,\n ...pickCfContext(request),\n ...(options.headers ? { requestHeaders: collectHeaders(request.headers, options.headers) } : {}),\n })\n\n return log\n}\n"],"mappings":";;AAaA,SAAS,SAAS,OAAkD;AAClE,QAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,MAAM;;AAG7E,SAAS,eAAe,SAAkB,SAAmE;AAC3G,KAAI,CAAC,WAAW,QAAQ,WAAW,EAAG,QAAO,KAAA;CAE7C,MAAM,aAAa,IAAI,IAAI,QAAQ,KAAI,MAAK,EAAE,aAAa,CAAC,CAAC;CAC7D,MAAM,SAAiC,EAAE;AAEzC,SAAQ,SAAS,OAAO,QAAQ;AAC9B,MAAI,WAAW,IAAI,IAAI,aAAa,CAAC,CACnC,QAAO,OAAO;GAEhB;AAEF,QAAO,OAAO,KAAK,OAAO,CAAC,SAAS,IAAI,SAAS,KAAA;;;;;;;;;;;;;AAcnD,SAAgB,kBAAkB,UAAwB,EAAE,EAAQ;AAClE,YAAW;EACT,GAAG;EACH,QAAQ;EACR,WAAW;EACZ,CAAC;;AAGJ,SAAS,cAAc,SAA2C;CAChE,MAAM,KAAK,QAAQ,IAAI,SAAS,KAAK;AACrC,KAAI,CAAC,SAAS,GAAG,CAAE,QAAO,EAAE;CAE5B,MAAM,MAA+B,EAAE;AACvC,KAAI,OAAO,GAAG,SAAS,SAAU,KAAI,OAAO,GAAG;AAC/C,KAAI,OAAO,GAAG,YAAY,SAAU,KAAI,UAAU,GAAG;AACrD,KAAI,OAAO,GAAG,QAAQ,SAAU,KAAI,MAAM,GAAG;AAC7C,QAAO;;;;;;;;;;;;;;;;;;;;AAqBT,SAAgB,oBAAgE,SAAkB,UAAgC,EAAE,EAAoB;CACtJ,MAAM,MAAM,IAAI,IAAI,QAAQ,IAAI;CAChC,MAAM,QAAQ,QAAQ,QAAQ,IAAI,SAAS,IAAI,KAAA;CAC/C,MAAM,cAAc,QAAQ,QAAQ,IAAI,cAAc,IAAI,KAAA;CAE1D,MAAM,MAAM,oBAAuB;EACjC,QAAQ,QAAQ;EAChB,MAAM,IAAI;EACV,WAAW,QAAQ,aAAa;EACjC,CAAC;AAGc,KACR,IAAI;EACV;EACA;EACA,GAAG,cAAc,QAAQ;EACzB,GAAI,QAAQ,UAAU,EAAE,gBAAgB,eAAe,QAAQ,SAAS,QAAQ,QAAQ,EAAE,GAAG,EAAE;EAChG,CAAC;AAEF,QAAO"}
1
+ {"version":3,"file":"workers.mjs","names":[],"sources":["../src/workers/index.ts"],"sourcesContent":["import { initLogger, createRequestLogger } from '../logger'\nimport type { LoggerConfig, RequestLogger } from '../types'\n\n/**\n * Minimal Cloudflare Workers execution context (`fetch` third argument).\n * Matches Cloudflare `ExecutionContext` without requiring `@cloudflare/workers-types`.\n */\nexport interface WorkerExecutionContext {\n waitUntil(promise: Promise<unknown>): void\n}\n\n/**\n * Options for createWorkersLogger\n */\nexport interface WorkersLoggerOptions {\n /** Override the request ID (default: cf-ray header) */\n requestId?: string\n /** Headers to include in logs (default: none) */\n headers?: string[]\n /**\n * Cloudflare Workers `ExecutionContext` from the `fetch` handler\n * (`async fetch(request, env, ctx)`). When set, async `initLogger({ drain })`\n * work from `log.emit()` is registered with `ctx.waitUntil` so drains (HTTP to\n * Axiom, PostHog, etc.) complete after the response is returned.\n *\n * Prefer {@link defineWorkerFetch} when you want this wired automatically.\n */\n executionCtx?: WorkerExecutionContext\n /**\n * Lower-level alternative to `executionCtx`: same function Cloudflare assigns to\n * `ExecutionContext#waitUntil` (must be bound if you extract the method), e.g.\n * `waitUntil: ctx.waitUntil.bind(ctx)`.\n */\n waitUntil?: (promise: Promise<unknown>) => void\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction collectHeaders(headers: Headers, include: string[] | undefined): Record<string, string> | undefined {\n if (!include || include.length === 0) return undefined\n\n const normalized = new Set(include.map(h => h.toLowerCase()))\n const result: Record<string, string> = {}\n\n headers.forEach((value, key) => {\n if (normalized.has(key.toLowerCase())) {\n result[key] = value\n }\n })\n\n return Object.keys(result).length > 0 ? result : undefined\n}\n\n/**\n * Initialize evlog for Cloudflare Workers.\n * Call once at module scope.\n *\n * @example\n * ```ts\n * initWorkersLogger({\n * env: { service: 'my-api' },\n * })\n * ```\n */\nexport function initWorkersLogger(options: LoggerConfig = {}): void {\n initLogger({\n ...options,\n pretty: false,\n stringify: false,\n })\n}\n\n/**\n * Wraps a Workers `fetch` handler so {@link createWorkersLogger} receives\n * `executionCtx` automatically for async drains (`initWorkersLogger({ drain })`).\n *\n * Cloudflare does not expose `ExecutionContext` globally — only as the third\n * `fetch` argument — so evlog cannot discover it without either this helper or\n * an explicit `{ executionCtx: ctx }` / `waitUntil` option.\n *\n * @example\n * ```ts\n * initWorkersLogger({ env: { service: 'my-api' }, drain: myDrain })\n *\n * export default defineWorkerFetch(async (request, env, ctx, log) => {\n * log.set({ route: '/health' })\n * log.emit({ status: 200 })\n * return new Response('ok')\n * })\n * ```\n */\nexport function defineWorkerFetch<TEnv = unknown>(\n handler: (\n request: Request,\n env: TEnv,\n ctx: WorkerExecutionContext,\n log: RequestLogger,\n ) => Response | Promise<Response>,\n): {\n fetch: (request: Request, env: TEnv, ctx: WorkerExecutionContext) => Promise<Response>\n} {\n return {\n fetch(request, env, ctx) {\n const log = createWorkersLogger(request, { executionCtx: ctx })\n return Promise.resolve(handler(request, env, ctx, log))\n },\n }\n}\n\nfunction pickCfContext(request: Request): Record<string, unknown> {\n const cf = Reflect.get(request, 'cf')\n if (!isRecord(cf)) return {}\n\n const out: Record<string, unknown> = {}\n if (typeof cf.colo === 'string') out.colo = cf.colo\n if (typeof cf.country === 'string') out.country = cf.country\n if (typeof cf.asn === 'number') out.asn = cf.asn\n return out\n}\n\n/**\n * Create a request-scoped logger for Cloudflare Workers.\n * Auto-extracts cf-ray, request.cf context, method, and path.\n *\n * @example\n * ```ts\n * export default {\n * async fetch(request: Request, env: Env, ctx: ExecutionContext) {\n * const log = createWorkersLogger(request, { executionCtx: ctx })\n *\n * log.set({ user: { id: '123' } })\n * log.emit({ status: 200 })\n *\n * return new Response('ok')\n * }\n * }\n * ```\n */\nexport function createWorkersLogger<T extends object = Record<string, unknown>>(request: Request, options: WorkersLoggerOptions = {}): RequestLogger<T> {\n const url = new URL(request.url)\n const cfRay = request.headers.get('cf-ray') ?? undefined\n const traceparent = request.headers.get('traceparent') ?? undefined\n\n const waitUntil =\n options.waitUntil\n ?? (options.executionCtx\n ? options.executionCtx.waitUntil.bind(options.executionCtx)\n : undefined)\n\n const log = createRequestLogger<T>({\n method: request.method,\n path: url.pathname,\n requestId: options.requestId ?? cfRay,\n waitUntil,\n })\n\n // Cast needed: CF-specific enrichment fields (cfRay, traceparent, etc.) aren't in user's T\n const untyped = log as unknown as RequestLogger\n untyped.set({\n cfRay,\n traceparent,\n ...pickCfContext(request),\n ...(options.headers ? { requestHeaders: collectHeaders(request.headers, options.headers) } : {}),\n })\n\n return log\n}\n"],"mappings":";;AAoCA,SAAS,SAAS,OAAkD;AAClE,QAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,MAAM;;AAG7E,SAAS,eAAe,SAAkB,SAAmE;AAC3G,KAAI,CAAC,WAAW,QAAQ,WAAW,EAAG,QAAO,KAAA;CAE7C,MAAM,aAAa,IAAI,IAAI,QAAQ,KAAI,MAAK,EAAE,aAAa,CAAC,CAAC;CAC7D,MAAM,SAAiC,EAAE;AAEzC,SAAQ,SAAS,OAAO,QAAQ;AAC9B,MAAI,WAAW,IAAI,IAAI,aAAa,CAAC,CACnC,QAAO,OAAO;GAEhB;AAEF,QAAO,OAAO,KAAK,OAAO,CAAC,SAAS,IAAI,SAAS,KAAA;;;;;;;;;;;;;AAcnD,SAAgB,kBAAkB,UAAwB,EAAE,EAAQ;AAClE,YAAW;EACT,GAAG;EACH,QAAQ;EACR,WAAW;EACZ,CAAC;;;;;;;;;;;;;;;;;;;;;AAsBJ,SAAgB,kBACd,SAQA;AACA,QAAO,EACL,MAAM,SAAS,KAAK,KAAK;EACvB,MAAM,MAAM,oBAAoB,SAAS,EAAE,cAAc,KAAK,CAAC;AAC/D,SAAO,QAAQ,QAAQ,QAAQ,SAAS,KAAK,KAAK,IAAI,CAAC;IAE1D;;AAGH,SAAS,cAAc,SAA2C;CAChE,MAAM,KAAK,QAAQ,IAAI,SAAS,KAAK;AACrC,KAAI,CAAC,SAAS,GAAG,CAAE,QAAO,EAAE;CAE5B,MAAM,MAA+B,EAAE;AACvC,KAAI,OAAO,GAAG,SAAS,SAAU,KAAI,OAAO,GAAG;AAC/C,KAAI,OAAO,GAAG,YAAY,SAAU,KAAI,UAAU,GAAG;AACrD,KAAI,OAAO,GAAG,QAAQ,SAAU,KAAI,MAAM,GAAG;AAC7C,QAAO;;;;;;;;;;;;;;;;;;;;AAqBT,SAAgB,oBAAgE,SAAkB,UAAgC,EAAE,EAAoB;CACtJ,MAAM,MAAM,IAAI,IAAI,QAAQ,IAAI;CAChC,MAAM,QAAQ,QAAQ,QAAQ,IAAI,SAAS,IAAI,KAAA;CAC/C,MAAM,cAAc,QAAQ,QAAQ,IAAI,cAAc,IAAI,KAAA;CAE1D,MAAM,YACJ,QAAQ,cACJ,QAAQ,eACR,QAAQ,aAAa,UAAU,KAAK,QAAQ,aAAa,GACzD,KAAA;CAEN,MAAM,MAAM,oBAAuB;EACjC,QAAQ,QAAQ;EAChB,MAAM,IAAI;EACV,WAAW,QAAQ,aAAa;EAChC;EACD,CAAC;AAIF,KAAQ,IAAI;EACV;EACA;EACA,GAAG,cAAc,QAAQ;EACzB,GAAI,QAAQ,UAAU,EAAE,gBAAgB,eAAe,QAAQ,SAAS,QAAQ,QAAQ,EAAE,GAAG,EAAE;EAChG,CAAC;AAEF,QAAO"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "evlog",
3
- "version": "2.14.0",
3
+ "version": "2.14.1",
4
4
  "description": "Wide event logging library with structured error handling. Inspired by LoggingSucks.",
5
5
  "author": "HugoRCD <contact@hrcd.fr>",
6
6
  "homepage": "https://evlog.dev",
@@ -319,32 +319,32 @@
319
319
  "typecheck": "echo 'Typecheck handled by build'"
320
320
  },
321
321
  "devDependencies": {
322
- "@tanstack/start-client-core": "^1.167.9",
322
+ "@tanstack/start-client-core": "^1.167.20",
323
323
  "acorn": "^8.16.0",
324
- "@codspeed/vitest-plugin": "^5.2.0",
325
- "@nestjs/common": "^11.1.18",
324
+ "@codspeed/vitest-plugin": "^5.3.0",
325
+ "@nestjs/common": "^11.1.19",
326
326
  "@nuxt/devtools": "^3.2.4",
327
327
  "@nuxt/schema": "^4.4.2",
328
- "@nuxt/test-utils": "^4.0.2",
328
+ "@nuxt/test-utils": "^4.0.3",
329
329
  "@types/express": "^5.0.6",
330
330
  "@types/supertest": "^7.2.0",
331
331
  "changelogen": "^0.6.2",
332
332
  "consola": "^3.4.2",
333
333
  "elysia": "^1.4.28",
334
334
  "express": "^5.2.1",
335
- "fastify": "^5.8.4",
335
+ "fastify": "^5.8.5",
336
336
  "h3": "^1.15.11",
337
- "happy-dom": "^20.8.9",
337
+ "happy-dom": "^20.9.0",
338
338
  "nitro": "^3.0.260311-beta",
339
339
  "nitropack": "^2.13.3",
340
340
  "nuxt": "^4.4.2",
341
341
  "pino": "^10.3.1",
342
- "react-router": "^7.14.0",
342
+ "react-router": "^7.14.2",
343
343
  "supertest": "^7.2.2",
344
- "tsdown": "^0.21.7",
344
+ "tsdown": "^0.21.10",
345
345
  "magic-string": "^0.30.21",
346
- "typescript": "^6.0.2",
347
- "vite": "^8.0.8",
346
+ "typescript": "^6.0.3",
347
+ "vite": "^8.0.10",
348
348
  "ufo": "^1.6.3",
349
349
  "winston": "^3.19.0"
350
350
  },
@@ -354,18 +354,17 @@
354
354
  "nitropack": "^2.13.3",
355
355
  "ofetch": "^1.5.1",
356
356
  "nitro": "^3.0.260311-beta",
357
- "next": ">=16.2.3",
357
+ "next": ">=16.2.4",
358
358
  "react": ">=19.2.5",
359
359
  "hono": "",
360
360
  "express": ">=5.2.1",
361
361
  "elysia": ">=1.4.28",
362
- "fastify": ">=5.8.4",
363
- "@nestjs/common": ">=11.1.18",
364
- "react-router": ">=7.14.0",
362
+ "fastify": ">=5.8.5",
363
+ "@nestjs/common": ">=11.1.19",
364
+ "react-router": ">=7.14.2",
365
365
  "vite": "^7.0.0 || ^8.0.0",
366
- "ai": ">=6.0.154",
367
- "@tanstack/start-client-core": "^1.167.9",
368
- "better-auth": ">=1.2.0"
366
+ "ai": ">=6.0.168",
367
+ "@tanstack/start-client-core": "^1.167.20"
369
368
  },
370
369
  "peerDependenciesMeta": {
371
370
  "@nuxt/kit": {
@@ -415,9 +414,6 @@
415
414
  },
416
415
  "@tanstack/start-client-core": {
417
416
  "optional": true
418
- },
419
- "better-auth": {
420
- "optional": true
421
417
  }
422
418
  }
423
419
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"_http-CHSsrWDJ.mjs","names":[],"sources":["../src/adapters/_config.ts","../src/adapters/_http.ts"],"sourcesContent":["import { getNitroRuntimeConfigRecord } from '../shared/nitroConfigBridge'\n\n/**\n * Adapter runtime-config reads go through `getNitroRuntimeConfigRecord` in\n * `shared/nitroConfigBridge.ts` (documented there — Workers-safe dynamic imports).\n *\n * Drain handlers remain non-blocking when the host provides `waitUntil`.\n */\n\nexport function getRuntimeConfig(): Promise<Record<string, any> | undefined> {\n return getNitroRuntimeConfigRecord()\n}\n\nexport interface ConfigField<T> {\n key: keyof T & string\n env?: string[]\n}\n\nexport async function resolveAdapterConfig<T>(\n namespace: string,\n fields: ConfigField<T>[],\n overrides?: Partial<T>,\n): Promise<Partial<T>> {\n const runtimeConfig = await getRuntimeConfig()\n const evlogNs = runtimeConfig?.evlog?.[namespace]\n const rootNs = runtimeConfig?.[namespace]\n\n const config: Record<string, unknown> = {}\n\n for (const { key, env } of fields) {\n config[key] =\n overrides?.[key]\n ?? evlogNs?.[key]\n ?? rootNs?.[key]\n ?? resolveEnv(env)\n }\n\n return config as Partial<T>\n}\n\nfunction resolveEnv(envKeys?: string[]): string | undefined {\n if (!envKeys) return undefined\n for (const key of envKeys) {\n const val = process.env[key]\n if (val) return val\n }\n return undefined\n}\n","export interface HttpPostOptions {\n url: string\n headers: Record<string, string>\n body: string\n timeout: number\n label: string\n retries?: number\n}\n\nfunction isRetryable(error: unknown): boolean {\n if (error instanceof DOMException && error.name === 'AbortError') return true\n if (error instanceof TypeError) return true\n if (error instanceof Error) {\n const match = error.message.match(/API error: (\\d+)/)\n if (match) return Number.parseInt(match[1]) >= 500\n }\n return false\n}\n\nexport async function httpPost({ url, headers, body, timeout, label, retries = 2 }: HttpPostOptions): Promise<void> {\n const normalizedRetries = Number.isFinite(retries) && retries >= 0 ? Math.floor(retries) : 2\n\n let lastError: Error | undefined\n\n for (let attempt = 0; attempt <= normalizedRetries; attempt++) {\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), timeout)\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body,\n signal: controller.signal,\n })\n\n if (!response.ok) {\n const text = await response.text().catch(() => 'Unknown error')\n const safeText = text.length > 200 ? `${text.slice(0, 200)}...[truncated]` : text\n throw new Error(`${label} API error: ${response.status} ${response.statusText} - ${safeText}`)\n }\n\n clearTimeout(timeoutId)\n return\n } catch (error) {\n clearTimeout(timeoutId)\n\n if (error instanceof DOMException && error.name === 'AbortError') {\n lastError = new Error(`${label} request timed out after ${timeout}ms`)\n } else {\n lastError = error as Error\n }\n\n if (!isRetryable(error) || attempt === normalizedRetries) {\n throw lastError\n }\n\n await new Promise<void>(r => setTimeout(r, 200 * 2 ** attempt))\n }\n }\n\n throw lastError!\n}\n"],"mappings":";;;;;;;;AASA,SAAgB,mBAA6D;AAC3E,QAAO,6BAA6B;;AAQtC,eAAsB,qBACpB,WACA,QACA,WACqB;CACrB,MAAM,gBAAgB,MAAM,kBAAkB;CAC9C,MAAM,UAAU,eAAe,QAAQ;CACvC,MAAM,SAAS,gBAAgB;CAE/B,MAAM,SAAkC,EAAE;AAE1C,MAAK,MAAM,EAAE,KAAK,SAAS,OACzB,QAAO,OACL,YAAY,QACT,UAAU,QACV,SAAS,QACT,WAAW,IAAI;AAGtB,QAAO;;AAGT,SAAS,WAAW,SAAwC;AAC1D,KAAI,CAAC,QAAS,QAAO,KAAA;AACrB,MAAK,MAAM,OAAO,SAAS;EACzB,MAAM,MAAM,QAAQ,IAAI;AACxB,MAAI,IAAK,QAAO;;;;;ACnCpB,SAAS,YAAY,OAAyB;AAC5C,KAAI,iBAAiB,gBAAgB,MAAM,SAAS,aAAc,QAAO;AACzE,KAAI,iBAAiB,UAAW,QAAO;AACvC,KAAI,iBAAiB,OAAO;EAC1B,MAAM,QAAQ,MAAM,QAAQ,MAAM,mBAAmB;AACrD,MAAI,MAAO,QAAO,OAAO,SAAS,MAAM,GAAG,IAAI;;AAEjD,QAAO;;AAGT,eAAsB,SAAS,EAAE,KAAK,SAAS,MAAM,SAAS,OAAO,UAAU,KAAqC;CAClH,MAAM,oBAAoB,OAAO,SAAS,QAAQ,IAAI,WAAW,IAAI,KAAK,MAAM,QAAQ,GAAG;CAE3F,IAAI;AAEJ,MAAK,IAAI,UAAU,GAAG,WAAW,mBAAmB,WAAW;EAC7D,MAAM,aAAa,IAAI,iBAAiB;EACxC,MAAM,YAAY,iBAAiB,WAAW,OAAO,EAAE,QAAQ;AAE/D,MAAI;GACF,MAAM,WAAW,MAAM,MAAM,KAAK;IAChC,QAAQ;IACR;IACA;IACA,QAAQ,WAAW;IACpB,CAAC;AAEF,OAAI,CAAC,SAAS,IAAI;IAChB,MAAM,OAAO,MAAM,SAAS,MAAM,CAAC,YAAY,gBAAgB;IAC/D,MAAM,WAAW,KAAK,SAAS,MAAM,GAAG,KAAK,MAAM,GAAG,IAAI,CAAC,kBAAkB;AAC7E,UAAM,IAAI,MAAM,GAAG,MAAM,cAAc,SAAS,OAAO,GAAG,SAAS,WAAW,KAAK,WAAW;;AAGhG,gBAAa,UAAU;AACvB;WACO,OAAO;AACd,gBAAa,UAAU;AAEvB,OAAI,iBAAiB,gBAAgB,MAAM,SAAS,aAClD,6BAAY,IAAI,MAAM,GAAG,MAAM,2BAA2B,QAAQ,IAAI;OAEtE,aAAY;AAGd,OAAI,CAAC,YAAY,MAAM,IAAI,YAAY,kBACrC,OAAM;AAGR,SAAM,IAAI,SAAc,MAAK,WAAW,GAAG,MAAM,KAAK,QAAQ,CAAC;;;AAInE,OAAM"}