vinext 0.1.6 → 0.1.8

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 (114) hide show
  1. package/dist/build/client-build-config.d.ts +4 -6
  2. package/dist/build/client-build-config.js +27 -7
  3. package/dist/build/prerender.js +1 -2
  4. package/dist/check.d.ts +18 -0
  5. package/dist/check.js +37 -17
  6. package/dist/cli.js +2 -2
  7. package/dist/config/next-config.d.ts +2 -1
  8. package/dist/config/next-config.js +3 -0
  9. package/dist/config/server-external-packages.d.ts +4 -0
  10. package/dist/config/server-external-packages.js +91 -0
  11. package/dist/deploy.d.ts +7 -0
  12. package/dist/deploy.js +25 -18
  13. package/dist/entries/app-rsc-entry.d.ts +2 -1
  14. package/dist/entries/app-rsc-entry.js +89 -20
  15. package/dist/entries/app-rsc-manifest.js +8 -0
  16. package/dist/entries/pages-client-entry.js +1 -0
  17. package/dist/entries/pages-server-entry.js +1 -0
  18. package/dist/index.js +87 -34
  19. package/dist/init.js +2 -1
  20. package/dist/plugins/middleware-server-only.d.ts +8 -6
  21. package/dist/plugins/middleware-server-only.js +8 -7
  22. package/dist/plugins/og-assets.js +6 -6
  23. package/dist/plugins/optimize-imports.js +1 -1
  24. package/dist/plugins/remove-console.js +1 -1
  25. package/dist/plugins/strip-server-exports.js +2 -1
  26. package/dist/routing/app-route-graph.d.ts +6 -2
  27. package/dist/routing/app-route-graph.js +61 -13
  28. package/dist/routing/app-router.d.ts +5 -0
  29. package/dist/routing/app-router.js +5 -0
  30. package/dist/routing/file-matcher.d.ts +5 -0
  31. package/dist/routing/file-matcher.js +7 -1
  32. package/dist/server/app-action-request.d.ts +4 -0
  33. package/dist/server/app-action-request.js +9 -0
  34. package/dist/server/app-bfcache-identity.d.ts +12 -2
  35. package/dist/server/app-bfcache-identity.js +52 -23
  36. package/dist/server/app-browser-entry.js +42 -147
  37. package/dist/server/app-browser-history-controller.d.ts +2 -1
  38. package/dist/server/app-browser-history-controller.js +6 -2
  39. package/dist/server/app-browser-server-action-client.d.ts +32 -0
  40. package/dist/server/app-browser-server-action-client.js +128 -0
  41. package/dist/server/app-fallback-renderer.d.ts +3 -1
  42. package/dist/server/app-fallback-renderer.js +6 -2
  43. package/dist/server/app-history-state.d.ts +1 -2
  44. package/dist/server/app-history-state.js +1 -1
  45. package/dist/server/app-page-boundary-render.d.ts +3 -0
  46. package/dist/server/app-page-boundary-render.js +14 -3
  47. package/dist/server/app-page-cache-finalizer.d.ts +1 -0
  48. package/dist/server/app-page-cache-finalizer.js +8 -2
  49. package/dist/server/app-page-dispatch.d.ts +33 -4
  50. package/dist/server/app-page-dispatch.js +62 -90
  51. package/dist/server/app-page-element-builder.d.ts +7 -1
  52. package/dist/server/app-page-element-builder.js +56 -19
  53. package/dist/server/app-page-head.d.ts +16 -1
  54. package/dist/server/app-page-head.js +44 -22
  55. package/dist/server/app-page-method.js +1 -1
  56. package/dist/server/app-page-params.d.ts +2 -1
  57. package/dist/server/app-page-params.js +8 -1
  58. package/dist/server/app-page-ppr-runtime.d.ts +7 -0
  59. package/dist/server/app-page-ppr-runtime.js +70 -0
  60. package/dist/server/app-page-probe.d.ts +1 -0
  61. package/dist/server/app-page-probe.js +1 -1
  62. package/dist/server/app-page-render.d.ts +4 -1
  63. package/dist/server/app-page-render.js +8 -3
  64. package/dist/server/app-page-request.d.ts +8 -1
  65. package/dist/server/app-page-request.js +23 -11
  66. package/dist/server/app-page-route-wiring.d.ts +6 -1
  67. package/dist/server/app-page-route-wiring.js +30 -8
  68. package/dist/server/app-page-search-params-observation.d.ts +4 -2
  69. package/dist/server/app-page-search-params-observation.js +11 -7
  70. package/dist/server/app-page-stream.js +2 -1
  71. package/dist/server/app-ppr-fallback-shell-render.d.ts +4 -3
  72. package/dist/server/app-route-handler-cache.js +1 -1
  73. package/dist/server/app-route-handler-dispatch.js +3 -2
  74. package/dist/server/app-route-handler-execution.js +5 -3
  75. package/dist/server/app-route-handler-policy.d.ts +1 -1
  76. package/dist/server/app-route-handler-policy.js +1 -6
  77. package/dist/server/app-route-module-loader.d.ts +2 -0
  78. package/dist/server/app-route-module-loader.js +1 -0
  79. package/dist/server/app-router-entry.js +7 -6
  80. package/dist/server/app-rsc-errors.d.ts +12 -1
  81. package/dist/server/app-rsc-errors.js +29 -3
  82. package/dist/server/app-rsc-handler.d.ts +15 -13
  83. package/dist/server/app-rsc-handler.js +28 -33
  84. package/dist/server/app-rsc-response-finalizer.js +5 -1
  85. package/dist/server/app-rsc-route-matching.d.ts +7 -0
  86. package/dist/server/app-rsc-route-matching.js +36 -3
  87. package/dist/server/app-segment-config.d.ts +1 -0
  88. package/dist/server/app-segment-config.js +32 -2
  89. package/dist/server/app-server-action-execution.d.ts +4 -0
  90. package/dist/server/app-server-action-execution.js +42 -11
  91. package/dist/server/app-ssr-entry.js +11 -6
  92. package/dist/server/app-static-generation.d.ts +1 -0
  93. package/dist/server/app-static-generation.js +1 -0
  94. package/dist/server/headers.d.ts +3 -1
  95. package/dist/server/headers.js +3 -1
  96. package/dist/server/metadata-route-response.d.ts +1 -1
  97. package/dist/server/prod-server.js +15 -6
  98. package/dist/server/worker-utils.d.ts +2 -1
  99. package/dist/server/worker-utils.js +7 -1
  100. package/dist/shims/dynamic.js +1 -1
  101. package/dist/shims/error-boundary.d.ts +19 -1
  102. package/dist/shims/error-boundary.js +11 -1
  103. package/dist/shims/headers.d.ts +3 -1
  104. package/dist/shims/headers.js +16 -5
  105. package/dist/shims/link.js +16 -12
  106. package/dist/shims/metadata.d.ts +3 -2
  107. package/dist/shims/metadata.js +8 -4
  108. package/dist/shims/router.js +13 -2
  109. package/dist/typegen.js +6 -5
  110. package/dist/utils/path.d.ts +2 -1
  111. package/dist/utils/path.js +1 -1
  112. package/dist/utils/project.d.ts +4 -0
  113. package/dist/utils/project.js +5 -1
  114. package/package.json +7 -3
@@ -31,6 +31,8 @@ type AppRscInterceptForMatching = {
31
31
  sourceMatchPattern?: string;
32
32
  sourcePageSegments?: readonly string[];
33
33
  interceptLayouts: readonly unknown[];
34
+ interceptLayoutSegments?: readonly (readonly string[])[];
35
+ interceptBranchSegments?: readonly string[];
34
36
  __loadInterceptLayouts?: readonly (() => Promise<unknown>)[] | null;
35
37
  page: unknown;
36
38
  __pageLoader?: (() => Promise<unknown>) | null;
@@ -46,6 +48,8 @@ type AppRscSiblingInterceptForMatching = {
46
48
  sourcePageSegments?: readonly string[];
47
49
  slotId: string | null;
48
50
  interceptLayouts: readonly unknown[];
51
+ interceptLayoutSegments?: readonly (readonly string[])[];
52
+ interceptBranchSegments?: readonly string[];
49
53
  __loadInterceptLayouts?: readonly (() => Promise<unknown>)[] | null;
50
54
  page: unknown;
51
55
  __pageLoader?: (() => Promise<unknown>) | null;
@@ -59,6 +63,7 @@ type AppRscRouteForMatching = {
59
63
  };
60
64
  type AppRscInterceptMatch = AppRscInterceptLookupEntry & {
61
65
  matchedParams: AppRscRouteParams;
66
+ sourceMatchedParams: AppRscRouteParams;
62
67
  };
63
68
  type AppRscInterceptLoadState = {
64
69
  page: unknown;
@@ -74,6 +79,8 @@ type AppRscInterceptLookupEntry = {
74
79
  sourceMatchPatternParts: string[] | null;
75
80
  sourcePageSegments: readonly string[] | null;
76
81
  interceptLayouts: readonly unknown[];
82
+ interceptLayoutSegments?: readonly (readonly string[])[];
83
+ interceptBranchSegments?: readonly string[];
77
84
  __loadInterceptLayouts?: readonly (() => Promise<unknown>)[] | null;
78
85
  page: unknown;
79
86
  __pageLoader?: (() => Promise<unknown>) | null;
@@ -36,12 +36,13 @@ function createAppRscRouteMatcher(routes) {
36
36
  const sourceRoute = routes[concreteSourceRouteIndex];
37
37
  const matchedSourceParams = matchedSourceRoute && entry.sourceMatchPatternParts !== null ? matchedSourceRoute.params : sourceRoute ? matchAppRscRoutePattern(sourceParts, sourceRoute.patternParts) : null;
38
38
  if (matchedSourceParams === null && entry.sourceMatchPatternParts === null) continue;
39
- const sourceParams = matchedSourceParams ?? createRouteParams();
39
+ const sourceParams = matchedSourceParams && entry.sourceMatchPatternParts !== null ? pickPatternParams(matchedSourceParams, entry.sourceMatchPatternParts) : matchedSourceParams ?? createRouteParams();
40
40
  return {
41
41
  ...entry,
42
42
  page: entry.__loadState.page,
43
43
  sourceRouteIndex: concreteSourceRouteIndex,
44
- matchedParams: mergeMatchedParams(sourceParams, params)
44
+ matchedParams: mergeMatchedParams(sourceParams, params),
45
+ sourceMatchedParams: matchedSourceParams ?? createRouteParams()
45
46
  };
46
47
  }
47
48
  return null;
@@ -64,6 +65,24 @@ function matchInterceptSource(sourceParts, entry) {
64
65
  if (patternParts.length === 0) return true;
65
66
  return matchRoutePatternPrefix(sourceParts, patternParts);
66
67
  }
68
+ function interceptSegmentPrecedence(segment) {
69
+ if (!segment.startsWith(":")) return 0;
70
+ if (segment.endsWith("*")) return 3;
71
+ if (segment.endsWith("+")) return 2;
72
+ return 1;
73
+ }
74
+ function compareInterceptTargetPatterns(a, b) {
75
+ const sharedLength = Math.min(a.targetPatternParts.length, b.targetPatternParts.length);
76
+ for (let index = 0; index < sharedLength; index++) {
77
+ const aSegment = a.targetPatternParts[index];
78
+ const bSegment = b.targetPatternParts[index];
79
+ const precedence = interceptSegmentPrecedence(aSegment) - interceptSegmentPrecedence(bSegment);
80
+ if (precedence !== 0) return precedence;
81
+ if (aSegment !== bSegment) return aSegment.localeCompare(bSegment);
82
+ }
83
+ const lengthDifference = a.targetPatternParts.length - b.targetPatternParts.length;
84
+ return lengthDifference !== 0 ? lengthDifference : a.targetPattern.localeCompare(b.targetPattern);
85
+ }
67
86
  function createInterceptLookup(routes) {
68
87
  const patternToIndex = new Map(routes.map((r, i) => [r.pattern, i]));
69
88
  const interceptLookup = [];
@@ -85,6 +104,8 @@ function createInterceptLookup(routes) {
85
104
  sourceMatchPatternParts,
86
105
  sourcePageSegments: intercept.sourcePageSegments ?? null,
87
106
  interceptLayouts: intercept.interceptLayouts,
107
+ interceptLayoutSegments: intercept.interceptLayoutSegments,
108
+ interceptBranchSegments: intercept.interceptBranchSegments,
88
109
  __loadInterceptLayouts: intercept.__loadInterceptLayouts,
89
110
  page: intercept.page,
90
111
  __pageLoader: intercept.__pageLoader,
@@ -110,6 +131,8 @@ function createInterceptLookup(routes) {
110
131
  sourceMatchPatternParts,
111
132
  sourcePageSegments: intercept.sourcePageSegments ?? null,
112
133
  interceptLayouts: intercept.interceptLayouts,
134
+ interceptLayoutSegments: intercept.interceptLayoutSegments,
135
+ interceptBranchSegments: intercept.interceptBranchSegments,
113
136
  __loadInterceptLayouts: intercept.__loadInterceptLayouts,
114
137
  page: intercept.page,
115
138
  __pageLoader: intercept.__pageLoader,
@@ -122,7 +145,7 @@ function createInterceptLookup(routes) {
122
145
  });
123
146
  }
124
147
  }
125
- return interceptLookup;
148
+ return interceptLookup.sort(compareInterceptTargetPatterns);
126
149
  }
127
150
  function matchAppRscRoutePattern(urlParts, patternParts) {
128
151
  return matchRoutePattern(urlParts, patternParts);
@@ -130,5 +153,15 @@ function matchAppRscRoutePattern(urlParts, patternParts) {
130
153
  function mergeMatchedParams(sourceParams, targetParams) {
131
154
  return Object.assign(createRouteParams(), sourceParams, targetParams);
132
155
  }
156
+ function pickPatternParams(params, patternParts) {
157
+ const picked = createRouteParams();
158
+ for (const patternPart of patternParts) {
159
+ if (!patternPart.startsWith(":")) continue;
160
+ const paramName = patternPart.endsWith("+") || patternPart.endsWith("*") ? patternPart.slice(1, -1) : patternPart.slice(1);
161
+ const value = params[paramName];
162
+ if (value !== void 0) picked[paramName] = value;
163
+ }
164
+ return picked;
165
+ }
133
166
  //#endregion
134
167
  export { SIBLING_PAGE_INTERCEPT_SLOT_KEY, createAppRscRouteMatcher, matchAppRscRoutePattern };
@@ -22,6 +22,7 @@ type ResolveAppPageSegmentConfigOptions = {
22
22
  layouts?: readonly (AppRouteSegmentConfigModule | null | undefined)[];
23
23
  page?: AppRouteSegmentConfigModule | null;
24
24
  parallelPages?: readonly (AppRouteSegmentConfigModule | null | undefined)[];
25
+ parallelSegments?: readonly (AppRouteSegmentConfigModule | null | undefined)[];
25
26
  };
26
27
  /**
27
28
  * Resolve the route segment config that applies to an App page route.
@@ -59,9 +59,13 @@ function resolveAppPageSegmentConfig(options) {
59
59
  let hasOnlyCache = false;
60
60
  let hasOnlyNoStore = false;
61
61
  let hasParentDefaultNoStore = false;
62
+ let hasForceDynamic = false;
62
63
  for (const segment of segments) {
63
64
  if (!segment) continue;
64
- if (isRouteSegmentDynamic(segment.dynamic)) config.dynamicConfig = segment.dynamic;
65
+ if (isRouteSegmentDynamic(segment.dynamic)) {
66
+ if (segment.dynamic === "force-dynamic") hasForceDynamic = true;
67
+ config.dynamicConfig = hasForceDynamic ? "force-dynamic" : segment.dynamic;
68
+ }
65
69
  if (isRouteSegmentRuntime(segment.runtime)) config.runtime = segment.runtime;
66
70
  if (segment.dynamicParams === false) config.dynamicParamsConfig = false;
67
71
  else if (segment.dynamicParams === true && config.dynamicParamsConfig !== false) config.dynamicParamsConfig = true;
@@ -72,7 +76,7 @@ function resolveAppPageSegmentConfig(options) {
72
76
  if (fetchCache === "force-no-store") hasForceNoStore = true;
73
77
  if (fetchCache === "only-cache") hasOnlyCache = true;
74
78
  if (fetchCache === "only-no-store") hasOnlyNoStore = true;
75
- if ((hasForceCache || hasOnlyCache) && (hasForceNoStore || hasOnlyNoStore)) throw new Error(describeFetchCacheConflict(fetchCache));
79
+ if (hasForceCache && hasForceNoStore || !hasForceCache && !hasForceNoStore && hasOnlyCache && hasOnlyNoStore) throw new Error(describeFetchCacheConflict(fetchCache));
76
80
  if (fetchCache === "default-no-store") hasParentDefaultNoStore = true;
77
81
  if (hasForceCache) config.fetchCache = "force-cache";
78
82
  else if (hasForceNoStore) config.fetchCache = "force-no-store";
@@ -82,6 +86,32 @@ function resolveAppPageSegmentConfig(options) {
82
86
  }
83
87
  config.revalidateSeconds = resolveRevalidateSeconds(config.revalidateSeconds, segment.revalidate);
84
88
  }
89
+ for (const segment of options.parallelSegments ?? []) {
90
+ if (!segment) continue;
91
+ if (segment.dynamic === "force-dynamic") {
92
+ hasForceDynamic = true;
93
+ config.dynamicConfig = "force-dynamic";
94
+ } else if (config.dynamicConfig === void 0 && isRouteSegmentDynamic(segment.dynamic)) config.dynamicConfig = segment.dynamic;
95
+ if (segment.dynamicParams === false) config.dynamicParamsConfig = false;
96
+ else if (segment.dynamicParams === true && config.dynamicParamsConfig === void 0) config.dynamicParamsConfig = true;
97
+ if (config.runtime === void 0 && isRouteSegmentRuntime(segment.runtime)) config.runtime = segment.runtime;
98
+ if (isRouteSegmentFetchCache(segment.fetchCache)) {
99
+ const fetchCache = segment.fetchCache;
100
+ if (hasParentDefaultNoStore && (fetchCache === "auto" || isCacheFetchCacheMode(fetchCache))) throw new Error(describeFetchCacheConflict(fetchCache));
101
+ if (fetchCache === "force-cache") hasForceCache = true;
102
+ if (fetchCache === "force-no-store") hasForceNoStore = true;
103
+ if (fetchCache === "only-cache") hasOnlyCache = true;
104
+ if (fetchCache === "only-no-store") hasOnlyNoStore = true;
105
+ if (hasForceCache && hasForceNoStore || !hasForceCache && !hasForceNoStore && hasOnlyCache && hasOnlyNoStore) throw new Error(describeFetchCacheConflict(fetchCache));
106
+ if (fetchCache === "default-no-store") hasParentDefaultNoStore = true;
107
+ if (hasForceCache) config.fetchCache = "force-cache";
108
+ else if (hasForceNoStore) config.fetchCache = "force-no-store";
109
+ else if (hasOnlyCache) config.fetchCache = "only-cache";
110
+ else if (hasOnlyNoStore) config.fetchCache = "only-no-store";
111
+ else if (config.fetchCache === void 0) config.fetchCache = fetchCache;
112
+ }
113
+ config.revalidateSeconds = resolveRevalidateSeconds(config.revalidateSeconds, segment.revalidate);
114
+ }
85
115
  for (const segment of [options.page, ...options.parallelPages ?? []]) {
86
116
  if (!segment) continue;
87
117
  config.dynamicStaleTimeSeconds = resolveDynamicStaleTimeSeconds(config.dynamicStaleTimeSeconds, segment.unstable_dynamicStaleTime);
@@ -76,6 +76,7 @@ type AppServerActionMatch<TRoute extends AppServerActionRoute> = {
76
76
  };
77
77
  type AppServerActionIntercept<TPage = unknown> = {
78
78
  matchedParams: AppPageParams;
79
+ sourceMatchedParams?: AppPageParams;
79
80
  page: TPage;
80
81
  slotId?: string | null;
81
82
  slotKey: string;
@@ -91,6 +92,8 @@ type BuildServerActionPageElementOptions<TRoute extends AppServerActionRoute, TI
91
92
  route: TRoute;
92
93
  searchParams: URLSearchParams;
93
94
  renderMode: AppRscRenderMode;
95
+ observeMetadataSearchParamsAccess?: boolean;
96
+ observePageSearchParamsAccess?: boolean;
94
97
  };
95
98
  type AppServerActionRscModel<TElement> = {
96
99
  /**
@@ -148,6 +151,7 @@ type HandleServerActionRscRequestOptions<TElement, TRoute extends AppServerActio
148
151
  createRscOnErrorHandler: (request: Request, pathname: string, pattern: string) => (error: unknown) => unknown;
149
152
  createTemporaryReferenceSet: () => TTemporaryReferences;
150
153
  decodeReply: (body: string | FormData, options: DecodeServerActionReplyOptions<TTemporaryReferences>) => Promise<unknown[]> | unknown[];
154
+ draftModeSecret: string;
151
155
  /**
152
156
  * Hydrate a route's lazy page/route-handler modules before reading
153
157
  * `route.page` / `route.routeHandler` on action redirect targets and
@@ -5,7 +5,7 @@ import { isExternalUrl } from "../config/config-matchers.js";
5
5
  import { internalServerErrorResponse, payloadTooLargeResponse } from "./http-error-responses.js";
6
6
  import { validateCsrfOrigin, validateServerActionPayload } from "./request-pipeline.js";
7
7
  import { APP_RSC_RENDER_MODE_ACTION_RERENDER_PRESERVE_UI } from "./app-rsc-render-mode.js";
8
- import { headersContextFromRequest, setHeadersContext } from "../shims/headers.js";
8
+ import { headersContextFromRequest, isDraftModeRequest, setHeadersContext } from "../shims/headers.js";
9
9
  import { getAndClearActionRevalidationKind } from "../shims/cache-request-state.js";
10
10
  import { setCurrentFetchCacheMode, setCurrentFetchSoftTags, setCurrentForceDynamicFetchDefault } from "../shims/fetch-cache.js";
11
11
  import { readStreamAsTextWithLimit } from "../utils/text-stream.js";
@@ -20,7 +20,18 @@ import { buildAppPageTags } from "./implicit-tags.js";
20
20
  import { resolveAppPageNavigationParams } from "./app-page-element-builder.js";
21
21
  import { resolveAppPageActionRerenderTarget } from "./app-page-request.js";
22
22
  import { getSetCookieName } from "./cookie-utils.js";
23
+ import { createStaticGenerationHeadersContext } from "./app-static-generation.js";
23
24
  //#region src/server/app-server-action-execution.ts
25
+ function prepareActionPageRerenderContext(options) {
26
+ if (options.dynamicConfig === "force-static" || options.dynamicConfig === "error") setHeadersContext(createStaticGenerationHeadersContext({
27
+ draftModeEnabled: isDraftModeRequest(options.request, options.draftModeSecret),
28
+ draftModeSecret: options.draftModeSecret,
29
+ dynamicConfig: options.dynamicConfig,
30
+ routeKind: "page",
31
+ routePattern: options.routePattern
32
+ }));
33
+ return options.dynamicConfig === "force-static" ? new URLSearchParams() : options.searchParams;
34
+ }
24
35
  /**
25
36
  * Matches Next.js' server action argument cap to prevent stack overflow in
26
37
  * Function.prototype.apply when decoding hostile action payloads.
@@ -377,7 +388,7 @@ async function handleProgressiveServerActionRequest(options) {
377
388
  options.setHeadersAccessPhase(previousHeadersPhase);
378
389
  }
379
390
  if (!actionRedirect) {
380
- const actionPendingCookies = options.getAndClearPendingCookies();
391
+ const actionPendingCookies = dedupePendingCookies(options.getAndClearPendingCookies());
381
392
  const actionDraftCookie = options.getDraftModeCookieHeader();
382
393
  const revalidationKind = resolveActionRevalidationKind(actionPendingCookies.length > 0 || Boolean(actionDraftCookie));
383
394
  if (actionFailed) return {
@@ -623,14 +634,22 @@ async function handleServerActionRscRequest(options) {
623
634
  url: redirectTarget
624
635
  });
625
636
  setHeadersContext(headersContextFromRequest(redirectRenderRequest));
637
+ const redirectDynamicConfig = options.resolveRouteDynamicConfig?.(targetMatch.route);
638
+ const redirectSearchParams = prepareActionPageRerenderContext({
639
+ draftModeSecret: options.draftModeSecret,
640
+ dynamicConfig: redirectDynamicConfig,
641
+ request: redirectRenderRequest,
642
+ routePattern: targetMatch.route.pattern,
643
+ searchParams: redirectTarget.searchParams
644
+ });
626
645
  const redirectNavigationParams = resolveAppPageNavigationParams(targetMatch.route, targetMatch.params, targetPathname, null);
627
646
  options.setNavigationContext({
628
647
  pathname: targetPathname,
629
- searchParams: redirectTarget.searchParams,
648
+ searchParams: redirectSearchParams,
630
649
  params: redirectNavigationParams
631
650
  });
632
651
  setCurrentFetchCacheMode(options.resolveRouteFetchCacheMode?.(targetMatch.route) ?? null);
633
- setCurrentForceDynamicFetchDefault(options.resolveRouteDynamicConfig?.(targetMatch.route) === "force-dynamic");
652
+ setCurrentForceDynamicFetchDefault(redirectDynamicConfig === "force-dynamic");
634
653
  setCurrentFetchSoftTags(buildServerActionPageTags(targetMatch.route, targetPathname));
635
654
  const element = options.buildPageElement({
636
655
  cleanPathname: targetPathname,
@@ -640,8 +659,10 @@ async function handleServerActionRscRequest(options) {
640
659
  params: targetMatch.params,
641
660
  request: redirectRenderRequest,
642
661
  route: targetMatch.route,
643
- searchParams: redirectTarget.searchParams,
644
- renderMode: APP_RSC_RENDER_MODE_ACTION_RERENDER_PRESERVE_UI
662
+ searchParams: redirectSearchParams,
663
+ renderMode: APP_RSC_RENDER_MODE_ACTION_RERENDER_PRESERVE_UI,
664
+ observeMetadataSearchParamsAccess: redirectDynamicConfig !== "force-static",
665
+ observePageSearchParamsAccess: redirectDynamicConfig !== "force-static"
645
666
  });
646
667
  const onRenderError = options.createRscOnErrorHandler(redirectRenderRequest, targetPathname, targetMatch.route.pattern);
647
668
  return createServerActionRscResponse(await options.renderToReadableStream({
@@ -702,14 +723,22 @@ async function handleServerActionRscRequest(options) {
702
723
  toInterceptOpts: options.toInterceptOpts
703
724
  });
704
725
  const resolvedActionNavigationParams = resolveAppPageNavigationParams(actionRerenderTarget.route, actionRerenderTarget.navigationParams, options.cleanPathname, actionRerenderTarget.interceptOpts);
726
+ await options.ensureRouteLoaded?.(actionRerenderTarget.route);
727
+ const actionRerenderDynamicConfig = options.resolveRouteDynamicConfig?.(actionRerenderTarget.route);
728
+ const actionRerenderSearchParams = prepareActionPageRerenderContext({
729
+ draftModeSecret: options.draftModeSecret,
730
+ dynamicConfig: actionRerenderDynamicConfig,
731
+ request: options.request,
732
+ routePattern: actionRerenderTarget.route.pattern,
733
+ searchParams: options.searchParams
734
+ });
705
735
  options.setNavigationContext({
706
736
  pathname: options.cleanPathname,
707
- searchParams: options.searchParams,
737
+ searchParams: actionRerenderSearchParams,
708
738
  params: resolvedActionNavigationParams
709
739
  });
710
- await options.ensureRouteLoaded?.(actionRerenderTarget.route);
711
740
  setCurrentFetchCacheMode(options.resolveRouteFetchCacheMode?.(actionRerenderTarget.route) ?? null);
712
- setCurrentForceDynamicFetchDefault(options.resolveRouteDynamicConfig?.(actionRerenderTarget.route) === "force-dynamic");
741
+ setCurrentForceDynamicFetchDefault(actionRerenderDynamicConfig === "force-dynamic");
713
742
  setCurrentFetchSoftTags(buildServerActionPageTags(actionRerenderTarget.route, options.cleanPathname));
714
743
  element = options.buildPageElement({
715
744
  cleanPathname: options.cleanPathname,
@@ -719,8 +748,10 @@ async function handleServerActionRscRequest(options) {
719
748
  params: actionRerenderTarget.params,
720
749
  request: options.request,
721
750
  route: actionRerenderTarget.route,
722
- searchParams: options.searchParams,
723
- renderMode: APP_RSC_RENDER_MODE_ACTION_RERENDER_PRESERVE_UI
751
+ searchParams: actionRerenderSearchParams,
752
+ renderMode: APP_RSC_RENDER_MODE_ACTION_RERENDER_PRESERVE_UI,
753
+ observeMetadataSearchParamsAccess: actionRerenderDynamicConfig !== "force-static",
754
+ observePageSearchParamsAccess: actionRerenderDynamicConfig !== "force-static"
724
755
  });
725
756
  errorPattern = actionRerenderTarget.route.pattern;
726
757
  } else {
@@ -18,7 +18,7 @@ import { createSsrErrorMetaRenderer } from "./app-ssr-error-meta.js";
18
18
  import { createNavigationRuntimeRscMetadataScript, createRscEmbedTransform, createTickBufferedTransform } from "./app-ssr-stream.js";
19
19
  import { BeforeInteractiveContext } from "../shims/before-interactive-context.js";
20
20
  import { runWithRootParamsScope } from "../shims/root-params.js";
21
- import { createBfcacheSegmentStateKeyMap, createInitialBfcacheIdMap } from "./app-bfcache-identity.js";
21
+ import { createInitialBfcacheMaps } from "./app-bfcache-identity.js";
22
22
  import { RSC_FORM_STATE_GLOBAL } from "./app-browser-hydration.js";
23
23
  import { createClientReferencePreloader } from "./app-client-reference-preloader.js";
24
24
  import { deferUntilStreamConsumed } from "./defer-until-stream-consumed.js";
@@ -52,7 +52,10 @@ async function loadStaticPrerender() {
52
52
  const [{ createRequire }, path] = await Promise.all([import("node:module"), import("node:path")]);
53
53
  const reactDomPackageJson = createRequire(import.meta.url).resolve("react-dom/package.json");
54
54
  const reactDomDir = path.dirname(reactDomPackageJson);
55
- const devRenderer = await import(path.join(reactDomDir, "cjs/react-dom-server.edge.development.js"));
55
+ const devRenderer = await import(
56
+ /* @vite-ignore */
57
+ path.join(reactDomDir, "cjs/react-dom-server.edge.development.js")
58
+ );
56
59
  if (isStaticPrerenderModule(devRenderer)) return devRenderer.prerender;
57
60
  const devRendererDefault = typeof devRenderer === "object" && devRenderer !== null && "default" in devRenderer && devRenderer.default;
58
61
  if (isStaticPrerenderModule(devRendererDefault)) return devRendererDefault.prerender;
@@ -186,12 +189,14 @@ async function handleSsr(rscStream, navContext, fontData, options) {
186
189
  const wireElements = use(flightRoot);
187
190
  const elements = AppElementsWire.decode(wireElements);
188
191
  const metadata = AppElementsWire.readMetadata(elements);
189
- const routeTree = createElement(ElementsContext.Provider, { value: elements }, createElement(Slot, { id: metadata.routeId }));
190
- const stateKeyTree = createElement(BfcacheStateKeyMapContext.Provider, { value: createBfcacheSegmentStateKeyMap({
192
+ const bfcacheMaps = createInitialBfcacheMaps({
191
193
  elements,
194
+ metadata,
192
195
  pathname: ssrNavigationContext.pathname
193
- }) }, routeTree);
194
- return BfcacheIdMapContext ? createElement(BfcacheIdMapContext.Provider, { value: createInitialBfcacheIdMap(elements) }, stateKeyTree) : stateKeyTree;
196
+ });
197
+ const routeTree = createElement(ElementsContext.Provider, { value: elements }, createElement(Slot, { id: metadata.routeId }));
198
+ const stateKeyTree = createElement(BfcacheStateKeyMapContext.Provider, { value: bfcacheMaps.stateKeys }, routeTree);
199
+ return BfcacheIdMapContext ? createElement(BfcacheIdMapContext.Provider, { value: bfcacheMaps.bfcacheIds }, stateKeyTree) : stateKeyTree;
195
200
  }
196
201
  const flightRootElement = createElement(VinextFlightRoot);
197
202
  const root = AppRouterContext ? createElement(AppRouterContext.Provider, { value: ssrAppRouterInstance }, flightRootElement) : flightRootElement;
@@ -3,6 +3,7 @@ import { HeadersContext } from "../shims/headers.js";
3
3
  //#region src/server/app-static-generation.d.ts
4
4
  type AppStaticGenerationRouteKind = "page" | "route";
5
5
  type CreateStaticGenerationHeadersContextOptions = {
6
+ draftModeEnabled?: boolean;
6
7
  draftModeSecret?: string;
7
8
  dynamicConfig?: string;
8
9
  routeKind: AppStaticGenerationRouteKind;
@@ -9,6 +9,7 @@ function createStaticGenerationHeadersContext(options) {
9
9
  const context = {
10
10
  headers: new Headers(),
11
11
  cookies: /* @__PURE__ */ new Map(),
12
+ draftModeEnabled: options.draftModeEnabled,
12
13
  draftModeSecret: options.draftModeSecret
13
14
  };
14
15
  if (options.dynamicConfig === "force-static") context.forceStatic = true;
@@ -97,6 +97,8 @@ declare const NEXT_ROUTER_STATE_TREE_HEADER = "Next-Router-State-Tree";
97
97
  declare const NEXT_ROUTER_PREFETCH_HEADER = "Next-Router-Prefetch";
98
98
  declare const NEXT_ROUTER_SEGMENT_PREFETCH_HEADER = "Next-Router-Segment-Prefetch";
99
99
  declare const NEXT_URL_HEADER = "Next-Url";
100
+ declare const NEXT_REQUEST_ID_HEADER = "x-nextjs-request-id";
101
+ declare const NEXT_HTML_REQUEST_ID_HEADER = "x-nextjs-html-request-id";
100
102
  /** Lowercase flight header variants used in middleware forwarding. */
101
103
  declare const FLIGHT_HEADERS: readonly string[];
102
104
  /**
@@ -111,4 +113,4 @@ declare const INTERNAL_HEADERS: string[];
111
113
  /** Vinext-only internal headers stripped alongside Next.js protocol internals. */
112
114
  declare const VINEXT_INTERNAL_HEADERS: string[];
113
115
  //#endregion
114
- export { ACTION_FORWARDED_HEADER, ACTION_REDIRECT_HEADER, ACTION_REDIRECT_STATUS_HEADER, ACTION_REDIRECT_TYPE_HEADER, ACTION_REVALIDATED_HEADER, FLIGHT_HEADERS, INTERNAL_HEADERS, MIDDLEWARE_HEADER_PREFIX, MIDDLEWARE_NEXT_HEADER, MIDDLEWARE_OVERRIDE_HEADERS, MIDDLEWARE_REQUEST_HEADER_PREFIX, MIDDLEWARE_REWRITE_HEADER, MIDDLEWARE_SET_COOKIE_HEADER, NEXTJS_ACTION_NOT_FOUND_HEADER, NEXTJS_CACHE_HEADER, NEXTJS_DEPLOYMENT_ID_HEADER, NEXT_ACTION_HEADER, NEXT_ROUTER_PREFETCH_HEADER, NEXT_ROUTER_SEGMENT_PREFETCH_HEADER, NEXT_ROUTER_STATE_TREE_HEADER, NEXT_URL_HEADER, RSC_ACTION_HEADER, RSC_HEADER, VINEXT_CACHE_HEADER, VINEXT_CLIENT_REUSE_MANIFEST_HEADER, VINEXT_DYNAMIC_STALE_TIME_HEADER, VINEXT_INTERCEPTION_CONTEXT_HEADER, VINEXT_INTERNAL_HEADERS, VINEXT_MOUNTED_SLOTS_HEADER, VINEXT_MW_CTX_HEADER, VINEXT_PARAMS_HEADER, VINEXT_PRERENDER_PAGES_STATIC_PATHS_PATH, VINEXT_PRERENDER_ROUTE_PARAMS_HEADER, VINEXT_PRERENDER_SECRET_HEADER, VINEXT_PRERENDER_STATIC_PARAMS_PATH, VINEXT_REVALIDATE_HEADER, VINEXT_RSC_MARKER_HEADER, VINEXT_RSC_REDIRECT_HEADER, VINEXT_RSC_RENDER_MODE_HEADER, VINEXT_STATIC_FILE_HEADER, VINEXT_TIMING_HEADER };
116
+ export { ACTION_FORWARDED_HEADER, ACTION_REDIRECT_HEADER, ACTION_REDIRECT_STATUS_HEADER, ACTION_REDIRECT_TYPE_HEADER, ACTION_REVALIDATED_HEADER, FLIGHT_HEADERS, INTERNAL_HEADERS, MIDDLEWARE_HEADER_PREFIX, MIDDLEWARE_NEXT_HEADER, MIDDLEWARE_OVERRIDE_HEADERS, MIDDLEWARE_REQUEST_HEADER_PREFIX, MIDDLEWARE_REWRITE_HEADER, MIDDLEWARE_SET_COOKIE_HEADER, NEXTJS_ACTION_NOT_FOUND_HEADER, NEXTJS_CACHE_HEADER, NEXTJS_DEPLOYMENT_ID_HEADER, NEXT_ACTION_HEADER, NEXT_HTML_REQUEST_ID_HEADER, NEXT_REQUEST_ID_HEADER, NEXT_ROUTER_PREFETCH_HEADER, NEXT_ROUTER_SEGMENT_PREFETCH_HEADER, NEXT_ROUTER_STATE_TREE_HEADER, NEXT_URL_HEADER, RSC_ACTION_HEADER, RSC_HEADER, VINEXT_CACHE_HEADER, VINEXT_CLIENT_REUSE_MANIFEST_HEADER, VINEXT_DYNAMIC_STALE_TIME_HEADER, VINEXT_INTERCEPTION_CONTEXT_HEADER, VINEXT_INTERNAL_HEADERS, VINEXT_MOUNTED_SLOTS_HEADER, VINEXT_MW_CTX_HEADER, VINEXT_PARAMS_HEADER, VINEXT_PRERENDER_PAGES_STATIC_PATHS_PATH, VINEXT_PRERENDER_ROUTE_PARAMS_HEADER, VINEXT_PRERENDER_SECRET_HEADER, VINEXT_PRERENDER_STATIC_PARAMS_PATH, VINEXT_REVALIDATE_HEADER, VINEXT_RSC_MARKER_HEADER, VINEXT_RSC_REDIRECT_HEADER, VINEXT_RSC_RENDER_MODE_HEADER, VINEXT_STATIC_FILE_HEADER, VINEXT_TIMING_HEADER };
@@ -101,6 +101,8 @@ const NEXT_ROUTER_STATE_TREE_HEADER = "Next-Router-State-Tree";
101
101
  const NEXT_ROUTER_PREFETCH_HEADER = "Next-Router-Prefetch";
102
102
  const NEXT_ROUTER_SEGMENT_PREFETCH_HEADER = "Next-Router-Segment-Prefetch";
103
103
  const NEXT_URL_HEADER = "Next-Url";
104
+ const NEXT_REQUEST_ID_HEADER = "x-nextjs-request-id";
105
+ const NEXT_HTML_REQUEST_ID_HEADER = "x-nextjs-html-request-id";
104
106
  /** Lowercase flight header variants used in middleware forwarding. */
105
107
  const FLIGHT_HEADERS = [
106
108
  "rsc",
@@ -133,4 +135,4 @@ const INTERNAL_HEADERS = [
133
135
  /** Vinext-only internal headers stripped alongside Next.js protocol internals. */
134
136
  const VINEXT_INTERNAL_HEADERS = [VINEXT_PRERENDER_ROUTE_PARAMS_HEADER];
135
137
  //#endregion
136
- export { ACTION_FORWARDED_HEADER, ACTION_REDIRECT_HEADER, ACTION_REDIRECT_STATUS_HEADER, ACTION_REDIRECT_TYPE_HEADER, ACTION_REVALIDATED_HEADER, FLIGHT_HEADERS, INTERNAL_HEADERS, MIDDLEWARE_HEADER_PREFIX, MIDDLEWARE_NEXT_HEADER, MIDDLEWARE_OVERRIDE_HEADERS, MIDDLEWARE_REQUEST_HEADER_PREFIX, MIDDLEWARE_REWRITE_HEADER, MIDDLEWARE_SET_COOKIE_HEADER, NEXTJS_ACTION_NOT_FOUND_HEADER, NEXTJS_CACHE_HEADER, NEXTJS_DEPLOYMENT_ID_HEADER, NEXT_ACTION_HEADER, NEXT_ROUTER_PREFETCH_HEADER, NEXT_ROUTER_SEGMENT_PREFETCH_HEADER, NEXT_ROUTER_STATE_TREE_HEADER, NEXT_URL_HEADER, RSC_ACTION_HEADER, RSC_HEADER, VINEXT_CACHE_HEADER, VINEXT_CLIENT_REUSE_MANIFEST_HEADER, VINEXT_DYNAMIC_STALE_TIME_HEADER, VINEXT_INTERCEPTION_CONTEXT_HEADER, VINEXT_INTERNAL_HEADERS, VINEXT_MOUNTED_SLOTS_HEADER, VINEXT_MW_CTX_HEADER, VINEXT_PARAMS_HEADER, VINEXT_PRERENDER_PAGES_STATIC_PATHS_PATH, VINEXT_PRERENDER_ROUTE_PARAMS_HEADER, VINEXT_PRERENDER_SECRET_HEADER, VINEXT_PRERENDER_STATIC_PARAMS_PATH, VINEXT_REVALIDATE_HEADER, VINEXT_RSC_MARKER_HEADER, VINEXT_RSC_REDIRECT_HEADER, VINEXT_RSC_RENDER_MODE_HEADER, VINEXT_STATIC_FILE_HEADER, VINEXT_TIMING_HEADER };
138
+ export { ACTION_FORWARDED_HEADER, ACTION_REDIRECT_HEADER, ACTION_REDIRECT_STATUS_HEADER, ACTION_REDIRECT_TYPE_HEADER, ACTION_REVALIDATED_HEADER, FLIGHT_HEADERS, INTERNAL_HEADERS, MIDDLEWARE_HEADER_PREFIX, MIDDLEWARE_NEXT_HEADER, MIDDLEWARE_OVERRIDE_HEADERS, MIDDLEWARE_REQUEST_HEADER_PREFIX, MIDDLEWARE_REWRITE_HEADER, MIDDLEWARE_SET_COOKIE_HEADER, NEXTJS_ACTION_NOT_FOUND_HEADER, NEXTJS_CACHE_HEADER, NEXTJS_DEPLOYMENT_ID_HEADER, NEXT_ACTION_HEADER, NEXT_HTML_REQUEST_ID_HEADER, NEXT_REQUEST_ID_HEADER, NEXT_ROUTER_PREFETCH_HEADER, NEXT_ROUTER_SEGMENT_PREFETCH_HEADER, NEXT_ROUTER_STATE_TREE_HEADER, NEXT_URL_HEADER, RSC_ACTION_HEADER, RSC_HEADER, VINEXT_CACHE_HEADER, VINEXT_CLIENT_REUSE_MANIFEST_HEADER, VINEXT_DYNAMIC_STALE_TIME_HEADER, VINEXT_INTERCEPTION_CONTEXT_HEADER, VINEXT_INTERNAL_HEADERS, VINEXT_MOUNTED_SLOTS_HEADER, VINEXT_MW_CTX_HEADER, VINEXT_PARAMS_HEADER, VINEXT_PRERENDER_PAGES_STATIC_PATHS_PATH, VINEXT_PRERENDER_ROUTE_PARAMS_HEADER, VINEXT_PRERENDER_SECRET_HEADER, VINEXT_PRERENDER_STATIC_PARAMS_PATH, VINEXT_REVALIDATE_HEADER, VINEXT_RSC_MARKER_HEADER, VINEXT_RSC_REDIRECT_HEADER, VINEXT_RSC_RENDER_MODE_HEADER, VINEXT_STATIC_FILE_HEADER, VINEXT_TIMING_HEADER };
@@ -13,4 +13,4 @@ type MetadataRouteRequestOptions = {
13
13
  };
14
14
  declare function handleMetadataRouteRequest(options: MetadataRouteRequestOptions): Promise<Response | null>;
15
15
  //#endregion
16
- export { MetadataRouteMakeThenableParams, MetadataRuntimeRoute, handleMetadataRouteRequest };
16
+ export { MetadataRuntimeRoute, handleMetadataRouteRequest };
@@ -819,13 +819,12 @@ async function startAppRouterServer(options) {
819
819
  return;
820
820
  }
821
821
  }
822
+ let missingBuildAsset = false;
822
823
  {
823
824
  const assetLookupPath = resolveAppRouterAssetPath(pathname, appAssetPathPrefix, appRouterAssetPrefix);
824
825
  if (assetLookupPath) {
825
826
  if (await tryServeStatic(req, res, clientDir, assetLookupPath, compress, staticCache)) return;
826
- res.writeHead(404, { "Content-Type": "text/plain; charset=utf-8" });
827
- res.end("Not Found");
828
- return;
827
+ missingBuildAsset = true;
829
828
  }
830
829
  }
831
830
  if (isImageOptimizationPath(pathname)) {
@@ -868,6 +867,12 @@ async function startAppRouterServer(options) {
868
867
  await sendWebResponse(notFoundResponse({ headers: toWebHeaders(staticResponseHeaders) }), req, res, compress);
869
868
  return;
870
869
  }
870
+ if (missingBuildAsset && response.status === 404) {
871
+ cancelResponseBody(response);
872
+ res.writeHead(404, { "Content-Type": "text/plain; charset=utf-8" });
873
+ res.end("Not Found");
874
+ return;
875
+ }
871
876
  await sendWebResponse(response, req, res, compress);
872
877
  } catch (e) {
873
878
  console.error("[vinext] Server error:", e);
@@ -1000,11 +1005,9 @@ async function startPagesRouterServer(options) {
1000
1005
  }
1001
1006
  const staticLookupPath = stripBasePath(pathname, basePath);
1002
1007
  const pagesAssetLookup = resolveAppRouterAssetPath(pathname, pagesAssetPathPrefix, assetPrefix);
1008
+ const missingBuildAsset = pagesAssetLookup !== null;
1003
1009
  if (pagesAssetLookup) {
1004
1010
  if (await tryServeStatic(req, res, clientDir, pagesAssetLookup, compress, staticCache)) return;
1005
- res.writeHead(404, { "Content-Type": "text/plain; charset=utf-8" });
1006
- res.end("Not Found");
1007
- return;
1008
1011
  }
1009
1012
  if (isImageOptimizationPath(pathname) || isImageOptimizationPath(staticLookupPath)) {
1010
1013
  const params = parseImageParams(new URL(rawUrl, "http://localhost"), allowedImageWidths, pagesImageConfig?.qualities);
@@ -1089,6 +1092,12 @@ async function startPagesRouterServer(options) {
1089
1092
  if (result.type === "handled") return;
1090
1093
  if (result.type === "response") {
1091
1094
  const { response } = result;
1095
+ if (missingBuildAsset && response.status === 404) {
1096
+ cancelResponseBody(response);
1097
+ res.writeHead(404, { "Content-Type": "text/plain; charset=utf-8" });
1098
+ res.end("Not Found");
1099
+ return;
1100
+ }
1092
1101
  if (isVinextStreamedHtmlResponse(response) || !response.body || result.defaultContentType === void 0) {
1093
1102
  await sendWebResponse(response, req, res, compress);
1094
1103
  return;
@@ -1,7 +1,8 @@
1
1
  //#region src/server/worker-utils.d.ts
2
+ declare function finalizeMissingStaticAssetResponse(response: Response, missingBuildAsset: boolean): Response;
2
3
  declare function mergeHeaders(response: Response, extraHeaders: Record<string, string | string[]>, statusOverride?: number): Response;
3
4
  declare function resolveStaticAssetSignal(signalResponse: Response, options: {
4
5
  fetchAsset(path: string): Promise<Response>;
5
6
  }): Promise<Response | null>;
6
7
  //#endregion
7
- export { mergeHeaders, resolveStaticAssetSignal };
8
+ export { finalizeMissingStaticAssetResponse, mergeHeaders, resolveStaticAssetSignal };
@@ -1,4 +1,5 @@
1
1
  import { VINEXT_STATIC_FILE_HEADER } from "./headers.js";
2
+ import { notFoundStaticAssetResponse } from "./http-error-responses.js";
2
3
  //#region src/server/worker-utils.ts
3
4
  /**
4
5
  * Shared utilities for Cloudflare Worker entries.
@@ -29,6 +30,11 @@ function cancelResponseBody(response) {
29
30
  if (!body || body.locked) return;
30
31
  body.cancel().catch(() => {});
31
32
  }
33
+ function finalizeMissingStaticAssetResponse(response, missingBuildAsset) {
34
+ if (!missingBuildAsset || response.status !== 404) return response;
35
+ cancelResponseBody(response);
36
+ return notFoundStaticAssetResponse();
37
+ }
32
38
  function buildHeaderRecord(response, omitNames = []) {
33
39
  const omitted = new Set(omitNames.map((name) => name.toLowerCase()));
34
40
  const headers = {};
@@ -96,4 +102,4 @@ async function resolveStaticAssetSignal(signalResponse, options) {
96
102
  return mergeHeaders(assetResponse, extraHeaders, assetResponse.ok && signalResponse.status !== 200 ? signalResponse.status : void 0);
97
103
  }
98
104
  //#endregion
99
- export { mergeHeaders, resolveStaticAssetSignal };
105
+ export { finalizeMissingStaticAssetResponse, mergeHeaders, resolveStaticAssetSignal };
@@ -127,7 +127,7 @@ function dynamic(dynamicInput, options) {
127
127
  const preloadModuleIds = loadableGenerated?.modules ?? modules;
128
128
  if (!ssr) {
129
129
  if (isServer) {
130
- const SSRFalse = (_props) => LoadingComponent ? React.createElement(LoadingComponent, createDynamicLoadingProps({ pastDelay: false })) : null;
130
+ const SSRFalse = (_props) => LoadingComponent ? React.createElement(LoadingComponent, createDynamicLoadingProps()) : null;
131
131
  SSRFalse.displayName = "DynamicSSRFalse";
132
132
  return SSRFalse;
133
133
  }
@@ -9,6 +9,24 @@ type ErrorBoundaryProps = {
9
9
  children: React.ReactNode;
10
10
  resetKey?: string | null;
11
11
  };
12
+ type SerializedBoundaryError = {
13
+ digest?: string;
14
+ message: string;
15
+ name?: string;
16
+ stack?: string;
17
+ };
18
+ declare function SerializedErrorBoundary({
19
+ fallback: Fallback,
20
+ error
21
+ }: {
22
+ fallback: React.ComponentType<{
23
+ error: Error & {
24
+ digest?: string;
25
+ };
26
+ reset: () => void;
27
+ }>;
28
+ error: SerializedBoundaryError;
29
+ }): React.JSX.Element;
12
30
  type CapturedError = {
13
31
  thrownValue: unknown;
14
32
  };
@@ -152,4 +170,4 @@ declare class DevRecoveryBoundary extends React.Component<DevRecoveryBoundaryPro
152
170
  render(): React.ReactNode;
153
171
  }
154
172
  //#endregion
155
- export { DevRecoveryBoundary, DevRecoveryBoundaryProps, ErrorBoundary, ErrorBoundaryInner, ErrorBoundaryProps, ErrorBoundaryState, ForbiddenBoundary, ForbiddenBoundaryInner, GlobalErrorBoundary, NotFoundBoundary, RedirectBoundary, RedirectErrorBoundary, UnauthorizedBoundary, UnauthorizedBoundaryInner };
173
+ export { DevRecoveryBoundary, DevRecoveryBoundaryProps, ErrorBoundary, ErrorBoundaryInner, ErrorBoundaryProps, ErrorBoundaryState, ForbiddenBoundary, ForbiddenBoundaryInner, GlobalErrorBoundary, NotFoundBoundary, RedirectBoundary, RedirectErrorBoundary, SerializedBoundaryError, SerializedErrorBoundary, UnauthorizedBoundary, UnauthorizedBoundaryInner };
@@ -9,6 +9,16 @@ import { isNavigationSignalError } from "../utils/navigation-signal.js";
9
9
  import React from "react";
10
10
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
11
11
  //#region src/shims/error-boundary.tsx
12
+ function SerializedErrorBoundary({ fallback: Fallback, error }) {
13
+ return /* @__PURE__ */ jsx(Fallback, {
14
+ error: Object.assign(new Error(error.message), {
15
+ digest: error.digest,
16
+ name: error.name ?? "Error",
17
+ stack: error.stack
18
+ }),
19
+ reset: () => globalThis.location?.reload()
20
+ });
21
+ }
12
22
  function normalizeBoundaryResetKey(resetKey) {
13
23
  return resetKey === void 0 || resetKey === null || resetKey === "" ? null : resetKey;
14
24
  }
@@ -339,4 +349,4 @@ var DevRecoveryBoundary = class extends React.Component {
339
349
  }
340
350
  };
341
351
  //#endregion
342
- export { DevRecoveryBoundary, ErrorBoundary, ErrorBoundaryInner, ForbiddenBoundary, ForbiddenBoundaryInner, GlobalErrorBoundary, NotFoundBoundary, RedirectBoundary, RedirectErrorBoundary, UnauthorizedBoundary, UnauthorizedBoundaryInner };
352
+ export { DevRecoveryBoundary, ErrorBoundary, ErrorBoundaryInner, ForbiddenBoundary, ForbiddenBoundaryInner, GlobalErrorBoundary, NotFoundBoundary, RedirectBoundary, RedirectErrorBoundary, SerializedErrorBoundary, UnauthorizedBoundary, UnauthorizedBoundaryInner };
@@ -5,6 +5,7 @@ type HeadersContext = {
5
5
  headers: Headers;
6
6
  cookies: Map<string, string>;
7
7
  accessError?: Error;
8
+ draftModeEnabled?: boolean;
8
9
  forceStatic?: boolean;
9
10
  mutableCookies?: RequestCookies;
10
11
  readonlyCookies?: RequestCookies;
@@ -47,6 +48,7 @@ type ConnectionProbeResult<T> = {
47
48
  */
48
49
  declare function markDynamicUsage(): void;
49
50
  declare function markRenderRequestApiUsage(kind: RenderRequestApiKind): void;
51
+ declare function throwIfStaticGenerationAccessError(): void;
50
52
  declare function runWithConnectionProbe<T>(fn: () => T | Promise<T>): Promise<ConnectionProbeResult<T>>;
51
53
  declare function suspendConnectionProbe(): Promise<never> | null;
52
54
  declare function peekRenderRequestApiUsage(): RenderRequestApiKind[];
@@ -250,4 +252,4 @@ declare class RequestCookies {
250
252
  toString(): string;
251
253
  }
252
254
  //#endregion
253
- export { HeadersAccessPhase, HeadersContext, type RequestCookies, VinextHeadersShimState, applyMiddlewareRequestHeaders, consumeDynamicUsage, consumeInvalidDynamicUsageError, consumeRenderRequestApiUsage, cookies, draftMode, getAndClearPendingCookies, getDraftModeCookieHeader, getHeadersAccessPhase, getHeadersContext, headers, headersContextFromRequest, isDraftModeRequest, markDynamicUsage, markRenderRequestApiUsage, peekDynamicUsage, peekRenderRequestApiUsage, runWithConnectionProbe, runWithHeadersContext, setHeadersAccessPhase, setHeadersContext, suspendConnectionProbe, throwIfInsideCacheScope };
255
+ export { HeadersAccessPhase, HeadersContext, type RequestCookies, VinextHeadersShimState, applyMiddlewareRequestHeaders, consumeDynamicUsage, consumeInvalidDynamicUsageError, consumeRenderRequestApiUsage, cookies, draftMode, getAndClearPendingCookies, getDraftModeCookieHeader, getHeadersAccessPhase, getHeadersContext, headers, headersContextFromRequest, isDraftModeRequest, markDynamicUsage, markRenderRequestApiUsage, peekDynamicUsage, peekRenderRequestApiUsage, runWithConnectionProbe, runWithHeadersContext, setHeadersAccessPhase, setHeadersContext, suspendConnectionProbe, throwIfInsideCacheScope, throwIfStaticGenerationAccessError };