UNPKG

@nuxt/nitro-server

Version:

Nitro server integration for Nuxt

86 lines (85 loc) 2.79 kB
import { serverDiagnostics } from "../diagnostics.mjs"; import { withTrailingSlash } from "ufo"; import { appId } from "#internal/nuxt.config.mjs"; import { AsyncLocalStorage } from "node:async_hooks"; import { stringify } from "devalue"; import { consola } from "consola"; import { getContext } from "unctx"; import { captureRawStackTrace, parseRawStackTrace } from "errx"; import { isVNode } from "vue"; import { rootDir } from "#internal/dev-server-logs-options"; //#region src/runtime/plugins/dev-server-logs.ts const devReducers = { VNode: (data) => isVNode(data) ? { type: data.type, props: data.props } : void 0, URL: (data) => data instanceof URL ? data.toString() : void 0, Symbol: (data) => typeof data === "symbol" ? data.description ?? "" : void 0 }; const asyncContext = getContext("nuxt-dev", { asyncContext: true, AsyncLocalStorage }); var dev_server_logs_default = (nitroApp) => { const handler = nitroApp.h3App.handler; nitroApp.h3App.handler = (event) => { return asyncContext.callAsync({ logs: [], event }, () => handler(event)); }; onConsoleLog((_log) => { const ctx = asyncContext.tryUse(); if (!ctx) return; const rawStack = captureRawStackTrace(); if (!rawStack || rawStack.includes("runtime/vite-node.mjs")) return; const trace = []; let filename = ""; for (const entry of parseRawStackTrace(rawStack)) { if (entry.source === import.meta.url) continue; if (EXCLUDE_TRACE_RE.test(entry.source)) continue; filename ||= entry.source.replace(withTrailingSlash(rootDir), ""); trace.push({ ...entry, source: entry.source.startsWith("file://") ? entry.source.replace("file://", "") : entry.source }); } const log = { ..._log, filename, stack: trace }; ctx.logs.push(log); }); nitroApp.hooks.hook("afterResponse", () => { const ctx = asyncContext.tryUse(); if (!ctx) return; return nitroApp.hooks.callHook("dev:ssr-logs", { logs: ctx.logs, path: ctx.event.path }); }); nitroApp.hooks.hook("render:html", (htmlContext) => { const ctx = asyncContext.tryUse(); if (!ctx) return; try { const reducers = Object.assign(Object.create(null), devReducers, ctx.event.context["~payloadReducers"]); htmlContext.bodyAppend.unshift(`<script type="application/json" data-nuxt-logs="${appId}">${stringify(ctx.logs, reducers)}<\/script>`); } catch (e) { serverDiagnostics.NUXT_E8003({ error: e instanceof Error ? e.toString() : void 0, cause: e }); } }); }; const EXCLUDE_TRACE_RE = /\/node_modules\/(?:.*\/)?(?:nuxt|nuxt-nightly|nuxt-edge|nuxt3|consola|@vue)\/|core\/runtime\/nitro/; function onConsoleLog(callback) { consola.addReporter({ log(logObj) { callback(logObj); } }); consola.wrapConsole(); } //#endregion export { dev_server_logs_default as default };