vinext 0.1.8 → 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 (237) 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.js +40 -2
  17. package/dist/cli-args.d.ts +1 -2
  18. package/dist/cli-args.js +1 -1
  19. package/dist/cli-dev-config.d.ts +12 -0
  20. package/dist/cli-dev-config.js +23 -0
  21. package/dist/cli.js +111 -95
  22. package/dist/{server → client}/dev-error-overlay-store.d.ts +1 -1
  23. package/dist/{server → client}/dev-error-overlay-store.js +1 -1
  24. package/dist/{server → client}/dev-error-overlay.d.ts +1 -1
  25. package/dist/{server → client}/dev-error-overlay.js +2 -2
  26. package/dist/client/navigation-runtime.d.ts +2 -0
  27. package/dist/client/navigation-runtime.js +3 -1
  28. package/dist/client/window-next.d.ts +2 -1
  29. package/dist/cloudflare/index.d.ts +2 -2
  30. package/dist/cloudflare/index.js +2 -2
  31. package/dist/config/config-matchers.js +14 -10
  32. package/dist/config/next-config.d.ts +5 -3
  33. package/dist/config/next-config.js +44 -1
  34. package/dist/config/prerender.d.ts +34 -0
  35. package/dist/config/prerender.js +55 -0
  36. package/dist/entries/app-rsc-entry.d.ts +2 -1
  37. package/dist/entries/app-rsc-entry.js +40 -10
  38. package/dist/entries/app-rsc-manifest.js +2 -0
  39. package/dist/entries/pages-client-entry.d.ts +3 -0
  40. package/dist/entries/pages-client-entry.js +15 -1
  41. package/dist/entries/pages-server-entry.js +5 -2
  42. package/dist/image/image-adapters-virtual.d.ts +59 -0
  43. package/dist/image/image-adapters-virtual.js +59 -0
  44. package/dist/index.d.ts +33 -0
  45. package/dist/index.js +167 -100
  46. package/dist/init-cloudflare.d.ts +43 -0
  47. package/dist/init-cloudflare.js +839 -0
  48. package/dist/init-platform.d.ts +40 -0
  49. package/dist/init-platform.js +195 -0
  50. package/dist/init.d.ts +16 -38
  51. package/dist/init.js +209 -99
  52. package/dist/node_modules/.pnpm/am-i-vibing@0.5.0/node_modules/am-i-vibing/dist/detector-1yx2Hoe0.js +294 -0
  53. package/dist/node_modules/.pnpm/process-ancestry@0.1.0/node_modules/process-ancestry/dist/index.js +94 -0
  54. package/dist/{cloudflare → packages/cloudflare}/src/cache/cdn-adapter.runtime.js +1 -1
  55. package/dist/{cloudflare → packages/cloudflare}/src/cache/kv-data-adapter.runtime.d.ts +2 -2
  56. package/dist/{cloudflare → packages/cloudflare}/src/cache/kv-data-adapter.runtime.js +1 -1
  57. package/dist/packages/cloudflare/src/deploy-config.js +150 -0
  58. package/dist/packages/cloudflare/src/deploy-help.js +55 -0
  59. package/dist/packages/cloudflare/src/deploy.js +276 -0
  60. package/dist/{cloudflare → packages/cloudflare/src}/tpr.d.ts +4 -41
  61. package/dist/{cloudflare → packages/cloudflare/src}/tpr.js +18 -15
  62. package/dist/plugins/ast-scope.d.ts +16 -0
  63. package/dist/plugins/ast-scope.js +62 -0
  64. package/dist/plugins/ast-utils.d.ts +27 -1
  65. package/dist/plugins/ast-utils.js +32 -1
  66. package/dist/plugins/css-module-imports.d.ts +14 -0
  67. package/dist/plugins/css-module-imports.js +59 -0
  68. package/dist/plugins/extensionless-dynamic-import.js +2 -2
  69. package/dist/plugins/ignore-dynamic-requests.d.ts +11 -0
  70. package/dist/plugins/ignore-dynamic-requests.js +530 -0
  71. package/dist/plugins/typeof-window.d.ts +1 -1
  72. package/dist/plugins/typeof-window.js +28 -56
  73. package/dist/routing/app-route-graph.d.ts +23 -2
  74. package/dist/routing/app-route-graph.js +126 -32
  75. package/dist/routing/file-matcher.d.ts +3 -0
  76. package/dist/routing/file-matcher.js +3 -0
  77. package/dist/routing/pages-router.js +2 -2
  78. package/dist/server/api-handler.js +9 -14
  79. package/dist/server/app-browser-action-result.d.ts +4 -1
  80. package/dist/server/app-browser-action-result.js +8 -1
  81. package/dist/server/app-browser-entry.js +161 -52
  82. package/dist/server/app-browser-interception-context.d.ts +1 -0
  83. package/dist/server/app-browser-interception-context.js +4 -2
  84. package/dist/server/app-browser-navigation-controller.d.ts +2 -0
  85. package/dist/server/app-browser-navigation-controller.js +60 -31
  86. package/dist/server/app-browser-server-action-client.d.ts +1 -1
  87. package/dist/server/app-browser-server-action-client.js +3 -4
  88. package/dist/server/app-browser-state.d.ts +11 -1
  89. package/dist/server/app-browser-state.js +25 -8
  90. package/dist/server/app-browser-visible-commit.d.ts +6 -1
  91. package/dist/server/app-browser-visible-commit.js +43 -25
  92. package/dist/server/app-elements-wire.d.ts +9 -2
  93. package/dist/server/app-elements-wire.js +8 -1
  94. package/dist/server/app-elements.d.ts +2 -2
  95. package/dist/server/app-elements.js +4 -3
  96. package/dist/server/app-fallback-renderer.d.ts +2 -1
  97. package/dist/server/app-fallback-renderer.js +10 -6
  98. package/dist/server/app-hydration-cache-publication.d.ts +11 -0
  99. package/dist/server/app-hydration-cache-publication.js +43 -0
  100. package/dist/server/app-middleware.d.ts +4 -3
  101. package/dist/server/app-middleware.js +8 -3
  102. package/dist/server/app-optimistic-routing.js +11 -4
  103. package/dist/server/app-page-cache-finalizer.js +2 -1
  104. package/dist/server/app-page-cache-render.d.ts +1 -0
  105. package/dist/server/app-page-cache-render.js +8 -4
  106. package/dist/server/app-page-cache.d.ts +1 -0
  107. package/dist/server/app-page-cache.js +5 -2
  108. package/dist/server/app-page-dispatch.js +1 -0
  109. package/dist/server/app-page-element-builder.d.ts +2 -1
  110. package/dist/server/app-page-element-builder.js +58 -4
  111. package/dist/server/app-page-probe.js +5 -0
  112. package/dist/server/app-page-render-identity.d.ts +1 -0
  113. package/dist/server/app-page-render-identity.js +1 -1
  114. package/dist/server/app-page-render.js +18 -0
  115. package/dist/server/app-page-request.d.ts +14 -0
  116. package/dist/server/app-page-request.js +69 -4
  117. package/dist/server/app-page-route-wiring.d.ts +8 -1
  118. package/dist/server/app-page-route-wiring.js +32 -18
  119. package/dist/server/app-page-segment-state.d.ts +2 -1
  120. package/dist/server/app-page-segment-state.js +3 -1
  121. package/dist/server/app-page-stream.d.ts +5 -0
  122. package/dist/server/app-page-stream.js +3 -1
  123. package/dist/server/app-route-handler-execution.js +5 -1
  124. package/dist/server/app-route-handler-response.js +1 -0
  125. package/dist/server/app-route-handler-runtime.js +1 -1
  126. package/dist/server/app-router-entry.js +9 -2
  127. package/dist/server/app-rsc-handler.d.ts +1 -0
  128. package/dist/server/app-rsc-handler.js +62 -31
  129. package/dist/server/app-rsc-request-normalization.d.ts +3 -2
  130. package/dist/server/app-rsc-request-normalization.js +6 -3
  131. package/dist/server/app-segment-config.d.ts +11 -0
  132. package/dist/server/app-segment-config.js +62 -6
  133. package/dist/server/app-server-action-execution.d.ts +1 -0
  134. package/dist/server/app-server-action-execution.js +58 -28
  135. package/dist/server/app-ssr-entry.d.ts +3 -0
  136. package/dist/server/app-ssr-entry.js +15 -7
  137. package/dist/server/app-ssr-stream.d.ts +7 -3
  138. package/dist/server/app-ssr-stream.js +10 -6
  139. package/dist/server/app-visited-response-cache.d.ts +6 -0
  140. package/dist/server/app-visited-response-cache.js +3 -1
  141. package/dist/server/client-trace-metadata.js +26 -0
  142. package/dist/server/default-global-not-found-module.d.ts +14 -0
  143. package/dist/server/default-global-not-found-module.js +14 -0
  144. package/dist/server/dev-route-files.js +4 -0
  145. package/dist/server/dev-server.js +19 -18
  146. package/dist/server/dev-stack-sourcemap.d.ts +1 -1
  147. package/dist/server/dev-stack-sourcemap.js +1 -1
  148. package/dist/server/fetch-handler.d.ts +2 -0
  149. package/dist/server/fetch-handler.js +18 -0
  150. package/dist/server/headers.d.ts +3 -15
  151. package/dist/server/headers.js +2 -15
  152. package/dist/server/image-optimization.d.ts +51 -1
  153. package/dist/server/image-optimization.js +52 -2
  154. package/dist/server/implicit-tags.js +1 -1
  155. package/dist/server/isr-cache.d.ts +1 -1
  156. package/dist/server/isr-cache.js +2 -2
  157. package/dist/server/metadata-routes.d.ts +3 -1
  158. package/dist/server/metadata-routes.js +12 -2
  159. package/dist/server/middleware-runtime.js +6 -1
  160. package/dist/server/navigation-planner.d.ts +1 -0
  161. package/dist/server/navigation-planner.js +14 -3
  162. package/dist/server/pages-api-route.js +2 -2
  163. package/dist/server/pages-asset-tags.d.ts +4 -6
  164. package/dist/server/pages-asset-tags.js +12 -12
  165. package/dist/server/pages-client-assets.d.ts +12 -0
  166. package/dist/server/pages-client-assets.js +10 -0
  167. package/dist/server/pages-node-compat.d.ts +8 -1
  168. package/dist/server/pages-node-compat.js +32 -4
  169. package/dist/server/pages-page-data.d.ts +24 -1
  170. package/dist/server/pages-page-data.js +45 -24
  171. package/dist/server/pages-page-handler.d.ts +2 -1
  172. package/dist/server/pages-page-handler.js +19 -12
  173. package/dist/server/pages-page-response.d.ts +7 -0
  174. package/dist/server/pages-page-response.js +4 -1
  175. package/dist/server/pages-request-pipeline.d.ts +2 -0
  176. package/dist/server/pages-request-pipeline.js +25 -1
  177. package/dist/server/pages-router-entry.d.ts +30 -0
  178. package/dist/server/pages-router-entry.js +108 -0
  179. package/dist/server/prerender-manifest.d.ts +3 -1
  180. package/dist/server/prerender-route-params.js +1 -1
  181. package/dist/server/prod-server.d.ts +1 -1
  182. package/dist/server/prod-server.js +33 -20
  183. package/dist/server/request-pipeline.js +1 -0
  184. package/dist/server/seed-cache.js +4 -4
  185. package/dist/shims/app-router-scroll-state.d.ts +1 -0
  186. package/dist/shims/app-router-scroll-state.js +1 -0
  187. package/dist/shims/app-router-scroll.js +2 -1
  188. package/dist/shims/cache.js +19 -15
  189. package/dist/shims/cdn-cache.js +1 -1
  190. package/dist/shims/dynamic-preload-chunks.js +2 -1
  191. package/dist/shims/form.d.ts +3 -1
  192. package/dist/shims/form.js +37 -43
  193. package/dist/shims/headers.d.ts +7 -1
  194. package/dist/shims/headers.js +17 -3
  195. package/dist/shims/image.js +75 -14
  196. package/dist/shims/internal/app-route-detection.d.ts +2 -17
  197. package/dist/shims/internal/app-route-detection.js +4 -17
  198. package/dist/shims/internal/hybrid-client-route-owner-direct.d.ts +23 -0
  199. package/dist/shims/internal/hybrid-client-route-owner-direct.js +51 -0
  200. package/dist/shims/internal/hybrid-client-route-owner.d.ts +2 -15
  201. package/dist/shims/internal/hybrid-client-route-owner.js +9 -60
  202. package/dist/shims/internal/pages-data-fetch-dedup.d.ts +9 -5
  203. package/dist/shims/internal/pages-data-fetch-dedup.js +73 -14
  204. package/dist/shims/internal/pages-data-target.d.ts +10 -9
  205. package/dist/shims/internal/pages-data-target.js +91 -12
  206. package/dist/shims/internal/pages-router-components.d.ts +7 -0
  207. package/dist/shims/internal/pages-router-components.js +13 -0
  208. package/dist/shims/layout-segment-context.d.ts +4 -1
  209. package/dist/shims/layout-segment-context.js +18 -4
  210. package/dist/shims/link.js +55 -26
  211. package/dist/shims/navigation.d.ts +5 -1
  212. package/dist/shims/navigation.js +45 -10
  213. package/dist/shims/navigation.react-server.js +1 -1
  214. package/dist/shims/root-params.d.ts +15 -1
  215. package/dist/shims/root-params.js +21 -1
  216. package/dist/shims/router.d.ts +5 -7
  217. package/dist/shims/router.js +362 -93
  218. package/dist/shims/server.js +3 -2
  219. package/dist/shims/slot.js +3 -6
  220. package/dist/utils/client-runtime-metadata.d.ts +2 -18
  221. package/dist/utils/client-runtime-metadata.js +31 -22
  222. package/dist/utils/dev-stack-sourcemap-endpoint.d.ts +4 -0
  223. package/dist/{server → utils}/dev-stack-sourcemap-endpoint.js +1 -1
  224. package/dist/utils/domain-locale.d.ts +6 -3
  225. package/dist/{server → utils}/middleware-request-headers.d.ts +1 -1
  226. package/dist/{server → utils}/middleware-request-headers.js +2 -2
  227. package/dist/utils/project.d.ts +48 -2
  228. package/dist/utils/project.js +225 -4
  229. package/dist/utils/protocol-headers.d.ts +17 -0
  230. package/dist/utils/protocol-headers.js +17 -0
  231. package/dist/utils/react-version.d.ts +4 -0
  232. package/dist/utils/react-version.js +44 -0
  233. package/package.json +47 -2
  234. package/dist/deploy.d.ts +0 -197
  235. package/dist/deploy.js +0 -1040
  236. package/dist/server/dev-stack-sourcemap-endpoint.d.ts +0 -4
  237. /package/dist/{cloudflare → packages/cloudflare}/src/utils/cache-control-metadata.js +0 -0
@@ -17,29 +17,30 @@ import { VINEXT_RSC_COMPATIBILITY_ID_HEADER, VINEXT_RSC_CONTENT_TYPE, createRscR
17
17
  import { getNavigationRuntime, registerNavigationRuntimeBootstrap, registerNavigationRuntimeFunctions } from "../client/navigation-runtime.js";
18
18
  import { notifyAppRouterTransitionStart } from "../client/instrumentation-client-state.js";
19
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";
20
23
  import { resolveManifestNavigationInterceptionContext, resolveMiddlewareRewriteNavigationInterceptionContext } from "./app-browser-interception-context.js";
21
24
  import { readHistoryStatePreviousNextUrl } from "./app-history-state.js";
22
25
  import { AppBrowserMpaNavigationScheduler } from "./app-browser-mpa-navigation.js";
23
26
  import { blockDangerousStreamedRscRedirect } from "./app-browser-rsc-redirect.js";
24
27
  import { navigationPlanner } from "./navigation-planner.js";
25
- 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";
26
- import { createBfcacheSegmentStateKeyMap, createInitialBfcacheIdMap } from "./app-bfcache-identity.js";
27
- import { createDiscardedServerActionRefreshScheduler, createServerActionInitiationSnapshot } from "./app-browser-action-result.js";
28
- 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";
29
29
  import { chunksToReadableStream, createProgressiveRscStream, getVinextBrowserGlobal } from "./app-browser-stream.js";
30
- import { FRESH_APP_NAVIGATION_PAYLOAD_ORIGIN, VISITED_CACHE_APP_NAVIGATION_PAYLOAD_ORIGIN, isCacheRestorableAppPayloadMetadata, resolveInterceptionContextFromPreviousNextUrl } 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";
31
31
  import { clearHardNavigationLoopGuard, createAppBrowserNavigationController, createBasePathStrippedPathAndSearch } from "./app-browser-navigation-controller.js";
32
32
  import { consumeInitialFormState, createVinextHydrateRootOptions, hydrateRootInTransition } from "./app-browser-hydration.js";
33
33
  import { AppBrowserHistoryController } from "./app-browser-history-controller.js";
34
34
  import { createVisitedResponseCacheEntry, isVisitedResponseCacheEntryFresh } from "./app-visited-response-cache.js";
35
35
  import { createPopstateRestoreHandler, restoreSynchronousPopstateScrollPosition } from "./app-browser-popstate.js";
36
36
  import { createDevOnCaughtError, createOnUncaughtError, createProdOnCaughtError, prodOnRecoverableError } from "./app-browser-error.js";
37
+ import { createHydrationCachePublication } from "./app-hydration-cache-publication.js";
37
38
  import { createOptimisticRouteTemplate, getOptimisticPrefetchSourceKey, getOptimisticRouteTemplateKey, resolveOptimisticNavigationPayload } from "./app-optimistic-routing.js";
38
39
  import { removeStylesheetLinksCoveredByInlineCss } from "./app-inline-css-client.js";
39
40
  import { createElement, startTransition, use, useEffect, useLayoutEffect, useMemo, useRef, useState } from "react";
40
41
  import { flushSync } from "react-dom";
41
- import { createFromFetch, createFromReadableStream, setServerCallback } from "@vitejs/plugin-rsc/browser";
42
42
  import { createRoot, hydrateRoot } from "react-dom/client";
43
+ import { createFromFetch, createFromReadableStream, setServerCallback } from "@vitejs/plugin-rsc/browser";
43
44
  import { hasServerActions, loadServerActionClient } from "virtual:vinext-app-capabilities";
44
45
  //#region src/server/app-browser-entry.ts
45
46
  function toActionType(kind) {
@@ -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,7 +305,9 @@ 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
313
  async function commitSameUrlNavigatePayload(nextElements, actionInitiation, returnValue, revalidation = "none") {
@@ -341,7 +348,7 @@ function readVisitedResponseCacheCandidate(rscUrl, interceptionContext, mountedS
341
348
  navigationKind,
342
349
  now: Date.now()
343
350
  }),
344
- mountedSlotsMatch: (cached.response.mountedSlotsHeader ?? null) === mountedSlotsHeader,
351
+ mountedSlotsMatch: cached.mountedSlotsHeader === mountedSlotsHeader,
345
352
  navigationKind
346
353
  }
347
354
  };
@@ -359,20 +366,32 @@ function applyVisitedResponseCacheCandidateDecision(candidate, decision) {
359
366
  function deleteVisitedResponse(rscUrl, interceptionContext) {
360
367
  visitedResponseCache.delete(AppElementsWire.encodeCacheKey(rscUrl, interceptionContext));
361
368
  }
362
- function storeVisitedResponseSnapshot(rscUrl, interceptionContext, snapshot, params) {
369
+ function storeVisitedResponseSnapshot(rscUrl, interceptionContext, snapshot, params, prefetchFallbackTtlMs = DYNAMIC_NAVIGATION_CACHE_TTL, requestMountedSlotsHeader = snapshot.mountedSlotsHeader ?? null, elements) {
363
370
  const cacheKey = AppElementsWire.encodeCacheKey(rscUrl, interceptionContext);
364
371
  visitedResponseCache.delete(cacheKey);
365
372
  evictVisitedResponseCacheIfNeeded();
366
- const now = Date.now();
367
- visitedResponseCache.set(cacheKey, createVisitedResponseCacheEntry({
368
- now,
373
+ const entry = createVisitedResponseCacheEntry({
374
+ fallbackTtlMs: prefetchFallbackTtlMs,
375
+ elements,
376
+ now: Date.now(),
377
+ mountedSlotsHeader: requestMountedSlotsHeader,
369
378
  params,
370
379
  response: snapshot
371
- }));
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
+ };
372
387
  }
373
388
  function clientNavigationSnapshotHref(snapshot) {
374
389
  return `${window.location.origin}${createSnapshotPathAndSearch(snapshot)}`;
375
390
  }
391
+ function getCurrentMatchedRoutePathname() {
392
+ const routeKey = AppElementsWire.parseElementKey(getBrowserRouterState().routeId);
393
+ return routeKey?.kind === "route" ? routeKey.path : null;
394
+ }
376
395
  function getRequestState(navigationKind, targetPathname, previousNextUrlOverride, traverseHistoryState) {
377
396
  if (previousNextUrlOverride !== void 0) return {
378
397
  interceptionContext: resolveInterceptionContextFromPreviousNextUrl(previousNextUrlOverride, __basePath),
@@ -397,6 +416,7 @@ function getRequestState(navigationKind, targetPathname, previousNextUrlOverride
397
416
  };
398
417
  const middlewareRewriteInterceptionContext = resolveMiddlewareRewriteNavigationInterceptionContext({
399
418
  basePath: __basePath,
419
+ currentMatchedPathname: getCurrentMatchedRoutePathname(),
400
420
  currentPathname: window.location.pathname,
401
421
  routeManifest: getBrowserRouteManifest(),
402
422
  targetPathname
@@ -462,7 +482,7 @@ function AppRouterRedirectBridge({ children }) {
462
482
  function decodeAppElementsPromise(payload) {
463
483
  return Promise.resolve(payload).then((elements) => AppElementsWire.decode(elements));
464
484
  }
465
- function BrowserRoot({ initialElements, initialNavigationSnapshot }) {
485
+ function BrowserRoot({ hydrationCachePublication, initialElements, initialNavigationSnapshot }) {
466
486
  const resolvedElements = use(initialElements);
467
487
  const initialMetadata = AppElementsWire.readMetadata(resolvedElements);
468
488
  const [treeStateValue, setTreeStateValue] = useState(() => ({
@@ -502,19 +522,22 @@ function BrowserRoot({ initialElements, initialNavigationSnapshot }) {
502
522
  return new Promise(() => {});
503
523
  } });
504
524
  browserRouterStateHasEverCommitted = true;
525
+ hydrationCachePublication.commit();
505
526
  return () => {
527
+ hydrationCachePublication.invalidate();
506
528
  registerNavigationRuntimeFunctions({ navigateExternal: void 0 });
507
529
  detach();
508
530
  setMountedSlotsHeader(null);
509
531
  };
510
- }, [setTreeStateValue]);
532
+ }, [hydrationCachePublication, setTreeStateValue]);
511
533
  useEffect(() => {
534
+ hydrationCachePublication.complete();
512
535
  const hydratedAt = performance.now();
513
536
  window.__VINEXT_HYDRATED_AT = hydratedAt;
514
537
  window.__NEXT_HYDRATED = true;
515
538
  window.__NEXT_HYDRATED_AT = hydratedAt;
516
539
  window.__NEXT_HYDRATED_CB?.();
517
- }, []);
540
+ }, [hydrationCachePublication]);
518
541
  useLayoutEffect(() => {
519
542
  historyController.rememberHistoryStateSnapshot(treeState);
520
543
  }, [treeState]);
@@ -673,11 +696,11 @@ function registerServerActionCallback() {
673
696
  commitSameUrlNavigatePayload,
674
697
  navigationPlanner,
675
698
  performHardNavigation: (url, historyMode) => browserNavigationController.performHardNavigation(url, historyMode),
676
- renderRedirectPayload(elements, target, actionInitiation) {
699
+ renderRedirectPayload(elements, target, actionInitiation, revalidation) {
677
700
  const hashIdx = target.href.indexOf("#");
678
701
  const actionScrollIntent = beginAppRouterScrollIntent((hashIdx !== -1 ? target.href.slice(hashIdx) : "") || null);
679
702
  if (target.type === "push") saveScrollPosition();
680
- 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", "server-action", null, actionScrollIntent).catch(() => {
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(() => {
681
704
  browserNavigationController.performHardNavigation(target.href);
682
705
  });
683
706
  },
@@ -692,32 +715,76 @@ async function main() {
692
715
  installAppNavigationFailureListeners();
693
716
  let devErrorOverlay = null;
694
717
  if (import.meta.env.DEV) {
695
- devErrorOverlay = await import("./dev-error-overlay.js");
718
+ devErrorOverlay = await import("../client/dev-error-overlay.js");
696
719
  devErrorOverlay.installDevErrorOverlay();
697
720
  devErrorOverlay.installViteHmrErrorHandler(import.meta.hot);
698
721
  devErrorOverlay.reportInitialDevServerErrors();
699
722
  }
723
+ const initialRscBootstrap = getNavigationRuntime()?.bootstrap.rsc;
700
724
  const rscStream = await readInitialRscStream();
701
725
  if (rscStream === null) return;
702
- bootstrapHydration(rscStream, devErrorOverlay);
726
+ bootstrapHydration(rscStream, devErrorOverlay, initialRscBootstrap);
703
727
  }
704
- function bootstrapHydration(rscStream, devErrorOverlay) {
705
- 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));
706
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(() => {});
707
761
  historyController.writeBootstrapHistoryMetadata();
708
- 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
+ });
709
775
  const formState = consumeInitialFormState(getVinextBrowserGlobal());
710
776
  const hydrateRootOptions = import.meta.env.DEV && devErrorOverlay ? createVinextHydrateRootOptions({
711
777
  formState,
712
- onCaughtError: createDevOnCaughtError(devErrorOverlay.devOnCaughtError, onUncaughtError),
778
+ onCaughtError: invalidateOnCaughtError(createDevOnCaughtError(devErrorOverlay.devOnCaughtError, onUncaughtError)),
713
779
  onUncaughtError
714
780
  }) : createVinextHydrateRootOptions({
715
781
  formState,
716
- onCaughtError: createProdOnCaughtError(onUncaughtError),
717
- onRecoverableError: prodOnRecoverableError,
782
+ onCaughtError: invalidateOnCaughtError(createProdOnCaughtError(onUncaughtError)),
783
+ onRecoverableError,
718
784
  onUncaughtError
719
785
  });
720
786
  const children = createElement(BrowserRoot, {
787
+ hydrationCachePublication,
721
788
  initialElements: root,
722
789
  initialNavigationSnapshot
723
790
  });
@@ -739,15 +806,20 @@ function bootstrapHydration(rscStream, devErrorOverlay) {
739
806
  });
740
807
  markInitialAppRouterBootstrapHydrated();
741
808
  let activeNavigationAbortController = null;
809
+ function abortSupersededNavigation() {
810
+ activeNavigationAbortController?.abort();
811
+ activeNavigationAbortController = null;
812
+ }
742
813
  registerNavigationRuntimeFunctions({
743
814
  clearNavigationCaches: clearClientNavigationCaches,
744
815
  commitHashNavigation: (href, historyUpdateMode, scroll) => historyController.commitHashOnlyNavigation(href, historyUpdateMode, scroll),
745
816
  navigate: async function navigateRsc(href, redirectDepth = 0, navigationKind = "navigate", historyUpdateMode, previousNextUrlOverride, programmaticTransition = false, traversalIntent, scrollIntent, visibleCommitMode = "transition") {
746
- activeNavigationAbortController?.abort();
817
+ abortSupersededNavigation();
747
818
  const navigationAbortController = new AbortController();
748
819
  activeNavigationAbortController = navigationAbortController;
749
820
  let pendingRouterState = null;
750
821
  const navId = browserNavigationController.beginNavigation();
822
+ const navigationCacheGeneration = clientNavigationCacheGeneration;
751
823
  discardedServerActionRefreshScheduler.markNavigationStart();
752
824
  let currentHref = href;
753
825
  let currentHistoryMode = historyUpdateMode;
@@ -855,9 +927,10 @@ function bootstrapHydration(rscStream, devErrorOverlay) {
855
927
  if (!browserNavigationController.isCurrentNavigation(navId)) return;
856
928
  const cachedParams = cachedRoute.params;
857
929
  const cachedNavigationSnapshot = createClientNavigationRenderSnapshot(currentHref, cachedParams);
858
- 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))));
859
931
  if (!browserNavigationController.isCurrentNavigation(navId)) return;
860
- 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;
861
934
  deleteVisitedResponse(rscUrl, requestInterceptionContext);
862
935
  continue;
863
936
  }
@@ -909,7 +982,7 @@ function bootstrapHydration(rscStream, devErrorOverlay) {
909
982
  if (optimisticPayload !== null) {
910
983
  detachedNavigationCommits = true;
911
984
  const optimisticNavigationSnapshot = createClientNavigationRenderSnapshot(currentHref, optimisticPayload.params);
912
- 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) => {
913
986
  if (browserNavigationController.isCurrentNavigation(navId)) console.error("[vinext] Optimistic RSC navigation error:", error);
914
987
  });
915
988
  }
@@ -975,21 +1048,47 @@ function bootstrapHydration(rscStream, devErrorOverlay) {
975
1048
  if (!browserNavigationController.isCurrentNavigation(navId)) return;
976
1049
  const rscPayload = decodeAppElementsPromise(createFromFetch(Promise.resolve(reactResponse)));
977
1050
  if (!browserNavigationController.isCurrentNavigation(navId)) return;
978
- 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;
979
1056
  if (!browserNavigationController.isCurrentNavigation(navId)) return;
980
1057
  try {
981
1058
  const renderedElements = await rscPayload;
1059
+ if (navigationCacheGeneration !== clientNavigationCacheGeneration) return;
982
1060
  const metadata = AppElementsWire.readMetadata(renderedElements);
983
- if (!isCacheRestorableAppPayloadMetadata(metadata)) {
984
- cacheBufferPromise.catch(() => {});
985
- return;
986
- }
987
1061
  const cacheBuffer = await cacheBufferPromise;
988
- storeVisitedResponseSnapshot(rscUrl, resolveVisitedResponseInterceptionContext(requestInterceptionContext, metadata.interceptionContext), {
989
- ...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
+ },
990
1070
  ...navResponseExpiresAt !== void 0 ? { expiresAt: navResponseExpiresAt } : {},
991
1071
  mountedSlotsHeader: getMountedSlotIdsHeader(renderedElements)
992
- }, 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
+ }
993
1092
  } catch {}
994
1093
  return;
995
1094
  }
@@ -1026,15 +1125,25 @@ function bootstrapHydration(rscStream, devErrorOverlay) {
1026
1125
  restorePopstateScrollPosition(event.state);
1027
1126
  return;
1028
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);
1029
1146
  handlePopstate(event);
1030
- if (restoreHistoryStateSnapshot(event.state)) restoreSynchronousPopstateScrollPosition({
1031
- getActiveNavigationId: () => browserNavigationController.getActiveNavigationId(),
1032
- isCurrentNavigation: (navId) => browserNavigationController.isCurrentNavigation(navId),
1033
- markScrollRestoreConsumed: (navId) => {
1034
- synchronousPopstateScrollRestoreNavigationId = navId;
1035
- },
1036
- restorePopstateScrollPosition
1037
- }, event.state);
1038
1147
  });
1039
1148
  if (import.meta.env.DEV && import.meta.hot) {
1040
1149
  const applyRscHmrUpdate = async (updateId) => {
@@ -1053,7 +1162,7 @@ function bootstrapHydration(rscStream, devErrorOverlay) {
1053
1162
  clearClientNavigationCaches();
1054
1163
  const navigationSnapshot = createClientNavigationRenderSnapshot(window.location.href, latestClientParams);
1055
1164
  devErrorOverlay?.dismissOverlay();
1056
- const hmrHeaders = createRscRequestHeaders();
1165
+ const hmrHeaders = createRscRequestHeaders({ mountedSlotsHeader: getMountedSlotIdsHeader(browserNavigationController.getBrowserRouterState().elements) });
1057
1166
  await browserNavigationController.hmrReplaceTree(decodeAppElementsPromise(createFromFetch(fetch(await createRscRequestUrl(window.location.pathname + window.location.search, hmrHeaders), { headers: hmrHeaders }))), navigationSnapshot);
1058
1167
  };
1059
1168
  const handleRscUpdate = async (updateId) => {
@@ -3,6 +3,7 @@ import { RouteManifest } from "../routing/app-route-graph.js";
3
3
  //#region src/server/app-browser-interception-context.d.ts
4
4
  type ResolveManifestNavigationInterceptionContextOptions = {
5
5
  basePath: string;
6
+ currentMatchedPathname?: string | null;
6
7
  currentPathname: string;
7
8
  routeManifest: RouteManifest | null;
8
9
  targetPathname: string;
@@ -29,13 +29,15 @@ function resolveManifestNavigationInterceptionContext(options) {
29
29
  function resolveMiddlewareRewriteNavigationInterceptionContext(options) {
30
30
  if (options.routeManifest === null) return null;
31
31
  const currentPathname = stripBasePath(options.currentPathname, options.basePath);
32
+ const currentMatchedPathname = options.currentMatchedPathname ? stripBasePath(options.currentMatchedPathname, options.basePath) : null;
32
33
  const targetPathname = stripBasePath(options.targetPathname, options.basePath);
33
34
  const sourceParts = splitPathnameForRouteMatch(currentPathname);
35
+ const matchedSourceParts = currentMatchedPathname ? splitPathnameForRouteMatch(currentMatchedPathname) : null;
34
36
  const targetParts = splitPathnameForRouteMatch(targetPathname);
35
37
  for (const interception of options.routeManifest.segmentGraph.interceptions.values()) {
36
- if (!matchRoutePatternPrefix(sourceParts, interception.sourcePatternParts)) continue;
37
38
  if (!matchRoutePatternWithOptionalDynamicSegments(targetParts, interception.targetPatternParts)) continue;
38
- return currentPathname;
39
+ if (matchRoutePatternPrefix(sourceParts, interception.sourcePatternParts)) return currentPathname;
40
+ if (currentMatchedPathname !== null && matchedSourceParts !== null && matchRoutePatternPrefix(matchedSourceParts, interception.sourcePatternParts)) return currentMatchedPathname;
39
41
  }
40
42
  return null;
41
43
  }
@@ -77,7 +77,9 @@ type BrowserNavigationController = {
77
77
  targetHistoryIndex?: number | null;
78
78
  targetHref: string;
79
79
  navId: number;
80
+ navigationCommitKind?: "authoritative" | "detached";
80
81
  visibleCommitMode?: NavigationRuntimeVisibleCommitMode;
82
+ onCommittedState?: (state: AppRouterState) => void;
81
83
  }): Promise<NavigationPayloadOutcome>;
82
84
  commitSameUrlNavigatePayload(nextElements: Promise<AppElements>, navigationSnapshot: ClientNavigationRenderSnapshot, returnValue?: {
83
85
  ok: boolean;