vinext 0.1.7 → 0.2.0

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 (279) hide show
  1. package/README.md +51 -30
  2. package/dist/build/inject-pregenerated-paths.d.ts +4 -0
  3. package/dist/build/inject-pregenerated-paths.js +18 -0
  4. package/dist/build/layout-classification.js +1 -1
  5. package/dist/build/nitro-route-rules.js +1 -1
  6. package/dist/build/pages-client-assets-module.d.ts +11 -0
  7. package/dist/build/pages-client-assets-module.js +27 -0
  8. package/dist/build/prerender.d.ts +2 -1
  9. package/dist/build/prerender.js +13 -6
  10. package/dist/build/report.d.ts +13 -2
  11. package/dist/build/report.js +99 -2
  12. package/dist/build/run-prerender.d.ts +7 -0
  13. package/dist/build/run-prerender.js +10 -1
  14. package/dist/build/standalone.js +2 -0
  15. package/dist/cache/cache-adapters-virtual.js +3 -3
  16. package/dist/check.d.ts +18 -0
  17. package/dist/check.js +77 -19
  18. package/dist/cli-args.d.ts +1 -2
  19. package/dist/cli-args.js +1 -1
  20. package/dist/cli-dev-config.d.ts +12 -0
  21. package/dist/cli-dev-config.js +23 -0
  22. package/dist/cli.js +113 -97
  23. package/dist/{server → client}/dev-error-overlay-store.d.ts +1 -1
  24. package/dist/{server → client}/dev-error-overlay-store.js +1 -1
  25. package/dist/{server → client}/dev-error-overlay.d.ts +1 -1
  26. package/dist/{server → client}/dev-error-overlay.js +2 -2
  27. package/dist/client/navigation-runtime.d.ts +2 -0
  28. package/dist/client/navigation-runtime.js +3 -1
  29. package/dist/client/window-next.d.ts +2 -1
  30. package/dist/cloudflare/index.d.ts +2 -2
  31. package/dist/cloudflare/index.js +2 -2
  32. package/dist/config/config-matchers.js +14 -10
  33. package/dist/config/next-config.d.ts +6 -3
  34. package/dist/config/next-config.js +47 -1
  35. package/dist/config/prerender.d.ts +34 -0
  36. package/dist/config/prerender.js +55 -0
  37. package/dist/config/server-external-packages.d.ts +4 -0
  38. package/dist/config/server-external-packages.js +91 -0
  39. package/dist/entries/app-rsc-entry.d.ts +2 -1
  40. package/dist/entries/app-rsc-entry.js +89 -15
  41. package/dist/entries/app-rsc-manifest.js +10 -0
  42. package/dist/entries/pages-client-entry.d.ts +3 -0
  43. package/dist/entries/pages-client-entry.js +16 -1
  44. package/dist/entries/pages-server-entry.js +6 -2
  45. package/dist/image/image-adapters-virtual.d.ts +59 -0
  46. package/dist/image/image-adapters-virtual.js +59 -0
  47. package/dist/index.d.ts +33 -0
  48. package/dist/index.js +211 -118
  49. package/dist/init-cloudflare.d.ts +43 -0
  50. package/dist/init-cloudflare.js +839 -0
  51. package/dist/init-platform.d.ts +40 -0
  52. package/dist/init-platform.js +195 -0
  53. package/dist/init.d.ts +16 -38
  54. package/dist/init.js +208 -97
  55. package/dist/node_modules/.pnpm/am-i-vibing@0.5.0/node_modules/am-i-vibing/dist/detector-1yx2Hoe0.js +294 -0
  56. package/dist/node_modules/.pnpm/process-ancestry@0.1.0/node_modules/process-ancestry/dist/index.js +94 -0
  57. package/dist/{cloudflare → packages/cloudflare}/src/cache/cdn-adapter.runtime.js +1 -1
  58. package/dist/{cloudflare → packages/cloudflare}/src/cache/kv-data-adapter.runtime.d.ts +2 -2
  59. package/dist/{cloudflare → packages/cloudflare}/src/cache/kv-data-adapter.runtime.js +1 -1
  60. package/dist/packages/cloudflare/src/deploy-config.js +150 -0
  61. package/dist/packages/cloudflare/src/deploy-help.js +55 -0
  62. package/dist/packages/cloudflare/src/deploy.js +276 -0
  63. package/dist/{cloudflare → packages/cloudflare/src}/tpr.d.ts +4 -41
  64. package/dist/{cloudflare → packages/cloudflare/src}/tpr.js +18 -15
  65. package/dist/plugins/ast-scope.d.ts +16 -0
  66. package/dist/plugins/ast-scope.js +62 -0
  67. package/dist/plugins/ast-utils.d.ts +27 -1
  68. package/dist/plugins/ast-utils.js +32 -1
  69. package/dist/plugins/css-module-imports.d.ts +14 -0
  70. package/dist/plugins/css-module-imports.js +59 -0
  71. package/dist/plugins/extensionless-dynamic-import.js +2 -2
  72. package/dist/plugins/ignore-dynamic-requests.d.ts +11 -0
  73. package/dist/plugins/ignore-dynamic-requests.js +530 -0
  74. package/dist/plugins/middleware-server-only.d.ts +8 -6
  75. package/dist/plugins/middleware-server-only.js +8 -7
  76. package/dist/plugins/optimize-imports.js +1 -1
  77. package/dist/plugins/typeof-window.d.ts +1 -1
  78. package/dist/plugins/typeof-window.js +28 -56
  79. package/dist/routing/app-route-graph.d.ts +29 -4
  80. package/dist/routing/app-route-graph.js +182 -40
  81. package/dist/routing/app-router.d.ts +5 -0
  82. package/dist/routing/app-router.js +5 -0
  83. package/dist/routing/file-matcher.d.ts +8 -0
  84. package/dist/routing/file-matcher.js +10 -1
  85. package/dist/routing/pages-router.js +2 -2
  86. package/dist/server/api-handler.js +9 -14
  87. package/dist/server/app-browser-action-result.d.ts +4 -1
  88. package/dist/server/app-browser-action-result.js +8 -1
  89. package/dist/server/app-browser-entry.js +194 -190
  90. package/dist/server/app-browser-history-controller.d.ts +2 -1
  91. package/dist/server/app-browser-history-controller.js +6 -2
  92. package/dist/server/app-browser-interception-context.d.ts +1 -0
  93. package/dist/server/app-browser-interception-context.js +4 -2
  94. package/dist/server/app-browser-navigation-controller.d.ts +2 -0
  95. package/dist/server/app-browser-navigation-controller.js +60 -31
  96. package/dist/server/app-browser-server-action-client.d.ts +32 -0
  97. package/dist/server/app-browser-server-action-client.js +127 -0
  98. package/dist/server/app-browser-state.d.ts +11 -1
  99. package/dist/server/app-browser-state.js +25 -8
  100. package/dist/server/app-browser-visible-commit.d.ts +6 -1
  101. package/dist/server/app-browser-visible-commit.js +43 -25
  102. package/dist/server/app-elements-wire.d.ts +9 -2
  103. package/dist/server/app-elements-wire.js +8 -1
  104. package/dist/server/app-elements.d.ts +2 -2
  105. package/dist/server/app-elements.js +4 -3
  106. package/dist/server/app-fallback-renderer.d.ts +5 -2
  107. package/dist/server/app-fallback-renderer.js +15 -7
  108. package/dist/server/app-hydration-cache-publication.d.ts +11 -0
  109. package/dist/server/app-hydration-cache-publication.js +43 -0
  110. package/dist/server/app-middleware.d.ts +4 -3
  111. package/dist/server/app-middleware.js +8 -3
  112. package/dist/server/app-optimistic-routing.js +11 -4
  113. package/dist/server/app-page-boundary-render.d.ts +3 -0
  114. package/dist/server/app-page-boundary-render.js +14 -3
  115. package/dist/server/app-page-cache-finalizer.d.ts +1 -0
  116. package/dist/server/app-page-cache-finalizer.js +10 -3
  117. package/dist/server/app-page-cache-render.d.ts +1 -0
  118. package/dist/server/app-page-cache-render.js +8 -4
  119. package/dist/server/app-page-cache.d.ts +1 -0
  120. package/dist/server/app-page-cache.js +5 -2
  121. package/dist/server/app-page-dispatch.d.ts +33 -4
  122. package/dist/server/app-page-dispatch.js +63 -90
  123. package/dist/server/app-page-element-builder.d.ts +9 -2
  124. package/dist/server/app-page-element-builder.js +114 -23
  125. package/dist/server/app-page-head.d.ts +16 -1
  126. package/dist/server/app-page-head.js +44 -22
  127. package/dist/server/app-page-params.d.ts +2 -1
  128. package/dist/server/app-page-params.js +8 -1
  129. package/dist/server/app-page-ppr-runtime.d.ts +7 -0
  130. package/dist/server/app-page-ppr-runtime.js +70 -0
  131. package/dist/server/app-page-probe.d.ts +1 -0
  132. package/dist/server/app-page-probe.js +6 -1
  133. package/dist/server/app-page-render-identity.d.ts +1 -0
  134. package/dist/server/app-page-render-identity.js +1 -1
  135. package/dist/server/app-page-render.d.ts +4 -1
  136. package/dist/server/app-page-render.js +26 -3
  137. package/dist/server/app-page-request.d.ts +22 -1
  138. package/dist/server/app-page-request.js +92 -15
  139. package/dist/server/app-page-route-wiring.d.ts +14 -2
  140. package/dist/server/app-page-route-wiring.js +61 -25
  141. package/dist/server/app-page-search-params-observation.d.ts +4 -2
  142. package/dist/server/app-page-search-params-observation.js +11 -7
  143. package/dist/server/app-page-segment-state.d.ts +2 -1
  144. package/dist/server/app-page-segment-state.js +3 -1
  145. package/dist/server/app-page-stream.d.ts +5 -0
  146. package/dist/server/app-page-stream.js +3 -1
  147. package/dist/server/app-ppr-fallback-shell-render.d.ts +4 -3
  148. package/dist/server/app-route-handler-dispatch.js +1 -0
  149. package/dist/server/app-route-handler-execution.js +7 -2
  150. package/dist/server/app-route-handler-response.js +1 -0
  151. package/dist/server/app-route-handler-runtime.js +1 -1
  152. package/dist/server/app-route-module-loader.d.ts +2 -0
  153. package/dist/server/app-route-module-loader.js +1 -0
  154. package/dist/server/app-router-entry.js +16 -8
  155. package/dist/server/app-rsc-errors.js +7 -1
  156. package/dist/server/app-rsc-handler.d.ts +3 -1
  157. package/dist/server/app-rsc-handler.js +67 -39
  158. package/dist/server/app-rsc-request-normalization.d.ts +3 -2
  159. package/dist/server/app-rsc-request-normalization.js +6 -3
  160. package/dist/server/app-rsc-route-matching.d.ts +7 -0
  161. package/dist/server/app-rsc-route-matching.js +36 -3
  162. package/dist/server/app-segment-config.d.ts +12 -0
  163. package/dist/server/app-segment-config.js +91 -5
  164. package/dist/server/app-server-action-execution.d.ts +5 -0
  165. package/dist/server/app-server-action-execution.js +94 -33
  166. package/dist/server/app-ssr-entry.d.ts +3 -0
  167. package/dist/server/app-ssr-entry.js +19 -8
  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-static-generation.d.ts +1 -0
  171. package/dist/server/app-static-generation.js +1 -0
  172. package/dist/server/app-visited-response-cache.d.ts +6 -0
  173. package/dist/server/app-visited-response-cache.js +3 -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.js +19 -18
  179. package/dist/server/dev-stack-sourcemap.d.ts +1 -1
  180. package/dist/server/dev-stack-sourcemap.js +1 -1
  181. package/dist/server/fetch-handler.d.ts +2 -0
  182. package/dist/server/fetch-handler.js +18 -0
  183. package/dist/server/headers.d.ts +5 -15
  184. package/dist/server/headers.js +4 -15
  185. package/dist/server/image-optimization.d.ts +51 -1
  186. package/dist/server/image-optimization.js +52 -2
  187. package/dist/server/implicit-tags.js +1 -1
  188. package/dist/server/isr-cache.d.ts +1 -1
  189. package/dist/server/isr-cache.js +2 -2
  190. package/dist/server/metadata-routes.d.ts +3 -1
  191. package/dist/server/metadata-routes.js +12 -2
  192. package/dist/server/middleware-runtime.js +6 -1
  193. package/dist/server/navigation-planner.d.ts +1 -0
  194. package/dist/server/navigation-planner.js +14 -3
  195. package/dist/server/pages-api-route.js +2 -2
  196. package/dist/server/pages-asset-tags.d.ts +4 -6
  197. package/dist/server/pages-asset-tags.js +12 -12
  198. package/dist/server/pages-client-assets.d.ts +12 -0
  199. package/dist/server/pages-client-assets.js +10 -0
  200. package/dist/server/pages-node-compat.d.ts +8 -1
  201. package/dist/server/pages-node-compat.js +32 -4
  202. package/dist/server/pages-page-data.d.ts +24 -1
  203. package/dist/server/pages-page-data.js +45 -24
  204. package/dist/server/pages-page-handler.d.ts +2 -1
  205. package/dist/server/pages-page-handler.js +19 -12
  206. package/dist/server/pages-page-response.d.ts +7 -0
  207. package/dist/server/pages-page-response.js +4 -1
  208. package/dist/server/pages-request-pipeline.d.ts +2 -0
  209. package/dist/server/pages-request-pipeline.js +25 -1
  210. package/dist/server/pages-router-entry.d.ts +30 -0
  211. package/dist/server/pages-router-entry.js +108 -0
  212. package/dist/server/prerender-manifest.d.ts +3 -1
  213. package/dist/server/prerender-route-params.js +1 -1
  214. package/dist/server/prod-server.d.ts +1 -1
  215. package/dist/server/prod-server.js +48 -26
  216. package/dist/server/request-pipeline.js +1 -0
  217. package/dist/server/seed-cache.js +4 -4
  218. package/dist/server/worker-utils.d.ts +2 -1
  219. package/dist/server/worker-utils.js +7 -1
  220. package/dist/shims/app-router-scroll-state.d.ts +1 -0
  221. package/dist/shims/app-router-scroll-state.js +1 -0
  222. package/dist/shims/app-router-scroll.js +2 -1
  223. package/dist/shims/cache.js +19 -15
  224. package/dist/shims/cdn-cache.js +1 -1
  225. package/dist/shims/dynamic-preload-chunks.js +2 -1
  226. package/dist/shims/error-boundary.d.ts +19 -1
  227. package/dist/shims/error-boundary.js +11 -1
  228. package/dist/shims/form.d.ts +3 -1
  229. package/dist/shims/form.js +37 -43
  230. package/dist/shims/headers.d.ts +9 -1
  231. package/dist/shims/headers.js +31 -6
  232. package/dist/shims/image.js +75 -14
  233. package/dist/shims/internal/app-route-detection.d.ts +2 -17
  234. package/dist/shims/internal/app-route-detection.js +4 -17
  235. package/dist/shims/internal/hybrid-client-route-owner-direct.d.ts +23 -0
  236. package/dist/shims/internal/hybrid-client-route-owner-direct.js +51 -0
  237. package/dist/shims/internal/hybrid-client-route-owner.d.ts +2 -15
  238. package/dist/shims/internal/hybrid-client-route-owner.js +9 -60
  239. package/dist/shims/internal/pages-data-fetch-dedup.d.ts +9 -5
  240. package/dist/shims/internal/pages-data-fetch-dedup.js +73 -14
  241. package/dist/shims/internal/pages-data-target.d.ts +10 -9
  242. package/dist/shims/internal/pages-data-target.js +91 -12
  243. package/dist/shims/internal/pages-router-components.d.ts +7 -0
  244. package/dist/shims/internal/pages-router-components.js +13 -0
  245. package/dist/shims/layout-segment-context.d.ts +4 -1
  246. package/dist/shims/layout-segment-context.js +18 -4
  247. package/dist/shims/link.js +70 -37
  248. package/dist/shims/metadata.d.ts +3 -2
  249. package/dist/shims/metadata.js +8 -4
  250. package/dist/shims/navigation.d.ts +5 -1
  251. package/dist/shims/navigation.js +45 -10
  252. package/dist/shims/navigation.react-server.js +1 -1
  253. package/dist/shims/root-params.d.ts +15 -1
  254. package/dist/shims/root-params.js +21 -1
  255. package/dist/shims/router.d.ts +5 -7
  256. package/dist/shims/router.js +374 -94
  257. package/dist/shims/server.js +3 -2
  258. package/dist/shims/slot.js +3 -6
  259. package/dist/typegen.js +6 -5
  260. package/dist/utils/client-runtime-metadata.d.ts +2 -18
  261. package/dist/utils/client-runtime-metadata.js +31 -22
  262. package/dist/utils/dev-stack-sourcemap-endpoint.d.ts +4 -0
  263. package/dist/{server → utils}/dev-stack-sourcemap-endpoint.js +1 -1
  264. package/dist/utils/domain-locale.d.ts +6 -3
  265. package/dist/{server → utils}/middleware-request-headers.d.ts +1 -1
  266. package/dist/{server → utils}/middleware-request-headers.js +2 -2
  267. package/dist/utils/path.d.ts +2 -1
  268. package/dist/utils/path.js +1 -1
  269. package/dist/utils/project.d.ts +52 -2
  270. package/dist/utils/project.js +230 -5
  271. package/dist/utils/protocol-headers.d.ts +17 -0
  272. package/dist/utils/protocol-headers.js +17 -0
  273. package/dist/utils/react-version.d.ts +4 -0
  274. package/dist/utils/react-version.js +44 -0
  275. package/package.json +53 -4
  276. package/dist/deploy.d.ts +0 -190
  277. package/dist/deploy.js +0 -1033
  278. package/dist/server/dev-stack-sourcemap-endpoint.d.ts +0 -4
  279. /package/dist/{cloudflare → packages/cloudflare}/src/utils/cache-control-metadata.js +0 -0
@@ -1,5 +1,4 @@
1
- import { ACTION_REDIRECT_HEADER, ACTION_REDIRECT_STATUS_HEADER, VINEXT_CLIENT_REUSE_MANIFEST_HEADER, VINEXT_PARAMS_HEADER, VINEXT_RSC_REDIRECT_HEADER } from "./headers.js";
2
- import { DANGEROUS_URL_BLOCK_MESSAGE, isDangerousScheme } from "../shims/url-safety.js";
1
+ import { VINEXT_CLIENT_REUSE_MANIFEST_HEADER, VINEXT_PARAMS_HEADER, VINEXT_RSC_REDIRECT_HEADER } from "./headers.js";
3
2
  import { AppElementsWire } from "./app-elements-wire.js";
4
3
  import { APP_RSC_RENDER_MODE_REFRESH_PRESERVE_UI } from "./app-rsc-render-mode.js";
5
4
  import { getMountedSlotIdsHeader, resolveVisitedResponseInterceptionContext } from "./app-elements.js";
@@ -14,37 +13,35 @@ import { DevRecoveryBoundary, GlobalErrorBoundary, RedirectBoundary } from "../s
14
13
  import { beginAppRouterScrollIntent, consumeAppRouterScrollIntent } from "../shims/app-router-scroll-state.js";
15
14
  import { AppRouterScrollCommitProvider } from "../shims/app-router-scroll.js";
16
15
  import { BfcacheStateKeyMapContext, ElementsContext, Slot } from "../shims/slot.js";
17
- import { VINEXT_RSC_COMPATIBILITY_ID_HEADER, VINEXT_RSC_CONTENT_TYPE, createRscRequestHeaders, createRscRequestUrl, createServerActionRequestUrl, getVinextRscCompatibilityId } from "./app-rsc-cache-busting.js";
16
+ import { VINEXT_RSC_COMPATIBILITY_ID_HEADER, VINEXT_RSC_CONTENT_TYPE, createRscRequestHeaders, createRscRequestUrl, getVinextRscCompatibilityId } from "./app-rsc-cache-busting.js";
18
17
  import { getNavigationRuntime, registerNavigationRuntimeBootstrap, registerNavigationRuntimeFunctions } from "../client/navigation-runtime.js";
19
18
  import { notifyAppRouterTransitionStart } from "../client/instrumentation-client-state.js";
20
19
  import "../client/instrumentation-client.js";
20
+ import { createBfcacheSegmentStateKeyMap, createInitialBfcacheIdMap } from "./app-bfcache-identity.js";
21
+ import { createDiscardedServerActionRefreshScheduler, createServerActionInitiationSnapshot, resolveServerActionOperationLane } from "./app-browser-action-result.js";
22
+ import { createClientReuseManifestHeaderFromVisibleAppState } from "./app-browser-client-reuse-manifest.js";
21
23
  import { resolveManifestNavigationInterceptionContext, resolveMiddlewareRewriteNavigationInterceptionContext } from "./app-browser-interception-context.js";
22
24
  import { readHistoryStatePreviousNextUrl } from "./app-history-state.js";
23
25
  import { AppBrowserMpaNavigationScheduler } from "./app-browser-mpa-navigation.js";
24
26
  import { blockDangerousStreamedRscRedirect } from "./app-browser-rsc-redirect.js";
25
27
  import { navigationPlanner } from "./navigation-planner.js";
26
- import { __basePath, appRouterInstance, commitClientNavigationState, consumePrefetchResponseForNavigation, createCachedRscResponseSnapshot, createClientNavigationRenderSnapshot, createSnapshotPathAndSearch, getClientNavigationRenderContext, getPrefetchCache, hasPrefetchCacheEntryForNavigation, invalidatePrefetchCache, pushHistoryStateWithoutNotify, replaceClientParamsWithoutNotify, replaceHistoryStateWithoutNotify, resolvePrefetchCacheEntryMountedSlotsHeader, restoreRscResponse, saveScrollPosition, setClientParams, setMountedSlotsHeader, setPendingPathname, useRouter } from "../shims/navigation.js";
27
- import { createBfcacheSegmentStateKeyMap, createInitialBfcacheIdMap } from "./app-bfcache-identity.js";
28
- import { createDiscardedServerActionRefreshScheduler, createServerActionInitiationSnapshot, createServerActionResultFacts, isServerActionResult, normalizeServerActionThrownValue, parseServerActionRevalidationHeader, readInvalidServerActionResponseError, shouldClearClientNavigationCachesForServerActionResult } from "./app-browser-action-result.js";
29
- import { createClientReuseManifestHeaderFromVisibleAppState } from "./app-browser-client-reuse-manifest.js";
28
+ import { DYNAMIC_NAVIGATION_CACHE_TTL, PREFETCH_CACHE_TTL, __basePath, appRouterInstance, commitClientNavigationState, consumePrefetchResponseForNavigation, createCachedRscResponseSnapshot, createClientNavigationRenderSnapshot, createSnapshotPathAndSearch, deletePrefetchResponseSnapshot, getClientNavigationRenderContext, getPrefetchCache, hasPrefetchCacheEntryForNavigation, invalidatePrefetchCache, pushHistoryStateWithoutNotify, replaceClientParamsWithoutNotify, replaceHistoryStateWithoutNotify, resolvePrefetchCacheEntryMountedSlotsHeader, restoreRscResponse, saveScrollPosition, seedPrefetchResponseSnapshot, setClientParams, setMountedSlotsHeader, setPendingPathname, useRouter } from "../shims/navigation.js";
30
29
  import { chunksToReadableStream, createProgressiveRscStream, getVinextBrowserGlobal } from "./app-browser-stream.js";
31
- import { FRESH_APP_NAVIGATION_PAYLOAD_ORIGIN, VISITED_CACHE_APP_NAVIGATION_PAYLOAD_ORIGIN, isCacheRestorableAppPayloadMetadata, resolveInterceptionContextFromPreviousNextUrl, resolveServerActionRequestState } from "./app-browser-state.js";
30
+ import { COMMITTED_CACHE_APP_NAVIGATION_PAYLOAD_ORIGIN, FRESH_APP_NAVIGATION_PAYLOAD_ORIGIN, VISITED_CACHE_APP_NAVIGATION_PAYLOAD_ORIGIN, isCacheRestorableAppPayloadMetadata, isCompleteAppPayloadMetadata, resolveInterceptionContextFromPreviousNextUrl } from "./app-browser-state.js";
32
31
  import { clearHardNavigationLoopGuard, createAppBrowserNavigationController, createBasePathStrippedPathAndSearch } from "./app-browser-navigation-controller.js";
33
- import { applyServerActionResultDecision } from "./app-browser-server-action-navigation.js";
34
32
  import { consumeInitialFormState, createVinextHydrateRootOptions, hydrateRootInTransition } from "./app-browser-hydration.js";
35
33
  import { AppBrowserHistoryController } from "./app-browser-history-controller.js";
36
34
  import { createVisitedResponseCacheEntry, isVisitedResponseCacheEntryFresh } from "./app-visited-response-cache.js";
37
35
  import { createPopstateRestoreHandler, restoreSynchronousPopstateScrollPosition } from "./app-browser-popstate.js";
38
36
  import { createDevOnCaughtError, createOnUncaughtError, createProdOnCaughtError, prodOnRecoverableError } from "./app-browser-error.js";
39
- import { dismissOverlay } from "./dev-error-overlay-store.js";
40
- import { devOnCaughtError, installDevErrorOverlay, installViteHmrErrorHandler, reportInitialDevServerErrors } from "./dev-error-overlay.js";
41
- import { throwOnServerActionNotFound } from "./server-action-not-found.js";
37
+ import { createHydrationCachePublication } from "./app-hydration-cache-publication.js";
42
38
  import { createOptimisticRouteTemplate, getOptimisticPrefetchSourceKey, getOptimisticRouteTemplateKey, resolveOptimisticNavigationPayload } from "./app-optimistic-routing.js";
43
39
  import { removeStylesheetLinksCoveredByInlineCss } from "./app-inline-css-client.js";
44
40
  import { createElement, startTransition, use, useEffect, useLayoutEffect, useMemo, useRef, useState } from "react";
45
41
  import { flushSync } from "react-dom";
46
- import { createFromFetch, createFromReadableStream, createTemporaryReferenceSet, encodeReply, setServerCallback } from "@vitejs/plugin-rsc/browser";
47
42
  import { createRoot, hydrateRoot } from "react-dom/client";
43
+ import { createFromFetch, createFromReadableStream, setServerCallback } from "@vitejs/plugin-rsc/browser";
44
+ import { hasServerActions, loadServerActionClient } from "virtual:vinext-app-capabilities";
48
45
  //#region src/server/app-browser-entry.ts
49
46
  function toActionType(kind) {
50
47
  return kind === "traverse" ? "traverse" : "navigate";
@@ -94,10 +91,14 @@ const browserNavigationController = createAppBrowserNavigationController({
94
91
  getRouteManifest: getBrowserRouteManifest,
95
92
  syncHistoryStatePreviousNextUrl: (previousNextUrl, bfcacheIds) => historyController.syncCurrentHistoryStatePreviousNextUrl(previousNextUrl, bfcacheIds)
96
93
  });
97
- const discardedServerActionRefreshScheduler = createDiscardedServerActionRefreshScheduler({ runRefresh() {
94
+ const discardedServerActionRefreshScheduler = hasServerActions ? createDiscardedServerActionRefreshScheduler({ runRefresh() {
98
95
  clearClientNavigationCaches();
99
96
  getNavigationRuntime()?.functions.navigate?.(window.location.href, 0, "refresh", void 0, void 0, true);
100
- } });
97
+ } }) : {
98
+ markNavigationSettled() {},
99
+ markNavigationStart() {},
100
+ schedule() {}
101
+ };
101
102
  const NavigationCommitSignal = browserNavigationController.NavigationCommitSignal;
102
103
  const ACTION_HTTP_FALLBACK_ROBOTS_META_ATTR = "data-vinext-action-http-fallback";
103
104
  function syncServerActionHttpFallbackHead(status) {
@@ -123,6 +124,7 @@ function isRouterStatePromise(value) {
123
124
  }
124
125
  let latestClientParams = {};
125
126
  const visitedResponseCache = /* @__PURE__ */ new Map();
127
+ let clientNavigationCacheGeneration = 0;
126
128
  let browserRouterStateHasEverCommitted = false;
127
129
  const mpaNavigationScheduler = new AppBrowserMpaNavigationScheduler();
128
130
  const unresolvedMpaNavigation = new Promise(() => {});
@@ -135,15 +137,17 @@ function waitForRscHmrSettle(delayMs = RSC_HMR_SETTLE_DELAY_MS) {
135
137
  window.setTimeout(resolve, delayMs);
136
138
  });
137
139
  }
138
- function restoreHistoryStateSnapshot(historyState) {
139
- const navId = browserNavigationController.getActiveNavigationId();
140
+ function restoreHistoryStateSnapshot(historyState, navId, onApprovedBeforeCommit) {
140
141
  let restored = false;
141
142
  flushSync(() => {
142
143
  restored = historyController.restoreHistorySnapshot({
143
144
  historyState,
144
145
  stageClientParams,
145
146
  approveVisibleRestore: ({ state, beforeCommit }) => browserNavigationController.restoreHistorySnapshotVisibleState({
146
- beforeCommit,
147
+ beforeCommit: () => {
148
+ onApprovedBeforeCommit?.();
149
+ beforeCommit();
150
+ },
147
151
  navId,
148
152
  state,
149
153
  targetHref: window.location.href
@@ -151,7 +155,7 @@ function restoreHistoryStateSnapshot(historyState) {
151
155
  });
152
156
  });
153
157
  if (!restored) return false;
154
- commitClientNavigationState();
158
+ commitClientNavigationState(navId, { releaseSnapshot: false });
155
159
  return true;
156
160
  }
157
161
  function getBrowserRouterState() {
@@ -184,6 +188,7 @@ function clearPrefetchState() {
184
188
  optimisticRouteTemplateLearning.clear();
185
189
  }
186
190
  function clearClientNavigationCaches() {
191
+ clientNavigationCacheGeneration += 1;
187
192
  clearVisitedResponseCache();
188
193
  clearPrefetchState();
189
194
  historyController.invalidateRestorableClientState();
@@ -281,7 +286,7 @@ function createNavigationCommitEffect(options) {
281
286
  commitClientNavigationState(navId);
282
287
  };
283
288
  }
284
- async function renderNavigationPayload(payload, navigationSnapshot, targetHref, navId, historyUpdateMode, params, previousNextUrl, pendingRouterState, payloadOrigin, actionType = "navigate", operationLane = "navigation", traversalIntent = null, scrollIntent = null, restoredBfcacheIds = null, reuseCurrentBfcacheIds = true, visibleCommitMode = "transition") {
289
+ async function renderNavigationPayload(payload, navigationSnapshot, targetHref, navId, historyUpdateMode, params, previousNextUrl, pendingRouterState, payloadOrigin, actionType = "navigate", operationLane = "navigation", traversalIntent = null, scrollIntent = null, restoredBfcacheIds = null, reuseCurrentBfcacheIds = true, visibleCommitMode = "transition", onCommittedState, navigationCommitKind) {
285
290
  syncServerActionHttpFallbackHead(null);
286
291
  return browserNavigationController.renderNavigationPayload({
287
292
  actionType,
@@ -300,55 +305,11 @@ async function renderNavigationPayload(payload, navigationSnapshot, targetHref,
300
305
  targetHistoryIndex: traversalIntent === null ? void 0 : traversalIntent.targetHistoryIndex,
301
306
  targetHref,
302
307
  navId,
303
- visibleCommitMode
308
+ navigationCommitKind,
309
+ visibleCommitMode,
310
+ onCommittedState
304
311
  });
305
312
  }
306
- function resolveActionRedirectTarget(response) {
307
- const actionRedirect = response.headers.get(ACTION_REDIRECT_HEADER);
308
- if (!actionRedirect) return null;
309
- if (isDangerousScheme(actionRedirect)) {
310
- console.error(DANGEROUS_URL_BLOCK_MESSAGE);
311
- return null;
312
- }
313
- try {
314
- let redirectUrl;
315
- if (actionRedirect.startsWith("/") || /^[a-z]+:/i.test(actionRedirect)) redirectUrl = new URL(actionRedirect, window.location.href);
316
- else {
317
- const baseParsed = new URL(window.location.href);
318
- let baseDir = baseParsed.pathname;
319
- if (!baseDir.endsWith("/")) baseDir = baseDir + "/";
320
- redirectUrl = new URL(actionRedirect, `${baseParsed.origin}${baseDir}${baseParsed.search}`);
321
- }
322
- if (redirectUrl.origin !== window.location.origin) {
323
- browserNavigationController.performHardNavigation(actionRedirect);
324
- return null;
325
- }
326
- const statusHeader = response.headers.get(ACTION_REDIRECT_STATUS_HEADER);
327
- const status = statusHeader ? parseInt(statusHeader, 10) : 307;
328
- return {
329
- href: redirectUrl.href,
330
- type: response.headers.get("x-action-redirect-type") ?? "push",
331
- status
332
- };
333
- } catch {
334
- browserNavigationController.performHardNavigation(actionRedirect);
335
- return null;
336
- }
337
- }
338
- var ServerActionRedirectError = class extends Error {
339
- digest;
340
- handled = true;
341
- constructor(target) {
342
- super("NEXT_REDIRECT");
343
- const redirectUrl = new URL(target.href, window.location.href);
344
- const redirectHref = redirectUrl.pathname + redirectUrl.search + redirectUrl.hash;
345
- const redirectType = target.type === "push" ? "push" : "replace";
346
- this.digest = `NEXT_REDIRECT;${redirectType};${encodeURIComponent(redirectHref)};${target.status};`;
347
- }
348
- };
349
- function createServerActionRedirectError(target) {
350
- return new ServerActionRedirectError(target);
351
- }
352
313
  async function commitSameUrlNavigatePayload(nextElements, actionInitiation, returnValue, revalidation = "none") {
353
314
  const navigationSnapshot = createClientNavigationRenderSnapshot(actionInitiation.href, actionInitiation.routerState.navigationSnapshot.params);
354
315
  return browserNavigationController.commitSameUrlNavigatePayload(nextElements, navigationSnapshot, returnValue, actionInitiation.routerState, {
@@ -387,7 +348,7 @@ function readVisitedResponseCacheCandidate(rscUrl, interceptionContext, mountedS
387
348
  navigationKind,
388
349
  now: Date.now()
389
350
  }),
390
- mountedSlotsMatch: (cached.response.mountedSlotsHeader ?? null) === mountedSlotsHeader,
351
+ mountedSlotsMatch: cached.mountedSlotsHeader === mountedSlotsHeader,
391
352
  navigationKind
392
353
  }
393
354
  };
@@ -405,20 +366,32 @@ function applyVisitedResponseCacheCandidateDecision(candidate, decision) {
405
366
  function deleteVisitedResponse(rscUrl, interceptionContext) {
406
367
  visitedResponseCache.delete(AppElementsWire.encodeCacheKey(rscUrl, interceptionContext));
407
368
  }
408
- function storeVisitedResponseSnapshot(rscUrl, interceptionContext, snapshot, params) {
369
+ function storeVisitedResponseSnapshot(rscUrl, interceptionContext, snapshot, params, prefetchFallbackTtlMs = DYNAMIC_NAVIGATION_CACHE_TTL, requestMountedSlotsHeader = snapshot.mountedSlotsHeader ?? null, elements) {
409
370
  const cacheKey = AppElementsWire.encodeCacheKey(rscUrl, interceptionContext);
410
371
  visitedResponseCache.delete(cacheKey);
411
372
  evictVisitedResponseCacheIfNeeded();
412
- const now = Date.now();
413
- visitedResponseCache.set(cacheKey, createVisitedResponseCacheEntry({
414
- now,
373
+ const entry = createVisitedResponseCacheEntry({
374
+ fallbackTtlMs: prefetchFallbackTtlMs,
375
+ elements,
376
+ now: Date.now(),
377
+ mountedSlotsHeader: requestMountedSlotsHeader,
415
378
  params,
416
379
  response: snapshot
417
- }));
380
+ });
381
+ visitedResponseCache.set(cacheKey, entry);
382
+ seedPrefetchResponseSnapshot(rscUrl, snapshot, interceptionContext, requestMountedSlotsHeader, prefetchFallbackTtlMs);
383
+ return () => {
384
+ if (visitedResponseCache.get(cacheKey) === entry) visitedResponseCache.delete(cacheKey);
385
+ deletePrefetchResponseSnapshot(rscUrl, snapshot, interceptionContext);
386
+ };
418
387
  }
419
388
  function clientNavigationSnapshotHref(snapshot) {
420
389
  return `${window.location.origin}${createSnapshotPathAndSearch(snapshot)}`;
421
390
  }
391
+ function getCurrentMatchedRoutePathname() {
392
+ const routeKey = AppElementsWire.parseElementKey(getBrowserRouterState().routeId);
393
+ return routeKey?.kind === "route" ? routeKey.path : null;
394
+ }
422
395
  function getRequestState(navigationKind, targetPathname, previousNextUrlOverride, traverseHistoryState) {
423
396
  if (previousNextUrlOverride !== void 0) return {
424
397
  interceptionContext: resolveInterceptionContextFromPreviousNextUrl(previousNextUrlOverride, __basePath),
@@ -443,6 +416,7 @@ function getRequestState(navigationKind, targetPathname, previousNextUrlOverride
443
416
  };
444
417
  const middlewareRewriteInterceptionContext = resolveMiddlewareRewriteNavigationInterceptionContext({
445
418
  basePath: __basePath,
419
+ currentMatchedPathname: getCurrentMatchedRoutePathname(),
446
420
  currentPathname: window.location.pathname,
447
421
  routeManifest: getBrowserRouteManifest(),
448
422
  targetPathname
@@ -508,7 +482,7 @@ function AppRouterRedirectBridge({ children }) {
508
482
  function decodeAppElementsPromise(payload) {
509
483
  return Promise.resolve(payload).then((elements) => AppElementsWire.decode(elements));
510
484
  }
511
- function BrowserRoot({ initialElements, initialNavigationSnapshot }) {
485
+ function BrowserRoot({ hydrationCachePublication, initialElements, initialNavigationSnapshot }) {
512
486
  const resolvedElements = use(initialElements);
513
487
  const initialMetadata = AppElementsWire.readMetadata(resolvedElements);
514
488
  const [treeStateValue, setTreeStateValue] = useState(() => ({
@@ -548,19 +522,22 @@ function BrowserRoot({ initialElements, initialNavigationSnapshot }) {
548
522
  return new Promise(() => {});
549
523
  } });
550
524
  browserRouterStateHasEverCommitted = true;
525
+ hydrationCachePublication.commit();
551
526
  return () => {
527
+ hydrationCachePublication.invalidate();
552
528
  registerNavigationRuntimeFunctions({ navigateExternal: void 0 });
553
529
  detach();
554
530
  setMountedSlotsHeader(null);
555
531
  };
556
- }, [setTreeStateValue]);
532
+ }, [hydrationCachePublication, setTreeStateValue]);
557
533
  useEffect(() => {
534
+ hydrationCachePublication.complete();
558
535
  const hydratedAt = performance.now();
559
536
  window.__VINEXT_HYDRATED_AT = hydratedAt;
560
537
  window.__NEXT_HYDRATED = true;
561
538
  window.__NEXT_HYDRATED_AT = hydratedAt;
562
539
  window.__NEXT_HYDRATED_CB?.();
563
- }, []);
540
+ }, [hydrationCachePublication]);
564
541
  useLayoutEffect(() => {
565
542
  historyController.rememberHistoryStateSnapshot(treeState);
566
543
  }, [treeState]);
@@ -709,120 +686,105 @@ function applyRuntimeRscBootstrap(rsc) {
709
686
  if (rsc.nav) restoreHydrationNavigationContext(rsc.nav.pathname, rsc.nav.searchParams, params);
710
687
  }
711
688
  function registerServerActionCallback() {
712
- const serverActionCallback = async (id, args) => {
713
- syncServerActionHttpFallbackHead(null);
714
- const temporaryReferences = createTemporaryReferenceSet();
689
+ setServerCallback((id, args) => {
690
+ const releaseCacheInvalidationGuard = historyController.beginCacheInvalidationGuard();
715
691
  const actionInitiation = createActionInitiationSnapshot();
716
- historyController.syncCurrentHistoryStatePreviousNextUrl(actionInitiation.routerState.previousNextUrl, actionInitiation.routerState.bfcacheIds);
717
- const body = await encodeReply(args, { temporaryReferences });
718
- const { headers } = resolveServerActionRequestState({
719
- actionId: id,
692
+ return loadServerActionClient().then(({ invokeClientServerAction }) => invokeClientServerAction(id, args, actionInitiation, {
720
693
  basePath: __basePath,
721
- elements: actionInitiation.routerState.elements,
722
- previousNextUrl: actionInitiation.routerState.previousNextUrl
723
- });
724
- const fetchResponse = await fetch(createServerActionRequestUrl(actionInitiation.path), {
725
- method: "POST",
726
- headers,
727
- body
728
- });
729
- throwOnServerActionNotFound(fetchResponse, id);
730
- const hasActionRedirect = fetchResponse.headers.has(ACTION_REDIRECT_HEADER);
731
- const actionRedirectTarget = resolveActionRedirectTarget(fetchResponse);
732
- if (hasActionRedirect && !actionRedirectTarget) return;
733
- const actionResultFacts = createServerActionResultFacts({
734
- actionRedirectHref: actionRedirectTarget?.href ?? null,
735
- actionRedirectType: actionRedirectTarget?.type ?? null,
736
- clientCompatibilityId: CLIENT_RSC_COMPATIBILITY_ID,
737
- compatibilityIdHeader: fetchResponse.headers.get(VINEXT_RSC_COMPATIBILITY_ID_HEADER),
738
- contentTypeHeader: fetchResponse.headers.get("content-type"),
739
- currentHref: actionInitiation.href,
740
- origin: window.location.origin,
741
- responseUrl: fetchResponse.url
742
- });
743
- const fetchResponseIsRsc = actionResultFacts.isRscContentType;
744
- if (applyServerActionResultDecision(navigationPlanner.classifyServerActionResult(actionResultFacts), clearClientNavigationCaches, (url, historyMode) => browserNavigationController.performHardNavigation(url, historyMode))) return;
745
- const revalidation = parseServerActionRevalidationHeader(fetchResponse.headers);
746
- if (revalidation !== "none") clearClientNavigationCaches();
747
- const invalidResponseError = await readInvalidServerActionResponseError(fetchResponse.clone(), actionRedirectTarget !== null);
748
- if (invalidResponseError) throw invalidResponseError;
749
- if (actionRedirectTarget && !fetchResponseIsRsc) {
750
- browserNavigationController.performHardNavigation(actionRedirectTarget.href);
751
- return;
752
- }
753
- const flightResponse = fetchResponse.status === 303 ? new Response(fetchResponse.body, {
754
- headers: fetchResponse.headers,
755
- status: 200,
756
- statusText: "OK"
757
- }) : fetchResponse;
758
- const result = await createFromFetch(Promise.resolve(flightResponse), { temporaryReferences });
759
- if (revalidation === "none" && shouldClearClientNavigationCachesForServerActionResult(result, revalidation)) clearClientNavigationCaches();
760
- if (actionRedirectTarget) {
761
- if (isServerActionResult(result) && result.root !== void 0) {
762
- const decoded = AppElementsWire.decode(result.root);
763
- const hashIdx = actionRedirectTarget.href.indexOf("#");
764
- const actionScrollIntent = beginAppRouterScrollIntent((hashIdx !== -1 ? actionRedirectTarget.href.slice(hashIdx) : "") || null);
765
- if (actionRedirectTarget.type === "push") saveScrollPosition();
766
- renderNavigationPayload(Promise.resolve(decoded), createClientNavigationRenderSnapshot(actionRedirectTarget.href, actionInitiation.routerState.navigationSnapshot.params), actionRedirectTarget.href, actionInitiation.navigationId, actionRedirectTarget.type === "push" ? "push" : "replace", {}, null, null, FRESH_APP_NAVIGATION_PAYLOAD_ORIGIN, actionRedirectTarget.type === "push" ? "navigate" : "replace", "server-action", null, actionScrollIntent).catch(() => {
767
- browserNavigationController.performHardNavigation(actionRedirectTarget.href);
694
+ clearClientNavigationCaches,
695
+ clientRscCompatibilityId: CLIENT_RSC_COMPATIBILITY_ID,
696
+ commitSameUrlNavigatePayload,
697
+ navigationPlanner,
698
+ performHardNavigation: (url, historyMode) => browserNavigationController.performHardNavigation(url, historyMode),
699
+ renderRedirectPayload(elements, target, actionInitiation, revalidation) {
700
+ const hashIdx = target.href.indexOf("#");
701
+ const actionScrollIntent = beginAppRouterScrollIntent((hashIdx !== -1 ? target.href.slice(hashIdx) : "") || null);
702
+ if (target.type === "push") saveScrollPosition();
703
+ renderNavigationPayload(Promise.resolve(elements), createClientNavigationRenderSnapshot(target.href, actionInitiation.routerState.navigationSnapshot.params), target.href, actionInitiation.navigationId, target.type === "push" ? "push" : "replace", {}, null, null, FRESH_APP_NAVIGATION_PAYLOAD_ORIGIN, target.type === "push" ? "navigate" : "replace", resolveServerActionOperationLane(revalidation), null, actionScrollIntent).catch(() => {
704
+ browserNavigationController.performHardNavigation(target.href);
768
705
  });
769
- throw createServerActionRedirectError(actionRedirectTarget);
770
- }
771
- browserNavigationController.performHardNavigation(actionRedirectTarget.href);
772
- return;
773
- }
774
- syncServerActionHttpFallbackHead(isServerActionResult(result) && result.root !== void 0 ? null : fetchResponse.status);
775
- if (isServerActionResult(result)) {
776
- if (result.root !== void 0) {
777
- const returnValue = result.returnValue && !result.returnValue.ok ? {
778
- ok: false,
779
- data: normalizeServerActionThrownValue(result.returnValue.data, fetchResponse.status)
780
- } : result.returnValue;
781
- return commitSameUrlNavigatePayload(Promise.resolve(AppElementsWire.decode(result.root)), actionInitiation, returnValue, revalidation);
782
- }
783
- if (result.returnValue) {
784
- if (!result.returnValue.ok) throw normalizeServerActionThrownValue(result.returnValue.data, fetchResponse.status);
785
- return result.returnValue.data;
786
- }
787
- return;
788
- }
789
- return commitSameUrlNavigatePayload(Promise.resolve(AppElementsWire.decode(result)), actionInitiation, void 0, revalidation);
790
- };
791
- setServerCallback((id, args) => {
792
- const releaseCacheInvalidationGuard = historyController.beginCacheInvalidationGuard();
793
- return Promise.resolve().then(() => serverActionCallback(id, args)).finally(releaseCacheInvalidationGuard);
706
+ },
707
+ syncCurrentHistoryState: (previousNextUrl, bfcacheIds) => historyController.syncCurrentHistoryStatePreviousNextUrl(previousNextUrl, bfcacheIds),
708
+ syncServerActionHttpFallbackHead
709
+ })).finally(releaseCacheInvalidationGuard);
794
710
  });
795
711
  }
796
712
  async function main() {
797
713
  if (!claimInitialAppRouterBootstrap()) return;
798
- registerServerActionCallback();
714
+ if (hasServerActions) registerServerActionCallback();
799
715
  installAppNavigationFailureListeners();
716
+ let devErrorOverlay = null;
800
717
  if (import.meta.env.DEV) {
801
- installDevErrorOverlay();
802
- installViteHmrErrorHandler(import.meta.hot);
803
- reportInitialDevServerErrors();
718
+ devErrorOverlay = await import("../client/dev-error-overlay.js");
719
+ devErrorOverlay.installDevErrorOverlay();
720
+ devErrorOverlay.installViteHmrErrorHandler(import.meta.hot);
721
+ devErrorOverlay.reportInitialDevServerErrors();
804
722
  }
723
+ const initialRscBootstrap = getNavigationRuntime()?.bootstrap.rsc;
805
724
  const rscStream = await readInitialRscStream();
806
725
  if (rscStream === null) return;
807
- bootstrapHydration(rscStream);
726
+ bootstrapHydration(rscStream, devErrorOverlay, initialRscBootstrap);
808
727
  }
809
- function bootstrapHydration(rscStream) {
810
- const root = decodeAppElementsPromise(createFromReadableStream(rscStream));
728
+ function bootstrapHydration(rscStream, devErrorOverlay, initialRscBootstrap) {
729
+ const hydrationCachePublication = createHydrationCachePublication();
730
+ const cacheGeneration = clientNavigationCacheGeneration;
731
+ const [reactBranch, cacheBranch] = rscStream.tee();
732
+ const root = decodeAppElementsPromise(createFromReadableStream(reactBranch));
811
733
  const initialNavigationSnapshot = createClientNavigationRenderSnapshot(window.location.href, latestClientParams);
734
+ const initialParams = initialNavigationSnapshot.params;
735
+ const initialPathAndSearch = createSnapshotPathAndSearch(initialNavigationSnapshot);
736
+ const initialCacheBuffer = new Response(cacheBranch).arrayBuffer();
737
+ Promise.all([root, initialCacheBuffer]).then(async ([elements, buffer]) => {
738
+ if (cacheGeneration !== clientNavigationCacheGeneration) return;
739
+ const metadata = AppElementsWire.readMetadata(elements);
740
+ if (!isCompleteAppPayloadMetadata(metadata)) return;
741
+ const mountedSlotsHeader = getMountedSlotIdsHeader(elements);
742
+ const rscUrl = await createRscRequestUrl(initialPathAndSearch, createRscRequestHeaders({ mountedSlotsHeader }));
743
+ if (cacheGeneration !== clientNavigationCacheGeneration) return;
744
+ const snapshot = {
745
+ compatibilityIdHeader: CLIENT_RSC_COMPATIBILITY_ID,
746
+ buffer,
747
+ contentType: VINEXT_RSC_CONTENT_TYPE,
748
+ ...initialRscBootstrap?.dynamicStaleTimeSeconds !== void 0 ? { dynamicStaleTimeSeconds: initialRscBootstrap.dynamicStaleTimeSeconds } : {},
749
+ mountedSlotsHeader,
750
+ paramsHeader: encodeURIComponent(JSON.stringify(initialParams)),
751
+ url: rscUrl
752
+ };
753
+ const fallbackTtlMs = initialRscBootstrap?.initialCacheKind === "static" ? PREFETCH_CACHE_TTL : DYNAMIC_NAVIGATION_CACHE_TTL;
754
+ hydrationCachePublication.publish(() => {
755
+ if (cacheGeneration !== clientNavigationCacheGeneration) return () => {};
756
+ if (isCacheRestorableAppPayloadMetadata(metadata)) return storeVisitedResponseSnapshot(rscUrl, metadata.interceptionContext, snapshot, initialParams, fallbackTtlMs, mountedSlotsHeader);
757
+ seedPrefetchResponseSnapshot(rscUrl, snapshot, metadata.interceptionContext, mountedSlotsHeader, fallbackTtlMs);
758
+ return () => deletePrefetchResponseSnapshot(rscUrl, snapshot, metadata.interceptionContext);
759
+ });
760
+ }).catch(() => {});
812
761
  historyController.writeBootstrapHistoryMetadata();
813
- const onUncaughtError = createOnUncaughtError();
762
+ const reportUncaughtError = createOnUncaughtError();
763
+ const onUncaughtError = (...args) => {
764
+ hydrationCachePublication.fail();
765
+ reportUncaughtError(...args);
766
+ };
767
+ const onRecoverableError = (...args) => {
768
+ hydrationCachePublication.fail();
769
+ prodOnRecoverableError(...args);
770
+ };
771
+ const invalidateOnCaughtError = (handler) => ((...args) => {
772
+ hydrationCachePublication.fail();
773
+ handler(...args);
774
+ });
814
775
  const formState = consumeInitialFormState(getVinextBrowserGlobal());
815
- const hydrateRootOptions = import.meta.env.DEV ? createVinextHydrateRootOptions({
776
+ const hydrateRootOptions = import.meta.env.DEV && devErrorOverlay ? createVinextHydrateRootOptions({
816
777
  formState,
817
- onCaughtError: createDevOnCaughtError(devOnCaughtError, onUncaughtError),
778
+ onCaughtError: invalidateOnCaughtError(createDevOnCaughtError(devErrorOverlay.devOnCaughtError, onUncaughtError)),
818
779
  onUncaughtError
819
780
  }) : createVinextHydrateRootOptions({
820
781
  formState,
821
- onCaughtError: createProdOnCaughtError(onUncaughtError),
822
- onRecoverableError: prodOnRecoverableError,
782
+ onCaughtError: invalidateOnCaughtError(createProdOnCaughtError(onUncaughtError)),
783
+ onRecoverableError,
823
784
  onUncaughtError
824
785
  });
825
786
  const children = createElement(BrowserRoot, {
787
+ hydrationCachePublication,
826
788
  initialElements: root,
827
789
  initialNavigationSnapshot
828
790
  });
@@ -844,15 +806,20 @@ function bootstrapHydration(rscStream) {
844
806
  });
845
807
  markInitialAppRouterBootstrapHydrated();
846
808
  let activeNavigationAbortController = null;
809
+ function abortSupersededNavigation() {
810
+ activeNavigationAbortController?.abort();
811
+ activeNavigationAbortController = null;
812
+ }
847
813
  registerNavigationRuntimeFunctions({
848
814
  clearNavigationCaches: clearClientNavigationCaches,
849
815
  commitHashNavigation: (href, historyUpdateMode, scroll) => historyController.commitHashOnlyNavigation(href, historyUpdateMode, scroll),
850
816
  navigate: async function navigateRsc(href, redirectDepth = 0, navigationKind = "navigate", historyUpdateMode, previousNextUrlOverride, programmaticTransition = false, traversalIntent, scrollIntent, visibleCommitMode = "transition") {
851
- activeNavigationAbortController?.abort();
817
+ abortSupersededNavigation();
852
818
  const navigationAbortController = new AbortController();
853
819
  activeNavigationAbortController = navigationAbortController;
854
820
  let pendingRouterState = null;
855
821
  const navId = browserNavigationController.beginNavigation();
822
+ const navigationCacheGeneration = clientNavigationCacheGeneration;
856
823
  discardedServerActionRefreshScheduler.markNavigationStart();
857
824
  let currentHref = href;
858
825
  let currentHistoryMode = historyUpdateMode;
@@ -960,9 +927,10 @@ function bootstrapHydration(rscStream) {
960
927
  if (!browserNavigationController.isCurrentNavigation(navId)) return;
961
928
  const cachedParams = cachedRoute.params;
962
929
  const cachedNavigationSnapshot = createClientNavigationRenderSnapshot(currentHref, cachedParams);
963
- const cachedPayload = decodeAppElementsPromise(createFromFetch(Promise.resolve(restoreRscResponse(cachedRoute.response))));
930
+ const cachedPayload = cachedRoute.elements ? Promise.resolve(cachedRoute.elements) : decodeAppElementsPromise(createFromFetch(Promise.resolve(restoreRscResponse(cachedRoute.response))));
964
931
  if (!browserNavigationController.isCurrentNavigation(navId)) return;
965
- if (await renderNavigationPayload(cachedPayload, cachedNavigationSnapshot, currentHref, navId, currentHistoryMode, cachedParams, requestPreviousNextUrl, detachedNavigationCommits ? null : pendingRouterState, VISITED_CACHE_APP_NAVIGATION_PAYLOAD_ORIGIN, toActionType(navigationKind), toOperationLane(navigationKind), activeTraversalIntent, scrollIntent, restoredBfcacheIds, reuseCurrentBfcacheIds, visibleCommitMode) === "no-commit") {
932
+ if (await renderNavigationPayload(cachedPayload, cachedNavigationSnapshot, currentHref, navId, currentHistoryMode, cachedParams, requestPreviousNextUrl, detachedNavigationCommits ? null : pendingRouterState, cachedRoute.elements ? COMMITTED_CACHE_APP_NAVIGATION_PAYLOAD_ORIGIN : VISITED_CACHE_APP_NAVIGATION_PAYLOAD_ORIGIN, toActionType(navigationKind), toOperationLane(navigationKind), activeTraversalIntent, scrollIntent, restoredBfcacheIds, reuseCurrentBfcacheIds, visibleCommitMode) === "no-commit") {
933
+ if (!browserNavigationController.isCurrentNavigation(navId)) return;
966
934
  deleteVisitedResponse(rscUrl, requestInterceptionContext);
967
935
  continue;
968
936
  }
@@ -1014,7 +982,7 @@ function bootstrapHydration(rscStream) {
1014
982
  if (optimisticPayload !== null) {
1015
983
  detachedNavigationCommits = true;
1016
984
  const optimisticNavigationSnapshot = createClientNavigationRenderSnapshot(currentHref, optimisticPayload.params);
1017
- renderNavigationPayload(Promise.resolve(optimisticPayload.elements), optimisticNavigationSnapshot, currentHref, navId, currentHistoryMode, optimisticPayload.params, requestPreviousNextUrl, null, FRESH_APP_NAVIGATION_PAYLOAD_ORIGIN, toActionType(navigationKind), toOperationLane(navigationKind), activeTraversalIntent, scrollIntent, restoredBfcacheIds, reuseCurrentBfcacheIds, visibleCommitMode).catch((error) => {
985
+ renderNavigationPayload(Promise.resolve(optimisticPayload.elements), optimisticNavigationSnapshot, currentHref, navId, currentHistoryMode, optimisticPayload.params, requestPreviousNextUrl, null, FRESH_APP_NAVIGATION_PAYLOAD_ORIGIN, toActionType(navigationKind), toOperationLane(navigationKind), activeTraversalIntent, scrollIntent, restoredBfcacheIds, reuseCurrentBfcacheIds, visibleCommitMode, void 0, "detached").catch((error) => {
1018
986
  if (browserNavigationController.isCurrentNavigation(navId)) console.error("[vinext] Optimistic RSC navigation error:", error);
1019
987
  });
1020
988
  }
@@ -1080,21 +1048,47 @@ function bootstrapHydration(rscStream) {
1080
1048
  if (!browserNavigationController.isCurrentNavigation(navId)) return;
1081
1049
  const rscPayload = decodeAppElementsPromise(createFromFetch(Promise.resolve(reactResponse)));
1082
1050
  if (!browserNavigationController.isCurrentNavigation(navId)) return;
1083
- if (await renderNavigationPayload(rscPayload, navigationSnapshot, currentHref, navId, currentHistoryMode, navParams, requestPreviousNextUrl, detachedNavigationCommits ? null : pendingRouterState, FRESH_APP_NAVIGATION_PAYLOAD_ORIGIN, toActionType(navigationKind), toOperationLane(navigationKind), activeTraversalIntent, scrollIntent, restoredBfcacheIds, reuseCurrentBfcacheIds, visibleCommitMode) !== "committed") return;
1051
+ let committedState = null;
1052
+ if (await renderNavigationPayload(rscPayload, navigationSnapshot, currentHref, navId, currentHistoryMode, navParams, requestPreviousNextUrl, detachedNavigationCommits ? null : pendingRouterState, FRESH_APP_NAVIGATION_PAYLOAD_ORIGIN, toActionType(navigationKind), toOperationLane(navigationKind), activeTraversalIntent, scrollIntent, restoredBfcacheIds, reuseCurrentBfcacheIds, visibleCommitMode, (state) => {
1053
+ committedState = state;
1054
+ if (activeNavigationAbortController === navigationAbortController) activeNavigationAbortController = null;
1055
+ }, detachedNavigationCommits ? "authoritative" : void 0) !== "committed") return;
1084
1056
  if (!browserNavigationController.isCurrentNavigation(navId)) return;
1085
1057
  try {
1086
1058
  const renderedElements = await rscPayload;
1059
+ if (navigationCacheGeneration !== clientNavigationCacheGeneration) return;
1087
1060
  const metadata = AppElementsWire.readMetadata(renderedElements);
1088
- if (!isCacheRestorableAppPayloadMetadata(metadata)) {
1089
- cacheBufferPromise.catch(() => {});
1090
- return;
1091
- }
1092
1061
  const cacheBuffer = await cacheBufferPromise;
1093
- storeVisitedResponseSnapshot(rscUrl, resolveVisitedResponseInterceptionContext(requestInterceptionContext, metadata.interceptionContext), {
1094
- ...createCachedRscResponseSnapshot(navResponse, cacheBuffer, navResponseUrl),
1062
+ if (navigationCacheGeneration !== clientNavigationCacheGeneration) return;
1063
+ const responseSnapshot = createCachedRscResponseSnapshot(navResponse, cacheBuffer, navResponseUrl);
1064
+ const { dynamicStaleTimeSeconds: _staticDynamicStaleTime, ...staticResponseSnapshot } = responseSnapshot;
1065
+ const snapshot = {
1066
+ ...isCacheRestorableAppPayloadMetadata(metadata) ? staticResponseSnapshot : {
1067
+ ...responseSnapshot,
1068
+ ...responseSnapshot.dynamicStaleTimeSeconds === void 0 && metadata.dynamicStaleTimeSeconds !== void 0 ? { dynamicStaleTimeSeconds: metadata.dynamicStaleTimeSeconds } : {}
1069
+ },
1095
1070
  ...navResponseExpiresAt !== void 0 ? { expiresAt: navResponseExpiresAt } : {},
1096
1071
  mountedSlotsHeader: getMountedSlotIdsHeader(renderedElements)
1097
- }, navParams);
1072
+ };
1073
+ const interceptionContext = resolveVisitedResponseInterceptionContext(requestInterceptionContext, metadata.interceptionContext);
1074
+ if (isCacheRestorableAppPayloadMetadata(metadata)) {
1075
+ if (navigationCacheGeneration !== clientNavigationCacheGeneration) return;
1076
+ storeVisitedResponseSnapshot(rscUrl, interceptionContext, snapshot, navParams, PREFETCH_CACHE_TTL, mountedSlotsHeader);
1077
+ } else if (committedState !== null && getMountedSlotIdsHeader(committedState.elements) === null) {
1078
+ const state = committedState;
1079
+ const committedElements = {
1080
+ ...state.elements,
1081
+ [AppElementsWire.keys.layoutFlags]: state.layoutFlags,
1082
+ [AppElementsWire.keys.layoutIds]: state.layoutIds,
1083
+ [AppElementsWire.keys.skippedLayoutIds]: [],
1084
+ [AppElementsWire.keys.slotBindings]: state.slotBindings
1085
+ };
1086
+ if (navigationCacheGeneration !== clientNavigationCacheGeneration) return;
1087
+ storeVisitedResponseSnapshot(rscUrl, interceptionContext, snapshot, navParams, DYNAMIC_NAVIGATION_CACHE_TTL, mountedSlotsHeader, committedElements);
1088
+ } else {
1089
+ if (navigationCacheGeneration !== clientNavigationCacheGeneration) return;
1090
+ seedPrefetchResponseSnapshot(rscUrl, snapshot, interceptionContext, mountedSlotsHeader, DYNAMIC_NAVIGATION_CACHE_TTL);
1091
+ }
1098
1092
  } catch {}
1099
1093
  return;
1100
1094
  }
@@ -1131,17 +1125,27 @@ function bootstrapHydration(rscStream) {
1131
1125
  restorePopstateScrollPosition(event.state);
1132
1126
  return;
1133
1127
  }
1128
+ const snapshotNavigationId = browserNavigationController.beginNavigation();
1129
+ if (restoreHistoryStateSnapshot(event.state, snapshotNavigationId, () => {
1130
+ abortSupersededNavigation();
1131
+ notifyAppRouterTransitionStart(href, "traverse");
1132
+ })) {
1133
+ window.__VINEXT_RSC_PENDING__ = null;
1134
+ restoreSynchronousPopstateScrollPosition({
1135
+ getActiveNavigationId: () => browserNavigationController.getActiveNavigationId(),
1136
+ isCurrentNavigation: (navId) => browserNavigationController.isCurrentNavigation(navId),
1137
+ markScrollRestoreConsumed: (navId) => {
1138
+ synchronousPopstateScrollRestoreNavigationId = navId;
1139
+ },
1140
+ restorePopstateScrollPosition
1141
+ }, event.state);
1142
+ browserNavigationController.finalizeNavigation(snapshotNavigationId, null);
1143
+ return;
1144
+ }
1145
+ browserNavigationController.finalizeNavigation(snapshotNavigationId, null);
1134
1146
  handlePopstate(event);
1135
- if (restoreHistoryStateSnapshot(event.state)) restoreSynchronousPopstateScrollPosition({
1136
- getActiveNavigationId: () => browserNavigationController.getActiveNavigationId(),
1137
- isCurrentNavigation: (navId) => browserNavigationController.isCurrentNavigation(navId),
1138
- markScrollRestoreConsumed: (navId) => {
1139
- synchronousPopstateScrollRestoreNavigationId = navId;
1140
- },
1141
- restorePopstateScrollPosition
1142
- }, event.state);
1143
1147
  });
1144
- if (import.meta.hot) {
1148
+ if (import.meta.env.DEV && import.meta.hot) {
1145
1149
  const applyRscHmrUpdate = async (updateId) => {
1146
1150
  if (updateId !== latestRscHmrUpdateId) return;
1147
1151
  if (document.documentElement.id === "__next_error__") {
@@ -1157,8 +1161,8 @@ function bootstrapHydration(rscStream) {
1157
1161
  if (!browserNavigationController.hasBrowserRouterState()) return;
1158
1162
  clearClientNavigationCaches();
1159
1163
  const navigationSnapshot = createClientNavigationRenderSnapshot(window.location.href, latestClientParams);
1160
- dismissOverlay();
1161
- const hmrHeaders = createRscRequestHeaders();
1164
+ devErrorOverlay?.dismissOverlay();
1165
+ const hmrHeaders = createRscRequestHeaders({ mountedSlotsHeader: getMountedSlotIdsHeader(browserNavigationController.getBrowserRouterState().elements) });
1162
1166
  await browserNavigationController.hmrReplaceTree(decodeAppElementsPromise(createFromFetch(fetch(await createRscRequestUrl(window.location.pathname + window.location.search, hmrHeaders), { headers: hmrHeaders }))), navigationSnapshot);
1163
1167
  };
1164
1168
  const handleRscUpdate = async (updateId) => {
@@ -45,6 +45,7 @@ type CommitNavigationHistoryOptions = {
45
45
  targetHistoryIndex?: number | null;
46
46
  stageClientParams: () => void;
47
47
  };
48
+ declare function createCanonicalBrowserHistoryHref(href: string): string;
48
49
  /**
49
50
  * Owns App Router browser-history metadata and traversal bookkeeping behind a
50
51
  * typed seam: traversal index allocation/commit, push/replace/traverse/hash-only
@@ -101,4 +102,4 @@ declare class AppBrowserHistoryController {
101
102
  restoreHistorySnapshot(options: RestoreHistorySnapshotOptions): boolean;
102
103
  }
103
104
  //#endregion
104
- export { AppBrowserHistoryController, RestorableSnapshotCandidate };
105
+ export { AppBrowserHistoryController, RestorableSnapshotCandidate, createCanonicalBrowserHistoryHref };