vinext 0.1.2 → 0.1.4

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 (243) hide show
  1. package/dist/build/client-build-config.d.ts +11 -2
  2. package/dist/build/client-build-config.js +17 -6
  3. package/dist/build/prerender.d.ts +9 -1
  4. package/dist/build/prerender.js +42 -12
  5. package/dist/build/run-prerender.d.ts +10 -2
  6. package/dist/build/run-prerender.js +15 -1
  7. package/dist/client/app-nav-failure-handler.d.ts +8 -0
  8. package/dist/client/app-nav-failure-handler.js +44 -0
  9. package/dist/client/pages-router-link-navigation.d.ts +33 -7
  10. package/dist/client/pages-router-link-navigation.js +32 -2
  11. package/dist/client/vinext-next-data.d.ts +18 -1
  12. package/dist/client/vinext-next-data.js +2 -0
  13. package/dist/client/window-next.d.ts +2 -1
  14. package/dist/client/window-next.js +12 -1
  15. package/dist/cloudflare/src/cache/cdn-adapter.runtime.js +6 -1
  16. package/dist/config/config-matchers.d.ts +11 -1
  17. package/dist/config/config-matchers.js +87 -16
  18. package/dist/config/next-config.d.ts +46 -4
  19. package/dist/config/next-config.js +147 -48
  20. package/dist/config/tsconfig-paths.js +14 -1
  21. package/dist/deploy.d.ts +30 -11
  22. package/dist/deploy.js +200 -112
  23. package/dist/entries/app-browser-entry.d.ts +9 -3
  24. package/dist/entries/app-browser-entry.js +21 -3
  25. package/dist/entries/app-rsc-entry.d.ts +2 -0
  26. package/dist/entries/app-rsc-entry.js +65 -5
  27. package/dist/entries/app-rsc-manifest.js +2 -0
  28. package/dist/entries/app-ssr-entry.js +1 -1
  29. package/dist/entries/pages-client-entry.js +66 -20
  30. package/dist/entries/pages-server-entry.js +47 -31
  31. package/dist/index.js +417 -102
  32. package/dist/plugins/dynamic-preload-metadata.js +2 -4
  33. package/dist/plugins/extensionless-dynamic-import.d.ts +6 -0
  34. package/dist/plugins/extensionless-dynamic-import.js +152 -0
  35. package/dist/plugins/fonts.js +5 -4
  36. package/dist/plugins/optimize-imports.d.ts +2 -1
  37. package/dist/plugins/optimize-imports.js +11 -9
  38. package/dist/plugins/postcss.js +7 -7
  39. package/dist/plugins/strip-server-exports.d.ts +9 -7
  40. package/dist/plugins/strip-server-exports.js +493 -46
  41. package/dist/plugins/typeof-window.d.ts +14 -0
  42. package/dist/plugins/typeof-window.js +150 -0
  43. package/dist/routing/app-route-graph.d.ts +2 -1
  44. package/dist/routing/app-route-graph.js +46 -16
  45. package/dist/routing/file-matcher.d.ts +10 -1
  46. package/dist/routing/file-matcher.js +22 -1
  47. package/dist/routing/pages-router.js +3 -3
  48. package/dist/routing/utils.d.ts +35 -6
  49. package/dist/routing/utils.js +59 -7
  50. package/dist/server/api-handler.d.ts +6 -1
  51. package/dist/server/api-handler.js +21 -15
  52. package/dist/server/app-browser-action-result.d.ts +19 -6
  53. package/dist/server/app-browser-action-result.js +20 -11
  54. package/dist/server/app-browser-entry.js +175 -91
  55. package/dist/server/app-browser-error.d.ts +10 -6
  56. package/dist/server/app-browser-error.js +43 -8
  57. package/dist/server/app-browser-hydration.d.ts +2 -0
  58. package/dist/server/app-browser-hydration.js +1 -0
  59. package/dist/server/app-browser-navigation-controller.d.ts +5 -3
  60. package/dist/server/app-browser-navigation-controller.js +23 -2
  61. package/dist/server/app-browser-server-action-navigation.d.ts +6 -0
  62. package/dist/server/app-browser-server-action-navigation.js +9 -0
  63. package/dist/server/app-browser-state.d.ts +1 -1
  64. package/dist/server/app-browser-state.js +19 -11
  65. package/dist/server/app-browser-stream.js +86 -43
  66. package/dist/server/app-browser-visible-commit.d.ts +1 -1
  67. package/dist/server/app-elements-wire.d.ts +6 -1
  68. package/dist/server/app-elements-wire.js +14 -4
  69. package/dist/server/app-elements.d.ts +2 -2
  70. package/dist/server/app-elements.js +2 -2
  71. package/dist/server/app-fallback-renderer.d.ts +1 -0
  72. package/dist/server/app-fallback-renderer.js +3 -1
  73. package/dist/server/app-optimistic-routing.js +2 -2
  74. package/dist/server/app-page-boundary-render.d.ts +1 -0
  75. package/dist/server/app-page-boundary-render.js +27 -14
  76. package/dist/server/app-page-cache-render.d.ts +53 -0
  77. package/dist/server/app-page-cache-render.js +91 -0
  78. package/dist/server/app-page-cache.d.ts +16 -2
  79. package/dist/server/app-page-cache.js +62 -1
  80. package/dist/server/app-page-dispatch.d.ts +26 -0
  81. package/dist/server/app-page-dispatch.js +149 -92
  82. package/dist/server/app-page-element-builder.d.ts +1 -0
  83. package/dist/server/app-page-element-builder.js +5 -2
  84. package/dist/server/app-page-execution.d.ts +6 -1
  85. package/dist/server/app-page-execution.js +21 -1
  86. package/dist/server/app-page-probe.d.ts +1 -0
  87. package/dist/server/app-page-probe.js +4 -0
  88. package/dist/server/app-page-render-observation.d.ts +3 -1
  89. package/dist/server/app-page-render-observation.js +17 -1
  90. package/dist/server/app-page-render.d.ts +12 -1
  91. package/dist/server/app-page-render.js +42 -4
  92. package/dist/server/app-page-request.d.ts +2 -0
  93. package/dist/server/app-page-request.js +2 -1
  94. package/dist/server/app-page-route-wiring.d.ts +3 -1
  95. package/dist/server/app-page-route-wiring.js +14 -5
  96. package/dist/server/app-page-stream.d.ts +15 -3
  97. package/dist/server/app-page-stream.js +11 -5
  98. package/dist/server/app-pages-bridge.d.ts +23 -1
  99. package/dist/server/app-pages-bridge.js +26 -17
  100. package/dist/server/app-ppr-fallback-shell-render.d.ts +17 -0
  101. package/dist/server/app-ppr-fallback-shell-render.js +26 -0
  102. package/dist/server/app-ppr-fallback-shell.d.ts +13 -1
  103. package/dist/server/app-ppr-fallback-shell.js +8 -1
  104. package/dist/server/app-route-handler-dispatch.js +9 -2
  105. package/dist/server/app-route-handler-policy.d.ts +1 -0
  106. package/dist/server/app-router-entry.js +5 -0
  107. package/dist/server/app-rsc-cache-busting.js +2 -0
  108. package/dist/server/app-rsc-handler.d.ts +28 -0
  109. package/dist/server/app-rsc-handler.js +195 -59
  110. package/dist/server/app-rsc-route-matching.d.ts +3 -0
  111. package/dist/server/app-rsc-route-matching.js +8 -2
  112. package/dist/server/app-segment-config.d.ts +9 -1
  113. package/dist/server/app-segment-config.js +12 -3
  114. package/dist/server/app-server-action-execution.d.ts +1 -0
  115. package/dist/server/app-server-action-execution.js +47 -15
  116. package/dist/server/app-ssr-entry.d.ts +2 -0
  117. package/dist/server/app-ssr-entry.js +84 -39
  118. package/dist/server/before-interactive-head.d.ts +17 -0
  119. package/dist/server/before-interactive-head.js +35 -0
  120. package/dist/server/cache-control.js +4 -0
  121. package/dist/server/csp.js +1 -4
  122. package/dist/server/dev-server.d.ts +2 -2
  123. package/dist/server/dev-server.js +321 -83
  124. package/dist/server/hybrid-route-priority.d.ts +22 -0
  125. package/dist/server/hybrid-route-priority.js +33 -0
  126. package/dist/server/image-optimization.d.ts +18 -9
  127. package/dist/server/image-optimization.js +37 -23
  128. package/dist/server/implicit-tags.d.ts +2 -1
  129. package/dist/server/implicit-tags.js +4 -1
  130. package/dist/server/middleware-matcher.js +12 -3
  131. package/dist/server/middleware-runtime.d.ts +3 -4
  132. package/dist/server/middleware-runtime.js +2 -0
  133. package/dist/server/navigation-planner.d.ts +135 -41
  134. package/dist/server/navigation-planner.js +138 -0
  135. package/dist/server/navigation-trace.d.ts +9 -1
  136. package/dist/server/navigation-trace.js +9 -1
  137. package/dist/server/operation-token.d.ts +40 -0
  138. package/dist/server/operation-token.js +85 -0
  139. package/dist/server/pages-api-route.d.ts +6 -0
  140. package/dist/server/pages-api-route.js +13 -2
  141. package/dist/server/pages-asset-tags.d.ts +2 -1
  142. package/dist/server/pages-asset-tags.js +6 -2
  143. package/dist/server/pages-data-route.d.ts +9 -2
  144. package/dist/server/pages-data-route.js +18 -6
  145. package/dist/server/pages-dev-module-url.d.ts +4 -0
  146. package/dist/server/pages-dev-module-url.js +15 -0
  147. package/dist/server/pages-document-initial-props.d.ts +4 -15
  148. package/dist/server/pages-document-initial-props.js +27 -56
  149. package/dist/server/pages-get-initial-props.d.ts +54 -4
  150. package/dist/server/pages-get-initial-props.js +43 -1
  151. package/dist/server/pages-i18n.js +2 -2
  152. package/dist/server/pages-node-compat.js +2 -2
  153. package/dist/server/pages-page-data.d.ts +11 -2
  154. package/dist/server/pages-page-data.js +207 -34
  155. package/dist/server/pages-page-handler.d.ts +4 -2
  156. package/dist/server/pages-page-handler.js +62 -23
  157. package/dist/server/pages-page-response.d.ts +4 -1
  158. package/dist/server/pages-page-response.js +11 -8
  159. package/dist/server/pages-readiness.js +1 -1
  160. package/dist/server/pages-request-pipeline.d.ts +8 -7
  161. package/dist/server/pages-request-pipeline.js +126 -47
  162. package/dist/server/pregenerated-concrete-paths.d.ts +1 -17
  163. package/dist/server/pregenerated-concrete-paths.js +2 -19
  164. package/dist/server/prerender-manifest.d.ts +33 -0
  165. package/dist/server/prerender-manifest.js +54 -0
  166. package/dist/server/prerender-route-params.d.ts +1 -2
  167. package/dist/server/prod-server.d.ts +3 -1
  168. package/dist/server/prod-server.js +50 -13
  169. package/dist/server/request-pipeline.d.ts +3 -15
  170. package/dist/server/request-pipeline.js +58 -47
  171. package/dist/server/rsc-stream-hints.d.ts +5 -1
  172. package/dist/server/rsc-stream-hints.js +6 -1
  173. package/dist/server/seed-cache.js +10 -18
  174. package/dist/server/static-file-cache.js +16 -4
  175. package/dist/shims/app-router-scroll-state.d.ts +3 -1
  176. package/dist/shims/app-router-scroll-state.js +14 -2
  177. package/dist/shims/app-router-scroll.d.ts +3 -0
  178. package/dist/shims/app-router-scroll.js +28 -18
  179. package/dist/shims/before-interactive-context.d.ts +14 -3
  180. package/dist/shims/cache-runtime.js +3 -2
  181. package/dist/shims/cache.d.ts +1 -0
  182. package/dist/shims/cache.js +1 -1
  183. package/dist/shims/cdn-cache.d.ts +5 -5
  184. package/dist/shims/document.d.ts +15 -20
  185. package/dist/shims/document.js +5 -8
  186. package/dist/shims/dynamic-preload-chunks.js +6 -4
  187. package/dist/shims/error-boundary.d.ts +2 -0
  188. package/dist/shims/error-boundary.js +7 -0
  189. package/dist/shims/error.js +3 -2
  190. package/dist/shims/error.react-server.d.ts +9 -0
  191. package/dist/shims/error.react-server.js +6 -0
  192. package/dist/shims/fetch-cache.d.ts +3 -1
  193. package/dist/shims/fetch-cache.js +45 -20
  194. package/dist/shims/hash-scroll.js +6 -1
  195. package/dist/shims/headers.js +29 -4
  196. package/dist/shims/image.js +9 -2
  197. package/dist/shims/internal/als-registry.js +28 -1
  198. package/dist/shims/internal/app-route-detection.js +8 -17
  199. package/dist/shims/internal/hybrid-client-route-owner.d.ts +31 -0
  200. package/dist/shims/internal/hybrid-client-route-owner.js +143 -0
  201. package/dist/shims/internal/navigation-untracked.d.ts +35 -0
  202. package/dist/shims/internal/navigation-untracked.js +55 -0
  203. package/dist/shims/internal/pages-data-fetch-dedup.d.ts +6 -7
  204. package/dist/shims/internal/pages-data-fetch-dedup.js +67 -14
  205. package/dist/shims/internal/pages-data-target.d.ts +7 -2
  206. package/dist/shims/internal/pages-data-target.js +17 -8
  207. package/dist/shims/internal/pages-router-accessor.d.ts +19 -0
  208. package/dist/shims/internal/pages-router-accessor.js +13 -0
  209. package/dist/shims/internal/router-context.d.ts +2 -1
  210. package/dist/shims/internal/router-context.js +3 -1
  211. package/dist/shims/link.js +47 -19
  212. package/dist/shims/metadata.js +4 -4
  213. package/dist/shims/navigation.d.ts +8 -2
  214. package/dist/shims/navigation.js +63 -31
  215. package/dist/shims/ppr-fallback-shell.d.ts +5 -1
  216. package/dist/shims/ppr-fallback-shell.js +28 -7
  217. package/dist/shims/router.d.ts +18 -3
  218. package/dist/shims/router.js +512 -142
  219. package/dist/shims/script.js +8 -4
  220. package/dist/shims/server.d.ts +16 -1
  221. package/dist/shims/server.js +44 -12
  222. package/dist/shims/unified-request-context.js +1 -0
  223. package/dist/utils/built-asset-url.d.ts +4 -0
  224. package/dist/utils/built-asset-url.js +11 -0
  225. package/dist/utils/commonjs-loader.d.ts +16 -0
  226. package/dist/utils/commonjs-loader.js +100 -0
  227. package/dist/utils/deployment-id.d.ts +8 -0
  228. package/dist/utils/deployment-id.js +22 -0
  229. package/dist/utils/has-trailing-comma.d.ts +24 -0
  230. package/dist/utils/has-trailing-comma.js +62 -0
  231. package/dist/utils/html-limited-bots.d.ts +18 -1
  232. package/dist/utils/html-limited-bots.js +23 -1
  233. package/dist/utils/parse-cookie.d.ts +13 -0
  234. package/dist/utils/parse-cookie.js +52 -0
  235. package/dist/utils/path.d.ts +7 -1
  236. package/dist/utils/path.js +9 -1
  237. package/dist/utils/text-stream.d.ts +1 -1
  238. package/dist/utils/text-stream.js +2 -2
  239. package/dist/utils/vite-version.d.ts +12 -1
  240. package/dist/utils/vite-version.js +9 -1
  241. package/package.json +2 -2
  242. package/dist/shims/internal/parse-cookie-header.d.ts +0 -14
  243. package/dist/shims/internal/parse-cookie-header.js +0 -30
@@ -8,15 +8,16 @@ import { APP_RSC_RENDER_MODE_PREFETCH_LOADING_SHELL } from "../server/app-rsc-re
8
8
  import "../server/app-elements.js";
9
9
  import { addLocalePrefix, getDomainLocaleUrl } from "../utils/domain-locale.js";
10
10
  import { prefetchPagesData, resolvePagesDataNavigationTarget } from "./internal/pages-data-target.js";
11
- import { markAppRouteDetectedOnPrefetch } from "./internal/app-route-detection.js";
12
- import { isAbsoluteOrProtocolRelativeUrl, normalizePathTrailingSlash, resolveRelativeHref, toBrowserNavigationHref, toSameOriginAppPath, withBasePath } from "./url-utils.js";
13
11
  import { appendSearchParamsToUrl, urlQueryToSearchParams } from "../utils/query.js";
12
+ import { resolveHybridClientRouteOwner } from "./internal/hybrid-client-route-owner.js";
13
+ import { markAppRouteDetectedOnPrefetch } from "./internal/app-route-detection.js";
14
+ import { isAbsoluteOrProtocolRelativeUrl, normalizePathTrailingSlash, toBrowserNavigationHref, toSameOriginAppPath, withBasePath } from "./url-utils.js";
14
15
  import { getCurrentBrowserLocale } from "./client-locale.js";
15
16
  import { getCurrentRoutePathnameForWarning } from "./internal/route-pattern-for-warning.js";
16
17
  import { getNavigationRuntime, hasAppNavigationRuntime, registerNavigationRuntimeFunctions } from "../client/navigation-runtime.js";
17
18
  import { createRscRequestHeaders, createRscRequestUrl, stripRscCacheBustingSearchParam, stripRscSuffix } from "../server/app-rsc-cache-busting.js";
18
19
  import { getMountedSlotsHeader, getPrefetchCache, getPrefetchInterceptionContext, getPrefetchedUrls, hasPrefetchCacheEntryForNavigation, navigateClientSide, prefetchRscResponse } from "./navigation.js";
19
- import { navigatePagesRouterLink } from "../client/pages-router-link-navigation.js";
20
+ import { navigatePagesRouterLinkWithFallback, resolvePagesRouterQueryOnlyHref } from "../client/pages-router-link-navigation.js";
20
21
  import { getI18nContext } from "./i18n-context.js";
21
22
  import { canLinkIntentPrefetch, canLinkPrefetch, getLinkPrefetchHref } from "./link-prefetch.js";
22
23
  import { clearLinkForCurrentNavigation, notifyLinkNavigationStart, setLinkForCurrentNavigation } from "./internal/link-status-registry.js";
@@ -55,6 +56,19 @@ function resolveHref(href) {
55
56
  }
56
57
  return url;
57
58
  }
59
+ function resolvePagesQueryOnlyHref(href) {
60
+ if (!href.startsWith("?") || typeof window === "undefined") return href;
61
+ const pagesRouter = window.next?.appDir === true ? void 0 : window.next?.router;
62
+ return resolvePagesRouterQueryOnlyHref(href, {
63
+ asPath: pagesRouter && "reload" in pagesRouter && "asPath" in pagesRouter && typeof pagesRouter.asPath === "string" ? pagesRouter.asPath : void 0,
64
+ basePath: __basePath,
65
+ fallbackHref: window.location.href,
66
+ locales: window.__VINEXT_LOCALES__
67
+ });
68
+ }
69
+ function resolvePagesLinkNavigationHref(href, locale) {
70
+ return normalizePathTrailingSlash(applyLocaleToHref(resolvePagesQueryOnlyHref(href), locale), __trailingSlash);
71
+ }
58
72
  /**
59
73
  * Collapse repeated forward-slashes (and convert backslashes to forward-slashes)
60
74
  * in the path portion of a URL, preserving any query string.
@@ -122,7 +136,7 @@ function getLinkPrefetchRouterMode() {
122
136
  }
123
137
  function resolveMatchedAutoAppRoutePrefetch(route) {
124
138
  return {
125
- cacheForNavigation: !(route.isDynamic && route.canPrefetchLoadingShell),
139
+ cacheForNavigation: !route.canPrefetchLoadingShell,
126
140
  prefetchShellFirst: !route.isDynamic,
127
141
  shouldPrefetch: true
128
142
  };
@@ -189,6 +203,8 @@ function prefetchUrl(href, mode, priority = "low") {
189
203
  } : window.requestIdleCallback ?? ((fn) => setTimeout(fn, 100)))(() => {
190
204
  (async () => {
191
205
  if (hasAppNavigationRuntime()) {
206
+ const hybridOwner = resolveHybridClientRouteOwner(prefetchHref, __basePath);
207
+ if (hybridOwner === "pages" || hybridOwner === "document") return;
192
208
  const autoPrefetch = mode === "auto" ? resolveAutoAppRoutePrefetch(prefetchHref) : {
193
209
  cacheForNavigation: true,
194
210
  prefetchShellFirst: true,
@@ -490,8 +506,9 @@ const Link = forwardRef(function Link({ href, as, replace = false, prefetch: pre
490
506
  navigateHref = localPath;
491
507
  }
492
508
  e.preventDefault();
493
- const absoluteHref = resolveRelativeHref(navigateHref, window.location.href, __basePath);
494
- const absoluteFullHref = toBrowserNavigationHref(navigateHref, window.location.href, __basePath);
509
+ const hasAppNavigationRuntime = Boolean(getNavigationRuntime()?.functions.navigate);
510
+ const pagesNavigateHref = resolvedHref.startsWith("?") ? resolvePagesLinkNavigationHref(resolvedHref, locale) : navigateHref;
511
+ const absoluteFullHref = toBrowserNavigationHref(hasAppNavigationRuntime ? navigateHref : pagesNavigateHref, window.location.href, __basePath);
495
512
  if (onNavigate) try {
496
513
  const navUrl = new URL(absoluteFullHref, window.location.origin);
497
514
  let prevented = false;
@@ -507,7 +524,12 @@ const Link = forwardRef(function Link({ href, as, replace = false, prefetch: pre
507
524
  onNavigate(navEvent);
508
525
  if (navEvent.defaultPrevented) return;
509
526
  } catch {}
510
- if (getNavigationRuntime()?.functions.navigate) {
527
+ if (hasAppNavigationRuntime && ["pages", "document"].includes(resolveHybridClientRouteOwner(navigateHref, __basePath) ?? "")) {
528
+ if (replace) window.location.replace(absoluteFullHref);
529
+ else window.location.assign(absoluteFullHref);
530
+ return;
531
+ }
532
+ if (hasAppNavigationRuntime) {
511
533
  const setter = setPendingRef.current;
512
534
  if (setter) setLinkForCurrentNavigation(setter);
513
535
  setPending(true);
@@ -518,19 +540,25 @@ const Link = forwardRef(function Link({ href, as, replace = false, prefetch: pre
518
540
  });
519
541
  });
520
542
  return;
521
- } else try {
522
- const Router = (await import("next/router.js")).default;
523
- await navigatePagesRouterLink(Router, {
524
- href: absoluteHref,
525
- replace,
526
- scroll,
527
- shallow,
528
- locale
543
+ } else {
544
+ const Router = window.next?.appDir === true ? void 0 : window.next?.router;
545
+ await navigatePagesRouterLinkWithFallback({
546
+ router: Router && "reload" in Router ? Router : void 0,
547
+ loadRouter: async () => (await import("next/router.js")).default,
548
+ navigation: {
549
+ href: pagesNavigateHref,
550
+ replace,
551
+ scroll,
552
+ shallow,
553
+ locale,
554
+ interpolateDynamicRoute: resolvedHref.startsWith("?")
555
+ },
556
+ fallback: () => {
557
+ if (replace) window.history.replaceState({}, "", absoluteFullHref);
558
+ else window.history.pushState({}, "", absoluteFullHref);
559
+ window.dispatchEvent(new PopStateEvent("popstate"));
560
+ }
529
561
  });
530
- } catch {
531
- if (replace) window.history.replaceState({}, "", absoluteFullHref);
532
- else window.history.pushState({}, "", absoluteFullHref);
533
- window.dispatchEvent(new PopStateEvent("popstate"));
534
562
  }
535
563
  };
536
564
  const anchorProps = restWithoutLocale;
@@ -621,7 +621,7 @@ function MetadataHead({ metadata, pathname = "/", trailingSlash }) {
621
621
  }
622
622
  }
623
623
  }
624
- if (tw.players) {
624
+ if (tw.card === "player" && tw.players) {
625
625
  const players = Array.isArray(tw.players) ? tw.players : [tw.players];
626
626
  for (const player of players) {
627
627
  const playerUrl = player.playerUrl.toString();
@@ -644,7 +644,7 @@ function MetadataHead({ metadata, pathname = "/", trailingSlash }) {
644
644
  }, key++));
645
645
  }
646
646
  }
647
- if (tw.app) {
647
+ if (tw.card === "app" && tw.app) {
648
648
  const { app } = tw;
649
649
  for (const platform of [
650
650
  "iphone",
@@ -655,11 +655,11 @@ function MetadataHead({ metadata, pathname = "/", trailingSlash }) {
655
655
  name: `twitter:app:name:${platform}`,
656
656
  content: app.name
657
657
  }, key++));
658
- if (app.id[platform] !== void 0) elements.push(/* @__PURE__ */ jsx("meta", {
658
+ if (app.id[platform]) elements.push(/* @__PURE__ */ jsx("meta", {
659
659
  name: `twitter:app:id:${platform}`,
660
660
  content: String(app.id[platform])
661
661
  }, key++));
662
- if (app.url?.[platform] !== void 0) {
662
+ if (app.url?.[platform]) {
663
663
  const appUrl = app.url[platform].toString();
664
664
  elements.push(/* @__PURE__ */ jsx("meta", {
665
665
  name: `twitter:app:url:${platform}`,
@@ -1,3 +1,4 @@
1
+ import { AppRouterScrollIntent } from "./app-router-scroll-state.js";
1
2
  import { NavigationRuntimeVisibleCommitMode } from "../client/navigation-runtime.js";
2
3
  import { AppRouterInstance, NavigateOptions, PrefetchOptions as PrefetchOptions$1 } from "./internal/app-router-context.js";
3
4
  import { ReadonlyURLSearchParams } from "./readonly-url-search-params.js";
@@ -97,7 +98,9 @@ declare function getPrefetchedUrls(): Set<string>;
97
98
  declare function resolveCachedRscResponseTtlMs(cached: Pick<CachedRscResponse, "dynamicStaleTimeSeconds">, fallbackTtlMs: number): number;
98
99
  declare function resolveCachedRscResponseExpiresAt(timestamp: number, cached: Pick<CachedRscResponse, "dynamicStaleTimeSeconds" | "expiresAt">, fallbackTtlMs: number): number;
99
100
  declare function resolvePrefetchCacheEntryMountedSlotsHeader(entry: PrefetchCacheEntry): string | null;
100
- declare function hasPrefetchCacheEntryForNavigation(rscUrl: string, interceptionContext?: string | null, mountedSlotsHeader?: string | null): boolean;
101
+ declare function hasPrefetchCacheEntryForNavigation(rscUrl: string, interceptionContext?: string | null, mountedSlotsHeader?: string | null, options?: {
102
+ notifyInvalidation?: boolean;
103
+ }): boolean;
101
104
  declare function invalidatePrefetchCache(): void;
102
105
  /**
103
106
  * Store a prefetched RSC response in the cache by snapshotting it to an
@@ -205,6 +208,8 @@ type ClientNavigationRenderSnapshot = {
205
208
  params: Record<string, string | string[]>;
206
209
  };
207
210
  declare function getClientNavigationRenderContext(): React$1.Context<ClientNavigationRenderSnapshot | null> | null;
211
+ /** @internal */
212
+ declare function useClientNavigationRenderSnapshot(): ClientNavigationRenderSnapshot | null;
208
213
  declare function createClientNavigationRenderSnapshot(href: string, params: Record<string, string | string[]>): ClientNavigationRenderSnapshot;
209
214
  declare function createSnapshotPathAndSearch(snapshot: ClientNavigationRenderSnapshot): string;
210
215
  declare function setClientParams(params: Record<string, string | string[]>): void;
@@ -255,6 +260,7 @@ declare function replaceHistoryStateWithoutNotify(data: unknown, unused: string,
255
260
  * history.replaceState interception (which would cause spurious re-renders).
256
261
  */
257
262
  declare function saveScrollPosition(): void;
263
+ declare function applyAppRouterScrollFallback(intent: AppRouterScrollIntent): void;
258
264
  /**
259
265
  * Navigate to a URL, handling external URLs, hash-only changes, and RSC navigation.
260
266
  */
@@ -565,4 +571,4 @@ declare function isDynamicServerError(error: unknown): error is DynamicServerErr
565
571
  */
566
572
  declare function unstable_rethrow(error: unknown): void;
567
573
  //#endregion
568
- export { BailoutToCSRError, CachedRscResponse, ClientNavigationRenderSnapshot, DynamicServerError, GLOBAL_ACCESSORS_KEY, HTTP_ERROR_FALLBACK_ERROR_CODE, MAX_PREFETCH_CACHE_SIZE, NavigationContext, PREFETCH_CACHE_TTL, PrefetchCacheEntry, PrefetchOptions, ReadonlyURLSearchParams, RedirectType, SegmentMap, ServerInsertedHTMLContext, UnrecognizedActionError, __basePath, _registerStateAccessors, activateNavigationSnapshot, appRouterInstance, clearPendingPathname, clearServerInsertedHTML, commitClientNavigationState, consumePrefetchResponse, consumePrefetchResponseForNavigation, createCachedRscResponseSnapshot, createClientNavigationRenderSnapshot, createSnapshotPathAndSearch, decodeRedirectError, flushServerInsertedHTML, forbidden, getAccessFallbackHTTPStatus, getBfcacheIdMapContext, getBfcacheSegmentIdContext, getClientNavigationRenderContext, getClientNavigationState, getClientParams, getCurrentInterceptionContext, getCurrentNextUrl, getLayoutSegmentContext, getMountedSlotsHeader, getNavigationContext, getPrefetchCache, getPrefetchInterceptionContext, getPrefetchedUrls, hasPrefetchCacheEntryForNavigation, invalidatePrefetchCache, isBailoutToCSRError, isDynamicServerError, isHTTPAccessFallbackError, isNextRouterError, isRedirectError, navigateClientSide, notFound, permanentRedirect, prefetchRscResponse, pushHistoryStateWithoutNotify, redirect, renderServerInsertedHTML, replaceClientParamsWithoutNotify, replaceHistoryStateWithoutNotify, resolveCachedRscResponseExpiresAt, resolveCachedRscResponseTtlMs, resolvePrefetchCacheEntryMountedSlotsHeader, restoreRscResponse, saveScrollPosition, setClientParams, setMountedSlotsHeader, setNavigationContext, setPendingPathname, snapshotRscResponse, storePrefetchResponse, unauthorized, unstable_isUnrecognizedActionError, unstable_rethrow, useParams, usePathname, useRouter, useSearchParams, useSelectedLayoutSegment, useSelectedLayoutSegments, useServerInsertedHTML };
574
+ export { BailoutToCSRError, CachedRscResponse, ClientNavigationRenderSnapshot, DynamicServerError, GLOBAL_ACCESSORS_KEY, HTTP_ERROR_FALLBACK_ERROR_CODE, MAX_PREFETCH_CACHE_SIZE, NavigationContext, PREFETCH_CACHE_TTL, PrefetchCacheEntry, PrefetchOptions, ReadonlyURLSearchParams, RedirectType, SegmentMap, ServerInsertedHTMLContext, UnrecognizedActionError, __basePath, _registerStateAccessors, activateNavigationSnapshot, appRouterInstance, applyAppRouterScrollFallback, clearPendingPathname, clearServerInsertedHTML, commitClientNavigationState, consumePrefetchResponse, consumePrefetchResponseForNavigation, createCachedRscResponseSnapshot, createClientNavigationRenderSnapshot, createSnapshotPathAndSearch, decodeRedirectError, flushServerInsertedHTML, forbidden, getAccessFallbackHTTPStatus, getBfcacheIdMapContext, getBfcacheSegmentIdContext, getClientNavigationRenderContext, getClientNavigationState, getClientParams, getCurrentInterceptionContext, getCurrentNextUrl, getLayoutSegmentContext, getMountedSlotsHeader, getNavigationContext, getPrefetchCache, getPrefetchInterceptionContext, getPrefetchedUrls, hasPrefetchCacheEntryForNavigation, invalidatePrefetchCache, isBailoutToCSRError, isDynamicServerError, isHTTPAccessFallbackError, isNextRouterError, isRedirectError, navigateClientSide, notFound, permanentRedirect, prefetchRscResponse, pushHistoryStateWithoutNotify, redirect, renderServerInsertedHTML, replaceClientParamsWithoutNotify, replaceHistoryStateWithoutNotify, resolveCachedRscResponseExpiresAt, resolveCachedRscResponseTtlMs, resolvePrefetchCacheEntryMountedSlotsHeader, restoreRscResponse, saveScrollPosition, setClientParams, setMountedSlotsHeader, setNavigationContext, setPendingPathname, snapshotRscResponse, storePrefetchResponse, unauthorized, unstable_isUnrecognizedActionError, unstable_rethrow, useClientNavigationRenderSnapshot, useParams, usePathname, useRouter, useSearchParams, useSelectedLayoutSegment, useSelectedLayoutSegments, useServerInsertedHTML };
@@ -1,13 +1,16 @@
1
1
  import { stripBasePath } from "../utils/base-path.js";
2
2
  import { VINEXT_DYNAMIC_STALE_TIME_HEADER, VINEXT_MOUNTED_SLOTS_HEADER, VINEXT_PARAMS_HEADER } from "../server/headers.js";
3
3
  import { assertSafeNavigationUrl } from "./url-safety.js";
4
+ import { markPprFallbackShellDynamicBoundary } from "./ppr-fallback-shell.js";
4
5
  import { AppElementsWire } from "../server/app-elements-wire.js";
5
6
  import "../server/app-elements.js";
6
7
  import { AppRouterContext } from "./internal/app-router-context.js";
8
+ import { resolveHybridClientRouteOwner } from "./internal/hybrid-client-route-owner.js";
7
9
  import { isAbsoluteOrProtocolRelativeUrl, toBrowserNavigationHref, toSameOriginAppPath, withBasePath } from "./url-utils.js";
8
10
  import { retryScrollTo, scrollToHashTarget } from "./hash-scroll.js";
9
11
  import { getNavigationRuntime, hasAppNavigationRuntime } from "../client/navigation-runtime.js";
10
12
  import { notifyAppRouterTransitionStart } from "../client/instrumentation-client-state.js";
13
+ import { clearAppNavigationFailureTarget, stageAppNavigationFailureTarget } from "../client/app-nav-failure-handler.js";
11
14
  import { PUBLIC_INITIAL_BFCACHE_ID } from "../server/app-bfcache-id.js";
12
15
  import { resolveManifestNavigationInterceptionContext } from "../server/app-browser-interception-context.js";
13
16
  import { createExternalHistoryStatePreservingMetadata, createHashOnlyHistoryStatePreservingNavigationMetadata } from "../server/app-history-state.js";
@@ -15,7 +18,8 @@ import { VINEXT_RSC_COMPATIBILITY_ID_HEADER, createRscRequestHeaders, createRscR
15
18
  import { hasPendingAppRouterPageRedirect } from "../server/app-browser-mpa-navigation.js";
16
19
  import { navigationPlanner } from "../server/navigation-planner.js";
17
20
  import { ReadonlyURLSearchParams } from "./readonly-url-search-params.js";
18
- import { beginAppRouterScrollIntent, clearAppRouterScrollIntent, consumeAppRouterScrollIntent } from "./app-router-scroll-state.js";
21
+ import { getPagesNavigationContext } from "./internal/pages-router-accessor.js";
22
+ import { beginAppRouterScrollIntent, clearAppRouterScrollIntent, consumeAppRouterScrollIntent, getPendingAppRouterScrollIntent } from "./app-router-scroll-state.js";
19
23
  import { UnrecognizedActionError, unstable_isUnrecognizedActionError } from "./unrecognized-action-error.js";
20
24
  import * as React$1 from "react";
21
25
  //#region src/shims/navigation.ts
@@ -131,17 +135,7 @@ function _registerStateAccessors(accessors) {
131
135
  _getInsertedHTMLCallbacks = accessors.getInsertedHTMLCallbacks;
132
136
  _clearInsertedHTMLCallbacks = accessors.clearInsertedHTMLCallbacks;
133
137
  }
134
- const PAGES_NAVIGATION_ACCESSOR_KEY = Symbol.for("vinext.navigation.pagesNavigationContextAccessor");
135
138
  const PAGES_NAVIGATION_NOTIFY_KEY = Symbol.for("vinext.navigation.pagesNavigationNotify");
136
- function _getPagesNavigationContext() {
137
- const accessor = globalThis[PAGES_NAVIGATION_ACCESSOR_KEY];
138
- if (!accessor) return null;
139
- try {
140
- return accessor();
141
- } catch {
142
- return null;
143
- }
144
- }
145
139
  /**
146
140
  * Get the navigation context for the current SSR/RSC render.
147
141
  * Reads from AsyncLocalStorage when available (concurrent-safe),
@@ -299,12 +293,12 @@ function findPrefetchCacheEntryForNavigation(rscUrl, interceptionContext, mounte
299
293
  }
300
294
  return null;
301
295
  }
302
- function hasPrefetchCacheEntryForNavigation(rscUrl, interceptionContext = null, mountedSlotsHeader = null) {
296
+ function hasPrefetchCacheEntryForNavigation(rscUrl, interceptionContext = null, mountedSlotsHeader = null, options = {}) {
303
297
  const match = findPrefetchCacheEntryForNavigation(rscUrl, interceptionContext, mountedSlotsHeader);
304
298
  if (match === null) return false;
305
299
  if (match.entry.pending !== void 0) return true;
306
300
  if (resolvePrefetchCacheEntryExpiresAt(match.entry) > Date.now()) return true;
307
- deletePrefetchCacheEntry(getPrefetchCache(), getPrefetchedUrls(), match.cacheKey, match.entry, true);
301
+ deletePrefetchCacheEntry(getPrefetchCache(), getPrefetchedUrls(), match.cacheKey, match.entry, options.notifyInvalidation ?? true);
308
302
  return false;
309
303
  }
310
304
  /**
@@ -617,7 +611,7 @@ function getReadonlyPagesSearchParams(searchParams) {
617
611
  * be visible until the next commit.
618
612
  */
619
613
  function getPathnameSnapshot() {
620
- const pagesCtx = _getPagesNavigationContext();
614
+ const pagesCtx = getPagesNavigationContext();
621
615
  if (pagesCtx) return pagesCtx.pathname;
622
616
  return getClientNavigationState()?.cachedPathname ?? "/";
623
617
  }
@@ -632,7 +626,7 @@ let _cachedEmptyClientSearchParams = null;
632
626
  */
633
627
  function getSearchParamsSnapshot() {
634
628
  if (_getServerContext()) return getServerSearchParamsSnapshot();
635
- const pagesCtx = _getPagesNavigationContext();
629
+ const pagesCtx = getPagesNavigationContext();
636
630
  if (pagesCtx) return getReadonlyPagesSearchParams(pagesCtx.searchParams);
637
631
  const cached = getClientNavigationState()?.cachedReadonlySearchParams;
638
632
  if (cached) return cached;
@@ -659,7 +653,7 @@ function syncCommittedUrlStateFromLocation() {
659
653
  function getServerSearchParamsSnapshot() {
660
654
  const ctx = _getServerContext();
661
655
  if (!ctx) {
662
- const pagesCtx = _getPagesNavigationContext();
656
+ const pagesCtx = getPagesNavigationContext();
663
657
  if (pagesCtx) return getReadonlyPagesSearchParams(pagesCtx.searchParams);
664
658
  if (_cachedEmptyServerSearchParams === null) _cachedEmptyServerSearchParams = new ReadonlyURLSearchParams();
665
659
  return _cachedEmptyServerSearchParams;
@@ -698,6 +692,7 @@ function getClientNavigationRenderContext() {
698
692
  if (!globalState[_CLIENT_NAV_RENDER_CTX_KEY]) globalState[_CLIENT_NAV_RENDER_CTX_KEY] = React$1.createContext(null);
699
693
  return globalState[_CLIENT_NAV_RENDER_CTX_KEY] ?? null;
700
694
  }
695
+ /** @internal */
701
696
  function useClientNavigationRenderSnapshot() {
702
697
  const ctx = getClientNavigationRenderContext();
703
698
  if (!ctx || typeof React$1.useContext !== "function") return null;
@@ -783,14 +778,14 @@ function getClientParamsSnapshot() {
783
778
  const state = getClientNavigationState();
784
779
  const ctx = _getServerContext();
785
780
  if (ctx) return ctx.params;
786
- const pagesCtx = _getPagesNavigationContext();
781
+ const pagesCtx = getPagesNavigationContext();
787
782
  if (pagesCtx) return pagesCtx.params;
788
783
  return state?.clientParams ?? _EMPTY_PARAMS;
789
784
  }
790
785
  function getServerParamsSnapshot() {
791
786
  const ctx = _getServerContext();
792
787
  if (ctx) return ctx.params;
793
- const pagesCtx = _getPagesNavigationContext();
788
+ const pagesCtx = getPagesNavigationContext();
794
789
  if (pagesCtx) return pagesCtx.params;
795
790
  return _EMPTY_PARAMS;
796
791
  }
@@ -808,16 +803,17 @@ function subscribeToNavigation(cb) {
808
803
  */
809
804
  function usePathname() {
810
805
  if (isServer) {
806
+ markPprFallbackShellDynamicBoundary();
811
807
  const ctx = _getServerContext();
812
808
  if (ctx) return ctx.pathname;
813
- const pagesCtx = _getPagesNavigationContext();
809
+ const pagesCtx = getPagesNavigationContext();
814
810
  return pagesCtx ? pagesCtx.pathname : "/";
815
811
  }
816
812
  const renderSnapshot = useClientNavigationRenderSnapshot();
817
813
  const pathname = React$1.useSyncExternalStore(subscribeToNavigation, getPathnameSnapshot, () => {
818
814
  const ctx = _getServerContext();
819
815
  if (ctx) return ctx.pathname;
820
- const pagesCtx = _getPagesNavigationContext();
816
+ const pagesCtx = getPagesNavigationContext();
821
817
  return pagesCtx ? pagesCtx.pathname : "/";
822
818
  });
823
819
  if (renderSnapshot && (getClientNavigationState()?.navigationSnapshotActiveCount ?? 0) > 0) return renderSnapshot.pathname;
@@ -827,7 +823,10 @@ function usePathname() {
827
823
  * Returns the current search params as a read-only URLSearchParams.
828
824
  */
829
825
  function useSearchParams() {
830
- if (isServer) return getServerSearchParamsSnapshot();
826
+ if (isServer) {
827
+ markPprFallbackShellDynamicBoundary();
828
+ return getServerSearchParamsSnapshot();
829
+ }
831
830
  const renderSnapshot = useClientNavigationRenderSnapshot();
832
831
  const searchParams = React$1.useSyncExternalStore(subscribeToNavigation, getSearchParamsSnapshot, getServerSearchParamsSnapshot);
833
832
  if (renderSnapshot && (getClientNavigationState()?.navigationSnapshotActiveCount ?? 0) > 0) return renderSnapshot.searchParams;
@@ -837,7 +836,10 @@ function useSearchParams() {
837
836
  * Returns the dynamic params for the current route.
838
837
  */
839
838
  function useParams() {
840
- if (isServer) return getServerParamsSnapshot();
839
+ if (isServer) {
840
+ markPprFallbackShellDynamicBoundary();
841
+ return getServerParamsSnapshot();
842
+ }
841
843
  const renderSnapshot = useClientNavigationRenderSnapshot();
842
844
  const params = React$1.useSyncExternalStore(subscribeToNavigation, getClientParamsSnapshot, getServerParamsSnapshot);
843
845
  if (renderSnapshot && (getClientNavigationState()?.navigationSnapshotActiveCount ?? 0) > 0) return renderSnapshot.params;
@@ -930,8 +932,17 @@ function applyAppRouterScrollFallback(intent) {
930
932
  scrollToHashTarget(intent.hash);
931
933
  return;
932
934
  }
935
+ if (intent.targetHoistedInHead) return;
933
936
  document.documentElement.scrollTop = 0;
934
937
  }
938
+ function scheduleAppRouterScrollFallback(intent) {
939
+ queueMicrotask(() => {
940
+ const pendingIntent = getPendingAppRouterScrollIntent();
941
+ if (pendingIntent === null || pendingIntent.id !== intent.id) return;
942
+ const fallbackIntent = consumeAppRouterScrollIntent(intent);
943
+ if (fallbackIntent) applyAppRouterScrollFallback(fallbackIntent);
944
+ });
945
+ }
935
946
  /**
936
947
  * Restore scroll position from a history state object (used on popstate).
937
948
  *
@@ -958,6 +969,15 @@ function restoreScrollPosition(state) {
958
969
  }
959
970
  }
960
971
  /**
972
+ * Hard-navigate to a URL via `window.location`, preserving push/replace
973
+ * semantics. Used for URLs the App Router cannot serve (Pages-owned
974
+ * targets in a hybrid build) and for catch-all RSC failures.
975
+ */
976
+ function hardNavigateTo(fullHref, mode) {
977
+ if (mode === "replace") window.location.replace(fullHref);
978
+ else window.location.assign(fullHref);
979
+ }
980
+ /**
961
981
  * Navigate to a URL, handling external URLs, hash-only changes, and RSC navigation.
962
982
  */
963
983
  async function navigateClientSide(href, mode, scroll, programmaticTransition = false, visibleCommitMode = "transition") {
@@ -972,14 +992,23 @@ async function navigateClientSide(href, mode, scroll, programmaticTransition = f
972
992
  await externalNavigate(href, mode);
973
993
  return;
974
994
  }
975
- if (mode === "replace") window.location.replace(href);
976
- else window.location.assign(href);
995
+ hardNavigateTo(href, mode);
977
996
  await new Promise(() => {});
978
997
  return;
979
998
  }
980
999
  normalizedHref = localPath;
981
1000
  }
1001
+ const hybridOwner = resolveHybridClientRouteOwner(normalizedHref, __basePath);
1002
+ if (hybridOwner === "pages" || hybridOwner === "document") {
1003
+ const fullHref = toBrowserNavigationHref(normalizedHref, window.location.href, __basePath);
1004
+ notifyAppRouterTransitionStart(fullHref, mode);
1005
+ if (mode === "push") saveScrollPosition();
1006
+ hardNavigateTo(fullHref, mode);
1007
+ await new Promise(() => {});
1008
+ return;
1009
+ }
982
1010
  const fullHref = toBrowserNavigationHref(normalizedHref, window.location.href, __basePath);
1011
+ stageAppNavigationFailureTarget(fullHref);
983
1012
  notifyAppRouterTransitionStart(fullHref, mode);
984
1013
  if (mode === "push") saveScrollPosition();
985
1014
  const earlyIntent = navigationPlanner.classifyEarlyNavigationIntent({
@@ -990,7 +1019,9 @@ async function navigateClientSide(href, mode, scroll, programmaticTransition = f
990
1019
  targetHref: fullHref
991
1020
  });
992
1021
  if (earlyIntent.kind === "sameDocumentScroll") {
1022
+ clearAppRouterScrollIntent();
993
1023
  commitHashOnlyHistoryState(fullHref, earlyIntent.mode, earlyIntent.scroll);
1024
+ clearAppNavigationFailureTarget(fullHref);
994
1025
  commitClientNavigationState();
995
1026
  if (earlyIntent.scroll) scrollToHashTarget(earlyIntent.hash);
996
1027
  return;
@@ -1001,8 +1032,7 @@ async function navigateClientSide(href, mode, scroll, programmaticTransition = f
1001
1032
  await mpaNavigate(fullHref, mode);
1002
1033
  return;
1003
1034
  }
1004
- if (mode === "replace") window.location.replace(fullHref);
1005
- else window.location.assign(fullHref);
1035
+ hardNavigateTo(fullHref, mode);
1006
1036
  await new Promise(() => {});
1007
1037
  return;
1008
1038
  }
@@ -1022,10 +1052,7 @@ async function navigateClientSide(href, mode, scroll, programmaticTransition = f
1022
1052
  if (scrollIntent) consumeAppRouterScrollIntent(scrollIntent);
1023
1053
  throw error;
1024
1054
  }
1025
- if (scrollIntent) {
1026
- const fallbackIntent = consumeAppRouterScrollIntent(scrollIntent);
1027
- if (fallbackIntent) applyAppRouterScrollFallback(fallbackIntent);
1028
- }
1055
+ if (scrollIntent) scheduleAppRouterScrollFallback(scrollIntent);
1029
1056
  }
1030
1057
  let scheduledAppRouterNavigationCount = 0;
1031
1058
  function trackScheduledAppRouterNavigation() {
@@ -1057,6 +1084,7 @@ const _appRouter = {
1057
1084
  push(href, options) {
1058
1085
  assertSafeNavigationUrl(href);
1059
1086
  if (isServer) return;
1087
+ getNavigationRuntime()?.functions.notifyLinkNavigationStart?.();
1060
1088
  const releaseNavigation = trackScheduledAppRouterNavigation();
1061
1089
  try {
1062
1090
  React$1.startTransition(() => {
@@ -1071,6 +1099,7 @@ const _appRouter = {
1071
1099
  replace(href, options) {
1072
1100
  assertSafeNavigationUrl(href);
1073
1101
  if (isServer) return;
1102
+ getNavigationRuntime()?.functions.notifyLinkNavigationStart?.();
1074
1103
  const releaseNavigation = trackScheduledAppRouterNavigation();
1075
1104
  try {
1076
1105
  React$1.startTransition(() => {
@@ -1117,6 +1146,8 @@ const _appRouter = {
1117
1146
  if (localPath == null) return;
1118
1147
  prefetchHref = localPath;
1119
1148
  }
1149
+ const hybridOwner = resolveHybridClientRouteOwner(prefetchHref, __basePath);
1150
+ if (hybridOwner === "pages" || hybridOwner === "document") return;
1120
1151
  const fullHref = toBrowserNavigationHref(prefetchHref, window.location.href, __basePath);
1121
1152
  const interceptionContext = getPrefetchInterceptionContext(fullHref);
1122
1153
  const mountedSlotsHeader = getMountedSlotsHeader();
@@ -1220,6 +1251,7 @@ function useSelectedLayoutSegment(parallelRoutesKey) {
1220
1251
  * @param parallelRoutesKey - Which parallel route to read (default: "children")
1221
1252
  */
1222
1253
  function useSelectedLayoutSegments(parallelRoutesKey) {
1254
+ if (isServer) markPprFallbackShellDynamicBoundary();
1223
1255
  return useChildSegments(parallelRoutesKey);
1224
1256
  }
1225
1257
  /**
@@ -1602,4 +1634,4 @@ if (!isServer) {
1602
1634
  }
1603
1635
  }
1604
1636
  //#endregion
1605
- export { BailoutToCSRError, DynamicServerError, GLOBAL_ACCESSORS_KEY, HTTP_ERROR_FALLBACK_ERROR_CODE, MAX_PREFETCH_CACHE_SIZE, PREFETCH_CACHE_TTL, ReadonlyURLSearchParams, RedirectType, ServerInsertedHTMLContext, UnrecognizedActionError, __basePath, _registerStateAccessors, activateNavigationSnapshot, appRouterInstance, clearPendingPathname, clearServerInsertedHTML, commitClientNavigationState, consumePrefetchResponse, consumePrefetchResponseForNavigation, createCachedRscResponseSnapshot, createClientNavigationRenderSnapshot, createSnapshotPathAndSearch, decodeRedirectError, flushServerInsertedHTML, forbidden, getAccessFallbackHTTPStatus, getBfcacheIdMapContext, getBfcacheSegmentIdContext, getClientNavigationRenderContext, getClientNavigationState, getClientParams, getCurrentInterceptionContext, getCurrentNextUrl, getLayoutSegmentContext, getMountedSlotsHeader, getNavigationContext, getPrefetchCache, getPrefetchInterceptionContext, getPrefetchedUrls, hasPrefetchCacheEntryForNavigation, invalidatePrefetchCache, isBailoutToCSRError, isDynamicServerError, isHTTPAccessFallbackError, isNextRouterError, isRedirectError, navigateClientSide, notFound, permanentRedirect, prefetchRscResponse, pushHistoryStateWithoutNotify, redirect, renderServerInsertedHTML, replaceClientParamsWithoutNotify, replaceHistoryStateWithoutNotify, resolveCachedRscResponseExpiresAt, resolveCachedRscResponseTtlMs, resolvePrefetchCacheEntryMountedSlotsHeader, restoreRscResponse, saveScrollPosition, setClientParams, setMountedSlotsHeader, setNavigationContext, setPendingPathname, snapshotRscResponse, storePrefetchResponse, unauthorized, unstable_isUnrecognizedActionError, unstable_rethrow, useParams, usePathname, useRouter, useSearchParams, useSelectedLayoutSegment, useSelectedLayoutSegments, useServerInsertedHTML };
1637
+ export { BailoutToCSRError, DynamicServerError, GLOBAL_ACCESSORS_KEY, HTTP_ERROR_FALLBACK_ERROR_CODE, MAX_PREFETCH_CACHE_SIZE, PREFETCH_CACHE_TTL, ReadonlyURLSearchParams, RedirectType, ServerInsertedHTMLContext, UnrecognizedActionError, __basePath, _registerStateAccessors, activateNavigationSnapshot, appRouterInstance, applyAppRouterScrollFallback, clearPendingPathname, clearServerInsertedHTML, commitClientNavigationState, consumePrefetchResponse, consumePrefetchResponseForNavigation, createCachedRscResponseSnapshot, createClientNavigationRenderSnapshot, createSnapshotPathAndSearch, decodeRedirectError, flushServerInsertedHTML, forbidden, getAccessFallbackHTTPStatus, getBfcacheIdMapContext, getBfcacheSegmentIdContext, getClientNavigationRenderContext, getClientNavigationState, getClientParams, getCurrentInterceptionContext, getCurrentNextUrl, getLayoutSegmentContext, getMountedSlotsHeader, getNavigationContext, getPrefetchCache, getPrefetchInterceptionContext, getPrefetchedUrls, hasPrefetchCacheEntryForNavigation, invalidatePrefetchCache, isBailoutToCSRError, isDynamicServerError, isHTTPAccessFallbackError, isNextRouterError, isRedirectError, navigateClientSide, notFound, permanentRedirect, prefetchRscResponse, pushHistoryStateWithoutNotify, redirect, renderServerInsertedHTML, replaceClientParamsWithoutNotify, replaceHistoryStateWithoutNotify, resolveCachedRscResponseExpiresAt, resolveCachedRscResponseTtlMs, resolvePrefetchCacheEntryMountedSlotsHeader, restoreRscResponse, saveScrollPosition, setClientParams, setMountedSlotsHeader, setNavigationContext, setPendingPathname, snapshotRscResponse, storePrefetchResponse, unauthorized, unstable_isUnrecognizedActionError, unstable_rethrow, useClientNavigationRenderSnapshot, useParams, usePathname, useRouter, useSearchParams, useSelectedLayoutSegment, useSelectedLayoutSegments, useServerInsertedHTML };
@@ -1,10 +1,12 @@
1
1
  //#region src/shims/ppr-fallback-shell.d.ts
2
2
  type PprFallbackShellState = {
3
3
  abortController: AbortController;
4
+ reactAbortController: AbortController;
4
5
  cacheEpoch: number;
5
6
  cacheReadyResolvers: Array<() => void>;
6
7
  fallbackParamNames: ReadonlySet<string>;
7
8
  hasDynamicBoundary: boolean;
9
+ isFinalRenderStarted: boolean;
8
10
  isAbortScheduled: boolean;
9
11
  pendingAbortCleanup: (() => void) | null;
10
12
  pendingCacheReadyCleanup: (() => void) | null;
@@ -21,9 +23,11 @@ declare function runWithPprFallbackShellState<T>(state: PprFallbackShellState, f
21
23
  declare function getPprFallbackShellState(): PprFallbackShellState | null;
22
24
  declare function trackPprFallbackShellCacheTask<T>(fn: () => Promise<T>, cacheVariant: string): Promise<T>;
23
25
  declare function createPprFallbackShellSuspensePromiseForState<T>(state: PprFallbackShellState, expression: string): Promise<T>;
26
+ declare function markPprFallbackShellDynamicBoundary(): void;
24
27
  declare function createPprFallbackShellSuspensePromise<T>(expression: string): Promise<T> | null;
25
28
  declare function waitForPprFallbackShellCacheReady(state: PprFallbackShellState): Promise<void>;
26
29
  declare function preparePprFallbackShellFinalRender(state: PprFallbackShellState): void;
30
+ declare function beginPprFallbackShellFinalRender(state: PprFallbackShellState): void;
27
31
  declare function isPprFallbackShellAbortError(error: unknown): boolean;
28
32
  //#endregion
29
- export { PprFallbackShellState, createPprFallbackShellState, createPprFallbackShellSuspensePromise, createPprFallbackShellSuspensePromiseForState, getPprFallbackShellState, isPprFallbackShellAbortError, preparePprFallbackShellFinalRender, runWithPprFallbackShellState, trackPprFallbackShellCacheTask, waitForPprFallbackShellCacheReady };
33
+ export { PprFallbackShellState, beginPprFallbackShellFinalRender, createPprFallbackShellState, createPprFallbackShellSuspensePromise, createPprFallbackShellSuspensePromiseForState, getPprFallbackShellState, isPprFallbackShellAbortError, markPprFallbackShellDynamicBoundary, preparePprFallbackShellFinalRender, runWithPprFallbackShellState, trackPprFallbackShellCacheTask, waitForPprFallbackShellCacheReady };
@@ -43,12 +43,15 @@ function scheduleCacheReadyIfSettled(state) {
43
43
  });
44
44
  }
45
45
  function scheduleAbortIfReady(state) {
46
- if (state.phase !== "final" || !state.hasDynamicBoundary || state.pendingCacheTasks > 0 || state.pendingCacheReadyCleanup !== null || state.isAbortScheduled) return;
46
+ if (state.phase !== "final" || !state.isFinalRenderStarted || !state.hasDynamicBoundary || state.pendingCacheTasks > 0 || state.pendingCacheReadyCleanup !== null || state.isAbortScheduled) return;
47
47
  state.isAbortScheduled = true;
48
48
  state.pendingAbortCleanup = scheduleAfterTask(() => {
49
49
  state.pendingAbortCleanup = null;
50
50
  state.isAbortScheduled = false;
51
- if (state.phase === "final" && state.hasDynamicBoundary && state.pendingCacheTasks === 0 && state.pendingCacheReadyCleanup === null && !state.abortController.signal.aborted) state.abortController.abort();
51
+ if (state.phase === "final" && state.hasDynamicBoundary && state.pendingCacheTasks === 0 && state.pendingCacheReadyCleanup === null && !state.reactAbortController.signal.aborted) {
52
+ state.reactAbortController.abort();
53
+ state.abortController.abort();
54
+ }
52
55
  });
53
56
  }
54
57
  function completeCacheTask(state, task) {
@@ -64,12 +67,15 @@ function ignoreCacheTask(state, task) {
64
67
  completeCacheTask(state, task);
65
68
  }
66
69
  function createPprFallbackShellState(options) {
70
+ const abortController = new AbortController();
67
71
  return {
68
- abortController: new AbortController(),
72
+ abortController,
73
+ reactAbortController: abortController,
69
74
  cacheEpoch: 0,
70
75
  cacheReadyResolvers: [],
71
76
  fallbackParamNames: new Set(options.fallbackParamNames),
72
77
  hasDynamicBoundary: false,
78
+ isFinalRenderStarted: false,
73
79
  isAbortScheduled: false,
74
80
  pendingAbortCleanup: null,
75
81
  pendingCacheReadyCleanup: null,
@@ -107,14 +113,22 @@ function trackPprFallbackShellCacheTask(fn, cacheVariant) {
107
113
  });
108
114
  }
109
115
  function createPprFallbackShellSuspensePromiseForState(state, expression) {
110
- state.hasDynamicBoundary = true;
111
- for (const task of pprFallbackShellCacheTaskStackAls.getStore() ?? []) ignoreCacheTask(state, task);
112
- scheduleCacheReadyIfSettled(state);
116
+ markPprFallbackShellDynamicBoundaryForState(state);
113
117
  if (state.phase === "final") scheduleAbortIfReady(state);
114
118
  const promise = makeHangingPromise(state.abortController.signal, state.routePattern, expression);
115
119
  promise.catch(noop);
116
120
  return promise;
117
121
  }
122
+ function markPprFallbackShellDynamicBoundaryForState(state) {
123
+ state.hasDynamicBoundary = true;
124
+ for (const task of pprFallbackShellCacheTaskStackAls.getStore() ?? []) ignoreCacheTask(state, task);
125
+ scheduleCacheReadyIfSettled(state);
126
+ }
127
+ function markPprFallbackShellDynamicBoundary() {
128
+ const state = getPprFallbackShellState();
129
+ if (state === null || state.fallbackParamNames.size === 0) return;
130
+ markPprFallbackShellDynamicBoundaryForState(state);
131
+ }
118
132
  function createPprFallbackShellSuspensePromise(expression) {
119
133
  const state = getPprFallbackShellState();
120
134
  if (state === null) return null;
@@ -134,16 +148,23 @@ function preparePprFallbackShellFinalRender(state) {
134
148
  state.pendingAbortCleanup = null;
135
149
  }
136
150
  state.abortController = new AbortController();
151
+ state.reactAbortController = new AbortController();
137
152
  state.cacheEpoch++;
138
153
  state.cacheReadyResolvers.length = 0;
139
154
  state.hasDynamicBoundary = false;
155
+ state.isFinalRenderStarted = false;
140
156
  state.isAbortScheduled = false;
141
157
  state.pendingCacheTasks = 0;
142
158
  state.phase = "final";
143
159
  }
160
+ function beginPprFallbackShellFinalRender(state) {
161
+ if (state.phase !== "final") return;
162
+ state.isFinalRenderStarted = true;
163
+ scheduleAbortIfReady(state);
164
+ }
144
165
  function isPprFallbackShellAbortError(error) {
145
166
  if (typeof DOMException !== "undefined" && error instanceof DOMException && error.name === "AbortError") return true;
146
167
  return error instanceof Error && error.name === "HangingPromiseRejectionError";
147
168
  }
148
169
  //#endregion
149
- export { createPprFallbackShellState, createPprFallbackShellSuspensePromise, createPprFallbackShellSuspensePromiseForState, getPprFallbackShellState, isPprFallbackShellAbortError, preparePprFallbackShellFinalRender, runWithPprFallbackShellState, trackPprFallbackShellCacheTask, waitForPprFallbackShellCacheReady };
170
+ export { beginPprFallbackShellFinalRender, createPprFallbackShellState, createPprFallbackShellSuspensePromise, createPprFallbackShellSuspensePromiseForState, getPprFallbackShellState, isPprFallbackShellAbortError, markPprFallbackShellDynamicBoundary, preparePprFallbackShellFinalRender, runWithPprFallbackShellState, trackPprFallbackShellCacheTask, waitForPprFallbackShellCacheReady };
@@ -34,11 +34,15 @@ type NextRouter = {
34
34
  type UrlObject = {
35
35
  pathname?: string;
36
36
  query?: UrlQuery;
37
+ search?: string;
38
+ hash?: string;
37
39
  };
38
40
  type TransitionOptions = {
41
+ _h?: 1;
39
42
  shallow?: boolean;
40
43
  scroll?: boolean;
41
44
  locale?: string | false;
45
+ _vinextInterpolateDynamicRoute?: boolean;
42
46
  };
43
47
  type RouterEvents = {
44
48
  on(event: string, handler: (...args: unknown[]) => void): void;
@@ -49,7 +53,7 @@ type RouterEvents = {
49
53
  * Apply locale prefix to a URL for client-side navigation.
50
54
  * Same logic as Link's applyLocaleToHref but reads from window globals.
51
55
  */
52
- declare function applyNavigationLocale(url: string, locale?: string): string;
56
+ declare function applyNavigationLocale(url: string, locale?: string, replaceExistingLocale?: boolean): string;
53
57
  /** Check if a URL is external (any URL scheme per RFC 3986, or protocol-relative) */
54
58
  declare function isExternalUrl(url: string): boolean;
55
59
  /** Check if a href is only a hash change relative to the current URL */
@@ -108,6 +112,8 @@ type PagesNavigationContextShape = {
108
112
  */
109
113
  declare function getPagesNavigationContext(): PagesNavigationContextShape | null;
110
114
  declare function getPagesNavigationIsReadyFromSerializedState(routePattern: string | undefined, searchString: string, nextData?: VinextNextData): boolean;
115
+ declare function markPagesRouterReady(): boolean;
116
+ declare function initializePagesRouterReadyFromNextData(nextData: VinextNextData): void;
111
117
  /**
112
118
  * useRouter hook - Pages Router compatible.
113
119
  *
@@ -122,8 +128,17 @@ declare function useRouter(): NextRouter;
122
128
  * The provider owns the reactive Pages Router snapshot so next/router and
123
129
  * next/compat/router consumers share one context value instead of each hook
124
130
  * installing its own global URL-change listener.
131
+ *
132
+ * The PagesRouterCommitBoundary exists for client navigations: its layout
133
+ * callback runs scroll restoration at commit time and resolves the navigation
134
+ * at the same root-commit boundary Next.js awaits before routeChangeComplete.
135
+ * Its onError rejection drives the hard-navigation fallback in runNavigateClient.
136
+ * The same boundary intentionally also wraps SSR and initial hydration, where
137
+ * callbacks default to noopCommit: a hydration-time render error is caught
138
+ * here (React still console.error's it) instead of propagating, matching the
139
+ * navigation-path containment.
125
140
  */
126
- declare function wrapWithRouterContext(element: ReactElement): ReactElement;
141
+ declare function wrapWithRouterContext(element: ReactElement, onCommit?: () => void, onError?: (error: Error) => void): ReactElement;
127
142
  /**
128
143
  * Props injected by `withRouter` into the wrapped component.
129
144
  *
@@ -176,4 +191,4 @@ declare const RouterMethods: {
176
191
  };
177
192
  declare const Router: typeof RouterMethods & Omit<NextRouter, keyof typeof RouterMethods>;
178
193
  //#endregion
179
- export { ExcludeRouterProps, NextRouter, WithRouterProps, _registerRouterStateAccessors, applyNavigationLocale, Router as default, getPagesNavigationContext, getPagesNavigationIsReadyFromSerializedState, isExternalUrl, isHashOnlyChange, setSSRContext, useRouter, withRouter, wrapWithRouterContext };
194
+ export { ExcludeRouterProps, NextRouter, WithRouterProps, initializePagesRouterReadyFromNextData as _initializePagesRouterReadyFromNextData, markPagesRouterReady as _markPagesRouterReady, _registerRouterStateAccessors, applyNavigationLocale, Router as default, getPagesNavigationContext, getPagesNavigationIsReadyFromSerializedState, isExternalUrl, isHashOnlyChange, setSSRContext, useRouter, withRouter, wrapWithRouterContext };