evlog 2.14.0 → 2.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +49 -19
- package/dist/adapters/axiom.d.mts +18 -27
- package/dist/adapters/axiom.d.mts.map +1 -1
- package/dist/adapters/axiom.mjs +40 -30
- package/dist/adapters/axiom.mjs.map +1 -1
- package/dist/adapters/better-stack.d.mts +11 -24
- package/dist/adapters/better-stack.d.mts.map +1 -1
- package/dist/adapters/better-stack.mjs +34 -29
- package/dist/adapters/better-stack.mjs.map +1 -1
- package/dist/adapters/datadog.d.mts +1 -1
- package/dist/adapters/datadog.d.mts.map +1 -1
- package/dist/adapters/datadog.mjs +10 -4
- package/dist/adapters/datadog.mjs.map +1 -1
- package/dist/adapters/fs.d.mts +2 -2
- package/dist/adapters/fs.d.mts.map +1 -1
- package/dist/adapters/fs.mjs +19 -7
- package/dist/adapters/fs.mjs.map +1 -1
- package/dist/adapters/hyperdx.d.mts +1 -1
- package/dist/adapters/hyperdx.mjs +1 -2
- package/dist/adapters/hyperdx.mjs.map +1 -1
- package/dist/adapters/otlp.d.mts +1 -1
- package/dist/adapters/otlp.d.mts.map +1 -1
- package/dist/adapters/otlp.mjs +36 -31
- package/dist/adapters/otlp.mjs.map +1 -1
- package/dist/adapters/posthog.d.mts +50 -70
- package/dist/adapters/posthog.d.mts.map +1 -1
- package/dist/adapters/posthog.mjs +50 -85
- package/dist/adapters/posthog.mjs.map +1 -1
- package/dist/adapters/sentry.d.mts +1 -1
- package/dist/adapters/sentry.d.mts.map +1 -1
- package/dist/adapters/sentry.mjs +15 -5
- package/dist/adapters/sentry.mjs.map +1 -1
- package/dist/ai/index.d.mts +1 -1
- package/dist/{audit-d9esRZOK.mjs → audit--n0QRR2Y.mjs} +202 -20
- package/dist/audit--n0QRR2Y.mjs.map +1 -0
- package/dist/{audit-mUutdf6A.d.mts → audit-CJl-wZ10.d.mts} +144 -2
- package/dist/audit-CJl-wZ10.d.mts.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/define-D6OJdSUH.mjs +63 -0
- package/dist/define-D6OJdSUH.mjs.map +1 -0
- package/dist/define-Fp8TrdEB.d.mts +57 -0
- package/dist/define-Fp8TrdEB.d.mts.map +1 -0
- package/dist/{dist-Do8P4zWd.mjs → dist-BIlS38vi.mjs} +1 -1
- package/dist/dist-BIlS38vi.mjs.map +1 -0
- package/dist/drain-ByWUeOQC.mjs +160 -0
- package/dist/drain-ByWUeOQC.mjs.map +1 -0
- package/dist/elysia/index.d.mts +25 -2
- package/dist/elysia/index.d.mts.map +1 -1
- package/dist/elysia/index.mjs +53 -20
- package/dist/elysia/index.mjs.map +1 -1
- package/dist/enricher-BA6viylF.mjs +95 -0
- package/dist/enricher-BA6viylF.mjs.map +1 -0
- package/dist/enricher-CLSnrzrr.d.mts +42 -0
- package/dist/enricher-CLSnrzrr.d.mts.map +1 -0
- package/dist/enrichers.d.mts +16 -9
- package/dist/enrichers.d.mts.map +1 -1
- package/dist/enrichers.mjs +81 -64
- package/dist/enrichers.mjs.map +1 -1
- package/dist/{error-D1FZI2Kd.d.mts → error-C-66_G2M.d.mts} +2 -2
- package/dist/{error-D1FZI2Kd.d.mts.map → error-C-66_G2M.d.mts.map} +1 -1
- package/dist/error.d.mts +1 -1
- package/dist/{errors-BJRXUfMg.mjs → errors-BQgyQ9xe.mjs} +1 -1
- package/dist/{errors-BJRXUfMg.mjs.map → errors-BQgyQ9xe.mjs.map} +1 -1
- package/dist/{errors-NIXCyk6I.d.mts → errors-DQoYsDW1.d.mts} +2 -2
- package/dist/{errors-NIXCyk6I.d.mts.map → errors-DQoYsDW1.d.mts.map} +1 -1
- package/dist/event-ef-5Dbxg.mjs +53 -0
- package/dist/event-ef-5Dbxg.mjs.map +1 -0
- package/dist/express/index.d.mts +2 -2
- package/dist/express/index.d.mts.map +1 -1
- package/dist/express/index.mjs +17 -15
- package/dist/express/index.mjs.map +1 -1
- package/dist/fastify/index.d.mts +2 -2
- package/dist/fastify/index.d.mts.map +1 -1
- package/dist/fastify/index.mjs +19 -20
- package/dist/fastify/index.mjs.map +1 -1
- package/dist/fork-D44V93-K.mjs +227 -0
- package/dist/fork-D44V93-K.mjs.map +1 -0
- package/dist/{headers-D74M0wsg.mjs → headers-CU-QqnYg.mjs} +19 -2
- package/dist/headers-CU-QqnYg.mjs.map +1 -0
- package/dist/hono/index.d.mts +2 -2
- package/dist/hono/index.d.mts.map +1 -1
- package/dist/hono/index.mjs +14 -10
- package/dist/hono/index.mjs.map +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 +8 -7
- package/dist/index.mjs +3 -2
- package/dist/integration-Bz8X6_Lb.mjs +75 -0
- package/dist/integration-Bz8X6_Lb.mjs.map +1 -0
- package/dist/{logger-b3epPH0N.d.mts → logger-Brt5-WMK.d.mts} +28 -3
- package/dist/logger-Brt5-WMK.d.mts.map +1 -0
- package/dist/logger.d.mts +2 -2
- package/dist/logger.mjs +2 -2
- package/dist/middleware-CGM-bOvE.d.mts +72 -0
- package/dist/middleware-CGM-bOvE.d.mts.map +1 -0
- package/dist/nestjs/index.d.mts +2 -2
- package/dist/nestjs/index.mjs +3 -4
- package/dist/nestjs/index.mjs.map +1 -1
- package/dist/next/client.d.mts +1 -1
- package/dist/next/index.d.mts +4 -4
- package/dist/next/index.mjs +3 -3
- 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 +2 -2
- package/dist/nitro/errorHandler.mjs.map +1 -1
- package/dist/nitro/module.d.mts +2 -2
- package/dist/nitro/plugin.mjs +21 -11
- package/dist/nitro/plugin.mjs.map +1 -1
- package/dist/nitro/v3/errorHandler.mjs +3 -3
- 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 +29 -17
- 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-DenB86W6.d.mts → nitro-DHPb9dXG.d.mts} +2 -2
- package/dist/{nitro-DenB86W6.d.mts.map → nitro-DHPb9dXG.d.mts.map} +1 -1
- package/dist/{nitro-OmT_M4Pb.mjs → nitro-DavLelNz.mjs} +2 -2
- package/dist/nitro-DavLelNz.mjs.map +1 -0
- package/dist/{nitroConfigBridge-C37lXaNm.mjs → nitroConfigBridge-aZ1e5upQ.mjs} +1 -1
- package/dist/nitroConfigBridge-aZ1e5upQ.mjs.map +1 -0
- package/dist/nuxt/module.d.mts +1 -1
- package/dist/nuxt/module.mjs +2 -2
- package/dist/{parseError-BR9pocvY.d.mts → parseError-B1zJZvQ5.d.mts} +2 -2
- package/dist/parseError-B1zJZvQ5.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 +3 -4
- package/dist/react-router/index.mjs.map +1 -1
- package/dist/{routes-CGPmbzCZ.mjs → routes-B48wm7Pb.mjs} +1 -1
- package/dist/{routes-CGPmbzCZ.mjs.map → routes-B48wm7Pb.mjs.map} +1 -1
- 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 +21 -10
- 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/runtime/utils/parseError.mjs +1 -1
- package/dist/{_severity-CQijvfhU.mjs → severity-BYWZ96Sb.mjs} +6 -2
- package/dist/severity-BYWZ96Sb.mjs.map +1 -0
- package/dist/{source-location-DRvDDqfq.mjs → source-location-Dco0cRTz.mjs} +3 -3
- package/dist/source-location-Dco0cRTz.mjs.map +1 -0
- package/dist/storage-BT-3fT1-.mjs +27 -0
- package/dist/storage-BT-3fT1-.mjs.map +1 -0
- package/dist/sveltekit/index.d.mts +2 -2
- package/dist/sveltekit/index.mjs +5 -6
- package/dist/sveltekit/index.mjs.map +1 -1
- package/dist/toolkit.d.mts +288 -12
- package/dist/toolkit.d.mts.map +1 -1
- package/dist/toolkit.mjs +13 -7
- package/dist/types.d.mts +1 -1
- package/dist/{useLogger-C56tDPwf.d.mts → useLogger-Cb1R6bQE.d.mts} +2 -2
- package/dist/{useLogger-C56tDPwf.d.mts.map → useLogger-Cb1R6bQE.d.mts.map} +1 -1
- package/dist/{utils-DzGCLRFe.d.mts → utils-gQCeZMbg.d.mts} +4 -3
- package/dist/utils-gQCeZMbg.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 +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 +38 -39
- package/dist/_drain-CmCtsuF6.mjs +0 -23
- package/dist/_drain-CmCtsuF6.mjs.map +0 -1
- package/dist/_http-CHSsrWDJ.mjs +0 -71
- package/dist/_http-CHSsrWDJ.mjs.map +0 -1
- package/dist/_severity-CQijvfhU.mjs.map +0 -1
- package/dist/audit-d9esRZOK.mjs.map +0 -1
- package/dist/audit-mUutdf6A.d.mts.map +0 -1
- package/dist/dist-Do8P4zWd.mjs.map +0 -1
- package/dist/fork-CTJXnpl8.mjs +0 -72
- package/dist/fork-CTJXnpl8.mjs.map +0 -1
- package/dist/headers-D74M0wsg.mjs.map +0 -1
- package/dist/logger-b3epPH0N.d.mts.map +0 -1
- package/dist/middleware-BWOJ7JI0.mjs +0 -123
- package/dist/middleware-BWOJ7JI0.mjs.map +0 -1
- package/dist/middleware-BYf26Lfu.d.mts +0 -93
- package/dist/middleware-BYf26Lfu.d.mts.map +0 -1
- package/dist/nitro-OmT_M4Pb.mjs.map +0 -1
- package/dist/nitroConfigBridge-C37lXaNm.mjs.map +0 -1
- package/dist/parseError-BR9pocvY.d.mts.map +0 -1
- package/dist/source-location-DRvDDqfq.mjs.map +0 -1
- package/dist/storage-CFGTn37X.mjs +0 -46
- package/dist/storage-CFGTn37X.mjs.map +0 -1
- package/dist/utils-DzGCLRFe.d.mts.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../../src/sveltekit/index.ts"],"sourcesContent":["import type { RequestLogger } from '../types'\nimport { createMiddlewareLogger, type BaseEvlogOptions } from '../shared/middleware'\nimport { attachForkToLogger } from '../shared/fork'\nimport { extractSafeHeaders } from '../shared/headers'\nimport { createLoggerStorage } from '../shared/storage'\nimport { resolveEvlogError, extractErrorStatus, serializeEvlogErrorResponse } from '../nitro'\nimport { EvlogError } from '../error'\n\nconst { storage, useLogger } = createLoggerStorage(\n 'handle context. Make sure evlog() handle is added to your hooks.server.ts.',\n)\n\nexport type EvlogSvelteKitOptions = BaseEvlogOptions\n\nexport { useLogger }\n\n/**\n * SvelteKit `Handle` function signature — avoids a hard dependency on `@sveltejs/kit`.\n */\ntype SvelteKitHandle = (input: {\n event: { request: Request; url: URL; locals: Record<string, any> }\n resolve: (event: any) => Promise<Response>\n}) => Promise<Response>\n\n/**\n * SvelteKit `HandleServerError` signature — avoids a hard dependency on `@sveltejs/kit`.\n */\ntype SvelteKitHandleServerError = (input: {\n error: unknown\n event: { request: Request; url: URL; locals: Record<string, any> }\n status: number\n message: string\n}) => MaybePromise<void | AppError>\n\ntype MaybePromise<T> = T | Promise<T>\n\n/** Minimal SvelteKit `App.Error` shape */\ninterface AppError {\n message: string\n [key: string]: unknown\n}\n\n/**\n * Create an evlog handle hook for SvelteKit.\n *\n * Add it to your `src/hooks.server.ts` using SvelteKit's `sequence` helper\n * or as the sole handle export.\n *\n * @example\n * ```ts\n * // src/hooks.server.ts\n * import { initLogger } from 'evlog'\n * import { evlog } from 'evlog/sveltekit'\n * import { createAxiomDrain } from 'evlog/axiom'\n *\n * initLogger({ env: { service: 'my-sveltekit-app' } })\n *\n * export const handle = evlog({\n * drain: createAxiomDrain(),\n * enrich: (ctx) => {\n * ctx.event.region = process.env.FLY_REGION\n * },\n * })\n * ```\n *\n * @example\n * ```ts\n * // Compose with other hooks using sequence\n * import { sequence } from '@sveltejs/kit/hooks'\n * import { evlog } from 'evlog/sveltekit'\n *\n * export const handle = sequence(evlog(), yourOtherHook)\n * ```\n */\nexport function evlog(options: EvlogSvelteKitOptions = {}): SvelteKitHandle {\n return async ({ event, resolve }) => {\n const middlewareOpts = {\n method: event.request.method,\n path: event.url.pathname,\n requestId: event.request.headers.get('x-request-id') || crypto.randomUUID(),\n headers: extractSafeHeaders(event.request.headers),\n ...options,\n }\n const { logger, finish, skipped } = createMiddlewareLogger(middlewareOpts)\n\n if (skipped) {\n return await resolve(event)\n }\n\n attachForkToLogger(storage, logger, middlewareOpts)\n event.locals.log = logger\n\n return storage.run(logger, async () => {\n try {\n const response = await resolve(event)\n\n // SvelteKit catches route errors internally and returns 500.\n // If handleError already logged an EvlogError with a specific status,\n // return a structured JSON response instead of SvelteKit's generic 500.\n const ctx = logger.getContext()\n const errorData = ctx.error as { name?: string; status?: number; message?: string; data?: unknown } | undefined\n if (response.status >= 500 && errorData?.name === 'EvlogError' && errorData.status) {\n const { status } = errorData\n await finish({ status })\n const body = serializeEvlogErrorResponse(errorData as EvlogError, event.url.pathname)\n return new Response(JSON.stringify(body), {\n status,\n headers: { 'content-type': 'application/json' },\n })\n }\n\n await finish({ status: response.status })\n return response\n } catch (error) {\n await finish({ error: error as Error })\n\n // Return structured JSON for EvlogError (like NextJS withEvlog / Nuxt errorHandler)\n if (error instanceof EvlogError) {\n const status = error.status ?? 500\n const body = serializeEvlogErrorResponse(error, event.url.pathname)\n return new Response(JSON.stringify(body), {\n status,\n headers: { 'content-type': 'application/json' },\n })\n }\n\n throw error\n }\n })\n }\n}\n\n/**\n * Create an evlog error handler for SvelteKit.\n *\n * Logs unhandled errors via `event.locals.log` (if available) and returns\n * structured error responses for `EvlogError` instances. For non-evlog errors,\n * returns a generic error response with sanitized messages in production.\n *\n * @example\n * ```ts\n * // src/hooks.server.ts\n * import { evlog, evlogHandleError } from 'evlog/sveltekit'\n *\n * export const handle = evlog()\n * export const handleError = evlogHandleError()\n * ```\n */\nexport function evlogHandleError(): SvelteKitHandleServerError {\n return ({ error, event, status, message }) => {\n const logger = event.locals.log as RequestLogger | undefined\n\n if (logger && error instanceof Error) {\n logger.error(error)\n }\n\n const evlogError = error instanceof Error ? resolveEvlogError(error) : null\n\n if (evlogError) {\n const errorStatus = extractErrorStatus(evlogError)\n const response = serializeEvlogErrorResponse(evlogError, event.url.pathname)\n return {\n message: response.message as string,\n status: errorStatus,\n why: (response.data as { why?: string })?.why,\n fix: (response.data as { fix?: string })?.fix,\n link: (response.data as { link?: string })?.link,\n } as AppError\n }\n\n return { message, status } as AppError\n }\n}\n\n/**\n * Create both `handle` and `handleError` hooks in a single call.\n *\n * This is the recommended setup for SvelteKit — it returns both hooks\n * pre-configured and ready to export from `hooks.server.ts`.\n *\n * @example\n * ```ts\n * // src/hooks.server.ts\n * import { initLogger } from 'evlog'\n * import { createEvlogHooks } from 'evlog/sveltekit'\n * import { createAxiomDrain } from 'evlog/axiom'\n *\n * initLogger({ env: { service: 'my-app' } })\n *\n * export const { handle, handleError } = createEvlogHooks({\n * drain: createAxiomDrain(),\n * enrich: (ctx) => {\n * ctx.event.region = process.env.FLY_REGION\n * },\n * })\n * ```\n *\n * @example\n * ```ts\n * // Compose with other hooks using sequence\n * import { sequence } from '@sveltejs/kit/hooks'\n * import { createEvlogHooks } from 'evlog/sveltekit'\n *\n * const evlogHooks = createEvlogHooks()\n *\n * export const handle = sequence(evlogHooks.handle, yourOtherHook)\n * export const handleError = evlogHooks.handleError\n * ```\n */\nexport function createEvlogHooks(options: EvlogSvelteKitOptions = {}) {\n return {\n handle: evlog(options),\n handleError: evlogHandleError(),\n }\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../../src/sveltekit/index.ts"],"sourcesContent":["import type { RequestLogger } from '../types'\nimport { createMiddlewareLogger, type BaseEvlogOptions } from '../shared/middleware'\nimport { attachForkToLogger } from '../shared/fork'\nimport { extractSafeHeaders } from '../shared/headers'\nimport { createLoggerStorage } from '../shared/storage'\nimport { resolveEvlogError, extractErrorStatus, serializeEvlogErrorResponse } from '../nitro'\nimport { EvlogError } from '../error'\n\nconst { storage, useLogger } = createLoggerStorage(\n 'handle context. Make sure evlog() handle is added to your hooks.server.ts.',\n)\n\nexport type EvlogSvelteKitOptions = BaseEvlogOptions\n\nexport { useLogger }\n\n/**\n * SvelteKit `Handle` function signature — avoids a hard dependency on `@sveltejs/kit`.\n */\ntype SvelteKitHandle = (input: {\n event: { request: Request; url: URL; locals: Record<string, any> }\n resolve: (event: any) => Promise<Response>\n}) => Promise<Response>\n\n/**\n * SvelteKit `HandleServerError` signature — avoids a hard dependency on `@sveltejs/kit`.\n */\ntype SvelteKitHandleServerError = (input: {\n error: unknown\n event: { request: Request; url: URL; locals: Record<string, any> }\n status: number\n message: string\n}) => MaybePromise<void | AppError>\n\ntype MaybePromise<T> = T | Promise<T>\n\n/** Minimal SvelteKit `App.Error` shape */\ninterface AppError {\n message: string\n [key: string]: unknown\n}\n\n/**\n * Create an evlog handle hook for SvelteKit.\n *\n * Add it to your `src/hooks.server.ts` using SvelteKit's `sequence` helper\n * or as the sole handle export.\n *\n * @example\n * ```ts\n * // src/hooks.server.ts\n * import { initLogger } from 'evlog'\n * import { evlog } from 'evlog/sveltekit'\n * import { createAxiomDrain } from 'evlog/axiom'\n *\n * initLogger({ env: { service: 'my-sveltekit-app' } })\n *\n * export const handle = evlog({\n * drain: createAxiomDrain(),\n * enrich: (ctx) => {\n * ctx.event.region = process.env.FLY_REGION\n * },\n * })\n * ```\n *\n * @example\n * ```ts\n * // Compose with other hooks using sequence\n * import { sequence } from '@sveltejs/kit/hooks'\n * import { evlog } from 'evlog/sveltekit'\n *\n * export const handle = sequence(evlog(), yourOtherHook)\n * ```\n */\nexport function evlog(options: EvlogSvelteKitOptions = {}): SvelteKitHandle {\n return async ({ event, resolve }) => {\n const middlewareOpts = {\n method: event.request.method,\n path: event.url.pathname,\n requestId: event.request.headers.get('x-request-id') || crypto.randomUUID(),\n headers: extractSafeHeaders(event.request.headers),\n ...options,\n }\n const { logger, finish, skipped } = createMiddlewareLogger(middlewareOpts)\n\n if (skipped) {\n return await resolve(event)\n }\n\n attachForkToLogger(storage, logger, middlewareOpts)\n event.locals.log = logger\n\n return storage.run(logger, async () => {\n try {\n const response = await resolve(event)\n\n // SvelteKit catches route errors internally and returns 500.\n // If handleError already logged an EvlogError with a specific status,\n // return a structured JSON response instead of SvelteKit's generic 500.\n const ctx = logger.getContext()\n const errorData = ctx.error as { name?: string; status?: number; message?: string; data?: unknown } | undefined\n if (response.status >= 500 && errorData?.name === 'EvlogError' && errorData.status) {\n const { status } = errorData\n await finish({ status })\n const body = serializeEvlogErrorResponse(errorData as EvlogError, event.url.pathname)\n return new Response(JSON.stringify(body), {\n status,\n headers: { 'content-type': 'application/json' },\n })\n }\n\n await finish({ status: response.status })\n return response\n } catch (error) {\n await finish({ error: error as Error })\n\n // Return structured JSON for EvlogError (like NextJS withEvlog / Nuxt errorHandler)\n if (error instanceof EvlogError) {\n const status = error.status ?? 500\n const body = serializeEvlogErrorResponse(error, event.url.pathname)\n return new Response(JSON.stringify(body), {\n status,\n headers: { 'content-type': 'application/json' },\n })\n }\n\n throw error\n }\n })\n }\n}\n\n/**\n * Create an evlog error handler for SvelteKit.\n *\n * Logs unhandled errors via `event.locals.log` (if available) and returns\n * structured error responses for `EvlogError` instances. For non-evlog errors,\n * returns a generic error response with sanitized messages in production.\n *\n * @example\n * ```ts\n * // src/hooks.server.ts\n * import { evlog, evlogHandleError } from 'evlog/sveltekit'\n *\n * export const handle = evlog()\n * export const handleError = evlogHandleError()\n * ```\n */\nexport function evlogHandleError(): SvelteKitHandleServerError {\n return ({ error, event, status, message }) => {\n const logger = event.locals.log as RequestLogger | undefined\n\n if (logger && error instanceof Error) {\n logger.error(error)\n }\n\n const evlogError = error instanceof Error ? resolveEvlogError(error) : null\n\n if (evlogError) {\n const errorStatus = extractErrorStatus(evlogError)\n const response = serializeEvlogErrorResponse(evlogError, event.url.pathname)\n return {\n message: response.message as string,\n status: errorStatus,\n why: (response.data as { why?: string })?.why,\n fix: (response.data as { fix?: string })?.fix,\n link: (response.data as { link?: string })?.link,\n } as AppError\n }\n\n return { message, status } as AppError\n }\n}\n\n/**\n * Create both `handle` and `handleError` hooks in a single call.\n *\n * This is the recommended setup for SvelteKit — it returns both hooks\n * pre-configured and ready to export from `hooks.server.ts`.\n *\n * @example\n * ```ts\n * // src/hooks.server.ts\n * import { initLogger } from 'evlog'\n * import { createEvlogHooks } from 'evlog/sveltekit'\n * import { createAxiomDrain } from 'evlog/axiom'\n *\n * initLogger({ env: { service: 'my-app' } })\n *\n * export const { handle, handleError } = createEvlogHooks({\n * drain: createAxiomDrain(),\n * enrich: (ctx) => {\n * ctx.event.region = process.env.FLY_REGION\n * },\n * })\n * ```\n *\n * @example\n * ```ts\n * // Compose with other hooks using sequence\n * import { sequence } from '@sveltejs/kit/hooks'\n * import { createEvlogHooks } from 'evlog/sveltekit'\n *\n * const evlogHooks = createEvlogHooks()\n *\n * export const handle = sequence(evlogHooks.handle, yourOtherHook)\n * export const handleError = evlogHooks.handleError\n * ```\n */\nexport function createEvlogHooks(options: EvlogSvelteKitOptions = {}) {\n return {\n handle: evlog(options),\n handleError: evlogHandleError(),\n }\n}\n"],"mappings":";;;;;;;AAQA,MAAM,EAAE,SAAS,cAAc,oBAC7B,6EACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgED,SAAgB,MAAM,UAAiC,EAAE,EAAmB;AAC1E,QAAO,OAAO,EAAE,OAAO,cAAc;EACnC,MAAM,iBAAiB;GACrB,QAAQ,MAAM,QAAQ;GACtB,MAAM,MAAM,IAAI;GAChB,WAAW,MAAM,QAAQ,QAAQ,IAAI,eAAe,IAAI,OAAO,YAAY;GAC3E,SAAS,mBAAmB,MAAM,QAAQ,QAAQ;GAClD,GAAG;GACJ;EACD,MAAM,EAAE,QAAQ,QAAQ,YAAY,uBAAuB,eAAe;AAE1E,MAAI,QACF,QAAO,MAAM,QAAQ,MAAM;AAG7B,qBAAmB,SAAS,QAAQ,eAAe;AACnD,QAAM,OAAO,MAAM;AAEnB,SAAO,QAAQ,IAAI,QAAQ,YAAY;AACrC,OAAI;IACF,MAAM,WAAW,MAAM,QAAQ,MAAM;IAMrC,MAAM,YADM,OAAO,YACE,CAAC;AACtB,QAAI,SAAS,UAAU,OAAO,WAAW,SAAS,gBAAgB,UAAU,QAAQ;KAClF,MAAM,EAAE,WAAW;AACnB,WAAM,OAAO,EAAE,QAAQ,CAAC;KACxB,MAAM,OAAO,4BAA4B,WAAyB,MAAM,IAAI,SAAS;AACrF,YAAO,IAAI,SAAS,KAAK,UAAU,KAAK,EAAE;MACxC;MACA,SAAS,EAAE,gBAAgB,oBAAoB;MAChD,CAAC;;AAGJ,UAAM,OAAO,EAAE,QAAQ,SAAS,QAAQ,CAAC;AACzC,WAAO;YACA,OAAO;AACd,UAAM,OAAO,EAAS,OAAgB,CAAC;AAGvC,QAAI,iBAAiB,YAAY;KAC/B,MAAM,SAAS,MAAM,UAAU;KAC/B,MAAM,OAAO,4BAA4B,OAAO,MAAM,IAAI,SAAS;AACnE,YAAO,IAAI,SAAS,KAAK,UAAU,KAAK,EAAE;MACxC;MACA,SAAS,EAAE,gBAAgB,oBAAoB;MAChD,CAAC;;AAGJ,UAAM;;IAER;;;;;;;;;;;;;;;;;;;AAoBN,SAAgB,mBAA+C;AAC7D,SAAQ,EAAE,OAAO,OAAO,QAAQ,cAAc;EAC5C,MAAM,SAAS,MAAM,OAAO;AAE5B,MAAI,UAAU,iBAAiB,MAC7B,QAAO,MAAM,MAAM;EAGrB,MAAM,aAAa,iBAAiB,QAAQ,kBAAkB,MAAM,GAAG;AAEvE,MAAI,YAAY;GACd,MAAM,cAAc,mBAAmB,WAAW;GAClD,MAAM,WAAW,4BAA4B,YAAY,MAAM,IAAI,SAAS;AAC5E,UAAO;IACL,SAAS,SAAS;IAClB,QAAQ;IACR,KAAM,SAAS,MAA2B;IAC1C,KAAM,SAAS,MAA2B;IAC1C,MAAO,SAAS,MAA4B;IAC7C;;AAGH,SAAO;GAAE;GAAS;GAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuC9B,SAAgB,iBAAiB,UAAiC,EAAE,EAAE;AACpE,QAAO;EACL,QAAQ,MAAM,QAAQ;EACtB,aAAa,kBAAkB;EAChC"}
|
package/dist/toolkit.d.mts
CHANGED
|
@@ -1,8 +1,158 @@
|
|
|
1
|
-
import { Y as RequestLogger } from "./audit-
|
|
2
|
-
import { a as
|
|
3
|
-
import { n as
|
|
1
|
+
import { F as DrainContext, I as EnrichContext, W as LogLevel, Y as RequestLogger, at as ClientLogContext, ct as PluginSetupContext, dt as createPluginRunner, ft as definePlugin, ht as getEmptyPluginRunner, it as WideEvent, lt as RequestFinishContext, mt as enricherPlugin, nt as TailSamplingContext, ot as EvlogPlugin, pt as drainPlugin, st as PluginRunner, ut as RequestLifecycleContext } from "./audit-CJl-wZ10.mjs";
|
|
2
|
+
import { a as resolveMiddlewarePluginRunner, i as createMiddlewareLogger, n as MiddlewareLoggerOptions, o as runEnrichAndDrain, r as MiddlewareLoggerResult, t as BaseEvlogOptions } from "./middleware-CGM-bOvE.mjs";
|
|
3
|
+
import { i as toMiddlewareOptions, n as defineEvlog, r as toLoggerConfig, t as EvlogConfig } from "./define-Fp8TrdEB.mjs";
|
|
4
|
+
import { n as EnricherOptions, r as defineEnricher, t as EnricherDefinition } from "./enricher-CLSnrzrr.mjs";
|
|
5
|
+
import { n as getServiceForPath, r as shouldLog, t as extractErrorStatus } from "./errors-DQoYsDW1.mjs";
|
|
4
6
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
5
7
|
|
|
8
|
+
//#region src/shared/compose.d.ts
|
|
9
|
+
/**
|
|
10
|
+
* Compose enricher callbacks into one. Runs in registration order; errors are
|
|
11
|
+
* caught per-callback so one buggy enricher never blocks the others.
|
|
12
|
+
*/
|
|
13
|
+
declare function composeEnrichers(enrichers: Array<(ctx: EnrichContext) => void | Promise<void>>, options?: {
|
|
14
|
+
name?: string;
|
|
15
|
+
}): (ctx: EnrichContext) => Promise<void>;
|
|
16
|
+
/**
|
|
17
|
+
* Fan out to multiple drains concurrently (`Promise.allSettled`). A slow
|
|
18
|
+
* Sentry drain never blocks an Axiom drain on the same event.
|
|
19
|
+
*/
|
|
20
|
+
declare function composeDrains(drains: Array<(ctx: DrainContext) => void | Promise<void>>, options?: {
|
|
21
|
+
name?: string;
|
|
22
|
+
}): (ctx: DrainContext) => Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* Compose tail-sampling `keep` callbacks. `ctx.shouldKeep` is true after the
|
|
25
|
+
* run if any callback set it. Errors are isolated.
|
|
26
|
+
*/
|
|
27
|
+
declare function composeKeep(keepers: Array<(ctx: TailSamplingContext) => void | Promise<void>>, options?: {
|
|
28
|
+
name?: string;
|
|
29
|
+
}): (ctx: TailSamplingContext) => Promise<void>;
|
|
30
|
+
/** Merge plugin lists. Later registrations override earlier ones by `name`. */
|
|
31
|
+
declare function composePlugins(...lists: Array<EvlogPlugin[] | undefined>): EvlogPlugin[];
|
|
32
|
+
//#endregion
|
|
33
|
+
//#region src/shared/config.d.ts
|
|
34
|
+
/** Read the full Nitro `useRuntimeConfig()` record (or `undefined` outside Nitro). */
|
|
35
|
+
declare function getRuntimeConfig(): Promise<Record<string, any> | undefined>;
|
|
36
|
+
/**
|
|
37
|
+
* Description of a single adapter config field. `env` is the ordered list of
|
|
38
|
+
* environment variables to fall back to, e.g. `['NUXT_AXIOM_TOKEN', 'AXIOM_TOKEN']`.
|
|
39
|
+
*/
|
|
40
|
+
interface ConfigField<T> {
|
|
41
|
+
key: keyof T & string;
|
|
42
|
+
env?: string[];
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Resolve adapter configuration with the standard priority chain:
|
|
46
|
+
*
|
|
47
|
+
* 1. `overrides` passed to the drain factory
|
|
48
|
+
* 2. `runtimeConfig.evlog.{namespace}.{key}` (Nitro)
|
|
49
|
+
* 3. `runtimeConfig.{namespace}.{key}` (Nitro)
|
|
50
|
+
* 4. `process.env[envKey]` for each env in `field.env`
|
|
51
|
+
*/
|
|
52
|
+
declare function resolveAdapterConfig<T>(namespace: string, fields: ConfigField<T>[], overrides?: Partial<T>): Promise<Partial<T>>;
|
|
53
|
+
//#endregion
|
|
54
|
+
//#region src/shared/drain.d.ts
|
|
55
|
+
/**
|
|
56
|
+
* Drain definition backed by an arbitrary `send` function. Use this for
|
|
57
|
+
* non-HTTP transports (filesystem, in-memory queue, native SDK). For HTTP
|
|
58
|
+
* backends, use `defineHttpDrain` instead.
|
|
59
|
+
*/
|
|
60
|
+
interface DrainOptions<TConfig> {
|
|
61
|
+
/** Stable identifier used in error logs. */
|
|
62
|
+
name: string;
|
|
63
|
+
/** Return `null` to skip draining (e.g. missing API key in dev). */
|
|
64
|
+
resolve: () => TConfig | null | Promise<TConfig | null>;
|
|
65
|
+
send: (events: WideEvent[], config: TConfig) => Promise<void>;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Build a drain callback. Errors raised by `send` are logged with the drain
|
|
69
|
+
* name and swallowed, so a failing drain never breaks the request pipeline.
|
|
70
|
+
*
|
|
71
|
+
* @example
|
|
72
|
+
* ```ts
|
|
73
|
+
* export function createMyDrain(overrides?: Partial<MyConfig>) {
|
|
74
|
+
* return defineDrain<MyConfig>({
|
|
75
|
+
* name: 'my-drain',
|
|
76
|
+
* resolve: () => ({ url: process.env.MY_URL ?? null }),
|
|
77
|
+
* send: async (events, config) => { ... },
|
|
78
|
+
* })
|
|
79
|
+
* }
|
|
80
|
+
* ```
|
|
81
|
+
*/
|
|
82
|
+
declare function defineDrain<TConfig>(options: DrainOptions<TConfig>): (ctx: DrainContext | DrainContext[]) => Promise<void>;
|
|
83
|
+
interface HttpDrainRequest {
|
|
84
|
+
url: string;
|
|
85
|
+
/** Caller is responsible for `Content-Type`. */
|
|
86
|
+
headers: Record<string, string>;
|
|
87
|
+
body: string;
|
|
88
|
+
}
|
|
89
|
+
/** Adapters only need to ship config + `encode()` — no manual `fetch`. */
|
|
90
|
+
interface HttpDrainOptions<TConfig> {
|
|
91
|
+
/** Stable identifier used in error logs. */
|
|
92
|
+
name: string;
|
|
93
|
+
/** Return `null` to skip draining (e.g. missing API key in dev). */
|
|
94
|
+
resolve: () => TConfig | null | Promise<TConfig | null>;
|
|
95
|
+
/** Return `null` to skip the batch without raising. */
|
|
96
|
+
encode: (events: WideEvent[], config: TConfig) => HttpDrainRequest | null;
|
|
97
|
+
/** @default 5000 */
|
|
98
|
+
timeout?: number;
|
|
99
|
+
/** @default 2 */
|
|
100
|
+
retries?: number;
|
|
101
|
+
/** Read the timeout off the resolved config (falls back to `timeout`). */
|
|
102
|
+
resolveTimeout?: (config: TConfig) => number | undefined;
|
|
103
|
+
/** Read the retry count off the resolved config (falls back to `retries`). */
|
|
104
|
+
resolveRetries?: (config: TConfig) => number | undefined;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Build an HTTP drain. Timeouts/retries are resolved from the config (with
|
|
108
|
+
* overrides via `resolveTimeout` / `resolveRetries`) and forwarded to
|
|
109
|
+
* {@link httpPost}.
|
|
110
|
+
*
|
|
111
|
+
* @example
|
|
112
|
+
* ```ts
|
|
113
|
+
* export function createMyDrain(overrides?: Partial<MyConfig>) {
|
|
114
|
+
* return defineHttpDrain<MyConfig>({
|
|
115
|
+
* name: 'my',
|
|
116
|
+
* resolve: async () => {
|
|
117
|
+
* const cfg = await resolveAdapterConfig<MyConfig>('my', FIELDS, overrides)
|
|
118
|
+
* return cfg.apiKey ? cfg as MyConfig : null
|
|
119
|
+
* },
|
|
120
|
+
* encode: (events, config) => ({
|
|
121
|
+
* url: `${config.endpoint ?? 'https://api.my.com'}/ingest`,
|
|
122
|
+
* headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${config.apiKey}` },
|
|
123
|
+
* body: JSON.stringify(events),
|
|
124
|
+
* }),
|
|
125
|
+
* })
|
|
126
|
+
* }
|
|
127
|
+
* ```
|
|
128
|
+
*/
|
|
129
|
+
declare function defineHttpDrain<TConfig>(options: HttpDrainOptions<TConfig>): (ctx: DrainContext | DrainContext[]) => Promise<void>;
|
|
130
|
+
//#endregion
|
|
131
|
+
//#region src/shared/event.d.ts
|
|
132
|
+
/**
|
|
133
|
+
* Helpers for building / mutating wide events from inside enrichers and adapters.
|
|
134
|
+
*/
|
|
135
|
+
/**
|
|
136
|
+
* Merge a computed value onto an existing event field. By default, existing
|
|
137
|
+
* object values win over computed ones — so `log.set({ geo: ... })` keeps
|
|
138
|
+
* precedence over an enricher's automatic detection.
|
|
139
|
+
*/
|
|
140
|
+
declare function mergeEventField<T extends object>(existing: unknown, computed: T, overwrite?: boolean): T;
|
|
141
|
+
/** Typed attribute used when flattening events for OTLP/Sentry/Datadog/PostHog. */
|
|
142
|
+
type AttributeValueKind = 'string' | 'integer' | 'double' | 'boolean';
|
|
143
|
+
interface TypedAttributeValue {
|
|
144
|
+
value: string | number | boolean;
|
|
145
|
+
type: AttributeValueKind;
|
|
146
|
+
}
|
|
147
|
+
/** Convert a JS value to a {@link TypedAttributeValue}. Objects are JSON-serialized. */
|
|
148
|
+
declare function toTypedAttributeValue(value: unknown): TypedAttributeValue | undefined;
|
|
149
|
+
/** Convert a JS value to the OTLP `AnyValue` shape (`stringValue` / `intValue` / `boolValue`). */
|
|
150
|
+
declare function toOtlpAttributeValue(value: unknown): {
|
|
151
|
+
stringValue?: string;
|
|
152
|
+
intValue?: string;
|
|
153
|
+
boolValue?: boolean;
|
|
154
|
+
};
|
|
155
|
+
//#endregion
|
|
6
156
|
//#region src/shared/fork.d.ts
|
|
7
157
|
/**
|
|
8
158
|
* Optional hooks for integrations that track active loggers (e.g. Elysia `activeLoggers`).
|
|
@@ -52,24 +202,150 @@ declare function extractSafeHeaders(headers: Headers): Record<string, string>;
|
|
|
52
202
|
* Works with Express, Fastify, and any Node.js HTTP server using `req.headers`.
|
|
53
203
|
*/
|
|
54
204
|
declare function extractSafeNodeHeaders(headers: Record<string, string | string[] | undefined>): Record<string, string>;
|
|
205
|
+
/**
|
|
206
|
+
* Case-insensitive header lookup against the safe-filtered shape produced by
|
|
207
|
+
* {@link extractSafeHeaders} / {@link extractSafeNodeHeaders}.
|
|
208
|
+
*/
|
|
209
|
+
declare function getHeader(headers: Record<string, string> | undefined, name: string): string | undefined;
|
|
210
|
+
/** Parse a header-derived numeric string. Returns `undefined` for empty/invalid input. */
|
|
211
|
+
declare function normalizeNumber(value: string | undefined): number | undefined;
|
|
55
212
|
//#endregion
|
|
56
|
-
//#region src/shared/
|
|
213
|
+
//#region src/shared/http.d.ts
|
|
57
214
|
/**
|
|
58
|
-
*
|
|
215
|
+
* Minimal HTTP transport for drain adapters: abort-based timeouts, exponential
|
|
216
|
+
* backoff on `5xx` / network errors, response bodies truncated in error messages.
|
|
217
|
+
*/
|
|
218
|
+
interface HttpPostOptions {
|
|
219
|
+
url: string;
|
|
220
|
+
/** Caller is responsible for `Content-Type`. */
|
|
221
|
+
headers: Record<string, string>;
|
|
222
|
+
/** Pre-serialized request body. */
|
|
223
|
+
body: string;
|
|
224
|
+
/** Abort the request after this many milliseconds. */
|
|
225
|
+
timeout: number;
|
|
226
|
+
/** Prefix used in error messages. */
|
|
227
|
+
label: string;
|
|
228
|
+
/**
|
|
229
|
+
* Retries network errors, aborts, and `5xx` responses with exponential backoff.
|
|
230
|
+
* @default 2
|
|
231
|
+
*/
|
|
232
|
+
retries?: number;
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* POST a body with timeout + retry. Throws label-prefixed errors with a
|
|
236
|
+
* truncated response body. Safe to call from any drain `send()`.
|
|
237
|
+
*/
|
|
238
|
+
declare function httpPost({
|
|
239
|
+
url,
|
|
240
|
+
headers,
|
|
241
|
+
body,
|
|
242
|
+
timeout,
|
|
243
|
+
label,
|
|
244
|
+
retries
|
|
245
|
+
}: HttpPostOptions): Promise<void>;
|
|
246
|
+
//#endregion
|
|
247
|
+
//#region src/shared/integration.d.ts
|
|
248
|
+
/** Request shape extracted from a framework context. */
|
|
249
|
+
interface ExtractedRequest {
|
|
250
|
+
method: string;
|
|
251
|
+
path: string;
|
|
252
|
+
/**
|
|
253
|
+
* Either a Web `Headers` (Hono / Elysia / Fetch) or a Node-style
|
|
254
|
+
* `IncomingHttpHeaders` record (Express / Fastify). Whichever is native
|
|
255
|
+
* to the framework — it gets filtered through the safe-header helpers.
|
|
256
|
+
*/
|
|
257
|
+
headers?: Headers | Record<string, string | string[] | undefined>;
|
|
258
|
+
/** Used as-is when present, otherwise auto-generated. */
|
|
259
|
+
requestId?: string;
|
|
260
|
+
}
|
|
261
|
+
/** Manifest passed to {@link defineFrameworkIntegration}. */
|
|
262
|
+
interface FrameworkIntegrationSpec<TCtx> {
|
|
263
|
+
/** Stable identifier used in error messages. */
|
|
264
|
+
name: string;
|
|
265
|
+
extractRequest: (ctx: TCtx) => ExtractedRequest;
|
|
266
|
+
/** Attach the request logger to the framework context (`c.set('log', logger)`). */
|
|
267
|
+
attachLogger: (ctx: TCtx, logger: RequestLogger) => void;
|
|
268
|
+
/**
|
|
269
|
+
* AsyncLocalStorage instance backing `useLogger()`. Required for frameworks
|
|
270
|
+
* where the logger is accessed off the request context (Express, Fastify,
|
|
271
|
+
* NestJS). When set, `log.fork()` is auto-attached to the request logger.
|
|
272
|
+
*/
|
|
273
|
+
storage?: AsyncLocalStorage<RequestLogger>;
|
|
274
|
+
/** Fork lifecycle hooks (only used when `storage` is set). */
|
|
275
|
+
forkLifecycle?: ForkLifecycle;
|
|
276
|
+
}
|
|
277
|
+
/** Result returned by {@link FrameworkIntegrationHelpers.start}. */
|
|
278
|
+
interface FrameworkRequestHandle extends MiddlewareLoggerResult {
|
|
279
|
+
middlewareOptions: MiddlewareLoggerOptions;
|
|
280
|
+
/**
|
|
281
|
+
* Run the downstream handler inside the integration's storage. When no
|
|
282
|
+
* storage is configured, the callback is invoked directly.
|
|
283
|
+
*/
|
|
284
|
+
runWith: <T>(fn: () => T | Promise<T>) => Promise<T>;
|
|
285
|
+
}
|
|
286
|
+
/** Helpers returned by {@link defineFrameworkIntegration}. */
|
|
287
|
+
interface FrameworkIntegrationHelpers<TCtx> {
|
|
288
|
+
start: (ctx: TCtx, options?: BaseEvlogOptions) => FrameworkRequestHandle;
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Build a manifest-driven framework integration. Captures the boilerplate
|
|
292
|
+
* every middleware shares (request extraction, logger setup, attachment,
|
|
293
|
+
* optional AsyncLocalStorage wrapping). The framework still owns its own
|
|
294
|
+
* middleware function — it just declares *what* to extract and *where* to
|
|
295
|
+
* attach the logger.
|
|
59
296
|
*
|
|
60
|
-
*
|
|
61
|
-
*
|
|
297
|
+
* @example
|
|
298
|
+
* ```ts
|
|
299
|
+
* const integration = defineFrameworkIntegration<HonoContext>({
|
|
300
|
+
* name: 'hono',
|
|
301
|
+
* extractRequest: (c) => ({
|
|
302
|
+
* method: c.req.method,
|
|
303
|
+
* path: c.req.path,
|
|
304
|
+
* headers: c.req.raw.headers,
|
|
305
|
+
* requestId: c.req.header('x-request-id'),
|
|
306
|
+
* }),
|
|
307
|
+
* attachLogger: (c, logger) => c.set('log', logger),
|
|
308
|
+
* })
|
|
62
309
|
*
|
|
63
|
-
*
|
|
64
|
-
*
|
|
65
|
-
*
|
|
310
|
+
* export function evlog(options?: BaseEvlogOptions): MiddlewareHandler {
|
|
311
|
+
* return async (c, next) => {
|
|
312
|
+
* const { skipped, finish, runWith } = integration.start(c, options)
|
|
313
|
+
* if (skipped) return next()
|
|
314
|
+
* try {
|
|
315
|
+
* await runWith(() => next())
|
|
316
|
+
* await finish({ status: c.res.status })
|
|
317
|
+
* } catch (error) {
|
|
318
|
+
* await finish({ error: error as Error })
|
|
319
|
+
* throw error
|
|
320
|
+
* }
|
|
321
|
+
* }
|
|
322
|
+
* }
|
|
323
|
+
* ```
|
|
324
|
+
*/
|
|
325
|
+
declare function defineFrameworkIntegration<TCtx>(spec: FrameworkIntegrationSpec<TCtx>): FrameworkIntegrationHelpers<TCtx>;
|
|
326
|
+
//#endregion
|
|
327
|
+
//#region src/shared/severity.d.ts
|
|
328
|
+
/**
|
|
329
|
+
* OpenTelemetry severity numbers per evlog log level.
|
|
330
|
+
* @see https://opentelemetry.io/docs/specs/otel/logs/data-model/#field-severitynumber
|
|
331
|
+
*/
|
|
332
|
+
declare const OTEL_SEVERITY_NUMBER: Record<LogLevel, number>;
|
|
333
|
+
declare const OTEL_SEVERITY_TEXT: Record<LogLevel, string>;
|
|
334
|
+
//#endregion
|
|
335
|
+
//#region src/shared/storage.d.ts
|
|
336
|
+
/**
|
|
337
|
+
* Create a request-scoped `AsyncLocalStorage` and matching `useLogger`
|
|
338
|
+
* accessor. Every framework that exposes `useLogger()` (Express, Fastify,
|
|
339
|
+
* NestJS, SvelteKit) calls this once at module level.
|
|
66
340
|
*
|
|
67
|
-
* @
|
|
341
|
+
* @param contextHint - Appended to the error message when `useLogger()` is
|
|
342
|
+
* called outside of a request, e.g. `"middleware context. Make sure
|
|
343
|
+
* app.use(evlog()) is registered before your routes."`.
|
|
68
344
|
*/
|
|
69
345
|
declare function createLoggerStorage(contextHint: string): {
|
|
70
346
|
storage: AsyncLocalStorage<RequestLogger<Record<string, unknown>>>;
|
|
71
347
|
useLogger: <T extends object = Record<string, unknown>>() => RequestLogger<T>;
|
|
72
348
|
};
|
|
73
349
|
//#endregion
|
|
74
|
-
export { BaseEvlogOptions, ForkBackgroundLoggerOptions, ForkLifecycle, MiddlewareLoggerOptions, MiddlewareLoggerResult, attachForkToLogger, createLoggerStorage, createMiddlewareLogger, extractErrorStatus, extractSafeHeaders, extractSafeNodeHeaders, forkBackgroundLogger, getServiceForPath, runEnrichAndDrain, shouldLog };
|
|
350
|
+
export { AttributeValueKind, BaseEvlogOptions, ClientLogContext, ConfigField, DrainOptions, EnricherDefinition, EnricherOptions, EvlogConfig, EvlogPlugin, ExtractedRequest, ForkBackgroundLoggerOptions, ForkLifecycle, FrameworkIntegrationHelpers, FrameworkIntegrationSpec, FrameworkRequestHandle, HttpDrainOptions, HttpDrainRequest, HttpPostOptions, MiddlewareLoggerOptions, MiddlewareLoggerResult, OTEL_SEVERITY_NUMBER, OTEL_SEVERITY_TEXT, PluginRunner, PluginSetupContext, RequestFinishContext, RequestLifecycleContext, TypedAttributeValue, attachForkToLogger, composeDrains, composeEnrichers, composeKeep, composePlugins, createLoggerStorage, createMiddlewareLogger, createPluginRunner, defineDrain, defineEnricher, defineEvlog, defineFrameworkIntegration, defineHttpDrain, definePlugin, drainPlugin, enricherPlugin, extractErrorStatus, extractSafeHeaders, extractSafeNodeHeaders, forkBackgroundLogger, getEmptyPluginRunner, getHeader, getRuntimeConfig, getServiceForPath, httpPost, mergeEventField, normalizeNumber, resolveAdapterConfig, resolveMiddlewarePluginRunner, runEnrichAndDrain, shouldLog, toLoggerConfig, toMiddlewareOptions, toOtlpAttributeValue, toTypedAttributeValue };
|
|
75
351
|
//# sourceMappingURL=toolkit.d.mts.map
|
package/dist/toolkit.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toolkit.d.mts","names":[],"sources":["../src/shared/fork.ts","../src/shared/headers.ts","../src/shared/storage.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"toolkit.d.mts","names":[],"sources":["../src/shared/compose.ts","../src/shared/config.ts","../src/shared/drain.ts","../src/shared/event.ts","../src/shared/fork.ts","../src/shared/headers.ts","../src/shared/http.ts","../src/shared/integration.ts","../src/shared/severity.ts","../src/shared/storage.ts"],"mappings":"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"}
|
package/dist/toolkit.mjs
CHANGED
|
@@ -1,7 +1,13 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { n as
|
|
3
|
-
import {
|
|
4
|
-
import { n as
|
|
5
|
-
import { n as
|
|
6
|
-
import { t as
|
|
7
|
-
|
|
1
|
+
import { D as drainPlugin, E as definePlugin, O as enricherPlugin, T as createPluginRunner, k as getEmptyPluginRunner } from "./audit--n0QRR2Y.mjs";
|
|
2
|
+
import { i as normalizeNumber, n as extractSafeNodeHeaders, r as getHeader, t as extractSafeHeaders } from "./headers-CU-QqnYg.mjs";
|
|
3
|
+
import { t as extractErrorStatus } from "./errors-BQgyQ9xe.mjs";
|
|
4
|
+
import { n as toLoggerConfig, r as toMiddlewareOptions, t as defineEvlog } from "./define-D6OJdSUH.mjs";
|
|
5
|
+
import { n as shouldLog, t as getServiceForPath } from "./routes-B48wm7Pb.mjs";
|
|
6
|
+
import { a as resolveAdapterConfig, i as getRuntimeConfig, n as defineHttpDrain, r as httpPost, t as defineDrain } from "./drain-ByWUeOQC.mjs";
|
|
7
|
+
import { n as toOtlpAttributeValue, r as toTypedAttributeValue, t as mergeEventField } from "./event-ef-5Dbxg.mjs";
|
|
8
|
+
import { n as OTEL_SEVERITY_TEXT, t as OTEL_SEVERITY_NUMBER } from "./severity-BYWZ96Sb.mjs";
|
|
9
|
+
import { a as composePlugins, i as composeKeep, n as composeDrains, r as composeEnrichers, t as defineEnricher } from "./enricher-BA6viylF.mjs";
|
|
10
|
+
import { a as runEnrichAndDrain, i as resolveMiddlewarePluginRunner, n as forkBackgroundLogger, r as createMiddlewareLogger, t as attachForkToLogger } from "./fork-D44V93-K.mjs";
|
|
11
|
+
import { t as defineFrameworkIntegration } from "./integration-Bz8X6_Lb.mjs";
|
|
12
|
+
import { t as createLoggerStorage } from "./storage-BT-3fT1-.mjs";
|
|
13
|
+
export { OTEL_SEVERITY_NUMBER, OTEL_SEVERITY_TEXT, attachForkToLogger, composeDrains, composeEnrichers, composeKeep, composePlugins, createLoggerStorage, createMiddlewareLogger, createPluginRunner, defineDrain, defineEnricher, defineEvlog, defineFrameworkIntegration, defineHttpDrain, definePlugin, drainPlugin, enricherPlugin, extractErrorStatus, extractSafeHeaders, extractSafeNodeHeaders, forkBackgroundLogger, getEmptyPluginRunner, getHeader, getRuntimeConfig, getServiceForPath, httpPost, mergeEventField, normalizeNumber, resolveAdapterConfig, resolveMiddlewarePluginRunner, runEnrichAndDrain, shouldLog, toLoggerConfig, toMiddlewareOptions, toOtlpAttributeValue, toTypedAttributeValue };
|
package/dist/types.d.mts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { $ as SamplingRates, A as AuditFields, B as H3EventContext, F as DrainContext, G as LoggerConfig, H as InternalFields, I as EnrichContext, J as RequestLogEntry, K as ParsedError, L as EnvironmentContext, M as AuditTarget, N as BaseWideEvent, P as DeepPartial, Q as SamplingConfig, R as ErrorOptions, U as Log, V as IngestPayload, W as LogLevel, X as RequestLoggerOptions, Y as RequestLogger, Z as RouteConfig, et as ServerEvent, it as WideEvent, j as AuditLoggerMethod, k as AuditActor, nt as TailSamplingContext, q as RedactConfig, rt as TransportConfig, tt as TailSamplingCondition, z as FieldContext } from "./audit-
|
|
1
|
+
import { $ as SamplingRates, A as AuditFields, B as H3EventContext, F as DrainContext, G as LoggerConfig, H as InternalFields, I as EnrichContext, J as RequestLogEntry, K as ParsedError, L as EnvironmentContext, M as AuditTarget, N as BaseWideEvent, P as DeepPartial, Q as SamplingConfig, R as ErrorOptions, U as Log, V as IngestPayload, W as LogLevel, X as RequestLoggerOptions, Y as RequestLogger, Z as RouteConfig, et as ServerEvent, it as WideEvent, j as AuditLoggerMethod, k as AuditActor, nt as TailSamplingContext, q as RedactConfig, rt as TransportConfig, tt as TailSamplingCondition, z as FieldContext } from "./audit-CJl-wZ10.mjs";
|
|
2
2
|
export { AuditActor, AuditFields, AuditLoggerMethod, AuditTarget, BaseWideEvent, DeepPartial, DrainContext, EnrichContext, EnvironmentContext, ErrorOptions, FieldContext, H3EventContext, IngestPayload, InternalFields, Log, LogLevel, LoggerConfig, ParsedError, RedactConfig, RequestLogEntry, RequestLogger, RequestLoggerOptions, RouteConfig, SamplingConfig, SamplingRates, ServerEvent, TailSamplingCondition, TailSamplingContext, TransportConfig, WideEvent };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Y as RequestLogger, et as ServerEvent } from "./audit-
|
|
1
|
+
import { Y as RequestLogger, et as ServerEvent } from "./audit-CJl-wZ10.mjs";
|
|
2
2
|
|
|
3
3
|
//#region src/runtime/server/useLogger.d.ts
|
|
4
4
|
/**
|
|
@@ -36,4 +36,4 @@ import { Y as RequestLogger, et as ServerEvent } from "./audit-mUutdf6A.mjs";
|
|
|
36
36
|
declare function useLogger<T extends object = Record<string, unknown>>(event: ServerEvent, service?: string): RequestLogger<T>;
|
|
37
37
|
//#endregion
|
|
38
38
|
export { useLogger as t };
|
|
39
|
-
//# sourceMappingURL=useLogger-
|
|
39
|
+
//# sourceMappingURL=useLogger-Cb1R6bQE.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useLogger-
|
|
1
|
+
{"version":3,"file":"useLogger-Cb1R6bQE.d.mts","names":[],"sources":["../src/runtime/server/useLogger.ts"],"mappings":";;;;;AAkCA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAAgB,SAAA,oBAA6B,MAAA,kBAAA,CAAyB,KAAA,EAAO,WAAA,EAAa,OAAA,YAAmB,aAAA,CAAc,CAAA"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import { L as EnvironmentContext, W as LogLevel } from "./audit-
|
|
1
|
+
import { L as EnvironmentContext, W as LogLevel } from "./audit-CJl-wZ10.mjs";
|
|
2
2
|
|
|
3
3
|
//#region src/utils.d.ts
|
|
4
4
|
declare function formatDuration(ms: number): string;
|
|
5
5
|
declare function isServer(): boolean;
|
|
6
6
|
declare function isClient(): boolean;
|
|
7
|
+
declare function isBrowser(): boolean;
|
|
7
8
|
declare function isDev(): boolean;
|
|
8
9
|
declare function detectEnvironment(): Partial<EnvironmentContext>;
|
|
9
10
|
/**
|
|
@@ -50,5 +51,5 @@ declare function filterSafeHeaders(headers: Record<string, string>): Record<stri
|
|
|
50
51
|
*/
|
|
51
52
|
declare function matchesPattern(path: string, pattern: string): boolean;
|
|
52
53
|
//#endregion
|
|
53
|
-
export { escapeFormatString as a, getConsoleMethod as c,
|
|
54
|
-
//# sourceMappingURL=utils-
|
|
54
|
+
export { escapeFormatString as a, getConsoleMethod as c, isBrowser as d, isClient as f, matchesPattern as g, isServer as h, detectEnvironment as i, getCssLevelColor as l, isLevelEnabled as m, colors as n, filterSafeHeaders as o, isDev as p, cssColors as r, formatDuration as s, SENSITIVE_HEADERS as t, getLevelColor as u };
|
|
55
|
+
//# sourceMappingURL=utils-gQCeZMbg.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils-gQCeZMbg.d.mts","names":[],"sources":["../src/utils.ts"],"mappings":";;;iBAEgB,cAAA,CAAe,EAAA;AAAA,iBAOf,QAAA,CAAA;AAAA,iBAIA,QAAA,CAAA;AAAA,iBAIA,SAAA,CAAA;AAAA,iBAOA,KAAA,CAAA;AAAA,iBAUA,iBAAA,CAAA,GAAqB,OAAA,CAAQ,kBAAA;;AAzB7C;;iBAsDgB,cAAA,CAAe,KAAA,EAAO,QAAA,EAAU,QAAA,EAAU,QAAA;AAAA,iBAI1C,gBAAA,CAAiB,KAAA,EAAO,QAAA,GAAW,QAAA;AAAA,cAItC,MAAA;EAAA;;;;;;;;;;;;iBAgBG,aAAA,CAAc,KAAA;AAAA,cAIjB,SAAA;EAAA;;;;;;;;iBAYG,gBAAA,CAAiB,KAAA;;;;;;iBASjB,kBAAA,CAAmB,GAAA;;cAKtB,iBAAA;AAAA,iBASG,iBAAA,CAAkB,OAAA,EAAS,MAAA,mBAAyB,MAAA;;;;;iBAkBpD,cAAA,CAAe,IAAA,UAAc,OAAA"}
|
package/dist/utils.d.mts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as escapeFormatString, c as getConsoleMethod, d as
|
|
2
|
-
export { SENSITIVE_HEADERS, colors, cssColors, detectEnvironment, escapeFormatString, filterSafeHeaders, formatDuration, getConsoleMethod, getCssLevelColor, getLevelColor, isClient, isDev, isLevelEnabled, isServer, matchesPattern };
|
|
1
|
+
import { a as escapeFormatString, c as getConsoleMethod, d as isBrowser, f as isClient, g as matchesPattern, h as isServer, i as detectEnvironment, l as getCssLevelColor, m as isLevelEnabled, n as colors, o as filterSafeHeaders, p as isDev, r as cssColors, s as formatDuration, t as SENSITIVE_HEADERS, u as getLevelColor } from "./utils-gQCeZMbg.mjs";
|
|
2
|
+
export { SENSITIVE_HEADERS, colors, cssColors, detectEnvironment, escapeFormatString, filterSafeHeaders, formatDuration, getConsoleMethod, getCssLevelColor, getLevelColor, isBrowser, isClient, isDev, isLevelEnabled, isServer, matchesPattern };
|
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
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as walk, i as shouldTransform, n as createStripPlugin, o as MagicString, r as TRANSFORM_FILTER, t as createSourceLocationPlugin } from "../source-location-
|
|
1
|
+
import { a as walk, i as shouldTransform, n as createStripPlugin, o as MagicString, r as TRANSFORM_FILTER, t as createSourceLocationPlugin } from "../source-location-Dco0cRTz.mjs";
|
|
2
2
|
import { resolve } from "node:path";
|
|
3
3
|
import { existsSync, writeFileSync } from "node:fs";
|
|
4
4
|
//#region src/vite/auto-init.ts
|
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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"}
|