@reckona/mreact-router 0.0.203 → 0.0.204

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.
Files changed (140) hide show
  1. package/README.md +53 -9
  2. package/dist/actions.d.ts +6 -0
  3. package/dist/actions.d.ts.map +1 -1
  4. package/dist/actions.js +70 -10
  5. package/dist/actions.js.map +1 -1
  6. package/dist/adapters/aws-lambda.d.ts +15 -4
  7. package/dist/adapters/aws-lambda.d.ts.map +1 -1
  8. package/dist/adapters/aws-lambda.js +301 -63
  9. package/dist/adapters/aws-lambda.js.map +1 -1
  10. package/dist/adapters/cloudflare.d.ts +2 -1
  11. package/dist/adapters/cloudflare.d.ts.map +1 -1
  12. package/dist/adapters/cloudflare.js +18 -10
  13. package/dist/adapters/cloudflare.js.map +1 -1
  14. package/dist/adapters/edge.d.ts +1 -1
  15. package/dist/adapters/edge.d.ts.map +1 -1
  16. package/dist/adapters/edge.js.map +1 -1
  17. package/dist/adapters/node.d.ts +5 -3
  18. package/dist/adapters/node.d.ts.map +1 -1
  19. package/dist/adapters/node.js +2 -1
  20. package/dist/adapters/node.js.map +1 -1
  21. package/dist/adapters/static.d.ts.map +1 -1
  22. package/dist/adapters/static.js +24 -2
  23. package/dist/adapters/static.js.map +1 -1
  24. package/dist/build.d.ts +1 -0
  25. package/dist/build.d.ts.map +1 -1
  26. package/dist/build.js +91 -5
  27. package/dist/build.js.map +1 -1
  28. package/dist/built-runtime.d.ts +2 -0
  29. package/dist/built-runtime.d.ts.map +1 -1
  30. package/dist/built-runtime.js +16 -0
  31. package/dist/built-runtime.js.map +1 -1
  32. package/dist/cache.d.ts +3 -1
  33. package/dist/cache.d.ts.map +1 -1
  34. package/dist/cache.js +211 -13
  35. package/dist/cache.js.map +1 -1
  36. package/dist/cli.js +12 -1
  37. package/dist/cli.js.map +1 -1
  38. package/dist/client.d.ts.map +1 -1
  39. package/dist/client.js +32 -1
  40. package/dist/client.js.map +1 -1
  41. package/dist/config.d.ts +3 -0
  42. package/dist/config.d.ts.map +1 -1
  43. package/dist/config.js +21 -2
  44. package/dist/config.js.map +1 -1
  45. package/dist/csp.d.ts +1 -0
  46. package/dist/csp.d.ts.map +1 -1
  47. package/dist/csp.js +9 -0
  48. package/dist/csp.js.map +1 -1
  49. package/dist/dehydrate-policy.d.ts +3 -0
  50. package/dist/dehydrate-policy.d.ts.map +1 -0
  51. package/dist/dehydrate-policy.js +16 -0
  52. package/dist/dehydrate-policy.js.map +1 -0
  53. package/dist/dev-server.d.ts +7 -2
  54. package/dist/dev-server.d.ts.map +1 -1
  55. package/dist/dev-server.js +120 -11
  56. package/dist/dev-server.js.map +1 -1
  57. package/dist/http.d.ts +1 -1
  58. package/dist/http.d.ts.map +1 -1
  59. package/dist/http.js +147 -7
  60. package/dist/http.js.map +1 -1
  61. package/dist/index.d.ts +4 -3
  62. package/dist/index.d.ts.map +1 -1
  63. package/dist/index.js +1 -0
  64. package/dist/index.js.map +1 -1
  65. package/dist/logger.d.ts +22 -1
  66. package/dist/logger.d.ts.map +1 -1
  67. package/dist/logger.js +22 -8
  68. package/dist/logger.js.map +1 -1
  69. package/dist/metadata.d.ts +8 -0
  70. package/dist/metadata.d.ts.map +1 -1
  71. package/dist/metadata.js +60 -22
  72. package/dist/metadata.js.map +1 -1
  73. package/dist/navigation-marker.d.ts.map +1 -1
  74. package/dist/navigation-marker.js +72 -9
  75. package/dist/navigation-marker.js.map +1 -1
  76. package/dist/navigation.d.ts +1 -0
  77. package/dist/navigation.d.ts.map +1 -1
  78. package/dist/navigation.js +1 -1
  79. package/dist/navigation.js.map +1 -1
  80. package/dist/node-server.d.ts +5 -2
  81. package/dist/node-server.d.ts.map +1 -1
  82. package/dist/node-server.js +75 -6
  83. package/dist/node-server.js.map +1 -1
  84. package/dist/prerender-entry.d.ts +14 -0
  85. package/dist/prerender-entry.d.ts.map +1 -1
  86. package/dist/prerender-entry.js +40 -3
  87. package/dist/prerender-entry.js.map +1 -1
  88. package/dist/render.d.ts +9 -1
  89. package/dist/render.d.ts.map +1 -1
  90. package/dist/render.js +102 -123
  91. package/dist/render.js.map +1 -1
  92. package/dist/serve.d.ts +8 -2
  93. package/dist/serve.d.ts.map +1 -1
  94. package/dist/serve.js +22 -20
  95. package/dist/serve.js.map +1 -1
  96. package/dist/session.d.ts.map +1 -1
  97. package/dist/session.js +52 -19
  98. package/dist/session.js.map +1 -1
  99. package/dist/upgrade.d.ts +59 -2
  100. package/dist/upgrade.d.ts.map +1 -1
  101. package/dist/upgrade.js +282 -1
  102. package/dist/upgrade.js.map +1 -1
  103. package/dist/vite-config.d.ts +2 -0
  104. package/dist/vite-config.d.ts.map +1 -1
  105. package/dist/vite-config.js +2 -0
  106. package/dist/vite-config.js.map +1 -1
  107. package/dist/vite.d.ts +4 -1
  108. package/dist/vite.d.ts.map +1 -1
  109. package/dist/vite.js +117 -6
  110. package/dist/vite.js.map +1 -1
  111. package/package.json +11 -11
  112. package/src/actions.ts +81 -11
  113. package/src/adapters/aws-lambda.ts +426 -115
  114. package/src/adapters/cloudflare.ts +29 -13
  115. package/src/adapters/edge.ts +2 -0
  116. package/src/adapters/node.ts +8 -10
  117. package/src/adapters/static.ts +31 -2
  118. package/src/build.ts +117 -10
  119. package/src/built-runtime.ts +28 -0
  120. package/src/cache.ts +262 -15
  121. package/src/cli.ts +14 -1
  122. package/src/client.ts +32 -1
  123. package/src/config.ts +43 -6
  124. package/src/csp.ts +11 -0
  125. package/src/dehydrate-policy.ts +23 -0
  126. package/src/dev-server.ts +188 -15
  127. package/src/http.ts +172 -6
  128. package/src/index.ts +14 -1
  129. package/src/logger.ts +47 -10
  130. package/src/metadata.ts +125 -60
  131. package/src/navigation-marker.ts +79 -9
  132. package/src/navigation.ts +1 -1
  133. package/src/node-server.ts +128 -22
  134. package/src/prerender-entry.ts +52 -3
  135. package/src/render.ts +807 -753
  136. package/src/serve.ts +49 -56
  137. package/src/session.ts +56 -25
  138. package/src/upgrade.ts +402 -3
  139. package/src/vite-config.ts +6 -0
  140. package/src/vite.ts +157 -5
package/dist/render.d.ts CHANGED
@@ -47,6 +47,7 @@ export interface RenderAppRequestOptions {
47
47
  routeMatcher?: RouteMatcher | undefined;
48
48
  routes?: readonly AppRoute[] | undefined;
49
49
  serverModules?: ReadonlyMap<string, BuiltServerModuleArtifact> | undefined;
50
+ serverRenderArtifactLoader?: AppRouterServerRenderArtifactLoader | undefined;
50
51
  serverModuleCacheVersion?: string | undefined;
51
52
  devServerModuleCacheVersion?: string | undefined;
52
53
  dev?: boolean | undefined;
@@ -58,6 +59,14 @@ export interface RenderAppRequestOptions {
58
59
  vitePlugins?: readonly PluginOption[] | undefined;
59
60
  }
60
61
  export interface RenderAppRequestRuntimeOptions extends RenderAppRequestOptions {
62
+ /**
63
+ * Wraps a server-only page with build-time variant capture comments.
64
+ *
65
+ * This is an in-process render signal. It must not be derived from request
66
+ * headers because network clients are not allowed to change response shape
67
+ * outside the route-cache key.
68
+ */
69
+ prerenderVariantCapture?: boolean | undefined;
61
70
  /**
62
71
  * Receives whether the render depended on the incoming request headers.
63
72
  *
@@ -72,7 +81,6 @@ export interface RenderAppRequestRuntimeOptions extends RenderAppRequestOptions
72
81
  headerDependent: () => boolean;
73
82
  strictTransportSecurity: () => string | undefined;
74
83
  } | undefined;
75
- serverRenderArtifactLoader?: AppRouterServerRenderArtifactLoader | undefined;
76
84
  }
77
85
  export interface AppRouterRenderPreload {
78
86
  promise: Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"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"}
package/dist/render.js CHANGED
@@ -5,7 +5,7 @@ import { access, readFile, stat } from "node:fs/promises";
5
5
  import { dirname, join, relative, resolve, sep } from "node:path";
6
6
  import { formatDiagnostic, transform } from "@reckona/mreact-compiler";
7
7
  import { createQueryClient, dehydrate, __MREACT_QUERY_STATE_SCRIPT_ID, installQueryAsyncStorage, runWithQueryClient, } from "@reckona/mreact-query";
8
- import { createStringSink, renderAsyncBoundary, renderOutOfOrderReorderScript, renderReactNodeToString, renderToReadableStream, } from "@reckona/mreact-server";
8
+ import { createStringSink, renderOutOfOrderBoundary, renderOutOfOrderReorderScript, renderReactNodeToString, renderToReadableStream, } from "@reckona/mreact-server";
9
9
  import { createClientRouteInferenceCache, formatClientRouteInferenceDiagnostic, inferClientRouteModule, } from "./client-route-inference.js";
10
10
  import { hydrationMarkerParts, routeMarkerParts, routeIdForPath, withHydrationMarkers, } from "./navigation-runtime.js";
11
11
  import { assetPath } from "./assets.js";
@@ -16,8 +16,9 @@ import { dispatchServerActionRequest, prepareRouteServerActionPlaceholders, prep
16
16
  import { serverActionCookie } from "./csrf.js";
17
17
  import { activeRouteCacheContext, withRouteCacheContext, cachedRouteResponse, cacheRouteResponse, routeCacheKey, routeCachePolicyFromSource, } from "./cache.js";
18
18
  import { trackRequestHeaderReads, withTrackedRequest, } from "./request-header-tracking.js";
19
- import { configuredHstsHeader, hasInvalidConfiguredHsts, } from "./security-headers.js";
19
+ import { configuredHstsHeader, hasInvalidConfiguredHsts } from "./security-headers.js";
20
20
  import { resolveRouterCacheLimit } from "./cache-config.js";
21
+ import { protectNonceBearingResponse } from "./prerender-entry.js";
21
22
  import { importAppRouterBuiltFileModule, importAppRouterFileModule, importAppRouterSourceModule, fileImportMetaUrlPlugin, rewriteCompatVendorPlaceholderImportsForRunner, } from "./module-runner.js";
22
23
  import { bytesResponse, htmlResponse } from "./http.js";
23
24
  import { isNotFoundError, isRedirectError, rewriteLocation } from "./navigation.js";
@@ -30,7 +31,7 @@ import { bundleRouterModule } from "./bundle-pipeline.js";
30
31
  import { viteDefineCacheKey, vitePluginsCacheKey } from "./vite-plugin-cache-key.js";
31
32
  import { invokeRouterInstrumentation, traceContextFromRequest, } from "./trace.js";
32
33
  import { mergeRouteMiddlewareControls, middlewareMatches, parseRouteMiddlewareControl, parseStaticMiddlewareConfig, shouldSkipMiddleware, validateRouteMiddlewareControl, } from "./middleware.js";
33
- import { applyFileConventionMetadata, injectHeadMetadata, mergeRouteMetadata, responseHeadersForMetadata, serializeRobots, serializeSitemap, validateRouteMetadata, } from "./metadata.js";
34
+ import { applyFileConventionMetadataTemplate, fileConventionMetadataTemplate, injectHeadMetadata, mergeRouteMetadata, responseHeadersForMetadata, serializeRobots, serializeSitemap, validateRouteMetadata, } from "./metadata.js";
34
35
  import { createSlotRenderContext, markShellBoundary, shellBoundaryId, splitLayoutSlot, warnUnconsumedRouteSlots, } from "./layout-composer.js";
35
36
  import { importPolicyCacheKey, memoizedHashText, prebuiltRequestModuleArtifact, prebuiltRouteLoaderModuleArtifact, prebuiltServerComponentModuleCode, prebuiltServerModuleOutputMatches, prebuiltServerModuleOutputOptionsMatch, } from "./route-module-loader.js";
36
37
  import { loadRouteDataFromModule, } from "./route-loader-runtime.js";
@@ -272,7 +273,7 @@ export async function renderAppRequest(options) {
272
273
  };
273
274
  invokeRouterInstrumentation(options.instrumentation?.onRequestStart, requestEvent);
274
275
  const response = await renderAppRequestInternal({ ...options, requestUrl: url });
275
- const finalResponse = await applyAppRouterResponseHook(response, options);
276
+ const finalResponse = protectNonceBearingResponse(await applyAppRouterResponseHook(response, options));
276
277
  invokeRouterInstrumentation(options.instrumentation?.onRequestEnd, {
277
278
  ...requestEvent,
278
279
  status: finalResponse.status,
@@ -291,31 +292,14 @@ function finishRenderTimingPhase(timing, startedAt, phaseName) {
291
292
  }
292
293
  timing.phases[phaseName] = logDurationMs(startedAt);
293
294
  }
294
- async function readSettledPromiseAtNextTask(promise) {
295
- return await Promise.race([
296
- promise.then((value) => ({ settled: true, value })),
297
- new Promise((resolve) => {
298
- setTimeout(() => resolve({ settled: false }), 0);
299
- }),
300
- ]);
301
- }
302
- function createDeferredSignal() {
303
- let resolve;
304
- const promise = new Promise((innerResolve) => {
305
- resolve = innerResolve;
295
+ function observePromiseSettlement(promise) {
296
+ let settlement = { status: "pending" };
297
+ void promise.then((value) => {
298
+ settlement = { status: "fulfilled", value };
299
+ }, (error) => {
300
+ settlement = { error, status: "rejected" };
306
301
  });
307
- return {
308
- promise,
309
- resolve() {
310
- resolve?.();
311
- },
312
- };
313
- }
314
- async function waitForLoaderReadyOrSettled(dataPromise, loaderReady) {
315
- if (loaderReady === undefined) {
316
- return;
317
- }
318
- await Promise.race([loaderReady, dataPromise.then(() => undefined, () => undefined)]);
302
+ return () => settlement;
319
303
  }
320
304
  function addRenderTimingPhaseDuration(timing, startedAt, phaseName) {
321
305
  if (timing === undefined || startedAt === undefined) {
@@ -323,11 +307,6 @@ function addRenderTimingPhaseDuration(timing, startedAt, phaseName) {
323
307
  }
324
308
  timing.phases[phaseName] = (timing.phases[phaseName] ?? 0) + logDurationMs(startedAt);
325
309
  }
326
- function routeLoaderMayReturnControlResponse(code) {
327
- return (/\b(?:redirect|redirectExternal|rewrite|notFound|throwNotFound)\s*\(/.test(code) ||
328
- /\bnew\s+Response\s*\(/.test(code) ||
329
- /\bResponse\.(?:redirect|json)\s*\(/.test(code));
330
- }
331
310
  async function waitForRenderPreload(options, timing) {
332
311
  if (options.preload?.wait !== "before-render") {
333
312
  return;
@@ -627,7 +606,6 @@ async function renderAppRequestInternal(options) {
627
606
  const clientInference = routeAnalysis.clientInference;
628
607
  const clientRoute = clientInference.client;
629
608
  phaseStartedAt = renderTimingPhaseStartedAt(timing);
630
- const loaderReady = routeAnalysis.hasLoader ? createDeferredSignal() : undefined;
631
609
  const dataPromise = routeAnalysis.hasLoader
632
610
  ? loadRouteDataWithInstrumentation({
633
611
  appDir: options.appDir,
@@ -649,9 +627,12 @@ async function renderAppRequestInternal(options) {
649
627
  define: options.define,
650
628
  vitePlugins: options.vitePlugins,
651
629
  timing,
652
- onLoaderReady: loaderReady?.resolve,
653
630
  })
654
631
  : undefined;
632
+ // Route analysis and loading-boundary discovery can continue before the loader is awaited.
633
+ // Observe an early rejection immediately so strict unhandled-rejection runtimes do not
634
+ // terminate before the request-level control/error handler receives the same promise.
635
+ void dataPromise?.catch(() => { });
655
636
  finishRenderTimingPhase(timing, phaseStartedAt, "loaderStartMs");
656
637
  recoveryRoute = {
657
638
  clientRoute,
@@ -734,7 +715,7 @@ async function renderAppRequestInternal(options) {
734
715
  data,
735
716
  },
736
717
  })
737
- : withServerOnlyRouteMarkers(pageHtml, matched.route.path, options.request);
718
+ : withServerOnlyRouteMarkers(pageHtml, matched.route.path, options.request, options.prerenderVariantCapture === true);
738
719
  let html = await runWithQueryClient(queryClient, () => applyLayouts({
739
720
  appDir: options.appDir,
740
721
  pageFile: matched.route.file,
@@ -796,39 +777,19 @@ async function renderAppRequestInternal(options) {
796
777
  return response;
797
778
  }
798
779
  let streamData;
799
- let streamDataPromise = dataPromise ?? Promise.resolve(undefined);
800
780
  phaseStartedAt = renderTimingPhaseStartedAt(timing);
801
- if (loadingFile === undefined || routeLoaderMayReturnControlResponse(originalCode)) {
802
- try {
803
- streamData = dataPromise === undefined ? undefined : await dataPromise;
804
- }
805
- finally {
806
- finishRenderTimingPhase(timing, phaseStartedAt, "loaderWaitMs");
807
- }
808
- if (streamData instanceof Response) {
809
- emitRenderTiming(options, timing, streamData.status);
810
- return streamData;
811
- }
812
- streamDataPromise = Promise.resolve(streamData);
781
+ try {
782
+ streamData = dataPromise === undefined ? undefined : await dataPromise;
813
783
  }
814
- else {
815
- try {
816
- const settledData = await readSettledPromiseAtNextTask(streamDataPromise);
817
- if (settledData.settled) {
818
- if (settledData.value instanceof Response) {
819
- emitRenderTiming(options, timing, settledData.value.status);
820
- return settledData.value;
821
- }
822
- streamDataPromise = Promise.resolve(settledData.value);
823
- }
824
- else {
825
- await waitForLoaderReadyOrSettled(streamDataPromise, loaderReady?.promise);
826
- }
827
- }
828
- finally {
829
- finishRenderTimingPhase(timing, phaseStartedAt, "loaderWaitMs");
830
- }
784
+ finally {
785
+ finishRenderTimingPhase(timing, phaseStartedAt, "loaderWaitMs");
831
786
  }
787
+ if (streamData instanceof Response) {
788
+ emitRenderTiming(options, timing, streamData.status);
789
+ return streamData;
790
+ }
791
+ const streamDataPromise = Promise.resolve(streamData);
792
+ const streamDataSettlement = loadingFile === undefined ? undefined : observePromiseSettlement(streamDataPromise);
832
793
  await waitForRenderPreload(options, timing);
833
794
  await loadServerRenderArtifacts(options, matched.route.file, timing);
834
795
  phaseStartedAt = renderTimingPhaseStartedAt(timing);
@@ -849,16 +810,26 @@ async function renderAppRequestInternal(options) {
849
810
  headers: { "content-type": "text/plain; charset=utf-8" },
850
811
  });
851
812
  }
852
- if (loadingFile !== undefined) {
813
+ if (loadingFile !== undefined && streamDataSettlement !== undefined) {
853
814
  phaseStartedAt = renderTimingPhaseStartedAt(timing);
854
- const stream = await runServerStreamModuleWithLoading(output.code, {
815
+ const errorFile = await nearestExistingBoundaryFileForPage({
816
+ appDir: options.appDir,
817
+ filename: "error.mreact.tsx",
818
+ pageFile: matched.route.file,
819
+ serverSourceFiles: options.serverSourceFiles,
820
+ });
821
+ const streamResult = await runServerStreamModuleWithLoading(output.code, {
855
822
  appDir: options.appDir,
856
823
  assetBaseUrl: options.assetBaseUrl,
857
824
  clientRoute,
858
825
  data: streamDataPromise,
826
+ dataSettlement: streamDataSettlement,
859
827
  define: options.define,
828
+ errorFile,
860
829
  loadingFile,
861
830
  markerRequest: options.request,
831
+ onRenderError: options.onRenderError,
832
+ prerenderVariantCapture: options.prerenderVariantCapture,
862
833
  pageFile: matched.route.file,
863
834
  params: matched.params,
864
835
  queryClient,
@@ -877,7 +848,11 @@ async function renderAppRequestInternal(options) {
877
848
  clientReferenceManifest: output.metadata.clientReferenceManifest,
878
849
  });
879
850
  finishRenderTimingPhase(timing, phaseStartedAt, "streamConstructionMs");
880
- const response = withOptionalActionCookie(new Response(stream, {
851
+ if (streamResult instanceof Response) {
852
+ emitRenderTiming(options, timing, streamResult.status);
853
+ return streamResult;
854
+ }
855
+ const response = withOptionalActionCookie(new Response(streamResult, {
881
856
  headers: streamShellResponseHeaders,
882
857
  }), preparedActions.csrfToken, preparedActions.csrfTokenIsNew === true);
883
858
  appendNavigationVary(response.headers);
@@ -896,6 +871,7 @@ async function renderAppRequestInternal(options) {
896
871
  assetBaseUrl: options.assetBaseUrl,
897
872
  pageFile: matched.route.file,
898
873
  markerRequest: options.request,
874
+ prerenderVariantCapture: options.prerenderVariantCapture,
899
875
  props,
900
876
  requestUrl: url.pathname,
901
877
  routePath: matched.route.path,
@@ -982,7 +958,7 @@ async function renderAppRequestInternal(options) {
982
958
  data,
983
959
  },
984
960
  })
985
- : withServerOnlyRouteMarkers(pageHtml, matched.route.path, options.request);
961
+ : withServerOnlyRouteMarkers(pageHtml, matched.route.path, options.request, options.prerenderVariantCapture === true);
986
962
  phaseStartedAt = renderTimingPhaseStartedAt(timing);
987
963
  let html = await runWithQueryClient(queryClient, () => applyLayouts({
988
964
  appDir: options.appDir,
@@ -1137,7 +1113,9 @@ async function renderAppRequestInternal(options) {
1137
1113
  // after draining the body.
1138
1114
  if (options.renderSignals !== undefined) {
1139
1115
  const tracked = trackedRequest;
1140
- options.renderSignals.headerDependent = () => sourceUsesRequestInput || invalidConfiguredHsts || (tracked?.requestDependent() ?? true);
1116
+ options.renderSignals.headerDependent = () => sourceUsesRequestInput ||
1117
+ invalidConfiguredHsts ||
1118
+ (tracked?.requestDependent() ?? true);
1141
1119
  options.renderSignals.strictTransportSecurity = () => renderedStrictTransportSecurity;
1142
1120
  }
1143
1121
  }
@@ -1276,12 +1254,12 @@ function routePrefetchManifestScript(routeScripts, assetBaseUrl) {
1276
1254
  function isNavigationRequest(request) {
1277
1255
  return request.headers.get("x-mreact-navigation") === "1";
1278
1256
  }
1279
- function withServerOnlyRouteMarkers(html, routePath, request) {
1280
- const marker = serverOnlyRouteMarkerParts(routePath, request);
1257
+ function withServerOnlyRouteMarkers(html, routePath, request, prerenderVariantCapture) {
1258
+ const marker = serverOnlyRouteMarkerParts(routePath, request, prerenderVariantCapture);
1281
1259
  return marker === undefined ? html : `${marker.prefix}${html}${marker.suffix}`;
1282
1260
  }
1283
- function serverOnlyRouteMarkerParts(routePath, request) {
1284
- if (request.headers.get("x-mreact-prerender-variant-capture") === "1") {
1261
+ function serverOnlyRouteMarkerParts(routePath, request, prerenderVariantCapture) {
1262
+ if (prerenderVariantCapture) {
1285
1263
  return prerenderVariantMarkerParts(routePath);
1286
1264
  }
1287
1265
  return isNavigationRequest(request) ? routeMarkerParts(routePath) : undefined;
@@ -1295,9 +1273,7 @@ export function prerenderVariantMarkerParts(routePath) {
1295
1273
  }
1296
1274
  function appendNavigationVary(headers) {
1297
1275
  const vary = headers.get("vary");
1298
- if (vary
1299
- ?.split(",")
1300
- .some((value) => value.trim().toLowerCase() === "x-mreact-navigation") === true) {
1276
+ if (vary?.split(",").some((value) => value.trim().toLowerCase() === "x-mreact-navigation") === true) {
1301
1277
  return;
1302
1278
  }
1303
1279
  headers.append("vary", "x-mreact-navigation");
@@ -1415,15 +1391,7 @@ async function renderSpecialRoute(options) {
1415
1391
  }
1416
1392
  }
1417
1393
  const props = {
1418
- data: undefined,
1419
- debug: errorDebugContext(options.error, options.routePath),
1420
- error: normalizeErrorForProps(options.error),
1421
- params: {},
1422
- queryClient: createQueryClient(),
1423
- request: options.request,
1424
- requestId: requestIdForErrorContext(options.request),
1425
- routeId: routeIdForPath(options.routePath ?? new URL(options.request.url).pathname),
1426
- traceId: traceContextFromRequest(options.request)?.traceId,
1394
+ ...errorBoundaryProps(options.error, options.request, options.routePath),
1427
1395
  };
1428
1396
  const pageHtml = await renderServerFileToHtml(options.routeFile, props, options.serverModules, options.serverModuleCacheVersion, options.serverSourceFiles, options.define, options.vitePlugins);
1429
1397
  const pageHtmlForLayout = options.navigation?.clientRoute === true
@@ -1457,6 +1425,19 @@ async function renderSpecialRoute(options) {
1457
1425
  status: options.status,
1458
1426
  });
1459
1427
  }
1428
+ function errorBoundaryProps(error, request, routePath) {
1429
+ return {
1430
+ data: undefined,
1431
+ debug: errorDebugContext(error, routePath),
1432
+ error: normalizeErrorForProps(error),
1433
+ params: {},
1434
+ queryClient: createQueryClient(),
1435
+ request,
1436
+ requestId: requestIdForErrorContext(request),
1437
+ routeId: routeIdForPath(routePath ?? new URL(request.url).pathname),
1438
+ traceId: traceContextFromRequest(request)?.traceId,
1439
+ };
1440
+ }
1460
1441
  async function renderServerFileToHtml(file, props, serverModules, serverModuleCacheVersion, serverSourceFiles, define, vitePlugins) {
1461
1442
  const code = await readServerSourceFile(file, serverModuleCacheVersion, serverSourceFiles);
1462
1443
  const output = transformServerModule({
@@ -2216,7 +2197,7 @@ function runServerStreamModule(code, options) {
2216
2197
  data: options.props.data,
2217
2198
  },
2218
2199
  })
2219
- : serverOnlyRouteMarkerParts(options.routePath, options.markerRequest);
2200
+ : serverOnlyRouteMarkerParts(options.routePath, options.markerRequest, options.prerenderVariantCapture === true);
2220
2201
  sink.append("<!DOCTYPE html>");
2221
2202
  sink.append(clientNavigationHeadTags({
2222
2203
  assetBaseUrl: options.assetBaseUrl,
@@ -2348,7 +2329,14 @@ async function runServerStreamModuleWithLoading(code, options) {
2348
2329
  request: { url: options.requestUrl },
2349
2330
  },
2350
2331
  })
2351
- : serverOnlyRouteMarkerParts(options.routePath, options.markerRequest);
2332
+ : serverOnlyRouteMarkerParts(options.routePath, options.markerRequest, options.prerenderVariantCapture === true);
2333
+ const dataSettlement = options.dataSettlement();
2334
+ if (dataSettlement.status === "rejected") {
2335
+ throw dataSettlement.error;
2336
+ }
2337
+ if (dataSettlement.status === "fulfilled" && dataSettlement.value instanceof Response) {
2338
+ return dataSettlement.value;
2339
+ }
2352
2340
  return renderToReadableStream((sink) => {
2353
2341
  sink.append("<!DOCTYPE html>");
2354
2342
  sink.append(clientNavigationHeadTags({
@@ -2360,13 +2348,31 @@ async function runServerStreamModuleWithLoading(code, options) {
2360
2348
  sink.append(shell.prefix);
2361
2349
  }
2362
2350
  sink.append(marker?.prefix ?? "");
2363
- renderVisibleOutOfOrderBoundary(sink, "mreact-route", options.data, async (boundarySink, data) => {
2351
+ renderOutOfOrderBoundary(sink, "mreact-route", options.data, async (boundarySink, data) => {
2364
2352
  await appendServerStreamModule(code, boundarySink, withTrackedRequest({
2365
2353
  data,
2366
2354
  params: options.params,
2367
2355
  queryClient: options.queryClient,
2368
2356
  }, options.request, options.trackedRequest), options.pageFile, options.serverModules, options.serverModuleCacheVersion, options.define, options.vitePlugins, options.importPolicy);
2369
2357
  }, {
2358
+ async catch(boundarySink, error) {
2359
+ try {
2360
+ options.onRenderError?.(error);
2361
+ }
2362
+ catch {
2363
+ // Error reporting is best-effort and must not truncate a response that already flushed.
2364
+ }
2365
+ if (options.errorFile === undefined) {
2366
+ boundarySink.append("Internal Server Error");
2367
+ return;
2368
+ }
2369
+ try {
2370
+ boundarySink.append(await renderServerFileToHtml(options.errorFile, errorBoundaryProps(error, options.request, options.routePath), options.serverModules, options.serverModuleCacheVersion, options.serverSourceFiles, options.define, options.vitePlugins));
2371
+ }
2372
+ catch {
2373
+ boundarySink.append("Internal Server Error");
2374
+ }
2375
+ },
2370
2376
  placeholder(boundarySink) {
2371
2377
  boundarySink.append(loadingHtml);
2372
2378
  },
@@ -2379,35 +2385,6 @@ async function runServerStreamModuleWithLoading(code, options) {
2379
2385
  renderOutOfOrderReorderScript(sink);
2380
2386
  });
2381
2387
  }
2382
- function renderVisibleOutOfOrderBoundary(sink, id, value, render, options = {}) {
2383
- const placeholderSink = createStringSink();
2384
- void options.placeholder?.(placeholderSink);
2385
- const placeholderTag = normalizeVisibleOutOfOrderPlaceholderTag(options.placeholderTag);
2386
- sink.append(`<${placeholderTag} data-mreact-oob-placeholder="${escapeHtmlAttribute(id)}">${placeholderSink.toString()}</${placeholderTag}>`);
2387
- const task = renderVisibleOutOfOrderFragment(sink, id, value, render, options);
2388
- if (sink.defer === undefined) {
2389
- void task;
2390
- return;
2391
- }
2392
- sink.defer(task);
2393
- }
2394
- function normalizeVisibleOutOfOrderPlaceholderTag(tag) {
2395
- if (typeof tag !== "string") {
2396
- return "span";
2397
- }
2398
- const normalized = tag.trim().toLowerCase();
2399
- return /^[a-z][a-z0-9-]*$/.test(normalized) ? normalized : "span";
2400
- }
2401
- async function renderVisibleOutOfOrderFragment(sink, id, value, render, options) {
2402
- const fragmentSink = createStringSink();
2403
- await renderAsyncBoundary(fragmentSink, value, render, options.catch === undefined ? {} : { catch: options.catch });
2404
- await fragmentSink.drain();
2405
- sink.append(renderVisibleOutOfOrderFragmentHtml(id, fragmentSink.toString()));
2406
- }
2407
- function renderVisibleOutOfOrderFragmentHtml(id, html) {
2408
- const escapedId = escapeHtmlAttribute(id);
2409
- return `<template data-mreact-oob-fragment="${escapedId}">${html}</template><mreact-oob-complete hidden data-mreact-oob-complete="${escapedId}"></mreact-oob-complete>`;
2410
- }
2411
2388
  async function appendServerStreamModule(code, sink, props, sourcefile, serverModules, serverModuleCacheVersion, define, vitePlugins, importPolicy) {
2412
2389
  const module = await loadServerStreamModule(code, sourcefile, serverModules, serverModuleCacheVersion, define, vitePlugins, importPolicy);
2413
2390
  const component = selectStreamComponent(module);
@@ -3117,15 +3094,16 @@ async function loadComposedRouteMetadata(options) {
3117
3094
  if (cacheKey !== undefined) {
3118
3095
  const cached = readRouterRuntimeCacheEntry(composedRouteMetadataCache, cacheKey, composedRouteMetadataCacheCounters);
3119
3096
  if (cached !== undefined) {
3120
- return cached;
3097
+ const entry = await cached;
3098
+ return applyFileConventionMetadataTemplate(entry.metadata, entry.template, options.context.params);
3121
3099
  }
3122
3100
  }
3123
3101
  try {
3124
3102
  const loaded = await loadComposedRouteMetadataUncached(options);
3125
3103
  if (cacheKey !== undefined && !loaded.dynamic) {
3126
- setBoundedCacheEntry(composedRouteMetadataCache, cacheKey, Promise.resolve(loaded.metadata), maxComposedRouteMetadataCacheEntries, composedRouteMetadataCacheCounters);
3104
+ setBoundedCacheEntry(composedRouteMetadataCache, cacheKey, Promise.resolve({ metadata: loaded.metadata, template: loaded.template }), maxComposedRouteMetadataCacheEntries, composedRouteMetadataCacheCounters);
3127
3105
  }
3128
- return loaded.metadata;
3106
+ return applyFileConventionMetadataTemplate(loaded.metadata, loaded.template, options.context.params);
3129
3107
  }
3130
3108
  catch (error) {
3131
3109
  if (cacheKey !== undefined) {
@@ -3191,7 +3169,8 @@ async function loadComposedRouteMetadataUncached(options) {
3191
3169
  }
3192
3170
  return {
3193
3171
  dynamic,
3194
- metadata: applyFileConventionMetadata(mergeRouteMetadata(metadata), options.routes, options.filename, options.context.params),
3172
+ metadata: mergeRouteMetadata(metadata),
3173
+ template: fileConventionMetadataTemplate(options.routes, options.filename),
3195
3174
  };
3196
3175
  }
3197
3176
  function hasMetadataExport(code) {