@timber-js/app 0.2.0-alpha.37 → 0.2.0-alpha.39
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/dist/adapters/nitro.d.ts.map +1 -1
- package/dist/adapters/nitro.js +27 -4
- package/dist/adapters/nitro.js.map +1 -1
- package/dist/cache/index.d.ts +5 -2
- package/dist/cache/index.d.ts.map +1 -1
- package/dist/cache/index.js +37 -8
- package/dist/cache/index.js.map +1 -1
- package/dist/cache/singleflight.d.ts +18 -1
- package/dist/cache/singleflight.d.ts.map +1 -1
- package/dist/cache/timber-cache.d.ts.map +1 -1
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +53 -4
- package/dist/index.js.map +1 -1
- package/dist/plugins/dev-error-overlay.d.ts +26 -1
- package/dist/plugins/dev-error-overlay.d.ts.map +1 -1
- package/dist/plugins/entries.d.ts.map +1 -1
- package/dist/server/action-handler.d.ts.map +1 -1
- package/dist/server/default-logger.d.ts +22 -0
- package/dist/server/default-logger.d.ts.map +1 -0
- package/dist/server/flush.d.ts.map +1 -1
- package/dist/server/html-injectors.d.ts +2 -2
- package/dist/server/html-injectors.d.ts.map +1 -1
- package/dist/server/index.d.ts +2 -0
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +135 -24
- package/dist/server/index.js.map +1 -1
- package/dist/server/logger.d.ts +24 -7
- package/dist/server/logger.d.ts.map +1 -1
- package/dist/server/node-stream-transforms.d.ts +13 -1
- package/dist/server/node-stream-transforms.d.ts.map +1 -1
- package/dist/server/render-timeout.d.ts +51 -0
- package/dist/server/render-timeout.d.ts.map +1 -0
- package/dist/server/route-handler.d.ts.map +1 -1
- package/dist/server/rsc-entry/helpers.d.ts +46 -3
- package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
- package/dist/server/rsc-entry/index.d.ts +6 -1
- package/dist/server/rsc-entry/index.d.ts.map +1 -1
- package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
- package/dist/server/rsc-entry/rsc-stream.d.ts +3 -0
- package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
- package/dist/server/ssr-entry.d.ts.map +1 -1
- package/dist/server/ssr-render.d.ts +2 -0
- package/dist/server/ssr-render.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/adapters/nitro.ts +27 -4
- package/src/cache/index.ts +5 -2
- package/src/cache/singleflight.ts +62 -4
- package/src/cache/timber-cache.ts +17 -16
- package/src/index.ts +12 -0
- package/src/plugins/dev-error-overlay.ts +70 -1
- package/src/plugins/dev-server.ts +38 -4
- package/src/plugins/entries.ts +1 -0
- package/src/server/action-handler.ts +3 -2
- package/src/server/default-logger.ts +95 -0
- package/src/server/flush.ts +2 -1
- package/src/server/html-injectors.ts +32 -7
- package/src/server/index.ts +4 -0
- package/src/server/logger.ts +38 -35
- package/src/server/node-stream-transforms.ts +51 -14
- package/src/server/render-timeout.ts +108 -0
- package/src/server/route-handler.ts +2 -1
- package/src/server/rsc-entry/helpers.ts +122 -3
- package/src/server/rsc-entry/index.ts +34 -4
- package/src/server/rsc-entry/rsc-payload.ts +11 -3
- package/src/server/rsc-entry/rsc-stream.ts +24 -3
- package/src/server/ssr-entry.ts +9 -2
- package/src/server/ssr-render.ts +105 -16
package/dist/index.js
CHANGED
|
@@ -11465,14 +11465,51 @@ function formatTerminalError(error, phase, projectRoot) {
|
|
|
11465
11465
|
return lines.join("\n");
|
|
11466
11466
|
}
|
|
11467
11467
|
/**
|
|
11468
|
+
* Format RSC debug component info into a readable string for the overlay.
|
|
11469
|
+
*
|
|
11470
|
+
* Renders the server component tree that was active when an error occurred,
|
|
11471
|
+
* including component names and source locations from stack frames. This
|
|
11472
|
+
* gives developers visibility into which server components were rendering
|
|
11473
|
+
* without exposing source code.
|
|
11474
|
+
*
|
|
11475
|
+
* Returns an empty string if no components are provided.
|
|
11476
|
+
*/
|
|
11477
|
+
function formatRscDebugContext(components) {
|
|
11478
|
+
if (!components || components.length === 0) return "";
|
|
11479
|
+
const seen = /* @__PURE__ */ new Set();
|
|
11480
|
+
const unique = [];
|
|
11481
|
+
for (const c of components) if (!seen.has(c.name)) {
|
|
11482
|
+
seen.add(c.name);
|
|
11483
|
+
unique.push(c);
|
|
11484
|
+
}
|
|
11485
|
+
const lines = ["Server Component Tree:"];
|
|
11486
|
+
for (let i = 0; i < unique.length; i++) {
|
|
11487
|
+
const c = unique[i];
|
|
11488
|
+
const indent = " ".repeat(i + 1);
|
|
11489
|
+
const envLabel = c.env ? ` [${c.env}]` : "";
|
|
11490
|
+
let locStr = "";
|
|
11491
|
+
if (c.stack && c.stack.length > 0) {
|
|
11492
|
+
const frame = c.stack[0];
|
|
11493
|
+
if (Array.isArray(frame) && frame.length >= 3) locStr = ` (${frame[1]}:${frame[2]})`;
|
|
11494
|
+
}
|
|
11495
|
+
lines.push(`${indent}${c.name}${envLabel}${locStr}`);
|
|
11496
|
+
}
|
|
11497
|
+
return lines.join("\n");
|
|
11498
|
+
}
|
|
11499
|
+
/**
|
|
11468
11500
|
* Send an error to Vite's browser overlay and log it to stderr.
|
|
11469
11501
|
*
|
|
11470
11502
|
* Uses `server.ssrFixStacktrace()` to map stack traces back to source,
|
|
11471
11503
|
* then sends the error via `server.hot.send()` for the browser overlay.
|
|
11472
11504
|
*
|
|
11505
|
+
* When `rscDebugComponents` is provided (dev mode only), the server
|
|
11506
|
+
* component tree context is appended to the error message. This helps
|
|
11507
|
+
* developers identify which server component caused the error without
|
|
11508
|
+
* exposing source code.
|
|
11509
|
+
*
|
|
11473
11510
|
* The dev server remains running — errors are handled, not fatal.
|
|
11474
11511
|
*/
|
|
11475
|
-
function sendErrorToOverlay(server, error, phase, projectRoot) {
|
|
11512
|
+
function sendErrorToOverlay(server, error, phase, projectRoot, rscDebugComponents) {
|
|
11476
11513
|
server.ssrFixStacktrace(error);
|
|
11477
11514
|
const formatted = formatTerminalError(error, phase, projectRoot);
|
|
11478
11515
|
process.stderr.write(`${formatted}\n`);
|
|
@@ -11480,6 +11517,8 @@ function sendErrorToOverlay(server, error, phase, projectRoot) {
|
|
|
11480
11517
|
const componentStack = extractComponentStack(error);
|
|
11481
11518
|
let message = error.message;
|
|
11482
11519
|
if (componentStack) message = `${error.message}\n\nComponent Stack:\n${componentStack.trim()}`;
|
|
11520
|
+
const debugContext = formatRscDebugContext(rscDebugComponents ?? []);
|
|
11521
|
+
if (debugContext) message = `${message}\n\n${debugContext}`;
|
|
11483
11522
|
try {
|
|
11484
11523
|
server.hot.send({
|
|
11485
11524
|
type: "error",
|
|
@@ -11697,8 +11736,8 @@ function createTimberMiddleware(server, projectRoot) {
|
|
|
11697
11736
|
const rscModule = await rscEnv.runner.import(RSC_ENTRY_ID);
|
|
11698
11737
|
handler = rscModule.default;
|
|
11699
11738
|
const setHandler = rscModule.setDevPipelineErrorHandler;
|
|
11700
|
-
if (typeof setHandler === "function") setHandler((error) => {
|
|
11701
|
-
sendErrorToOverlay(server, error, classifyErrorPhase(error, projectRoot), projectRoot);
|
|
11739
|
+
if (typeof setHandler === "function") setHandler((error, _phase, debugComponents) => {
|
|
11740
|
+
sendErrorToOverlay(server, error, classifyErrorPhase(error, projectRoot), projectRoot, debugComponents);
|
|
11702
11741
|
});
|
|
11703
11742
|
} catch (error) {
|
|
11704
11743
|
if (error instanceof Error) sendErrorToOverlay(server, error, "module-transform", projectRoot);
|
|
@@ -11787,15 +11826,24 @@ async function sendWebResponse(nodeRes, webResponse) {
|
|
|
11787
11826
|
}
|
|
11788
11827
|
nodeRes.flushHeaders();
|
|
11789
11828
|
const reader = webResponse.body.getReader();
|
|
11829
|
+
let clientDisconnected = false;
|
|
11830
|
+
const onClose = () => {
|
|
11831
|
+
clientDisconnected = true;
|
|
11832
|
+
reader.cancel("Client disconnected").catch(() => {});
|
|
11833
|
+
};
|
|
11834
|
+
nodeRes.on("close", onClose);
|
|
11790
11835
|
try {
|
|
11791
11836
|
while (true) {
|
|
11792
11837
|
const { done, value } = await reader.read();
|
|
11793
11838
|
if (done) break;
|
|
11794
11839
|
nodeRes.write(value);
|
|
11795
11840
|
}
|
|
11841
|
+
} catch (err) {
|
|
11842
|
+
if (!clientDisconnected) throw err;
|
|
11796
11843
|
} finally {
|
|
11844
|
+
nodeRes.off("close", onClose);
|
|
11797
11845
|
reader.releaseLock();
|
|
11798
|
-
nodeRes.end();
|
|
11846
|
+
if (!nodeRes.writableEnded) nodeRes.end();
|
|
11799
11847
|
}
|
|
11800
11848
|
}
|
|
11801
11849
|
/**
|
|
@@ -11917,6 +11965,7 @@ function generateConfigModule(ctx) {
|
|
|
11917
11965
|
topLoader: ctx.config.topLoader,
|
|
11918
11966
|
debug: ctx.config.debug ?? false,
|
|
11919
11967
|
serverTiming: ctx.config.serverTiming,
|
|
11968
|
+
renderTimeoutMs: ctx.config.renderTimeoutMs ?? 3e4,
|
|
11920
11969
|
deploymentId: ctx.deploymentId ?? null
|
|
11921
11970
|
};
|
|
11922
11971
|
return [
|