evlog 2.17.0 → 2.19.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/README.md +95 -2
- package/dist/adapters/axiom.d.mts +1 -1
- package/dist/adapters/axiom.mjs +2 -2
- package/dist/adapters/axiom.mjs.map +1 -1
- package/dist/adapters/better-stack.d.mts +1 -1
- package/dist/adapters/better-stack.mjs +2 -2
- package/dist/adapters/datadog.d.mts +1 -1
- package/dist/adapters/datadog.mjs +2 -2
- package/dist/adapters/fs.d.mts +1 -1
- package/dist/adapters/fs.mjs +2 -2
- package/dist/adapters/hyperdx.d.mts +1 -1
- package/dist/adapters/hyperdx.mjs +1 -1
- package/dist/adapters/memory.d.mts +116 -0
- package/dist/adapters/memory.d.mts.map +1 -0
- package/dist/adapters/memory.mjs +191 -0
- package/dist/adapters/memory.mjs.map +1 -0
- package/dist/adapters/otlp.d.mts +1 -1
- package/dist/adapters/otlp.mjs +4 -4
- package/dist/adapters/posthog.d.mts +1 -1
- package/dist/adapters/posthog.mjs +2 -2
- package/dist/adapters/sentry.d.mts +1 -1
- package/dist/adapters/sentry.mjs +3 -3
- package/dist/ai/index.d.mts +1 -1
- package/dist/{audit-pV5aLGP0.mjs → audit-BFwTUxBJ.mjs} +475 -151
- package/dist/audit-BFwTUxBJ.mjs.map +1 -0
- package/dist/{audit-CC8nfazi.d.mts → audit-BUAajsPU.d.mts} +126 -35
- package/dist/audit-BUAajsPU.d.mts.map +1 -0
- package/dist/better-auth/index.d.mts +1 -1
- package/dist/browser.d.mts +1 -1
- package/dist/{define-D6OJdSUH.mjs → define-Bpaymi-h.mjs} +2 -1
- package/dist/define-Bpaymi-h.mjs.map +1 -0
- package/dist/{define-MSdhzmXn.d.mts → define-DGwZkZ7x.d.mts} +8 -3
- package/dist/define-DGwZkZ7x.d.mts.map +1 -0
- package/dist/dev-terminal-D4UaEm17.mjs +54 -0
- package/dist/dev-terminal-D4UaEm17.mjs.map +1 -0
- package/dist/{dist-H3GIh-KK.mjs → dist-DdQWiZn8.mjs} +1 -1
- package/dist/{dist-H3GIh-KK.mjs.map → dist-DdQWiZn8.mjs.map} +1 -1
- package/dist/{drain-X7_5szSI.mjs → drain-D_fy7m0n.mjs} +3 -3
- package/dist/drain-D_fy7m0n.mjs.map +1 -0
- package/dist/elysia/index.d.mts +3 -3
- package/dist/elysia/index.d.mts.map +1 -1
- package/dist/elysia/index.mjs +8 -5
- package/dist/elysia/index.mjs.map +1 -1
- package/dist/enrich-drain-CG_2Nix-.mjs +122 -0
- package/dist/enrich-drain-CG_2Nix-.mjs.map +1 -0
- package/dist/{enricher-DxgML6IC.d.mts → enricher-CuMbbdqp.d.mts} +2 -2
- package/dist/{enricher-DxgML6IC.d.mts.map → enricher-CuMbbdqp.d.mts.map} +1 -1
- package/dist/{enricher-N0erZS87.mjs → enricher-DAWf2-Fx.mjs} +2 -2
- package/dist/{enricher-N0erZS87.mjs.map → enricher-DAWf2-Fx.mjs.map} +1 -1
- package/dist/enrichers.d.mts +2 -2
- package/dist/enrichers.mjs +2 -2
- package/dist/{error-CpbbtyXL.d.mts → error-DwajXSKM.d.mts} +2 -2
- package/dist/{error-CpbbtyXL.d.mts.map → error-DwajXSKM.d.mts.map} +1 -1
- package/dist/error.d.mts +1 -1
- package/dist/{errors-DySW1F9_.d.mts → errors-CAq8pYpW.d.mts} +2 -2
- package/dist/{errors-DySW1F9_.d.mts.map → errors-CAq8pYpW.d.mts.map} +1 -1
- package/dist/{errors-BQgyQ9xe.mjs → errors-DA0cyr8q.mjs} +1 -1
- package/dist/{errors-BQgyQ9xe.mjs.map → errors-DA0cyr8q.mjs.map} +1 -1
- package/dist/{event-1BMl7o0k.mjs → event-qwAv-7AZ.mjs} +1 -1
- package/dist/{event-1BMl7o0k.mjs.map → event-qwAv-7AZ.mjs.map} +1 -1
- package/dist/express/index.d.mts +3 -3
- package/dist/express/index.d.mts.map +1 -1
- package/dist/express/index.mjs +3 -3
- package/dist/express/index.mjs.map +1 -1
- package/dist/fastify/index.d.mts +9 -4
- package/dist/fastify/index.d.mts.map +1 -1
- package/dist/fastify/index.mjs +10 -8
- package/dist/fastify/index.mjs.map +1 -1
- package/dist/{fork-8u_zFOJq.mjs → fork-CYm453dq.mjs} +40 -14
- package/dist/fork-CYm453dq.mjs.map +1 -0
- package/dist/{headers-CU-QqnYg.mjs → headers-VtmnWcfn.mjs} +1 -1
- package/dist/{headers-CU-QqnYg.mjs.map → headers-VtmnWcfn.mjs.map} +1 -1
- package/dist/hono/index.d.mts +2 -2
- package/dist/hono/index.d.mts.map +1 -1
- package/dist/hono/index.mjs +10 -2
- package/dist/hono/index.mjs.map +1 -1
- package/dist/{http-6umVAKDW.mjs → http-Bept5EIC.mjs} +2 -2
- package/dist/{http-6umVAKDW.mjs.map → http-Bept5EIC.mjs.map} +1 -1
- package/dist/http.d.mts +1 -1
- package/dist/{index-o1_z4phv.d.mts → index-CE7kH0II.d.mts} +15 -8
- package/dist/index-CE7kH0II.d.mts.map +1 -0
- package/dist/index.d.mts +9 -9
- package/dist/index.mjs +9 -15
- package/dist/index.mjs.map +1 -1
- package/dist/{integration-DTZtjSqh.mjs → integration-CR601uyW.mjs} +3 -3
- package/dist/{integration-DTZtjSqh.mjs.map → integration-CR601uyW.mjs.map} +1 -1
- package/dist/{logger-DntcxxHg.d.mts → logger-BccCJUyD.d.mts} +11 -3
- package/dist/logger-BccCJUyD.d.mts.map +1 -0
- package/dist/logger.d.mts +2 -2
- package/dist/logger.mjs +2 -2
- package/dist/{middleware-U-lIAzHg.d.mts → middleware-DQ6-h8h0.d.mts} +9 -2
- package/dist/middleware-DQ6-h8h0.d.mts.map +1 -0
- package/dist/nestjs/index.d.mts +2 -2
- package/dist/nestjs/index.mjs +4 -4
- package/dist/next/client.d.mts +1 -1
- package/dist/next/index.d.mts +6 -5
- package/dist/next/index.d.mts.map +1 -1
- package/dist/next/index.mjs +36 -38
- 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 +10 -16
- package/dist/nitro/errorHandler.mjs.map +1 -1
- package/dist/nitro/module.d.mts +2 -2
- package/dist/nitro/module.d.mts.map +1 -1
- package/dist/nitro/module.mjs +8 -2
- package/dist/nitro/module.mjs.map +1 -1
- package/dist/nitro/plugin.mjs +37 -65
- package/dist/nitro/plugin.mjs.map +1 -1
- package/dist/nitro/v3/errorHandler.d.mts +0 -7
- package/dist/nitro/v3/errorHandler.mjs +13 -15
- package/dist/nitro/v3/errorHandler.mjs.map +1 -1
- package/dist/nitro/v3/index.d.mts +2 -2
- package/dist/nitro/v3/module.d.mts +1 -1
- package/dist/nitro/v3/module.d.mts.map +1 -1
- package/dist/nitro/v3/module.mjs +9 -4
- package/dist/nitro/v3/module.mjs.map +1 -1
- package/dist/nitro/v3/plugin.mjs +77 -44
- package/dist/nitro/v3/plugin.mjs.map +1 -1
- package/dist/nitro/v3/useLogger.d.mts +1 -1
- package/dist/nitro-ClRZLD1g.mjs +96 -0
- package/dist/nitro-ClRZLD1g.mjs.map +1 -0
- package/dist/{nitro-oZre8ab3.d.mts → nitro-zCXTylj4.d.mts} +7 -2
- package/dist/nitro-zCXTylj4.d.mts.map +1 -0
- package/dist/nitroConfigBridge-BkVWnSV3.mjs +164 -0
- package/dist/nitroConfigBridge-BkVWnSV3.mjs.map +1 -0
- package/dist/{nodeResponse-BkkionWl.mjs → nodeResponse-CIEEbrNE.mjs} +1 -1
- package/dist/{nodeResponse-BkkionWl.mjs.map → nodeResponse-CIEEbrNE.mjs.map} +1 -1
- package/dist/nuxt/module.d.mts +13 -4
- package/dist/nuxt/module.d.mts.map +1 -1
- package/dist/nuxt/module.mjs +11 -4
- package/dist/nuxt/module.mjs.map +1 -1
- package/dist/orpc/index.d.mts +115 -0
- package/dist/orpc/index.d.mts.map +1 -0
- package/dist/orpc/index.mjs +145 -0
- package/dist/orpc/index.mjs.map +1 -0
- package/dist/{package-v_MmOZeA.mjs → package-CUhII9DA.mjs} +2 -2
- package/dist/package-CUhII9DA.mjs.map +1 -0
- package/dist/{parseError-yVZ58wIK.d.mts → parseError-Cagr-Ctc.d.mts} +2 -2
- package/dist/parseError-Cagr-Ctc.d.mts.map +1 -0
- package/dist/pretty-error-CVVgwlTn.mjs +278 -0
- package/dist/pretty-error-CVVgwlTn.mjs.map +1 -0
- package/dist/pretty-error-snippet.node-c_bzjg7g.mjs +47 -0
- package/dist/pretty-error-snippet.node-c_bzjg7g.mjs.map +1 -0
- package/dist/react-router/index.d.mts +2 -2
- package/dist/react-router/index.mjs +5 -6
- package/dist/react-router/index.mjs.map +1 -1
- package/dist/{routes-CnIgYWf8.mjs → routes-4rMzRyTk.mjs} +1 -1
- package/dist/{routes-CnIgYWf8.mjs.map → routes-4rMzRyTk.mjs.map} +1 -1
- package/dist/runtime/client/log.d.mts +1 -1
- package/dist/runtime/server/routes/_evlog/ingest.post.mjs +28 -12
- package/dist/runtime/server/routes/_evlog/ingest.post.mjs.map +1 -1
- package/dist/runtime/server/useLogger.d.mts +1 -1
- package/dist/runtime/utils/parseError.d.mts +2 -2
- package/dist/runtime/utils/parseError.mjs +1 -1
- package/dist/{severity-R5Egq3qz.mjs → severity-CwXUSHt3.mjs} +1 -1
- package/dist/{severity-R5Egq3qz.mjs.map → severity-CwXUSHt3.mjs.map} +1 -1
- package/dist/{source-location-Dco0cRTz.mjs → source-location-xkDGiERl.mjs} +1 -1
- package/dist/{source-location-Dco0cRTz.mjs.map → source-location-xkDGiERl.mjs.map} +1 -1
- package/dist/{storage-Dwinmg8P.mjs → storage-7X37OToT.mjs} +2 -1
- package/dist/{storage-Dwinmg8P.mjs.map → storage-7X37OToT.mjs.map} +1 -1
- package/dist/stream.d.mts +1 -1
- package/dist/stream.mjs +1 -1
- package/dist/streamResponse-CmQ3qUbF.mjs +94 -0
- package/dist/streamResponse-CmQ3qUbF.mjs.map +1 -0
- package/dist/sveltekit/index.d.mts +3 -3
- package/dist/sveltekit/index.d.mts.map +1 -1
- package/dist/sveltekit/index.mjs +48 -16
- package/dist/sveltekit/index.mjs.map +1 -1
- package/dist/toolkit.d.mts +38 -7
- package/dist/toolkit.d.mts.map +1 -1
- package/dist/toolkit.mjs +15 -14
- package/dist/types.d.mts +2 -2
- package/dist/{useLogger-BsPL4AQm.d.mts → useLogger-Dv52PDpH.d.mts} +2 -2
- package/dist/{useLogger-BsPL4AQm.d.mts.map → useLogger-Dv52PDpH.d.mts.map} +1 -1
- package/dist/{utils-DLCeShxL.d.mts → utils-DmNbZwBZ.d.mts} +21 -4
- package/dist/{utils-DLCeShxL.d.mts.map → utils-DmNbZwBZ.d.mts.map} +1 -1
- package/dist/utils.d.mts +2 -2
- package/dist/utils.mjs +31 -9
- package/dist/utils.mjs.map +1 -1
- package/dist/vite/index.d.mts +1 -1
- package/dist/vite/index.mjs +1 -1
- package/dist/workers.d.mts +1 -1
- package/dist/workers.mjs +1 -1
- package/package.json +48 -15
- package/dist/audit-CC8nfazi.d.mts.map +0 -1
- package/dist/audit-pV5aLGP0.mjs.map +0 -1
- package/dist/define-D6OJdSUH.mjs.map +0 -1
- package/dist/define-MSdhzmXn.d.mts.map +0 -1
- package/dist/drain-X7_5szSI.mjs.map +0 -1
- package/dist/fork-8u_zFOJq.mjs.map +0 -1
- package/dist/index-o1_z4phv.d.mts.map +0 -1
- package/dist/logger-DntcxxHg.d.mts.map +0 -1
- package/dist/middleware-U-lIAzHg.d.mts.map +0 -1
- package/dist/nitro-DErMq_Zj.mjs +0 -34
- package/dist/nitro-DErMq_Zj.mjs.map +0 -1
- package/dist/nitro-oZre8ab3.d.mts.map +0 -1
- package/dist/nitroConfigBridge-DKk7eOn-.mjs +0 -92
- package/dist/nitroConfigBridge-DKk7eOn-.mjs.map +0 -1
- package/dist/package-v_MmOZeA.mjs.map +0 -1
- package/dist/parseError-yVZ58wIK.d.mts.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { B as DrainContext, H as EnvironmentContext, X as LogLevel, ot as SamplingConfig } from "../audit-BUAajsPU.mjs";
|
|
2
2
|
|
|
3
3
|
//#region src/next/instrumentation.d.ts
|
|
4
4
|
/** Request payload passed to Next.js `onRequestError` (App Router). */
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { C as lockLogger, b as initLogger, m as _log } from "../audit-
|
|
1
|
+
import { C as lockLogger, b as initLogger, m as _log } from "../audit-BFwTUxBJ.mjs";
|
|
2
2
|
//#region src/next/instrumentation.ts
|
|
3
3
|
/**
|
|
4
4
|
* Root `instrumentation.ts` entry: load your real config only in the Node.js runtime so Edge
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instrumentation.mjs","names":[],"sources":["../../src/next/instrumentation.ts"],"sourcesContent":["import type { DrainContext, EnvironmentContext, LogLevel, SamplingConfig } from '../types'\nimport { initLogger, log, lockLogger } from '../logger'\n\n/** Request payload passed to Next.js `onRequestError` (App Router). */\nexport interface NextInstrumentationRequest {\n path: string\n method: string\n headers: Record<string, string>\n}\n\n/** Routing context passed to Next.js `onRequestError`. */\nexport interface NextInstrumentationErrorContext {\n routerKind: string\n routePath: string\n routeType: string\n renderSource: string\n}\n\n/**\n * What `lib/evlog.ts` should export for use with {@link defineNodeInstrumentation}\n * (typically the return values of `createInstrumentation()`).\n */\nexport interface NodeInstrumentationModule {\n register: () => void | Promise<void>\n onRequestError: (\n error: { digest?: string } & Error,\n request: NextInstrumentationRequest,\n context: NextInstrumentationErrorContext,\n ) => void | Promise<void>\n}\n\n/**\n * Root `instrumentation.ts` entry: load your real config only in the Node.js runtime so Edge\n * bundles never pull Node-only drains/adapters. Caches the dynamic `import()` so `register` and\n * repeated `onRequestError` calls share one module instance (avoids re-importing on every error).\n *\n * @example\n * ```ts\n * // instrumentation.ts\n * import { defineNodeInstrumentation } from 'evlog/next/instrumentation'\n *\n * export const { register, onRequestError } = defineNodeInstrumentation(() => import('./lib/evlog'))\n * ```\n */\nexport function defineNodeInstrumentation(loader: () => Promise<NodeInstrumentationModule>) {\n let cached: Promise<NodeInstrumentationModule> | undefined\n\n function load(): Promise<NodeInstrumentationModule> {\n cached ??= loader()\n return cached\n }\n\n return {\n async register() {\n if (process.env.NEXT_RUNTIME !== 'nodejs') return\n const mod = await load()\n await mod.register()\n },\n async onRequestError(\n error: { digest?: string } & Error,\n request: NextInstrumentationRequest,\n context: NextInstrumentationErrorContext,\n ) {\n if (process.env.NEXT_RUNTIME !== 'nodejs') return\n const mod = await load()\n await mod.onRequestError(error, request, context)\n },\n }\n}\n\nexport interface InstrumentationOptions {\n /** Enable or disable all logging globally. @default true */\n enabled?: boolean\n /** Service name for all logged events. */\n service?: string\n /** Environment context overrides. */\n env?: Partial<EnvironmentContext>\n /** Enable pretty printing. @default true in development */\n pretty?: boolean\n /** Suppress built-in console output. @default false */\n silent?: boolean\n /** Sampling configuration for filtering logs. */\n sampling?: SamplingConfig\n /** Minimum severity for the global `log` API. @default 'debug' */\n minLevel?: LogLevel\n /** When pretty is disabled, emit JSON strings or raw objects. @default true */\n stringify?: boolean\n /** Drain callback called with every emitted event. */\n drain?: (ctx: DrainContext) => void | Promise<void>\n /** Capture stdout/stderr output as log events (Node.js only). */\n captureOutput?: boolean\n}\n\ninterface InstrumentationResult {\n register: () => void\n onRequestError: (\n error: { digest?: string } & Error,\n request: NextInstrumentationRequest,\n context: NextInstrumentationErrorContext,\n ) => void\n}\n\nlet patching = false\n\nexport function createInstrumentation(options: InstrumentationOptions = {}): InstrumentationResult {\n let registered = false\n\n function register(): void {\n if (registered) return\n registered = true\n\n initLogger({\n enabled: options.enabled,\n env: {\n service: options.service,\n ...options.env,\n },\n pretty: options.pretty,\n silent: options.silent,\n sampling: options.sampling,\n minLevel: options.minLevel,\n stringify: options.stringify,\n drain: options.drain,\n })\n lockLogger()\n\n if (options.captureOutput && process.env.NEXT_RUNTIME === 'nodejs') {\n patchOutput()\n }\n }\n\n function patchOutput(): void {\n const proc = globalThis.process\n const originalStdoutWrite = proc.stdout.write.bind(proc.stdout)\n const originalStderrWrite = proc.stderr.write.bind(proc.stderr)\n\n proc.stdout.write = function(chunk: unknown, ...args: unknown[]): boolean {\n if (!patching) {\n patching = true\n try {\n log.info({ source: 'stdout', message: String(chunk).trimEnd() })\n } finally {\n patching = false\n }\n }\n return originalStdoutWrite(chunk, ...args as [])\n } as typeof process.stdout.write\n\n proc.stderr.write = function(chunk: unknown, ...args: unknown[]): boolean {\n if (!patching) {\n patching = true\n try {\n log.error({ source: 'stderr', message: String(chunk).trimEnd() })\n } finally {\n patching = false\n }\n }\n return originalStderrWrite(chunk, ...args as [])\n } as typeof process.stderr.write\n }\n\n function onRequestError(\n error: { digest?: string } & Error,\n request: { path: string; method: string; headers: Record<string, string> },\n context: { routerKind: string; routePath: string; routeType: string; renderSource: string },\n ): void {\n log.error({\n message: error.message,\n digest: error.digest,\n stack: error.stack,\n path: request.path,\n method: request.method,\n routerKind: context.routerKind,\n routePath: context.routePath,\n routeType: context.routeType,\n renderSource: context.renderSource,\n })\n }\n\n return { register, onRequestError }\n}\n"],"mappings":";;;;;;;;;;;;;;;AA4CA,SAAgB,0BAA0B,QAAkD;CAC1F,IAAI;CAEJ,SAAS,OAA2C;AAClD,aAAW,QAAQ;AACnB,SAAO;;AAGT,QAAO;EACL,MAAM,WAAW;AACf,OAAI,QAAQ,IAAI,iBAAiB,SAAU;AAE3C,UAAM,MADY,MAAM,EACd,UAAU;;EAEtB,MAAM,eACJ,OACA,SACA,SACA;AACA,OAAI,QAAQ,IAAI,iBAAiB,SAAU;AAE3C,UAAM,MADY,MAAM,EACd,eAAe,OAAO,SAAS,QAAQ;;EAEpD;;AAmCH,IAAI,WAAW;AAEf,SAAgB,sBAAsB,UAAkC,EAAE,EAAyB;CACjG,IAAI,aAAa;CAEjB,SAAS,WAAiB;AACxB,MAAI,WAAY;AAChB,eAAa;AAEb,aAAW;GACT,SAAS,QAAQ;GACjB,KAAK;IACH,SAAS,QAAQ;IACjB,GAAG,QAAQ;IACZ;GACD,QAAQ,QAAQ;GAChB,QAAQ,QAAQ;GAChB,UAAU,QAAQ;GAClB,UAAU,QAAQ;GAClB,WAAW,QAAQ;GACnB,OAAO,QAAQ;GAChB,CAAC;AACF,cAAY;AAEZ,MAAI,QAAQ,iBAAiB,QAAQ,IAAI,iBAAiB,SACxD,cAAa;;CAIjB,SAAS,cAAoB;EAC3B,MAAM,OAAO,WAAW;EACxB,MAAM,sBAAsB,KAAK,OAAO,MAAM,KAAK,KAAK,OAAO;EAC/D,MAAM,sBAAsB,KAAK,OAAO,MAAM,KAAK,KAAK,OAAO;AAE/D,OAAK,OAAO,QAAQ,SAAS,OAAgB,GAAG,MAA0B;AACxE,OAAI,CAAC,UAAU;AACb,eAAW;AACX,QAAI;AACF,UAAI,KAAK;MAAE,QAAQ;MAAU,SAAS,OAAO,MAAM,CAAC,SAAS;MAAE,CAAC;cACxD;AACR,gBAAW;;;AAGf,UAAO,oBAAoB,
|
|
1
|
+
{"version":3,"file":"instrumentation.mjs","names":[],"sources":["../../src/next/instrumentation.ts"],"sourcesContent":["import type { DrainContext, EnvironmentContext, LogLevel, SamplingConfig } from '../types'\nimport { initLogger, log, lockLogger } from '../logger'\n\n/** Request payload passed to Next.js `onRequestError` (App Router). */\nexport interface NextInstrumentationRequest {\n path: string\n method: string\n headers: Record<string, string>\n}\n\n/** Routing context passed to Next.js `onRequestError`. */\nexport interface NextInstrumentationErrorContext {\n routerKind: string\n routePath: string\n routeType: string\n renderSource: string\n}\n\n/**\n * What `lib/evlog.ts` should export for use with {@link defineNodeInstrumentation}\n * (typically the return values of `createInstrumentation()`).\n */\nexport interface NodeInstrumentationModule {\n register: () => void | Promise<void>\n onRequestError: (\n error: { digest?: string } & Error,\n request: NextInstrumentationRequest,\n context: NextInstrumentationErrorContext,\n ) => void | Promise<void>\n}\n\n/**\n * Root `instrumentation.ts` entry: load your real config only in the Node.js runtime so Edge\n * bundles never pull Node-only drains/adapters. Caches the dynamic `import()` so `register` and\n * repeated `onRequestError` calls share one module instance (avoids re-importing on every error).\n *\n * @example\n * ```ts\n * // instrumentation.ts\n * import { defineNodeInstrumentation } from 'evlog/next/instrumentation'\n *\n * export const { register, onRequestError } = defineNodeInstrumentation(() => import('./lib/evlog'))\n * ```\n */\nexport function defineNodeInstrumentation(loader: () => Promise<NodeInstrumentationModule>) {\n let cached: Promise<NodeInstrumentationModule> | undefined\n\n function load(): Promise<NodeInstrumentationModule> {\n cached ??= loader()\n return cached\n }\n\n return {\n async register() {\n if (process.env.NEXT_RUNTIME !== 'nodejs') return\n const mod = await load()\n await mod.register()\n },\n async onRequestError(\n error: { digest?: string } & Error,\n request: NextInstrumentationRequest,\n context: NextInstrumentationErrorContext,\n ) {\n if (process.env.NEXT_RUNTIME !== 'nodejs') return\n const mod = await load()\n await mod.onRequestError(error, request, context)\n },\n }\n}\n\nexport interface InstrumentationOptions {\n /** Enable or disable all logging globally. @default true */\n enabled?: boolean\n /** Service name for all logged events. */\n service?: string\n /** Environment context overrides. */\n env?: Partial<EnvironmentContext>\n /** Enable pretty printing. @default true in development */\n pretty?: boolean\n /** Suppress built-in console output. @default false */\n silent?: boolean\n /** Sampling configuration for filtering logs. */\n sampling?: SamplingConfig\n /** Minimum severity for the global `log` API. @default 'debug' */\n minLevel?: LogLevel\n /** When pretty is disabled, emit JSON strings or raw objects. @default true */\n stringify?: boolean\n /** Drain callback called with every emitted event. */\n drain?: (ctx: DrainContext) => void | Promise<void>\n /** Capture stdout/stderr output as log events (Node.js only). */\n captureOutput?: boolean\n}\n\ninterface InstrumentationResult {\n register: () => void\n onRequestError: (\n error: { digest?: string } & Error,\n request: NextInstrumentationRequest,\n context: NextInstrumentationErrorContext,\n ) => void\n}\n\nlet patching = false\n\nexport function createInstrumentation(options: InstrumentationOptions = {}): InstrumentationResult {\n let registered = false\n\n function register(): void {\n if (registered) return\n registered = true\n\n initLogger({\n enabled: options.enabled,\n env: {\n service: options.service,\n ...options.env,\n },\n pretty: options.pretty,\n silent: options.silent,\n sampling: options.sampling,\n minLevel: options.minLevel,\n stringify: options.stringify,\n drain: options.drain,\n })\n lockLogger()\n\n if (options.captureOutput && process.env.NEXT_RUNTIME === 'nodejs') {\n patchOutput()\n }\n }\n\n function patchOutput(): void {\n const proc = globalThis.process\n const originalStdoutWrite = proc.stdout.write.bind(proc.stdout)\n const originalStderrWrite = proc.stderr.write.bind(proc.stderr)\n\n proc.stdout.write = function(chunk: unknown, ...args: unknown[]): boolean {\n if (!patching) {\n patching = true\n try {\n log.info({ source: 'stdout', message: String(chunk).trimEnd() })\n } finally {\n patching = false\n }\n }\n return originalStdoutWrite(chunk as string, ...args as [])\n } as typeof process.stdout.write\n\n proc.stderr.write = function(chunk: unknown, ...args: unknown[]): boolean {\n if (!patching) {\n patching = true\n try {\n log.error({ source: 'stderr', message: String(chunk).trimEnd() })\n } finally {\n patching = false\n }\n }\n return originalStderrWrite(chunk as string, ...args as [])\n } as typeof process.stderr.write\n }\n\n function onRequestError(\n error: { digest?: string } & Error,\n request: { path: string; method: string; headers: Record<string, string> },\n context: { routerKind: string; routePath: string; routeType: string; renderSource: string },\n ): void {\n log.error({\n message: error.message,\n digest: error.digest,\n stack: error.stack,\n path: request.path,\n method: request.method,\n routerKind: context.routerKind,\n routePath: context.routePath,\n routeType: context.routeType,\n renderSource: context.renderSource,\n })\n }\n\n return { register, onRequestError }\n}\n"],"mappings":";;;;;;;;;;;;;;;AA4CA,SAAgB,0BAA0B,QAAkD;CAC1F,IAAI;CAEJ,SAAS,OAA2C;AAClD,aAAW,QAAQ;AACnB,SAAO;;AAGT,QAAO;EACL,MAAM,WAAW;AACf,OAAI,QAAQ,IAAI,iBAAiB,SAAU;AAE3C,UAAM,MADY,MAAM,EACd,UAAU;;EAEtB,MAAM,eACJ,OACA,SACA,SACA;AACA,OAAI,QAAQ,IAAI,iBAAiB,SAAU;AAE3C,UAAM,MADY,MAAM,EACd,eAAe,OAAO,SAAS,QAAQ;;EAEpD;;AAmCH,IAAI,WAAW;AAEf,SAAgB,sBAAsB,UAAkC,EAAE,EAAyB;CACjG,IAAI,aAAa;CAEjB,SAAS,WAAiB;AACxB,MAAI,WAAY;AAChB,eAAa;AAEb,aAAW;GACT,SAAS,QAAQ;GACjB,KAAK;IACH,SAAS,QAAQ;IACjB,GAAG,QAAQ;IACZ;GACD,QAAQ,QAAQ;GAChB,QAAQ,QAAQ;GAChB,UAAU,QAAQ;GAClB,UAAU,QAAQ;GAClB,WAAW,QAAQ;GACnB,OAAO,QAAQ;GAChB,CAAC;AACF,cAAY;AAEZ,MAAI,QAAQ,iBAAiB,QAAQ,IAAI,iBAAiB,SACxD,cAAa;;CAIjB,SAAS,cAAoB;EAC3B,MAAM,OAAO,WAAW;EACxB,MAAM,sBAAsB,KAAK,OAAO,MAAM,KAAK,KAAK,OAAO;EAC/D,MAAM,sBAAsB,KAAK,OAAO,MAAM,KAAK,KAAK,OAAO;AAE/D,OAAK,OAAO,QAAQ,SAAS,OAAgB,GAAG,MAA0B;AACxE,OAAI,CAAC,UAAU;AACb,eAAW;AACX,QAAI;AACF,UAAI,KAAK;MAAE,QAAQ;MAAU,SAAS,OAAO,MAAM,CAAC,SAAS;MAAE,CAAC;cACxD;AACR,gBAAW;;;AAGf,UAAO,oBAAoB,OAAiB,GAAG,KAAW;;AAG5D,OAAK,OAAO,QAAQ,SAAS,OAAgB,GAAG,MAA0B;AACxE,OAAI,CAAC,UAAU;AACb,eAAW;AACX,QAAI;AACF,UAAI,MAAM;MAAE,QAAQ;MAAU,SAAS,OAAO,MAAM,CAAC,SAAS;MAAE,CAAC;cACzD;AACR,gBAAW;;;AAGf,UAAO,oBAAoB,OAAiB,GAAG,KAAW;;;CAI9D,SAAS,eACP,OACA,SACA,SACM;AACN,OAAI,MAAM;GACR,SAAS,MAAM;GACf,QAAQ,MAAM;GACd,OAAO,MAAM;GACb,MAAM,QAAQ;GACd,QAAQ,QAAQ;GAChB,YAAY,QAAQ;GACpB,WAAW,QAAQ;GACnB,WAAW,QAAQ;GACnB,cAAc,QAAQ;GACvB,CAAC;;AAGJ,QAAO;EAAE;EAAU;EAAgB"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { t as extractErrorStatus } from "../errors-
|
|
2
|
-
import {
|
|
1
|
+
import { t as extractErrorStatus } from "../errors-DA0cyr8q.mjs";
|
|
2
|
+
import { a as serializeEvlogErrorResponse, i as resolveEvlogError, n as markH3ErrorHandled, o as shouldSuppressNitroDevOverlay, s as suppressNitroDevOverlay, t as buildPlainNitroErrorBody } from "../nitro-ClRZLD1g.mjs";
|
|
3
3
|
import { getRequestURL, send, setResponseHeader, setResponseStatus } from "h3";
|
|
4
4
|
import { defineNitroErrorHandler } from "nitropack/runtime/internal/error/utils";
|
|
5
5
|
//#region src/nitro/errorHandler.ts
|
|
@@ -11,25 +11,19 @@ import { defineNitroErrorHandler } from "nitropack/runtime/internal/error/utils"
|
|
|
11
11
|
* For non-EvlogError, it preserves Nitro's default response shape while
|
|
12
12
|
* sanitizing internal error details in production for 5xx errors.
|
|
13
13
|
*/
|
|
14
|
-
var errorHandler_default = defineNitroErrorHandler((error, event) => {
|
|
14
|
+
var errorHandler_default = defineNitroErrorHandler(async (error, event, ctx) => {
|
|
15
|
+
const suppressOverlay = shouldSuppressNitroDevOverlay();
|
|
16
|
+
if (!suppressOverlay) await ctx.defaultHandler(error, event, { silent: false });
|
|
17
|
+
markH3ErrorHandled(event);
|
|
18
|
+
if (suppressOverlay) suppressNitroDevOverlay(error);
|
|
15
19
|
const evlogError = resolveEvlogError(error);
|
|
16
20
|
const isDev = process.env.NODE_ENV === "development";
|
|
17
21
|
const url = getRequestURL(event, { xForwardedHost: true }).pathname;
|
|
18
22
|
if (!evlogError) {
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
const message = isDev ? rawMessage : status >= 500 ? "Internal Server Error" : rawMessage;
|
|
22
|
-
setResponseStatus(event, status);
|
|
23
|
+
const body = buildPlainNitroErrorBody(error, url, isDev);
|
|
24
|
+
setResponseStatus(event, body.status);
|
|
23
25
|
setResponseHeader(event, "Content-Type", "application/json");
|
|
24
|
-
return send(event, JSON.stringify(
|
|
25
|
-
url,
|
|
26
|
-
status,
|
|
27
|
-
statusCode: status,
|
|
28
|
-
statusText: message,
|
|
29
|
-
statusMessage: message,
|
|
30
|
-
message,
|
|
31
|
-
error: true
|
|
32
|
-
}));
|
|
26
|
+
return send(event, JSON.stringify(body));
|
|
33
27
|
}
|
|
34
28
|
setResponseStatus(event, extractErrorStatus(evlogError));
|
|
35
29
|
setResponseHeader(event, "Content-Type", "application/json");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errorHandler.mjs","names":[],"sources":["../../src/nitro/errorHandler.ts"],"sourcesContent":["// Import from specific subpath — the barrel 'nitropack/runtime' re-exports from\n// internal/app.mjs which imports virtual modules that crash outside rollup builds.\nimport { defineNitroErrorHandler } from 'nitropack/runtime/internal/error/utils'\nimport { getRequestURL, setResponseHeader, setResponseStatus, send } from 'h3'\nimport {
|
|
1
|
+
{"version":3,"file":"errorHandler.mjs","names":[],"sources":["../../src/nitro/errorHandler.ts"],"sourcesContent":["// Import from specific subpath — the barrel 'nitropack/runtime' re-exports from\n// internal/app.mjs which imports virtual modules that crash outside rollup builds.\nimport { defineNitroErrorHandler } from 'nitropack/runtime/internal/error/utils'\nimport { getRequestURL, setResponseHeader, setResponseStatus, send } from 'h3'\nimport {\n resolveEvlogError,\n extractErrorStatus,\n buildPlainNitroErrorBody,\n serializeEvlogErrorResponse,\n markH3ErrorHandled,\n shouldSuppressNitroDevOverlay,\n suppressNitroDevOverlay,\n} from '../nitro'\nimport type { NitroErrorHandlerContext } from '../shared/nitro-types'\n\n/**\n * Custom Nitro error handler that properly serializes EvlogError.\n * This ensures that 'data' (containing 'why', 'fix', 'link') is preserved\n * in the JSON response regardless of the underlying HTTP framework.\n *\n * For non-EvlogError, it preserves Nitro's default response shape while\n * sanitizing internal error details in production for 5xx errors.\n */\nexport default defineNitroErrorHandler(async (error, event, ctx: NitroErrorHandlerContext) => {\n const suppressOverlay = shouldSuppressNitroDevOverlay()\n\n if (!suppressOverlay) {\n await ctx.defaultHandler(error, event, { silent: false })\n }\n\n markH3ErrorHandled(event)\n if (suppressOverlay) {\n suppressNitroDevOverlay(error)\n }\n\n const evlogError = resolveEvlogError(error)\n\n const isDev = process.env.NODE_ENV === 'development'\n const url = getRequestURL(event, { xForwardedHost: true }).pathname\n\n if (!evlogError) {\n const body = buildPlainNitroErrorBody(error, url, isDev)\n setResponseStatus(event, body.status as number)\n setResponseHeader(event, 'Content-Type', 'application/json')\n return send(event, JSON.stringify(body))\n }\n\n const status = extractErrorStatus(evlogError)\n\n setResponseStatus(event, status)\n setResponseHeader(event, 'Content-Type', 'application/json')\n\n return send(event, JSON.stringify(serializeEvlogErrorResponse(evlogError, url)))\n})\n"],"mappings":";;;;;;;;;;;;;AAuBA,IAAA,uBAAe,wBAAwB,OAAO,OAAO,OAAO,QAAkC;CAC5F,MAAM,kBAAkB,+BAA+B;AAEvD,KAAI,CAAC,gBACH,OAAM,IAAI,eAAe,OAAO,OAAO,EAAE,QAAQ,OAAO,CAAC;AAG3D,oBAAmB,MAAM;AACzB,KAAI,gBACF,yBAAwB,MAAM;CAGhC,MAAM,aAAa,kBAAkB,MAAM;CAE3C,MAAM,QAAQ,QAAQ,IAAI,aAAa;CACvC,MAAM,MAAM,cAAc,OAAO,EAAE,gBAAgB,MAAM,CAAC,CAAC;AAE3D,KAAI,CAAC,YAAY;EACf,MAAM,OAAO,yBAAyB,OAAO,KAAK,MAAM;AACxD,oBAAkB,OAAO,KAAK,OAAiB;AAC/C,oBAAkB,OAAO,gBAAgB,mBAAmB;AAC5D,SAAO,KAAK,OAAO,KAAK,UAAU,KAAK,CAAC;;AAK1C,mBAAkB,OAFH,mBAAmB,WAEH,CAAC;AAChC,mBAAkB,OAAO,gBAAgB,mBAAmB;AAE5D,QAAO,KAAK,OAAO,KAAK,UAAU,4BAA4B,YAAY,IAAI,CAAC,CAAC;EAChF"}
|
package/dist/nitro/module.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { t as useLogger } from "../useLogger-
|
|
2
|
-
import { t as NitroModuleOptions } from "../nitro-
|
|
1
|
+
import { t as useLogger } from "../useLogger-Dv52PDpH.mjs";
|
|
2
|
+
import { t as NitroModuleOptions } from "../nitro-zCXTylj4.mjs";
|
|
3
3
|
import { Nitro } from "nitropack";
|
|
4
4
|
|
|
5
5
|
//#region src/nitro/module.d.ts
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module.d.mts","names":[],"sources":["../../src/nitro/module.ts"],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"module.d.mts","names":[],"sources":["../../src/nitro/module.ts"],"mappings":";;;;;iBAkBwB,KAAA,CAAM,OAAA,GAAU,kBAAA;;eAGvB,KAAA;AAAA"}
|
package/dist/nitro/module.mjs
CHANGED
|
@@ -1,18 +1,24 @@
|
|
|
1
1
|
import { useLogger } from "../runtime/server/useLogger.mjs";
|
|
2
|
+
import { r as prependNitroErrorHandler } from "../nitro-ClRZLD1g.mjs";
|
|
2
3
|
import { dirname, resolve } from "node:path";
|
|
3
4
|
import { fileURLToPath } from "node:url";
|
|
4
5
|
//#region src/nitro/module.ts
|
|
5
6
|
const _dir = dirname(fileURLToPath(import.meta.url));
|
|
7
|
+
function resolveModulePath(name) {
|
|
8
|
+
return resolve(_dir, name).replace(/\\/g, "/");
|
|
9
|
+
}
|
|
6
10
|
function evlog(options) {
|
|
7
11
|
return {
|
|
8
12
|
name: "evlog",
|
|
9
13
|
setup(nitro) {
|
|
10
14
|
nitro.options.plugins = nitro.options.plugins || [];
|
|
11
|
-
nitro.options.plugins.push(
|
|
12
|
-
|
|
15
|
+
nitro.options.plugins.push(resolveModulePath("plugin"));
|
|
16
|
+
nitro.options.errorHandler = prependNitroErrorHandler(nitro.options.errorHandler, resolveModulePath("errorHandler"));
|
|
13
17
|
nitro.options.noExternals = true;
|
|
14
18
|
nitro.options.runtimeConfig = nitro.options.runtimeConfig || {};
|
|
15
19
|
nitro.options.runtimeConfig.evlog = options || {};
|
|
20
|
+
nitro.options.replace = nitro.options.replace || {};
|
|
21
|
+
nitro.options.replace.__EVLOG_CONFIG__ = JSON.stringify(options || {});
|
|
16
22
|
process.env.__EVLOG_CONFIG = JSON.stringify(options || {});
|
|
17
23
|
}
|
|
18
24
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module.mjs","names":[],"sources":["../../src/nitro/module.ts"],"sourcesContent":["import { dirname, resolve } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport type { Nitro } from 'nitropack'\nimport type { NitroModuleOptions } from '../nitro'\n\nexport type { NitroModuleOptions }\n\nconst _dir = dirname(fileURLToPath(import.meta.url))\n\nexport default function evlog(options?: NitroModuleOptions) {\n return {\n name: 'evlog',\n setup(nitro: Nitro) {\n // Push the plugin (no extension — Nitro's bundler resolves it)\n nitro.options.plugins = nitro.options.plugins || []\n nitro.options.plugins.push(
|
|
1
|
+
{"version":3,"file":"module.mjs","names":[],"sources":["../../src/nitro/module.ts"],"sourcesContent":["import { dirname, resolve } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport type { Nitro } from 'nitropack'\nimport type { NitroModuleOptions } from '../nitro'\nimport { prependNitroErrorHandler } from '../nitro'\n\nexport type { NitroModuleOptions }\n\nconst _dir = dirname(fileURLToPath(import.meta.url))\n\n// Nitro raw-interpolates these paths into JS string literals when generating\n// the #nitro/virtual/plugins and #nitro/virtual/error-handler modules, so\n// Windows backslashes would be parsed as escape sequences (\\n, \\v, …) and\n// break module resolution. Normalize to POSIX separators.\nfunction resolveModulePath(name: string): string {\n return resolve(_dir, name).replace(/\\\\/g, '/')\n}\n\nexport default function evlog(options?: NitroModuleOptions) {\n return {\n name: 'evlog',\n setup(nitro: Nitro) {\n // Push the plugin (no extension — Nitro's bundler resolves it)\n nitro.options.plugins = nitro.options.plugins || []\n nitro.options.plugins.push(resolveModulePath('plugin'))\n\n // Prepend so evlog runs before any framework handler (Nuxt registers its own).\n nitro.options.errorHandler = prependNitroErrorHandler(\n nitro.options.errorHandler,\n resolveModulePath('errorHandler'),\n )\n\n // explicitly tell nitro to bundle evlog's files to correctly resolve nitro dependencies\n // in nitro v2 we can only disable externals globally\n\n nitro.options.noExternals = true\n\n // Inject config into runtimeConfig — works in production where the\n // plugin is bundled through Nitro's builder and the virtual\n // runtime-config module resolves correctly.\n nitro.options.runtimeConfig = nitro.options.runtimeConfig || {}\n nitro.options.runtimeConfig.evlog = options || {}\n\n // Bake the config into the bundle as a literal so the plugin never has\n // to do a runtime `import('nitropack/runtime/internal/config')` to\n // discover it. The dynamic probe transitively imports a build-only\n // virtual module; on Vercel + Bun the missing virtual triggers Bun's\n // auto-installer and crashes with `ReadOnlyFileSystem` (issue #312).\n nitro.options.replace = nitro.options.replace || {}\n nitro.options.replace.__EVLOG_CONFIG__ = JSON.stringify(options || {})\n\n // In dev mode, Nitro loads plugins externally (not bundled), so the\n // virtual runtime-config module is unreachable and useRuntimeConfig()\n // returns a stub without our values. process.env is inherited by the\n // Worker Threads that run the dev server, making it a reliable bridge.\n // The plugin reads: useRuntimeConfig().evlog ?? process.env.__EVLOG_CONFIG\n process.env.__EVLOG_CONFIG = JSON.stringify(options || {})\n },\n }\n}\n\nexport { useLogger } from '../runtime/server/useLogger'\n"],"mappings":";;;;;AAQA,MAAM,OAAO,QAAQ,cAAc,OAAO,KAAK,IAAI,CAAC;AAMpD,SAAS,kBAAkB,MAAsB;AAC/C,QAAO,QAAQ,MAAM,KAAK,CAAC,QAAQ,OAAO,IAAI;;AAGhD,SAAwB,MAAM,SAA8B;AAC1D,QAAO;EACL,MAAM;EACN,MAAM,OAAc;AAElB,SAAM,QAAQ,UAAU,MAAM,QAAQ,WAAW,EAAE;AACnD,SAAM,QAAQ,QAAQ,KAAK,kBAAkB,SAAS,CAAC;AAGvD,SAAM,QAAQ,eAAe,yBAC3B,MAAM,QAAQ,cACd,kBAAkB,eAAe,CAClC;AAKD,SAAM,QAAQ,cAAc;AAK5B,SAAM,QAAQ,gBAAgB,MAAM,QAAQ,iBAAiB,EAAE;AAC/D,SAAM,QAAQ,cAAc,QAAQ,WAAW,EAAE;AAOjD,SAAM,QAAQ,UAAU,MAAM,QAAQ,WAAW,EAAE;AACnD,SAAM,QAAQ,QAAQ,mBAAmB,KAAK,UAAU,WAAW,EAAE,CAAC;AAOtE,WAAQ,IAAI,iBAAiB,KAAK,UAAU,WAAW,EAAE,CAAC;;EAE7D"}
|
package/dist/nitro/plugin.mjs
CHANGED
|
@@ -1,8 +1,12 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { n as readCodeSnippetFromDisk } from "../pretty-error-snippet.node-c_bzjg7g.mjs";
|
|
2
2
|
import { filterSafeHeaders } from "../utils.mjs";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
3
|
+
import { N as normalizeRedactConfig, b as initLogger, g as createRequestLogger, x as isEnabled, y as getGlobalPluginRunner } from "../audit-BFwTUxBJ.mjs";
|
|
4
|
+
import { i as registerPrettyErrorSnippetReader } from "../pretty-error-CVVgwlTn.mjs";
|
|
5
|
+
import { t as extractErrorStatus } from "../errors-DA0cyr8q.mjs";
|
|
6
|
+
import { i as setActiveNitroRuntime, r as resolveEvlogConfigForNitroPlugin } from "../nitroConfigBridge-BkVWnSV3.mjs";
|
|
7
|
+
import { n as shouldLog, t as getServiceForPath } from "../routes-4rMzRyTk.mjs";
|
|
8
|
+
import { r as enrichErrorStackForDev, t as callEnrichAndDrain } from "../enrich-drain-CG_2Nix-.mjs";
|
|
9
|
+
import { r as shouldDeferEmitForResponse, t as bindStreamingResponseLifecycle } from "../streamResponse-CmQ3qUbF.mjs";
|
|
6
10
|
import { startStreamServer } from "../stream.mjs";
|
|
7
11
|
import { defineNitroPlugin } from "nitropack/runtime/internal/plugin";
|
|
8
12
|
import { getHeaders } from "h3";
|
|
@@ -10,74 +14,22 @@ import { getHeaders } from "h3";
|
|
|
10
14
|
function getSafeHeaders(event) {
|
|
11
15
|
return filterSafeHeaders(getHeaders(event));
|
|
12
16
|
}
|
|
13
|
-
function getSafeResponseHeaders(event) {
|
|
14
|
-
const headers = {};
|
|
15
|
-
const nodeRes = event.node?.res;
|
|
16
|
-
if (nodeRes?.getHeaders) for (const [key, value] of Object.entries(nodeRes.getHeaders())) {
|
|
17
|
-
if (value === void 0) continue;
|
|
18
|
-
headers[key] = Array.isArray(value) ? value.join(", ") : String(value);
|
|
19
|
-
}
|
|
20
|
-
if (event.response?.headers) event.response.headers.forEach((value, key) => {
|
|
21
|
-
headers[key] = value;
|
|
22
|
-
});
|
|
23
|
-
if (Object.keys(headers).length === 0) return void 0;
|
|
24
|
-
return filterSafeHeaders(headers);
|
|
25
|
-
}
|
|
26
17
|
function getResponseStatus(event) {
|
|
27
18
|
if (event.node?.res?.statusCode) return event.node.res.statusCode;
|
|
28
19
|
if (event.response?.status) return event.response.status;
|
|
29
20
|
if (typeof event.context.status === "number") return event.context.status;
|
|
30
21
|
return 200;
|
|
31
22
|
}
|
|
32
|
-
function buildHookContext(event) {
|
|
33
|
-
const responseHeaders = getSafeResponseHeaders(event);
|
|
34
|
-
return {
|
|
35
|
-
request: {
|
|
36
|
-
method: event.method,
|
|
37
|
-
path: event.path
|
|
38
|
-
},
|
|
39
|
-
headers: getSafeHeaders(event),
|
|
40
|
-
response: {
|
|
41
|
-
status: getResponseStatus(event),
|
|
42
|
-
headers: responseHeaders
|
|
43
|
-
}
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
|
-
async function callEnrichAndDrain(nitroApp, emittedEvent, event) {
|
|
47
|
-
if (!emittedEvent) return;
|
|
48
|
-
const hookContext = buildHookContext(event);
|
|
49
|
-
const enrichCtx = {
|
|
50
|
-
event: emittedEvent,
|
|
51
|
-
...hookContext
|
|
52
|
-
};
|
|
53
|
-
const runner = getGlobalPluginRunner();
|
|
54
|
-
try {
|
|
55
|
-
await nitroApp.hooks.callHook("evlog:enrich", enrichCtx);
|
|
56
|
-
} catch (err) {
|
|
57
|
-
console.error("[evlog] enrich failed:", err);
|
|
58
|
-
}
|
|
59
|
-
if (runner.hasEnrich) await runner.runEnrich(enrichCtx);
|
|
60
|
-
const drainCtx = {
|
|
61
|
-
event: emittedEvent,
|
|
62
|
-
request: hookContext.request,
|
|
63
|
-
headers: hookContext.headers
|
|
64
|
-
};
|
|
65
|
-
const drainTasks = [nitroApp.hooks.callHook("evlog:drain", drainCtx).catch((err) => {
|
|
66
|
-
console.error("[evlog] drain failed:", err);
|
|
67
|
-
})];
|
|
68
|
-
if (runner.hasDrain) drainTasks.push(runner.runDrain(drainCtx));
|
|
69
|
-
const drainPromise = Promise.all(drainTasks);
|
|
70
|
-
const waitUntilCtx = event.context.cloudflare?.context ?? event.context;
|
|
71
|
-
if (typeof waitUntilCtx?.waitUntil === "function") waitUntilCtx.waitUntil(drainPromise);
|
|
72
|
-
else await drainPromise;
|
|
73
|
-
}
|
|
74
23
|
var plugin_default = defineNitroPlugin(async (nitroApp) => {
|
|
24
|
+
setActiveNitroRuntime("v2");
|
|
75
25
|
const evlogConfig = await resolveEvlogConfigForNitroPlugin();
|
|
76
26
|
const redact = normalizeRedactConfig(evlogConfig?.redact);
|
|
27
|
+
registerPrettyErrorSnippetReader(readCodeSnippetFromDisk);
|
|
77
28
|
initLogger({
|
|
78
29
|
enabled: evlogConfig?.enabled,
|
|
79
30
|
env: evlogConfig?.env,
|
|
80
31
|
pretty: evlogConfig?.pretty,
|
|
32
|
+
dev: evlogConfig?.dev,
|
|
81
33
|
silent: evlogConfig?.silent,
|
|
82
34
|
sampling: evlogConfig?.sampling,
|
|
83
35
|
minLevel: evlogConfig?.minLevel,
|
|
@@ -131,8 +83,12 @@ var plugin_default = defineNitroPlugin(async (nitroApp) => {
|
|
|
131
83
|
if (!e) return;
|
|
132
84
|
if (!e.context._evlogShouldEmit) return;
|
|
133
85
|
const requestLog = e.context.log;
|
|
134
|
-
if (requestLog)
|
|
135
|
-
|
|
86
|
+
if (!requestLog) return;
|
|
87
|
+
e.context._evlogEmitting = true;
|
|
88
|
+
try {
|
|
89
|
+
const err = error;
|
|
90
|
+
enrichErrorStackForDev(err, { pretty: evlogConfig?.pretty });
|
|
91
|
+
requestLog.error(err);
|
|
136
92
|
const errorStatus = extractErrorStatus(error);
|
|
137
93
|
requestLog.set({ status: errorStatus });
|
|
138
94
|
const startTime = e.context._evlogStartTime;
|
|
@@ -147,15 +103,23 @@ var plugin_default = defineNitroPlugin(async (nitroApp) => {
|
|
|
147
103
|
await nitroApp.hooks.callHook("evlog:emit:keep", tailCtx);
|
|
148
104
|
const runner = getGlobalPluginRunner();
|
|
149
105
|
if (runner.hasKeep) await runner.runKeep(tailCtx);
|
|
150
|
-
|
|
151
|
-
|
|
106
|
+
const emittedEvent = requestLog.emit({ _forceKeep: tailCtx.shouldKeep });
|
|
107
|
+
if (emittedEvent) {
|
|
108
|
+
e.context._evlogEmitted = true;
|
|
109
|
+
callEnrichAndDrain(nitroApp, emittedEvent, e, { deferDrain: true }).catch((err) => {
|
|
110
|
+
console.error("[evlog] background enrich/drain failed:", err);
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
} finally {
|
|
114
|
+
delete e.context._evlogEmitting;
|
|
152
115
|
}
|
|
153
116
|
});
|
|
154
117
|
nitroApp.hooks.hook("afterResponse", async (event) => {
|
|
155
118
|
const e = event;
|
|
156
|
-
if (e.context._evlogEmitted || !e.context._evlogShouldEmit) return;
|
|
119
|
+
if (e.context._evlogEmitted || e.context._evlogEmitting || !e.context._evlogShouldEmit) return;
|
|
157
120
|
const requestLog = e.context.log;
|
|
158
|
-
if (requestLog)
|
|
121
|
+
if (!requestLog) return;
|
|
122
|
+
const emitSuccessResponse = async () => {
|
|
159
123
|
const status = getResponseStatus(e);
|
|
160
124
|
requestLog.set({ status });
|
|
161
125
|
const startTime = e.context._evlogStartTime;
|
|
@@ -171,7 +135,15 @@ var plugin_default = defineNitroPlugin(async (nitroApp) => {
|
|
|
171
135
|
const runner = getGlobalPluginRunner();
|
|
172
136
|
if (runner.hasKeep) await runner.runKeep(tailCtx);
|
|
173
137
|
await callEnrichAndDrain(nitroApp, requestLog.emit({ _forceKeep: tailCtx.shouldKeep }), e);
|
|
138
|
+
};
|
|
139
|
+
if (e.response && shouldDeferEmitForResponse(e.response)) {
|
|
140
|
+
e.response = bindStreamingResponseLifecycle(e.response, async (meta) => {
|
|
141
|
+
if (meta.error) requestLog.error(meta.error);
|
|
142
|
+
await emitSuccessResponse();
|
|
143
|
+
});
|
|
144
|
+
return;
|
|
174
145
|
}
|
|
146
|
+
await emitSuccessResponse();
|
|
175
147
|
});
|
|
176
148
|
});
|
|
177
149
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.mjs","names":[],"sources":["../../src/nitro/plugin.ts"],"sourcesContent":["import type { NitroApp } from 'nitropack/types'\n// Import from specific subpaths to avoid the barrel 'nitropack/runtime' which\n// re-exports from internal/app.mjs — that file imports #nitro-internal-virtual/*\n// modules that only exist inside rollup builds and crash when loaded externally\n// (nitropack dev loads plugins outside the bundle via Worker threads).\nimport { defineNitroPlugin } from 'nitropack/runtime/internal/plugin'\nimport { getHeaders } from 'h3'\nimport { createRequestLogger, getGlobalPluginRunner, initLogger, isEnabled } from '../logger'\nimport { shouldLog, getServiceForPath, extractErrorStatus } from '../nitro'\nimport { normalizeRedactConfig } from '../redact'\nimport { resolveEvlogConfigForNitroPlugin } from '../shared/nitroConfigBridge'\nimport { startStreamServer, type StreamServerOptions } from '../stream'\nimport type { EnrichContext, RequestLogger, ServerEvent, TailSamplingContext, WideEvent } from '../types'\nimport { filterSafeHeaders } from '../utils'\n\nfunction getSafeHeaders(event: ServerEvent): Record<string, string> {\n const allHeaders = getHeaders(event as Parameters<typeof getHeaders>[0])\n return filterSafeHeaders(allHeaders)\n}\n\nfunction getSafeResponseHeaders(event: ServerEvent): Record<string, string> | undefined {\n const headers: Record<string, string> = {}\n const nodeRes = event.node?.res as { getHeaders?: () => Record<string, unknown> } | undefined\n\n if (nodeRes?.getHeaders) {\n for (const [key, value] of Object.entries(nodeRes.getHeaders())) {\n if (value === undefined) continue\n headers[key] = Array.isArray(value) ? value.join(', ') : String(value)\n }\n }\n\n if (event.response?.headers) {\n event.response.headers.forEach((value, key) => {\n headers[key] = value\n })\n }\n\n if (Object.keys(headers).length === 0) return undefined\n return filterSafeHeaders(headers)\n}\n\nfunction getResponseStatus(event: ServerEvent): number {\n // Node.js style\n if (event.node?.res?.statusCode) {\n return event.node.res.statusCode\n }\n\n // Web Standard\n if (event.response?.status) {\n return event.response.status\n }\n\n // Context-based\n if (typeof event.context.status === 'number') {\n return event.context.status\n }\n\n return 200\n}\n\nfunction buildHookContext(event: ServerEvent): Omit<EnrichContext, 'event'> {\n const responseHeaders = getSafeResponseHeaders(event)\n return {\n request: { method: event.method, path: event.path },\n headers: getSafeHeaders(event),\n response: {\n status: getResponseStatus(event),\n headers: responseHeaders,\n },\n }\n}\n\nasync function callEnrichAndDrain(\n nitroApp: NitroApp,\n emittedEvent: WideEvent | null,\n event: ServerEvent,\n): Promise<void> {\n if (!emittedEvent) return\n\n const hookContext = buildHookContext(event)\n const enrichCtx: EnrichContext = { event: emittedEvent, ...hookContext }\n const runner = getGlobalPluginRunner()\n\n try {\n await nitroApp.hooks.callHook('evlog:enrich', enrichCtx)\n } catch (err) {\n console.error('[evlog] enrich failed:', err)\n }\n if (runner.hasEnrich) {\n await runner.runEnrich(enrichCtx)\n }\n\n const drainCtx = {\n event: emittedEvent,\n request: hookContext.request,\n headers: hookContext.headers,\n }\n const drainTasks: Array<Promise<unknown>> = [\n nitroApp.hooks.callHook('evlog:drain', drainCtx).catch((err) => {\n console.error('[evlog] drain failed:', err)\n }),\n ]\n if (runner.hasDrain) {\n drainTasks.push(runner.runDrain(drainCtx))\n }\n const drainPromise = Promise.all(drainTasks)\n\n // Use waitUntil if available (Cloudflare Workers, Vercel Edge, etc.)\n // This keeps the runtime alive for background work without blocking the response\n const waitUntilCtx = event.context.cloudflare?.context ?? event.context\n if (typeof waitUntilCtx?.waitUntil === 'function') {\n waitUntilCtx.waitUntil(drainPromise)\n } else {\n // Fallback: await drain to prevent lost logs in serverless environments\n // (e.g. Vercel Fluid Compute). On the normal path this runs from\n // afterResponse (response already sent); on the error path it may run\n // before the error response is finalized.\n await drainPromise\n }\n}\n\nexport default defineNitroPlugin(async (nitroApp) => {\n const evlogConfig = await resolveEvlogConfigForNitroPlugin()\n\n const redact = normalizeRedactConfig(evlogConfig?.redact as boolean | Record<string, unknown> | undefined)\n\n initLogger({\n enabled: evlogConfig?.enabled,\n env: evlogConfig?.env,\n pretty: evlogConfig?.pretty,\n silent: evlogConfig?.silent,\n sampling: evlogConfig?.sampling,\n minLevel: evlogConfig?.minLevel,\n redact,\n _suppressDrainWarning: true,\n })\n\n // When `evlog.stream` is set (or auto-on in dev), boot the mini stream\n // server and hook every drained event into it. The server runs on its\n // own ephemeral port — the user's API surface is untouched.\n const streamSetting = (evlogConfig as { stream?: boolean | StreamServerOptions } | undefined)?.stream\n if (streamSetting === true || (streamSetting && typeof streamSetting === 'object')) {\n const streamOpts: StreamServerOptions = streamSetting === true ? {} : streamSetting\n startStreamServer(streamOpts).then((server) => {\n nitroApp.hooks.hook('evlog:drain', (ctx) => {\n if (ctx?.event) server.drain(ctx)\n })\n }).catch((err) => {\n console.error('[evlog] failed to start stream server:', err)\n })\n }\n\n // When globally disabled, createRequestLogger returns a no-op logger — still\n // attach it so handlers can call useLogger(event) without throwing.\n if (!isEnabled()) {\n nitroApp.hooks.hook('request', (event) => {\n const e = event as ServerEvent\n let requestIdOverride: string | undefined\n if (globalThis.navigator?.userAgent === 'Cloudflare-Workers') {\n const cfRay = getSafeHeaders(e)?.['cf-ray']\n if (cfRay) requestIdOverride = cfRay\n }\n e.context.log = createRequestLogger({\n method: e.method,\n path: e.path,\n requestId: requestIdOverride || e.context.requestId || crypto.randomUUID(),\n }, { _deferDrain: true })\n })\n return\n }\n\n nitroApp.hooks.hook('request', (event) => {\n const e = event as ServerEvent\n\n // Evaluate route filtering but always create the logger so that server\n // middleware (which runs for every request) can call useLogger(event)\n // without throwing. Filtering is enforced at emit time instead.\n e.context._evlogShouldEmit = shouldLog(e.path, evlogConfig?.include, evlogConfig?.exclude)\n\n // Store start time for duration calculation in tail sampling\n e.context._evlogStartTime = Date.now()\n\n let requestIdOverride: string | undefined = undefined\n if (globalThis.navigator?.userAgent === 'Cloudflare-Workers') {\n const cfRay = getSafeHeaders(e)?.['cf-ray']\n if (cfRay) requestIdOverride = cfRay\n }\n\n const requestLog = createRequestLogger({\n method: e.method,\n path: e.path,\n requestId: requestIdOverride || e.context.requestId || crypto.randomUUID(),\n }, { _deferDrain: true })\n\n // Apply route-based service configuration if a matching route is found\n const routeService = getServiceForPath(e.path, evlogConfig?.routes)\n if (routeService) {\n requestLog.set({ service: routeService })\n }\n\n e.context.log = requestLog\n })\n\n nitroApp.hooks.hook('error', async (error, { event }) => {\n const e = event as ServerEvent | undefined\n if (!e) return\n if (!e.context._evlogShouldEmit) return\n\n const requestLog = e.context.log as RequestLogger | undefined\n if (requestLog) {\n requestLog.error(error as Error)\n\n const errorStatus = extractErrorStatus(error)\n requestLog.set({ status: errorStatus })\n\n // Build tail sampling context\n const startTime = e.context._evlogStartTime as number | undefined\n const durationMs = startTime ? Date.now() - startTime : undefined\n\n const tailCtx: TailSamplingContext = {\n status: errorStatus,\n duration: durationMs,\n path: e.path,\n method: e.method,\n context: requestLog.getContext(),\n shouldKeep: false,\n }\n\n // Call evlog:emit:keep hook + plugin runner keep hook\n await nitroApp.hooks.callHook('evlog:emit:keep', tailCtx)\n const runner = getGlobalPluginRunner()\n if (runner.hasKeep) await runner.runKeep(tailCtx)\n\n e.context._evlogEmitted = true\n\n const emittedEvent = requestLog.emit({ _forceKeep: tailCtx.shouldKeep })\n await callEnrichAndDrain(nitroApp, emittedEvent, e)\n }\n })\n\n nitroApp.hooks.hook('afterResponse', async (event) => {\n const e = event as ServerEvent\n // Skip if already emitted by error hook or route was filtered out\n if (e.context._evlogEmitted || !e.context._evlogShouldEmit) return\n\n const requestLog = e.context.log as RequestLogger | undefined\n if (requestLog) {\n const status = getResponseStatus(e)\n requestLog.set({ status })\n\n const startTime = e.context._evlogStartTime as number | undefined\n const durationMs = startTime ? Date.now() - startTime : undefined\n\n const tailCtx: TailSamplingContext = {\n status,\n duration: durationMs,\n path: e.path,\n method: e.method,\n context: requestLog.getContext(),\n shouldKeep: false,\n }\n\n await nitroApp.hooks.callHook('evlog:emit:keep', tailCtx)\n const runner = getGlobalPluginRunner()\n if (runner.hasKeep) await runner.runKeep(tailCtx)\n\n const emittedEvent = requestLog.emit({ _forceKeep: tailCtx.shouldKeep })\n await callEnrichAndDrain(nitroApp, emittedEvent, e)\n }\n })\n})\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"plugin.mjs","names":[],"sources":["../../src/nitro/plugin.ts"],"sourcesContent":["// Import from specific subpaths to avoid the barrel 'nitropack/runtime' which\n// re-exports from internal/app.mjs — that file imports #nitro-internal-virtual/*\n// modules that only exist inside rollup builds and crash when loaded externally\n// (nitropack dev loads plugins outside the bundle via Worker threads).\nimport { defineNitroPlugin } from 'nitropack/runtime/internal/plugin'\nimport { getHeaders } from 'h3'\nimport { createRequestLogger, getGlobalPluginRunner, initLogger, isEnabled, markWideEventDrainStarted } from '../logger'\nimport { registerPrettyErrorSnippetReader } from '../shared/pretty-error'\nimport { readCodeSnippetFromDisk } from '../shared/pretty-error-snippet.node'\nimport { enrichErrorStackForDev } from '../shared/enrich-error-stack.node'\nimport { shouldLog, getServiceForPath, extractErrorStatus } from '../nitro'\nimport { normalizeRedactConfig } from '../redact'\nimport { resolveEvlogConfigForNitroPlugin, setActiveNitroRuntime } from '../shared/nitroConfigBridge'\nimport { bindStreamingResponseLifecycle, shouldDeferEmitForResponse } from '../shared/streamResponse'\nimport { startStreamServer, type StreamServerOptions } from '../stream'\nimport type { RequestLogger, ServerEvent, TailSamplingContext } from '../types'\nimport { filterSafeHeaders } from '../utils'\nimport { callEnrichAndDrain } from './enrich-drain'\n\nfunction getSafeHeaders(event: ServerEvent): Record<string, string> {\n const allHeaders = getHeaders(event as Parameters<typeof getHeaders>[0])\n return filterSafeHeaders(allHeaders)\n}\n\nfunction getResponseStatus(event: ServerEvent): number {\n // Node.js style\n if (event.node?.res?.statusCode) {\n return event.node.res.statusCode\n }\n\n // Web Standard\n if (event.response?.status) {\n return event.response.status\n }\n\n // Context-based\n if (typeof event.context.status === 'number') {\n return event.context.status\n }\n\n return 200\n}\n\n\nexport default defineNitroPlugin(async (nitroApp) => {\n setActiveNitroRuntime('v2')\n const evlogConfig = await resolveEvlogConfigForNitroPlugin()\n\n const redact = normalizeRedactConfig(evlogConfig?.redact as boolean | Record<string, unknown> | undefined)\n\n registerPrettyErrorSnippetReader(readCodeSnippetFromDisk)\n\n initLogger({\n enabled: evlogConfig?.enabled,\n env: evlogConfig?.env,\n pretty: evlogConfig?.pretty,\n dev: evlogConfig?.dev,\n silent: evlogConfig?.silent,\n sampling: evlogConfig?.sampling,\n minLevel: evlogConfig?.minLevel,\n redact,\n _suppressDrainWarning: true,\n })\n\n // When `evlog.stream` is set (or auto-on in dev), boot the mini stream\n // server and hook every drained event into it. The server runs on its\n // own ephemeral port — the user's API surface is untouched.\n const streamSetting = (evlogConfig as { stream?: boolean | StreamServerOptions } | undefined)?.stream\n if (streamSetting === true || (streamSetting && typeof streamSetting === 'object')) {\n const streamOpts: StreamServerOptions = streamSetting === true ? {} : streamSetting\n startStreamServer(streamOpts).then((server) => {\n nitroApp.hooks.hook('evlog:drain', (ctx) => {\n if (ctx?.event) server.drain(ctx)\n })\n }).catch((err) => {\n console.error('[evlog] failed to start stream server:', err)\n })\n }\n\n // When globally disabled, createRequestLogger returns a no-op logger — still\n // attach it so handlers can call useLogger(event) without throwing.\n if (!isEnabled()) {\n nitroApp.hooks.hook('request', (event) => {\n const e = event as ServerEvent\n let requestIdOverride: string | undefined\n if (globalThis.navigator?.userAgent === 'Cloudflare-Workers') {\n const cfRay = getSafeHeaders(e)?.['cf-ray']\n if (cfRay) requestIdOverride = cfRay\n }\n e.context.log = createRequestLogger({\n method: e.method,\n path: e.path,\n requestId: requestIdOverride || e.context.requestId || crypto.randomUUID(),\n }, { _deferDrain: true })\n })\n return\n }\n\n nitroApp.hooks.hook('request', (event) => {\n const e = event as ServerEvent\n\n // Evaluate route filtering but always create the logger so that server\n // middleware (which runs for every request) can call useLogger(event)\n // without throwing. Filtering is enforced at emit time instead.\n e.context._evlogShouldEmit = shouldLog(e.path, evlogConfig?.include, evlogConfig?.exclude)\n\n // Store start time for duration calculation in tail sampling\n e.context._evlogStartTime = Date.now()\n\n let requestIdOverride: string | undefined = undefined\n if (globalThis.navigator?.userAgent === 'Cloudflare-Workers') {\n const cfRay = getSafeHeaders(e)?.['cf-ray']\n if (cfRay) requestIdOverride = cfRay\n }\n\n const requestLog = createRequestLogger({\n method: e.method,\n path: e.path,\n requestId: requestIdOverride || e.context.requestId || crypto.randomUUID(),\n }, { _deferDrain: true })\n\n // Apply route-based service configuration if a matching route is found\n const routeService = getServiceForPath(e.path, evlogConfig?.routes)\n if (routeService) {\n requestLog.set({ service: routeService })\n }\n\n e.context.log = requestLog\n })\n\n nitroApp.hooks.hook('error', async (error, { event }) => {\n const e = event as ServerEvent | undefined\n if (!e) return\n if (!e.context._evlogShouldEmit) return\n\n const requestLog = e.context.log as RequestLogger | undefined\n if (!requestLog) return\n\n e.context._evlogEmitting = true\n try {\n const err = error as Error\n void enrichErrorStackForDev(err, { pretty: evlogConfig?.pretty })\n requestLog.error(err)\n\n const errorStatus = extractErrorStatus(error)\n requestLog.set({ status: errorStatus })\n\n const startTime = e.context._evlogStartTime as number | undefined\n const durationMs = startTime ? Date.now() - startTime : undefined\n\n const tailCtx: TailSamplingContext = {\n status: errorStatus,\n duration: durationMs,\n path: e.path,\n method: e.method,\n context: requestLog.getContext(),\n shouldKeep: false,\n }\n\n await nitroApp.hooks.callHook('evlog:emit:keep', tailCtx)\n const runner = getGlobalPluginRunner()\n if (runner.hasKeep) await runner.runKeep(tailCtx)\n\n const emittedEvent = requestLog.emit({ _forceKeep: tailCtx.shouldKeep })\n if (emittedEvent) {\n e.context._evlogEmitted = true\n void callEnrichAndDrain(nitroApp, emittedEvent, e, { deferDrain: true }).catch((err) => {\n console.error('[evlog] background enrich/drain failed:', err)\n })\n }\n } finally {\n delete e.context._evlogEmitting\n }\n })\n\n nitroApp.hooks.hook('afterResponse', async (event) => {\n const e = event as ServerEvent\n if (e.context._evlogEmitted || e.context._evlogEmitting || !e.context._evlogShouldEmit) return\n\n const requestLog = e.context.log as RequestLogger | undefined\n if (!requestLog) return\n\n const emitSuccessResponse = async () => {\n const status = getResponseStatus(e)\n requestLog.set({ status })\n\n const startTime = e.context._evlogStartTime as number | undefined\n const durationMs = startTime ? Date.now() - startTime : undefined\n\n const tailCtx: TailSamplingContext = {\n status,\n duration: durationMs,\n path: e.path,\n method: e.method,\n context: requestLog.getContext(),\n shouldKeep: false,\n }\n\n await nitroApp.hooks.callHook('evlog:emit:keep', tailCtx)\n const runner = getGlobalPluginRunner()\n if (runner.hasKeep) await runner.runKeep(tailCtx)\n\n const emittedEvent = requestLog.emit({ _forceKeep: tailCtx.shouldKeep })\n await callEnrichAndDrain(nitroApp, emittedEvent, e)\n }\n\n if (e.response && shouldDeferEmitForResponse(e.response)) {\n e.response = bindStreamingResponseLifecycle(e.response, async (meta) => {\n if (meta.error) {\n requestLog.error(meta.error)\n }\n await emitSuccessResponse()\n })\n return\n }\n\n await emitSuccessResponse()\n })\n})\n"],"mappings":"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"}
|
|
@@ -6,16 +6,9 @@ import * as _$nitro_types0 from "nitro/types";
|
|
|
6
6
|
* This ensures that 'data' (containing 'why', 'fix', 'link') is preserved
|
|
7
7
|
* in the JSON response regardless of the underlying HTTP framework.
|
|
8
8
|
*
|
|
9
|
-
* For non-EvlogError, returns undefined to let Nitro's default handler take over.
|
|
10
|
-
*
|
|
11
9
|
* Usage in nitro.config.ts:
|
|
12
10
|
* ```ts
|
|
13
|
-
* // errorHandler.ts
|
|
14
11
|
* export { default } from 'evlog/nitro/v3/errorHandler'
|
|
15
|
-
* // nitro.config.ts
|
|
16
|
-
* export default defineConfig({
|
|
17
|
-
* errorHandler: './errorHandler',
|
|
18
|
-
* })
|
|
19
12
|
* ```
|
|
20
13
|
*/
|
|
21
14
|
declare const _default: _$nitro_types0.NitroErrorHandler;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { t as extractErrorStatus } from "../../errors-
|
|
2
|
-
import {
|
|
3
|
-
import { t as parseURL } from "../../dist-
|
|
1
|
+
import { t as extractErrorStatus } from "../../errors-DA0cyr8q.mjs";
|
|
2
|
+
import { a as serializeEvlogErrorResponse, i as resolveEvlogError, n as markH3ErrorHandled, o as shouldSuppressNitroDevOverlay, s as suppressNitroDevOverlay, t as buildPlainNitroErrorBody } from "../../nitro-ClRZLD1g.mjs";
|
|
3
|
+
import { t as parseURL } from "../../dist-DdQWiZn8.mjs";
|
|
4
4
|
import { defineErrorHandler } from "nitro";
|
|
5
5
|
//#region src/nitro-v3/errorHandler.ts
|
|
6
6
|
/**
|
|
@@ -8,24 +8,22 @@ import { defineErrorHandler } from "nitro";
|
|
|
8
8
|
* This ensures that 'data' (containing 'why', 'fix', 'link') is preserved
|
|
9
9
|
* in the JSON response regardless of the underlying HTTP framework.
|
|
10
10
|
*
|
|
11
|
-
* For non-EvlogError, returns undefined to let Nitro's default handler take over.
|
|
12
|
-
*
|
|
13
11
|
* Usage in nitro.config.ts:
|
|
14
12
|
* ```ts
|
|
15
|
-
* // errorHandler.ts
|
|
16
13
|
* export { default } from 'evlog/nitro/v3/errorHandler'
|
|
17
|
-
* // nitro.config.ts
|
|
18
|
-
* export default defineConfig({
|
|
19
|
-
* errorHandler: './errorHandler',
|
|
20
|
-
* })
|
|
21
14
|
* ```
|
|
22
15
|
*/
|
|
23
|
-
var errorHandler_default = defineErrorHandler((error, event) => {
|
|
24
|
-
const
|
|
25
|
-
if (!
|
|
16
|
+
var errorHandler_default = defineErrorHandler(async (error, event, ctx) => {
|
|
17
|
+
const suppressOverlay = shouldSuppressNitroDevOverlay();
|
|
18
|
+
if (!suppressOverlay) await ctx.defaultHandler(error, event, { silent: false });
|
|
19
|
+
markH3ErrorHandled(event);
|
|
20
|
+
if (suppressOverlay) suppressNitroDevOverlay(error);
|
|
26
21
|
const url = parseURL(event.req.url).pathname;
|
|
27
|
-
const
|
|
28
|
-
|
|
22
|
+
const isDev = process.env.NODE_ENV === "development";
|
|
23
|
+
const evlogError = resolveEvlogError(error);
|
|
24
|
+
const body = evlogError ? serializeEvlogErrorResponse(evlogError, url) : buildPlainNitroErrorBody(error, url, isDev);
|
|
25
|
+
const status = extractErrorStatus(evlogError ?? error);
|
|
26
|
+
return new Response(JSON.stringify(body), {
|
|
29
27
|
status,
|
|
30
28
|
headers: { "Content-Type": "application/json" }
|
|
31
29
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errorHandler.mjs","names":[],"sources":["../../../src/nitro-v3/errorHandler.ts"],"sourcesContent":["import { parseURL } from 'ufo'\nimport { defineErrorHandler } from 'nitro'\nimport {
|
|
1
|
+
{"version":3,"file":"errorHandler.mjs","names":[],"sources":["../../../src/nitro-v3/errorHandler.ts"],"sourcesContent":["import { parseURL } from 'ufo'\nimport { defineErrorHandler } from 'nitro'\nimport {\n resolveEvlogError,\n extractErrorStatus,\n buildPlainNitroErrorBody,\n serializeEvlogErrorResponse,\n shouldSuppressNitroDevOverlay,\n suppressNitroDevOverlay,\n markH3ErrorHandled,\n} from '../nitro'\nimport type { NitroErrorHandlerContext } from '../shared/nitro-types'\n\n/**\n * Custom Nitro v3 error handler that properly serializes EvlogError.\n * This ensures that 'data' (containing 'why', 'fix', 'link') is preserved\n * in the JSON response regardless of the underlying HTTP framework.\n *\n * Usage in nitro.config.ts:\n * ```ts\n * export { default } from 'evlog/nitro/v3/errorHandler'\n * ```\n */\nexport default defineErrorHandler(async (error, event, ctx: NitroErrorHandlerContext) => {\n const suppressOverlay = shouldSuppressNitroDevOverlay()\n\n if (!suppressOverlay) {\n await ctx.defaultHandler(error, event, { silent: false })\n }\n\n markH3ErrorHandled(event)\n\n if (suppressOverlay) {\n suppressNitroDevOverlay(error)\n }\n\n const url = parseURL(event.req.url).pathname\n const isDev = process.env.NODE_ENV === 'development'\n const evlogError = resolveEvlogError(error)\n\n const body = evlogError\n ? serializeEvlogErrorResponse(evlogError, url)\n : buildPlainNitroErrorBody(error, url, isDev)\n const status = extractErrorStatus(evlogError ?? error)\n\n return new Response(JSON.stringify(body), {\n status,\n headers: { 'Content-Type': 'application/json' },\n })\n})\n"],"mappings":";;;;;;;;;;;;;;;AAuBA,IAAA,uBAAe,mBAAmB,OAAO,OAAO,OAAO,QAAkC;CACvF,MAAM,kBAAkB,+BAA+B;AAEvD,KAAI,CAAC,gBACH,OAAM,IAAI,eAAe,OAAO,OAAO,EAAE,QAAQ,OAAO,CAAC;AAG3D,oBAAmB,MAAM;AAEzB,KAAI,gBACF,yBAAwB,MAAM;CAGhC,MAAM,MAAM,SAAS,MAAM,IAAI,IAAI,CAAC;CACpC,MAAM,QAAQ,QAAQ,IAAI,aAAa;CACvC,MAAM,aAAa,kBAAkB,MAAM;CAE3C,MAAM,OAAO,aACT,4BAA4B,YAAY,IAAI,GAC5C,yBAAyB,OAAO,KAAK,MAAM;CAC/C,MAAM,SAAS,mBAAmB,cAAc,MAAM;AAEtD,QAAO,IAAI,SAAS,KAAK,UAAU,KAAK,EAAE;EACxC;EACA,SAAS,EAAE,gBAAgB,oBAAoB;EAChD,CAAC;EACF"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { n as createError, t as EvlogError } from "../../error-
|
|
2
|
-
import { t as parseError } from "../../parseError-
|
|
1
|
+
import { n as createError, t as EvlogError } from "../../error-DwajXSKM.mjs";
|
|
2
|
+
import { t as parseError } from "../../parseError-Cagr-Ctc.mjs";
|
|
3
3
|
import evlog from "./module.mjs";
|
|
4
4
|
import { useLogger } from "./useLogger.mjs";
|
|
5
5
|
import { evlogErrorHandler } from "./middleware.mjs";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module.d.mts","names":[],"sources":["../../../src/nitro-v3/module.ts"],"mappings":";;;;
|
|
1
|
+
{"version":3,"file":"module.d.mts","names":[],"sources":["../../../src/nitro-v3/module.ts"],"mappings":";;;;iBAkBwB,KAAA,CAAM,OAAA,GAAU,kBAAA;;eAGvB,KAAA;AAAA"}
|
package/dist/nitro/v3/module.mjs
CHANGED
|
@@ -1,20 +1,25 @@
|
|
|
1
|
+
import { r as prependNitroErrorHandler } from "../../nitro-ClRZLD1g.mjs";
|
|
1
2
|
import { dirname, resolve } from "node:path";
|
|
2
3
|
import { fileURLToPath } from "node:url";
|
|
3
4
|
//#region src/nitro-v3/module.ts
|
|
4
5
|
const _dir = dirname(fileURLToPath(import.meta.url));
|
|
6
|
+
function resolveModulePath(name) {
|
|
7
|
+
return resolve(_dir, name).replace(/\\/g, "/");
|
|
8
|
+
}
|
|
5
9
|
function evlog(options) {
|
|
6
10
|
return {
|
|
7
11
|
name: "evlog",
|
|
8
12
|
setup(nitro) {
|
|
9
13
|
nitro.options.plugins = nitro.options.plugins || [];
|
|
10
|
-
nitro.options.plugins.push(
|
|
14
|
+
nitro.options.plugins.push(resolveModulePath("plugin"));
|
|
11
15
|
if (!nitro.options.noExternals) nitro.options.noExternals = ["evlog"];
|
|
12
16
|
else if (Array.isArray(nitro.options.noExternals)) nitro.options.noExternals.push("evlog");
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
else if (typeof nitro.options.errorHandler === "string") nitro.options.errorHandler = [resolve(_dir, "errorHandler"), nitro.options.errorHandler];
|
|
17
|
+
const handlers = prependNitroErrorHandler(nitro.options.errorHandler, resolveModulePath("errorHandler"));
|
|
18
|
+
nitro.options.errorHandler = Array.isArray(handlers) ? handlers : [handlers];
|
|
16
19
|
nitro.options.runtimeConfig = nitro.options.runtimeConfig || {};
|
|
17
20
|
nitro.options.runtimeConfig.evlog = options || {};
|
|
21
|
+
nitro.options.replace = nitro.options.replace || {};
|
|
22
|
+
nitro.options.replace.__EVLOG_CONFIG__ = JSON.stringify(options || {});
|
|
18
23
|
process.env.__EVLOG_CONFIG = JSON.stringify(options || {});
|
|
19
24
|
}
|
|
20
25
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module.mjs","names":[],"sources":["../../../src/nitro-v3/module.ts"],"sourcesContent":["import { dirname, resolve } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport type { Nitro } from 'nitro/types'\nimport type { NitroModuleOptions } from '../nitro'\n\nexport type { NitroModuleOptions }\n\nconst _dir = dirname(fileURLToPath(import.meta.url))\n\nexport default function evlog(options?: NitroModuleOptions) {\n return {\n name: 'evlog',\n setup(nitro: Nitro) {\n // Push the plugin (no extension — Nitro's bundler resolves it)\n nitro.options.plugins = nitro.options.plugins || []\n nitro.options.plugins.push(
|
|
1
|
+
{"version":3,"file":"module.mjs","names":[],"sources":["../../../src/nitro-v3/module.ts"],"sourcesContent":["import { dirname, resolve } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport type { Nitro } from 'nitro/types'\nimport type { NitroModuleOptions } from '../nitro'\nimport { prependNitroErrorHandler } from '../nitro'\n\nexport type { NitroModuleOptions }\n\nconst _dir = dirname(fileURLToPath(import.meta.url))\n\n// Nitro raw-interpolates these paths into JS string literals when generating\n// the #nitro/virtual/plugins and #nitro/virtual/error-handler modules, so\n// Windows backslashes would be parsed as escape sequences (\\n, \\v, …) and\n// break module resolution. Normalize to POSIX separators.\nfunction resolveModulePath(name: string): string {\n return resolve(_dir, name).replace(/\\\\/g, '/')\n}\n\nexport default function evlog(options?: NitroModuleOptions) {\n return {\n name: 'evlog',\n setup(nitro: Nitro) {\n // Push the plugin (no extension — Nitro's bundler resolves it)\n nitro.options.plugins = nitro.options.plugins || []\n nitro.options.plugins.push(resolveModulePath('plugin'))\n\n // explicitly tell nitro to bundle evlog's files to correctly resolve nitro dependencies\n if (!nitro.options.noExternals) {\n nitro.options.noExternals = ['evlog']\n } else if (Array.isArray(nitro.options.noExternals)) {\n nitro.options.noExternals.push('evlog')\n }\n\n\n const handlers = prependNitroErrorHandler(\n nitro.options.errorHandler,\n resolveModulePath('errorHandler'),\n )\n nitro.options.errorHandler = Array.isArray(handlers) ? handlers : [handlers]\n\n // Inject config into runtimeConfig — works in production where the\n // plugin is bundled through Nitro's builder and the virtual\n // runtime-config module resolves correctly.\n nitro.options.runtimeConfig = nitro.options.runtimeConfig || {}\n nitro.options.runtimeConfig.evlog = options || {}\n\n // Bake the config into the bundle as a literal so the plugin never has\n // to do a runtime `import('nitro/runtime-config')` to discover it. That\n // dynamic import resolves to a module which itself imports the build-only\n // virtual `#nitro/virtual/runtime-config` — fine inside the Nitro build,\n // but on Vercel + Bun the missing virtual triggers Bun's auto-installer\n // and crashes with `ReadOnlyFileSystem` (see issue #312).\n nitro.options.replace = nitro.options.replace || {}\n nitro.options.replace.__EVLOG_CONFIG__ = JSON.stringify(options || {})\n\n // In dev mode, Nitro loads plugins externally (not bundled), so the\n // virtual runtime-config module is unreachable and useRuntimeConfig()\n // returns a stub without our values. process.env is inherited by the\n // Worker Threads that run the dev server, making it a reliable bridge.\n // The plugin reads: useRuntimeConfig().evlog ?? process.env.__EVLOG_CONFIG\n process.env.__EVLOG_CONFIG = JSON.stringify(options || {})\n },\n }\n}\n"],"mappings":";;;;AAQA,MAAM,OAAO,QAAQ,cAAc,OAAO,KAAK,IAAI,CAAC;AAMpD,SAAS,kBAAkB,MAAsB;AAC/C,QAAO,QAAQ,MAAM,KAAK,CAAC,QAAQ,OAAO,IAAI;;AAGhD,SAAwB,MAAM,SAA8B;AAC1D,QAAO;EACL,MAAM;EACN,MAAM,OAAc;AAElB,SAAM,QAAQ,UAAU,MAAM,QAAQ,WAAW,EAAE;AACnD,SAAM,QAAQ,QAAQ,KAAK,kBAAkB,SAAS,CAAC;AAGvD,OAAI,CAAC,MAAM,QAAQ,YACjB,OAAM,QAAQ,cAAc,CAAC,QAAQ;YAC5B,MAAM,QAAQ,MAAM,QAAQ,YAAY,CACjD,OAAM,QAAQ,YAAY,KAAK,QAAQ;GAIzC,MAAM,WAAW,yBACf,MAAM,QAAQ,cACd,kBAAkB,eAAe,CAClC;AACD,SAAM,QAAQ,eAAe,MAAM,QAAQ,SAAS,GAAG,WAAW,CAAC,SAAS;AAK5E,SAAM,QAAQ,gBAAgB,MAAM,QAAQ,iBAAiB,EAAE;AAC/D,SAAM,QAAQ,cAAc,QAAQ,WAAW,EAAE;AAQjD,SAAM,QAAQ,UAAU,MAAM,QAAQ,WAAW,EAAE;AACnD,SAAM,QAAQ,QAAQ,mBAAmB,KAAK,UAAU,WAAW,EAAE,CAAC;AAOtE,WAAQ,IAAI,iBAAiB,KAAK,UAAU,WAAW,EAAE,CAAC;;EAE7D"}
|