vinext 1.3.0 → 1.4.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 (529) hide show
  1. package/README.md +5 -2
  2. package/THIRD_PARTY_LICENSES.md +47 -0
  3. package/dist/_virtual/_rolldown/runtime.js +4 -3
  4. package/dist/build/action-owner-manifest.d.ts +3 -2
  5. package/dist/build/action-owner-manifest.js +18 -2
  6. package/dist/build/app-page-static-eligibility.d.ts +17 -1
  7. package/dist/build/app-page-static-eligibility.js +80 -13
  8. package/dist/build/clean-output.d.ts +2 -1
  9. package/dist/build/client-build-config.d.ts +13 -3
  10. package/dist/build/client-build-config.js +46 -9
  11. package/dist/build/client-reference-async.d.ts +48 -0
  12. package/dist/build/client-reference-async.js +123 -0
  13. package/dist/build/client-reference-chunks.d.ts +32 -0
  14. package/dist/build/client-reference-chunks.js +111 -0
  15. package/dist/build/client-reference-groups.d.ts +9 -1
  16. package/dist/build/client-reference-groups.js +40 -2
  17. package/dist/build/css-url-assets.d.ts +2 -1
  18. package/dist/build/google-fonts/fallback-metrics.d.ts +2 -1
  19. package/dist/build/google-fonts/find-font-files-in-css.d.ts +1 -0
  20. package/dist/build/google-fonts/find-font-files-in-css.js +17 -4
  21. package/dist/build/google-fonts/font-metadata.d.ts +2 -1
  22. package/dist/build/google-fonts/validate.d.ts +2 -1
  23. package/dist/build/inline-css.d.ts +2 -1
  24. package/dist/build/module-dependency-cache.d.ts +2 -1
  25. package/dist/build/next-client-runtime-manifests.d.ts +2 -1
  26. package/dist/build/precompress.d.ts +2 -1
  27. package/dist/build/precompress.js +1 -1
  28. package/dist/build/prerender-paths.d.ts +2 -1
  29. package/dist/build/prerender-phase.d.ts +2 -1
  30. package/dist/build/prerender-server-pool.js +1 -1
  31. package/dist/build/prerender.d.ts +3 -2
  32. package/dist/build/prerender.js +6 -5
  33. package/dist/build/report.d.ts +2 -15
  34. package/dist/build/report.js +1 -51
  35. package/dist/build/run-prerender.d.ts +2 -1
  36. package/dist/build/server-actions-encryption-key.d.ts +2 -1
  37. package/dist/build/ssr-manifest.js +25 -2
  38. package/dist/build/standalone.d.ts +2 -1
  39. package/dist/cache/cache-adapters-virtual.d.ts +2 -1
  40. package/dist/cache.js +1 -2
  41. package/dist/check.d.ts +2 -1
  42. package/dist/check.js +5 -1
  43. package/dist/cli-args.d.ts +2 -1
  44. package/dist/cli.js +5 -0
  45. package/dist/client/client-redirect-matcher.js +2 -1
  46. package/dist/client/client-redirects.d.ts +4 -3
  47. package/dist/client/client-redirects.js +2 -1
  48. package/dist/client/client-rewrites.d.ts +2 -1
  49. package/dist/client/dev-error-overlay-store.d.ts +2 -1
  50. package/dist/client/dev-error-overlay.js +1 -1
  51. package/dist/client/index.js +1 -2
  52. package/dist/client/instrumentation-client-state.js +5 -5
  53. package/dist/client/navigation-runtime.d.ts +16 -2
  54. package/dist/client/navigation-runtime.js +2 -2
  55. package/dist/client/pages-router-link-navigation.d.ts +2 -1
  56. package/dist/client/vinext-next-data.d.ts +25 -1
  57. package/dist/client/window-next.d.ts +2 -1
  58. package/dist/config/config-matchers.d.ts +12 -1
  59. package/dist/config/config-matchers.js +111 -16
  60. package/dist/config/dotenv.d.ts +2 -1
  61. package/dist/config/next-config.d.ts +32 -1
  62. package/dist/config/next-config.js +93 -5
  63. package/dist/config/tsconfig-paths.d.ts +2 -1
  64. package/dist/deps/.pnpm/iconv-lite@0.4.24/deps/iconv-lite/encodings/dbcs-codec.js +327 -0
  65. package/dist/deps/.pnpm/iconv-lite@0.4.24/deps/iconv-lite/encodings/dbcs-data.js +123 -0
  66. package/dist/deps/.pnpm/iconv-lite@0.4.24/deps/iconv-lite/encodings/index.js +29 -0
  67. package/dist/deps/.pnpm/iconv-lite@0.4.24/deps/iconv-lite/encodings/internal.js +134 -0
  68. package/dist/deps/.pnpm/iconv-lite@0.4.24/deps/iconv-lite/encodings/sbcs-codec.js +50 -0
  69. package/dist/deps/.pnpm/iconv-lite@0.4.24/deps/iconv-lite/encodings/sbcs-data-generated.js +455 -0
  70. package/dist/deps/.pnpm/iconv-lite@0.4.24/deps/iconv-lite/encodings/sbcs-data.js +147 -0
  71. package/dist/deps/.pnpm/iconv-lite@0.4.24/deps/iconv-lite/encodings/tables/big5-added.json.js +169 -0
  72. package/dist/deps/.pnpm/iconv-lite@0.4.24/deps/iconv-lite/encodings/tables/cp936.json.js +2584 -0
  73. package/dist/deps/.pnpm/iconv-lite@0.4.24/deps/iconv-lite/encodings/tables/cp949.json.js +2220 -0
  74. package/dist/deps/.pnpm/iconv-lite@0.4.24/deps/iconv-lite/encodings/tables/cp950.json.js +227 -0
  75. package/dist/deps/.pnpm/iconv-lite@0.4.24/deps/iconv-lite/encodings/tables/eucjp.json.js +425 -0
  76. package/dist/deps/.pnpm/iconv-lite@0.4.24/deps/iconv-lite/encodings/tables/gb18030-ranges.json.js +427 -0
  77. package/dist/deps/.pnpm/iconv-lite@0.4.24/deps/iconv-lite/encodings/tables/gbk-added.json.js +229 -0
  78. package/dist/deps/.pnpm/iconv-lite@0.4.24/deps/iconv-lite/encodings/tables/shiftjis.json.js +292 -0
  79. package/dist/deps/.pnpm/iconv-lite@0.4.24/deps/iconv-lite/encodings/utf16.js +106 -0
  80. package/dist/deps/.pnpm/iconv-lite@0.4.24/deps/iconv-lite/encodings/utf7.js +182 -0
  81. package/dist/deps/.pnpm/iconv-lite@0.4.24/deps/iconv-lite/lib/bom-handling.js +42 -0
  82. package/dist/deps/.pnpm/iconv-lite@0.4.24/deps/iconv-lite/lib/extend-node.js +147 -0
  83. package/dist/deps/.pnpm/iconv-lite@0.4.24/deps/iconv-lite/lib/index.js +94 -0
  84. package/dist/deps/.pnpm/iconv-lite@0.4.24/deps/iconv-lite/lib/streams.js +95 -0
  85. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/detector.js +23 -0
  86. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/index.js +2 -0
  87. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/lookup.js +25 -0
  88. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/bmp.js +11 -0
  89. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/cur.js +15 -0
  90. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/dds.js +11 -0
  91. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/gif.js +12 -0
  92. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/heif.js +55 -0
  93. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/icns.js +76 -0
  94. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/ico.js +39 -0
  95. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/index.js +46 -0
  96. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/j2c.js +11 -0
  97. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/jp2.js +21 -0
  98. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/jpg.js +71 -0
  99. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/jxl-stream.js +42 -0
  100. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/jxl.js +46 -0
  101. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/ktx.js +19 -0
  102. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/png.js +28 -0
  103. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/pnm.js +54 -0
  104. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/psd.js +11 -0
  105. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/svg.js +79 -0
  106. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/tga.js +15 -0
  107. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/tiff.js +96 -0
  108. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/utils.js +53 -0
  109. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/webp.js +45 -0
  110. package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/utils/bit-reader.js +38 -0
  111. package/dist/deps/.pnpm/safer-buffer@2.1.2/deps/safer-buffer/safer.js +45 -0
  112. package/dist/deps/.pnpm/ua-parser-js@1.0.35/deps/ua-parser-js/src/ua-parser.js +2 -2
  113. package/dist/entries/app-browser-entry.d.ts +20 -5
  114. package/dist/entries/app-browser-entry.js +79 -6
  115. package/dist/entries/app-rsc-entry.d.ts +2 -1
  116. package/dist/entries/app-rsc-entry.js +59 -60
  117. package/dist/entries/app-rsc-manifest.d.ts +2 -1
  118. package/dist/entries/app-rsc-manifest.js +56 -4
  119. package/dist/entries/app-ssr-entry.js +1 -0
  120. package/dist/entries/pages-entry-helpers.js +1 -2
  121. package/dist/entries/pages-server-entry.d.ts +2 -1
  122. package/dist/entries/pages-server-entry.js +34 -9
  123. package/dist/entries/runtime-entry-module.d.ts +1 -0
  124. package/dist/entries/runtime-entry-module.js +4 -1
  125. package/dist/image/image-adapters-virtual.d.ts +2 -1
  126. package/dist/index.js +184 -103
  127. package/dist/init-cloudflare.d.ts +1 -3
  128. package/dist/init-cloudflare.js +10 -48
  129. package/dist/init-platform.d.ts +2 -0
  130. package/dist/init-platform.js +4 -0
  131. package/dist/plugins/client-compile-hints.d.ts +30 -0
  132. package/dist/plugins/client-compile-hints.js +88 -0
  133. package/dist/plugins/client-reference-dedup.d.ts +2 -1
  134. package/dist/plugins/cloudflare-dev-module-urls.d.ts +2 -1
  135. package/dist/plugins/dynamic-preload-metadata.d.ts +3 -1
  136. package/dist/plugins/dynamic-preload-metadata.js +1 -1
  137. package/dist/plugins/environment.d.ts +2 -1
  138. package/dist/plugins/extensionless-dynamic-import.js +6 -2
  139. package/dist/plugins/fonts.js +9 -12
  140. package/dist/plugins/ignore-dynamic-requests.d.ts +2 -1
  141. package/dist/plugins/import-meta-url.d.ts +2 -1
  142. package/dist/plugins/next-intl-catalog.d.ts +12 -0
  143. package/dist/plugins/next-intl-catalog.js +85 -0
  144. package/dist/plugins/og-assets.d.ts +2 -1
  145. package/dist/plugins/og-assets.js +2 -3
  146. package/dist/plugins/optimize-imports.d.ts +2 -1
  147. package/dist/plugins/pages-node-externals.d.ts +3 -1
  148. package/dist/plugins/pages-node-externals.js +1 -1
  149. package/dist/plugins/remove-console.d.ts +2 -1
  150. package/dist/plugins/require-condition-resolution.d.ts +2 -1
  151. package/dist/plugins/rsc-client-reference-loaders.d.ts +8 -0
  152. package/dist/plugins/rsc-client-reference-loaders.js +170 -68
  153. package/dist/plugins/rsc-client-shim-excludes.js +2 -0
  154. package/dist/plugins/sass.d.ts +2 -1
  155. package/dist/plugins/strip-server-exports.d.ts +2 -1
  156. package/dist/plugins/styled-jsx.d.ts +2 -1
  157. package/dist/plugins/transform-result.d.ts +2 -1
  158. package/dist/plugins/typeof-window.d.ts +2 -1
  159. package/dist/plugins/use-cache-callable.d.ts +1 -1
  160. package/dist/plugins/use-cache-callable.js +136 -94
  161. package/dist/plugins/worker-image-imports.js +1 -1
  162. package/dist/plugins/worker-use-server.d.ts +2 -1
  163. package/dist/routing/app-route-graph.d.ts +46 -0
  164. package/dist/routing/app-route-graph.js +131 -51
  165. package/dist/routing/browser-route-manifest.d.ts +2 -1
  166. package/dist/routing/optimistic-route-trie.d.ts +2 -1
  167. package/dist/routing/route-matching.d.ts +2 -1
  168. package/dist/routing/route-pattern.d.ts +2 -1
  169. package/dist/server/accept-encoding.d.ts +2 -1
  170. package/dist/server/api-handler.js +19 -4
  171. package/dist/server/app-action-forwarding.d.ts +2 -1
  172. package/dist/server/app-bfcache-identity.d.ts +2 -1
  173. package/dist/server/app-bfcache-identity.js +1 -1
  174. package/dist/server/app-browser-action-result.d.ts +2 -1
  175. package/dist/server/app-browser-entry.js +106 -66
  176. package/dist/server/app-browser-error.d.ts +2 -1
  177. package/dist/server/app-browser-history-controller.d.ts +7 -5
  178. package/dist/server/app-browser-history-controller.js +93 -15
  179. package/dist/server/app-browser-hydration.d.ts +2 -1
  180. package/dist/server/app-browser-interception-context.d.ts +2 -1
  181. package/dist/server/app-browser-navigation-controller.d.ts +2 -2
  182. package/dist/server/app-browser-navigation-controller.js +16 -12
  183. package/dist/server/app-browser-popstate.d.ts +2 -1
  184. package/dist/server/app-browser-rsc-redirect.d.ts +2 -1
  185. package/dist/server/app-browser-rsc-redirect.js +4 -4
  186. package/dist/server/app-browser-server-action-client.d.ts +4 -1
  187. package/dist/server/app-browser-server-action-client.js +4 -3
  188. package/dist/server/app-browser-state.d.ts +2 -4
  189. package/dist/server/app-browser-state.js +9 -4
  190. package/dist/server/app-browser-stream.d.ts +2 -1
  191. package/dist/server/app-browser-supplemental-refresh.js +16 -1
  192. package/dist/server/app-browser-visible-commit.d.ts +3 -2
  193. package/dist/server/app-browser-visible-commit.js +2 -12
  194. package/dist/server/app-client-reference-manifest.d.ts +31 -0
  195. package/dist/server/app-client-reference-manifest.js +46 -0
  196. package/dist/server/app-client-reference-preloader.d.ts +25 -5
  197. package/dist/server/app-client-reference-preloader.js +22 -7
  198. package/dist/server/app-elements-wire.d.ts +8 -39
  199. package/dist/server/app-elements-wire.js +4 -41
  200. package/dist/server/app-elements.d.ts +4 -2
  201. package/dist/server/app-elements.js +4 -2
  202. package/dist/server/app-fallback-renderer.d.ts +9 -2
  203. package/dist/server/app-fallback-renderer.js +4 -1
  204. package/dist/server/app-history-state.d.ts +4 -3
  205. package/dist/server/app-history-state.js +5 -2
  206. package/dist/server/app-inline-css-client.d.ts +2 -1
  207. package/dist/server/app-metadata-tracing.d.ts +2 -1
  208. package/dist/server/app-mounted-layouts.d.ts +21 -0
  209. package/dist/server/app-mounted-layouts.js +67 -0
  210. package/dist/server/app-optimistic-routing.d.ts +37 -2
  211. package/dist/server/app-optimistic-routing.js +75 -2
  212. package/dist/server/app-page-boundary-render.d.ts +20 -2
  213. package/dist/server/app-page-boundary-render.js +224 -40
  214. package/dist/server/app-page-boundary.d.ts +34 -5
  215. package/dist/server/app-page-boundary.js +41 -8
  216. package/dist/server/app-page-cache-finalizer.d.ts +14 -2
  217. package/dist/server/app-page-cache-finalizer.js +71 -30
  218. package/dist/server/app-page-cache-render.d.ts +10 -2
  219. package/dist/server/app-page-cache-render.js +14 -2
  220. package/dist/server/app-page-cache.d.ts +13 -1
  221. package/dist/server/app-page-cache.js +33 -11
  222. package/dist/server/app-page-dispatch.d.ts +39 -11
  223. package/dist/server/app-page-dispatch.js +236 -177
  224. package/dist/server/app-page-element-builder.d.ts +19 -3
  225. package/dist/server/app-page-element-builder.js +193 -71
  226. package/dist/server/app-page-execution.d.ts +43 -51
  227. package/dist/server/app-page-execution.js +205 -92
  228. package/dist/server/app-page-head.d.ts +108 -3
  229. package/dist/server/app-page-head.js +337 -154
  230. package/dist/server/app-page-http-access-fallback-metadata.d.ts +49 -2
  231. package/dist/server/app-page-http-access-fallback-metadata.js +77 -2
  232. package/dist/server/app-page-layout-gate.d.ts +35 -0
  233. package/dist/server/app-page-layout-gate.js +50 -0
  234. package/dist/server/app-page-method.d.ts +2 -1
  235. package/dist/server/app-page-params.d.ts +0 -1
  236. package/dist/server/app-page-params.js +1 -14
  237. package/dist/server/app-page-probe.d.ts +5 -22
  238. package/dist/server/app-page-probe.js +4 -37
  239. package/dist/server/app-page-render-identity.d.ts +2 -1
  240. package/dist/server/app-page-render.d.ts +9 -13
  241. package/dist/server/app-page-render.js +108 -214
  242. package/dist/server/app-page-request.d.ts +15 -4
  243. package/dist/server/app-page-request.js +2 -2
  244. package/dist/server/app-page-response.js +3 -3
  245. package/dist/server/app-page-route-wiring.d.ts +65 -8
  246. package/dist/server/app-page-route-wiring.js +259 -103
  247. package/dist/server/app-page-rsc-render-status.d.ts +29 -2
  248. package/dist/server/app-page-rsc-render-status.js +121 -13
  249. package/dist/server/app-page-search-params-observation.d.ts +7 -2
  250. package/dist/server/app-page-search-params-observation.js +8 -1
  251. package/dist/server/app-page-segment-plan.d.ts +2 -1
  252. package/dist/server/app-page-stream.d.ts +33 -1
  253. package/dist/server/app-page-stream.js +25 -6
  254. package/dist/server/app-pages-bridge.d.ts +6 -1
  255. package/dist/server/app-pages-bridge.js +7 -3
  256. package/dist/server/app-ppr-fallback-shell-render.d.ts +2 -1
  257. package/dist/server/app-ppr-fallback-shell.d.ts +2 -1
  258. package/dist/server/app-prerender-endpoints.d.ts +2 -1
  259. package/dist/server/app-prerender-static-params.d.ts +2 -1
  260. package/dist/server/app-render-dependency.d.ts +21 -4
  261. package/dist/server/app-render-dependency.js +100 -33
  262. package/dist/server/app-request-stage-dispatch.js +1 -1
  263. package/dist/server/app-request-stage-independent-entry.d.ts +2 -1
  264. package/dist/server/app-response-stage-entry.d.ts +2 -1
  265. package/dist/server/app-route-handler-cache.d.ts +2 -1
  266. package/dist/server/app-route-handler-cache.js +2 -2
  267. package/dist/server/app-route-handler-dispatch.d.ts +2 -1
  268. package/dist/server/app-route-handler-dispatch.js +15 -10
  269. package/dist/server/app-route-handler-execution.d.ts +2 -1
  270. package/dist/server/app-route-handler-execution.js +8 -3
  271. package/dist/server/app-route-handler-policy.d.ts +1 -1
  272. package/dist/server/app-route-handler-policy.js +3 -3
  273. package/dist/server/app-route-handler-response.d.ts +2 -1
  274. package/dist/server/app-route-handler-response.js +1 -1
  275. package/dist/server/app-route-handler-runtime.d.ts +2 -1
  276. package/dist/server/app-route-handler-runtime.js +17 -4
  277. package/dist/server/app-route-module-loader.d.ts +18 -1
  278. package/dist/server/app-route-module-loader.js +8 -0
  279. package/dist/server/app-route-tree-prefetch.d.ts +2 -1
  280. package/dist/server/app-rsc-cache-busting.d.ts +2 -2
  281. package/dist/server/app-rsc-cache-busting.js +4 -4
  282. package/dist/server/app-rsc-error-handler.d.ts +4 -2
  283. package/dist/server/app-rsc-error-handler.js +9 -1
  284. package/dist/server/app-rsc-errors.d.ts +10 -1
  285. package/dist/server/app-rsc-errors.js +8 -1
  286. package/dist/server/app-rsc-handler.d.ts +7 -6
  287. package/dist/server/app-rsc-handler.js +36 -34
  288. package/dist/server/app-rsc-request-normalization.d.ts +0 -4
  289. package/dist/server/app-rsc-request-normalization.js +1 -4
  290. package/dist/server/app-rsc-response-finalizer.d.ts +2 -1
  291. package/dist/server/app-rsc-response-finalizer.js +2 -2
  292. package/dist/server/app-rsc-response-stage.js +5 -3
  293. package/dist/server/app-rsc-route-matching.d.ts +38 -1
  294. package/dist/server/app-rsc-route-matching.js +24 -0
  295. package/dist/server/app-segment-config.d.ts +2 -1
  296. package/dist/server/app-segment-config.js +1 -14
  297. package/dist/server/app-server-action-execution.d.ts +5 -2
  298. package/dist/server/app-server-action-execution.js +10 -7
  299. package/dist/server/app-ssr-entry.d.ts +8 -0
  300. package/dist/server/app-ssr-entry.js +98 -50
  301. package/dist/server/app-ssr-error-meta.d.ts +2 -1
  302. package/dist/server/app-ssr-search-params-gate.d.ts +2 -1
  303. package/dist/server/app-ssr-stream.d.ts +22 -10
  304. package/dist/server/app-ssr-stream.js +300 -68
  305. package/dist/server/app-static-generation.d.ts +2 -1
  306. package/dist/server/app-streamed-client-references.d.ts +39 -0
  307. package/dist/server/app-streamed-client-references.js +156 -0
  308. package/dist/server/app-visited-response-cache.d.ts +38 -2
  309. package/dist/server/app-visited-response-cache.js +46 -5
  310. package/dist/server/app-worker-stages.d.ts +27 -4
  311. package/dist/server/app-worker-stages.js +45 -6
  312. package/dist/server/artifact-compatibility.d.ts +2 -2
  313. package/dist/server/artifact-compatibility.js +1 -10
  314. package/dist/server/bfcache-identity.d.ts +2 -1
  315. package/dist/server/cache-headers.d.ts +2 -1
  316. package/dist/server/cache-proof.d.ts +1 -115
  317. package/dist/server/cache-proof.js +1 -544
  318. package/dist/server/cacheability-request.d.ts +2 -1
  319. package/dist/server/cacheability-request.js +13 -8
  320. package/dist/server/config-headers.d.ts +2 -1
  321. package/dist/server/csp.d.ts +2 -1
  322. package/dist/server/default-global-not-found-module.d.ts +2 -1
  323. package/dist/server/default-http-access-fallback-modules.d.ts +33 -0
  324. package/dist/server/default-http-access-fallback-modules.js +31 -0
  325. package/dist/server/defer-until-stream-consumed.d.ts +34 -0
  326. package/dist/server/defer-until-stream-consumed.js +154 -21
  327. package/dist/server/dev-lockfile.d.ts +32 -2
  328. package/dist/server/dev-lockfile.js +46 -2
  329. package/dist/server/dev-module-runner.d.ts +2 -1
  330. package/dist/server/dev-server.js +14 -6
  331. package/dist/server/fetch-handler.js +1 -2
  332. package/dist/server/file-based-metadata.d.ts +2 -1
  333. package/dist/server/framework-tracer.d.ts +2 -1
  334. package/dist/server/headers.d.ts +6 -3
  335. package/dist/server/headers.js +9 -5
  336. package/dist/server/html.d.ts +1 -0
  337. package/dist/server/html.js +19 -1
  338. package/dist/server/http-conditional.d.ts +2 -1
  339. package/dist/server/http-error-responses.d.ts +2 -1
  340. package/dist/server/implicit-tags.d.ts +2 -1
  341. package/dist/server/isr-cache.d.ts +8 -2
  342. package/dist/server/isr-cache.js +26 -1
  343. package/dist/server/metadata-route-build-data.d.ts +2 -1
  344. package/dist/server/metadata-route-build-data.js +1 -1
  345. package/dist/server/metadata-route-response.d.ts +2 -1
  346. package/dist/server/metadata-route-response.js +32 -15
  347. package/dist/server/metadata-routes.d.ts +2 -1
  348. package/dist/server/middleware-runtime.d.ts +2 -1
  349. package/dist/server/multi-stage.d.ts +52 -11
  350. package/dist/server/multi-stage.js +13 -1
  351. package/dist/server/navigation-planner.js +1 -1
  352. package/dist/server/navigation-trace.d.ts +2 -1
  353. package/dist/server/next-error-digest.d.ts +2 -1
  354. package/dist/server/nitro-public-files-plugin.d.ts +2 -1
  355. package/dist/server/nitro-public-files.d.ts +2 -1
  356. package/dist/server/opentelemetry-api.d.ts +2 -1
  357. package/dist/server/operation-token.d.ts +2 -1
  358. package/dist/server/pages-api-route.d.ts +2 -1
  359. package/dist/server/pages-api-route.js +28 -19
  360. package/dist/server/pages-asset-tags.d.ts +2 -1
  361. package/dist/server/pages-body-parser-config.d.ts +2 -1
  362. package/dist/server/pages-client-assets.d.ts +4 -0
  363. package/dist/server/pages-data-route.d.ts +2 -1
  364. package/dist/server/pages-document-asset-props.d.ts +2 -1
  365. package/dist/server/pages-document-initial-props.d.ts +2 -1
  366. package/dist/server/pages-execution-tracing.d.ts +2 -1
  367. package/dist/server/pages-execution-tracing.js +1 -1
  368. package/dist/server/pages-get-initial-props.d.ts +2 -1
  369. package/dist/server/pages-media-type.d.ts +21 -1
  370. package/dist/server/pages-media-type.js +69 -5
  371. package/dist/server/pages-node-compat.js +52 -27
  372. package/dist/server/pages-page-data.d.ts +7 -1
  373. package/dist/server/pages-page-data.js +35 -12
  374. package/dist/server/pages-page-handler.d.ts +3 -2
  375. package/dist/server/pages-page-handler.js +27 -27
  376. package/dist/server/pages-page-method.d.ts +2 -1
  377. package/dist/server/pages-page-response.d.ts +2 -1
  378. package/dist/server/pages-preview.d.ts +2 -1
  379. package/dist/server/pages-readiness.d.ts +2 -1
  380. package/dist/server/pages-request-pipeline.d.ts +10 -1
  381. package/dist/server/pages-request-pipeline.js +6 -7
  382. package/dist/server/pages-request-stage-entry.d.ts +2 -1
  383. package/dist/server/pages-request-stage-entry.js +14 -12
  384. package/dist/server/pages-response-stage-entry.d.ts +2 -1
  385. package/dist/server/pages-response-stage-entry.js +9 -3
  386. package/dist/server/pages-route-data-kind.d.ts +2 -1
  387. package/dist/server/prerender-cache-life-header.d.ts +2 -1
  388. package/dist/server/prerender-route-params.d.ts +2 -1
  389. package/dist/server/prod-server.js +14 -4
  390. package/dist/server/request-log.d.ts +2 -1
  391. package/dist/server/request-pipeline.d.ts +6 -0
  392. package/dist/server/request-pipeline.js +21 -1
  393. package/dist/server/request-tracing.d.ts +2 -1
  394. package/dist/server/request-tracing.js +1 -1
  395. package/dist/server/response-start-tracing.js +7 -29
  396. package/dist/server/rsc-render-stream.d.ts +4 -0
  397. package/dist/server/rsc-render-stream.js +25 -0
  398. package/dist/server/seed-cache.d.ts +2 -1
  399. package/dist/server/seed-cache.js +1 -1
  400. package/dist/server/shared-cache-identity.d.ts +23 -0
  401. package/dist/server/shared-cache-identity.js +36 -0
  402. package/dist/server/static-file-cache.d.ts +2 -1
  403. package/dist/server/static-file-cache.js +1 -0
  404. package/dist/server/worker-revalidation-context.d.ts +2 -1
  405. package/dist/server/worker-stages.d.ts +18 -4
  406. package/dist/server/worker-stages.js +23 -4
  407. package/dist/shims/app.d.ts +2 -1
  408. package/dist/shims/cache-callable-runtime.d.ts +2 -1
  409. package/dist/shims/cache-handler.d.ts +8 -3
  410. package/dist/shims/cache-handler.js +31 -11
  411. package/dist/shims/cache-request-state.d.ts +17 -20
  412. package/dist/shims/cache-request-state.js +16 -21
  413. package/dist/shims/cache-runtime.js +27 -11
  414. package/dist/shims/cache.d.ts +8 -7
  415. package/dist/shims/cache.js +17 -19
  416. package/dist/shims/cacheability-classification.d.ts +2 -0
  417. package/dist/shims/caught-not-found-boundaries.d.ts +15 -0
  418. package/dist/shims/caught-not-found-boundaries.js +48 -0
  419. package/dist/shims/cdn-cache.d.ts +22 -5
  420. package/dist/shims/cdn-purge-routes.d.ts +2 -1
  421. package/dist/shims/client-locale.js +2 -1
  422. package/dist/shims/client-page-root.d.ts +2 -1
  423. package/dist/shims/client-page-root.js +2 -2
  424. package/dist/shims/config.d.ts +2 -1
  425. package/dist/shims/default-forbidden.d.ts +4 -0
  426. package/dist/shims/default-forbidden.js +18 -0
  427. package/dist/shims/default-not-found.d.ts +0 -5
  428. package/dist/shims/default-not-found.js +5 -41
  429. package/dist/shims/default-unauthorized.d.ts +4 -0
  430. package/dist/shims/default-unauthorized.js +18 -0
  431. package/dist/shims/dynamic.js +9 -6
  432. package/dist/shims/error-boundary.d.ts +39 -3
  433. package/dist/shims/error-boundary.js +33 -18
  434. package/dist/shims/fetch-cache-state.d.ts +5 -1
  435. package/dist/shims/fetch-cache-state.js +1 -3
  436. package/dist/shims/fetch-cache.d.ts +2 -1
  437. package/dist/shims/fetch-cache.js +34 -24
  438. package/dist/shims/font-google.js +1 -2
  439. package/dist/shims/font-utils.d.ts +3 -2
  440. package/dist/shims/font-utils.js +5 -3
  441. package/dist/shims/form.js +3 -3
  442. package/dist/shims/headers.d.ts +8 -23
  443. package/dist/shims/headers.js +17 -67
  444. package/dist/shims/http-access-error-fallback.d.ts +7 -0
  445. package/dist/shims/http-access-error-fallback.js +47 -0
  446. package/dist/shims/image.d.ts +1 -22
  447. package/dist/shims/internal/app-prefetch-fetch-queue.d.ts +22 -2
  448. package/dist/shims/internal/app-prefetch-fetch-queue.js +71 -18
  449. package/dist/shims/internal/app-route-prefetch-policy.d.ts +14 -3
  450. package/dist/shims/internal/app-route-prefetch-policy.js +29 -4
  451. package/dist/shims/internal/cache-context-accessor.d.ts +2 -1
  452. package/dist/shims/internal/client-reference-loader.d.ts +7 -0
  453. package/dist/shims/internal/client-reference-loader.js +91 -0
  454. package/dist/shims/internal/cookie-serialize.d.ts +2 -1
  455. package/dist/shims/internal/cookies.js +1 -2
  456. package/dist/shims/internal/headers-state.d.ts +2 -0
  457. package/dist/shims/internal/headers-state.js +6 -1
  458. package/dist/shims/internal/hybrid-client-route-owner-direct.d.ts +2 -1
  459. package/dist/shims/internal/interpolate-as.d.ts +2 -1
  460. package/dist/shims/internal/navigation-untracked.js +1 -1
  461. package/dist/shims/internal/pages-data-target.d.ts +2 -1
  462. package/dist/shims/internal/pages-data-url.d.ts +2 -1
  463. package/dist/shims/internal/thenable-well-known-properties.d.ts +2 -1
  464. package/dist/shims/link.js +197 -52
  465. package/dist/shims/metadata.d.ts +52 -29
  466. package/dist/shims/metadata.js +142 -42
  467. package/dist/shims/navigation-errors.d.ts +2 -1
  468. package/dist/shims/navigation-server.js +1 -1
  469. package/dist/shims/navigation.d.ts +95 -8
  470. package/dist/shims/navigation.js +255 -47
  471. package/dist/shims/navigation.react-server.js +2 -2
  472. package/dist/shims/pages-router-runtime.d.ts +2 -1
  473. package/dist/shims/ppr-fallback-shell.d.ts +2 -1
  474. package/dist/shims/request-state-types.d.ts +2 -2
  475. package/dist/shims/router.js +14 -3
  476. package/dist/shims/slot.d.ts +12 -0
  477. package/dist/shims/slot.js +37 -9
  478. package/dist/shims/unified-request-context.d.ts +1 -1
  479. package/dist/shims/unified-request-context.js +5 -6
  480. package/dist/typegen.d.ts +2 -1
  481. package/dist/utils/cache-control-metadata.d.ts +5 -0
  482. package/dist/utils/cache-control-metadata.js +9 -1
  483. package/dist/utils/client-build-manifest.d.ts +4 -1
  484. package/dist/utils/client-build-manifest.js +9 -2
  485. package/dist/utils/client-entry-manifest.d.ts +13 -0
  486. package/dist/utils/client-entry-manifest.js +20 -1
  487. package/dist/utils/client-reference-chunks.d.ts +45 -0
  488. package/dist/utils/client-reference-chunks.js +30 -0
  489. package/dist/utils/client-runtime-metadata.d.ts +9 -1
  490. package/dist/utils/client-runtime-metadata.js +40 -9
  491. package/dist/utils/compare.d.ts +9 -0
  492. package/dist/utils/compare.js +15 -1
  493. package/dist/utils/lazy-chunks.d.ts +14 -0
  494. package/dist/utils/lazy-chunks.js +27 -1
  495. package/dist/utils/middleware-request-headers.d.ts +2 -1
  496. package/dist/utils/project.d.ts +4 -3
  497. package/dist/utils/project.js +12 -17
  498. package/dist/utils/query.d.ts +2 -1
  499. package/dist/utils/regex.d.ts +5 -0
  500. package/dist/utils/regex.js +11 -1
  501. package/dist/utils/text-stream.d.ts +10 -5
  502. package/dist/utils/text-stream.js +6 -6
  503. package/dist/utils/vite-cli-invocation.d.ts +2 -1
  504. package/package.json +6 -5
  505. package/dist/build/layout-classification-types.d.ts +0 -60
  506. package/dist/build/layout-classification-types.js +0 -1
  507. package/dist/build/layout-classification.d.ts +0 -61
  508. package/dist/build/layout-classification.js +0 -98
  509. package/dist/build/route-classification-injector.d.ts +0 -32
  510. package/dist/build/route-classification-injector.js +0 -59
  511. package/dist/build/route-classification-manifest.d.ts +0 -53
  512. package/dist/build/route-classification-manifest.js +0 -143
  513. package/dist/deps/.pnpm/image-size@2.0.2/deps/image-size/dist/index.js +0 -808
  514. package/dist/server/app-browser-client-reuse-manifest.d.ts +0 -10
  515. package/dist/server/app-browser-client-reuse-manifest.js +0 -101
  516. package/dist/server/app-layout-param-observation.d.ts +0 -41
  517. package/dist/server/app-layout-param-observation.js +0 -168
  518. package/dist/server/client-reuse-manifest.d.ts +0 -102
  519. package/dist/server/client-reuse-manifest.js +0 -209
  520. package/dist/server/default-not-found-module.d.ts +0 -19
  521. package/dist/server/default-not-found-module.js +0 -18
  522. package/dist/server/rsc-stream-hints.d.ts +0 -21
  523. package/dist/server/rsc-stream-hints.js +0 -227
  524. package/dist/server/skip-cache-proof.d.ts +0 -60
  525. package/dist/server/skip-cache-proof.js +0 -168
  526. package/dist/server/static-layout-client-reuse-proof.d.ts +0 -13
  527. package/dist/server/static-layout-client-reuse-proof.js +0 -33
  528. package/dist/utils/sorted-array.d.ts +0 -7
  529. package/dist/utils/sorted-array.js +0 -20
@@ -11,14 +11,14 @@ import { formatUrlObject, formatUrlObjectWithValidation } from "./internal/forma
11
11
  import { normalizeRouterHref, resolvePagesRouterHref } from "./internal/normalize-router-href.js";
12
12
  import { getCurrentRoutePathnameForWarning } from "./internal/route-pattern-for-warning.js";
13
13
  import { getCurrentBrowserLocale } from "./client-locale.js";
14
- import { getNavigationRuntime, hasAppNavigationRuntime, loadNavigationRuntimeRouteManifest, registerNavigationRuntimeFunctions } from "../client/navigation-runtime.js";
14
+ import { NAVIGATION_RUNTIME_KEY, getNavigationRuntime, isNavigationRuntimeFunctions, loadNavigationRuntimeRouteManifest, registerNavigationRuntimeFunctions } from "../client/navigation-runtime.js";
15
15
  import { navigatePagesRouterLinkWithFallback, resolvePagesRouterQueryOnlyHref } from "../client/pages-router-link-navigation.js";
16
- import { scheduleAppPrefetchFetch } from "./internal/app-prefetch-fetch-queue.js";
16
+ import { cancelQueuedAppPrefetchFetch, getAppPrefetchFetchClaimSequence, isAppPrefetchFetchClaimed, scheduleAppPrefetchFetch } from "./internal/app-prefetch-fetch-queue.js";
17
17
  import { getI18nContext } from "./i18n-context.js";
18
18
  import { canLinkIntentPrefetch, canLinkPrefetch, getLinkPrefetchHref } from "./link-prefetch.js";
19
19
  import { canAutoPrefetchFullAppRoute, resolveAutoAppRoutePrefetch, resolveFullAppRoutePrefetch } from "./internal/app-route-prefetch-policy.js";
20
20
  import { clearLinkForCurrentNavigation, notifyLinkNavigationStart, setLinkForCurrentNavigation } from "./internal/link-status-registry.js";
21
- import React, { createContext, forwardRef, useCallback, useContext, useEffect, useRef, useState } from "react";
21
+ import React, { createContext, forwardRef, useCallback, useContext, useEffect, useLayoutEffect, useRef, useState } from "react";
22
22
  import { jsx } from "react/jsx-runtime";
23
23
  //#region src/shims/link.tsx
24
24
  /**
@@ -29,6 +29,7 @@ import { jsx } from "react/jsx-runtime";
29
29
  * page swap via the router's navigation system.
30
30
  */
31
31
  const HAS_PAGES_ROUTER = process.env.__VINEXT_HAS_PAGES_ROUTER !== "false";
32
+ const isServer = typeof window === "undefined";
32
33
  const HAS_CLIENT_REWRITES = process.env.__VINEXT_HAS_CLIENT_REWRITES !== "false";
33
34
  let loadedNavigationModule = null;
34
35
  let navigationModulePromise = null;
@@ -46,6 +47,20 @@ function loadHybridClientRouteOwnerModule() {
46
47
  return module;
47
48
  });
48
49
  }
50
+ let appRscCacheBustingModulePromise = null;
51
+ let appPrefetchModulesPromise = null;
52
+ function loadAppRscCacheBustingModule() {
53
+ return appRscCacheBustingModulePromise ??= import("../server/app-rsc-cache-busting.js");
54
+ }
55
+ function loadAppPrefetchModules() {
56
+ return appPrefetchModulesPromise ??= Promise.all([
57
+ import("../server/app-elements.js"),
58
+ loadAppRscCacheBustingModule(),
59
+ import("./internal/app-prefetch-rsc-request.js"),
60
+ import("../server/app-rsc-render-mode.js"),
61
+ import("../server/headers.js")
62
+ ]);
63
+ }
49
64
  const LinkStatusContext = createContext({ pending: false });
50
65
  /**
51
66
  * useLinkStatus returns the pending state of the enclosing <Link>.
@@ -70,11 +85,11 @@ function resolveHref(href, validate = false) {
70
85
  if (typeof href === "string") return href;
71
86
  return validate ? formatUrlObjectWithValidation(href) : formatUrlObject(href);
72
87
  }
73
- function resolvePagesLinkValue(value, pagesRouter, routePathnameForWarning) {
88
+ function resolvePagesLinkValue(value, pagesRouter) {
74
89
  const formatted = resolveHref(value, pagesRouter !== null);
75
90
  if (pagesRouter === null) return formatted;
76
91
  if (typeof pagesRouter.pathname === "string" && typeof pagesRouter.asPath === "string" && !formatted.startsWith("?") && !formatted.startsWith("#")) return resolvePagesRouterHref(formatted, pagesRouter, __basePath);
77
- return normalizeRouterHref(formatted, routePathnameForWarning);
92
+ return normalizeRouterHref(formatted, getCurrentRoutePathnameForWarning());
78
93
  }
79
94
  function resolvePagesQueryOnlyHref(href) {
80
95
  if (!HAS_PAGES_ROUTER) return href;
@@ -101,8 +116,35 @@ function resolveLinkPrefetchMode(prefetchProp, isDangerous) {
101
116
  if (prefetchProp === true) return "full";
102
117
  return "auto";
103
118
  }
119
+ let validatedNavigationRuntime = null;
120
+ let validatedNavigationRuntimeBootstrap = null;
121
+ let validatedNavigationRuntimeFunctions = null;
122
+ /**
123
+ * `hasAppNavigationRuntime()` for Link, which asks on every render and every
124
+ * prefetch. Full validation walks the whole navigation runtime, including every
125
+ * inline RSC chunk still held by the bootstrap, so skip it while window still
126
+ * holds the runtime that last passed it with the same bootstrap and function
127
+ * table objects. Registering either replaces that object, and a replaced
128
+ * runtime, bootstrap or table falls through to full validation. A table edited
129
+ * in place keeps its identity, so the function table is still checked on every
130
+ * call (it is cheap); chunks streamed into the held bootstrap are not
131
+ * revalidated.
132
+ */
133
+ function hasLinkAppNavigationRuntime() {
134
+ if (typeof window === "undefined") return false;
135
+ const runtime = validatedNavigationRuntime;
136
+ if (runtime !== null && Reflect.get(window, NAVIGATION_RUNTIME_KEY) === runtime && runtime.bootstrap === validatedNavigationRuntimeBootstrap && runtime.functions === validatedNavigationRuntimeFunctions) {
137
+ const functions = runtime.functions;
138
+ return isNavigationRuntimeFunctions(functions) && typeof functions.navigate === "function";
139
+ }
140
+ const validated = getNavigationRuntime();
141
+ validatedNavigationRuntime = validated;
142
+ validatedNavigationRuntimeBootstrap = validated?.bootstrap ?? null;
143
+ validatedNavigationRuntimeFunctions = validated?.functions ?? null;
144
+ return typeof validated?.functions.navigate === "function";
145
+ }
104
146
  function getLinkPrefetchRouterMode() {
105
- return hasAppNavigationRuntime() ? "app" : "pages";
147
+ return hasLinkAppNavigationRuntime() ? "app" : "pages";
106
148
  }
107
149
  /**
108
150
  * Prefetch a URL for faster navigation.
@@ -115,8 +157,11 @@ function getLinkPrefetchRouterMode() {
115
157
  * App Router and high-priority prefetches start immediately. Low-priority
116
158
  * Pages Router fallback prefetches use `requestIdleCallback` (or `setTimeout`
117
159
  * fallback) to avoid blocking the main thread during initial page load.
160
+ *
161
+ * `owner` is the visible Link behind a viewport prefetch; see
162
+ * `OwnedLinkPrefetch`.
118
163
  */
119
- function prefetchUrl(href, mode, priority = "low", pagesRouteHref, locale) {
164
+ function prefetchUrl(href, mode, priority = "low", pagesRouteHref, locale, owner) {
120
165
  if (typeof window === "undefined") return;
121
166
  const navigationEpoch = linkPrefetchNavigationEpoch;
122
167
  const prefetchHref = getLinkPrefetchHref({
@@ -137,21 +182,17 @@ function prefetchUrl(href, mode, priority = "low", pagesRouteHref, locale) {
137
182
  if (mode === "auto" && priority === "low" && target.origin === window.location.origin && target.pathname === window.location.pathname && target.search !== window.location.search && target.hash !== "") return;
138
183
  const runPrefetch = () => {
139
184
  (async () => {
140
- if (hasAppNavigationRuntime()) {
185
+ if (hasLinkAppNavigationRuntime()) {
141
186
  if (isBotUserAgent(window.navigator?.userAgent ?? "")) return;
142
- const [navigation, { AppElementsWire }, rscCacheBusting, { resolveAppPrefetchRscRequest }, { APP_RSC_RENDER_MODE_PREFETCH_DYNAMIC_SHELL, APP_RSC_RENDER_MODE_PREFETCH_LOADING_SHELL }, headersModule, hybridRouteOwner, routeManifestLoaded] = await Promise.all([
187
+ const [navigation, [{ AppElementsWire }, rscCacheBusting, { resolveAppPrefetchRscRequest }, { APP_RSC_RENDER_MODE_PREFETCH_DYNAMIC_SHELL, APP_RSC_RENDER_MODE_PREFETCH_LOADING_SHELL }, headersModule], hybridRouteOwner, routeManifestLoaded] = await Promise.all([
143
188
  loadNavigationModule(),
144
- import("../server/app-elements.js"),
145
- import("../server/app-rsc-cache-busting.js"),
146
- import("./internal/app-prefetch-rsc-request.js"),
147
- import("../server/app-rsc-render-mode.js"),
148
- import("../server/headers.js"),
189
+ loadAppPrefetchModules(),
149
190
  HAS_PAGES_ROUTER || HAS_CLIENT_REWRITES ? loadHybridClientRouteOwnerModule() : null,
150
191
  loadNavigationRuntimeRouteManifest()
151
192
  ]);
152
193
  if (routeManifestLoaded === false) return;
153
194
  if (navigationEpoch !== linkPrefetchNavigationEpoch) return;
154
- const { getPrefetchInterceptionContext, getPrefetchCache, getPrefetchedUrls, getMountedSlotsHeader, createAppPrefetchRequestHeaders, discardLearningOnlyPrefetchCacheEntry, fetchRouteTreeGatedPrefetch, hasFreshLearningOnlyPrefetchCacheEntry, hasSearchAgnosticPrefetchShellForRoute, hasPrefetchCacheEntryForNavigation, prefetchRscResponse, prepareNavigationPrefetchSnapshot, DYNAMIC_NAVIGATION_CACHE_TTL, PREFETCH_CACHE_TTL } = navigation;
195
+ const { getPrefetchInterceptionContext, getPrefetchCache, getPrefetchedUrls, getMountedSlotsHeader, createAppPrefetchRequestHeaders, discardLearningOnlyPrefetchCacheEntry, fetchRouteTreeGatedPrefetch, hasFreshLearningOnlyPrefetchCacheEntry, hasSearchAgnosticPrefetchShellForRoute, hasPrefetchCacheEntryForNavigation, prefetchRscResponse, prepareNavigationPrefetchSnapshot, promotePrefetchCacheEntryForNavigation, seedFullPrefetchFromVisitedResponse, hasNavigationFreshVisitedResponse, DYNAMIC_NAVIGATION_CACHE_TTL, PREFETCH_CACHE_TTL } = navigation;
155
196
  const { createRscRequestUrl } = rscCacheBusting;
156
197
  const { NEXT_ROUTER_PREFETCH_HEADER, NEXT_ROUTER_SEGMENT_PREFETCH_HEADER, VINEXT_MOUNTED_SLOTS_HEADER } = headersModule;
157
198
  const hybridOwner = HAS_PAGES_ROUTER ? hybridRouteOwner.resolveHybridClientRouteOwner(prefetchHref, __basePath) : null;
@@ -160,16 +201,16 @@ function prefetchUrl(href, mode, priority = "low", pagesRouteHref, locale) {
160
201
  const prefetchPolicyHref = rewrittenPrefetchHref ?? prefetchHref;
161
202
  const interceptionContext = getPrefetchInterceptionContext(fullHref);
162
203
  const mountedSlotsHeader = getMountedSlotsHeader();
163
- const autoPrefetch = mode === "auto" ? resolveAutoAppRoutePrefetch(prefetchPolicyHref) : resolveFullAppRoutePrefetch();
204
+ const autoPrefetch = mode === "auto" ? resolveAutoAppRoutePrefetch(prefetchPolicyHref, interceptionContext) : resolveFullAppRoutePrefetch();
164
205
  if (!autoPrefetch.shouldPrefetch) return;
165
206
  const isOptimisticRouteShellPrefetch = !autoPrefetch.cacheForNavigation;
166
207
  const hasSearchParams = new URL(fullHref, window.location.href).search !== "";
167
208
  const isAutomaticSearchParamShell = mode === "auto" && isOptimisticRouteShellPrefetch && hasSearchParams;
168
- const hasSearchAgnosticShell = isAutomaticSearchParamShell && hasSearchAgnosticPrefetchShellForRoute(await createRscRequestUrl(fullHref, new Headers()), interceptionContext, mountedSlotsHeader);
209
+ const hasSearchAgnosticShell = isAutomaticSearchParamShell && (autoPrefetch.rendersDynamically === true || hasSearchAgnosticPrefetchShellForRoute(await createRscRequestUrl(fullHref, new Headers()), interceptionContext, mountedSlotsHeader));
169
210
  const headers = createAppPrefetchRequestHeaders({
170
211
  interceptionContext,
171
212
  fetchPriority: priority,
172
- prefetchKind: mode === "full" ? "full" : "auto",
213
+ prefetchKind: mode === "full" || mode === "full-after-shell" ? "full" : "auto",
173
214
  renderMode: isOptimisticRouteShellPrefetch ? hasSearchAgnosticShell ? APP_RSC_RENDER_MODE_PREFETCH_LOADING_SHELL : isAutomaticSearchParamShell ? APP_RSC_RENDER_MODE_PREFETCH_DYNAMIC_SHELL : APP_RSC_RENDER_MODE_PREFETCH_LOADING_SHELL : void 0
174
215
  });
175
216
  if (mountedSlotsHeader) headers.set(VINEXT_MOUNTED_SLOTS_HEADER, mountedSlotsHeader);
@@ -190,9 +231,13 @@ function prefetchUrl(href, mode, priority = "low", pagesRouteHref, locale) {
190
231
  if (navigationEpoch !== linkPrefetchNavigationEpoch) return;
191
232
  const cacheKey = AppElementsWire.encodeCacheKey(rscUrl, interceptionContext);
192
233
  const prefetched = getPrefetchedUrls();
193
- if (autoPrefetch.cacheForNavigation) discardLearningOnlyPrefetchCacheEntry(rscUrl, interceptionContext);
194
- if (!autoPrefetch.cacheForNavigation && hasFreshLearningOnlyPrefetchCacheEntry(rscUrl, interceptionContext)) return;
195
- const fetchFullRscPayload = () => scheduleAppPrefetchFetch((signal) => fetch(rscUrl, {
234
+ if (autoPrefetch.dynamicStaleTime !== "full-prefetch" && hasFreshLearningOnlyPrefetchCacheEntry(rscUrl, interceptionContext)) {
235
+ joinOwnedLinkPrefetch(getPrefetchCache().get(cacheKey)?.fetchPromise, owner);
236
+ return;
237
+ }
238
+ if (autoPrefetch.cacheForNavigation) discardLearningOnlyPrefetchCacheEntry(rscUrl, interceptionContext, mountedSlotsHeader);
239
+ const owned = createOwnedLinkPrefetch(owner);
240
+ const fetchFullRscPayload = () => scheduleOwnedLinkPrefetch(owned, (signal) => fetch(rscUrl, {
196
241
  headers,
197
242
  credentials: "include",
198
243
  priority,
@@ -208,25 +253,30 @@ function prefetchUrl(href, mode, priority = "low", pagesRouteHref, locale) {
208
253
  shellHeaders.set(NEXT_ROUTER_PREFETCH_HEADER, "1");
209
254
  shellHeaders.set(NEXT_ROUTER_SEGMENT_PREFETCH_HEADER, "1");
210
255
  if (mountedSlotsHeader) shellHeaders.set(VINEXT_MOUNTED_SLOTS_HEADER, mountedSlotsHeader);
256
+ const ownerLeaveCount = owner?.leaveCount;
211
257
  const shellRscUrl = await createRscRequestUrl(fullHref, shellHeaders);
258
+ if (owner && owner.leaveCount !== ownerLeaveCount) return;
212
259
  const shellCacheKey = AppElementsWire.encodeCacheKey(shellRscUrl, interceptionContext);
213
260
  const shellCache = getPrefetchCache();
214
261
  let shellEntry = shellCache.get(shellCacheKey);
215
262
  if (shellEntry === void 0) {
216
263
  getPrefetchedUrls().add(shellCacheKey);
217
- prefetchRscResponse(shellRscUrl, scheduleAppPrefetchFetch((signal) => fetch(shellRscUrl, {
264
+ const shellOwned = createOwnedLinkPrefetch(owner);
265
+ const shellFetchPromise = scheduleOwnedLinkPrefetch(shellOwned, (signal) => fetch(shellRscUrl, {
218
266
  headers: shellHeaders,
219
267
  credentials: "include",
220
268
  priority,
221
269
  signal,
222
270
  purpose: "prefetch"
223
- }), priority), interceptionContext, mountedSlotsHeader, void 0, {
271
+ }), priority);
272
+ trackOwnedLinkPrefetch(shellOwned, shellFetchPromise);
273
+ prefetchRscResponse(shellRscUrl, shellFetchPromise, interceptionContext, mountedSlotsHeader, void 0, {
224
274
  cacheForNavigation: false,
225
275
  optimisticRouteShell: true,
226
276
  prefetchKind: "loading-shell"
227
277
  });
228
278
  shellEntry = shellCache.get(shellCacheKey);
229
- }
279
+ } else joinOwnedLinkPrefetch(shellEntry.fetchPromise, owner);
230
280
  await shellEntry?.pending?.catch(() => {});
231
281
  };
232
282
  const fetchAliasCacheHitProbe = async () => {
@@ -238,7 +288,9 @@ function prefetchUrl(href, mode, priority = "low", pagesRouteHref, locale) {
238
288
  probeHeaders.set(NEXT_ROUTER_PREFETCH_HEADER, "1");
239
289
  probeHeaders.set(NEXT_ROUTER_SEGMENT_PREFETCH_HEADER, "1");
240
290
  if (mountedSlotsHeader) probeHeaders.set(VINEXT_MOUNTED_SLOTS_HEADER, mountedSlotsHeader);
291
+ const ownerLeaveCount = owner?.leaveCount;
241
292
  const probeRscUrl = await createRscRequestUrl(fullHref, probeHeaders);
293
+ if (owner && owner.leaveCount !== ownerLeaveCount) throw new DOMException("Prefetch is no longer wanted", "AbortError");
242
294
  return fetch(probeRscUrl, {
243
295
  method: "HEAD",
244
296
  headers: probeHeaders,
@@ -247,14 +299,23 @@ function prefetchUrl(href, mode, priority = "low", pagesRouteHref, locale) {
247
299
  purpose: "prefetch"
248
300
  });
249
301
  };
250
- const hasExactNavigationCacheEntry = autoPrefetch.cacheForNavigation && hasPrefetchCacheEntryForNavigation(rscUrl, interceptionContext, mountedSlotsHeader);
251
- if (hasExactNavigationCacheEntry || autoPrefetch.cacheForNavigation && hasPrefetchCacheEntryForNavigation(rscUrl, interceptionContext, mountedSlotsHeader, { additionalRscUrls })) {
302
+ const onReuse = (entry, matchedCacheKey) => {
303
+ joinOwnedLinkPrefetch(entry.fetchPromise, owner);
304
+ if (autoPrefetch.dynamicStaleTime === "full-prefetch") promotePrefetchCacheEntryForNavigation(matchedCacheKey, entry);
305
+ };
306
+ const hasExactNavigationCacheEntry = autoPrefetch.cacheForNavigation && hasPrefetchCacheEntryForNavigation(rscUrl, interceptionContext, mountedSlotsHeader, { onReuse });
307
+ if (hasExactNavigationCacheEntry || autoPrefetch.cacheForNavigation && hasPrefetchCacheEntryForNavigation(rscUrl, interceptionContext, mountedSlotsHeader, {
308
+ additionalRscUrls,
309
+ onReuse
310
+ })) {
252
311
  if (!hasExactNavigationCacheEntry && !prefetched.has(cacheKey) && additionalRscUrls.length > 0 && autoPrefetch.prefetchShellFirst && mountedSlotsHeader === null) {
253
312
  prefetched.add(cacheKey);
254
313
  fetchAliasCacheHitProbe().then((response) => response.arrayBuffer()).catch(() => {});
255
314
  }
256
315
  return;
257
316
  }
317
+ if (autoPrefetch.dynamicStaleTime === "full-prefetch" && seedFullPrefetchFromVisitedResponse(rscUrl, interceptionContext, mountedSlotsHeader, additionalRscUrls)) return;
318
+ if (autoPrefetch.dynamicStaleTime !== "full-prefetch" && hasNavigationFreshVisitedResponse(rscUrl, interceptionContext, mountedSlotsHeader, additionalRscUrls)) return;
258
319
  prefetched.add(cacheKey);
259
320
  const gateViaRouteTree = (__prefetchInlining || requiresRouteTreePrefetch) && mode === "auto" && autoPrefetch.prefetchShellFirst;
260
321
  const gateViaExplicitSearchShell = mode === "full" && hasSearchParams && autoPrefetch.prefetchShellFirst && mountedSlotsHeader === null;
@@ -266,7 +327,7 @@ function prefetchUrl(href, mode, priority = "low", pagesRouteHref, locale) {
266
327
  }
267
328
  return fetchRouteTreeGatedPrefetch({
268
329
  fetchFullRscPayload,
269
- fetchRouteTree: (routeTreeRscUrl, routeTreeHeaders) => scheduleAppPrefetchFetch((signal) => fetch(routeTreeRscUrl, {
330
+ fetchRouteTree: (routeTreeRscUrl, routeTreeHeaders) => scheduleOwnedLinkPrefetch(owned, (signal) => fetch(routeTreeRscUrl, {
270
331
  headers: routeTreeHeaders,
271
332
  credentials: "include",
272
333
  priority,
@@ -279,6 +340,7 @@ function prefetchUrl(href, mode, priority = "low", pagesRouteHref, locale) {
279
340
  mountedSlotsHeader
280
341
  });
281
342
  })() : fetchFullRscPayload();
343
+ trackOwnedLinkPrefetch(owned, fetchPromise);
282
344
  if (!__prefetchInlining && mode === "full" && autoPrefetch.cacheForNavigation && autoPrefetch.prefetchShellFirst && mountedSlotsHeader === null && !gateViaExplicitSearchShell) fetchLoadingShellForReuse();
283
345
  prefetchRscResponse(rscUrl, fetchPromise, interceptionContext, mountedSlotsHeader, void 0, {
284
346
  cacheForNavigation: autoPrefetch.cacheForNavigation,
@@ -310,7 +372,7 @@ function prefetchUrl(href, mode, priority = "low", pagesRouteHref, locale) {
310
372
  console.error("[vinext] RSC prefetch setup error:", error);
311
373
  });
312
374
  };
313
- if (priority === "high" || hasAppNavigationRuntime()) {
375
+ if (priority === "high" || hasLinkAppNavigationRuntime()) {
314
376
  runPrefetch();
315
377
  return;
316
378
  }
@@ -318,18 +380,24 @@ function prefetchUrl(href, mode, priority = "low", pagesRouteHref, locale) {
318
380
  }
319
381
  async function promotePrefetchEntriesForNavigation(href) {
320
382
  if (typeof window === "undefined") return;
321
- if (!hasAppNavigationRuntime()) return;
322
- const [{ getPrefetchCache }, { parseRscRequestPath, stripRscCacheBustingSearchParam, stripRscSuffix }] = await Promise.all([loadNavigationModule(), import("../server/app-rsc-cache-busting.js")]);
383
+ if (!hasLinkAppNavigationRuntime()) return;
384
+ const [{ getMountedSlotsHeader, getPrefetchCache, getPrefetchInterceptionContext, promotePrefetchCacheEntryForNavigation }, { parseRscRequestPath, stripRscCacheBustingSearchParam, stripRscSuffix }] = await Promise.all([loadNavigationModule(), loadAppRscCacheBustingModule()]);
323
385
  let target;
386
+ const fullHref = toCanonicalBrowserNavigationHref(href, window.location.href, __basePath, __trailingSlash);
324
387
  try {
325
- target = new URL(toCanonicalBrowserNavigationHref(href, window.location.href, __basePath, __trailingSlash), window.location.href);
388
+ target = new URL(fullHref, window.location.href);
326
389
  } catch {
327
390
  return;
328
391
  }
392
+ const interceptionContext = getPrefetchInterceptionContext(fullHref);
393
+ const mountedSlotsHeader = getMountedSlotsHeader();
329
394
  for (const [cacheKey, entry] of getPrefetchCache()) {
330
395
  if (entry.optimisticRouteShell === true) continue;
331
396
  if (entry.prefetchKind === "route-tree") continue;
332
- const [rscUrl] = cacheKey.split("\0", 1);
397
+ if ((entry.mountedSlotsHeader ?? null) !== mountedSlotsHeader) continue;
398
+ const separatorIndex = cacheKey.indexOf("\0");
399
+ const rscUrl = separatorIndex === -1 ? cacheKey : cacheKey.slice(0, separatorIndex);
400
+ if ((separatorIndex === -1 ? null : cacheKey.slice(separatorIndex + 1)) !== interceptionContext) continue;
333
401
  let cached;
334
402
  try {
335
403
  cached = parseRscRequestPath(rscUrl);
@@ -337,7 +405,7 @@ async function promotePrefetchEntriesForNavigation(href) {
337
405
  continue;
338
406
  }
339
407
  stripRscCacheBustingSearchParam(cached);
340
- if (stripRscSuffix(cached.pathname) === target.pathname && cached.search === target.search) entry.cacheForNavigation = true;
408
+ if (stripRscSuffix(cached.pathname) === target.pathname && cached.search === target.search) promotePrefetchCacheEntryForNavigation(cacheKey, entry);
341
409
  }
342
410
  }
343
411
  /**
@@ -349,6 +417,66 @@ const observedLinkPrefetches = /* @__PURE__ */ new WeakMap();
349
417
  const visibleLinkPrefetches = /* @__PURE__ */ new Set();
350
418
  const visibleAppPrefetchQueue = [];
351
419
  let visibleAppPrefetchDrainScheduled = false;
420
+ const ownedLinkPrefetches = /* @__PURE__ */ new WeakMap();
421
+ function createOwnedLinkPrefetch(owner) {
422
+ if (owner === void 0) return void 0;
423
+ return {
424
+ owners: /* @__PURE__ */ new Set([owner]),
425
+ requests: []
426
+ };
427
+ }
428
+ function hasVisibleOwner(owned) {
429
+ for (const owner of owned.owners) if (owner.isVisible) return true;
430
+ return false;
431
+ }
432
+ function isOwnedLinkPrefetchWanted(owned) {
433
+ if (owned.droppedAt !== void 0) return isAppPrefetchFetchClaimed(owned.claimable, owned.droppedAt);
434
+ return isAppPrefetchFetchClaimed(owned.claimable) || hasVisibleOwner(owned);
435
+ }
436
+ function scheduleOwnedLinkPrefetch(owned, fetcher, priority) {
437
+ if (owned && !isOwnedLinkPrefetchWanted(owned)) return Promise.reject(new DOMException("Prefetch is no longer wanted", "AbortError"));
438
+ const request = scheduleAppPrefetchFetch(fetcher, priority, owned && (() => isOwnedLinkPrefetchWanted(owned)));
439
+ owned?.requests.push(request);
440
+ return request;
441
+ }
442
+ /**
443
+ * Registers the promise cached for `owned`, which reusing Links join. Owners
444
+ * are registered here, not in `createOwnedLinkPrefetch`, since a cache hit
445
+ * returns before sending anything.
446
+ */
447
+ function trackOwnedLinkPrefetch(owned, fetchPromise) {
448
+ if (owned === void 0) return;
449
+ for (const owner of owned.owners) owner.ownedPrefetches.add(owned);
450
+ owned.claimable = fetchPromise;
451
+ ownedLinkPrefetches.set(fetchPromise, owned);
452
+ const settle = (failed) => {
453
+ ownedLinkPrefetches.delete(fetchPromise);
454
+ for (const owner of owned.owners) {
455
+ owner.ownedPrefetches.delete(owned);
456
+ if (failed && owned.droppedAt !== void 0 && owner.isVisible) scheduleVisibleAppPrefetch(owner);
457
+ }
458
+ owned.owners.clear();
459
+ };
460
+ fetchPromise.then(() => settle(false), () => settle(true));
461
+ }
462
+ function joinOwnedLinkPrefetch(fetchPromise, owner) {
463
+ const owned = fetchPromise && ownedLinkPrefetches.get(fetchPromise);
464
+ if (!owned || owner === void 0) return;
465
+ owned.owners.add(owner);
466
+ owner.ownedPrefetches.add(owned);
467
+ }
468
+ /** Called when a Link leaves the viewport or unmounts. */
469
+ function releaseOwnedLinkPrefetches(instance) {
470
+ instance.leaveCount += 1;
471
+ for (const owned of instance.ownedPrefetches) {
472
+ owned.owners.delete(instance);
473
+ if (owned.droppedAt !== void 0 || hasVisibleOwner(owned)) continue;
474
+ owned.droppedAt = getAppPrefetchFetchClaimSequence();
475
+ if (isAppPrefetchFetchClaimed(owned.claimable)) continue;
476
+ for (const request of owned.requests) cancelQueuedAppPrefetchFetch(request);
477
+ }
478
+ instance.ownedPrefetches.clear();
479
+ }
352
480
  function drainVisibleAppPrefetchQueue() {
353
481
  visibleAppPrefetchDrainScheduled = false;
354
482
  while (true) {
@@ -356,7 +484,7 @@ function drainVisibleAppPrefetchQueue() {
356
484
  if (!instance) return;
357
485
  instance.queuedViewportPrefetch = false;
358
486
  if (!instance.isVisible || instance.routerMode !== "app") continue;
359
- prefetchUrl(instance.href, instance.mode, "low", instance.pagesRouteHref);
487
+ prefetchUrl(instance.href, instance.mode, "low", instance.pagesRouteHref, void 0, instance);
360
488
  }
361
489
  }
362
490
  function scheduleVisibleAppPrefetch(instance) {
@@ -375,11 +503,17 @@ function setVisibleLinkPrefetch(instance, isVisible) {
375
503
  if (instance.routerMode === "app") scheduleVisibleAppPrefetch(instance);
376
504
  else prefetchUrl(instance.href, instance.mode, "low", instance.pagesRouteHref, instance.locale);
377
505
  instance.viewportPrefetched = true;
378
- } else visibleLinkPrefetches.delete(instance);
506
+ } else {
507
+ visibleLinkPrefetches.delete(instance);
508
+ releaseOwnedLinkPrefetches(instance);
509
+ }
379
510
  }
511
+ let visibleLinkPingRuntime = null;
380
512
  function registerVisibleLinkPing() {
381
513
  if (typeof window === "undefined") return;
382
- registerNavigationRuntimeFunctions({ pingVisibleLinks: pingVisibleLinkPrefetches });
514
+ const functions = visibleLinkPingRuntime?.functions;
515
+ if (visibleLinkPingRuntime !== null && Reflect.get(window, NAVIGATION_RUNTIME_KEY) === visibleLinkPingRuntime && typeof functions === "object" && functions !== null && Reflect.get(functions, "pingVisibleLinks") === pingVisibleLinkPrefetches) return;
516
+ visibleLinkPingRuntime = registerNavigationRuntimeFunctions({ pingVisibleLinks: pingVisibleLinkPrefetches });
383
517
  }
384
518
  function pingVisibleLinkPrefetches() {
385
519
  for (const instance of visibleLinkPrefetches) if (instance.isVisible && instance.routerMode === "app") scheduleVisibleAppPrefetch(instance);
@@ -401,11 +535,14 @@ function getDefaultLocale() {
401
535
  return getI18nContext()?.defaultLocale;
402
536
  }
403
537
  function getCurrentLocale() {
404
- if (typeof window !== "undefined") return getCurrentBrowserLocale({
405
- basePath: __basePath,
406
- domainLocales: getDomainLocales(),
407
- hostname: getCurrentHostname()
408
- });
538
+ if (typeof window !== "undefined") {
539
+ const domainLocales = getDomainLocales();
540
+ return getCurrentBrowserLocale({
541
+ basePath: __basePath,
542
+ domainLocales,
543
+ hostname: domainLocales?.length ? getCurrentHostname() : void 0
544
+ });
545
+ }
409
546
  return getI18nContext()?.locale;
410
547
  }
411
548
  function getDomainLocales() {
@@ -459,19 +596,17 @@ function resolveConcreteRouteHref(href, as) {
459
596
  if (typeof as !== "string") return null;
460
597
  return interpolateDynamicRouteHref(href, as)?.href || null;
461
598
  }
462
- const Link = forwardRef(function Link({ href, as, replace = false, prefetch: prefetchProp, scroll = true, shallow = false, children: childrenProp, onClick, onMouseEnter, onTouchStart, onNavigate, unstable_dynamicOnHover = false, legacyBehavior = false, passHref = false, transitionTypes: _transitionTypes, ...rest }, forwardedRef) {
599
+ const Link = forwardRef(function Link({ href, as, replace = false, prefetch: prefetchProp, scroll = true, shallow = false, children: childrenProp, onClick, onMouseEnter, onTouchStart, onNavigate, unstable_dynamicOnHover = false, legacyBehavior = false, passHref = false, transitionTypes: _transitionTypes, locale, ...anchorProps }, forwardedRef) {
463
600
  const pagesRouter = useContext(RouterContext);
464
- const routePathnameForWarning = getCurrentRoutePathnameForWarning();
465
- const hrefStr = resolvePagesLinkValue(href, pagesRouter, routePathnameForWarning);
466
- const asHref = as === void 0 ? void 0 : resolvePagesLinkValue(as, pagesRouter, routePathnameForWarning);
467
- const { locale, ...restWithoutLocale } = rest;
601
+ const hrefStr = resolvePagesLinkValue(href, pagesRouter);
602
+ const asHref = as === void 0 ? void 0 : resolvePagesLinkValue(as, pagesRouter);
468
603
  let children = childrenProp;
469
604
  if (legacyBehavior && (typeof childrenProp === "string" || typeof childrenProp === "number")) children = React.createElement("a", null, childrenProp);
470
605
  const hrefForImplicitInterpolation = isAbsoluteOrProtocolRelativeUrl(hrefStr) ? hrefStr.startsWith("//") ? null : toSameOriginAppPath(hrefStr, __basePath) : hrefStr;
471
606
  const implicitDynamicRouteHref = HAS_PAGES_ROUTER && pagesRouter !== null && asHref === void 0 && hrefForImplicitInterpolation !== null ? resolveDynamicRouteHref(hrefForImplicitInterpolation) : null;
472
607
  const pagesAsHref = asHref ?? implicitDynamicRouteHref?.as;
473
608
  const unresolvedHref = pagesAsHref ?? hrefStr;
474
- const resolvedHref = unresolvedHref.startsWith("#") && !getNavigationRuntime()?.functions.navigate ? resolvePagesQueryOnlyHref(unresolvedHref) : unresolvedHref;
609
+ const resolvedHref = unresolvedHref.startsWith("#") && !hasLinkAppNavigationRuntime() ? resolvePagesQueryOnlyHref(unresolvedHref) : unresolvedHref;
475
610
  const concreteRouteHref = HAS_PAGES_ROUTER ? resolveConcreteRouteHref(hrefForImplicitInterpolation ?? hrefStr, pagesAsHref) : null;
476
611
  const routeHrefRaw = hrefStr;
477
612
  const prefetchRouteHrefRaw = concreteRouteHref ?? routeHrefRaw;
@@ -483,6 +618,14 @@ const Link = forwardRef(function Link({ href, as, replace = false, prefetch: pre
483
618
  const normalizedHref = normalizePathTrailingSlash(localizedHref, __trailingSlash);
484
619
  const normalizedRouteHref = hasPagesHrefAsPair ? normalizePathTrailingSlash(applyLocaleToHref(isRouteDangerous ? "/" : prefetchRouteHrefRaw, locale), __trailingSlash) : normalizedHref;
485
620
  const fullHref = normalizePathTrailingSlash(withBasePath(normalizedHref, __basePath), __trailingSlash);
621
+ if (isServer && !legacyBehavior && !isDangerous) return /* @__PURE__ */ jsx(LinkStatusContext.Provider, {
622
+ value: { pending: false },
623
+ children: /* @__PURE__ */ jsx("a", {
624
+ href: fullHref,
625
+ ...anchorProps,
626
+ children
627
+ })
628
+ });
486
629
  const [pending, setPending] = useState(false);
487
630
  const mountedRef = useRef(true);
488
631
  const pendingPagesIntentPrefetchRef = useRef(null);
@@ -514,15 +657,15 @@ const Link = forwardRef(function Link({ href, as, replace = false, prefetch: pre
514
657
  if (typeof forwardedRef === "function") forwardedRef(node);
515
658
  else if (forwardedRef) forwardedRef.current = node;
516
659
  }, [forwardedRef]);
517
- useEffect(() => {
660
+ useLayoutEffect(() => {
518
661
  if (!shouldViewportPrefetch || typeof window === "undefined") return;
519
662
  const node = internalRef.current;
520
663
  if (!node) return;
521
- const hrefToPrefetch = getLinkPrefetchHref({
664
+ const hrefToPrefetch = isAbsoluteOrProtocolRelativeUrl(normalizedHref) ? getLinkPrefetchHref({
522
665
  href: normalizedHref,
523
666
  basePath: __basePath,
524
667
  currentOrigin: window.location.origin
525
- });
668
+ }) : normalizedHref;
526
669
  if (hrefToPrefetch == null) return;
527
670
  const observer = getSharedObserver();
528
671
  if (!observer) return;
@@ -532,6 +675,8 @@ const Link = forwardRef(function Link({ href, as, replace = false, prefetch: pre
532
675
  isVisible: false,
533
676
  locale,
534
677
  mode: prefetchMode,
678
+ ownedPrefetches: /* @__PURE__ */ new Set(),
679
+ leaveCount: 0,
535
680
  pagesRouteHref: normalizedRouteHref === normalizedHref ? void 0 : getLinkPrefetchHref({
536
681
  href: normalizedRouteHref,
537
682
  basePath: __basePath,
@@ -548,6 +693,7 @@ const Link = forwardRef(function Link({ href, as, replace = false, prefetch: pre
548
693
  observedLinkPrefetches.delete(node);
549
694
  visibleLinkPrefetches.delete(instance);
550
695
  instance.isVisible = false;
696
+ releaseOwnedLinkPrefetches(instance);
551
697
  };
552
698
  }, [
553
699
  shouldViewportPrefetch,
@@ -623,7 +769,7 @@ const Link = forwardRef(function Link({ href, as, replace = false, prefetch: pre
623
769
  navigateHref = localPath;
624
770
  }
625
771
  e.preventDefault();
626
- const hasAppNavigationRuntime = Boolean(getNavigationRuntime()?.functions.navigate);
772
+ const hasAppNavigationRuntime = hasLinkAppNavigationRuntime();
627
773
  const pagesNavigateHref = HAS_PAGES_ROUTER && resolvedHref.startsWith("?") ? resolvePagesLinkNavigationHref(resolvedHref, locale) : navigateHref;
628
774
  const pagesAsForLink = hasPagesHrefAsPair ? pagesNavigateHref : void 0;
629
775
  const pagesHrefForLink = pagesAsForLink === void 0 ? pagesNavigateHref : routeHrefRaw;
@@ -681,7 +827,6 @@ const Link = forwardRef(function Link({ href, as, replace = false, prefetch: pre
681
827
  } else if (replace) window.location.replace(absoluteFullHref);
682
828
  else window.location.assign(absoluteFullHref);
683
829
  };
684
- const anchorProps = restWithoutLocale;
685
830
  const linkStatusValue = React.useMemo(() => ({ pending }), [pending]);
686
831
  if (isDangerous) {
687
832
  if (process.env.NODE_ENV !== "production") console.warn(`<Link> blocked dangerous href: ${resolvedHref}`);
@@ -21,12 +21,13 @@ export declare function mergeViewport(viewportList: readonly Viewport[]): Resolv
21
21
  export declare function ViewportHead({ viewport }: {
22
22
  viewport: Viewport;
23
23
  }): React.JSX.Element;
24
+ type MetadataTitle = string | {
25
+ default?: string;
26
+ template?: string | null;
27
+ absolute?: string;
28
+ };
24
29
  export type Metadata = {
25
- title?: string | {
26
- default?: string;
27
- template?: string;
28
- absolute?: string;
29
- };
30
+ title?: MetadataTitle;
30
31
  description?: string;
31
32
  generator?: string;
32
33
  applicationName?: string;
@@ -52,37 +53,35 @@ export type Metadata = {
52
53
  [key: string]: unknown;
53
54
  };
54
55
  openGraph?: {
55
- title?: string;
56
+ title?: MetadataTitle;
56
57
  description?: string;
57
58
  url?: string | URL;
58
59
  siteName?: string;
59
60
  images?: string | URL | SocialImageDescriptor | Array<string | URL | SocialImageDescriptor>;
60
- videos?: Array<{
61
- url: string | URL;
62
- width?: number;
63
- height?: number;
64
- }>;
65
- audio?: Array<{
66
- url: string | URL;
67
- }>;
61
+ videos?: OGVideo | OGVideo[];
62
+ audio?: OGAudio | OGAudio[];
63
+ emails?: string | string[];
64
+ phoneNumbers?: string | string[];
65
+ faxNumbers?: string | string[];
68
66
  locale?: string;
67
+ alternateLocale?: string | string[];
69
68
  type?: string;
70
69
  publishedTime?: string;
71
70
  modifiedTime?: string;
72
71
  authors?: string[];
73
- };
72
+ } | null;
74
73
  twitter?: {
75
74
  card?: string;
76
75
  site?: string;
77
76
  siteId?: string;
78
- title?: string;
77
+ title?: MetadataTitle;
79
78
  description?: string;
80
79
  images?: string | URL | SocialImageDescriptor | Array<string | URL | SocialImageDescriptor>;
81
80
  creator?: string;
82
81
  creatorId?: string;
83
82
  players?: TwitterPlayerDescriptor | TwitterPlayerDescriptor[];
84
83
  app?: TwitterAppDescriptor;
85
- };
84
+ } | null;
86
85
  icons?: IconsMetadata;
87
86
  manifest?: string | URL;
88
87
  alternates?: {
@@ -169,6 +168,20 @@ type TwitterAppDescriptor = {
169
168
  };
170
169
  name?: string;
171
170
  };
171
+ type OGVideoDescriptor = {
172
+ url: string | URL;
173
+ secureUrl?: string | URL;
174
+ type?: string;
175
+ width?: string | number;
176
+ height?: string | number;
177
+ };
178
+ type OGVideo = string | URL | OGVideoDescriptor;
179
+ type OGAudioDescriptor = {
180
+ url: string | URL;
181
+ secureUrl?: string | URL;
182
+ type?: string;
183
+ };
184
+ type OGAudio = string | URL | OGAudioDescriptor;
172
185
  type SocialImageDescriptor = {
173
186
  url: string | URL;
174
187
  alt?: string;
@@ -194,18 +207,15 @@ type IconsMap = {
194
207
  };
195
208
  type IconsMetadata = IconInput | IconInput[] | IconsMap;
196
209
  export type MetadataMergeEntry = {
197
- contributesTitle?: boolean;
210
+ /** Passes on the title template it received rather than its own. */
198
211
  isPage?: boolean;
199
212
  metadata: Metadata;
200
213
  };
201
214
  /**
202
215
  * Merge metadata from multiple sources (layouts + page).
203
216
  *
204
- * The list is ordered [rootLayout, nestedLayout, ..., page].
205
- * Title template from layouts applies to the page title but NOT to
206
- * the segment that defines the template itself. `title.absolute`
207
- * skips all templates. `title.default` is the fallback when no
208
- * child provides a title.
217
+ * The list is ordered [rootLayout, nestedLayout, ..., page], with titles
218
+ * resolved as {@link mergeMetadataEntries} does.
209
219
  *
210
220
  * Shallow merge: later entries override earlier ones (per Next.js docs).
211
221
  */
@@ -226,16 +236,28 @@ export declare function postProcessMetadata(merged: Metadata): Metadata;
226
236
  /**
227
237
  * Merge metadata from multiple sources (layouts + page).
228
238
  *
229
- * The list is ordered [rootLayout, nestedLayout, ..., page].
230
- * Title template from layouts applies to the page title but NOT to
231
- * the segment that defines the template itself. `title.absolute`
232
- * skips all templates. `title.default` is the fallback when no
233
- * child provides a title.
239
+ * The list is ordered [rootLayout, nestedLayout, ..., page]. Like Next.js's
240
+ * accumulateMetadata, each title resolves with the template of the title
241
+ * before it: a `title.template` wraps later titles, not its own entry's
242
+ * `title.default`, and a plain-string title, or one without a template,
243
+ * clears it. An `isPage` entry passes on the template it received.
244
+ * `title.absolute` skips all templates.
234
245
  *
235
246
  * For top-level keys, later entries override earlier ones. `other` custom meta
236
247
  * tags are the exception: Next.js merges those across segments.
248
+ * https://github.com/vercel/next.js/blob/canary/packages/next/src/lib/metadata/resolve-metadata.ts (accumulateMetadata)
237
249
  */
238
250
  export declare function mergeMetadataEntries(entries: readonly MetadataMergeEntry[]): Metadata;
251
+ /**
252
+ * Merge metadata into the `parent` a later segment's resolver receives. Like
253
+ * {@link mergeMetadataEntries}, except the title stays resolved as Next.js's
254
+ * `{ absolute, template }`, so `(await parent).title?.absolute` reads the
255
+ * title so far. `template` is the last title's own, the one the next title
256
+ * gets, so merging this parent with later entries resolves their titles as
257
+ * the full merge does.
258
+ * https://github.com/vercel/next.js/blob/canary/packages/next/src/lib/metadata/resolvers/resolve-title.ts
259
+ */
260
+ export declare function mergeParentMetadataEntries(entries: readonly MetadataMergeEntry[]): Metadata;
239
261
  /**
240
262
  * Resolve metadata from a module. Handles both static `metadata` export
241
263
  * and async `generateMetadata()` function.
@@ -258,4 +280,5 @@ export declare function renderMetadataToHtml(metadata: Metadata, pathname?: stri
258
280
  streamedIconKey?: string;
259
281
  }): string;
260
282
  export declare function MetadataHead({ metadata, pathname, trailingSlash, streamedIconKey }: MetadataHeadProps): React.JSX.Element;
261
- //#endregion
283
+ //#endregion
284
+ export {};