@base44-preview/vite-plugin 1.0.39-pr.123.3a14a93 → 1.0.40-pr.124.dc9695c
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 +10 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/route-request-log/nitro-module.d.ts +14 -0
- package/dist/route-request-log/nitro-module.d.ts.map +1 -0
- package/dist/route-request-log/nitro-module.js +12 -0
- package/dist/route-request-log/nitro-module.js.map +1 -0
- package/dist/route-request-log/route-request-log-handler.d.ts +5 -0
- package/dist/route-request-log/route-request-log-handler.d.ts.map +1 -0
- package/dist/route-request-log/route-request-log-handler.js +3 -0
- package/dist/route-request-log/route-request-log-handler.js.map +1 -0
- package/dist/route-request-log/route-request-tagger.d.ts +15 -0
- package/dist/route-request-log/route-request-tagger.d.ts.map +1 -0
- package/dist/route-request-log/route-request-tagger.js +52 -0
- package/dist/route-request-log/route-request-tagger.js.map +1 -0
- package/dist/route-request-log/vite-plugin.d.ts +8 -0
- package/dist/route-request-log/vite-plugin.d.ts.map +1 -0
- package/dist/route-request-log/vite-plugin.js +6 -0
- package/dist/route-request-log/vite-plugin.js.map +1 -0
- package/package.json +1 -1
- package/src/index.ts +6 -0
- package/src/route-request-log/nitro-module.ts +17 -0
- package/src/route-request-log/route-request-log-handler.ts +3 -0
- package/src/route-request-log/route-request-tagger.ts +69 -0
- package/src/route-request-log/vite-plugin.ts +9 -0
package/README.md
CHANGED
|
@@ -113,6 +113,16 @@ read `ok: true`. That window is already covered server-side by the existing
|
|
|
113
113
|
`dev_server_error_classifier` (install / start failures surface as `409`). This
|
|
114
114
|
endpoint's job is **post-load HMR / compile errors**, not cold-start failures.
|
|
115
115
|
|
|
116
|
+
### Route request logs (full-stack apps)
|
|
117
|
+
|
|
118
|
+
Dev-only. While a Nitro server route serves a request that carries
|
|
119
|
+
`X-B44-Request-Id`, every `console.*` line it prints goes to stdout prefixed
|
|
120
|
+
`[b44-req <id> <level>] `, followed by one summary line per request
|
|
121
|
+
(`GET /api/orders handled in 12ms`, or `threw <Error> after 12ms`). Requests
|
|
122
|
+
without the header are untouched. It ships as a Nitro module (the `nitro`
|
|
123
|
+
property on `base44-route-request-log`) because Nitro runs dev routes in a
|
|
124
|
+
separate runtime whose `console` a Vite middleware never sees.
|
|
125
|
+
|
|
116
126
|
### Sandbox Injections
|
|
117
127
|
|
|
118
128
|
In **dev mode**, individual `<script type="module" src="...">` tags are injected for each feature, loaded directly from `node_modules`. Under bundled dev mode the tags are injected with `order: "pre"` instead, so they become part of the HTML entry and are folded into the bundle (with `import.meta.hot` available). Their `src` is then a `virtual:base44-vite-plugin/...` id that the plugin resolves onto its own `dist/` directory, so the bundle does not depend on where npm placed the package.
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAc,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAc,MAAM,MAAM,CAAC;AA2B/C,eAAO,MAAM,uBAAuB,UAWnC,CAAC;AAeF,MAAM,CAAC,OAAO,UAAU,UAAU,CAChC,IAAI,GAAE;IACJ,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,gBAAgB,CAAC,EAAE,OAAO,CAAC;CACvB,iBAkPP"}
|
package/dist/index.js
CHANGED
|
@@ -6,6 +6,7 @@ import { filterPackagesInProject } from "./utils.js";
|
|
|
6
6
|
import { htmlInjectionsPlugin } from "./html-injections-plugin.js";
|
|
7
7
|
import { buildStatusPlugin } from "./build-status-plugin.js";
|
|
8
8
|
import { base44RuntimePlugin } from "./base44-runtime-plugin.js";
|
|
9
|
+
import { routeRequestLogPlugin } from "./route-request-log/vite-plugin.js";
|
|
9
10
|
const isRunningInSandbox = !!process.env.MODAL_SANDBOX_ID;
|
|
10
11
|
// Vite 8 pre-bundles deps with Rolldown instead of esbuild and deprecates
|
|
11
12
|
// `optimizeDeps.esbuildOptions`. Both spellings mean the same thing here:
|
|
@@ -221,6 +222,11 @@ export default function vitePlugin(opts = {}) {
|
|
|
221
222
|
// notices it. Ordering comes from its own `enforce: "pre"`, not from its
|
|
222
223
|
// position here — several tests index this array from the front.
|
|
223
224
|
base44RuntimePlugin(),
|
|
225
|
+
// Dev-only: tags a full-stack route's console output with the request's
|
|
226
|
+
// X-B44-Request-Id. Registered as a Nitro module (the `nitro` property)
|
|
227
|
+
// because Nitro runs dev routes in a worker whose console the Vite process
|
|
228
|
+
// never sees. Inert for apps without Nitro and for requests without the id.
|
|
229
|
+
routeRequestLogPlugin(),
|
|
224
230
|
];
|
|
225
231
|
}
|
|
226
232
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,MAAM,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
type RouteHandlerRegistration = {
|
|
2
|
+
route: string;
|
|
3
|
+
middleware?: boolean;
|
|
4
|
+
handler: string;
|
|
5
|
+
};
|
|
6
|
+
export type NitroDevServer = {
|
|
7
|
+
options: {
|
|
8
|
+
dev: boolean;
|
|
9
|
+
handlers: RouteHandlerRegistration[];
|
|
10
|
+
};
|
|
11
|
+
};
|
|
12
|
+
export declare function registerRouteRequestLogHandler(nitro: NitroDevServer): void;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=nitro-module.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nitro-module.d.ts","sourceRoot":"","sources":["../../src/route-request-log/nitro-module.ts"],"names":[],"mappings":"AAEA,KAAK,wBAAwB,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AACzF,MAAM,MAAM,cAAc,GAAG;IAAE,OAAO,EAAE;QAAE,GAAG,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,wBAAwB,EAAE,CAAA;KAAE,CAAA;CAAE,CAAC;AAMjG,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,cAAc,QAOnE"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { fileURLToPath } from "node:url";
|
|
2
|
+
const ROUTE_REQUEST_LOG_HANDLER = fileURLToPath(new URL("./route-request-log-handler.js", import.meta.url));
|
|
3
|
+
export function registerRouteRequestLogHandler(nitro) {
|
|
4
|
+
if (!nitro.options.dev)
|
|
5
|
+
return;
|
|
6
|
+
nitro.options.handlers.push({
|
|
7
|
+
route: "/**",
|
|
8
|
+
middleware: true,
|
|
9
|
+
handler: ROUTE_REQUEST_LOG_HANDLER,
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=nitro-module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nitro-module.js","sourceRoot":"","sources":["../../src/route-request-log/nitro-module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAKzC,MAAM,yBAAyB,GAAG,aAAa,CAC7C,IAAI,GAAG,CAAC,gCAAgC,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAC3D,CAAC;AAEF,MAAM,UAAU,8BAA8B,CAAC,KAAqB;IAClE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG;QAAE,OAAO;IAC/B,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;QAC1B,KAAK,EAAE,KAAK;QACZ,UAAU,EAAE,IAAI;QAChB,OAAO,EAAE,yBAAyB;KACnC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route-request-log-handler.d.ts","sourceRoot":"","sources":["../../src/route-request-log/route-request-log-handler.ts"],"names":[],"mappings":";;;AAEA,wBAAyC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route-request-log-handler.js","sourceRoot":"","sources":["../../src/route-request-log/route-request-log-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAE7D,eAAe,gBAAgB,CAAC,OAAO,CAAC,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export declare const REQUEST_ID_HEADER = "x-b44-request-id";
|
|
2
|
+
declare const CONSOLE_PATCHED: unique symbol;
|
|
3
|
+
declare const TAGGED_CONSOLE_METHODS: readonly ["log", "info", "warn", "error", "debug"];
|
|
4
|
+
type TaggedConsoleMethod = (typeof TAGGED_CONSOLE_METHODS)[number];
|
|
5
|
+
type TaggableConsole = Pick<Console, TaggedConsoleMethod> & {
|
|
6
|
+
[CONSOLE_PATCHED]?: boolean;
|
|
7
|
+
};
|
|
8
|
+
type RouteEvent = {
|
|
9
|
+
req: Request;
|
|
10
|
+
};
|
|
11
|
+
type CallNextHandler = () => unknown;
|
|
12
|
+
export declare const requestLogPrefix: (requestId: string, level: TaggedConsoleMethod) => string;
|
|
13
|
+
export declare function tagRouteRequests(target: TaggableConsole): (event: RouteEvent, next: CallNextHandler) => unknown;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=route-request-tagger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route-request-tagger.d.ts","sourceRoot":"","sources":["../../src/route-request-log/route-request-tagger.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,iBAAiB,qBAAqB,CAAC;AAEpD,QAAA,MAAM,eAAe,eAAsD,CAAC;AAC5E,QAAA,MAAM,sBAAsB,oDAAqD,CAAC;AAElF,KAAK,mBAAmB,GAAG,CAAC,OAAO,sBAAsB,CAAC,CAAC,MAAM,CAAC,CAAC;AACnE,KAAK,eAAe,GAAG,IAAI,CAAC,OAAO,EAAE,mBAAmB,CAAC,GAAG;IAAE,CAAC,eAAe,CAAC,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAC5F,KAAK,UAAU,GAAG;IAAE,GAAG,EAAE,OAAO,CAAA;CAAE,CAAC;AACnC,KAAK,eAAe,GAAG,MAAM,OAAO,CAAC;AAIrC,eAAO,MAAM,gBAAgB,GAAI,WAAW,MAAM,EAAE,OAAO,mBAAmB,WAC1C,CAAC;AA6CrC,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,eAAe,IAE9C,OAAO,UAAU,EAAE,MAAM,eAAe,aAKjD"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
2
|
+
import { format } from "node:util";
|
|
3
|
+
export const REQUEST_ID_HEADER = "x-b44-request-id";
|
|
4
|
+
const CONSOLE_PATCHED = Symbol.for("base44.routeRequestLog.consolePatched");
|
|
5
|
+
const TAGGED_CONSOLE_METHODS = ["log", "info", "warn", "error", "debug"];
|
|
6
|
+
const currentRequestId = new AsyncLocalStorage();
|
|
7
|
+
export const requestLogPrefix = (requestId, level) => `[b44-req ${requestId} ${level}] `;
|
|
8
|
+
const prefixEveryLine = (text, prefix) => text
|
|
9
|
+
.split("\n")
|
|
10
|
+
.map((line) => prefix + line)
|
|
11
|
+
.join("\n");
|
|
12
|
+
function prefixWhileInsideRequest(level, originalMethod) {
|
|
13
|
+
return (...args) => {
|
|
14
|
+
const requestId = currentRequestId.getStore();
|
|
15
|
+
if (requestId === undefined)
|
|
16
|
+
return originalMethod(...args);
|
|
17
|
+
return originalMethod(prefixEveryLine(format(...args), requestLogPrefix(requestId, level)));
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
function tagConsoleWithRequestId(target) {
|
|
21
|
+
if (target[CONSOLE_PATCHED])
|
|
22
|
+
return;
|
|
23
|
+
for (const method of TAGGED_CONSOLE_METHODS) {
|
|
24
|
+
target[method] = prefixWhileInsideRequest(method, target[method].bind(target));
|
|
25
|
+
}
|
|
26
|
+
target[CONSOLE_PATCHED] = true;
|
|
27
|
+
}
|
|
28
|
+
const routeLabel = (req) => `${req.method} ${new URL(req.url).pathname}`;
|
|
29
|
+
const describeError = (error) => error instanceof Error ? `${error.name}: ${error.message}` : String(error);
|
|
30
|
+
async function runRouteAndSummarize(event, next, target) {
|
|
31
|
+
const startedAt = Date.now();
|
|
32
|
+
const elapsed = () => `${Date.now() - startedAt}ms`;
|
|
33
|
+
try {
|
|
34
|
+
const result = await next();
|
|
35
|
+
target.info(`${routeLabel(event.req)} handled in ${elapsed()}`);
|
|
36
|
+
return result;
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
target.error(`${routeLabel(event.req)} threw ${describeError(error)} after ${elapsed()}`);
|
|
40
|
+
throw error;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export function tagRouteRequests(target) {
|
|
44
|
+
tagConsoleWithRequestId(target);
|
|
45
|
+
return (event, next) => {
|
|
46
|
+
const requestId = event.req.headers.get(REQUEST_ID_HEADER);
|
|
47
|
+
if (requestId === null)
|
|
48
|
+
return next();
|
|
49
|
+
return currentRequestId.run(requestId, () => runRouteAndSummarize(event, next, target));
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=route-request-tagger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route-request-tagger.js","sourceRoot":"","sources":["../../src/route-request-log/route-request-tagger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAEnC,MAAM,CAAC,MAAM,iBAAiB,GAAG,kBAAkB,CAAC;AAEpD,MAAM,eAAe,GAAG,MAAM,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;AAC5E,MAAM,sBAAsB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAU,CAAC;AAOlF,MAAM,gBAAgB,GAAG,IAAI,iBAAiB,EAAU,CAAC;AAEzD,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,SAAiB,EAAE,KAA0B,EAAE,EAAE,CAChF,YAAY,SAAS,IAAI,KAAK,IAAI,CAAC;AAErC,MAAM,eAAe,GAAG,CAAC,IAAY,EAAE,MAAc,EAAE,EAAE,CACvD,IAAI;KACD,KAAK,CAAC,IAAI,CAAC;KACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC;KAC5B,IAAI,CAAC,IAAI,CAAC,CAAC;AAEhB,SAAS,wBAAwB,CAC/B,KAA0B,EAC1B,cAA4C;IAE5C,OAAO,CAAC,GAAG,IAAe,EAAE,EAAE;QAC5B,MAAM,SAAS,GAAG,gBAAgB,CAAC,QAAQ,EAAE,CAAC;QAC9C,IAAI,SAAS,KAAK,SAAS;YAAE,OAAO,cAAc,CAAC,GAAG,IAAI,CAAC,CAAC;QAC5D,OAAO,cAAc,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,EAAE,gBAAgB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAC9F,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,uBAAuB,CAAC,MAAuB;IACtD,IAAI,MAAM,CAAC,eAAe,CAAC;QAAE,OAAO;IACpC,KAAK,MAAM,MAAM,IAAI,sBAAsB,EAAE,CAAC;QAC5C,MAAM,CAAC,MAAM,CAAC,GAAG,wBAAwB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IACjF,CAAC;IACD,MAAM,CAAC,eAAe,CAAC,GAAG,IAAI,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,GAAY,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,IAAI,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;AAElF,MAAM,aAAa,GAAG,CAAC,KAAc,EAAE,EAAE,CACvC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAE7E,KAAK,UAAU,oBAAoB,CAAC,KAAiB,EAAE,IAAqB,EAAE,MAAuB;IACnG,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,IAAI,CAAC;IACpD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,IAAI,EAAE,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,OAAO,EAAE,EAAE,CAAC,CAAC;QAChE,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,aAAa,CAAC,KAAK,CAAC,UAAU,OAAO,EAAE,EAAE,CAAC,CAAC;QAC1F,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAuB;IACtD,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAChC,OAAO,CAAC,KAAiB,EAAE,IAAqB,EAAE,EAAE;QAClD,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAC3D,IAAI,SAAS,KAAK,IAAI;YAAE,OAAO,IAAI,EAAE,CAAC;QACtC,OAAO,gBAAgB,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,oBAAoB,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IAC1F,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Plugin } from "vite";
|
|
2
|
+
import { registerRouteRequestLogHandler } from "./nitro-module.js";
|
|
3
|
+
type PluginWithNitroModule = Plugin & {
|
|
4
|
+
nitro: typeof registerRouteRequestLogHandler;
|
|
5
|
+
};
|
|
6
|
+
export declare const routeRequestLogPlugin: () => PluginWithNitroModule;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=vite-plugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vite-plugin.d.ts","sourceRoot":"","sources":["../../src/route-request-log/vite-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AACnC,OAAO,EAAE,8BAA8B,EAAE,MAAM,mBAAmB,CAAC;AAEnE,KAAK,qBAAqB,GAAG,MAAM,GAAG;IAAE,KAAK,EAAE,OAAO,8BAA8B,CAAA;CAAE,CAAC;AAEvF,eAAO,MAAM,qBAAqB,QAAO,qBAGvC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vite-plugin.js","sourceRoot":"","sources":["../../src/route-request-log/vite-plugin.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,8BAA8B,EAAE,MAAM,mBAAmB,CAAC;AAInE,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAA0B,EAAE,CAAC,CAAC;IACjE,IAAI,EAAE,0BAA0B;IAChC,KAAK,EAAE,8BAA8B;CACtC,CAAC,CAAC"}
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
|
@@ -7,6 +7,7 @@ import { filterPackagesInProject } from "./utils.js";
|
|
|
7
7
|
import { htmlInjectionsPlugin } from "./html-injections-plugin.js";
|
|
8
8
|
import { buildStatusPlugin } from "./build-status-plugin.js";
|
|
9
9
|
import { base44RuntimePlugin } from "./base44-runtime-plugin.js";
|
|
10
|
+
import { routeRequestLogPlugin } from "./route-request-log/vite-plugin.js";
|
|
10
11
|
|
|
11
12
|
const isRunningInSandbox = !!process.env.MODAL_SANDBOX_ID;
|
|
12
13
|
|
|
@@ -294,5 +295,10 @@ export default function vitePlugin(
|
|
|
294
295
|
// notices it. Ordering comes from its own `enforce: "pre"`, not from its
|
|
295
296
|
// position here — several tests index this array from the front.
|
|
296
297
|
base44RuntimePlugin(),
|
|
298
|
+
// Dev-only: tags a full-stack route's console output with the request's
|
|
299
|
+
// X-B44-Request-Id. Registered as a Nitro module (the `nitro` property)
|
|
300
|
+
// because Nitro runs dev routes in a worker whose console the Vite process
|
|
301
|
+
// never sees. Inert for apps without Nitro and for requests without the id.
|
|
302
|
+
routeRequestLogPlugin(),
|
|
297
303
|
];
|
|
298
304
|
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { fileURLToPath } from "node:url";
|
|
2
|
+
|
|
3
|
+
type RouteHandlerRegistration = { route: string; middleware?: boolean; handler: string };
|
|
4
|
+
export type NitroDevServer = { options: { dev: boolean; handlers: RouteHandlerRegistration[] } };
|
|
5
|
+
|
|
6
|
+
const ROUTE_REQUEST_LOG_HANDLER = fileURLToPath(
|
|
7
|
+
new URL("./route-request-log-handler.js", import.meta.url)
|
|
8
|
+
);
|
|
9
|
+
|
|
10
|
+
export function registerRouteRequestLogHandler(nitro: NitroDevServer) {
|
|
11
|
+
if (!nitro.options.dev) return;
|
|
12
|
+
nitro.options.handlers.push({
|
|
13
|
+
route: "/**",
|
|
14
|
+
middleware: true,
|
|
15
|
+
handler: ROUTE_REQUEST_LOG_HANDLER,
|
|
16
|
+
});
|
|
17
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
2
|
+
import { format } from "node:util";
|
|
3
|
+
|
|
4
|
+
export const REQUEST_ID_HEADER = "x-b44-request-id";
|
|
5
|
+
|
|
6
|
+
const CONSOLE_PATCHED = Symbol.for("base44.routeRequestLog.consolePatched");
|
|
7
|
+
const TAGGED_CONSOLE_METHODS = ["log", "info", "warn", "error", "debug"] as const;
|
|
8
|
+
|
|
9
|
+
type TaggedConsoleMethod = (typeof TAGGED_CONSOLE_METHODS)[number];
|
|
10
|
+
type TaggableConsole = Pick<Console, TaggedConsoleMethod> & { [CONSOLE_PATCHED]?: boolean };
|
|
11
|
+
type RouteEvent = { req: Request };
|
|
12
|
+
type CallNextHandler = () => unknown;
|
|
13
|
+
|
|
14
|
+
const currentRequestId = new AsyncLocalStorage<string>();
|
|
15
|
+
|
|
16
|
+
export const requestLogPrefix = (requestId: string, level: TaggedConsoleMethod) =>
|
|
17
|
+
`[b44-req ${requestId} ${level}] `;
|
|
18
|
+
|
|
19
|
+
const prefixEveryLine = (text: string, prefix: string) =>
|
|
20
|
+
text
|
|
21
|
+
.split("\n")
|
|
22
|
+
.map((line) => prefix + line)
|
|
23
|
+
.join("\n");
|
|
24
|
+
|
|
25
|
+
function prefixWhileInsideRequest(
|
|
26
|
+
level: TaggedConsoleMethod,
|
|
27
|
+
originalMethod: (...args: unknown[]) => void
|
|
28
|
+
) {
|
|
29
|
+
return (...args: unknown[]) => {
|
|
30
|
+
const requestId = currentRequestId.getStore();
|
|
31
|
+
if (requestId === undefined) return originalMethod(...args);
|
|
32
|
+
return originalMethod(prefixEveryLine(format(...args), requestLogPrefix(requestId, level)));
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function tagConsoleWithRequestId(target: TaggableConsole) {
|
|
37
|
+
if (target[CONSOLE_PATCHED]) return;
|
|
38
|
+
for (const method of TAGGED_CONSOLE_METHODS) {
|
|
39
|
+
target[method] = prefixWhileInsideRequest(method, target[method].bind(target));
|
|
40
|
+
}
|
|
41
|
+
target[CONSOLE_PATCHED] = true;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const routeLabel = (req: Request) => `${req.method} ${new URL(req.url).pathname}`;
|
|
45
|
+
|
|
46
|
+
const describeError = (error: unknown) =>
|
|
47
|
+
error instanceof Error ? `${error.name}: ${error.message}` : String(error);
|
|
48
|
+
|
|
49
|
+
async function runRouteAndSummarize(event: RouteEvent, next: CallNextHandler, target: TaggableConsole) {
|
|
50
|
+
const startedAt = Date.now();
|
|
51
|
+
const elapsed = () => `${Date.now() - startedAt}ms`;
|
|
52
|
+
try {
|
|
53
|
+
const result = await next();
|
|
54
|
+
target.info(`${routeLabel(event.req)} handled in ${elapsed()}`);
|
|
55
|
+
return result;
|
|
56
|
+
} catch (error) {
|
|
57
|
+
target.error(`${routeLabel(event.req)} threw ${describeError(error)} after ${elapsed()}`);
|
|
58
|
+
throw error;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export function tagRouteRequests(target: TaggableConsole) {
|
|
63
|
+
tagConsoleWithRequestId(target);
|
|
64
|
+
return (event: RouteEvent, next: CallNextHandler) => {
|
|
65
|
+
const requestId = event.req.headers.get(REQUEST_ID_HEADER);
|
|
66
|
+
if (requestId === null) return next();
|
|
67
|
+
return currentRequestId.run(requestId, () => runRouteAndSummarize(event, next, target));
|
|
68
|
+
};
|
|
69
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Plugin } from "vite";
|
|
2
|
+
import { registerRouteRequestLogHandler } from "./nitro-module.js";
|
|
3
|
+
|
|
4
|
+
type PluginWithNitroModule = Plugin & { nitro: typeof registerRouteRequestLogHandler };
|
|
5
|
+
|
|
6
|
+
export const routeRequestLogPlugin = (): PluginWithNitroModule => ({
|
|
7
|
+
name: "base44-route-request-log",
|
|
8
|
+
nitro: registerRouteRequestLogHandler,
|
|
9
|
+
});
|