vinext 0.1.1 → 0.1.3

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 (266) hide show
  1. package/README.md +2 -5
  2. package/dist/build/client-build-config.d.ts +7 -1
  3. package/dist/build/client-build-config.js +9 -1
  4. package/dist/build/prerender.d.ts +9 -1
  5. package/dist/build/prerender.js +41 -12
  6. package/dist/build/run-prerender.d.ts +10 -2
  7. package/dist/build/run-prerender.js +15 -1
  8. package/dist/check.js +4 -3
  9. package/dist/client/app-nav-failure-handler.d.ts +8 -0
  10. package/dist/client/app-nav-failure-handler.js +44 -0
  11. package/dist/client/navigation-runtime.d.ts +3 -2
  12. package/dist/client/vinext-next-data.d.ts +18 -1
  13. package/dist/client/window-next.d.ts +8 -5
  14. package/dist/client/window-next.js +12 -1
  15. package/dist/cloudflare/src/cache/cdn-adapter.runtime.js +6 -1
  16. package/dist/config/config-matchers.d.ts +11 -4
  17. package/dist/config/config-matchers.js +88 -16
  18. package/dist/config/next-config.d.ts +59 -4
  19. package/dist/config/next-config.js +149 -48
  20. package/dist/deploy.d.ts +30 -11
  21. package/dist/deploy.js +189 -101
  22. package/dist/entries/app-browser-entry.d.ts +9 -3
  23. package/dist/entries/app-browser-entry.js +21 -3
  24. package/dist/entries/app-rsc-entry.d.ts +2 -0
  25. package/dist/entries/app-rsc-entry.js +71 -6
  26. package/dist/entries/app-rsc-manifest.js +2 -0
  27. package/dist/entries/app-ssr-entry.js +1 -1
  28. package/dist/entries/pages-client-entry.js +54 -9
  29. package/dist/entries/pages-server-entry.js +48 -11
  30. package/dist/index.d.ts +0 -2
  31. package/dist/index.js +285 -139
  32. package/dist/plugins/dynamic-preload-metadata.d.ts +13 -0
  33. package/dist/plugins/dynamic-preload-metadata.js +415 -0
  34. package/dist/plugins/extensionless-dynamic-import.d.ts +6 -0
  35. package/dist/plugins/extensionless-dynamic-import.js +152 -0
  36. package/dist/plugins/og-assets.js +2 -2
  37. package/dist/plugins/optimize-imports.d.ts +10 -5
  38. package/dist/plugins/optimize-imports.js +27 -21
  39. package/dist/plugins/postcss.js +7 -7
  40. package/dist/plugins/sass.d.ts +53 -24
  41. package/dist/plugins/sass.js +249 -1
  42. package/dist/plugins/typeof-window.d.ts +14 -0
  43. package/dist/plugins/typeof-window.js +150 -0
  44. package/dist/plugins/wasm-module-import.d.ts +15 -0
  45. package/dist/plugins/wasm-module-import.js +50 -0
  46. package/dist/routing/app-route-graph.d.ts +25 -2
  47. package/dist/routing/app-route-graph.js +91 -22
  48. package/dist/routing/file-matcher.d.ts +10 -1
  49. package/dist/routing/file-matcher.js +23 -2
  50. package/dist/routing/pages-router.js +3 -3
  51. package/dist/routing/utils.d.ts +35 -6
  52. package/dist/routing/utils.js +59 -7
  53. package/dist/server/api-handler.d.ts +6 -1
  54. package/dist/server/api-handler.js +21 -15
  55. package/dist/server/app-browser-action-result.d.ts +19 -6
  56. package/dist/server/app-browser-action-result.js +19 -10
  57. package/dist/server/app-browser-entry.js +269 -297
  58. package/dist/server/app-browser-error.d.ts +10 -3
  59. package/dist/server/app-browser-error.js +47 -6
  60. package/dist/server/app-browser-history-controller.d.ts +104 -0
  61. package/dist/server/app-browser-history-controller.js +210 -0
  62. package/dist/server/app-browser-hydration.d.ts +2 -0
  63. package/dist/server/app-browser-hydration.js +1 -0
  64. package/dist/server/app-browser-navigation-controller.d.ts +7 -4
  65. package/dist/server/app-browser-navigation-controller.js +33 -9
  66. package/dist/server/app-browser-rsc-redirect.d.ts +11 -2
  67. package/dist/server/app-browser-rsc-redirect.js +30 -8
  68. package/dist/server/app-browser-server-action-navigation.d.ts +6 -0
  69. package/dist/server/app-browser-server-action-navigation.js +9 -0
  70. package/dist/server/app-browser-state.js +4 -7
  71. package/dist/server/app-browser-stream.js +86 -43
  72. package/dist/server/app-browser-visible-commit.js +1 -1
  73. package/dist/server/app-elements-wire.d.ts +6 -1
  74. package/dist/server/app-elements-wire.js +14 -4
  75. package/dist/server/app-elements.d.ts +2 -2
  76. package/dist/server/app-elements.js +2 -2
  77. package/dist/server/app-fallback-renderer.d.ts +3 -1
  78. package/dist/server/app-fallback-renderer.js +6 -2
  79. package/dist/server/app-middleware.js +1 -0
  80. package/dist/server/app-optimistic-routing.js +24 -3
  81. package/dist/server/app-page-boundary-render.d.ts +3 -1
  82. package/dist/server/app-page-boundary-render.js +31 -16
  83. package/dist/server/app-page-cache-render.d.ts +53 -0
  84. package/dist/server/app-page-cache-render.js +91 -0
  85. package/dist/server/app-page-cache.d.ts +16 -2
  86. package/dist/server/app-page-cache.js +71 -8
  87. package/dist/server/app-page-dispatch.d.ts +34 -0
  88. package/dist/server/app-page-dispatch.js +167 -97
  89. package/dist/server/app-page-element-builder.d.ts +23 -2
  90. package/dist/server/app-page-element-builder.js +42 -10
  91. package/dist/server/app-page-execution.d.ts +7 -2
  92. package/dist/server/app-page-execution.js +53 -18
  93. package/dist/server/app-page-probe.d.ts +1 -0
  94. package/dist/server/app-page-probe.js +4 -0
  95. package/dist/server/app-page-render-observation.d.ts +3 -1
  96. package/dist/server/app-page-render-observation.js +17 -1
  97. package/dist/server/app-page-render.d.ts +13 -2
  98. package/dist/server/app-page-render.js +48 -17
  99. package/dist/server/app-page-request.d.ts +3 -0
  100. package/dist/server/app-page-request.js +5 -3
  101. package/dist/server/app-page-response.js +1 -1
  102. package/dist/server/app-page-route-wiring.d.ts +5 -1
  103. package/dist/server/app-page-route-wiring.js +21 -11
  104. package/dist/server/app-page-stream.d.ts +16 -9
  105. package/dist/server/app-page-stream.js +12 -9
  106. package/dist/server/app-pages-bridge.d.ts +18 -0
  107. package/dist/server/app-pages-bridge.js +22 -5
  108. package/dist/server/app-ppr-fallback-shell-render.d.ts +17 -0
  109. package/dist/server/app-ppr-fallback-shell-render.js +26 -0
  110. package/dist/server/app-ppr-fallback-shell.d.ts +13 -1
  111. package/dist/server/app-ppr-fallback-shell.js +8 -1
  112. package/dist/server/app-route-handler-dispatch.js +9 -2
  113. package/dist/server/app-route-handler-policy.d.ts +1 -0
  114. package/dist/server/app-route-handler-response.js +11 -10
  115. package/dist/server/app-route-handler-runtime.js +12 -1
  116. package/dist/server/app-router-entry.js +5 -0
  117. package/dist/server/app-rsc-cache-busting.js +2 -0
  118. package/dist/server/app-rsc-handler.d.ts +25 -0
  119. package/dist/server/app-rsc-handler.js +153 -53
  120. package/dist/server/app-rsc-response-finalizer.js +1 -1
  121. package/dist/server/app-rsc-route-matching.d.ts +3 -0
  122. package/dist/server/app-rsc-route-matching.js +2 -0
  123. package/dist/server/app-segment-config.d.ts +9 -1
  124. package/dist/server/app-segment-config.js +12 -3
  125. package/dist/server/app-server-action-execution.d.ts +12 -0
  126. package/dist/server/app-server-action-execution.js +47 -15
  127. package/dist/server/app-ssr-entry.d.ts +2 -0
  128. package/dist/server/app-ssr-entry.js +81 -8
  129. package/dist/server/app-ssr-stream.js +9 -1
  130. package/dist/server/cache-control.js +4 -0
  131. package/dist/server/dev-lockfile.js +2 -1
  132. package/dist/server/dev-server.d.ts +2 -2
  133. package/dist/server/dev-server.js +287 -63
  134. package/dist/server/headers.d.ts +8 -1
  135. package/dist/server/headers.js +8 -1
  136. package/dist/server/hybrid-route-priority.d.ts +22 -0
  137. package/dist/server/hybrid-route-priority.js +33 -0
  138. package/dist/server/image-optimization.d.ts +18 -9
  139. package/dist/server/image-optimization.js +37 -23
  140. package/dist/server/implicit-tags.d.ts +2 -1
  141. package/dist/server/implicit-tags.js +4 -1
  142. package/dist/server/instrumentation-runtime.d.ts +6 -0
  143. package/dist/server/instrumentation-runtime.js +8 -0
  144. package/dist/server/isr-decision.d.ts +79 -0
  145. package/dist/server/isr-decision.js +70 -0
  146. package/dist/server/metadata-route-response.js +5 -3
  147. package/dist/server/middleware-runtime.d.ts +13 -0
  148. package/dist/server/middleware-runtime.js +11 -7
  149. package/dist/server/middleware.js +1 -0
  150. package/dist/server/navigation-planner.d.ts +186 -22
  151. package/dist/server/navigation-planner.js +302 -0
  152. package/dist/server/navigation-trace.d.ts +18 -1
  153. package/dist/server/navigation-trace.js +18 -1
  154. package/dist/server/normalize-path.d.ts +0 -8
  155. package/dist/server/normalize-path.js +3 -1
  156. package/dist/server/otel-tracer-extension.d.ts +45 -0
  157. package/dist/server/otel-tracer-extension.js +89 -0
  158. package/dist/server/pages-api-route.d.ts +20 -3
  159. package/dist/server/pages-api-route.js +19 -3
  160. package/dist/server/pages-asset-tags.d.ts +16 -4
  161. package/dist/server/pages-asset-tags.js +22 -12
  162. package/dist/server/pages-data-route.d.ts +8 -1
  163. package/dist/server/pages-data-route.js +16 -3
  164. package/dist/server/pages-get-initial-props.d.ts +54 -4
  165. package/dist/server/pages-get-initial-props.js +43 -1
  166. package/dist/server/pages-node-compat.d.ts +3 -11
  167. package/dist/server/pages-node-compat.js +175 -122
  168. package/dist/server/pages-page-data.d.ts +39 -2
  169. package/dist/server/pages-page-data.js +261 -46
  170. package/dist/server/pages-page-handler.d.ts +5 -2
  171. package/dist/server/pages-page-handler.js +78 -25
  172. package/dist/server/pages-page-response.d.ts +47 -2
  173. package/dist/server/pages-page-response.js +73 -9
  174. package/dist/server/pages-readiness.d.ts +1 -1
  175. package/dist/server/pages-request-pipeline.d.ts +16 -1
  176. package/dist/server/pages-request-pipeline.js +96 -38
  177. package/dist/server/pregenerated-concrete-paths.d.ts +1 -17
  178. package/dist/server/pregenerated-concrete-paths.js +2 -19
  179. package/dist/server/prerender-manifest.d.ts +33 -0
  180. package/dist/server/prerender-manifest.js +54 -0
  181. package/dist/server/prerender-route-params.d.ts +1 -2
  182. package/dist/server/prod-server.d.ts +39 -1
  183. package/dist/server/prod-server.js +107 -37
  184. package/dist/server/request-pipeline.d.ts +3 -15
  185. package/dist/server/request-pipeline.js +58 -47
  186. package/dist/server/rsc-stream-hints.d.ts +5 -1
  187. package/dist/server/rsc-stream-hints.js +6 -1
  188. package/dist/server/seed-cache.js +10 -18
  189. package/dist/shims/app-router-scroll-state.d.ts +3 -1
  190. package/dist/shims/app-router-scroll-state.js +14 -2
  191. package/dist/shims/app-router-scroll.d.ts +3 -0
  192. package/dist/shims/app-router-scroll.js +28 -18
  193. package/dist/shims/cache-runtime.js +12 -4
  194. package/dist/shims/cache.d.ts +1 -0
  195. package/dist/shims/cache.js +1 -1
  196. package/dist/shims/cdn-cache.d.ts +5 -5
  197. package/dist/shims/dynamic-preload-chunks.d.ts +8 -0
  198. package/dist/shims/dynamic-preload-chunks.js +79 -0
  199. package/dist/shims/dynamic.d.ts +4 -0
  200. package/dist/shims/dynamic.js +4 -2
  201. package/dist/shims/error-boundary.d.ts +6 -4
  202. package/dist/shims/error-boundary.js +7 -0
  203. package/dist/shims/error.js +38 -11
  204. package/dist/shims/error.react-server.d.ts +9 -0
  205. package/dist/shims/error.react-server.js +6 -0
  206. package/dist/shims/fetch-cache.d.ts +11 -1
  207. package/dist/shims/fetch-cache.js +55 -20
  208. package/dist/shims/hash-scroll.js +6 -1
  209. package/dist/shims/head.js +6 -1
  210. package/dist/shims/headers.d.ts +16 -2
  211. package/dist/shims/headers.js +66 -5
  212. package/dist/shims/image-config.js +7 -1
  213. package/dist/shims/internal/als-registry.js +28 -1
  214. package/dist/shims/internal/app-route-detection.d.ts +6 -3
  215. package/dist/shims/internal/app-route-detection.js +18 -23
  216. package/dist/shims/internal/app-router-context.d.ts +5 -0
  217. package/dist/shims/internal/hybrid-client-route-owner.d.ts +31 -0
  218. package/dist/shims/internal/hybrid-client-route-owner.js +143 -0
  219. package/dist/shims/internal/navigation-untracked.d.ts +35 -0
  220. package/dist/shims/internal/navigation-untracked.js +55 -0
  221. package/dist/shims/internal/pages-data-target.d.ts +7 -2
  222. package/dist/shims/internal/pages-data-target.js +17 -8
  223. package/dist/shims/internal/pages-router-accessor.d.ts +19 -0
  224. package/dist/shims/internal/pages-router-accessor.js +13 -0
  225. package/dist/shims/internal/router-context.d.ts +2 -1
  226. package/dist/shims/internal/router-context.js +3 -1
  227. package/dist/shims/link.js +12 -5
  228. package/dist/shims/metadata.d.ts +6 -2
  229. package/dist/shims/metadata.js +32 -14
  230. package/dist/shims/navigation.d.ts +14 -17
  231. package/dist/shims/navigation.js +93 -46
  232. package/dist/shims/ppr-fallback-shell.d.ts +5 -1
  233. package/dist/shims/ppr-fallback-shell.js +28 -7
  234. package/dist/shims/router.d.ts +13 -2
  235. package/dist/shims/router.js +434 -116
  236. package/dist/shims/script-nonce-context.d.ts +1 -1
  237. package/dist/shims/script-nonce-context.js +11 -3
  238. package/dist/shims/server.d.ts +33 -2
  239. package/dist/shims/server.js +75 -18
  240. package/dist/shims/slot.js +1 -1
  241. package/dist/shims/unified-request-context.js +2 -0
  242. package/dist/typegen.js +1 -0
  243. package/dist/utils/built-asset-url.d.ts +4 -0
  244. package/dist/utils/built-asset-url.js +11 -0
  245. package/dist/utils/client-build-manifest.js +15 -5
  246. package/dist/utils/client-runtime-metadata.d.ts +45 -0
  247. package/dist/utils/client-runtime-metadata.js +63 -0
  248. package/dist/utils/commonjs-loader.d.ts +16 -0
  249. package/dist/utils/commonjs-loader.js +100 -0
  250. package/dist/utils/deployment-id.d.ts +8 -0
  251. package/dist/utils/deployment-id.js +22 -0
  252. package/dist/utils/hash.d.ts +17 -1
  253. package/dist/utils/hash.js +36 -1
  254. package/dist/utils/html-limited-bots.d.ts +18 -1
  255. package/dist/utils/html-limited-bots.js +23 -1
  256. package/dist/utils/lazy-chunks.d.ts +27 -1
  257. package/dist/utils/lazy-chunks.js +65 -1
  258. package/dist/utils/manifest-paths.d.ts +20 -2
  259. package/dist/utils/manifest-paths.js +38 -3
  260. package/dist/utils/parse-cookie.d.ts +13 -0
  261. package/dist/utils/parse-cookie.js +52 -0
  262. package/dist/utils/path.d.ts +8 -1
  263. package/dist/utils/path.js +13 -1
  264. package/package.json +2 -2
  265. package/dist/shims/internal/parse-cookie-header.d.ts +0 -14
  266. package/dist/shims/internal/parse-cookie-header.js +0 -30
@@ -4,27 +4,31 @@ import { getRequestExecutionContext } from "../shims/request-context.js";
4
4
  import { ACTION_REVALIDATED_HEADER, VINEXT_MW_CTX_HEADER, VINEXT_PRERENDER_ROUTE_PARAMS_HEADER } from "./headers.js";
5
5
  import { isExternalUrl, matchRedirect, matchRewrite, preserveRedirectDestinationQuery, proxyExternalRequest, requestContextFromRequest, sanitizeDestination } from "../config/config-matchers.js";
6
6
  import { notFoundResponse } from "./http-error-responses.js";
7
- import { applyConfigHeadersToResponse, cloneRequestWithHeaders, cloneRequestWithUrl, filterInternalHeaders, normalizeTrailingSlash, resolvePublicFileRoute, validateImageUrl } from "./request-pipeline.js";
7
+ import { applyConfigHeadersToResponse, cloneRequestWithHeaders, cloneRequestWithUrl, filterInternalHeaders, normalizeTrailingSlash, resolvePublicFileRoute } from "./request-pipeline.js";
8
8
  import { headersContextFromRequest } from "../shims/headers.js";
9
9
  import { ensureFetchPatch, setCurrentFetchSoftTags } from "../shims/fetch-cache.js";
10
- import { createRscRedirectLocation, hasRscCacheBustingSearchParam, resolveInvalidRscCacheBustingRequest, stripRscCacheBustingSearchParam, stripRscSuffix } from "./app-rsc-cache-busting.js";
10
+ import { mergeRewriteQuery } from "../utils/query.js";
11
+ import { VINEXT_RSC_CACHE_BUSTING_SEARCH_PARAM, createRscRedirectLocation, hasRscCacheBustingSearchParam, resolveInvalidRscCacheBustingRequest, stripRscCacheBustingSearchParam, stripRscSuffix } from "./app-rsc-cache-busting.js";
11
12
  import { getScriptNonceFromHeaderSources } from "./csp.js";
12
13
  import { normalizeDefaultLocalePathname } from "./pages-i18n.js";
13
- import { isImageOptimizationPath } from "./image-optimization.js";
14
+ import { DEFAULT_DEVICE_SIZES, DEFAULT_IMAGE_SIZES, isImageOptimizationPath, resolveDevImageRedirect } from "./image-optimization.js";
14
15
  import { mergeMiddlewareResponseHeaders } from "./middleware-response-headers.js";
15
16
  import "./app-page-response.js";
16
- import { prerenderRouteParamsPayloadMatchesRoute, readTrustedPrerenderRouteParams, serializePrerenderRouteParamsHeader } from "./prerender-route-params.js";
17
+ import { createAppPprFallbackShells } from "./app-ppr-fallback-shell.js";
18
+ import { matchPrerenderRouteParamsPayload, readTrustedPrerenderRouteParams, serializePrerenderRouteParamsHeader } from "./prerender-route-params.js";
19
+ import { getRenderedConcreteUrlPathsForRoute } from "./pregenerated-concrete-paths.js";
17
20
  import { pickRootParams, setRootParams } from "../shims/root-params.js";
21
+ import { flattenErrorCauses } from "../utils/error-cause.js";
18
22
  import { applyAppMiddleware } from "./app-middleware.js";
19
23
  import { buildPageCacheTags } from "./implicit-tags.js";
20
24
  import { buildPostMwRequestContext } from "./app-post-middleware-context.js";
21
25
  import { handleAppPrerenderEndpoint } from "./app-prerender-endpoints.js";
22
- import { flattenErrorCauses } from "../utils/error-cause.js";
23
26
  import { finalizeAppRscResponse } from "./app-rsc-response-finalizer.js";
24
27
  import { normalizeRscRequest } from "./app-rsc-request-normalization.js";
25
28
  import { handleMetadataRouteRequest } from "./metadata-route-response.js";
26
29
  import { runWithPrerenderWorkUnit } from "./prerender-work-unit-setup.js";
27
30
  //#region src/server/app-rsc-handler.ts
31
+ const STATIC_METADATA_CONFIG_HEADER_OVERRIDES = new Set(["cache-control"]);
28
32
  function applyMiddlewareContextToResponse(response, middlewareContext) {
29
33
  if (!middlewareContext.headers && middlewareContext.status == null) return response;
30
34
  const headers = new Headers(response.headers);
@@ -38,6 +42,10 @@ function applyMiddlewareContextToResponse(response, middlewareContext) {
38
42
  function hasProperty(value, key) {
39
43
  return key in value;
40
44
  }
45
+ function isEdgeRouteHandler(handler) {
46
+ if (!handler || typeof handler !== "object" || !hasProperty(handler, "runtime")) return false;
47
+ return handler.runtime === "edge" || handler.runtime === "experimental-edge";
48
+ }
41
49
  function isExecutionContextLike(value) {
42
50
  if (!value || typeof value !== "object") return false;
43
51
  return hasProperty(value, "waitUntil") && typeof value.waitUntil === "function";
@@ -56,6 +64,17 @@ async function applyRewrite(options, cleanPathname) {
56
64
  }
57
65
  return rewritten;
58
66
  }
67
+ function requestContextForResolvedUrl(requestContext, resolvedUrl, baseUrl) {
68
+ return {
69
+ cookies: requestContext.cookies,
70
+ headers: requestContext.headers,
71
+ host: requestContext.host,
72
+ query: new URL(resolvedUrl, baseUrl).searchParams
73
+ };
74
+ }
75
+ function pathnameForResolvedUrl(resolvedUrl) {
76
+ return resolvedUrl.split("#", 1)[0].split("?", 1)[0];
77
+ }
59
78
  function applyConfigHeadersToMiddlewareRedirect(response, options) {
60
79
  if (response.status < 300 || response.status >= 400) return response;
61
80
  if (!options.configHeaders.length) return response;
@@ -82,6 +101,13 @@ function requestWithoutRscCacheBustingSearchParam(request) {
82
101
  stripRscCacheBustingSearchParam(url);
83
102
  return cloneRequestWithUrl(request.body ? request.clone() : request, url.toString());
84
103
  }
104
+ function requestWithoutRscSuffix(request) {
105
+ const url = new URL(request.url);
106
+ const pathname = stripRscSuffix(url.pathname);
107
+ if (pathname === url.pathname) return request;
108
+ url.pathname = pathname;
109
+ return cloneRequestWithUrl(request.body ? request.clone() : request, url.toString());
110
+ }
85
111
  async function handleAppRscRequest(options, request, preMiddlewareRequestContext, isDataRequest) {
86
112
  const handlerStart = process.env.NODE_ENV !== "production" ? performance.now() : 0;
87
113
  if (process.env.NODE_ENV !== "production") {
@@ -92,6 +118,8 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
92
118
  if (normalized instanceof Response) return normalized;
93
119
  const { url, isRscRequest, interceptionContextHeader, mountedSlotsHeader, renderMode, clientReuseManifest } = normalized;
94
120
  let { pathname, cleanPathname } = normalized;
121
+ let resolvedUrl = cleanPathname + url.search;
122
+ const getResolvedSearchParams = () => new URL(resolvedUrl, url).searchParams;
95
123
  const canonicalPathname = cleanPathname;
96
124
  const basePathState = {
97
125
  basePath: options.basePath,
@@ -124,12 +152,14 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
124
152
  request
125
153
  });
126
154
  if (rscCacheBustingRedirect) return rscCacheBustingRedirect;
127
- const userlandRequest = isRscRequest ? requestWithoutRscCacheBustingSearchParam(request) : request;
155
+ const normalizedUserlandRequest = requestWithoutRscSuffix(request);
156
+ const userlandRequest = requestWithoutRscCacheBustingSearchParam(normalizedUserlandRequest);
128
157
  const middlewareContext = {
129
158
  headers: null,
130
159
  requestHeaders: null,
131
160
  status: null
132
161
  };
162
+ let didMiddlewareRewrite = false;
133
163
  if (options.middlewareModule) {
134
164
  const middlewareResult = await applyAppMiddleware({
135
165
  basePath: options.basePath,
@@ -149,30 +179,46 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
149
179
  requestContext: preMiddlewareRequestContext
150
180
  });
151
181
  cleanPathname = middlewareResult.cleanPathname;
182
+ didMiddlewareRewrite = cleanPathname !== normalized.cleanPathname;
152
183
  if (middlewareResult.search !== null) url.search = middlewareResult.search;
184
+ resolvedUrl = cleanPathname + url.search;
153
185
  }
154
186
  const scriptNonce = getScriptNonceFromHeaderSources(request.headers, middlewareContext.headers);
155
187
  const postMiddlewareRequestContext = buildPostMwRequestContext(userlandRequest);
156
- const beforeFilesRewrite = await applyRewrite({
157
- basePathState,
158
- clearRequestContext: options.clearRequestContext,
159
- request: userlandRequest,
160
- requestContext: postMiddlewareRequestContext,
161
- rewrites: options.configRewrites.beforeFiles
162
- }, matchPathname(cleanPathname));
163
- if (beforeFilesRewrite instanceof Response) return beforeFilesRewrite;
164
- if (beforeFilesRewrite) cleanPathname = beforeFilesRewrite;
188
+ for (const rewrite of options.configRewrites.beforeFiles) {
189
+ const beforeFilesRewrite = await applyRewrite({
190
+ basePathState,
191
+ clearRequestContext: options.clearRequestContext,
192
+ request: normalizedUserlandRequest,
193
+ requestContext: requestContextForResolvedUrl(postMiddlewareRequestContext, resolvedUrl, url),
194
+ rewrites: [rewrite]
195
+ }, matchPathname(cleanPathname));
196
+ if (beforeFilesRewrite instanceof Response) return beforeFilesRewrite;
197
+ if (beforeFilesRewrite) {
198
+ resolvedUrl = mergeRewriteQuery(resolvedUrl, beforeFilesRewrite);
199
+ cleanPathname = pathnameForResolvedUrl(resolvedUrl);
200
+ }
201
+ }
165
202
  if (isImageOptimizationPath(cleanPathname)) {
166
- const imageUrlResult = validateImageUrl(url.searchParams.get("url"), request.url);
167
- if (imageUrlResult instanceof Response) return imageUrlResult;
168
- return Response.redirect(new URL(imageUrlResult, url.origin).href, 302);
203
+ const imageRedirect = resolveDevImageRedirect(url, [...options.imageConfig?.deviceSizes ?? DEFAULT_DEVICE_SIZES, ...options.imageConfig?.imageSizes ?? DEFAULT_IMAGE_SIZES], options.imageConfig?.qualities, { isDev: options.isDev });
204
+ if (!imageRedirect) return new Response("Invalid image optimization parameters", { status: 400 });
205
+ return Response.redirect(new URL(imageRedirect, url.origin).href, 302);
169
206
  }
170
207
  const metadataRouteResponse = await handleMetadataRouteRequest({
171
208
  metadataRoutes: options.metadataRoutes,
172
209
  cleanPathname,
173
210
  makeThenableParams: options.makeThenableParams
174
211
  });
175
- if (metadataRouteResponse) return applyMiddlewareContextToResponse(metadataRouteResponse, middlewareContext);
212
+ if (metadataRouteResponse) {
213
+ applyConfigHeadersToResponse(metadataRouteResponse.headers, {
214
+ basePathState,
215
+ configHeaders: options.configHeaders,
216
+ overwriteExisting: STATIC_METADATA_CONFIG_HEADER_OVERRIDES,
217
+ pathname: matchPathname(cleanPathname),
218
+ requestContext: preMiddlewareRequestContext
219
+ });
220
+ return applyMiddlewareContextToResponse(metadataRouteResponse, middlewareContext);
221
+ }
176
222
  const publicFileResponse = resolvePublicFileRoute({
177
223
  cleanPathname,
178
224
  middlewareContext,
@@ -184,10 +230,13 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
184
230
  options.clearRequestContext();
185
231
  return publicFileResponse;
186
232
  }
187
- if (isRscRequest) stripRscCacheBustingSearchParam(url);
233
+ stripRscCacheBustingSearchParam(url);
234
+ const resolved = new URL(resolvedUrl, url);
235
+ stripRscCacheBustingSearchParam(resolved);
236
+ resolvedUrl = resolved.pathname + resolved.search + resolved.hash;
188
237
  options.setNavigationContext({
189
238
  pathname: canonicalPathname,
190
- searchParams: url.searchParams,
239
+ searchParams: getResolvedSearchParams(),
191
240
  params: {}
192
241
  });
193
242
  const preActionMatch = options.matchRoute(cleanPathname);
@@ -216,53 +265,85 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
216
265
  middlewareContext,
217
266
  mountedSlotsHeader,
218
267
  request,
219
- searchParams: url.searchParams
268
+ searchParams: getResolvedSearchParams()
220
269
  });
221
270
  if (serverActionResponse) return serverActionResponse;
222
271
  let match = preActionMatch;
223
- if (!match || match.route.isDynamic) {
272
+ const renderPagesForMatchKind = async (matchKind) => match === null || match.route.isDynamic ? await options.renderPagesFallback?.({
273
+ appRouteMatch: match ?? null,
274
+ allowRscDocumentFallback: didMiddlewareRewrite,
275
+ isRscRequest,
276
+ matchKind,
277
+ middlewareContext,
278
+ pathname: resolvedUrl,
279
+ request,
280
+ url
281
+ }) ?? null : null;
282
+ const staticPagesFallbackResponse = await renderPagesForMatchKind("static");
283
+ if (staticPagesFallbackResponse) {
284
+ options.clearRequestContext();
285
+ return staticPagesFallbackResponse;
286
+ }
287
+ if (!match || match.route.isDynamic) for (const rewrite of options.configRewrites.afterFiles) {
224
288
  const afterFilesRewrite = await applyRewrite({
225
289
  basePathState,
226
290
  clearRequestContext: options.clearRequestContext,
227
- request: userlandRequest,
228
- requestContext: postMiddlewareRequestContext,
229
- rewrites: options.configRewrites.afterFiles
291
+ request: normalizedUserlandRequest,
292
+ requestContext: requestContextForResolvedUrl(postMiddlewareRequestContext, resolvedUrl, url),
293
+ rewrites: [rewrite]
230
294
  }, matchPathname(cleanPathname));
231
295
  if (afterFilesRewrite instanceof Response) return afterFilesRewrite;
232
- if (afterFilesRewrite) {
233
- cleanPathname = afterFilesRewrite;
234
- match = options.matchRoute(cleanPathname);
296
+ if (!afterFilesRewrite) continue;
297
+ resolvedUrl = mergeRewriteQuery(resolvedUrl, afterFilesRewrite);
298
+ cleanPathname = pathnameForResolvedUrl(resolvedUrl);
299
+ match = options.matchRoute(cleanPathname);
300
+ const rewrittenStaticPagesResponse = await renderPagesForMatchKind("static");
301
+ if (rewrittenStaticPagesResponse) {
302
+ options.clearRequestContext();
303
+ return rewrittenStaticPagesResponse;
235
304
  }
305
+ const rewrittenDynamicPagesResponse = await renderPagesForMatchKind("dynamic");
306
+ if (rewrittenDynamicPagesResponse) {
307
+ options.clearRequestContext();
308
+ return rewrittenDynamicPagesResponse;
309
+ }
310
+ if (match) break;
236
311
  }
237
- if (!match) {
312
+ const dynamicPagesFallbackResponse = await renderPagesForMatchKind("dynamic");
313
+ if (dynamicPagesFallbackResponse) {
314
+ options.clearRequestContext();
315
+ return dynamicPagesFallbackResponse;
316
+ }
317
+ if (!match) for (const rewrite of options.configRewrites.fallback) {
238
318
  const fallbackRewrite = await applyRewrite({
239
319
  basePathState,
240
320
  clearRequestContext: options.clearRequestContext,
241
- request: userlandRequest,
242
- requestContext: postMiddlewareRequestContext,
243
- rewrites: options.configRewrites.fallback
321
+ request: normalizedUserlandRequest,
322
+ requestContext: requestContextForResolvedUrl(postMiddlewareRequestContext, resolvedUrl, url),
323
+ rewrites: [rewrite]
244
324
  }, matchPathname(cleanPathname));
245
325
  if (fallbackRewrite instanceof Response) return fallbackRewrite;
246
- if (fallbackRewrite) {
247
- cleanPathname = fallbackRewrite;
248
- match = options.matchRoute(cleanPathname);
326
+ if (!fallbackRewrite) continue;
327
+ resolvedUrl = mergeRewriteQuery(resolvedUrl, fallbackRewrite);
328
+ cleanPathname = pathnameForResolvedUrl(resolvedUrl);
329
+ match = options.matchRoute(cleanPathname);
330
+ const rewrittenStaticPagesResponse = await renderPagesForMatchKind("static");
331
+ if (rewrittenStaticPagesResponse) {
332
+ options.clearRequestContext();
333
+ return rewrittenStaticPagesResponse;
334
+ }
335
+ const rewrittenDynamicPagesResponse = await renderPagesForMatchKind("dynamic");
336
+ if (rewrittenDynamicPagesResponse) {
337
+ options.clearRequestContext();
338
+ return rewrittenDynamicPagesResponse;
249
339
  }
340
+ if (match) break;
250
341
  }
251
342
  if (!match) {
252
343
  if (process.env.NODE_ENV !== "production" && canonicalPathname === "/favicon.ico") {
253
344
  options.clearRequestContext();
254
345
  return new Response("", { status: 404 });
255
346
  }
256
- const pagesFallbackResponse = await options.renderPagesFallback?.({
257
- isRscRequest,
258
- middlewareContext,
259
- request,
260
- url
261
- });
262
- if (pagesFallbackResponse) {
263
- options.clearRequestContext();
264
- return pagesFallbackResponse;
265
- }
266
347
  const renderedNotFoundResponse = await options.renderNotFound({
267
348
  isRscRequest,
268
349
  middlewareContext,
@@ -278,25 +359,37 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
278
359
  }
279
360
  const { route, params } = match;
280
361
  if (options.ensureRouteLoaded) await options.ensureRouteLoaded(route);
281
- const prerenderRouteParamsPayload = readTrustedPrerenderRouteParams(request);
282
- const prerenderRouteParams = prerenderRouteParamsPayloadMatchesRoute(prerenderRouteParamsPayload, route.pattern, params) ? prerenderRouteParamsPayload.params : null;
362
+ const prerenderRouteParamsMatch = matchPrerenderRouteParamsPayload(readTrustedPrerenderRouteParams(request), route.pattern, params);
363
+ const prerenderRouteParams = prerenderRouteParamsMatch?.params ?? null;
364
+ const isPrerenderFallbackShell = prerenderRouteParamsMatch?.kind === "fallback-shell";
283
365
  const renderParams = prerenderRouteParams ?? params;
366
+ const resolvedSearchParams = getResolvedSearchParams();
367
+ const runtimeFallbackShells = options.cacheComponents === true && request.method === "GET" && !isRscRequest && !isPrerenderFallbackShell && route.params ? createAppPprFallbackShells({
368
+ params: route.params,
369
+ pattern: route.pattern,
370
+ rootParamNames: route.rootParamNames
371
+ }, params) : [];
284
372
  options.setNavigationContext({
285
373
  pathname: canonicalPathname,
286
- searchParams: url.searchParams,
374
+ searchParams: resolvedSearchParams,
287
375
  params: renderParams
288
376
  });
289
377
  const rootParams = pickRootParams(renderParams, route.rootParamNames);
290
378
  setRootParams(rootParams);
291
379
  if (route.routeHandler) {
292
380
  setCurrentFetchSoftTags(buildPageCacheTags(cleanPathname, [], [...route.routeSegments], "route"));
381
+ const routeHandlerRequest = isEdgeRouteHandler(route.routeHandler) ? userlandRequest : normalizedUserlandRequest;
382
+ const routeHandlerUrl = new URL(routeHandlerRequest.url);
383
+ const internalRscValues = isEdgeRouteHandler(route.routeHandler) ? [] : routeHandlerUrl.searchParams.getAll(VINEXT_RSC_CACHE_BUSTING_SEARCH_PARAM);
384
+ routeHandlerUrl.search = resolvedSearchParams.toString();
385
+ for (const internalRscValue of internalRscValues) routeHandlerUrl.searchParams.append(VINEXT_RSC_CACHE_BUSTING_SEARCH_PARAM, internalRscValue);
293
386
  return options.dispatchMatchedRouteHandler({
294
387
  cleanPathname,
295
388
  middlewareContext,
296
389
  params: route.isDynamic ? renderParams : null,
297
- request,
390
+ request: new Request(routeHandlerUrl, routeHandlerRequest),
298
391
  route,
299
- searchParams: url.searchParams
392
+ searchParams: resolvedSearchParams
300
393
  });
301
394
  }
302
395
  const pageResponse = await options.dispatchMatchedPage({
@@ -313,12 +406,19 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
313
406
  middlewareContext,
314
407
  mountedSlotsHeader,
315
408
  params: renderParams,
316
- staticParamsValidationParams: prerenderRouteParams === null ? void 0 : params,
409
+ pprFallbackCacheShells: runtimeFallbackShells,
410
+ pprFallbackShell: isPrerenderFallbackShell ? {
411
+ fallbackParamNames: prerenderRouteParamsMatch.fallbackParamNames,
412
+ routePattern: route.pattern
413
+ } : void 0,
414
+ renderedConcreteUrlPaths: getRenderedConcreteUrlPathsForRoute(route.pattern),
415
+ skipStaticParamsValidation: isPrerenderFallbackShell,
416
+ staticParamsValidationParams: prerenderRouteParams === null || isPrerenderFallbackShell ? void 0 : params,
317
417
  rootParams,
318
418
  request,
319
419
  route,
320
420
  scriptNonce,
321
- searchParams: url.searchParams,
421
+ searchParams: resolvedSearchParams,
322
422
  renderMode
323
423
  });
324
424
  if (isProgressiveActionRender) return applyProgressiveActionSideEffects(pageResponse, progressiveActionResult);
@@ -3,9 +3,9 @@ import { hasBasePath, stripBasePath } from "../utils/base-path.js";
3
3
  import "./headers.js";
4
4
  import { normalizePath } from "./normalize-path.js";
5
5
  import { applyConfigHeadersToResponse } from "./request-pipeline.js";
6
+ import { applyCdnResponseHeaders } from "./cache-control.js";
6
7
  import { VINEXT_RSC_VARY_HEADER } from "./app-rsc-cache-busting.js";
7
8
  import { normalizeDefaultLocalePathname } from "./pages-i18n.js";
8
- import { applyCdnResponseHeaders } from "./cache-control.js";
9
9
  import { mergeVaryHeader } from "./middleware-response-headers.js";
10
10
  //#region src/server/app-rsc-response-finalizer.ts
11
11
  /**
@@ -29,6 +29,7 @@ type AppRscInterceptForMatching = {
29
29
  * @see https://github.com/vercel/next.js/blob/canary/packages/next/src/lib/generate-interception-routes-rewrites.ts
30
30
  */
31
31
  sourceMatchPattern?: string;
32
+ sourcePageSegments?: readonly string[];
32
33
  interceptLayouts: readonly unknown[];
33
34
  page: unknown;
34
35
  __pageLoader?: (() => Promise<unknown>) | null;
@@ -41,6 +42,7 @@ type AppRscSlotForMatching = {
41
42
  type AppRscSiblingInterceptForMatching = {
42
43
  targetPattern: string;
43
44
  sourceMatchPattern: string | null;
45
+ sourcePageSegments?: readonly string[];
44
46
  slotId: string | null;
45
47
  interceptLayouts: readonly unknown[];
46
48
  page: unknown;
@@ -63,6 +65,7 @@ type AppRscInterceptLookupEntry = {
63
65
  targetPatternParts: string[];
64
66
  sourceMatchPattern: string | null;
65
67
  sourceMatchPatternParts: string[] | null;
68
+ sourcePageSegments: readonly string[] | null;
66
69
  interceptLayouts: readonly unknown[];
67
70
  page: unknown;
68
71
  __pageLoader?: (() => Promise<unknown>) | null;
@@ -78,6 +78,7 @@ function createInterceptLookup(routes) {
78
78
  targetPatternParts: intercept.targetPattern.split("/").filter(Boolean),
79
79
  sourceMatchPattern,
80
80
  sourceMatchPatternParts,
81
+ sourcePageSegments: intercept.sourcePageSegments ?? null,
81
82
  interceptLayouts: intercept.interceptLayouts,
82
83
  page: intercept.page,
83
84
  __pageLoader: intercept.__pageLoader,
@@ -96,6 +97,7 @@ function createInterceptLookup(routes) {
96
97
  targetPatternParts: intercept.targetPattern.split("/").filter(Boolean),
97
98
  sourceMatchPattern,
98
99
  sourceMatchPatternParts,
100
+ sourcePageSegments: intercept.sourcePageSegments ?? null,
99
101
  interceptLayouts: intercept.interceptLayouts,
100
102
  page: intercept.page,
101
103
  __pageLoader: intercept.__pageLoader,
@@ -33,6 +33,14 @@ type ResolveAppPageSegmentConfigOptions = {
33
33
  */
34
34
  declare function resolveAppPageSegmentConfig(options: ResolveAppPageSegmentConfigOptions): EffectiveAppPageSegmentConfig;
35
35
  declare function resolveAppPageFetchCacheMode(options: ResolveAppPageSegmentConfigOptions): FetchCacheMode | null;
36
+ /**
37
+ * Resolve the `fetchCache` segment config exported by a route handler module.
38
+ *
39
+ * Route handlers have no layout chain, so the module's own export applies
40
+ * directly. Mirrors upstream's app-route module, which copies
41
+ * `userland.fetchCache` into the work store before invoking the handler.
42
+ */
43
+ declare function resolveAppRouteHandlerFetchCacheMode(handler: Pick<AppRouteSegmentConfigModule, "fetchCache">): FetchCacheMode | null;
36
44
  declare function isEdgeRuntime(runtime: string | undefined): boolean;
37
45
  //#endregion
38
- export { isEdgeRuntime, resolveAppPageFetchCacheMode, resolveAppPageSegmentConfig };
46
+ export { isEdgeRuntime, resolveAppPageFetchCacheMode, resolveAppPageSegmentConfig, resolveAppRouteHandlerFetchCacheMode };
@@ -88,8 +88,7 @@ function resolveAppPageSegmentConfig(options) {
88
88
  }
89
89
  if (config.dynamicConfig === "force-dynamic") config.revalidateSeconds = 0;
90
90
  if (config.fetchCache === void 0) {
91
- if (config.dynamicConfig === "force-dynamic") config.fetchCache = "force-no-store";
92
- else if (config.dynamicConfig === "error") config.fetchCache = "only-cache";
91
+ if (config.dynamicConfig === "error") config.fetchCache = "only-cache";
93
92
  }
94
93
  if (config.dynamicParamsConfig === void 0 && (config.dynamicConfig === "error" || config.dynamicConfig === "force-static")) config.dynamicParamsConfig = false;
95
94
  return config;
@@ -97,8 +96,18 @@ function resolveAppPageSegmentConfig(options) {
97
96
  function resolveAppPageFetchCacheMode(options) {
98
97
  return resolveAppPageSegmentConfig(options).fetchCache ?? null;
99
98
  }
99
+ /**
100
+ * Resolve the `fetchCache` segment config exported by a route handler module.
101
+ *
102
+ * Route handlers have no layout chain, so the module's own export applies
103
+ * directly. Mirrors upstream's app-route module, which copies
104
+ * `userland.fetchCache` into the work store before invoking the handler.
105
+ */
106
+ function resolveAppRouteHandlerFetchCacheMode(handler) {
107
+ return isRouteSegmentFetchCache(handler.fetchCache) ? handler.fetchCache : null;
108
+ }
100
109
  function isEdgeRuntime(runtime) {
101
110
  return isEdgeApiRuntime(runtime);
102
111
  }
103
112
  //#endregion
104
- export { isEdgeRuntime, resolveAppPageFetchCacheMode, resolveAppPageSegmentConfig };
113
+ export { isEdgeRuntime, resolveAppPageFetchCacheMode, resolveAppPageSegmentConfig, resolveAppRouteHandlerFetchCacheMode };
@@ -31,6 +31,17 @@ type AppServerActionRoute = {
31
31
  pattern: string;
32
32
  routeHandler?: unknown;
33
33
  routeSegments?: readonly string[];
34
+ params?: readonly string[] | null;
35
+ slots?: Readonly<Record<string, {
36
+ default?: {
37
+ default?: unknown;
38
+ } | null;
39
+ page?: {
40
+ default?: unknown;
41
+ } | null;
42
+ slotPatternParts?: readonly string[] | null;
43
+ slotParamNames?: readonly string[] | null;
44
+ }>> | null;
34
45
  };
35
46
  /**
36
47
  * Side-effect headers captured during a progressive (no-JS) server action's
@@ -162,6 +173,7 @@ type HandleServerActionRscRequestOptions<TElement, TRoute extends AppServerActio
162
173
  renderToReadableStream: (model: AppServerActionRscModel<TElement>, options: RenderServerActionRscStreamOptions<TTemporaryReferences>) => BodyInit | null | Promise<BodyInit | null>;
163
174
  reportRequestError: AppServerActionErrorReporter;
164
175
  resolveRouteFetchCacheMode?: (route: TRoute) => FetchCacheMode | null;
176
+ resolveRouteDynamicConfig?: (route: TRoute) => string | null | undefined;
165
177
  resolveRouteRuntime?: (route: TRoute) => AppServerActionRouteRuntime;
166
178
  request: Request;
167
179
  sanitizeErrorForClient: (error: unknown) => unknown;
@@ -7,7 +7,7 @@ import { validateCsrfOrigin, validateServerActionPayload } from "./request-pipel
7
7
  import { headersContextFromRequest, setHeadersContext } from "../shims/headers.js";
8
8
  import { getAndClearActionRevalidationKind } from "../shims/cache.js";
9
9
  import { APP_RSC_RENDER_MODE_ACTION_RERENDER_PRESERVE_UI } from "./app-rsc-render-mode.js";
10
- import { setCurrentFetchCacheMode, setCurrentFetchSoftTags } from "../shims/fetch-cache.js";
10
+ import { setCurrentFetchCacheMode, setCurrentFetchSoftTags, setCurrentForceDynamicFetchDefault } from "../shims/fetch-cache.js";
11
11
  import { VINEXT_RSC_CONTENT_TYPE, VINEXT_RSC_VARY_HEADER, applyRscCompatibilityIdHeader } from "./app-rsc-cache-busting.js";
12
12
  import { readStreamAsTextWithLimit } from "../utils/text-stream.js";
13
13
  import { mergeMiddlewareResponseHeaders } from "./middleware-response-headers.js";
@@ -15,8 +15,9 @@ import { applyEdgeRuntimeHeader } from "./app-page-response.js";
15
15
  import { getNextErrorDigest, parseNextHttpErrorDigest, parseNextRedirectDigest } from "./next-error-digest.js";
16
16
  import { createServerActionNotFoundResponse, getServerActionNotFoundMessage, isServerActionNotFoundError } from "./server-action-not-found.js";
17
17
  import { deferUntilStreamConsumed } from "./app-page-stream.js";
18
+ import { buildAppPageTags } from "./implicit-tags.js";
19
+ import { resolveAppPageNavigationParams } from "./app-page-element-builder.js";
18
20
  import { resolveAppPageActionRerenderTarget } from "./app-page-request.js";
19
- import { buildPageCacheTags } from "./implicit-tags.js";
20
21
  import { getSetCookieName } from "./cookie-utils.js";
21
22
  //#region src/server/app-server-action-execution.ts
22
23
  /**
@@ -45,6 +46,10 @@ function resolveActionRevalidationKind(hasModifiedCookies) {
45
46
  if (hasModifiedCookies) return ACTION_DID_REVALIDATE_STATIC_AND_DYNAMIC;
46
47
  return revalidationKind;
47
48
  }
49
+ function clearRejectedActionSideEffects(getAndClearPendingCookies) {
50
+ getAndClearPendingCookies();
51
+ getAndClearActionRevalidationKind();
52
+ }
48
53
  function cloneActionRedirectHeaders(requestHeaders) {
49
54
  const headers = new Headers(requestHeaders);
50
55
  for (const header of ACTION_REDIRECT_RENDER_STRIPPED_HEADERS) headers.delete(header);
@@ -232,7 +237,7 @@ function applyActionRedirectBasePath(url, basePath) {
232
237
  return `${addBasePathToPathname(pathname, basePath)}${suffix}`;
233
238
  }
234
239
  function buildServerActionPageTags(route, pathname) {
235
- return buildPageCacheTags(pathname, [], [...route.routeSegments ?? []], "page");
240
+ return buildAppPageTags(pathname, [], route.routeSegments ?? []);
236
241
  }
237
242
  function resolveInternalActionRedirectTarget(redirectUrl, requestUrl, basePath) {
238
243
  if (isExternalUrl(redirectUrl)) {
@@ -330,6 +335,7 @@ async function handleProgressiveServerActionRequest(options) {
330
335
  }
331
336
  const payloadResponse = await validateServerActionPayload(body);
332
337
  if (payloadResponse) {
338
+ clearRejectedActionSideEffects(options.getAndClearPendingCookies);
333
339
  options.clearRequestContext();
334
340
  return payloadResponse;
335
341
  }
@@ -481,6 +487,24 @@ async function handleServerActionRscRequest(options) {
481
487
  if (csrfResponse) return csrfResponse;
482
488
  if (parseInt(options.request.headers.get("content-length") || "0", 10) > options.maxActionBodySize) return renderFetchActionBodyExceededResponse(options);
483
489
  try {
490
+ let action;
491
+ if (options.contentType.startsWith("multipart/form-data")) {
492
+ let loadedAction;
493
+ try {
494
+ loadedAction = await options.loadServerAction(options.actionId);
495
+ } catch (error) {
496
+ if (isServerActionNotFoundError(error, options.actionId)) return createActionNotFoundResponse(options.actionId, {
497
+ clearRequestContext: options.clearRequestContext,
498
+ getAndClearPendingCookies: options.getAndClearPendingCookies
499
+ });
500
+ throw error;
501
+ }
502
+ if (!isAppServerActionFunction(loadedAction)) return createActionNotFoundResponse(options.actionId, {
503
+ clearRequestContext: options.clearRequestContext,
504
+ getAndClearPendingCookies: options.getAndClearPendingCookies
505
+ });
506
+ action = loadedAction;
507
+ }
484
508
  let body;
485
509
  try {
486
510
  body = options.contentType.startsWith("multipart/form-data") ? await options.readFormDataWithLimit(options.request, options.maxActionBodySize) : await options.readBodyWithLimit(options.request, options.maxActionBodySize);
@@ -490,23 +514,27 @@ async function handleServerActionRscRequest(options) {
490
514
  }
491
515
  const payloadResponse = await validateServerActionPayload(body);
492
516
  if (payloadResponse) {
517
+ clearRejectedActionSideEffects(options.getAndClearPendingCookies);
493
518
  options.clearRequestContext();
494
519
  return payloadResponse;
495
520
  }
496
- let action;
497
- try {
498
- action = await options.loadServerAction(options.actionId);
499
- } catch (error) {
500
- if (isServerActionNotFoundError(error, options.actionId)) return createActionNotFoundResponse(options.actionId, {
521
+ if (action === void 0) {
522
+ let loadedAction;
523
+ try {
524
+ loadedAction = await options.loadServerAction(options.actionId);
525
+ } catch (error) {
526
+ if (isServerActionNotFoundError(error, options.actionId)) return createActionNotFoundResponse(options.actionId, {
527
+ clearRequestContext: options.clearRequestContext,
528
+ getAndClearPendingCookies: options.getAndClearPendingCookies
529
+ });
530
+ throw error;
531
+ }
532
+ if (!isAppServerActionFunction(loadedAction)) return createActionNotFoundResponse(options.actionId, {
501
533
  clearRequestContext: options.clearRequestContext,
502
534
  getAndClearPendingCookies: options.getAndClearPendingCookies
503
535
  });
504
- throw error;
536
+ action = loadedAction;
505
537
  }
506
- if (!isAppServerActionFunction(action)) return createActionNotFoundResponse(options.actionId, {
507
- clearRequestContext: options.clearRequestContext,
508
- getAndClearPendingCookies: options.getAndClearPendingCookies
509
- });
510
538
  const temporaryReferences = options.createTemporaryReferenceSet();
511
539
  const args = await options.decodeReply(body, { temporaryReferences });
512
540
  let returnValue;
@@ -591,12 +619,14 @@ async function handleServerActionRscRequest(options) {
591
619
  url: redirectTarget
592
620
  });
593
621
  setHeadersContext(headersContextFromRequest(redirectRenderRequest));
622
+ const redirectNavigationParams = resolveAppPageNavigationParams(targetMatch.route, targetMatch.params, targetPathname, null);
594
623
  options.setNavigationContext({
595
624
  pathname: targetPathname,
596
625
  searchParams: redirectTarget.searchParams,
597
- params: targetMatch.params
626
+ params: redirectNavigationParams
598
627
  });
599
628
  setCurrentFetchCacheMode(options.resolveRouteFetchCacheMode?.(targetMatch.route) ?? null);
629
+ setCurrentForceDynamicFetchDefault(options.resolveRouteDynamicConfig?.(targetMatch.route) === "force-dynamic");
600
630
  setCurrentFetchSoftTags(buildServerActionPageTags(targetMatch.route, targetPathname));
601
631
  const element = options.buildPageElement({
602
632
  cleanPathname: targetPathname,
@@ -667,13 +697,15 @@ async function handleServerActionRscRequest(options) {
667
697
  isRscRequest: options.isRscRequest,
668
698
  toInterceptOpts: options.toInterceptOpts
669
699
  });
700
+ const resolvedActionNavigationParams = resolveAppPageNavigationParams(actionRerenderTarget.route, actionRerenderTarget.navigationParams, options.cleanPathname, actionRerenderTarget.interceptOpts);
670
701
  options.setNavigationContext({
671
702
  pathname: options.cleanPathname,
672
703
  searchParams: options.searchParams,
673
- params: actionRerenderTarget.navigationParams
704
+ params: resolvedActionNavigationParams
674
705
  });
675
706
  await options.ensureRouteLoaded?.(actionRerenderTarget.route);
676
707
  setCurrentFetchCacheMode(options.resolveRouteFetchCacheMode?.(actionRerenderTarget.route) ?? null);
708
+ setCurrentForceDynamicFetchDefault(options.resolveRouteDynamicConfig?.(actionRerenderTarget.route) === "force-dynamic");
677
709
  setCurrentFetchSoftTags(buildServerActionPageTags(actionRerenderTarget.route, options.cleanPathname));
678
710
  element = options.buildPageElement({
679
711
  cleanPathname: options.cleanPathname,
@@ -22,6 +22,7 @@ declare function handleSsr(rscStream: ReadableStream<Uint8Array>, navContext: Na
22
22
  capturedRscDataRef?: {
23
23
  value: Promise<ArrayBuffer> | null;
24
24
  };
25
+ pprFallbackShellSignal?: AbortSignal;
25
26
  formState?: ReactFormState | null;
26
27
  basePath?: string;
27
28
  /**
@@ -42,6 +43,7 @@ declare function handleSsr(rscStream: ReadableStream<Uint8Array>, navContext: Na
42
43
  * to resolve before returning the HTML stream. Used for static prerender
43
44
  * and ISR cache writes to avoid caching fallback content. */
44
45
  waitForAllReady?: boolean;
46
+ fallbackToErrorDocumentOnShellError?: boolean;
45
47
  }): Promise<AppSsrRenderResult>;
46
48
  declare const _default: {
47
49
  fetch(request: Request): Promise<Response>;