@nuxt/nitro-server
Version:
86 lines (85 loc) • 2.79 kB
JavaScript
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 };