evlog 2.13.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.
- package/README.md +118 -15
- package/dist/{_http-CHSsrWDJ.mjs → _http-BY1e9pwC.mjs} +9 -2
- package/dist/_http-BY1e9pwC.mjs.map +1 -0
- package/dist/adapters/axiom.d.mts +1 -1
- package/dist/adapters/axiom.mjs +1 -1
- package/dist/adapters/axiom.mjs.map +1 -1
- package/dist/adapters/better-stack.d.mts +1 -1
- package/dist/adapters/better-stack.mjs +1 -1
- package/dist/adapters/better-stack.mjs.map +1 -1
- package/dist/adapters/datadog.d.mts +1 -1
- package/dist/adapters/datadog.mjs +1 -1
- package/dist/adapters/datadog.mjs.map +1 -1
- package/dist/adapters/fs.d.mts +1 -1
- package/dist/adapters/fs.mjs.map +1 -1
- package/dist/adapters/hyperdx.d.mts +1 -1
- package/dist/adapters/hyperdx.mjs +1 -1
- package/dist/adapters/otlp.d.mts +1 -1
- package/dist/adapters/otlp.mjs +1 -1
- package/dist/adapters/otlp.mjs.map +1 -1
- package/dist/adapters/posthog.d.mts +1 -1
- package/dist/adapters/posthog.mjs +1 -1
- package/dist/adapters/posthog.mjs.map +1 -1
- package/dist/adapters/sentry.d.mts +1 -1
- package/dist/adapters/sentry.mjs +1 -1
- package/dist/adapters/sentry.mjs.map +1 -1
- package/dist/ai/index.d.mts +106 -5
- package/dist/ai/index.d.mts.map +1 -1
- package/dist/ai/index.mjs +28 -5
- package/dist/ai/index.mjs.map +1 -1
- package/dist/{types-DbzDln7O.d.mts → audit-CTIviX3P.d.mts} +509 -3
- package/dist/audit-CTIviX3P.d.mts.map +1 -0
- package/dist/{logger-DnobymUQ.mjs → audit-DQoBo7Dl.mjs} +758 -16
- package/dist/audit-DQoBo7Dl.mjs.map +1 -0
- package/dist/better-auth/index.d.mts +1 -1
- package/dist/better-auth/index.mjs.map +1 -1
- package/dist/browser.d.mts +1 -1
- package/dist/elysia/index.d.mts +2 -2
- package/dist/elysia/index.mjs +2 -2
- package/dist/enrichers.d.mts +1 -1
- package/dist/enrichers.mjs.map +1 -1
- package/dist/{error-B9CiGK_i.d.mts → error-C7gSQVqk.d.mts} +2 -2
- package/dist/{error-B9CiGK_i.d.mts.map → error-C7gSQVqk.d.mts.map} +1 -1
- package/dist/error.d.mts +1 -1
- package/dist/{errors-Dr0r4OpR.d.mts → errors-4MPmTzjY.d.mts} +2 -2
- package/dist/{errors-Dr0r4OpR.d.mts.map → errors-4MPmTzjY.d.mts.map} +1 -1
- package/dist/express/index.d.mts +2 -2
- package/dist/express/index.mjs +2 -2
- package/dist/fastify/index.d.mts +2 -2
- package/dist/fastify/index.mjs +2 -2
- package/dist/{fork-Y4z8iHti.mjs → fork-D1j1Fuzy.mjs} +3 -3
- package/dist/{fork-Y4z8iHti.mjs.map → fork-D1j1Fuzy.mjs.map} +1 -1
- package/dist/hono/index.d.mts +2 -2
- package/dist/hono/index.mjs +1 -1
- package/dist/http.d.mts +1 -1
- package/dist/http.d.mts.map +1 -1
- package/dist/http.mjs +3 -2
- package/dist/http.mjs.map +1 -1
- package/dist/index.d.mts +7 -7
- package/dist/index.mjs +2 -2
- package/dist/{logger-Dp6nYWjH.d.mts → logger-DttRJRGa.d.mts} +23 -4
- package/dist/logger-DttRJRGa.d.mts.map +1 -0
- package/dist/logger.d.mts +1 -1
- package/dist/logger.mjs +1 -1
- package/dist/{middleware-FgC1OdOD.d.mts → middleware-CTnDsST-.d.mts} +2 -2
- package/dist/{middleware-FgC1OdOD.d.mts.map → middleware-CTnDsST-.d.mts.map} +1 -1
- package/dist/{middleware-BtBuosFV.mjs → middleware-oAccqyPp.mjs} +2 -2
- package/dist/{middleware-BtBuosFV.mjs.map → middleware-oAccqyPp.mjs.map} +1 -1
- package/dist/nestjs/index.d.mts +2 -2
- package/dist/nestjs/index.mjs +2 -2
- package/dist/next/client.d.mts +1 -1
- package/dist/next/index.d.mts +4 -4
- package/dist/next/index.mjs +2 -2
- package/dist/next/index.mjs.map +1 -1
- package/dist/next/instrumentation.d.mts +1 -1
- package/dist/next/instrumentation.mjs +1 -1
- package/dist/next/instrumentation.mjs.map +1 -1
- package/dist/nitro/errorHandler.mjs.map +1 -1
- package/dist/nitro/module.d.mts +2 -2
- package/dist/nitro/plugin.mjs +1 -1
- package/dist/nitro/plugin.mjs.map +1 -1
- package/dist/nitro/v3/index.d.mts +2 -2
- package/dist/nitro/v3/middleware.mjs.map +1 -1
- package/dist/nitro/v3/module.d.mts +1 -1
- package/dist/nitro/v3/plugin.mjs +1 -1
- package/dist/nitro/v3/plugin.mjs.map +1 -1
- package/dist/nitro/v3/useLogger.d.mts +1 -1
- package/dist/nitro/v3/useLogger.mjs.map +1 -1
- package/dist/{nitro-CDHLfRdw.d.mts → nitro-CPPRCPbG.d.mts} +2 -2
- package/dist/{nitro-CDHLfRdw.d.mts.map → nitro-CPPRCPbG.d.mts.map} +1 -1
- package/dist/nuxt/module.d.mts +1 -1
- package/dist/nuxt/module.mjs +1 -1
- package/dist/{parseError-DM-lyezZ.d.mts → parseError-o1GpZEOR.d.mts} +2 -2
- package/dist/parseError-o1GpZEOR.d.mts.map +1 -0
- package/dist/pipeline.mjs.map +1 -1
- package/dist/react-router/index.d.mts +2 -2
- package/dist/react-router/index.mjs +2 -2
- package/dist/runtime/client/log.d.mts +1 -1
- package/dist/runtime/client/log.mjs +2 -2
- package/dist/runtime/client/log.mjs.map +1 -1
- package/dist/runtime/client/plugin.mjs.map +1 -1
- package/dist/runtime/server/routes/_evlog/ingest.post.mjs +1 -1
- package/dist/runtime/server/routes/_evlog/ingest.post.mjs.map +1 -1
- package/dist/runtime/server/useLogger.d.mts +1 -1
- package/dist/runtime/server/useLogger.mjs.map +1 -1
- package/dist/runtime/utils/parseError.d.mts +2 -2
- package/dist/source-location-DRvDDqfq.mjs.map +1 -1
- package/dist/sveltekit/index.d.mts +2 -2
- package/dist/sveltekit/index.mjs +2 -2
- package/dist/sveltekit/index.mjs.map +1 -1
- package/dist/toolkit.d.mts +3 -3
- package/dist/toolkit.mjs +2 -2
- package/dist/types.d.mts +2 -2
- package/dist/{useLogger-N5A-d5l9.d.mts → useLogger-CyPP1sVB.d.mts} +2 -2
- package/dist/{useLogger-N5A-d5l9.d.mts.map → useLogger-CyPP1sVB.d.mts.map} +1 -1
- package/dist/{utils-DnX6VMNi.d.mts → utils-Dmin7wVL.d.mts} +4 -3
- package/dist/utils-Dmin7wVL.d.mts.map +1 -0
- package/dist/utils.d.mts +2 -2
- package/dist/utils.mjs +7 -1
- package/dist/utils.mjs.map +1 -1
- package/dist/vite/index.d.mts +1 -1
- package/dist/vite/index.mjs.map +1 -1
- package/dist/workers.d.mts +48 -4
- package/dist/workers.d.mts.map +1 -1
- package/dist/workers.mjs +32 -5
- package/dist/workers.mjs.map +1 -1
- package/package.json +17 -21
- package/dist/_http-CHSsrWDJ.mjs.map +0 -1
- package/dist/logger-DnobymUQ.mjs.map +0 -1
- package/dist/logger-Dp6nYWjH.d.mts.map +0 -1
- package/dist/parseError-DM-lyezZ.d.mts.map +0 -1
- package/dist/types-DbzDln7O.d.mts.map +0 -1
- package/dist/utils-DnX6VMNi.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
|
package/dist/utils.mjs.map
CHANGED
|
@@ -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"}
|
package/dist/vite/index.d.mts
CHANGED
package/dist/vite/index.mjs.map
CHANGED
|
@@ -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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"}
|
package/dist/workers.d.mts
CHANGED
|
@@ -1,6 +1,13 @@
|
|
|
1
|
-
import {
|
|
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
|
package/dist/workers.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workers.d.mts","names":[],"sources":["../src/workers/index.ts"],"mappings":";;;;;
|
|
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 {
|
|
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
|
package/dist/workers.mjs.map
CHANGED
|
@@ -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":";;
|
|
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.
|
|
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.
|
|
322
|
+
"@tanstack/start-client-core": "^1.167.20",
|
|
323
323
|
"acorn": "^8.16.0",
|
|
324
|
-
"@codspeed/vitest-plugin": "^5.
|
|
325
|
-
"@nestjs/common": "^11.1.
|
|
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.
|
|
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.
|
|
335
|
+
"fastify": "^5.8.5",
|
|
336
336
|
"h3": "^1.15.11",
|
|
337
|
-
"happy-dom": "^20.
|
|
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.
|
|
342
|
+
"react-router": "^7.14.2",
|
|
343
343
|
"supertest": "^7.2.2",
|
|
344
|
-
"tsdown": "^0.21.
|
|
344
|
+
"tsdown": "^0.21.10",
|
|
345
345
|
"magic-string": "^0.30.21",
|
|
346
|
-
"typescript": "^6.0.
|
|
347
|
-
"vite": "^8.0.
|
|
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.
|
|
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.
|
|
363
|
-
"@nestjs/common": ">=11.1.
|
|
364
|
-
"react-router": ">=7.14.
|
|
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.
|
|
367
|
-
"@tanstack/start-client-core": "^1.167.
|
|
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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"logger-DnobymUQ.mjs","names":[],"sources":["../src/redact.ts","../src/logger.ts"],"sourcesContent":["import type { RedactConfig } from './types'\n\nconst DEFAULT_REPLACEMENT = '[REDACTED]'\n\nexport type Masker = [RegExp, (match: string) => string]\n\n/**\n * Built-in PII detection patterns with smart masking.\n * Each builtin preserves just enough signal for debugging while scrubbing PII.\n */\nexport const builtinPatterns = {\n /** Credit card numbers → ****1111 (PCI DSS: last 4 allowed) */\n creditCard: {\n pattern: /\\b\\d{4}[\\s-]?\\d{4}[\\s-]?\\d{4}[\\s-]?\\d{4}\\b/g,\n mask: (m: string) => `****${m.replace(/[\\s-]/g, '').slice(-4)}`,\n },\n /** Email addresses → a***@***.com */\n email: {\n pattern: /[\\w.+-]+@[\\w-]+\\.[\\w.]+/g,\n mask: (m: string) => {\n const at = m.indexOf('@')\n if (at < 1) return '***@***'\n const tld = m.slice(m.lastIndexOf('.'))\n return `${m[0]}***@***${tld}`\n },\n },\n /** IPv4 addresses → ***.***.***.100 (last octet only) */\n ipv4: {\n pattern: /\\b(?!0\\.0\\.0\\.0\\b)(?!127\\.0\\.0\\.1\\b)\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\b/g,\n mask: (m: string) => `***.***.***.${m.split('.').pop()}`,\n },\n /** International phone numbers → +33******78 (country code + last 2 digits) */\n phone: {\n pattern: /(?:\\+\\d{1,3}[\\s.-]?)?\\(?\\d{1,4}\\)?[\\s.-]?\\d{2,4}[\\s.-]?\\d{2,4}[\\s.-]?\\d{2,4}\\b/g,\n mask: (m: string) => {\n const digits = m.replace(/[^\\d]/g, '')\n const hasPlus = m.startsWith('+')\n if (hasPlus && digits.length > 4) {\n const ccMatch = m.match(/^\\+\\d{1,3}/)\n const cc = ccMatch ? ccMatch[0] : '+'\n return `${cc}******${digits.slice(-2)}`\n }\n if (digits.length > 2) {\n return `${'*'.repeat(digits.length - 2)}${digits.slice(-2)}`\n }\n return '***'\n },\n },\n /** JWT tokens → eyJ***.*** */\n jwt: {\n pattern: /\\beyJ[\\w-]*\\.[\\w-]*\\.[\\w-]*\\b/g,\n mask: () => 'eyJ***.***',\n },\n /** Bearer tokens → Bearer *** */\n bearer: {\n pattern: /\\bBearer\\s+[\\w\\-.~+/]{8,}=*/gi,\n mask: () => 'Bearer ***',\n },\n /** IBAN → FR76****189 (country + check digits + last 3) */\n iban: {\n pattern: /\\b[A-Z]{2}\\d{2}[\\s-]?[\\dA-Z]{4}[\\s-]?[\\dA-Z]{4}[\\s-]?[\\dA-Z]{4}[\\s-]?[\\dA-Z]{0,4}[\\s-]?[\\dA-Z]{0,4}[\\s-]?[\\dA-Z]{0,4}\\b/g,\n mask: (m: string) => {\n const clean = m.replace(/[\\s-]/g, '')\n return `${clean.slice(0, 4)}****${clean.slice(-3)}`\n },\n },\n} as const\n\nexport type BuiltinPatternName = keyof typeof builtinPatterns\n\n/**\n * Resolve a `redact` option (boolean or object) into a concrete `RedactConfig`.\n *\n * - `true` → all built-in patterns with smart masking, no custom paths\n * - `{ ... }` → built-in maskers merged with user config (opt-out: `builtins: false`)\n * - `false` / `undefined` → `undefined` (no redaction)\n */\nexport function resolveRedactConfig(input: boolean | RedactConfig | undefined): RedactConfig | undefined {\n if (input === undefined || input === false) return undefined\n\n if (input === true) {\n return { _maskers: allBuiltinMaskers() }\n }\n\n if (input.builtins === false) {\n return input\n }\n\n const maskers = Array.isArray(input.builtins)\n ? input.builtins\n .map(name => builtinPatterns[name])\n .filter(Boolean)\n .map(b => [cloneRegex(b.pattern), b.mask] as Masker)\n : allBuiltinMaskers()\n\n return {\n ...input,\n _maskers: maskers,\n }\n}\n\nfunction allBuiltinMaskers(): Masker[] {\n return Object.values(builtinPatterns).map(b => [cloneRegex(b.pattern), b.mask] as Masker)\n}\n\nfunction cloneRegex(re: RegExp): RegExp {\n return new RegExp(re.source, re.flags)\n}\n\n/**\n * Redact sensitive data from a wide event in-place.\n *\n * Three strategies applied in order:\n * 1. **Path-based**: dot-notation paths — the leaf value is replaced with `replacement`.\n * 2. **Masker-based**: built-in patterns with smart partial masking (e.g. `****1111`).\n * 3. **Pattern-based**: custom RegExp patterns replaced with `replacement`.\n *\n * @param event - The wide event object (mutated in-place).\n * @param config - Redaction configuration.\n */\nexport function redactEvent(event: Record<string, unknown>, config: RedactConfig): void {\n const replacement = config.replacement ?? DEFAULT_REPLACEMENT\n\n if (config.paths?.length) {\n for (const path of config.paths) {\n redactPath(event, path.split('.'), replacement)\n }\n }\n\n if (config._maskers?.length) {\n applyMaskersToTree(event, config._maskers)\n }\n\n if (config.patterns?.length) {\n redactPatterns(event, config.patterns, replacement)\n }\n}\n\nfunction redactPath(obj: Record<string, unknown>, segments: string[], replacement: string): void {\n let current: unknown = obj\n for (let i = 0; i < segments.length - 1; i++) {\n if (current === null || current === undefined || typeof current !== 'object') return\n current = (current as Record<string, unknown>)[segments[i]!]\n }\n\n if (current === null || current === undefined || typeof current !== 'object') return\n\n const leaf = segments[segments.length - 1]!\n if (leaf in (current as Record<string, unknown>)) {\n (current as Record<string, unknown>)[leaf] = replacement\n }\n}\n\nfunction redactPatterns(obj: unknown, patterns: RegExp[], replacement: string): void {\n if (obj === null || obj === undefined) return\n\n if (Array.isArray(obj)) {\n for (let i = 0; i < obj.length; i++) {\n if (typeof obj[i] === 'string') {\n obj[i] = applyPatterns(obj[i] as string, patterns, replacement)\n } else if (typeof obj[i] === 'object') {\n redactPatterns(obj[i], patterns, replacement)\n }\n }\n return\n }\n\n if (typeof obj === 'object') {\n const record = obj as Record<string, unknown>\n for (const key in record) {\n const val = record[key]\n if (typeof val === 'string') {\n record[key] = applyPatterns(val, patterns, replacement)\n } else if (typeof val === 'object') {\n redactPatterns(val, patterns, replacement)\n }\n }\n }\n}\n\nfunction applyPatterns(value: string, patterns: RegExp[], replacement: string): string {\n let result = value\n for (const pattern of patterns) {\n pattern.lastIndex = 0\n result = result.replace(pattern, replacement)\n }\n return result\n}\n\nfunction applyMaskersToTree(obj: unknown, maskers: Masker[]): void {\n if (obj === null || obj === undefined) return\n\n if (Array.isArray(obj)) {\n for (let i = 0; i < obj.length; i++) {\n if (typeof obj[i] === 'string') {\n obj[i] = applyMaskers(obj[i] as string, maskers)\n } else if (typeof obj[i] === 'object') {\n applyMaskersToTree(obj[i], maskers)\n }\n }\n return\n }\n\n if (typeof obj === 'object') {\n const record = obj as Record<string, unknown>\n for (const key in record) {\n const val = record[key]\n if (typeof val === 'string') {\n record[key] = applyMaskers(val, maskers)\n } else if (typeof val === 'object') {\n applyMaskersToTree(val, maskers)\n }\n }\n }\n}\n\nfunction applyMaskers(value: string, maskers: Masker[]): string {\n let result = value\n for (const [pattern, mask] of maskers) {\n pattern.lastIndex = 0\n result = result.replace(pattern, mask)\n }\n return result\n}\n\n/**\n * Normalize a redact config that may have been deserialized from JSON\n * (e.g. via `process.env.__EVLOG_CONFIG`). Converts pattern strings\n * back to RegExp instances, then resolves built-in patterns.\n */\nexport function normalizeRedactConfig(raw: boolean | Record<string, unknown> | undefined): RedactConfig | undefined {\n if (raw === undefined || raw === false) return undefined\n if (raw === true) return resolveRedactConfig(true)\n\n const config: RedactConfig = {}\n\n if (Array.isArray(raw.paths)) {\n config.paths = raw.paths as string[]\n }\n\n if (typeof raw.replacement === 'string') {\n config.replacement = raw.replacement\n }\n\n if (raw.builtins === false) {\n config.builtins = false\n } else if (Array.isArray(raw.builtins)) {\n config.builtins = raw.builtins as BuiltinPatternName[]\n }\n\n if (Array.isArray(raw.patterns)) {\n config.patterns = (raw.patterns as unknown[]).map((p) => {\n if (p instanceof RegExp) return p\n if (typeof p === 'string') return new RegExp(p, 'g')\n if (typeof p === 'object' && p !== null) {\n const obj = p as Record<string, string>\n return new RegExp(obj.source, obj.flags ?? 'g')\n }\n return null\n }).filter((p): p is RegExp => p !== null)\n }\n\n return resolveRedactConfig(config)\n}\n","import type { DrainContext, EnvironmentContext, FieldContext, Log, LogLevel, LoggerConfig, RedactConfig, RequestLogger, RequestLoggerOptions, SamplingConfig, TailSamplingContext, WideEvent } from './types'\nimport { redactEvent, resolveRedactConfig } from './redact'\nimport { colors, cssColors, detectEnvironment, escapeFormatString, formatDuration, getConsoleMethod, getCssLevelColor, getLevelColor, isClient, isDev, isLevelEnabled, matchesPattern } from './utils'\n\nfunction isPlainObject(val: unknown): val is Record<string, unknown> {\n return val !== null && typeof val === 'object' && !Array.isArray(val)\n}\n\nconst _tsDate = new Date()\nfunction isoNow(): string {\n _tsDate.setTime(Date.now())\n return _tsDate.toISOString()\n}\n\n/** Shown after post-emit warnings so users can fix fire-and-forget / ALS continuations. */\nconst POST_EMIT_FORK_HINT =\n 'For intentional background work tied to this request, use log.fork(\\'label\\', fn) when your integration supports it (see https://evlog.dev).'\n\nfunction warnPostEmit(method: string, detail: string): void {\n console.warn(\n `[evlog] ${method} called after the wide event was emitted — ${detail} This data will not appear in observability. ${POST_EMIT_FORK_HINT}`,\n )\n}\n\nfunction mergeInto(target: Record<string, unknown>, source: Record<string, unknown>): void {\n for (const key in source) {\n const sourceVal = source[key]\n if (sourceVal === undefined || sourceVal === null) continue\n const targetVal = target[key]\n if (isPlainObject(sourceVal) && isPlainObject(targetVal)) {\n mergeInto(targetVal, sourceVal)\n } else if (Array.isArray(targetVal) && Array.isArray(sourceVal)) {\n target[key] = [...targetVal, ...sourceVal]\n } else {\n target[key] = sourceVal\n }\n }\n}\n\nlet globalEnv: EnvironmentContext = {\n service: 'app',\n environment: 'development',\n}\n\nlet globalPretty = isDev()\nlet globalSampling: SamplingConfig = {}\nlet globalStringify = true\nlet globalDrain: ((ctx: DrainContext) => void | Promise<void>) | undefined\nlet globalRedact: RedactConfig | undefined\nlet globalEnabled = true\nlet globalSilent = false\n/** Minimum level for the global `log` API only (`ownsEvent === false`). Default: all levels. */\nlet globalMinLevel: LogLevel = 'debug'\nlet _locked = false\n\n/**\n * Initialize the logger with configuration.\n * Call this once at application startup.\n */\nexport function initLogger(config: LoggerConfig = {}): void {\n globalEnabled = config.enabled ?? true\n const detected = detectEnvironment()\n\n globalEnv = {\n service: config.env?.service ?? detected.service ?? 'app',\n environment: config.env?.environment ?? detected.environment ?? 'development',\n version: config.env?.version ?? detected.version,\n commitHash: config.env?.commitHash ?? detected.commitHash,\n region: config.env?.region ?? detected.region,\n }\n\n globalPretty = config.pretty ?? isDev()\n globalSampling = config.sampling ?? {}\n globalStringify = config.stringify ?? true\n globalDrain = config.drain\n globalRedact = resolveRedactConfig(config.redact ?? !isDev())\n globalSilent = config.silent ?? false\n globalMinLevel = config.minLevel ?? 'debug'\n\n if (globalSilent && !globalDrain && !config._suppressDrainWarning) {\n console.warn('[evlog] silent mode is enabled but no drain is configured. Events will be built and sampled but not output anywhere. Set a drain via initLogger({ drain }) or a framework hook (evlog:drain).')\n }\n}\n\n/**\n * Check if logging is globally enabled.\n */\nexport function isEnabled(): boolean {\n return globalEnabled\n}\n\n/**\n * @internal Lock the logger to prevent re-initialization.\n * Called by instrumentation register() after setting up the logger with drain.\n * Prevents configureHandler() from overwriting the drain config.\n */\nexport function lockLogger(): void {\n _locked = true\n}\n\n/**\n * @internal Check if the logger has been locked by instrumentation.\n */\nexport function isLoggerLocked(): boolean {\n return _locked\n}\n\n/**\n * @internal Get the globally configured drain callback.\n * Used by framework middleware to fall back to the global drain\n * when no middleware-level drain is provided.\n */\nexport function getGlobalDrain(): ((ctx: DrainContext) => void | Promise<void>) | undefined {\n return globalDrain\n}\n\n/**\n * Determine if a log at the given level should be emitted based on sampling config.\n * Error level defaults to 100% (always logged) unless explicitly configured otherwise.\n */\nfunction shouldSample(level: LogLevel): boolean {\n const { rates } = globalSampling\n if (!rates) {\n return true // No sampling configured, log everything\n }\n\n // Error defaults to 100% unless explicitly set\n const percentage = level === 'error' && rates.error === undefined\n ? 100\n : rates[level] ?? 100\n\n // 0% = never log, 100% = always log\n if (percentage <= 0) return false\n if (percentage >= 100) return true\n\n return Math.random() * 100 < percentage\n}\n\n/**\n * Evaluate tail sampling conditions to determine if a log should be force-kept.\n * Returns true if ANY condition matches (OR logic).\n */\nexport function shouldKeep(ctx: TailSamplingContext): boolean {\n const { keep } = globalSampling\n if (!keep?.length) return false\n\n return keep.some((condition) => {\n if (condition.status !== undefined && ctx.status !== undefined && ctx.status >= condition.status) {\n return true\n }\n if (condition.duration !== undefined && ctx.duration !== undefined && ctx.duration >= condition.duration) {\n return true\n }\n if (condition.path && ctx.path && matchesPattern(ctx.path, condition.path)) {\n return true\n }\n return false\n })\n}\n\nfunction emitWideEvent(level: LogLevel, event: Record<string, unknown>, deferDrain = false, ownsEvent = false): WideEvent | null {\n if (!globalEnabled) return null\n\n if (!ownsEvent) {\n if (!isLevelEnabled(level, globalMinLevel)) {\n return null\n }\n if (!shouldSample(level)) {\n return null\n }\n }\n\n let formatted: WideEvent\n if (ownsEvent) {\n event.timestamp = isoNow()\n event.level = level\n if (event.service === undefined) event.service = globalEnv.service\n if (event.environment === undefined) event.environment = globalEnv.environment\n if (globalEnv.version !== undefined && event.version === undefined) event.version = globalEnv.version\n if (globalEnv.commitHash !== undefined && event.commitHash === undefined) event.commitHash = globalEnv.commitHash\n if (globalEnv.region !== undefined && event.region === undefined) event.region = globalEnv.region\n formatted = event as WideEvent\n } else {\n formatted = {\n timestamp: isoNow(),\n level,\n ...globalEnv,\n ...event,\n }\n }\n\n if (globalRedact) {\n redactEvent(formatted, globalRedact)\n }\n\n if (!globalSilent) {\n if (globalPretty) {\n prettyPrintWideEvent(formatted)\n } else if (globalStringify) {\n console[getConsoleMethod(level)](JSON.stringify(formatted))\n } else {\n console[getConsoleMethod(level)](formatted)\n }\n }\n\n if (globalDrain && !deferDrain) {\n Promise.resolve(globalDrain({ event: formatted })).catch((err) => {\n console.error('[evlog] drain failed:', err)\n })\n }\n\n return formatted\n}\n\nfunction emitTaggedLog(level: LogLevel, tag: string, message: string): void {\n if (!globalEnabled) return\n\n if (globalPretty && !globalSilent) {\n if (!isLevelEnabled(level, globalMinLevel)) {\n return\n }\n if (!shouldSample(level)) {\n return\n }\n\n if (isClient()) {\n const levelColor = getCssLevelColor(level)\n const timestamp = isoNow().slice(11, 23)\n console.log(\n `%c${timestamp}%c %c[${escapeFormatString(tag)}]%c ${escapeFormatString(message)}`,\n cssColors.dim,\n cssColors.reset,\n levelColor,\n cssColors.reset,\n )\n } else {\n const color = getLevelColor(level)\n const timestamp = isoNow().slice(11, 23)\n console.log(`${colors.dim}${timestamp}${colors.reset} ${color}[${tag}]${colors.reset} ${message}`)\n }\n\n return\n }\n emitWideEvent(level, { tag, message })\n}\n\nfunction formatValue(value: unknown): string {\n if (value === null || value === undefined) {\n return String(value)\n }\n if (typeof value === 'object') {\n const pairs: string[] = []\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n if (v !== undefined && v !== null) {\n if (typeof v === 'object') {\n pairs.push(`${k}=${JSON.stringify(v)}`)\n } else {\n pairs.push(`${k}=${v}`)\n }\n }\n }\n return pairs.join(' ')\n }\n return String(value)\n}\n\nfunction formatCost(cost: number): string {\n if (cost < 0.01) return `$${cost.toFixed(6)}`\n if (cost < 1) return `$${cost.toFixed(4)}`\n return `$${cost.toFixed(2)}`\n}\n\ninterface TreeEntry {\n key: string\n value: string\n children?: string[]\n}\n\nfunction buildAIEntries(ai: Record<string, unknown>): TreeEntry[] {\n const entries: TreeEntry[] = []\n\n // Header\n const headerParts: string[] = []\n if (ai.model) {\n let m = String(ai.model)\n if (ai.provider) m += ` (${ai.provider})`\n headerParts.push(m)\n }\n if (ai.calls) headerParts.push(`${ai.calls} call${(ai.calls as number) > 1 ? 's' : ''}`)\n if (ai.steps && (ai.steps as number) > 1) headerParts.push(`${ai.steps} steps`)\n entries.push({ key: 'ai', value: headerParts.join(' · ') })\n\n // Tokens\n const inputTokens = ai.inputTokens as number | undefined\n const outputTokens = ai.outputTokens as number | undefined\n const totalTokens = ai.totalTokens as number | undefined\n if (inputTokens !== undefined && outputTokens !== undefined) {\n let tokLine = `${inputTokens} in → ${outputTokens} out`\n if (totalTokens) tokLine += ` (${totalTokens} total)`\n const extras: string[] = []\n if (ai.cacheReadTokens) extras.push(`${ai.cacheReadTokens} cache read`)\n if (ai.cacheWriteTokens) extras.push(`${ai.cacheWriteTokens} cache write`)\n if (ai.reasoningTokens) extras.push(`${ai.reasoningTokens} reasoning`)\n if (extras.length) tokLine += ` · ${extras.join(' · ')}`\n entries.push({ key: 'ai.tokens', value: tokLine })\n }\n\n // Streaming\n const msFirst = ai.msToFirstChunk as number | undefined\n const msFinish = ai.msToFinish as number | undefined\n const tps = ai.tokensPerSecond as number | undefined\n if (msFirst !== undefined || msFinish !== undefined) {\n const parts: string[] = []\n if (msFirst !== undefined) parts.push(`${formatDuration(msFirst)} to first chunk`)\n if (msFinish !== undefined) parts.push(`${formatDuration(msFinish)} total`)\n let streamLine = parts.join(' → ')\n if (tps) streamLine += ` · ${tps} tok/s`\n entries.push({ key: 'ai.streaming', value: streamLine })\n }\n\n // Cost\n if (ai.estimatedCost !== undefined) {\n entries.push({ key: 'ai.cost', value: formatCost(ai.estimatedCost as number) })\n }\n\n // Total duration\n if (ai.totalDurationMs !== undefined) {\n entries.push({ key: 'ai.totalDuration', value: formatDuration(ai.totalDurationMs as number) })\n }\n\n // Tools — merged from toolCalls (middleware) + tools (telemetry)\n const toolCalls = ai.toolCalls as unknown[] | undefined\n const tools = ai.tools as Array<{ name: string, durationMs: number, success: boolean, error?: string }> | undefined\n const hasInputs = toolCalls?.length ? typeof toolCalls[0] === 'object' : false\n\n if (tools?.length) {\n const children = tools.map((t, idx) => {\n const mark = t.success ? '✓' : '✗'\n let line = `${t.name} ${formatDuration(t.durationMs)} ${mark}`\n if (t.error) line += ` ${t.error}`\n if (hasInputs && toolCalls && idx < toolCalls.length) {\n const tc = toolCalls[idx] as { input: unknown }\n const inputStr = typeof tc.input === 'string' ? tc.input : JSON.stringify(tc.input)\n const truncated = inputStr.length > 100 ? `${inputStr.slice(0, 100)}…` : inputStr\n line += ` ${truncated}`\n }\n return line\n })\n entries.push({ key: 'ai.tools', value: '', children })\n } else if (toolCalls?.length) {\n if (hasInputs) {\n const children = (toolCalls as Array<{ name: string, input: unknown }>).map((tc) => {\n const inputStr = typeof tc.input === 'string' ? tc.input : JSON.stringify(tc.input)\n const truncated = inputStr.length > 100 ? `${inputStr.slice(0, 100)}…` : inputStr\n return `${tc.name}(${truncated})`\n })\n entries.push({ key: 'ai.tools', value: '', children })\n } else {\n entries.push({ key: 'ai.tools', value: (toolCalls as string[]).join(', ') })\n }\n }\n\n // Steps\n const stepsUsage = ai.stepsUsage as Array<Record<string, unknown>> | undefined\n if (stepsUsage?.length) {\n const allSameModel = stepsUsage.every(s => s.model === stepsUsage[0]!.model)\n const children = stepsUsage.map((s) => {\n const prefix = allSameModel ? '' : `${s.model} `\n let line = `${prefix}${s.inputTokens} in → ${s.outputTokens} out`\n const stepTools = s.toolCalls as string[] | undefined\n if (stepTools?.length) line += ` [${stepTools.join(', ')}]`\n return line\n })\n entries.push({ key: 'ai.steps', value: '', children })\n } else if (ai.steps && (ai.steps as number) > 1) {\n entries.push({ key: 'ai.steps', value: String(ai.steps) })\n }\n\n // Embedding\n const embedding = ai.embedding as Record<string, unknown> | undefined\n if (embedding) {\n const parts: string[] = []\n if (embedding.model) parts.push(String(embedding.model))\n parts.push(`${embedding.tokens} tokens`)\n if (embedding.dimensions) parts.push(`${embedding.dimensions}d`)\n if (embedding.count) parts.push(`${embedding.count} items`)\n entries.push({ key: 'ai.embedding', value: parts.join(' · ') })\n }\n\n if (ai.finishReason) entries.push({ key: 'ai.finishReason', value: String(ai.finishReason) })\n if (ai.error) entries.push({ key: 'ai.error', value: String(ai.error) })\n if (ai.responseId) entries.push({ key: 'ai.responseId', value: String(ai.responseId) })\n\n return entries\n}\n\nfunction prettyPrintWideEvent(event: Record<string, unknown>): void {\n const { timestamp, level, service, environment, version, ...rest } = event\n const ts = (timestamp as string).slice(11, 23)\n const browser = isClient()\n\n const parts: string[] = []\n const styles: string[] = []\n\n if (browser) {\n const lc = getCssLevelColor(level as string)\n parts.push(`%c${ts}%c %c${(level as string).toUpperCase()}%c %c[${escapeFormatString(String(service))}]%c`)\n styles.push(cssColors.dim, cssColors.reset, lc, cssColors.reset, cssColors.cyan, cssColors.reset)\n } else {\n const lc = getLevelColor(level as string)\n parts.push(`${colors.dim}${ts}${colors.reset} ${lc}${(level as string).toUpperCase()}${colors.reset} ${colors.cyan}[${service}]${colors.reset}`)\n }\n\n if (rest.method && rest.path) {\n parts.push(browser ? ` ${escapeFormatString(String(rest.method))} ${escapeFormatString(String(rest.path))}` : ` ${rest.method} ${rest.path}`)\n delete rest.method\n delete rest.path\n }\n\n if (rest.status) {\n const sc = browser\n ? ((rest.status as number) >= 400 ? cssColors.red : cssColors.green)\n : ((rest.status as number) >= 400 ? colors.red : colors.green)\n if (browser) {\n parts.push(` %c${rest.status}%c`)\n styles.push(sc, cssColors.reset)\n } else {\n parts.push(` ${sc}${rest.status}${colors.reset}`)\n }\n delete rest.status\n }\n\n if (rest.duration) {\n if (browser) {\n parts.push(` %c${escapeFormatString(`in ${rest.duration}`)}%c`)\n styles.push(cssColors.dim, cssColors.reset)\n } else {\n parts.push(` ${colors.dim}in ${rest.duration}${colors.reset}`)\n }\n delete rest.duration\n }\n\n console.log(parts.join(''), ...styles)\n\n const aiData = rest.ai as Record<string, unknown> | undefined\n if (aiData && typeof aiData === 'object') {\n delete rest.ai\n }\n\n const restEntries = Object.entries(rest).filter(([_, v]) => v !== undefined)\n const aiEntries = aiData ? buildAIEntries(aiData) : []\n const allEntries: TreeEntry[] = [\n ...restEntries.map(([key, value]) => ({ key, value: formatValue(value) })),\n ...aiEntries,\n ]\n\n for (let i = 0; i < allEntries.length; i++) {\n const entry = allEntries[i]!\n const hasChildren = entry.children && entry.children.length > 0\n const isLast = i === allEntries.length - 1 && !hasChildren\n const prefix = isLast ? '└─' : '├─'\n\n if (browser) {\n const val = entry.value ? ` ${escapeFormatString(entry.value)}` : ''\n console.log(` %c${prefix}%c %c${escapeFormatString(entry.key)}:%c${val}`, cssColors.dim, cssColors.reset, cssColors.cyan, cssColors.reset)\n } else {\n const val = entry.value ? ` ${entry.value}` : ''\n console.log(` ${colors.dim}${prefix}${colors.reset} ${colors.cyan}${entry.key}:${colors.reset}${val}`)\n }\n\n if (hasChildren) {\n const isLastEntry = i === allEntries.length - 1\n const connector = isLastEntry ? ' ' : '│'\n for (let j = 0; j < entry.children!.length; j++) {\n const child = entry.children![j]!\n const isLastChild = j === entry.children!.length - 1\n const childPrefix = isLastChild ? '└─' : '├─'\n if (browser) {\n console.log(` %c${connector} ${childPrefix}%c ${escapeFormatString(child)}`, cssColors.dim, cssColors.reset)\n } else {\n console.log(` ${colors.dim}${connector} ${childPrefix}${colors.reset} ${child}`)\n }\n }\n }\n }\n}\n\nfunction createLogMethod(level: LogLevel) {\n return function logMethod(tagOrEvent: string | Record<string, unknown>, message?: string): void {\n if (typeof tagOrEvent === 'string' && message !== undefined) {\n emitTaggedLog(level, tagOrEvent, message)\n } else if (typeof tagOrEvent === 'object') {\n emitWideEvent(level, tagOrEvent)\n } else {\n emitTaggedLog(level, 'log', String(tagOrEvent))\n }\n }\n}\n\n/**\n * Simple logging API - as easy as console.log\n *\n * @example\n * ```ts\n * log.info('auth', 'User logged in')\n * log.error({ action: 'payment', error: 'failed' })\n * ```\n */\nconst _log: Log = {\n info: createLogMethod('info'),\n error: createLogMethod('error'),\n warn: createLogMethod('warn'),\n debug: createLogMethod('debug'),\n}\n\nexport { _log as log }\n\nconst noopLogger: RequestLogger = {\n set() {},\n error() {},\n info() {},\n warn() {},\n emit() {\n return null\n },\n getContext() {\n return {}\n },\n}\n\n/**\n * @internal Options for createLogger that are not part of the public API.\n */\ninterface CreateLoggerInternalOptions {\n /**\n * When true, the global drain is skipped on emit.\n * Used by framework middleware that runs its own enrich+drain pipeline.\n */\n _deferDrain?: boolean\n}\n\n/**\n * Create a scoped logger for building wide events.\n * Use this for any context: workflows, jobs, scripts, queues, etc.\n *\n * After `emit()` (including when sampling returns `null`), the logger is sealed and\n * further mutations log `[evlog]` warnings. Standalone loggers do not have `fork`;\n * that method is only attached by supported framework integrations.\n *\n * @example\n * ```ts\n * const log = createLogger({ jobId: job.id, queue: 'emails' })\n * log.set({ batch: { size: 50, processed: 12 } })\n * log.emit()\n * ```\n */\nexport function createLogger<T extends object = Record<string, unknown>>(initialContext: Record<string, unknown> = {}, internalOptions?: CreateLoggerInternalOptions): RequestLogger<T> {\n if (!globalEnabled) return noopLogger as RequestLogger<T>\n\n const deferDrain = internalOptions?._deferDrain ?? false\n const startTime = Date.now()\n const context: Record<string, unknown> = { ...initialContext }\n let hasError = false\n let hasWarn = false\n let emitted = false\n\n function addLog(level: 'info' | 'warn', message: string): void {\n if (!Array.isArray(context.requestLogs)) {\n context.requestLogs = []\n }\n (context.requestLogs as unknown[]).push({\n level,\n message,\n timestamp: isoNow(),\n })\n }\n\n return {\n set(data: FieldContext<T>): void {\n if (emitted) {\n const keys = Object.keys(data as Record<string, unknown>)\n warnPostEmit('log.set()', `Keys dropped: ${keys.length ? keys.join(', ') : '(empty)'}.`)\n return\n }\n mergeInto(context, data as Record<string, unknown>)\n },\n\n error(error: Error | string, errorContext?: FieldContext<T>): void {\n if (emitted) {\n const keys = errorContext\n ? [...Object.keys(errorContext as Record<string, unknown>), 'error']\n : ['error']\n warnPostEmit('log.error()', `Keys dropped: ${keys.join(', ')}.`)\n return\n }\n hasError = true\n const err = typeof error === 'string' ? new Error(error) : error\n\n if (errorContext) {\n mergeInto(context, errorContext as Record<string, unknown>)\n }\n\n const errorObj: Record<string, unknown> = {\n name: err.name,\n message: err.message,\n stack: err.stack,\n }\n const errRecord = err as unknown as Record<string, unknown>\n for (const k of ['status', 'statusText', 'statusCode', 'statusMessage', 'data', 'cause', 'internal'] as const) {\n if (k in err) errorObj[k] = errRecord[k]\n }\n\n if (isPlainObject(context.error)) {\n mergeInto(context.error as Record<string, unknown>, errorObj)\n } else {\n context.error = errorObj\n }\n },\n\n info(message: string, infoContext?: FieldContext<T>): void {\n if (emitted) {\n const keys = infoContext\n ? ['message', ...Object.keys(infoContext as Record<string, unknown>).filter(k => k !== 'requestLogs')]\n : ['message']\n warnPostEmit('log.info()', `Keys dropped: ${keys.join(', ')}.`)\n return\n }\n addLog('info', message)\n if (infoContext) {\n const { requestLogs: _, ...rest } = infoContext as Record<string, unknown>\n mergeInto(context, rest)\n }\n },\n\n warn(message: string, warnContext?: FieldContext<T>): void {\n if (emitted) {\n const keys = warnContext\n ? ['message', ...Object.keys(warnContext as Record<string, unknown>).filter(k => k !== 'requestLogs')]\n : ['message']\n warnPostEmit('log.warn()', `Keys dropped: ${keys.join(', ')}.`)\n return\n }\n hasWarn = true\n addLog('warn', message)\n if (warnContext) {\n const { requestLogs: _, ...rest } = warnContext as Record<string, unknown>\n mergeInto(context, rest)\n }\n },\n\n emit(overrides?: FieldContext<T> & { _forceKeep?: boolean }): WideEvent | null {\n if (emitted) {\n warnPostEmit('log.emit()', 'Ignoring duplicate emit.')\n return null\n }\n\n const durationMs = Date.now() - startTime\n const level: LogLevel = hasError ? 'error' : hasWarn ? 'warn' : 'info'\n\n let forceKeep = false\n if (overrides?._forceKeep) {\n forceKeep = true\n } else if (globalSampling.keep?.length) {\n const status = (overrides as Record<string, unknown> | undefined)?.status ?? context.status\n forceKeep = shouldKeep({\n status: status as number | undefined,\n duration: durationMs,\n path: context.path as string | undefined,\n method: context.method as string | undefined,\n context,\n })\n }\n\n if (!forceKeep && !shouldSample(level)) {\n emitted = true\n return null\n }\n\n if (overrides) {\n const obj = overrides as Record<string, unknown>\n for (const key in obj) {\n if (key !== '_forceKeep') context[key] = obj[key]\n }\n }\n context.duration = formatDuration(durationMs)\n\n const wide = emitWideEvent(level, context, deferDrain, true)\n emitted = true\n return wide\n },\n\n getContext(): FieldContext<T> & Record<string, unknown> {\n return { ...context } as FieldContext<T> & Record<string, unknown>\n },\n }\n}\n\n/**\n * Create a request-scoped logger for building wide events.\n * Convenience wrapper around `createLogger` that pre-populates HTTP request fields.\n *\n * @example\n * ```ts\n * const log = createRequestLogger({ method: 'POST', path: '/checkout' })\n * log.set({ user: { id: '123' } })\n * log.set({ cart: { items: 3 } })\n * log.emit()\n * ```\n */\nexport function createRequestLogger<T extends object = Record<string, unknown>>(options: RequestLoggerOptions = {}, internalOptions?: CreateLoggerInternalOptions): RequestLogger<T> {\n const initial: Record<string, unknown> = {}\n if (options.method !== undefined) initial.method = options.method\n if (options.path !== undefined) initial.path = options.path\n if (options.requestId !== undefined) initial.requestId = options.requestId\n return createLogger<T>(initial, internalOptions)\n}\n\n/**\n * Get the current environment context.\n */\nexport function getEnvironment(): EnvironmentContext {\n return { ...globalEnv }\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\ndeclare const __EVLOG_CONFIG__: import('./types').LoggerConfig | undefined\n\nif (typeof __EVLOG_CONFIG__ !== 'undefined') initLogger(__EVLOG_CONFIG__)\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"logger-Dp6nYWjH.d.mts","names":[],"sources":["../src/logger.ts"],"mappings":";;;;;AA2DA;;iBAAgB,UAAA,CAAW,MAAA,GAAQ,YAAA;;;AA4BnC;iBAAgB,SAAA,CAAA;;;;AAShB;;iBAAgB,UAAA,CAAA;;;AAOhB;iBAAgB,cAAA,CAAA;;;;AAShB;;iBAAgB,cAAA,CAAA,KAAoB,GAAA,EAAK,YAAA,YAAwB,OAAA;;;;;iBA8BjD,UAAA,CAAW,GAAA,EAAK,mBAAA;;AAAhC;;;;;AAgBC;;;cA8VK,IAAA,EAAM,GAAA;AAOU;;;AAAA,UAkBZ,2BAAA;EAKG;AAkBb;;;EAlBE,WAAA;AAAA;;;;;;;;;;;;;;;;iBAkBc,YAAA,oBAAgC,MAAA,kBAAA,CAAyB,cAAA,GAAgB,MAAA,mBAA8B,eAAA,GAAkB,2BAAA,GAA8B,aAAA,CAAc,CAAA;;;;;;;;;;;;;iBAyJrK,mBAAA,oBAAuC,MAAA,kBAAA,CAAyB,OAAA,GAAS,oBAAA,EAA2B,eAAA,GAAkB,2BAAA,GAA8B,aAAA,CAAc,CAAA;;;;iBAWlK,cAAA,CAAA,GAAkB,kBAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"parseError-DM-lyezZ.d.mts","names":[],"sources":["../src/runtime/utils/parseError.ts"],"mappings":";;;iBAMgB,UAAA,CAAW,KAAA,YAAiB,WAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types-DbzDln7O.d.mts","names":[],"sources":["../src/types.ts"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|