vinext 0.1.8 → 0.2.1

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 (285) hide show
  1. package/README.md +51 -30
  2. package/dist/build/css-url-assets.d.ts +3 -1
  3. package/dist/build/css-url-assets.js +18 -1
  4. package/dist/build/inject-pregenerated-paths.d.ts +7 -0
  5. package/dist/build/inject-pregenerated-paths.js +21 -0
  6. package/dist/build/layout-classification.js +1 -1
  7. package/dist/build/nitro-route-rules.js +1 -1
  8. package/dist/build/pages-client-assets-module.d.ts +11 -0
  9. package/dist/build/pages-client-assets-module.js +27 -0
  10. package/dist/build/prerender-server-entry.d.ts +1 -0
  11. package/dist/build/prerender-server-entry.js +49 -0
  12. package/dist/build/prerender-server-pool.d.ts +44 -0
  13. package/dist/build/prerender-server-pool.js +194 -0
  14. package/dist/build/prerender.d.ts +2 -1
  15. package/dist/build/prerender.js +98 -27
  16. package/dist/build/report.d.ts +13 -2
  17. package/dist/build/report.js +99 -2
  18. package/dist/build/run-prerender.d.ts +7 -0
  19. package/dist/build/run-prerender.js +12 -2
  20. package/dist/build/standalone.js +2 -0
  21. package/dist/cache/cache-adapters-virtual.js +3 -3
  22. package/dist/check.d.ts +4 -6
  23. package/dist/check.js +48 -11
  24. package/dist/cli-args.d.ts +1 -2
  25. package/dist/cli-args.js +1 -1
  26. package/dist/cli-dev-config.d.ts +12 -0
  27. package/dist/cli-dev-config.js +23 -0
  28. package/dist/cli.js +112 -96
  29. package/dist/{server → client}/dev-error-overlay-store.d.ts +1 -1
  30. package/dist/{server → client}/dev-error-overlay-store.js +1 -1
  31. package/dist/{server → client}/dev-error-overlay.d.ts +1 -1
  32. package/dist/{server → client}/dev-error-overlay.js +2 -2
  33. package/dist/client/navigation-runtime.d.ts +2 -0
  34. package/dist/client/navigation-runtime.js +3 -1
  35. package/dist/client/vinext-next-data.d.ts +4 -1
  36. package/dist/client/window-next.d.ts +2 -1
  37. package/dist/cloudflare/index.d.ts +2 -2
  38. package/dist/cloudflare/index.js +2 -2
  39. package/dist/config/config-matchers.js +45 -19
  40. package/dist/config/next-config.d.ts +41 -9
  41. package/dist/config/next-config.js +60 -3
  42. package/dist/config/prerender.d.ts +34 -0
  43. package/dist/config/prerender.js +55 -0
  44. package/dist/entries/app-browser-entry.js +5 -1
  45. package/dist/entries/app-rsc-entry.d.ts +5 -3
  46. package/dist/entries/app-rsc-entry.js +44 -10
  47. package/dist/entries/app-rsc-manifest.js +2 -0
  48. package/dist/entries/pages-client-entry.d.ts +3 -0
  49. package/dist/entries/pages-client-entry.js +28 -3
  50. package/dist/entries/pages-server-entry.js +23 -6
  51. package/dist/image/image-adapters-virtual.d.ts +59 -0
  52. package/dist/image/image-adapters-virtual.js +59 -0
  53. package/dist/index.d.ts +33 -0
  54. package/dist/index.js +482 -120
  55. package/dist/init-cloudflare.d.ts +43 -0
  56. package/dist/init-cloudflare.js +839 -0
  57. package/dist/init-platform.d.ts +40 -0
  58. package/dist/init-platform.js +195 -0
  59. package/dist/init.d.ts +16 -38
  60. package/dist/init.js +209 -99
  61. package/dist/node_modules/.pnpm/am-i-vibing@0.5.0/node_modules/am-i-vibing/dist/detector-1yx2Hoe0.js +294 -0
  62. package/dist/node_modules/.pnpm/process-ancestry@0.1.0/node_modules/process-ancestry/dist/index.js +94 -0
  63. package/dist/{cloudflare → packages/cloudflare}/src/cache/cdn-adapter.runtime.js +1 -1
  64. package/dist/{cloudflare → packages/cloudflare}/src/cache/kv-data-adapter.runtime.d.ts +2 -2
  65. package/dist/{cloudflare → packages/cloudflare}/src/cache/kv-data-adapter.runtime.js +9 -2
  66. package/dist/packages/cloudflare/src/deploy-config.js +150 -0
  67. package/dist/packages/cloudflare/src/deploy-help.js +55 -0
  68. package/dist/packages/cloudflare/src/deploy.js +272 -0
  69. package/dist/{cloudflare → packages/cloudflare/src}/tpr.d.ts +4 -41
  70. package/dist/{cloudflare → packages/cloudflare/src}/tpr.js +44 -20
  71. package/dist/plugins/ast-scope.d.ts +16 -0
  72. package/dist/plugins/ast-scope.js +62 -0
  73. package/dist/plugins/ast-utils.d.ts +27 -1
  74. package/dist/plugins/ast-utils.js +32 -1
  75. package/dist/plugins/css-module-imports.d.ts +14 -0
  76. package/dist/plugins/css-module-imports.js +59 -0
  77. package/dist/plugins/extensionless-dynamic-import.js +2 -2
  78. package/dist/plugins/fonts.js +1 -1
  79. package/dist/plugins/ignore-dynamic-requests.d.ts +11 -0
  80. package/dist/plugins/ignore-dynamic-requests.js +530 -0
  81. package/dist/plugins/og-assets.js +2 -1
  82. package/dist/plugins/optimize-imports.js +1 -1
  83. package/dist/plugins/rsc-reference-validation-normalizer.d.ts +12 -0
  84. package/dist/plugins/rsc-reference-validation-normalizer.js +48 -0
  85. package/dist/plugins/sass.d.ts +17 -1
  86. package/dist/plugins/sass.js +74 -1
  87. package/dist/plugins/styled-jsx.d.ts +16 -0
  88. package/dist/plugins/styled-jsx.js +149 -0
  89. package/dist/plugins/typeof-window.d.ts +1 -1
  90. package/dist/plugins/typeof-window.js +28 -56
  91. package/dist/routing/app-route-graph.d.ts +23 -2
  92. package/dist/routing/app-route-graph.js +138 -38
  93. package/dist/routing/file-matcher.d.ts +11 -1
  94. package/dist/routing/file-matcher.js +18 -3
  95. package/dist/routing/pages-router.js +2 -2
  96. package/dist/server/api-handler.js +9 -14
  97. package/dist/server/app-browser-action-result.d.ts +4 -1
  98. package/dist/server/app-browser-action-result.js +8 -1
  99. package/dist/server/app-browser-entry.js +198 -57
  100. package/dist/server/app-browser-interception-context.d.ts +1 -0
  101. package/dist/server/app-browser-interception-context.js +4 -2
  102. package/dist/server/app-browser-navigation-controller.d.ts +2 -0
  103. package/dist/server/app-browser-navigation-controller.js +60 -31
  104. package/dist/server/app-browser-server-action-client.d.ts +1 -1
  105. package/dist/server/app-browser-server-action-client.js +8 -7
  106. package/dist/server/app-browser-state.d.ts +12 -1
  107. package/dist/server/app-browser-state.js +25 -8
  108. package/dist/server/app-browser-visible-commit.d.ts +6 -1
  109. package/dist/server/app-browser-visible-commit.js +42 -24
  110. package/dist/server/app-elements-wire.d.ts +9 -2
  111. package/dist/server/app-elements-wire.js +8 -1
  112. package/dist/server/app-elements.d.ts +2 -2
  113. package/dist/server/app-elements.js +4 -3
  114. package/dist/server/app-fallback-renderer.d.ts +2 -1
  115. package/dist/server/app-fallback-renderer.js +10 -6
  116. package/dist/server/app-hydration-cache-publication.d.ts +11 -0
  117. package/dist/server/app-hydration-cache-publication.js +43 -0
  118. package/dist/server/app-middleware.d.ts +4 -3
  119. package/dist/server/app-middleware.js +8 -3
  120. package/dist/server/app-optimistic-routing.js +11 -4
  121. package/dist/server/app-page-boundary.js +2 -1
  122. package/dist/server/app-page-cache-finalizer.d.ts +1 -0
  123. package/dist/server/app-page-cache-finalizer.js +5 -4
  124. package/dist/server/app-page-cache-render.d.ts +1 -0
  125. package/dist/server/app-page-cache-render.js +8 -4
  126. package/dist/server/app-page-cache.d.ts +1 -0
  127. package/dist/server/app-page-cache.js +27 -7
  128. package/dist/server/app-page-dispatch.d.ts +1 -0
  129. package/dist/server/app-page-dispatch.js +26 -8
  130. package/dist/server/app-page-element-builder.d.ts +2 -1
  131. package/dist/server/app-page-element-builder.js +59 -4
  132. package/dist/server/app-page-execution.js +2 -1
  133. package/dist/server/app-page-probe.js +5 -0
  134. package/dist/server/app-page-render-identity.d.ts +2 -0
  135. package/dist/server/app-page-render-identity.js +3 -2
  136. package/dist/server/app-page-render.d.ts +2 -0
  137. package/dist/server/app-page-render.js +85 -16
  138. package/dist/server/app-page-request.d.ts +14 -0
  139. package/dist/server/app-page-request.js +69 -4
  140. package/dist/server/app-page-response.d.ts +7 -0
  141. package/dist/server/app-page-response.js +16 -4
  142. package/dist/server/app-page-route-wiring.d.ts +8 -1
  143. package/dist/server/app-page-route-wiring.js +32 -18
  144. package/dist/server/app-page-segment-state.d.ts +2 -1
  145. package/dist/server/app-page-segment-state.js +3 -1
  146. package/dist/server/app-page-stream.d.ts +7 -1
  147. package/dist/server/app-page-stream.js +3 -1
  148. package/dist/server/app-route-handler-execution.js +5 -1
  149. package/dist/server/app-route-handler-response.js +1 -0
  150. package/dist/server/app-route-handler-runtime.js +1 -1
  151. package/dist/server/app-route-tree-prefetch.d.ts +43 -0
  152. package/dist/server/app-route-tree-prefetch.js +187 -0
  153. package/dist/server/app-router-entry.js +9 -2
  154. package/dist/server/app-rsc-cache-busting.d.ts +2 -1
  155. package/dist/server/app-rsc-cache-busting.js +9 -4
  156. package/dist/server/app-rsc-handler.d.ts +7 -0
  157. package/dist/server/app-rsc-handler.js +148 -39
  158. package/dist/server/app-rsc-render-mode.d.ts +3 -2
  159. package/dist/server/app-rsc-render-mode.js +4 -1
  160. package/dist/server/app-rsc-request-normalization.d.ts +6 -6
  161. package/dist/server/app-rsc-request-normalization.js +10 -8
  162. package/dist/server/app-segment-config.d.ts +11 -0
  163. package/dist/server/app-segment-config.js +62 -6
  164. package/dist/server/app-server-action-execution.d.ts +1 -0
  165. package/dist/server/app-server-action-execution.js +61 -30
  166. package/dist/server/app-ssr-entry.d.ts +3 -0
  167. package/dist/server/app-ssr-entry.js +13 -5
  168. package/dist/server/app-ssr-stream.d.ts +7 -3
  169. package/dist/server/app-ssr-stream.js +10 -6
  170. package/dist/server/app-visited-response-cache.d.ts +6 -0
  171. package/dist/server/app-visited-response-cache.js +3 -1
  172. package/dist/server/cache-control.d.ts +3 -1
  173. package/dist/server/cache-control.js +13 -1
  174. package/dist/server/client-trace-metadata.js +26 -0
  175. package/dist/server/default-global-not-found-module.d.ts +14 -0
  176. package/dist/server/default-global-not-found-module.js +14 -0
  177. package/dist/server/dev-route-files.js +4 -0
  178. package/dist/server/dev-server.d.ts +11 -1
  179. package/dist/server/dev-server.js +94 -35
  180. package/dist/server/dev-stack-sourcemap.d.ts +1 -1
  181. package/dist/server/dev-stack-sourcemap.js +1 -1
  182. package/dist/server/fetch-handler.d.ts +2 -0
  183. package/dist/server/fetch-handler.js +18 -0
  184. package/dist/server/headers.d.ts +7 -15
  185. package/dist/server/headers.js +11 -18
  186. package/dist/server/image-optimization.d.ts +51 -1
  187. package/dist/server/image-optimization.js +52 -2
  188. package/dist/server/implicit-tags.js +1 -1
  189. package/dist/server/isr-cache.d.ts +3 -2
  190. package/dist/server/isr-cache.js +9 -5
  191. package/dist/server/metadata-routes.d.ts +3 -1
  192. package/dist/server/metadata-routes.js +12 -2
  193. package/dist/server/middleware-runtime.js +6 -1
  194. package/dist/server/navigation-planner.d.ts +1 -0
  195. package/dist/server/navigation-planner.js +14 -3
  196. package/dist/server/pages-api-route.js +2 -2
  197. package/dist/server/pages-asset-tags.d.ts +4 -6
  198. package/dist/server/pages-asset-tags.js +12 -12
  199. package/dist/server/pages-client-assets.d.ts +12 -0
  200. package/dist/server/pages-client-assets.js +10 -0
  201. package/dist/server/pages-data-route.d.ts +4 -2
  202. package/dist/server/pages-data-route.js +18 -4
  203. package/dist/server/pages-dev-module-url.d.ts +2 -1
  204. package/dist/server/pages-dev-module-url.js +6 -3
  205. package/dist/server/pages-node-compat.d.ts +19 -1
  206. package/dist/server/pages-node-compat.js +81 -4
  207. package/dist/server/pages-page-data.d.ts +33 -1
  208. package/dist/server/pages-page-data.js +62 -33
  209. package/dist/server/pages-page-handler.d.ts +2 -1
  210. package/dist/server/pages-page-handler.js +38 -19
  211. package/dist/server/pages-page-response.d.ts +8 -0
  212. package/dist/server/pages-page-response.js +7 -3
  213. package/dist/server/pages-request-pipeline.d.ts +9 -5
  214. package/dist/server/pages-request-pipeline.js +55 -7
  215. package/dist/server/pages-router-entry.d.ts +30 -0
  216. package/dist/server/pages-router-entry.js +108 -0
  217. package/dist/server/prerender-manifest.d.ts +3 -1
  218. package/dist/server/prerender-route-params.js +1 -1
  219. package/dist/server/prod-server.d.ts +5 -3
  220. package/dist/server/prod-server.js +68 -39
  221. package/dist/server/request-pipeline.js +2 -1
  222. package/dist/server/seed-cache.js +4 -4
  223. package/dist/shims/app-router-scroll-state.d.ts +1 -0
  224. package/dist/shims/app-router-scroll-state.js +1 -0
  225. package/dist/shims/app-router-scroll.js +2 -1
  226. package/dist/shims/cache-handler.js +8 -1
  227. package/dist/shims/cache.js +22 -15
  228. package/dist/shims/cdn-cache.js +1 -1
  229. package/dist/shims/dynamic-preload-chunks.js +2 -1
  230. package/dist/shims/fetch-cache.d.ts +3 -1
  231. package/dist/shims/fetch-cache.js +77 -52
  232. package/dist/shims/form.d.ts +4 -2
  233. package/dist/shims/form.js +37 -43
  234. package/dist/shims/headers.d.ts +7 -1
  235. package/dist/shims/headers.js +17 -3
  236. package/dist/shims/image.js +75 -14
  237. package/dist/shims/internal/app-prefetch-fetch-queue.d.ts +10 -0
  238. package/dist/shims/internal/app-prefetch-fetch-queue.js +61 -0
  239. package/dist/shims/internal/app-route-detection.d.ts +2 -17
  240. package/dist/shims/internal/app-route-detection.js +4 -17
  241. package/dist/shims/internal/hybrid-client-route-owner-direct.d.ts +23 -0
  242. package/dist/shims/internal/hybrid-client-route-owner-direct.js +51 -0
  243. package/dist/shims/internal/hybrid-client-route-owner.d.ts +3 -15
  244. package/dist/shims/internal/hybrid-client-route-owner.js +40 -58
  245. package/dist/shims/internal/pages-data-fetch-dedup.d.ts +10 -5
  246. package/dist/shims/internal/pages-data-fetch-dedup.js +84 -14
  247. package/dist/shims/internal/pages-data-target.d.ts +18 -12
  248. package/dist/shims/internal/pages-data-target.js +97 -13
  249. package/dist/shims/internal/pages-router-components.d.ts +7 -0
  250. package/dist/shims/internal/pages-router-components.js +13 -0
  251. package/dist/shims/layout-segment-context.d.ts +4 -1
  252. package/dist/shims/layout-segment-context.js +18 -4
  253. package/dist/shims/link.d.ts +1 -1
  254. package/dist/shims/link.js +224 -58
  255. package/dist/shims/navigation.d.ts +19 -3
  256. package/dist/shims/navigation.js +245 -47
  257. package/dist/shims/request-context.js +18 -0
  258. package/dist/shims/root-params.d.ts +15 -1
  259. package/dist/shims/root-params.js +21 -1
  260. package/dist/shims/router.d.ts +5 -7
  261. package/dist/shims/router.js +387 -102
  262. package/dist/shims/server.js +3 -2
  263. package/dist/shims/slot.js +3 -6
  264. package/dist/shims/unified-request-context.js +1 -0
  265. package/dist/typegen.js +1 -1
  266. package/dist/utils/client-runtime-metadata.d.ts +2 -18
  267. package/dist/utils/client-runtime-metadata.js +31 -22
  268. package/dist/utils/dev-stack-sourcemap-endpoint.d.ts +4 -0
  269. package/dist/{server → utils}/dev-stack-sourcemap-endpoint.js +1 -1
  270. package/dist/utils/domain-locale.d.ts +6 -3
  271. package/dist/{server → utils}/middleware-request-headers.d.ts +1 -1
  272. package/dist/{server → utils}/middleware-request-headers.js +3 -3
  273. package/dist/utils/project.d.ts +48 -2
  274. package/dist/utils/project.js +225 -4
  275. package/dist/utils/protocol-headers.d.ts +23 -0
  276. package/dist/utils/protocol-headers.js +23 -0
  277. package/dist/utils/react-version.d.ts +4 -0
  278. package/dist/utils/react-version.js +44 -0
  279. package/dist/utils/vite-version.d.ts +2 -0
  280. package/dist/utils/vite-version.js +11 -1
  281. package/package.json +47 -2
  282. package/dist/deploy.d.ts +0 -197
  283. package/dist/deploy.js +0 -1040
  284. package/dist/server/dev-stack-sourcemap-endpoint.d.ts +0 -4
  285. /package/dist/{cloudflare → packages/cloudflare}/src/utils/cache-control-metadata.js +0 -0
@@ -1,7 +1,8 @@
1
1
  import { createRequestContext, runWithRequestContext } from "../shims/unified-request-context.js";
2
2
  import { addBasePathToPathname, hasBasePath, stripBasePath } from "../utils/base-path.js";
3
3
  import { getRequestExecutionContext } from "../shims/request-context.js";
4
- import { ACTION_REVALIDATED_HEADER, VINEXT_MW_CTX_HEADER, VINEXT_PRERENDER_ROUTE_PARAMS_HEADER } from "./headers.js";
4
+ import { VINEXT_MW_CTX_HEADER, VINEXT_PRERENDER_ROUTE_PARAMS_HEADER, VINEXT_PRERENDER_SPECULATIVE_HEADER } from "../utils/protocol-headers.js";
5
+ import { ACTION_REVALIDATED_HEADER } from "./headers.js";
5
6
  import { isExternalUrl, matchRedirect, matchRewrite, preserveRedirectDestinationQuery, proxyExternalRequest, requestContextFromRequest, sanitizeDestination } from "../config/config-matchers.js";
6
7
  import { notFoundResponse } from "./http-error-responses.js";
7
8
  import { applyConfigHeadersToResponse, cloneRequestWithHeaders, cloneRequestWithUrl, filterInternalHeaders, normalizeTrailingSlash, resolvePublicFileRoute } from "./request-pipeline.js";
@@ -10,18 +11,20 @@ import { ensureFetchPatch, setCurrentFetchSoftTags } from "../shims/fetch-cache.
10
11
  import { mergeRewriteQuery } from "../utils/query.js";
11
12
  import { getScriptNonceFromHeaderSources } from "./csp.js";
12
13
  import { normalizeDefaultLocalePathname } from "./pages-i18n.js";
14
+ import { buildNextDataNotFoundResponse, normalizePagesDataRequest } from "./pages-data-route.js";
13
15
  import { DEFAULT_DEVICE_SIZES, DEFAULT_IMAGE_SIZES, isImageOptimizationPath, resolveDevImageRedirect } from "./image-optimization.js";
14
16
  import { VINEXT_RSC_CACHE_BUSTING_SEARCH_PARAM, createRscRedirectLocation, hasRscCacheBustingSearchParam, resolveInvalidRscCacheBustingRequest, stripRscCacheBustingSearchParam, stripRscSuffix } from "./app-rsc-cache-busting.js";
15
17
  import { mergeMiddlewareResponseHeaders } from "./middleware-response-headers.js";
16
18
  import "./app-page-response.js";
17
- import { buildNextDataNotFoundResponse, normalizePagesDataRequest } from "./pages-data-route.js";
19
+ import { parseNextHttpErrorDigest } from "./next-error-digest.js";
18
20
  import { matchPrerenderRouteParamsPayload, readTrustedPrerenderRouteParams, serializePrerenderRouteParamsHeader } from "./prerender-route-params.js";
19
21
  import { getRenderedConcreteUrlPathsForRoute } from "./pregenerated-concrete-paths.js";
20
22
  import { pickRootParams, setRootParams } from "../shims/root-params.js";
21
- import { flattenErrorCauses } from "../utils/error-cause.js";
22
23
  import { createServerActionNotFoundResponse, getServerActionNotFoundMessage } from "./server-action-not-found.js";
23
24
  import { buildPageCacheTags } from "./implicit-tags.js";
24
25
  import { buildPostMwRequestContext } from "./app-post-middleware-context.js";
26
+ import { createRouteTreePrefetchResponse, isRouteTreePrefetchRequest } from "./app-route-tree-prefetch.js";
27
+ import { flattenErrorCauses } from "../utils/error-cause.js";
25
28
  import { finalizeAppRscResponse } from "./app-rsc-response-finalizer.js";
26
29
  import { normalizeRscRequest } from "./app-rsc-request-normalization.js";
27
30
  import { runWithPrerenderWorkUnit } from "./prerender-work-unit-setup.js";
@@ -53,8 +56,8 @@ function createMissingServerActionResponse(options, actionId) {
53
56
  options.clearRequestContext();
54
57
  return createServerActionNotFoundResponse();
55
58
  }
56
- function redirectDestinationWithBasePath(destination, basePath) {
57
- if (!basePath || isExternalUrl(destination) || hasBasePath(destination, basePath)) return destination;
59
+ function redirectDestinationWithBasePath(destination, basePath, hadBasePath) {
60
+ if (!basePath || !hadBasePath || isExternalUrl(destination) || hasBasePath(destination, basePath)) return destination;
58
61
  return basePath + destination;
59
62
  }
60
63
  async function applyRewrite(options, cleanPathname) {
@@ -111,15 +114,22 @@ function requestWithoutRscSuffix(request) {
111
114
  url.pathname = pathname;
112
115
  return cloneRequestWithUrl(request.body ? request.clone() : request, url.toString());
113
116
  }
114
- async function handleAppRscRequest(options, request, preMiddlewareRequestContext, isDataRequest, pagesDataRequest) {
117
+ async function handleAppRscRequest(options, request, preMiddlewareRequestContext, isDataRequest, isMiddlewareDataRequest, pagesDataRequest) {
115
118
  const handlerStart = process.env.NODE_ENV !== "production" ? performance.now() : 0;
116
119
  if (process.env.NODE_ENV !== "production") {
117
120
  const originBlock = options.validateDevRequestOrigin?.(request);
118
121
  if (originBlock) return originBlock;
119
122
  }
120
- const normalized = normalizeRscRequest(request, options.basePath);
123
+ const canHandleOutsideBasePath = Boolean(options.runMiddleware) || [
124
+ ...options.configRedirects,
125
+ ...options.configRewrites.beforeFiles,
126
+ ...options.configRewrites.afterFiles,
127
+ ...options.configRewrites.fallback,
128
+ ...options.configHeaders
129
+ ].some((rule) => rule.basePath === false);
130
+ const normalized = normalizeRscRequest(request, options.basePath, canHandleOutsideBasePath);
121
131
  if (normalized instanceof Response) return normalized;
122
- const { url, isRscRequest, interceptionContextHeader, mountedSlotsHeader, renderMode, clientReuseManifest } = normalized;
132
+ const { url, isRscRequest, interceptionContextHeader, mountedSlotsHeader, renderMode, clientReuseManifest, hadBasePath } = normalized;
123
133
  let { pathname, cleanPathname } = normalized;
124
134
  let resolvedUrl = cleanPathname + url.search;
125
135
  const originalResolvedUrl = resolvedUrl;
@@ -127,7 +137,7 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
127
137
  const canonicalPathname = cleanPathname;
128
138
  const basePathState = {
129
139
  basePath: options.basePath,
130
- hadBasePath: true
140
+ hadBasePath
131
141
  };
132
142
  if (pathname === "/__vinext/prerender/static-params" || pathname === "/__vinext/prerender/pages-static-paths") {
133
143
  const { handleAppPrerenderEndpoint } = await import("./app-prerender-endpoints.js");
@@ -142,26 +152,22 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
142
152
  });
143
153
  if (prerenderEndpointResponse) return prerenderEndpointResponse;
144
154
  }
145
- const trailingSlashRedirect = normalizeTrailingSlash(pathname, options.basePath, options.trailingSlash, url.search);
155
+ const trailingSlashRedirect = normalizeTrailingSlash(pathname, hadBasePath ? options.basePath : "", options.trailingSlash, url.search);
146
156
  if (trailingSlashRedirect) return trailingSlashRedirect;
147
157
  const matchPathname = (p) => normalizeDefaultLocalePathname(p, options.i18nConfig, { hostname: url.hostname });
148
158
  const redirect = matchRedirect(matchPathname(stripRscSuffix(pathname)), options.configRedirects, preMiddlewareRequestContext, basePathState);
149
159
  if (redirect) {
150
- const destination = sanitizeDestination(redirectDestinationWithBasePath(redirect.destination, options.basePath));
160
+ const destination = sanitizeDestination(redirectDestinationWithBasePath(redirect.destination, options.basePath, hadBasePath));
151
161
  const location = isRscRequest && request.headers.get("RSC") === "1" ? await createRscRedirectLocation(destination, request) : preserveRedirectDestinationQuery(destination, url.search);
152
- if (isDataRequest) return new Response(null, {
153
- status: 200,
154
- headers: { "x-nextjs-redirect": location }
155
- });
156
162
  return new Response(null, {
157
163
  status: redirect.permanent ? 308 : 307,
158
164
  headers: { Location: location }
159
165
  });
160
166
  }
161
- const rscCacheBustingRedirect = await resolveInvalidRscCacheBustingRequest({
167
+ const rscCacheBustingRedirect = hadBasePath ? await resolveInvalidRscCacheBustingRequest({
162
168
  isRscRequest,
163
169
  request
164
- });
170
+ }) : null;
165
171
  if (rscCacheBustingRedirect) return rscCacheBustingRedirect;
166
172
  const normalizedUserlandRequest = requestWithoutRscSuffix(request);
167
173
  const userlandRequest = requestWithoutRscCacheBustingSearchParam(normalizedUserlandRequest);
@@ -171,11 +177,13 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
171
177
  status: null
172
178
  };
173
179
  let didMiddlewareRewrite = false;
180
+ let didMiddlewareRewritePathname = false;
174
181
  if (options.runMiddleware) {
175
182
  const middlewareResult = await options.runMiddleware({
176
183
  cleanPathname,
177
184
  context: middlewareContext,
178
- isDataRequest,
185
+ hadBasePath,
186
+ isDataRequest: isMiddlewareDataRequest,
179
187
  request: userlandRequest
180
188
  });
181
189
  if (middlewareResult.kind === "response") return applyConfigHeadersToMiddlewareRedirect(middlewareResult.response, {
@@ -185,12 +193,21 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
185
193
  requestContext: preMiddlewareRequestContext
186
194
  });
187
195
  cleanPathname = middlewareResult.cleanPathname;
188
- didMiddlewareRewrite = cleanPathname !== normalized.cleanPathname;
196
+ didMiddlewareRewrite = middlewareResult.rewritten;
197
+ didMiddlewareRewritePathname = cleanPathname !== normalized.cleanPathname;
189
198
  if (middlewareResult.search !== null) url.search = middlewareResult.search;
190
199
  resolvedUrl = cleanPathname + url.search;
191
200
  }
192
201
  const scriptNonce = getScriptNonceFromHeaderSources(request.headers, middlewareContext.headers);
193
202
  const postMiddlewareRequestContext = buildPostMwRequestContext(userlandRequest);
203
+ let filesystemRouteEligible = hadBasePath || didMiddlewareRewrite;
204
+ const validateClaimedOutsideBasePathRsc = async () => {
205
+ if (hadBasePath || !filesystemRouteEligible) return null;
206
+ return resolveInvalidRscCacheBustingRequest({
207
+ isRscRequest,
208
+ request
209
+ });
210
+ };
194
211
  for (const rewrite of options.configRewrites.beforeFiles) {
195
212
  const beforeFilesRewrite = await applyRewrite({
196
213
  basePathState,
@@ -203,14 +220,60 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
203
220
  if (beforeFilesRewrite) {
204
221
  resolvedUrl = mergeRewriteQuery(resolvedUrl, beforeFilesRewrite);
205
222
  cleanPathname = pathnameForResolvedUrl(resolvedUrl);
223
+ filesystemRouteEligible = true;
206
224
  }
207
225
  }
208
- if (isImageOptimizationPath(cleanPathname)) {
226
+ const claimedRscCacheBustingRedirect = await validateClaimedOutsideBasePathRsc();
227
+ if (claimedRscCacheBustingRedirect) return claimedRscCacheBustingRedirect;
228
+ const actionId = request.headers.get("x-rsc-action") ?? request.headers.get("next-action");
229
+ const isPostRequest = request.method.toUpperCase() === "POST";
230
+ const contentType = request.headers.get("content-type") || "";
231
+ const isProgressiveActionRequest = isPostRequest && !actionId && contentType.startsWith("multipart/form-data");
232
+ let resolvedLateRewritesForAction = false;
233
+ if (!filesystemRouteEligible && (actionId || isProgressiveActionRequest)) {
234
+ let actionMatch = null;
235
+ for (const rewrite of options.configRewrites.afterFiles) {
236
+ const rewritten = await applyRewrite({
237
+ basePathState,
238
+ clearRequestContext: options.clearRequestContext,
239
+ request: normalizedUserlandRequest,
240
+ requestContext: requestContextForResolvedUrl(postMiddlewareRequestContext, resolvedUrl, url),
241
+ rewrites: [rewrite]
242
+ }, matchPathname(cleanPathname));
243
+ if (rewritten instanceof Response) return rewritten;
244
+ if (!rewritten) continue;
245
+ resolvedUrl = mergeRewriteQuery(resolvedUrl, rewritten);
246
+ cleanPathname = pathnameForResolvedUrl(resolvedUrl);
247
+ filesystemRouteEligible = true;
248
+ actionMatch = options.matchRoute(cleanPathname);
249
+ if (actionMatch) break;
250
+ }
251
+ if (!actionMatch) for (const rewrite of options.configRewrites.fallback) {
252
+ const rewritten = await applyRewrite({
253
+ basePathState,
254
+ clearRequestContext: options.clearRequestContext,
255
+ request: normalizedUserlandRequest,
256
+ requestContext: requestContextForResolvedUrl(postMiddlewareRequestContext, resolvedUrl, url),
257
+ rewrites: [rewrite]
258
+ }, matchPathname(cleanPathname));
259
+ if (rewritten instanceof Response) return rewritten;
260
+ if (!rewritten) continue;
261
+ resolvedUrl = mergeRewriteQuery(resolvedUrl, rewritten);
262
+ cleanPathname = pathnameForResolvedUrl(resolvedUrl);
263
+ filesystemRouteEligible = true;
264
+ actionMatch = options.matchRoute(cleanPathname);
265
+ if (actionMatch) break;
266
+ }
267
+ resolvedLateRewritesForAction = filesystemRouteEligible;
268
+ }
269
+ const lateActionRscCacheBustingRedirect = await validateClaimedOutsideBasePathRsc();
270
+ if (lateActionRscCacheBustingRedirect) return lateActionRscCacheBustingRedirect;
271
+ if (filesystemRouteEligible && isImageOptimizationPath(cleanPathname)) {
209
272
  const imageRedirect = resolveDevImageRedirect(url, [...options.imageConfig?.deviceSizes ?? DEFAULT_DEVICE_SIZES, ...options.imageConfig?.imageSizes ?? DEFAULT_IMAGE_SIZES], options.imageConfig?.qualities, { isDev: options.isDev });
210
273
  if (!imageRedirect) return new Response("Invalid image optimization parameters", { status: 400 });
211
274
  return Response.redirect(new URL(imageRedirect, url.origin).href, 302);
212
275
  }
213
- if (options.handleMetadataRouteRequest) {
276
+ if (filesystemRouteEligible && options.handleMetadataRouteRequest) {
214
277
  const metadataRouteResponse = await options.handleMetadataRouteRequest(cleanPathname);
215
278
  if (metadataRouteResponse) {
216
279
  applyConfigHeadersToResponse(metadataRouteResponse.headers, {
@@ -223,13 +286,13 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
223
286
  return applyMiddlewareContextToResponse(metadataRouteResponse, middlewareContext);
224
287
  }
225
288
  }
226
- const publicFileResponse = resolvePublicFileRoute({
289
+ const publicFileResponse = filesystemRouteEligible ? resolvePublicFileRoute({
227
290
  cleanPathname,
228
291
  middlewareContext,
229
292
  pathname,
230
293
  publicFiles: options.publicFiles,
231
294
  request
232
- });
295
+ }) : null;
233
296
  if (publicFileResponse) {
234
297
  options.clearRequestContext();
235
298
  return publicFileResponse;
@@ -243,13 +306,22 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
243
306
  searchParams: getResolvedSearchParams(),
244
307
  params: {}
245
308
  });
246
- const preActionMatch = options.matchRoute(cleanPathname);
309
+ const preActionMatch = filesystemRouteEligible ? options.matchRoute(cleanPathname) : null;
247
310
  if (preActionMatch) setRootParams(pickRootParams(preActionMatch.params, preActionMatch.route.rootParamNames));
248
- const actionId = request.headers.get("x-rsc-action") ?? request.headers.get("next-action");
249
- const contentType = request.headers.get("content-type") || "";
250
- const isPostRequest = request.method.toUpperCase() === "POST";
311
+ if (pagesDataRequest && didMiddlewareRewritePathname && preActionMatch) {
312
+ const headers = new Headers();
313
+ mergeMiddlewareResponseHeaders(headers, middlewareContext.headers);
314
+ headers.set("content-type", "application/json");
315
+ headers.set("x-nextjs-rewrite", resolvedUrl);
316
+ options.clearRequestContext();
317
+ return new Response("{}", { headers });
318
+ }
319
+ if (!filesystemRouteEligible && isPostRequest && actionId) {
320
+ options.clearRequestContext();
321
+ return notFoundResponse();
322
+ }
251
323
  let progressiveActionResult = null;
252
- if (isPostRequest && contentType.startsWith("multipart/form-data") && !actionId) {
324
+ if (filesystemRouteEligible && isPostRequest && contentType.startsWith("multipart/form-data") && !actionId) {
253
325
  if (options.handleProgressiveActionRequest) progressiveActionResult = await options.handleProgressiveActionRequest({
254
326
  actionId,
255
327
  cleanPathname,
@@ -266,7 +338,11 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
266
338
  const failedProgressiveActionResult = progressiveActionFormState && "actionError" in progressiveActionFormState ? progressiveActionFormState : null;
267
339
  const actionFailed = failedProgressiveActionResult !== null;
268
340
  const actionError = failedProgressiveActionResult?.actionError;
269
- const serverActionResponse = isPostRequest && actionId && options.handleServerActionRequest ? await options.handleServerActionRequest({
341
+ const actionErrorDigest = actionError && typeof actionError === "object" && "digest" in actionError ? String(actionError.digest) : null;
342
+ const actionHttpFallbackStatus = actionErrorDigest ? parseNextHttpErrorDigest(actionErrorDigest)?.status ?? null : null;
343
+ const normalizedProgressiveActionError = actionHttpFallbackStatus === null || actionHttpFallbackStatus === 404 ? actionError : { digest: "NEXT_NOT_FOUND" };
344
+ if (actionFailed && middlewareContext.status === null && actionHttpFallbackStatus === null) middlewareContext.status = 500;
345
+ const serverActionResponse = filesystemRouteEligible && isPostRequest && actionId && options.handleServerActionRequest ? await options.handleServerActionRequest({
270
346
  actionId,
271
347
  cleanPathname,
272
348
  contentType,
@@ -278,12 +354,13 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
278
354
  searchParams: getResolvedSearchParams()
279
355
  }) : null;
280
356
  if (serverActionResponse) return serverActionResponse;
281
- if (isPostRequest && actionId && !options.handleServerActionRequest) return createMissingServerActionResponse(options, actionId);
357
+ if (filesystemRouteEligible && isPostRequest && actionId && !options.handleServerActionRequest) return createMissingServerActionResponse(options, actionId);
282
358
  let match = preActionMatch;
283
359
  const renderPagesForMatchKind = async (matchKind) => {
360
+ if (!filesystemRouteEligible) return null;
284
361
  const response = match === null || match.route.isDynamic ? await options.renderPagesFallback?.({
285
362
  appRouteMatch: match ?? null,
286
- allowRscDocumentFallback: didMiddlewareRewrite,
363
+ allowRscDocumentFallback: didMiddlewareRewritePathname,
287
364
  isDataRequest,
288
365
  isRscRequest,
289
366
  matchKind,
@@ -307,7 +384,7 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
307
384
  options.clearRequestContext();
308
385
  return staticPagesFallbackResponse;
309
386
  }
310
- if (!match || match.route.isDynamic) for (const rewrite of options.configRewrites.afterFiles) {
387
+ if (!resolvedLateRewritesForAction && (!match || match.route.isDynamic)) for (const rewrite of options.configRewrites.afterFiles) {
311
388
  const afterFilesRewrite = await applyRewrite({
312
389
  basePathState,
313
390
  clearRequestContext: options.clearRequestContext,
@@ -319,6 +396,9 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
319
396
  if (!afterFilesRewrite) continue;
320
397
  resolvedUrl = mergeRewriteQuery(resolvedUrl, afterFilesRewrite);
321
398
  cleanPathname = pathnameForResolvedUrl(resolvedUrl);
399
+ filesystemRouteEligible = true;
400
+ const claimedRscCacheBustingRedirect = await validateClaimedOutsideBasePathRsc();
401
+ if (claimedRscCacheBustingRedirect) return claimedRscCacheBustingRedirect;
322
402
  match = options.matchRoute(cleanPathname);
323
403
  const rewrittenStaticPagesResponse = await renderPagesForMatchKind("static");
324
404
  if (rewrittenStaticPagesResponse) {
@@ -337,7 +417,7 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
337
417
  options.clearRequestContext();
338
418
  return dynamicPagesFallbackResponse;
339
419
  }
340
- if (!match) for (const rewrite of options.configRewrites.fallback) {
420
+ if (!resolvedLateRewritesForAction && !match) for (const rewrite of options.configRewrites.fallback) {
341
421
  const fallbackRewrite = await applyRewrite({
342
422
  basePathState,
343
423
  clearRequestContext: options.clearRequestContext,
@@ -349,6 +429,9 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
349
429
  if (!fallbackRewrite) continue;
350
430
  resolvedUrl = mergeRewriteQuery(resolvedUrl, fallbackRewrite);
351
431
  cleanPathname = pathnameForResolvedUrl(resolvedUrl);
432
+ filesystemRouteEligible = true;
433
+ const claimedRscCacheBustingRedirect = await validateClaimedOutsideBasePathRsc();
434
+ if (claimedRscCacheBustingRedirect) return claimedRscCacheBustingRedirect;
352
435
  match = options.matchRoute(cleanPathname);
353
436
  const rewrittenStaticPagesResponse = await renderPagesForMatchKind("static");
354
437
  if (rewrittenStaticPagesResponse) {
@@ -362,8 +445,24 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
362
445
  }
363
446
  if (match) break;
364
447
  }
448
+ if (!filesystemRouteEligible) {
449
+ options.clearRequestContext();
450
+ const headers = new Headers();
451
+ mergeMiddlewareResponseHeaders(headers, middlewareContext.headers);
452
+ return notFoundResponse({ headers });
453
+ }
365
454
  if (pagesDataRequest) {
366
455
  options.clearRequestContext();
456
+ if (options.runMiddleware && (middlewareContext.status === null || middlewareContext.status === 200 || middlewareContext.status === 404)) {
457
+ const response = buildNextDataNotFoundResponse();
458
+ const headers = new Headers(response.headers);
459
+ headers.set("x-nextjs-matched-path", matchPathname(canonicalPathname));
460
+ if (resolvedUrl !== originalResolvedUrl) headers.set("x-nextjs-rewrite", resolvedUrl);
461
+ return new Response("{}", {
462
+ status: 200,
463
+ headers
464
+ });
465
+ }
367
466
  return buildNextDataNotFoundResponse();
368
467
  }
369
468
  if (!match) {
@@ -386,11 +485,19 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
386
485
  }
387
486
  const { route, params } = match;
388
487
  if (options.ensureRouteLoaded) await options.ensureRouteLoaded(route);
488
+ const resolvedSearchParams = getResolvedSearchParams();
489
+ if (isRouteTreePrefetchRequest(request) && !route.routeHandler) {
490
+ const response = await createRouteTreePrefetchResponse(route, {
491
+ buildId: options.buildId,
492
+ prefetchInlining: options.prefetchInlining
493
+ });
494
+ options.clearRequestContext();
495
+ return applyMiddlewareContextToResponse(response, middlewareContext);
496
+ }
389
497
  const prerenderRouteParamsMatch = matchPrerenderRouteParamsPayload(readTrustedPrerenderRouteParams(request), route.pattern, params);
390
498
  const prerenderRouteParams = prerenderRouteParamsMatch?.params ?? null;
391
499
  const isPrerenderFallbackShell = prerenderRouteParamsMatch?.kind === "fallback-shell";
392
500
  const renderParams = prerenderRouteParams ?? params;
393
- const resolvedSearchParams = getResolvedSearchParams();
394
501
  let runtimeFallbackShells = [];
395
502
  if (options.createPprFallbackShells && request.method === "GET" && !isRscRequest && !isPrerenderFallbackShell && route.params) runtimeFallbackShells = options.createPprFallbackShells({
396
503
  params: route.params,
@@ -425,7 +532,7 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
425
532
  cleanPathname,
426
533
  displayPathname: canonicalPathname,
427
534
  formState,
428
- actionError,
535
+ actionError: normalizedProgressiveActionError,
429
536
  actionFailed,
430
537
  handlerStart,
431
538
  interceptionContext: interceptionContextHeader,
@@ -444,6 +551,7 @@ async function handleAppRscRequest(options, request, preMiddlewareRequestContext
444
551
  staticParamsValidationParams: prerenderRouteParams === null || isPrerenderFallbackShell ? void 0 : params,
445
552
  rootParams,
446
553
  request,
554
+ renderedPathAndSearch: resolvedUrl,
447
555
  route,
448
556
  scriptNonce,
449
557
  searchParams: resolvedSearchParams,
@@ -489,19 +597,20 @@ function createAppRscHandler(options) {
489
597
  options.registerCacheAdapters();
490
598
  await options.ensureInstrumentation?.();
491
599
  const mwCtx = rawRequest.headers.get(VINEXT_MW_CTX_HEADER);
492
- const hasDataRequestHeader = rawRequest.headers.get("x-nextjs-data") === "1";
493
600
  const pagesDataUrl = new URL(rawRequest.url);
494
601
  const pagesDataInScope = !options.basePath || hasBasePath(pagesDataUrl.pathname, options.basePath);
495
602
  if (pagesDataInScope) pagesDataUrl.pathname = stripBasePath(pagesDataUrl.pathname, options.basePath);
496
603
  const pagesDataCandidate = pagesDataInScope ? cloneRequestWithUrl(rawRequest, pagesDataUrl.toString()) : null;
497
- const pagesDataNormalization = options.renderPagesFallback && pagesDataCandidate ? normalizePagesDataRequest(pagesDataCandidate, options.buildId) : null;
604
+ const pagesDataNormalization = options.renderPagesFallback && pagesDataCandidate ? normalizePagesDataRequest(pagesDataCandidate, options.buildId, "", typeof options.runMiddleware === "function" && options.trailingSlash) : null;
498
605
  if (pagesDataNormalization?.notFoundResponse) return pagesDataNormalization.notFoundResponse;
499
- const isDataRequest = hasDataRequestHeader || pagesDataNormalization?.isDataReq === true;
606
+ const isPagesDataRequest = pagesDataNormalization?.isDataReq === true;
500
607
  const prerenderRouteParamsPayload = readTrustedPrerenderRouteParams(rawRequest);
608
+ const isTrustedSpeculativePrerender = process.env.VINEXT_PRERENDER === "1" && rawRequest.headers.get("x-vinext-prerender-secret") !== null && rawRequest.headers.get("x-vinext-prerender-speculative") === "1";
501
609
  const filteredHeaders = filterInternalHeaders(rawRequest.headers);
502
610
  if (mwCtx !== null) filteredHeaders.set(VINEXT_MW_CTX_HEADER, mwCtx);
503
611
  const prerenderRouteParamsHeader = serializePrerenderRouteParamsHeader(prerenderRouteParamsPayload);
504
612
  if (prerenderRouteParamsHeader !== null) filteredHeaders.set(VINEXT_PRERENDER_ROUTE_PARAMS_HEADER, prerenderRouteParamsHeader);
613
+ if (isTrustedSpeculativePrerender) filteredHeaders.set(VINEXT_PRERENDER_SPECULATIVE_HEADER, "1");
505
614
  let appRequest = rawRequest;
506
615
  if (pagesDataNormalization?.isDataReq) {
507
616
  const appRequestUrl = new URL(pagesDataNormalization.request.url);
@@ -520,7 +629,7 @@ function createAppRscHandler(options) {
520
629
  const preMiddlewareRequestContext = requestContextFromRequest(request);
521
630
  let response;
522
631
  try {
523
- response = await handleAppRscRequest(options, request, preMiddlewareRequestContext, isDataRequest, pagesDataRequest);
632
+ response = await handleAppRscRequest(options, request, preMiddlewareRequestContext, isPagesDataRequest, isPagesDataRequest, pagesDataRequest);
524
633
  } catch (error) {
525
634
  if (process.env.NODE_ENV !== "production") flattenErrorCauses(error);
526
635
  throw error;
@@ -1,6 +1,7 @@
1
1
  //#region src/server/app-rsc-render-mode.d.ts
2
- type AppRscRenderMode = "navigation" | "prefetch-loading-shell" | "refresh-preserve-ui" | "action-rerender-preserve-ui";
2
+ type AppRscRenderMode = "navigation" | "prefetch-dynamic-shell" | "prefetch-loading-shell" | "refresh-preserve-ui" | "action-rerender-preserve-ui";
3
3
  declare const APP_RSC_RENDER_MODE_NAVIGATION = "navigation";
4
+ declare const APP_RSC_RENDER_MODE_PREFETCH_DYNAMIC_SHELL = "prefetch-dynamic-shell";
4
5
  declare const APP_RSC_RENDER_MODE_PREFETCH_LOADING_SHELL = "prefetch-loading-shell";
5
6
  declare const APP_RSC_RENDER_MODE_REFRESH_PRESERVE_UI = "refresh-preserve-ui";
6
7
  declare const APP_RSC_RENDER_MODE_ACTION_RERENDER_PRESERVE_UI = "action-rerender-preserve-ui";
@@ -8,4 +9,4 @@ declare function shouldSuppressLoadingBoundaries(mode: AppRscRenderMode): boolea
8
9
  declare function getRscRenderModeCacheVariant(mode: AppRscRenderMode): string | null;
9
10
  declare function parseAppRscRenderMode(value: string | null): AppRscRenderMode;
10
11
  //#endregion
11
- export { APP_RSC_RENDER_MODE_ACTION_RERENDER_PRESERVE_UI, APP_RSC_RENDER_MODE_NAVIGATION, APP_RSC_RENDER_MODE_PREFETCH_LOADING_SHELL, APP_RSC_RENDER_MODE_REFRESH_PRESERVE_UI, AppRscRenderMode, getRscRenderModeCacheVariant, parseAppRscRenderMode, shouldSuppressLoadingBoundaries };
12
+ export { APP_RSC_RENDER_MODE_ACTION_RERENDER_PRESERVE_UI, APP_RSC_RENDER_MODE_NAVIGATION, APP_RSC_RENDER_MODE_PREFETCH_DYNAMIC_SHELL, APP_RSC_RENDER_MODE_PREFETCH_LOADING_SHELL, APP_RSC_RENDER_MODE_REFRESH_PRESERVE_UI, AppRscRenderMode, getRscRenderModeCacheVariant, parseAppRscRenderMode, shouldSuppressLoadingBoundaries };
@@ -1,5 +1,6 @@
1
1
  //#region src/server/app-rsc-render-mode.ts
2
2
  const APP_RSC_RENDER_MODE_NAVIGATION = "navigation";
3
+ const APP_RSC_RENDER_MODE_PREFETCH_DYNAMIC_SHELL = "prefetch-dynamic-shell";
3
4
  const APP_RSC_RENDER_MODE_PREFETCH_LOADING_SHELL = "prefetch-loading-shell";
4
5
  const APP_RSC_RENDER_MODE_REFRESH_PRESERVE_UI = "refresh-preserve-ui";
5
6
  const APP_RSC_RENDER_MODE_ACTION_RERENDER_PRESERVE_UI = "action-rerender-preserve-ui";
@@ -10,11 +11,13 @@ function shouldUsePreserveUiCacheVariant(mode) {
10
11
  return shouldSuppressLoadingBoundaries(mode);
11
12
  }
12
13
  function getRscRenderModeCacheVariant(mode) {
14
+ if (mode === "prefetch-dynamic-shell") return "prefetch-dynamic-shell";
13
15
  if (mode === "prefetch-loading-shell") return "prefetch-loading-shell";
14
16
  return shouldUsePreserveUiCacheVariant(mode) ? "preserve-ui" : null;
15
17
  }
16
18
  function parseAppRscRenderMode(value) {
17
19
  switch (value) {
20
+ case APP_RSC_RENDER_MODE_PREFETCH_DYNAMIC_SHELL: return APP_RSC_RENDER_MODE_PREFETCH_DYNAMIC_SHELL;
18
21
  case APP_RSC_RENDER_MODE_PREFETCH_LOADING_SHELL: return APP_RSC_RENDER_MODE_PREFETCH_LOADING_SHELL;
19
22
  case APP_RSC_RENDER_MODE_REFRESH_PRESERVE_UI: return APP_RSC_RENDER_MODE_REFRESH_PRESERVE_UI;
20
23
  case APP_RSC_RENDER_MODE_ACTION_RERENDER_PRESERVE_UI: return APP_RSC_RENDER_MODE_ACTION_RERENDER_PRESERVE_UI;
@@ -22,4 +25,4 @@ function parseAppRscRenderMode(value) {
22
25
  }
23
26
  }
24
27
  //#endregion
25
- export { APP_RSC_RENDER_MODE_ACTION_RERENDER_PRESERVE_UI, APP_RSC_RENDER_MODE_NAVIGATION, APP_RSC_RENDER_MODE_PREFETCH_LOADING_SHELL, APP_RSC_RENDER_MODE_REFRESH_PRESERVE_UI, getRscRenderModeCacheVariant, parseAppRscRenderMode, shouldSuppressLoadingBoundaries };
28
+ export { APP_RSC_RENDER_MODE_ACTION_RERENDER_PRESERVE_UI, APP_RSC_RENDER_MODE_NAVIGATION, APP_RSC_RENDER_MODE_PREFETCH_DYNAMIC_SHELL, APP_RSC_RENDER_MODE_PREFETCH_LOADING_SHELL, APP_RSC_RENDER_MODE_REFRESH_PRESERVE_UI, getRscRenderModeCacheVariant, parseAppRscRenderMode, shouldSuppressLoadingBoundaries };
@@ -11,7 +11,8 @@ type NormalizedRscRequest = {
11
11
  interceptionContextHeader: string | null; /** Normalized x-vinext-mounted-slots header (deduplicated, sorted). null when absent or blank. */
12
12
  mountedSlotsHeader: string | null; /** Semantic RSC payload mode. HTML requests always normalize to "navigation". */
13
13
  renderMode: AppRscRenderMode; /** Parsed ClientReuseManifest hint. Verification and skip authorization happen later. */
14
- clientReuseManifest: ClientReuseManifestParseResult;
14
+ clientReuseManifest: ClientReuseManifestParseResult; /** Whether the incoming pathname included the configured basePath. */
15
+ hadBasePath: boolean;
15
16
  };
16
17
  /**
17
18
  * Normalize an App Router RSC request.
@@ -30,10 +31,9 @@ type NormalizedRscRequest = {
30
31
  * 4. Collapse double-slashes, resolve `.` and `..` segments (normalizePath)
31
32
  * 5. basePath check + strip — 404 when pathname lacks the basePath prefix.
32
33
  * `/__vinext/` bypasses this for internal prerender endpoints.
33
- * 6. RSC detection: `.rsc` suffix, or Next-style `RSC: 1` plus the internal
34
- * `_rsc` cache-busting query. The header alone does not select payload
35
- * rendering at the canonical HTML URL, so caches that ignore Vary cannot
36
- * store Flight responses under HTML URLs.
34
+ * 6. RSC detection: `.rsc` suffix or Next-style `RSC: 1`. The internal
35
+ * `_rsc` cache-busting query is validated separately so full-route Flight
36
+ * responses do not share the canonical HTML URL in caches that ignore Vary.
37
37
  * 7. cleanPathname — pathname with `.rsc` suffix stripped
38
38
  * 8. Sanitize X-Vinext-Interception-Context — strip null bytes (header injection)
39
39
  * 9. Normalize x-vinext-mounted-slots — dedup and sort for canonical cache keys
@@ -43,6 +43,6 @@ type NormalizedRscRequest = {
43
43
  * @returns A 400 or 404 Response for invalid or out-of-scope inputs,
44
44
  * or a NormalizedRscRequest for valid requests.
45
45
  */
46
- declare function normalizeRscRequest(request: Request, basePath: string): Response | NormalizedRscRequest;
46
+ declare function normalizeRscRequest(request: Request, basePath: string, allowOutsideBasePath?: boolean): Response | NormalizedRscRequest;
47
47
  //#endregion
48
48
  export { NormalizedRscRequest, normalizeMountedSlotsHeader, normalizeRscRequest };
@@ -27,10 +27,9 @@ import { normalizeInterceptionContextHeader } from "./app-interception-context-h
27
27
  * 4. Collapse double-slashes, resolve `.` and `..` segments (normalizePath)
28
28
  * 5. basePath check + strip — 404 when pathname lacks the basePath prefix.
29
29
  * `/__vinext/` bypasses this for internal prerender endpoints.
30
- * 6. RSC detection: `.rsc` suffix, or Next-style `RSC: 1` plus the internal
31
- * `_rsc` cache-busting query. The header alone does not select payload
32
- * rendering at the canonical HTML URL, so caches that ignore Vary cannot
33
- * store Flight responses under HTML URLs.
30
+ * 6. RSC detection: `.rsc` suffix or Next-style `RSC: 1`. The internal
31
+ * `_rsc` cache-busting query is validated separately so full-route Flight
32
+ * responses do not share the canonical HTML URL in caches that ignore Vary.
34
33
  * 7. cleanPathname — pathname with `.rsc` suffix stripped
35
34
  * 8. Sanitize X-Vinext-Interception-Context — strip null bytes (header injection)
36
35
  * 9. Normalize x-vinext-mounted-slots — dedup and sort for canonical cache keys
@@ -40,7 +39,7 @@ import { normalizeInterceptionContextHeader } from "./app-interception-context-h
40
39
  * @returns A 400 or 404 Response for invalid or out-of-scope inputs,
41
40
  * or a NormalizedRscRequest for valid requests.
42
41
  */
43
- function normalizeRscRequest(request, basePath) {
42
+ function normalizeRscRequest(request, basePath, allowOutsideBasePath = false) {
44
43
  const url = new URL(request.url);
45
44
  const protoGuard = guardProtocolRelativeUrl(url.pathname);
46
45
  if (protoGuard) return protoGuard;
@@ -51,17 +50,20 @@ function normalizeRscRequest(request, basePath) {
51
50
  return badRequestResponse();
52
51
  }
53
52
  let pathname = normalizePath(decoded);
53
+ let hadBasePath = true;
54
54
  if (basePath) {
55
- if (!hasBasePath(pathname, basePath) && !pathname.startsWith("/__vinext/")) return notFoundResponse();
56
- pathname = stripBasePath(pathname, basePath);
55
+ hadBasePath = hasBasePath(pathname, basePath);
56
+ if (!hadBasePath && !pathname.startsWith("/__vinext/") && !allowOutsideBasePath) return notFoundResponse();
57
+ if (hadBasePath) pathname = stripBasePath(pathname, basePath);
57
58
  }
58
- const isRscRequest = pathname.endsWith(".rsc") || request.headers.get("RSC") === "1" && url.searchParams.has("_rsc");
59
+ const isRscRequest = pathname.endsWith(".rsc") || request.headers.get("RSC") === "1";
59
60
  const cleanPathname = stripRscSuffix(pathname);
60
61
  const interceptionContextHeader = normalizeInterceptionContextHeader(request.headers.get(VINEXT_INTERCEPTION_CONTEXT_HEADER));
61
62
  const mountedSlotsHeader = normalizeMountedSlotsHeader(request.headers.get(VINEXT_MOUNTED_SLOTS_HEADER));
62
63
  const renderMode = isRscRequest ? parseAppRscRenderMode(request.headers.get(VINEXT_RSC_RENDER_MODE_HEADER)) : APP_RSC_RENDER_MODE_NAVIGATION;
63
64
  return {
64
65
  clientReuseManifest: isRscRequest ? parseClientReuseManifestHeader(request.headers.get(VINEXT_CLIENT_REUSE_MANIFEST_HEADER)) : { kind: "absent" },
66
+ hadBasePath,
65
67
  url,
66
68
  pathname,
67
69
  cleanPathname,
@@ -6,6 +6,7 @@ type AppRouteSegmentConfigModule = {
6
6
  dynamic?: unknown;
7
7
  dynamicParams?: unknown;
8
8
  fetchCache?: unknown;
9
+ generateStaticParams?: unknown;
9
10
  revalidate?: unknown;
10
11
  runtime?: unknown;
11
12
  unstable_dynamicStaleTime?: unknown;
@@ -18,11 +19,21 @@ type EffectiveAppPageSegmentConfig = {
18
19
  revalidateSeconds: number | null;
19
20
  runtime?: "edge" | "experimental-edge" | "nodejs";
20
21
  };
22
+ type ParallelAppPageSegmentConfigBranch = {
23
+ configLayouts?: readonly (AppRouteSegmentConfigModule | null | undefined)[] | null;
24
+ configLayoutTreePositions?: readonly number[] | null;
25
+ layout?: AppRouteSegmentConfigModule | null;
26
+ page?: AppRouteSegmentConfigModule | null;
27
+ routeSegments?: readonly string[] | null;
28
+ };
21
29
  type ResolveAppPageSegmentConfigOptions = {
22
30
  layouts?: readonly (AppRouteSegmentConfigModule | null | undefined)[];
31
+ layoutTreePositions?: readonly number[];
23
32
  page?: AppRouteSegmentConfigModule | null;
33
+ parallelBranches?: readonly (ParallelAppPageSegmentConfigBranch | null | undefined)[];
24
34
  parallelPages?: readonly (AppRouteSegmentConfigModule | null | undefined)[];
25
35
  parallelSegments?: readonly (AppRouteSegmentConfigModule | null | undefined)[];
36
+ routeSegments?: readonly string[];
26
37
  };
27
38
  /**
28
39
  * Resolve the route segment config that applies to an App page route.