vinext 0.0.50 → 0.0.52

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 (462) hide show
  1. package/dist/build/google-fonts/fallback-metrics-data.js +14031 -0
  2. package/dist/build/google-fonts/fallback-metrics-data.js.map +1 -0
  3. package/dist/build/google-fonts/fallback-metrics.d.ts +13 -0
  4. package/dist/build/google-fonts/fallback-metrics.js +46 -0
  5. package/dist/build/google-fonts/fallback-metrics.js.map +1 -0
  6. package/dist/build/precompress.d.ts +13 -2
  7. package/dist/build/precompress.js +23 -13
  8. package/dist/build/precompress.js.map +1 -1
  9. package/dist/build/prerender.d.ts +4 -15
  10. package/dist/build/prerender.js +83 -53
  11. package/dist/build/prerender.js.map +1 -1
  12. package/dist/build/report.d.ts +5 -4
  13. package/dist/build/report.js +196 -348
  14. package/dist/build/report.js.map +1 -1
  15. package/dist/check.js +5 -0
  16. package/dist/check.js.map +1 -1
  17. package/dist/cli-args.d.ts +1 -0
  18. package/dist/cli-args.js +5 -0
  19. package/dist/cli-args.js.map +1 -1
  20. package/dist/cli.js +99 -3
  21. package/dist/cli.js.map +1 -1
  22. package/dist/client/navigation-runtime.d.ts +47 -0
  23. package/dist/client/navigation-runtime.js +156 -0
  24. package/dist/client/navigation-runtime.js.map +1 -0
  25. package/dist/client/pages-router-link-navigation.d.ts +26 -0
  26. package/dist/client/pages-router-link-navigation.js +14 -0
  27. package/dist/client/pages-router-link-navigation.js.map +1 -0
  28. package/dist/client/vinext-next-data.d.ts +12 -2
  29. package/dist/client/vinext-next-data.js +50 -1
  30. package/dist/client/vinext-next-data.js.map +1 -0
  31. package/dist/client/window-next.d.ts +3 -1
  32. package/dist/client/window-next.js.map +1 -1
  33. package/dist/cloudflare/kv-cache-handler.js +2 -1
  34. package/dist/cloudflare/kv-cache-handler.js.map +1 -1
  35. package/dist/config/config-matchers.d.ts +63 -16
  36. package/dist/config/config-matchers.js +143 -8
  37. package/dist/config/config-matchers.js.map +1 -1
  38. package/dist/config/dotenv.d.ts +11 -1
  39. package/dist/config/dotenv.js.map +1 -1
  40. package/dist/config/next-config.d.ts +107 -5
  41. package/dist/config/next-config.js +233 -7
  42. package/dist/config/next-config.js.map +1 -1
  43. package/dist/config/tsconfig-paths.d.ts +13 -0
  44. package/dist/config/tsconfig-paths.js +117 -0
  45. package/dist/config/tsconfig-paths.js.map +1 -0
  46. package/dist/deploy.js +104 -41
  47. package/dist/deploy.js.map +1 -1
  48. package/dist/entries/app-browser-entry.d.ts +2 -2
  49. package/dist/entries/app-browser-entry.js +34 -3
  50. package/dist/entries/app-browser-entry.js.map +1 -1
  51. package/dist/entries/app-rsc-entry.d.ts +19 -1
  52. package/dist/entries/app-rsc-entry.js +89 -23
  53. package/dist/entries/app-rsc-entry.js.map +1 -1
  54. package/dist/entries/app-rsc-manifest.d.ts +10 -0
  55. package/dist/entries/app-rsc-manifest.js +57 -7
  56. package/dist/entries/app-rsc-manifest.js.map +1 -1
  57. package/dist/entries/app-ssr-entry.d.ts +3 -3
  58. package/dist/entries/app-ssr-entry.js +4 -4
  59. package/dist/entries/app-ssr-entry.js.map +1 -1
  60. package/dist/entries/pages-client-entry.js +21 -7
  61. package/dist/entries/pages-client-entry.js.map +1 -1
  62. package/dist/entries/pages-server-entry.js +77 -9
  63. package/dist/entries/pages-server-entry.js.map +1 -1
  64. package/dist/entries/runtime-entry-module.d.ts +2 -1
  65. package/dist/entries/runtime-entry-module.js +9 -3
  66. package/dist/entries/runtime-entry-module.js.map +1 -1
  67. package/dist/index.js +260 -75
  68. package/dist/index.js.map +1 -1
  69. package/dist/plugins/client-reference-dedup.d.ts +15 -2
  70. package/dist/plugins/client-reference-dedup.js +138 -16
  71. package/dist/plugins/client-reference-dedup.js.map +1 -1
  72. package/dist/plugins/css-data-url.d.ts +7 -0
  73. package/dist/plugins/css-data-url.js +81 -0
  74. package/dist/plugins/css-data-url.js.map +1 -0
  75. package/dist/plugins/fonts.d.ts +2 -2
  76. package/dist/plugins/fonts.js +20 -9
  77. package/dist/plugins/fonts.js.map +1 -1
  78. package/dist/plugins/middleware-server-only.d.ts +54 -0
  79. package/dist/plugins/middleware-server-only.js +91 -0
  80. package/dist/plugins/middleware-server-only.js.map +1 -0
  81. package/dist/plugins/optimize-imports.js +4 -4
  82. package/dist/plugins/optimize-imports.js.map +1 -1
  83. package/dist/plugins/sass.d.ts +34 -0
  84. package/dist/plugins/sass.js +22 -0
  85. package/dist/plugins/sass.js.map +1 -0
  86. package/dist/plugins/strip-server-exports.js +5 -8
  87. package/dist/plugins/strip-server-exports.js.map +1 -1
  88. package/dist/routing/app-route-graph.d.ts +50 -2
  89. package/dist/routing/app-route-graph.js +140 -16
  90. package/dist/routing/app-route-graph.js.map +1 -1
  91. package/dist/routing/app-router.d.ts +2 -2
  92. package/dist/routing/app-router.js +2 -2
  93. package/dist/routing/app-router.js.map +1 -1
  94. package/dist/routing/route-pattern.d.ts +56 -1
  95. package/dist/routing/route-pattern.js +60 -1
  96. package/dist/routing/route-pattern.js.map +1 -1
  97. package/dist/routing/utils.d.ts +2 -1
  98. package/dist/routing/utils.js +4 -1
  99. package/dist/routing/utils.js.map +1 -1
  100. package/dist/server/api-handler.js +139 -37
  101. package/dist/server/api-handler.js.map +1 -1
  102. package/dist/server/app-browser-action-result.d.ts +27 -2
  103. package/dist/server/app-browser-action-result.js +63 -2
  104. package/dist/server/app-browser-action-result.js.map +1 -1
  105. package/dist/server/app-browser-entry.js +493 -195
  106. package/dist/server/app-browser-entry.js.map +1 -1
  107. package/dist/server/app-browser-hydration.d.ts +13 -1
  108. package/dist/server/app-browser-hydration.js +9 -1
  109. package/dist/server/app-browser-hydration.js.map +1 -1
  110. package/dist/server/app-browser-interception-context.d.ts +24 -0
  111. package/dist/server/app-browser-interception-context.js +32 -0
  112. package/dist/server/app-browser-interception-context.js.map +1 -0
  113. package/dist/server/app-browser-navigation-controller.d.ts +17 -2
  114. package/dist/server/app-browser-navigation-controller.js +33 -10
  115. package/dist/server/app-browser-navigation-controller.js.map +1 -1
  116. package/dist/server/app-browser-popstate.d.ts +16 -0
  117. package/dist/server/app-browser-popstate.js +17 -0
  118. package/dist/server/app-browser-popstate.js.map +1 -0
  119. package/dist/server/app-browser-rsc-redirect.d.ts +29 -0
  120. package/dist/server/app-browser-rsc-redirect.js +37 -0
  121. package/dist/server/app-browser-rsc-redirect.js.map +1 -0
  122. package/dist/server/app-browser-state.d.ts +28 -7
  123. package/dist/server/app-browser-state.js +63 -27
  124. package/dist/server/app-browser-state.js.map +1 -1
  125. package/dist/server/app-browser-stream.d.ts +9 -17
  126. package/dist/server/app-browser-stream.js +18 -13
  127. package/dist/server/app-browser-stream.js.map +1 -1
  128. package/dist/server/app-browser-visible-commit.d.ts +7 -1
  129. package/dist/server/app-browser-visible-commit.js +39 -5
  130. package/dist/server/app-browser-visible-commit.js.map +1 -1
  131. package/dist/server/app-elements-wire.d.ts +43 -6
  132. package/dist/server/app-elements-wire.js +189 -7
  133. package/dist/server/app-elements-wire.js.map +1 -1
  134. package/dist/server/app-elements.d.ts +3 -2
  135. package/dist/server/app-elements.js +3 -2
  136. package/dist/server/app-elements.js.map +1 -1
  137. package/dist/server/app-fallback-renderer.d.ts +10 -1
  138. package/dist/server/app-fallback-renderer.js +41 -3
  139. package/dist/server/app-fallback-renderer.js.map +1 -1
  140. package/dist/server/app-history-state.d.ts +26 -0
  141. package/dist/server/app-history-state.js +53 -0
  142. package/dist/server/app-history-state.js.map +1 -0
  143. package/dist/server/app-middleware.d.ts +13 -0
  144. package/dist/server/app-middleware.js +3 -1
  145. package/dist/server/app-middleware.js.map +1 -1
  146. package/dist/server/app-optimistic-routing.d.ts +54 -0
  147. package/dist/server/app-optimistic-routing.js +200 -0
  148. package/dist/server/app-optimistic-routing.js.map +1 -0
  149. package/dist/server/app-page-boundary-render.d.ts +10 -1
  150. package/dist/server/app-page-boundary-render.js +13 -6
  151. package/dist/server/app-page-boundary-render.js.map +1 -1
  152. package/dist/server/app-page-boundary.js +3 -2
  153. package/dist/server/app-page-boundary.js.map +1 -1
  154. package/dist/server/app-page-cache.d.ts +26 -1
  155. package/dist/server/app-page-cache.js +86 -14
  156. package/dist/server/app-page-cache.js.map +1 -1
  157. package/dist/server/app-page-dispatch.d.ts +7 -0
  158. package/dist/server/app-page-dispatch.js +96 -12
  159. package/dist/server/app-page-dispatch.js.map +1 -1
  160. package/dist/server/app-page-element-builder.d.ts +7 -0
  161. package/dist/server/app-page-element-builder.js +34 -5
  162. package/dist/server/app-page-element-builder.js.map +1 -1
  163. package/dist/server/app-page-execution.d.ts +28 -1
  164. package/dist/server/app-page-execution.js +91 -7
  165. package/dist/server/app-page-execution.js.map +1 -1
  166. package/dist/server/app-page-head.d.ts +7 -0
  167. package/dist/server/app-page-head.js +23 -3
  168. package/dist/server/app-page-head.js.map +1 -1
  169. package/dist/server/app-page-probe.d.ts +23 -1
  170. package/dist/server/app-page-probe.js +29 -1
  171. package/dist/server/app-page-probe.js.map +1 -1
  172. package/dist/server/app-page-render-observation.d.ts +35 -0
  173. package/dist/server/app-page-render-observation.js +68 -0
  174. package/dist/server/app-page-render-observation.js.map +1 -0
  175. package/dist/server/app-page-render.d.ts +7 -1
  176. package/dist/server/app-page-render.js +81 -4
  177. package/dist/server/app-page-render.js.map +1 -1
  178. package/dist/server/app-page-request.d.ts +1 -0
  179. package/dist/server/app-page-request.js.map +1 -1
  180. package/dist/server/app-page-response.js +7 -5
  181. package/dist/server/app-page-response.js.map +1 -1
  182. package/dist/server/app-page-route-wiring.d.ts +3 -1
  183. package/dist/server/app-page-route-wiring.js +59 -24
  184. package/dist/server/app-page-route-wiring.js.map +1 -1
  185. package/dist/server/app-page-stream.d.ts +5 -0
  186. package/dist/server/app-page-stream.js +2 -0
  187. package/dist/server/app-page-stream.js.map +1 -1
  188. package/dist/server/app-prerender-static-params.d.ts +2 -1
  189. package/dist/server/app-prerender-static-params.js +44 -8
  190. package/dist/server/app-prerender-static-params.js.map +1 -1
  191. package/dist/server/app-route-handler-cache.d.ts +2 -2
  192. package/dist/server/app-route-handler-cache.js +3 -2
  193. package/dist/server/app-route-handler-cache.js.map +1 -1
  194. package/dist/server/app-route-handler-dispatch.d.ts +6 -1
  195. package/dist/server/app-route-handler-dispatch.js +1 -1
  196. package/dist/server/app-route-handler-dispatch.js.map +1 -1
  197. package/dist/server/app-route-handler-execution.d.ts +17 -2
  198. package/dist/server/app-route-handler-execution.js.map +1 -1
  199. package/dist/server/app-route-handler-response.js +5 -4
  200. package/dist/server/app-route-handler-response.js.map +1 -1
  201. package/dist/server/app-router-entry.js +7 -15
  202. package/dist/server/app-router-entry.js.map +1 -1
  203. package/dist/server/app-rsc-cache-busting.d.ts +19 -1
  204. package/dist/server/app-rsc-cache-busting.js +36 -1
  205. package/dist/server/app-rsc-cache-busting.js.map +1 -1
  206. package/dist/server/app-rsc-embedded-chunks.d.ts +9 -0
  207. package/dist/server/app-rsc-embedded-chunks.js +34 -0
  208. package/dist/server/app-rsc-embedded-chunks.js.map +1 -0
  209. package/dist/server/app-rsc-errors.d.ts +4 -1
  210. package/dist/server/app-rsc-errors.js +1 -1
  211. package/dist/server/app-rsc-errors.js.map +1 -1
  212. package/dist/server/app-rsc-handler.d.ts +21 -5
  213. package/dist/server/app-rsc-handler.js +38 -15
  214. package/dist/server/app-rsc-handler.js.map +1 -1
  215. package/dist/server/app-rsc-render-mode.d.ts +4 -3
  216. package/dist/server/app-rsc-render-mode.js +7 -1
  217. package/dist/server/app-rsc-render-mode.js.map +1 -1
  218. package/dist/server/app-rsc-request-normalization.d.ts +4 -1
  219. package/dist/server/app-rsc-request-normalization.js +4 -1
  220. package/dist/server/app-rsc-request-normalization.js.map +1 -1
  221. package/dist/server/app-rsc-response-finalizer.d.ts +8 -1
  222. package/dist/server/app-rsc-response-finalizer.js +10 -3
  223. package/dist/server/app-rsc-response-finalizer.js.map +1 -1
  224. package/dist/server/app-rsc-route-matching.d.ts +23 -0
  225. package/dist/server/app-rsc-route-matching.js +47 -25
  226. package/dist/server/app-rsc-route-matching.js.map +1 -1
  227. package/dist/server/app-server-action-execution.d.ts +35 -3
  228. package/dist/server/app-server-action-execution.js +87 -33
  229. package/dist/server/app-server-action-execution.js.map +1 -1
  230. package/dist/server/app-ssr-entry.d.ts +3 -0
  231. package/dist/server/app-ssr-entry.js +83 -58
  232. package/dist/server/app-ssr-entry.js.map +1 -1
  233. package/dist/server/app-ssr-error-meta.d.ts +14 -0
  234. package/dist/server/app-ssr-error-meta.js +50 -0
  235. package/dist/server/app-ssr-error-meta.js.map +1 -0
  236. package/dist/server/app-ssr-stream.d.ts +7 -2
  237. package/dist/server/app-ssr-stream.js +26 -15
  238. package/dist/server/app-ssr-stream.js.map +1 -1
  239. package/dist/server/artifact-compatibility.d.ts +13 -3
  240. package/dist/server/artifact-compatibility.js +12 -8
  241. package/dist/server/artifact-compatibility.js.map +1 -1
  242. package/dist/server/cache-headers.d.ts +7 -0
  243. package/dist/server/cache-headers.js +19 -0
  244. package/dist/server/cache-headers.js.map +1 -0
  245. package/dist/server/cache-proof.d.ts +170 -5
  246. package/dist/server/cache-proof.js +472 -18
  247. package/dist/server/cache-proof.js.map +1 -1
  248. package/dist/server/client-reuse-manifest.d.ts +99 -0
  249. package/dist/server/client-reuse-manifest.js +212 -0
  250. package/dist/server/client-reuse-manifest.js.map +1 -0
  251. package/dist/server/default-global-error-module.d.ts +20 -0
  252. package/dist/server/default-global-error-module.js +20 -0
  253. package/dist/server/default-global-error-module.js.map +1 -0
  254. package/dist/server/dev-lockfile.d.ts +110 -0
  255. package/dist/server/dev-lockfile.js +180 -0
  256. package/dist/server/dev-lockfile.js.map +1 -0
  257. package/dist/server/dev-server.d.ts +9 -1
  258. package/dist/server/dev-server.js +76 -19
  259. package/dist/server/dev-server.js.map +1 -1
  260. package/dist/server/edge-api-runtime.d.ts +5 -0
  261. package/dist/server/edge-api-runtime.js +8 -0
  262. package/dist/server/edge-api-runtime.js.map +1 -0
  263. package/dist/server/file-based-metadata.d.ts +13 -0
  264. package/dist/server/file-based-metadata.js +49 -2
  265. package/dist/server/file-based-metadata.js.map +1 -1
  266. package/dist/server/headers.d.ts +20 -1
  267. package/dist/server/headers.js +22 -2
  268. package/dist/server/headers.js.map +1 -1
  269. package/dist/server/html.js +1 -1
  270. package/dist/server/html.js.map +1 -1
  271. package/dist/server/http-error-responses.d.ts +26 -1
  272. package/dist/server/http-error-responses.js +32 -2
  273. package/dist/server/http-error-responses.js.map +1 -1
  274. package/dist/server/isr-cache.d.ts +8 -3
  275. package/dist/server/isr-cache.js +24 -6
  276. package/dist/server/isr-cache.js.map +1 -1
  277. package/dist/server/metadata-route-response.js +22 -5
  278. package/dist/server/metadata-route-response.js.map +1 -1
  279. package/dist/server/metadata-routes.js +27 -8
  280. package/dist/server/metadata-routes.js.map +1 -1
  281. package/dist/server/middleware-runtime.d.ts +15 -0
  282. package/dist/server/middleware-runtime.js +60 -7
  283. package/dist/server/middleware-runtime.js.map +1 -1
  284. package/dist/server/middleware.d.ts +13 -1
  285. package/dist/server/middleware.js +16 -2
  286. package/dist/server/middleware.js.map +1 -1
  287. package/dist/server/navigation-planner.d.ts +26 -6
  288. package/dist/server/navigation-planner.js +358 -24
  289. package/dist/server/navigation-planner.js.map +1 -1
  290. package/dist/server/navigation-trace.d.ts +9 -1
  291. package/dist/server/navigation-trace.js +8 -0
  292. package/dist/server/navigation-trace.js.map +1 -1
  293. package/dist/server/normalize-path.d.ts +2 -1
  294. package/dist/server/normalize-path.js +4 -1
  295. package/dist/server/normalize-path.js.map +1 -1
  296. package/dist/server/pages-api-route.d.ts +27 -1
  297. package/dist/server/pages-api-route.js +25 -3
  298. package/dist/server/pages-api-route.js.map +1 -1
  299. package/dist/server/pages-data-route.d.ts +77 -0
  300. package/dist/server/pages-data-route.js +97 -0
  301. package/dist/server/pages-data-route.js.map +1 -0
  302. package/dist/server/pages-i18n.d.ts +51 -1
  303. package/dist/server/pages-i18n.js +61 -1
  304. package/dist/server/pages-i18n.js.map +1 -1
  305. package/dist/server/pages-page-data.d.ts +32 -4
  306. package/dist/server/pages-page-data.js +52 -19
  307. package/dist/server/pages-page-data.js.map +1 -1
  308. package/dist/server/pages-page-response.d.ts +11 -1
  309. package/dist/server/pages-page-response.js +6 -4
  310. package/dist/server/pages-page-response.js.map +1 -1
  311. package/dist/server/prod-server.d.ts +26 -1
  312. package/dist/server/prod-server.js +150 -44
  313. package/dist/server/prod-server.js.map +1 -1
  314. package/dist/server/request-pipeline.d.ts +11 -2
  315. package/dist/server/request-pipeline.js +28 -11
  316. package/dist/server/request-pipeline.js.map +1 -1
  317. package/dist/server/seed-cache.d.ts +12 -31
  318. package/dist/server/seed-cache.js +22 -35
  319. package/dist/server/seed-cache.js.map +1 -1
  320. package/dist/server/server-action-not-found.d.ts +16 -3
  321. package/dist/server/server-action-not-found.js +27 -4
  322. package/dist/server/server-action-not-found.js.map +1 -1
  323. package/dist/server/server-globals.d.ts +5 -0
  324. package/dist/server/server-globals.js +37 -0
  325. package/dist/server/server-globals.js.map +1 -0
  326. package/dist/server/skip-cache-proof.d.ts +41 -0
  327. package/dist/server/skip-cache-proof.js +101 -0
  328. package/dist/server/skip-cache-proof.js.map +1 -0
  329. package/dist/server/static-file-cache.d.ts +1 -1
  330. package/dist/server/static-file-cache.js +7 -6
  331. package/dist/server/static-file-cache.js.map +1 -1
  332. package/dist/shims/cache-runtime.d.ts +19 -2
  333. package/dist/shims/cache-runtime.js +67 -11
  334. package/dist/shims/cache-runtime.js.map +1 -1
  335. package/dist/shims/cache.d.ts +5 -18
  336. package/dist/shims/cache.js +2 -0
  337. package/dist/shims/cache.js.map +1 -1
  338. package/dist/shims/client-locale.d.ts +15 -0
  339. package/dist/shims/client-locale.js +13 -0
  340. package/dist/shims/client-locale.js.map +1 -0
  341. package/dist/shims/default-global-error.d.ts +32 -0
  342. package/dist/shims/default-global-error.js +181 -0
  343. package/dist/shims/default-global-error.js.map +1 -0
  344. package/dist/shims/document.d.ts +59 -3
  345. package/dist/shims/document.js +36 -5
  346. package/dist/shims/document.js.map +1 -1
  347. package/dist/shims/error-boundary.d.ts +2 -2
  348. package/dist/shims/error-boundary.js +6 -8
  349. package/dist/shims/error-boundary.js.map +1 -1
  350. package/dist/shims/error.d.ts +18 -1
  351. package/dist/shims/error.js +56 -1
  352. package/dist/shims/error.js.map +1 -1
  353. package/dist/shims/fetch-cache.d.ts +4 -1
  354. package/dist/shims/fetch-cache.js +40 -5
  355. package/dist/shims/fetch-cache.js.map +1 -1
  356. package/dist/shims/font-google-base.d.ts +22 -8
  357. package/dist/shims/font-google-base.js +41 -71
  358. package/dist/shims/font-google-base.js.map +1 -1
  359. package/dist/shims/font-local.d.ts +3 -20
  360. package/dist/shims/font-local.js +23 -75
  361. package/dist/shims/font-local.js.map +1 -1
  362. package/dist/shims/font-utils.d.ts +51 -0
  363. package/dist/shims/font-utils.js +97 -0
  364. package/dist/shims/font-utils.js.map +1 -0
  365. package/dist/shims/form.js +13 -6
  366. package/dist/shims/form.js.map +1 -1
  367. package/dist/shims/hash-scroll.d.ts +7 -0
  368. package/dist/shims/hash-scroll.js +30 -0
  369. package/dist/shims/hash-scroll.js.map +1 -0
  370. package/dist/shims/headers.d.ts +8 -11
  371. package/dist/shims/headers.js +22 -2
  372. package/dist/shims/headers.js.map +1 -1
  373. package/dist/shims/image.d.ts +1 -0
  374. package/dist/shims/image.js +144 -78
  375. package/dist/shims/image.js.map +1 -1
  376. package/dist/shims/internal/app-router-context.d.ts +6 -6
  377. package/dist/shims/internal/app-router-context.js +17 -6
  378. package/dist/shims/internal/app-router-context.js.map +1 -1
  379. package/dist/shims/link-prefetch.d.ts +9 -1
  380. package/dist/shims/link-prefetch.js +11 -6
  381. package/dist/shims/link-prefetch.js.map +1 -1
  382. package/dist/shims/link.d.ts +33 -5
  383. package/dist/shims/link.js +205 -50
  384. package/dist/shims/link.js.map +1 -1
  385. package/dist/shims/metadata.d.ts +16 -30
  386. package/dist/shims/metadata.js +91 -32
  387. package/dist/shims/metadata.js.map +1 -1
  388. package/dist/shims/navigation.d.ts +164 -17
  389. package/dist/shims/navigation.js +355 -84
  390. package/dist/shims/navigation.js.map +1 -1
  391. package/dist/shims/navigation.react-server.d.ts +3 -2
  392. package/dist/shims/navigation.react-server.js +5 -2
  393. package/dist/shims/navigation.react-server.js.map +1 -1
  394. package/dist/shims/og.d.ts +18 -2
  395. package/dist/shims/og.js +49 -1
  396. package/dist/shims/og.js.map +1 -0
  397. package/dist/shims/pages-router-runtime.d.ts +7 -0
  398. package/dist/shims/pages-router-runtime.js +16 -0
  399. package/dist/shims/pages-router-runtime.js.map +1 -0
  400. package/dist/shims/request-state-types.d.ts +1 -1
  401. package/dist/shims/root-params.d.ts +3 -1
  402. package/dist/shims/root-params.js +11 -3
  403. package/dist/shims/root-params.js.map +1 -1
  404. package/dist/shims/router-state.d.ts +1 -0
  405. package/dist/shims/router-state.js.map +1 -1
  406. package/dist/shims/router.d.ts +40 -7
  407. package/dist/shims/router.js +355 -250
  408. package/dist/shims/router.js.map +1 -1
  409. package/dist/shims/script.js +110 -32
  410. package/dist/shims/script.js.map +1 -1
  411. package/dist/shims/server.d.ts +21 -4
  412. package/dist/shims/server.js +31 -10
  413. package/dist/shims/server.js.map +1 -1
  414. package/dist/shims/slot.d.ts +1 -0
  415. package/dist/shims/slot.js +45 -1
  416. package/dist/shims/slot.js.map +1 -1
  417. package/dist/shims/unified-request-context.d.ts +1 -1
  418. package/dist/shims/unified-request-context.js +2 -0
  419. package/dist/shims/unified-request-context.js.map +1 -1
  420. package/dist/shims/unrecognized-action-error.d.ts +35 -0
  421. package/dist/shims/unrecognized-action-error.js +41 -0
  422. package/dist/shims/unrecognized-action-error.js.map +1 -0
  423. package/dist/shims/url-safety.d.ts +23 -1
  424. package/dist/shims/url-safety.js +29 -2
  425. package/dist/shims/url-safety.js.map +1 -1
  426. package/dist/shims/url-utils.d.ts +21 -1
  427. package/dist/shims/url-utils.js +67 -3
  428. package/dist/shims/url-utils.js.map +1 -1
  429. package/dist/typegen.d.ts +10 -0
  430. package/dist/typegen.js +242 -0
  431. package/dist/typegen.js.map +1 -0
  432. package/dist/utils/asset-prefix.d.ts +97 -0
  433. package/dist/utils/asset-prefix.js +124 -0
  434. package/dist/utils/asset-prefix.js.map +1 -0
  435. package/dist/utils/base-path.d.ts +7 -1
  436. package/dist/utils/base-path.js +10 -1
  437. package/dist/utils/base-path.js.map +1 -1
  438. package/dist/utils/cache-control-metadata.d.ts +2 -1
  439. package/dist/utils/cache-control-metadata.js +1 -3
  440. package/dist/utils/cache-control-metadata.js.map +1 -1
  441. package/dist/utils/domain-locale.d.ts +2 -1
  442. package/dist/utils/domain-locale.js +9 -1
  443. package/dist/utils/domain-locale.js.map +1 -1
  444. package/dist/utils/lazy-chunks.d.ts +1 -1
  445. package/dist/utils/lazy-chunks.js +1 -1
  446. package/dist/utils/lazy-chunks.js.map +1 -1
  447. package/dist/utils/navigation-signal.d.ts +1 -2
  448. package/dist/utils/navigation-signal.js +1 -1
  449. package/dist/utils/navigation-signal.js.map +1 -1
  450. package/dist/utils/prerender-output-paths.d.ts +15 -0
  451. package/dist/utils/prerender-output-paths.js +24 -0
  452. package/dist/utils/prerender-output-paths.js.map +1 -0
  453. package/dist/utils/query.d.ts +17 -1
  454. package/dist/utils/query.js +36 -1
  455. package/dist/utils/query.js.map +1 -1
  456. package/dist/utils/record.d.ts +5 -0
  457. package/dist/utils/record.js +8 -0
  458. package/dist/utils/record.js.map +1 -0
  459. package/dist/utils/sorted-array.d.ts +9 -0
  460. package/dist/utils/sorted-array.js +22 -0
  461. package/dist/utils/sorted-array.js.map +1 -0
  462. package/package.json +13 -5
@@ -2,16 +2,20 @@
2
2
  import { stripBasePath } from "../utils/base-path.js";
3
3
  import { createRouteTrieCache, matchRouteWithTrie } from "../routing/route-matching.js";
4
4
  import { VINEXT_MOUNTED_SLOTS_HEADER } from "../server/headers.js";
5
- import { isDangerousScheme } from "./url-safety.js";
6
- import { resolveRelativeHref, toBrowserNavigationHref, toSameOriginAppPath, withBasePath } from "./url-utils.js";
7
- import { addLocalePrefix, getDomainLocaleUrl } from "../utils/domain-locale.js";
5
+ import { isDangerousScheme, reportBlockedDangerousNavigation } from "./url-safety.js";
8
6
  import { appendSearchParamsToUrl, urlQueryToSearchParams } from "../utils/query.js";
7
+ import { APP_RSC_RENDER_MODE_PREFETCH_LOADING_SHELL } from "../server/app-rsc-render-mode.js";
8
+ import { isAbsoluteOrProtocolRelativeUrl, normalizePathTrailingSlash, resolveRelativeHref, toBrowserNavigationHref, toSameOriginAppPath, withBasePath } from "./url-utils.js";
9
+ import { addLocalePrefix, getDomainLocaleUrl } from "../utils/domain-locale.js";
10
+ import { getCurrentBrowserLocale } from "./client-locale.js";
11
+ import { getNavigationRuntime, hasAppNavigationRuntime, registerNavigationRuntimeFunctions } from "../client/navigation-runtime.js";
9
12
  import { AppElementsWire } from "../server/app-elements-wire.js";
10
13
  import "../server/app-elements.js";
11
- import { createRscRequestHeaders, createRscRequestUrl } from "../server/app-rsc-cache-busting.js";
12
- import { getCurrentInterceptionContext, getMountedSlotsHeader, getPrefetchedUrls, navigateClientSide, prefetchRscResponse } from "./navigation.js";
14
+ import { createRscRequestHeaders, createRscRequestUrl, stripRscCacheBustingSearchParam, stripRscSuffix } from "../server/app-rsc-cache-busting.js";
15
+ import { getMountedSlotsHeader, getPrefetchCache, getPrefetchInterceptionContext, getPrefetchedUrls, navigateClientSide, prefetchRscResponse } from "./navigation.js";
16
+ import { navigatePagesRouterLink } from "../client/pages-router-link-navigation.js";
13
17
  import { getI18nContext } from "./i18n-context.js";
14
- import { canLinkPrefetch, getLinkPrefetchHref } from "./link-prefetch.js";
18
+ import { canLinkIntentPrefetch, canLinkPrefetch, getLinkPrefetchHref } from "./link-prefetch.js";
15
19
  import React, { createContext, forwardRef, useCallback, useContext, useEffect, useRef, useState } from "react";
16
20
  import { jsx } from "react/jsx-runtime";
17
21
  //#region src/shims/link.tsx
@@ -33,6 +37,8 @@ function useLinkStatus() {
33
37
  }
34
38
  /** basePath from next.config.js, injected by the plugin at build time */
35
39
  const __basePath = process.env.__NEXT_ROUTER_BASEPATH ?? "";
40
+ /** trailingSlash from next.config.js, injected by the plugin at build time */
41
+ const __trailingSlash = process.env.__VINEXT_TRAILING_SLASH === "true";
36
42
  const linkPrefetchRouteTrieCache = createRouteTrieCache();
37
43
  function resolveHref(href) {
38
44
  if (typeof href === "string") return href;
@@ -59,6 +65,9 @@ function toSameOriginRouteHref(href) {
59
65
  if (url.origin !== window.location.origin) return null;
60
66
  return `${stripBasePath(url.pathname, __basePath)}${url.search}`;
61
67
  }
68
+ function getLinkPrefetchRouterMode() {
69
+ return hasAppNavigationRuntime() ? "app" : "pages";
70
+ }
62
71
  function canAutoPrefetchFullAppRoute(href) {
63
72
  if (typeof window === "undefined") return false;
64
73
  const routes = window.__VINEXT_LINK_PREFETCH_ROUTES__;
@@ -69,6 +78,31 @@ function canAutoPrefetchFullAppRoute(href) {
69
78
  if (!match) return false;
70
79
  return !match.route.isDynamic;
71
80
  }
81
+ function resolveAutoAppRoutePrefetch(href) {
82
+ if (typeof window === "undefined") return {
83
+ cacheForNavigation: false,
84
+ shouldPrefetch: false
85
+ };
86
+ const routes = window.__VINEXT_LINK_PREFETCH_ROUTES__;
87
+ if (!routes) return {
88
+ cacheForNavigation: false,
89
+ shouldPrefetch: false
90
+ };
91
+ const routeHref = toSameOriginRouteHref(href);
92
+ if (routeHref === null) return {
93
+ cacheForNavigation: false,
94
+ shouldPrefetch: false
95
+ };
96
+ const match = matchRouteWithTrie(routeHref, routes, linkPrefetchRouteTrieCache);
97
+ if (!match) return {
98
+ cacheForNavigation: false,
99
+ shouldPrefetch: false
100
+ };
101
+ return {
102
+ cacheForNavigation: !match.route.isDynamic,
103
+ shouldPrefetch: !match.route.isDynamic || match.route.canPrefetchLoadingShell
104
+ };
105
+ }
72
106
  /**
73
107
  * Prefetch a URL for faster navigation.
74
108
  *
@@ -90,23 +124,41 @@ function prefetchUrl(href, mode, priority = "low") {
90
124
  const fullHref = toBrowserNavigationHref(prefetchHref, window.location.href, __basePath);
91
125
  (window.requestIdleCallback ?? ((fn) => setTimeout(fn, 100)))(() => {
92
126
  (async () => {
93
- if (typeof window.__VINEXT_RSC_NAVIGATE__ === "function") {
94
- if (mode === "auto" && !canAutoPrefetchFullAppRoute(prefetchHref)) return;
95
- const interceptionContext = getCurrentInterceptionContext();
127
+ if (hasAppNavigationRuntime()) {
128
+ const autoPrefetch = mode === "auto" ? resolveAutoAppRoutePrefetch(prefetchHref) : {
129
+ cacheForNavigation: true,
130
+ shouldPrefetch: true
131
+ };
132
+ if (!autoPrefetch.shouldPrefetch) return;
133
+ const interceptionContext = getPrefetchInterceptionContext(fullHref);
96
134
  const mountedSlotsHeader = getMountedSlotsHeader();
97
- const headers = createRscRequestHeaders({ interceptionContext });
135
+ const isOptimisticRouteShellPrefetch = !autoPrefetch.cacheForNavigation;
136
+ if (isOptimisticRouteShellPrefetch && interceptionContext !== null) return;
137
+ const headers = createRscRequestHeaders({
138
+ interceptionContext,
139
+ renderMode: isOptimisticRouteShellPrefetch ? APP_RSC_RENDER_MODE_PREFETCH_LOADING_SHELL : void 0
140
+ });
98
141
  if (mountedSlotsHeader) headers.set(VINEXT_MOUNTED_SLOTS_HEADER, mountedSlotsHeader);
99
142
  const rscUrl = await createRscRequestUrl(fullHref, headers);
100
143
  const cacheKey = AppElementsWire.encodeCacheKey(rscUrl, interceptionContext);
101
144
  const prefetched = getPrefetchedUrls();
102
- if (prefetched.has(cacheKey)) return;
145
+ if (prefetched.has(cacheKey)) {
146
+ if (autoPrefetch.cacheForNavigation) {
147
+ const existing = getPrefetchCache().get(cacheKey);
148
+ if (existing?.cacheForNavigation === false) existing.cacheForNavigation = true;
149
+ }
150
+ return;
151
+ }
103
152
  prefetched.add(cacheKey);
104
153
  prefetchRscResponse(rscUrl, fetch(rscUrl, {
105
154
  headers,
106
155
  credentials: "include",
107
156
  priority,
108
157
  purpose: "prefetch"
109
- }), interceptionContext, mountedSlotsHeader);
158
+ }), interceptionContext, mountedSlotsHeader, void 0, {
159
+ cacheForNavigation: autoPrefetch.cacheForNavigation,
160
+ optimisticRouteShell: isOptimisticRouteShellPrefetch
161
+ });
110
162
  } else if (window.__NEXT_DATA__?.__vinext?.pageModuleUrl) {
111
163
  const link = document.createElement("link");
112
164
  link.rel = "prefetch";
@@ -119,23 +171,58 @@ function prefetchUrl(href, mode, priority = "low") {
119
171
  });
120
172
  });
121
173
  }
174
+ function promotePrefetchEntriesForNavigation(href) {
175
+ if (typeof window === "undefined") return;
176
+ let target;
177
+ try {
178
+ target = new URL(toBrowserNavigationHref(href, window.location.href, __basePath), window.location.href);
179
+ } catch {
180
+ return;
181
+ }
182
+ for (const [cacheKey, entry] of getPrefetchCache()) {
183
+ if (entry.optimisticRouteShell === true) continue;
184
+ const [rscUrl] = cacheKey.split("\0", 1);
185
+ let cached;
186
+ try {
187
+ cached = new URL(rscUrl, window.location.href);
188
+ } catch {
189
+ continue;
190
+ }
191
+ stripRscCacheBustingSearchParam(cached);
192
+ if (stripRscSuffix(cached.pathname) === target.pathname && cached.search === target.search) entry.cacheForNavigation = true;
193
+ }
194
+ }
122
195
  /**
123
196
  * Shared IntersectionObserver for viewport-based prefetching.
124
197
  * All Link elements use the same observer to minimize resource usage.
125
198
  */
126
199
  let sharedObserver = null;
127
- const observerCallbacks = /* @__PURE__ */ new WeakMap();
200
+ const observedLinkPrefetches = /* @__PURE__ */ new WeakMap();
201
+ const visibleLinkPrefetches = /* @__PURE__ */ new Set();
202
+ function setVisibleLinkPrefetch(instance, isVisible) {
203
+ instance.isVisible = isVisible;
204
+ if (isVisible) {
205
+ visibleLinkPrefetches.add(instance);
206
+ if (instance.routerMode === "pages" && instance.viewportPrefetched) return;
207
+ prefetchUrl(instance.href, instance.mode, "low");
208
+ instance.viewportPrefetched = true;
209
+ } else visibleLinkPrefetches.delete(instance);
210
+ }
211
+ function registerVisibleLinkPing() {
212
+ if (typeof window === "undefined") return;
213
+ registerNavigationRuntimeFunctions({ pingVisibleLinks: pingVisibleLinkPrefetches });
214
+ }
215
+ function pingVisibleLinkPrefetches() {
216
+ for (const instance of visibleLinkPrefetches) if (instance.isVisible && instance.routerMode === "app") prefetchUrl(instance.href, instance.mode, "low");
217
+ }
128
218
  function getSharedObserver() {
129
219
  if (typeof window === "undefined" || typeof IntersectionObserver === "undefined") return null;
130
220
  if (sharedObserver) return sharedObserver;
131
221
  sharedObserver = new IntersectionObserver((entries) => {
132
- for (const entry of entries) if (entry.isIntersecting) {
133
- const callback = observerCallbacks.get(entry.target);
134
- if (callback) {
135
- callback();
136
- sharedObserver?.unobserve(entry.target);
137
- observerCallbacks.delete(entry.target);
138
- }
222
+ for (const entry of entries) {
223
+ const instance = observedLinkPrefetches.get(entry.target);
224
+ if (!instance) continue;
225
+ setVisibleLinkPrefetch(instance, entry.isIntersecting || entry.intersectionRatio > 0);
139
226
  }
140
227
  }, { rootMargin: "250px" });
141
228
  return sharedObserver;
@@ -144,6 +231,14 @@ function getDefaultLocale() {
144
231
  if (typeof window !== "undefined") return window.__VINEXT_DEFAULT_LOCALE__;
145
232
  return getI18nContext()?.defaultLocale;
146
233
  }
234
+ function getCurrentLocale() {
235
+ if (typeof window !== "undefined") return getCurrentBrowserLocale({
236
+ basePath: __basePath,
237
+ domainLocales: getDomainLocales(),
238
+ hostname: getCurrentHostname()
239
+ });
240
+ return getI18nContext()?.locale;
241
+ }
147
242
  function getDomainLocales() {
148
243
  if (typeof window !== "undefined") return window.__NEXT_DATA__?.domainLocales;
149
244
  return getI18nContext()?.domainLocales;
@@ -159,6 +254,17 @@ function getDomainLocaleHref(href, locale) {
159
254
  domainItems: getDomainLocales()
160
255
  });
161
256
  }
257
+ function addLocalePrefixForRoot(href, locale) {
258
+ if (href !== "/" && !href.startsWith("/?") && !href.startsWith("/#")) return;
259
+ let parsed;
260
+ try {
261
+ parsed = new URL(href, "http://vinext.local");
262
+ } catch {
263
+ return;
264
+ }
265
+ if (parsed.origin !== "http://vinext.local" || parsed.pathname !== "/") return;
266
+ return `/${locale}${parsed.search}${parsed.hash}`;
267
+ }
162
268
  /**
163
269
  * Apply locale prefix to a URL path based on the locale prop.
164
270
  * - locale="fr" → prepend /fr (unless it already has a locale prefix)
@@ -167,18 +273,24 @@ function getDomainLocaleHref(href, locale) {
167
273
  */
168
274
  function applyLocaleToHref(href, locale) {
169
275
  if (locale === false) return href;
170
- if (locale === void 0) return href;
171
- if (href.startsWith("http://") || href.startsWith("https://") || href.startsWith("//")) return href;
172
- const domainLocaleHref = getDomainLocaleHref(href, locale);
276
+ const resolvedLocale = locale ?? getCurrentLocale();
277
+ if (resolvedLocale === void 0) return href;
278
+ if (isAbsoluteOrProtocolRelativeUrl(href)) return href;
279
+ const domainLocaleHref = getDomainLocaleHref(href, resolvedLocale);
173
280
  if (domainLocaleHref) return domainLocaleHref;
174
- return addLocalePrefix(href, locale, getDefaultLocale() ?? "");
281
+ const defaultLocale = getDefaultLocale() ?? "";
282
+ if (resolvedLocale.toLowerCase() === defaultLocale.toLowerCase()) {
283
+ const localeRootHref = addLocalePrefixForRoot(href, resolvedLocale);
284
+ if (localeRootHref) return localeRootHref;
285
+ }
286
+ return addLocalePrefix(href, resolvedLocale, defaultLocale);
175
287
  }
176
- const Link = forwardRef(function Link({ href, as, replace = false, prefetch: prefetchProp, scroll = true, children, onClick, onMouseEnter, onTouchStart, onNavigate, ...rest }, forwardedRef) {
288
+ const Link = forwardRef(function Link({ href, as, replace = false, prefetch: prefetchProp, scroll = true, shallow = false, children, onClick, onMouseEnter, onTouchStart, onNavigate, unstable_dynamicOnHover = false, ...rest }, forwardedRef) {
177
289
  const { locale, ...restWithoutLocale } = rest;
178
290
  const resolvedHref = as ?? resolveHref(href);
179
291
  const isDangerous = typeof resolvedHref === "string" && isDangerousScheme(resolvedHref);
180
- const localizedHref = applyLocaleToHref(isDangerous ? "/" : resolvedHref, locale);
181
- const fullHref = withBasePath(localizedHref, __basePath);
292
+ const normalizedHref = normalizePathTrailingSlash(applyLocaleToHref(isDangerous ? "/" : resolvedHref, locale), __trailingSlash);
293
+ const fullHref = normalizePathTrailingSlash(withBasePath(normalizedHref, __basePath), __trailingSlash);
182
294
  const [pending, setPending] = useState(false);
183
295
  const mountedRef = useRef(true);
184
296
  useEffect(() => {
@@ -189,7 +301,7 @@ const Link = forwardRef(function Link({ href, as, replace = false, prefetch: pre
189
301
  }, []);
190
302
  const internalRef = useRef(null);
191
303
  const prefetchMode = resolveLinkPrefetchMode(prefetchProp, isDangerous);
192
- const shouldPrefetch = canLinkPrefetch({
304
+ const shouldViewportPrefetch = canLinkPrefetch({
193
305
  nodeEnv: process.env.NODE_ENV,
194
306
  prefetch: prefetchProp,
195
307
  isDangerous
@@ -200,35 +312,57 @@ const Link = forwardRef(function Link({ href, as, replace = false, prefetch: pre
200
312
  else if (forwardedRef) forwardedRef.current = node;
201
313
  }, [forwardedRef]);
202
314
  useEffect(() => {
203
- if (!shouldPrefetch || typeof window === "undefined") return;
315
+ if (!shouldViewportPrefetch || typeof window === "undefined") return;
204
316
  const node = internalRef.current;
205
317
  if (!node) return;
206
318
  const hrefToPrefetch = getLinkPrefetchHref({
207
- href: localizedHref,
319
+ href: normalizedHref,
208
320
  basePath: __basePath,
209
321
  currentOrigin: window.location.origin
210
322
  });
211
323
  if (hrefToPrefetch == null) return;
212
324
  const observer = getSharedObserver();
213
325
  if (!observer) return;
214
- observerCallbacks.set(node, () => prefetchUrl(hrefToPrefetch, prefetchMode, "low"));
326
+ registerVisibleLinkPing();
327
+ const instance = {
328
+ href: hrefToPrefetch,
329
+ isVisible: false,
330
+ mode: prefetchMode,
331
+ routerMode: getLinkPrefetchRouterMode(),
332
+ viewportPrefetched: false
333
+ };
334
+ observedLinkPrefetches.set(node, instance);
215
335
  observer.observe(node);
216
336
  return () => {
217
337
  observer.unobserve(node);
218
- observerCallbacks.delete(node);
338
+ observedLinkPrefetches.delete(node);
339
+ visibleLinkPrefetches.delete(instance);
219
340
  };
220
341
  }, [
221
- shouldPrefetch,
342
+ shouldViewportPrefetch,
222
343
  prefetchMode,
223
- localizedHref
344
+ normalizedHref
224
345
  ]);
225
346
  const prefetchOnIntent = useCallback(() => {
226
- if (!shouldPrefetch) return;
227
- prefetchUrl(localizedHref, prefetchMode, "high");
347
+ if (!canLinkIntentPrefetch({
348
+ nodeEnv: process.env.NODE_ENV,
349
+ prefetch: prefetchProp,
350
+ isDangerous,
351
+ routerMode: getLinkPrefetchRouterMode()
352
+ })) return;
353
+ const intentMode = unstable_dynamicOnHover ? "full" : prefetchMode;
354
+ if (unstable_dynamicOnHover && internalRef.current) {
355
+ const instance = observedLinkPrefetches.get(internalRef.current);
356
+ if (instance) instance.mode = "full";
357
+ promotePrefetchEntriesForNavigation(normalizedHref);
358
+ }
359
+ prefetchUrl(normalizedHref, intentMode, "high");
228
360
  }, [
229
- shouldPrefetch,
361
+ prefetchProp,
362
+ isDangerous,
230
363
  prefetchMode,
231
- localizedHref
364
+ normalizedHref,
365
+ unstable_dynamicOnHover
232
366
  ]);
233
367
  const handleMouseEnter = useCallback((e) => {
234
368
  onMouseEnter?.(e);
@@ -241,12 +375,19 @@ const Link = forwardRef(function Link({ href, as, replace = false, prefetch: pre
241
375
  const handleClick = async (e) => {
242
376
  if (onClick) onClick(e);
243
377
  if (e.defaultPrevented) return;
378
+ if (e.currentTarget.hasAttribute("download")) return;
244
379
  if (e.button !== 0 || e.metaKey || e.ctrlKey || e.shiftKey || e.altKey) return;
245
380
  if (e.currentTarget.target && e.currentTarget.target !== "_self") return;
246
- let navigateHref = localizedHref;
247
- if (resolvedHref.startsWith("http://") || resolvedHref.startsWith("https://") || resolvedHref.startsWith("//")) {
381
+ let navigateHref = normalizedHref;
382
+ if (isAbsoluteOrProtocolRelativeUrl(resolvedHref)) {
248
383
  const localPath = toSameOriginAppPath(resolvedHref, __basePath);
249
- if (localPath == null) return;
384
+ if (localPath == null) {
385
+ if (replace) {
386
+ e.preventDefault();
387
+ window.location.replace(resolvedHref);
388
+ }
389
+ return;
390
+ }
250
391
  navigateHref = localPath;
251
392
  }
252
393
  e.preventDefault();
@@ -267,7 +408,7 @@ const Link = forwardRef(function Link({ href, as, replace = false, prefetch: pre
267
408
  onNavigate(navEvent);
268
409
  if (navEvent.defaultPrevented) return;
269
410
  } catch {}
270
- if (typeof window.__VINEXT_RSC_NAVIGATE__ === "function") {
411
+ if (getNavigationRuntime()?.functions.navigate) {
271
412
  setPending(true);
272
413
  React.startTransition(() => {
273
414
  navigateClientSide(navigateHref, replace ? "replace" : "push", scroll, true).finally(() => {
@@ -277,8 +418,13 @@ const Link = forwardRef(function Link({ href, as, replace = false, prefetch: pre
277
418
  return;
278
419
  } else try {
279
420
  const Router = (await import("next/router.js")).default;
280
- if (replace) await Router.replace(absoluteHref, void 0, { scroll });
281
- else await Router.push(absoluteHref, void 0, { scroll });
421
+ await navigatePagesRouterLink(Router, {
422
+ href: absoluteHref,
423
+ replace,
424
+ scroll,
425
+ shallow,
426
+ locale
427
+ });
282
428
  } catch {
283
429
  if (replace) window.history.replaceState({}, "", absoluteFullHref);
284
430
  else window.history.pushState({}, "", absoluteFullHref);
@@ -289,11 +435,20 @@ const Link = forwardRef(function Link({ href, as, replace = false, prefetch: pre
289
435
  const linkStatusValue = React.useMemo(() => ({ pending }), [pending]);
290
436
  if (isDangerous) {
291
437
  if (process.env.NODE_ENV !== "production") console.warn(`<Link> blocked dangerous href: ${resolvedHref}`);
292
- return /* @__PURE__ */ jsx("a", {
293
- ...anchorProps,
294
- onMouseEnter: handleMouseEnter,
295
- onTouchStart: handleTouchStart,
296
- children
438
+ const handleDangerousClick = (event) => {
439
+ if (onClick) onClick(event);
440
+ reportBlockedDangerousNavigation();
441
+ };
442
+ return /* @__PURE__ */ jsx(LinkStatusContext.Provider, {
443
+ value: linkStatusValue,
444
+ children: /* @__PURE__ */ jsx("a", {
445
+ ref: setRefs,
446
+ onClick: handleDangerousClick,
447
+ onMouseEnter: handleMouseEnter,
448
+ onTouchStart: handleTouchStart,
449
+ ...anchorProps,
450
+ children
451
+ })
297
452
  });
298
453
  }
299
454
  return /* @__PURE__ */ jsx(LinkStatusContext.Provider, {
@@ -312,6 +467,6 @@ const Link = forwardRef(function Link({ href, as, replace = false, prefetch: pre
312
467
  });
313
468
  });
314
469
  //#endregion
315
- export { canAutoPrefetchFullAppRoute, Link as default, resolveLinkPrefetchMode, useLinkStatus };
470
+ export { canAutoPrefetchFullAppRoute, Link as default, resolveAutoAppRoutePrefetch, resolveLinkPrefetchMode, useLinkStatus };
316
471
 
317
472
  //# sourceMappingURL=link.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"link.js","names":[],"sources":["../../src/shims/link.tsx"],"sourcesContent":["\"use client\";\n\n/**\n * next/link shim\n *\n * Renders an <a> tag with client-side navigation support.\n * On click, prevents full page reload and triggers client-side\n * page swap via the router's navigation system.\n */\nimport React, {\n forwardRef,\n useRef,\n useEffect,\n useCallback,\n useContext,\n createContext,\n useState,\n type AnchorHTMLAttributes,\n type MouseEvent,\n type TouchEvent,\n} from \"react\";\n// Import shared RSC prefetch utilities from navigation shim (relative path\n// so this resolves both via the Vite plugin and in direct vitest imports)\nimport {\n getCurrentInterceptionContext,\n getPrefetchedUrls,\n getMountedSlotsHeader,\n navigateClientSide,\n prefetchRscResponse,\n} from \"./navigation.js\";\nimport { AppElementsWire } from \"../server/app-elements.js\";\nimport { createRscRequestHeaders, createRscRequestUrl } from \"../server/app-rsc-cache-busting.js\";\nimport { VINEXT_MOUNTED_SLOTS_HEADER } from \"../server/headers.js\";\nimport { isDangerousScheme } from \"./url-safety.js\";\nimport { canLinkPrefetch, getLinkPrefetchHref } from \"./link-prefetch.js\";\nimport {\n resolveRelativeHref,\n toBrowserNavigationHref,\n toSameOriginAppPath,\n withBasePath,\n} from \"./url-utils.js\";\nimport { appendSearchParamsToUrl, type UrlQuery, urlQueryToSearchParams } from \"../utils/query.js\";\nimport { addLocalePrefix, getDomainLocaleUrl, type DomainLocale } from \"../utils/domain-locale.js\";\nimport { getI18nContext } from \"./i18n-context.js\";\nimport type { VinextLinkPrefetchRoute, VinextNextData } from \"../client/vinext-next-data.js\";\nimport { createRouteTrieCache, matchRouteWithTrie } from \"../routing/route-matching.js\";\nimport { stripBasePath } from \"../utils/base-path.js\";\n\ntype NavigateEvent = {\n url: URL;\n /** Call to prevent the Link's default navigation (e.g. for View Transitions). */\n preventDefault(): void;\n /** Whether preventDefault() has been called. */\n defaultPrevented: boolean;\n};\n\ntype LinkProps = {\n href: string | { pathname?: string; query?: UrlQuery };\n /** URL displayed in the browser (when href is a route pattern like /user/[id]) */\n as?: string;\n /** Replace the current history entry instead of pushing */\n replace?: boolean;\n /** Prefetch the page in the background (App Router default: auto, Pages Router default: true) */\n prefetch?: boolean | \"auto\" | null;\n /** Whether to pass the href to the child element */\n passHref?: boolean;\n /** Scroll to top on navigation (default: true) */\n scroll?: boolean;\n /** Locale for i18n (used for locale-prefixed URLs) */\n locale?: string | false;\n /** Called before navigation happens (Next.js 16). Return value is ignored. */\n onNavigate?: (event: NavigateEvent) => void;\n children?: React.ReactNode;\n} & Omit<AnchorHTMLAttributes<HTMLAnchorElement>, \"href\">;\n\ntype LinkPrefetchMode = \"disabled\" | \"auto\" | \"full\";\n\ndeclare global {\n // Window is an ambient interface from lib.dom; interface merging is required\n // for this global browser hook.\n // oxlint-disable-next-line typescript-eslint/consistent-type-definitions\n interface Window {\n __VINEXT_LINK_PREFETCH_ROUTES__?: VinextLinkPrefetchRoute[];\n }\n}\n\n// ---------------------------------------------------------------------------\n// useLinkStatus — reports the pending state of a parent <Link> navigation\n// ---------------------------------------------------------------------------\n\ntype LinkStatusContextValue = {\n pending: boolean;\n};\n\nconst LinkStatusContext = createContext<LinkStatusContextValue>({ pending: false });\n\n/**\n * useLinkStatus returns the pending state of the enclosing <Link>.\n * In Next.js, this is used to show loading indicators while a\n * prefetch-triggered navigation is in progress.\n */\nexport function useLinkStatus(): LinkStatusContextValue {\n return useContext(LinkStatusContext);\n}\n\n/** basePath from next.config.js, injected by the plugin at build time */\nconst __basePath: string = process.env.__NEXT_ROUTER_BASEPATH ?? \"\";\nconst linkPrefetchRouteTrieCache = createRouteTrieCache<VinextLinkPrefetchRoute>();\n\nfunction resolveHref(href: LinkProps[\"href\"]): string {\n if (typeof href === \"string\") return href;\n let url = href.pathname ?? \"/\";\n if (href.query) {\n const params = urlQueryToSearchParams(href.query);\n url = appendSearchParamsToUrl(url, params);\n }\n return url;\n}\n\nexport function resolveLinkPrefetchMode(\n prefetchProp: LinkProps[\"prefetch\"],\n isDangerous: boolean,\n): LinkPrefetchMode {\n if (isDangerous || prefetchProp === false) return \"disabled\";\n if (prefetchProp === true) return \"full\";\n return \"auto\";\n}\n\nfunction toSameOriginRouteHref(href: string): string | null {\n if (typeof window === \"undefined\") return null;\n\n let url: URL;\n try {\n url = new URL(href, window.location.href);\n } catch {\n return null;\n }\n\n if (url.origin !== window.location.origin) return null;\n\n return `${stripBasePath(url.pathname, __basePath)}${url.search}`;\n}\n\nexport function canAutoPrefetchFullAppRoute(href: string): boolean {\n if (typeof window === \"undefined\") return false;\n\n const routes = window.__VINEXT_LINK_PREFETCH_ROUTES__;\n if (!routes) return false;\n\n const routeHref = toSameOriginRouteHref(href);\n if (routeHref === null) return false;\n\n const match = matchRouteWithTrie(routeHref, routes, linkPrefetchRouteTrieCache);\n if (!match) return false;\n\n return !match.route.isDynamic;\n}\n\n// ---------------------------------------------------------------------------\n// Prefetching infrastructure\n// ---------------------------------------------------------------------------\n\n/**\n * Prefetch a URL for faster navigation.\n *\n * For App Router (RSC): fetches the .rsc payload in the background and\n * stores it in an in-memory cache for instant use during navigation.\n * For Pages Router: injects a <link rel=\"prefetch\"> for the page module.\n *\n * Uses `requestIdleCallback` (or `setTimeout` fallback) to avoid blocking\n * the main thread during initial page load.\n */\nfunction prefetchUrl(href: string, mode: LinkPrefetchMode, priority: \"low\" | \"high\" = \"low\"): void {\n if (typeof window === \"undefined\") return;\n\n const prefetchHref = getLinkPrefetchHref({\n href,\n basePath: __basePath,\n currentOrigin: window.location.origin,\n });\n if (prefetchHref == null) return;\n\n const fullHref = toBrowserNavigationHref(prefetchHref, window.location.href, __basePath);\n\n const schedule = window.requestIdleCallback ?? ((fn: () => void) => setTimeout(fn, 100));\n\n schedule(() => {\n void (async () => {\n if (typeof window.__VINEXT_RSC_NAVIGATE__ === \"function\") {\n // `auto`/`null`/undefined should not behave like `prefetch={true}` for\n // App Router dynamic routes. Next.js may prefetch a loading-boundary\n // shell for dynamic routes, but vinext's current client cache stores\n // complete RSC responses only; keep automatic full prefetch to route\n // shapes that are statically known safe until segment prefetch exists.\n if (mode === \"auto\" && !canAutoPrefetchFullAppRoute(prefetchHref)) return;\n\n const interceptionContext = getCurrentInterceptionContext();\n const mountedSlotsHeader = getMountedSlotsHeader();\n const headers = createRscRequestHeaders({ interceptionContext });\n if (mountedSlotsHeader) {\n headers.set(VINEXT_MOUNTED_SLOTS_HEADER, mountedSlotsHeader);\n }\n // Distinguish the same visible URL when it is prefetched from different\n // request contexts such as /feed vs /gallery or different mounted slots.\n const rscUrl = await createRscRequestUrl(fullHref, headers);\n const cacheKey = AppElementsWire.encodeCacheKey(rscUrl, interceptionContext);\n const prefetched = getPrefetchedUrls();\n if (prefetched.has(cacheKey)) return;\n prefetched.add(cacheKey);\n prefetchRscResponse(\n rscUrl,\n fetch(rscUrl, {\n headers,\n credentials: \"include\",\n priority,\n // @ts-expect-error — purpose is a valid fetch option in some browsers\n purpose: \"prefetch\",\n }),\n interceptionContext,\n mountedSlotsHeader,\n );\n } else if ((window.__NEXT_DATA__ as VinextNextData | undefined)?.__vinext?.pageModuleUrl) {\n // Pages Router: inject a prefetch link for the target page module\n // We can't easily resolve the target page's module URL from the Link,\n // so we create a <link rel=\"prefetch\"> for the HTML page which helps\n // the browser's preload scanner.\n const link = document.createElement(\"link\");\n link.rel = \"prefetch\";\n link.href = fullHref;\n link.as = \"document\";\n document.head.appendChild(link);\n }\n })().catch((error) => {\n console.error(\"[vinext] RSC prefetch setup error:\", error);\n });\n });\n}\n\n/**\n * Shared IntersectionObserver for viewport-based prefetching.\n * All Link elements use the same observer to minimize resource usage.\n */\nlet sharedObserver: IntersectionObserver | null = null;\nconst observerCallbacks = new WeakMap<Element, () => void>();\n\nfunction getSharedObserver(): IntersectionObserver | null {\n if (typeof window === \"undefined\" || typeof IntersectionObserver === \"undefined\") return null;\n if (sharedObserver) return sharedObserver;\n\n sharedObserver = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n const callback = observerCallbacks.get(entry.target);\n if (callback) {\n callback();\n // Unobserve after prefetching — only prefetch once\n sharedObserver?.unobserve(entry.target);\n observerCallbacks.delete(entry.target);\n }\n }\n }\n },\n {\n // Start prefetching when the link is within 250px of the viewport.\n // This gives the browser a head start before the user scrolls to it.\n rootMargin: \"250px\",\n },\n );\n\n return sharedObserver;\n}\n\nfunction getDefaultLocale(): string | undefined {\n if (typeof window !== \"undefined\") {\n return window.__VINEXT_DEFAULT_LOCALE__;\n }\n return getI18nContext()?.defaultLocale;\n}\n\nfunction getDomainLocales(): readonly DomainLocale[] | undefined {\n if (typeof window !== \"undefined\") {\n return (window.__NEXT_DATA__ as VinextNextData | undefined)?.domainLocales;\n }\n return getI18nContext()?.domainLocales;\n}\n\nfunction getCurrentHostname(): string | undefined {\n if (typeof window !== \"undefined\") return window.location.hostname;\n return getI18nContext()?.hostname;\n}\n\nfunction getDomainLocaleHref(href: string, locale: string): string | undefined {\n // Only cross-domain locale switches need a special absolute URL here.\n // Same-domain cases fall back to the standard locale-prefix logic below.\n return getDomainLocaleUrl(href, locale, {\n basePath: __basePath,\n currentHostname: getCurrentHostname(),\n domainItems: getDomainLocales(),\n });\n}\n\n/**\n * Apply locale prefix to a URL path based on the locale prop.\n * - locale=\"fr\" → prepend /fr (unless it already has a locale prefix)\n * - locale={false} → use the href as-is (no locale prefix, link to default)\n * - locale=undefined → use current locale (href as-is in most cases)\n */\nfunction applyLocaleToHref(href: string, locale: string | false | undefined): string {\n if (locale === false) {\n // Explicit false: no locale prefix\n return href;\n }\n\n if (locale === undefined) {\n // No locale prop: keep current behavior (href as-is)\n return href;\n }\n\n // Absolute and protocol-relative URLs must not be prefixed — locale\n // only applies to local paths.\n if (href.startsWith(\"http://\") || href.startsWith(\"https://\") || href.startsWith(\"//\")) {\n return href;\n }\n\n const domainLocaleHref = getDomainLocaleHref(href, locale);\n if (domainLocaleHref) {\n return domainLocaleHref;\n }\n\n return addLocalePrefix(href, locale, getDefaultLocale() ?? \"\");\n}\n\nconst Link = forwardRef<HTMLAnchorElement, LinkProps>(function Link(\n {\n href,\n as,\n replace = false,\n prefetch: prefetchProp,\n scroll = true,\n children,\n onClick,\n onMouseEnter,\n onTouchStart,\n onNavigate,\n ...rest\n },\n forwardedRef,\n) {\n // Extract locale from rest props\n const { locale, ...restWithoutLocale } = rest;\n\n // If `as` is provided, use it as the actual URL (legacy Next.js pattern\n // where href is a route pattern like \"/user/[id]\" and as is \"/user/1\")\n const resolvedHref = as ?? resolveHref(href);\n\n const isDangerous = typeof resolvedHref === \"string\" && isDangerousScheme(resolvedHref);\n\n // Apply locale prefix if specified (safe even for dangerous hrefs since we\n // won't use the result when isDangerous is true)\n const localizedHref = applyLocaleToHref(isDangerous ? \"/\" : resolvedHref, locale);\n // Full href with basePath for browser URLs and fetches\n const fullHref = withBasePath(localizedHref, __basePath);\n\n // Track pending state for useLinkStatus()\n const [pending, setPending] = useState(false);\n const mountedRef = useRef(true);\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n };\n }, []);\n\n // Prefetching: observe the element when it enters the viewport.\n // In App Router, null/undefined/\"auto\" is automatic prefetch and true opts\n // into a full RSC prefetch, matching Next.js's public prefetch contract.\n const internalRef = useRef<HTMLAnchorElement | null>(null);\n const prefetchMode = resolveLinkPrefetchMode(prefetchProp, isDangerous);\n const shouldPrefetch = canLinkPrefetch({\n nodeEnv: process.env.NODE_ENV,\n prefetch: prefetchProp,\n isDangerous,\n });\n\n const setRefs = useCallback(\n (node: HTMLAnchorElement | null) => {\n internalRef.current = node;\n if (typeof forwardedRef === \"function\") forwardedRef(node);\n else if (forwardedRef)\n (forwardedRef as React.MutableRefObject<HTMLAnchorElement | null>).current = node;\n },\n [forwardedRef],\n );\n\n useEffect(() => {\n if (!shouldPrefetch || typeof window === \"undefined\") return;\n const node = internalRef.current;\n if (!node) return;\n\n const hrefToPrefetch = getLinkPrefetchHref({\n href: localizedHref,\n basePath: __basePath,\n currentOrigin: window.location.origin,\n });\n if (hrefToPrefetch == null) return;\n\n const observer = getSharedObserver();\n if (!observer) return;\n\n observerCallbacks.set(node, () => prefetchUrl(hrefToPrefetch, prefetchMode, \"low\"));\n observer.observe(node);\n\n return () => {\n observer.unobserve(node);\n observerCallbacks.delete(node);\n };\n }, [shouldPrefetch, prefetchMode, localizedHref]);\n\n const prefetchOnIntent = useCallback(() => {\n if (!shouldPrefetch) return;\n prefetchUrl(localizedHref, prefetchMode, \"high\");\n }, [shouldPrefetch, prefetchMode, localizedHref]);\n\n const handleMouseEnter = useCallback(\n (e: MouseEvent<HTMLAnchorElement>) => {\n onMouseEnter?.(e);\n prefetchOnIntent();\n },\n [onMouseEnter, prefetchOnIntent],\n );\n\n const handleTouchStart = useCallback(\n (e: TouchEvent<HTMLAnchorElement>) => {\n onTouchStart?.(e);\n prefetchOnIntent();\n },\n [onTouchStart, prefetchOnIntent],\n );\n\n const handleClick = async (e: MouseEvent<HTMLAnchorElement>) => {\n if (onClick) onClick(e);\n if (e.defaultPrevented) return;\n\n // Only intercept left clicks without modifiers (standard link behavior)\n if (e.button !== 0 || e.metaKey || e.ctrlKey || e.shiftKey || e.altKey) {\n return;\n }\n\n // Don't intercept links with target (e.g. target=\"_blank\")\n if (e.currentTarget.target && e.currentTarget.target !== \"_self\") {\n return;\n }\n\n // External links: let the browser handle it.\n // Same-origin absolute URLs (e.g. http://localhost:3000/about) are\n // normalized to local paths so they get client-side navigation.\n let navigateHref = localizedHref;\n if (\n resolvedHref.startsWith(\"http://\") ||\n resolvedHref.startsWith(\"https://\") ||\n resolvedHref.startsWith(\"//\")\n ) {\n const localPath = toSameOriginAppPath(resolvedHref, __basePath);\n if (localPath == null) return; // truly external\n navigateHref = localPath;\n }\n\n e.preventDefault();\n\n // Resolve relative hrefs (#hash, ?query) against the current URL once so\n // onNavigate and the actual navigation target stay in sync.\n const absoluteHref = resolveRelativeHref(navigateHref, window.location.href, __basePath);\n const absoluteFullHref = toBrowserNavigationHref(\n navigateHref,\n window.location.href,\n __basePath,\n );\n\n // Call onNavigate callback if provided (Next.js 16 View Transitions support)\n if (onNavigate) {\n try {\n const navUrl = new URL(absoluteFullHref, window.location.origin);\n let prevented = false;\n const navEvent: NavigateEvent = {\n url: navUrl,\n preventDefault() {\n prevented = true;\n },\n get defaultPrevented() {\n return prevented;\n },\n };\n onNavigate(navEvent);\n // If the callback called preventDefault(), skip Link's default navigation.\n // The callback is responsible for its own navigation (e.g. via View Transitions API).\n if (navEvent.defaultPrevented) {\n return;\n }\n } catch {\n // Ignore URL parsing errors for relative/hash hrefs\n }\n }\n\n // App Router: delegate to navigateClientSide which handles scroll save,\n // hash-only changes, RSC fetch, and two-phase URL commit.\n if (typeof window.__VINEXT_RSC_NAVIGATE__ === \"function\") {\n setPending(true);\n React.startTransition(() => {\n void navigateClientSide(navigateHref, replace ? \"replace\" : \"push\", scroll, true).finally(\n () => {\n if (mountedRef.current) setPending(false);\n },\n );\n });\n return;\n } else {\n // Next.js only consumes onRouterTransitionStart in the App Router.\n // Pages Router still executes instrumentation-client side effects\n // during startup, but it does not invoke the named export on navigation.\n // Pages Router: use the Router singleton\n try {\n const routerModule = await import(\"next/router\");\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any -- vinext's Router shim accepts (url, as, options)\n const Router = routerModule.default as any;\n if (replace) {\n await Router.replace(absoluteHref, undefined, { scroll });\n } else {\n await Router.push(absoluteHref, undefined, { scroll });\n }\n } catch {\n // Fallback to hard navigation if router fails\n if (replace) {\n window.history.replaceState({}, \"\", absoluteFullHref);\n } else {\n window.history.pushState({}, \"\", absoluteFullHref);\n }\n window.dispatchEvent(new PopStateEvent(\"popstate\"));\n }\n }\n };\n\n // Remove props that shouldn't be on <a>\n const { passHref: _p, ...anchorProps } = restWithoutLocale;\n\n const linkStatusValue = React.useMemo(() => ({ pending }), [pending]);\n\n // Block dangerous URI schemes (javascript:, data:, vbscript:).\n // Render an inert <a> without href to prevent XSS while preserving\n // styling and attributes like className, id, aria-*.\n // This check is placed after all hooks to satisfy the Rules of Hooks.\n if (isDangerous) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(`<Link> blocked dangerous href: ${resolvedHref}`);\n }\n return (\n <a {...anchorProps} onMouseEnter={handleMouseEnter} onTouchStart={handleTouchStart}>\n {children}\n </a>\n );\n }\n\n return (\n <LinkStatusContext.Provider value={linkStatusValue}>\n <a\n ref={setRefs}\n href={fullHref}\n onClick={(event) => {\n void handleClick(event);\n }}\n onMouseEnter={handleMouseEnter}\n onTouchStart={handleTouchStart}\n {...anchorProps}\n >\n {children}\n </a>\n </LinkStatusContext.Provider>\n );\n});\n\nexport default Link;\n"],"mappings":"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"}
1
+ {"version":3,"file":"link.js","names":[],"sources":["../../src/shims/link.tsx"],"sourcesContent":["\"use client\";\n\n/**\n * next/link shim\n *\n * Renders an <a> tag with client-side navigation support.\n * On click, prevents full page reload and triggers client-side\n * page swap via the router's navigation system.\n */\nimport React, {\n forwardRef,\n useRef,\n useEffect,\n useCallback,\n useContext,\n createContext,\n useState,\n type AnchorHTMLAttributes,\n type MouseEvent,\n type TouchEvent,\n} from \"react\";\nimport {\n getNavigationRuntime,\n hasAppNavigationRuntime,\n registerNavigationRuntimeFunctions,\n} from \"../client/navigation-runtime.js\";\n// Import shared RSC prefetch utilities from navigation shim (relative path\n// so this resolves both via the Vite plugin and in direct vitest imports)\nimport {\n getPrefetchInterceptionContext,\n getPrefetchCache,\n getPrefetchedUrls,\n getMountedSlotsHeader,\n navigateClientSide,\n prefetchRscResponse,\n} from \"./navigation.js\";\nimport { AppElementsWire } from \"../server/app-elements.js\";\nimport {\n createRscRequestHeaders,\n createRscRequestUrl,\n stripRscCacheBustingSearchParam,\n stripRscSuffix,\n} from \"../server/app-rsc-cache-busting.js\";\nimport { APP_RSC_RENDER_MODE_PREFETCH_LOADING_SHELL } from \"../server/app-rsc-render-mode.js\";\nimport { VINEXT_MOUNTED_SLOTS_HEADER } from \"../server/headers.js\";\nimport { isDangerousScheme, reportBlockedDangerousNavigation } from \"./url-safety.js\";\nimport {\n canLinkIntentPrefetch,\n canLinkPrefetch,\n getLinkPrefetchHref,\n type LinkPrefetchRouterMode,\n} from \"./link-prefetch.js\";\nimport {\n isAbsoluteOrProtocolRelativeUrl,\n normalizePathTrailingSlash,\n resolveRelativeHref,\n toBrowserNavigationHref,\n toSameOriginAppPath,\n withBasePath,\n} from \"./url-utils.js\";\nimport { appendSearchParamsToUrl, type UrlQuery, urlQueryToSearchParams } from \"../utils/query.js\";\nimport { addLocalePrefix, getDomainLocaleUrl, type DomainLocale } from \"../utils/domain-locale.js\";\nimport { getI18nContext } from \"./i18n-context.js\";\nimport type { VinextLinkPrefetchRoute, VinextNextData } from \"../client/vinext-next-data.js\";\nimport { navigatePagesRouterLink } from \"../client/pages-router-link-navigation.js\";\nimport { createRouteTrieCache, matchRouteWithTrie } from \"../routing/route-matching.js\";\nimport { stripBasePath } from \"../utils/base-path.js\";\nimport { getCurrentBrowserLocale } from \"./client-locale.js\";\n\ntype NavigateEvent = {\n url: URL;\n /** Call to prevent the Link's default navigation (e.g. for View Transitions). */\n preventDefault(): void;\n /** Whether preventDefault() has been called. */\n defaultPrevented: boolean;\n};\n\ntype LinkProps = {\n href: string | { pathname?: string; query?: UrlQuery };\n /** URL displayed in the browser (when href is a route pattern like /user/[id]) */\n as?: string;\n /** Replace the current history entry instead of pushing */\n replace?: boolean;\n /** Prefetch the page in the background (App Router default: auto, Pages Router default: true) */\n prefetch?: boolean | \"auto\" | null;\n /**\n * Unstable App Router option matching Next.js canary: an automatic prefetch\n * is upgraded to a full prefetch when the user shows navigation intent.\n */\n unstable_dynamicOnHover?: boolean;\n /** Whether to pass the href to the child element */\n passHref?: boolean;\n /** Scroll to top on navigation (default: true) */\n scroll?: boolean;\n /**\n * Pages Router: update the URL without re-running data fetching methods\n * (getServerSideProps / getStaticProps / getInitialProps). The shallow change\n * still triggers the route change events and updates `router.query`. Only\n * applies to navigations within the same page. No-op on the App Router.\n */\n shallow?: boolean;\n /** Locale for i18n (used for locale-prefixed URLs) */\n locale?: string | false;\n /** Called before navigation happens (Next.js 16). Return value is ignored. */\n onNavigate?: (event: NavigateEvent) => void;\n children?: React.ReactNode;\n} & Omit<AnchorHTMLAttributes<HTMLAnchorElement>, \"href\">;\n\ntype LinkPrefetchMode = \"disabled\" | \"auto\" | \"full\";\n\ndeclare global {\n // Window is an ambient interface from lib.dom; interface merging is required\n // for this global browser hook.\n // oxlint-disable-next-line typescript-eslint/consistent-type-definitions\n interface Window {\n __VINEXT_LINK_PREFETCH_ROUTES__?: VinextLinkPrefetchRoute[];\n }\n}\n\n// ---------------------------------------------------------------------------\n// useLinkStatus — reports the pending state of a parent <Link> navigation\n// ---------------------------------------------------------------------------\n\ntype LinkStatusContextValue = {\n pending: boolean;\n};\n\nconst LinkStatusContext = createContext<LinkStatusContextValue>({ pending: false });\n\n/**\n * useLinkStatus returns the pending state of the enclosing <Link>.\n * In Next.js, this is used to show loading indicators while a\n * prefetch-triggered navigation is in progress.\n */\nexport function useLinkStatus(): LinkStatusContextValue {\n return useContext(LinkStatusContext);\n}\n\n/** basePath from next.config.js, injected by the plugin at build time */\nconst __basePath: string = process.env.__NEXT_ROUTER_BASEPATH ?? \"\";\n/** trailingSlash from next.config.js, injected by the plugin at build time */\nconst __trailingSlash: boolean = process.env.__VINEXT_TRAILING_SLASH === \"true\";\nconst linkPrefetchRouteTrieCache = createRouteTrieCache<VinextLinkPrefetchRoute>();\n\nfunction resolveHref(href: LinkProps[\"href\"]): string {\n if (typeof href === \"string\") return href;\n let url = href.pathname ?? \"/\";\n if (href.query) {\n const params = urlQueryToSearchParams(href.query);\n url = appendSearchParamsToUrl(url, params);\n }\n return url;\n}\n\nexport function resolveLinkPrefetchMode(\n prefetchProp: LinkProps[\"prefetch\"],\n isDangerous: boolean,\n): LinkPrefetchMode {\n if (isDangerous || prefetchProp === false) return \"disabled\";\n if (prefetchProp === true) return \"full\";\n return \"auto\";\n}\n\nfunction toSameOriginRouteHref(href: string): string | null {\n if (typeof window === \"undefined\") return null;\n\n let url: URL;\n try {\n url = new URL(href, window.location.href);\n } catch {\n return null;\n }\n\n if (url.origin !== window.location.origin) return null;\n\n return `${stripBasePath(url.pathname, __basePath)}${url.search}`;\n}\n\nfunction getLinkPrefetchRouterMode(): LinkPrefetchRouterMode {\n return hasAppNavigationRuntime() ? \"app\" : \"pages\";\n}\n\nexport function canAutoPrefetchFullAppRoute(href: string): boolean {\n if (typeof window === \"undefined\") return false;\n\n const routes = window.__VINEXT_LINK_PREFETCH_ROUTES__;\n if (!routes) return false;\n\n const routeHref = toSameOriginRouteHref(href);\n if (routeHref === null) return false;\n\n const match = matchRouteWithTrie(routeHref, routes, linkPrefetchRouteTrieCache);\n if (!match) return false;\n\n return !match.route.isDynamic;\n}\n\nexport function resolveAutoAppRoutePrefetch(href: string): {\n cacheForNavigation: boolean;\n shouldPrefetch: boolean;\n} {\n if (typeof window === \"undefined\") {\n return { cacheForNavigation: false, shouldPrefetch: false };\n }\n\n const routes = window.__VINEXT_LINK_PREFETCH_ROUTES__;\n if (!routes) {\n return { cacheForNavigation: false, shouldPrefetch: false };\n }\n\n const routeHref = toSameOriginRouteHref(href);\n if (routeHref === null) {\n return { cacheForNavigation: false, shouldPrefetch: false };\n }\n\n const match = matchRouteWithTrie(routeHref, routes, linkPrefetchRouteTrieCache);\n if (!match) {\n return { cacheForNavigation: false, shouldPrefetch: false };\n }\n\n return {\n cacheForNavigation: !match.route.isDynamic,\n shouldPrefetch: !match.route.isDynamic || match.route.canPrefetchLoadingShell,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Prefetching infrastructure\n// ---------------------------------------------------------------------------\n\n/**\n * Prefetch a URL for faster navigation.\n *\n * For App Router (RSC): fetches the .rsc payload in the background and\n * stores it in an in-memory cache for instant use during navigation.\n * For Pages Router: injects a <link rel=\"prefetch\"> for the page module.\n *\n * Uses `requestIdleCallback` (or `setTimeout` fallback) to avoid blocking\n * the main thread during initial page load.\n */\nfunction prefetchUrl(href: string, mode: LinkPrefetchMode, priority: \"low\" | \"high\" = \"low\"): void {\n if (typeof window === \"undefined\") return;\n\n const prefetchHref = getLinkPrefetchHref({\n href,\n basePath: __basePath,\n currentOrigin: window.location.origin,\n });\n if (prefetchHref == null) return;\n\n const fullHref = toBrowserNavigationHref(prefetchHref, window.location.href, __basePath);\n\n const schedule = window.requestIdleCallback ?? ((fn: () => void) => setTimeout(fn, 100));\n\n schedule(() => {\n void (async () => {\n if (hasAppNavigationRuntime()) {\n const autoPrefetch =\n mode === \"auto\"\n ? resolveAutoAppRoutePrefetch(prefetchHref)\n : { cacheForNavigation: true, shouldPrefetch: true };\n if (!autoPrefetch.shouldPrefetch) return;\n\n const interceptionContext = getPrefetchInterceptionContext(fullHref);\n const mountedSlotsHeader = getMountedSlotsHeader();\n const isOptimisticRouteShellPrefetch = !autoPrefetch.cacheForNavigation;\n if (isOptimisticRouteShellPrefetch && interceptionContext !== null) return;\n const headers = createRscRequestHeaders({\n interceptionContext,\n renderMode: isOptimisticRouteShellPrefetch\n ? APP_RSC_RENDER_MODE_PREFETCH_LOADING_SHELL\n : undefined,\n });\n if (mountedSlotsHeader) {\n headers.set(VINEXT_MOUNTED_SLOTS_HEADER, mountedSlotsHeader);\n }\n // Distinguish the same visible URL when it is prefetched from different\n // request contexts such as /feed vs /gallery or different mounted slots.\n const rscUrl = await createRscRequestUrl(fullHref, headers);\n const cacheKey = AppElementsWire.encodeCacheKey(rscUrl, interceptionContext);\n const prefetched = getPrefetchedUrls();\n if (prefetched.has(cacheKey)) {\n if (autoPrefetch.cacheForNavigation) {\n const existing = getPrefetchCache().get(cacheKey);\n if (existing?.cacheForNavigation === false) {\n existing.cacheForNavigation = true;\n }\n }\n return;\n }\n prefetched.add(cacheKey);\n prefetchRscResponse(\n rscUrl,\n fetch(rscUrl, {\n headers,\n credentials: \"include\",\n priority,\n // @ts-expect-error — purpose is a valid fetch option in some browsers\n purpose: \"prefetch\",\n }),\n interceptionContext,\n mountedSlotsHeader,\n undefined,\n {\n cacheForNavigation: autoPrefetch.cacheForNavigation,\n optimisticRouteShell: isOptimisticRouteShellPrefetch,\n },\n );\n } else if ((window.__NEXT_DATA__ as VinextNextData | undefined)?.__vinext?.pageModuleUrl) {\n // Pages Router: inject a prefetch link for the target page module\n // We can't easily resolve the target page's module URL from the Link,\n // so we create a <link rel=\"prefetch\"> for the HTML page which helps\n // the browser's preload scanner.\n const link = document.createElement(\"link\");\n link.rel = \"prefetch\";\n link.href = fullHref;\n link.as = \"document\";\n document.head.appendChild(link);\n }\n })().catch((error) => {\n console.error(\"[vinext] RSC prefetch setup error:\", error);\n });\n });\n}\n\nfunction promotePrefetchEntriesForNavigation(href: string): void {\n if (typeof window === \"undefined\") return;\n\n let target: URL;\n try {\n target = new URL(\n toBrowserNavigationHref(href, window.location.href, __basePath),\n window.location.href,\n );\n } catch {\n return;\n }\n\n for (const [cacheKey, entry] of getPrefetchCache()) {\n if (entry.optimisticRouteShell === true) continue;\n\n const [rscUrl] = cacheKey.split(\"\\0\", 1);\n let cached: URL;\n try {\n cached = new URL(rscUrl, window.location.href);\n } catch {\n continue;\n }\n stripRscCacheBustingSearchParam(cached);\n if (stripRscSuffix(cached.pathname) === target.pathname && cached.search === target.search) {\n entry.cacheForNavigation = true;\n }\n }\n}\n\n/**\n * Shared IntersectionObserver for viewport-based prefetching.\n * All Link elements use the same observer to minimize resource usage.\n */\nlet sharedObserver: IntersectionObserver | null = null;\ntype LinkPrefetchInstance = {\n href: string;\n isVisible: boolean;\n mode: LinkPrefetchMode;\n routerMode: LinkPrefetchRouterMode;\n viewportPrefetched: boolean;\n};\n\nconst observedLinkPrefetches = new WeakMap<Element, LinkPrefetchInstance>();\nconst visibleLinkPrefetches = new Set<LinkPrefetchInstance>();\n\nfunction setVisibleLinkPrefetch(instance: LinkPrefetchInstance, isVisible: boolean): void {\n instance.isVisible = isVisible;\n if (isVisible) {\n visibleLinkPrefetches.add(instance);\n if (instance.routerMode === \"pages\" && instance.viewportPrefetched) return;\n prefetchUrl(instance.href, instance.mode, \"low\");\n instance.viewportPrefetched = true;\n } else {\n visibleLinkPrefetches.delete(instance);\n }\n}\n\nfunction registerVisibleLinkPing(): void {\n if (typeof window === \"undefined\") return;\n registerNavigationRuntimeFunctions({ pingVisibleLinks: pingVisibleLinkPrefetches });\n}\n\nfunction pingVisibleLinkPrefetches(): void {\n for (const instance of visibleLinkPrefetches) {\n if (instance.isVisible && instance.routerMode === \"app\") {\n prefetchUrl(instance.href, instance.mode, \"low\");\n }\n }\n}\n\nfunction getSharedObserver(): IntersectionObserver | null {\n if (typeof window === \"undefined\" || typeof IntersectionObserver === \"undefined\") return null;\n if (sharedObserver) return sharedObserver;\n\n sharedObserver = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n const instance = observedLinkPrefetches.get(entry.target);\n if (!instance) continue;\n setVisibleLinkPrefetch(instance, entry.isIntersecting || entry.intersectionRatio > 0);\n }\n },\n {\n // Start prefetching when the link is within 250px of the viewport.\n // This gives the browser a head start before the user scrolls to it.\n rootMargin: \"250px\",\n },\n );\n\n return sharedObserver;\n}\n\nfunction getDefaultLocale(): string | undefined {\n if (typeof window !== \"undefined\") {\n return window.__VINEXT_DEFAULT_LOCALE__;\n }\n return getI18nContext()?.defaultLocale;\n}\n\nfunction getCurrentLocale(): string | undefined {\n if (typeof window !== \"undefined\") {\n return getCurrentBrowserLocale({\n basePath: __basePath,\n domainLocales: getDomainLocales(),\n hostname: getCurrentHostname(),\n });\n }\n return getI18nContext()?.locale;\n}\n\nfunction getDomainLocales(): readonly DomainLocale[] | undefined {\n if (typeof window !== \"undefined\") {\n return (window.__NEXT_DATA__ as VinextNextData | undefined)?.domainLocales;\n }\n return getI18nContext()?.domainLocales;\n}\n\nfunction getCurrentHostname(): string | undefined {\n if (typeof window !== \"undefined\") return window.location.hostname;\n return getI18nContext()?.hostname;\n}\n\nfunction getDomainLocaleHref(href: string, locale: string): string | undefined {\n // Only cross-domain locale switches need a special absolute URL here.\n // Same-domain cases fall back to the standard locale-prefix logic below.\n return getDomainLocaleUrl(href, locale, {\n basePath: __basePath,\n currentHostname: getCurrentHostname(),\n domainItems: getDomainLocales(),\n });\n}\n\nfunction addLocalePrefixForRoot(href: string, locale: string): string | undefined {\n if (href !== \"/\" && !href.startsWith(\"/?\") && !href.startsWith(\"/#\")) {\n return undefined;\n }\n\n let parsed: URL;\n try {\n parsed = new URL(href, \"http://vinext.local\");\n } catch {\n return undefined;\n }\n\n if (parsed.origin !== \"http://vinext.local\" || parsed.pathname !== \"/\") {\n return undefined;\n }\n\n return `/${locale}${parsed.search}${parsed.hash}`;\n}\n\n/**\n * Apply locale prefix to a URL path based on the locale prop.\n * - locale=\"fr\" → prepend /fr (unless it already has a locale prefix)\n * - locale={false} → use the href as-is (no locale prefix, link to default)\n * - locale=undefined → use current locale (href as-is in most cases)\n */\nfunction applyLocaleToHref(href: string, locale: string | false | undefined): string {\n if (locale === false) {\n // Explicit false: no locale prefix\n return href;\n }\n\n const resolvedLocale = locale ?? getCurrentLocale();\n if (resolvedLocale === undefined) {\n return href;\n }\n\n // Absolute and protocol-relative URLs must not be prefixed — locale\n // only applies to local paths.\n if (isAbsoluteOrProtocolRelativeUrl(href)) {\n return href;\n }\n\n const domainLocaleHref = getDomainLocaleHref(href, resolvedLocale);\n if (domainLocaleHref) {\n return domainLocaleHref;\n }\n\n const defaultLocale = getDefaultLocale() ?? \"\";\n if (resolvedLocale.toLowerCase() === defaultLocale.toLowerCase()) {\n const localeRootHref = addLocalePrefixForRoot(href, resolvedLocale);\n if (localeRootHref) return localeRootHref;\n }\n\n return addLocalePrefix(href, resolvedLocale, defaultLocale);\n}\n\nconst Link = forwardRef<HTMLAnchorElement, LinkProps>(function Link(\n {\n href,\n as,\n replace = false,\n prefetch: prefetchProp,\n scroll = true,\n shallow = false,\n children,\n onClick,\n onMouseEnter,\n onTouchStart,\n onNavigate,\n unstable_dynamicOnHover = false,\n ...rest\n },\n forwardedRef,\n) {\n // Extract locale from rest props\n const { locale, ...restWithoutLocale } = rest;\n\n // If `as` is provided, use it as the actual URL (legacy Next.js pattern\n // where href is a route pattern like \"/user/[id]\" and as is \"/user/1\")\n const resolvedHref = as ?? resolveHref(href);\n\n const isDangerous = typeof resolvedHref === \"string\" && isDangerousScheme(resolvedHref);\n\n // Apply locale prefix if specified (safe even for dangerous hrefs since we\n // won't use the result when isDangerous is true)\n const localizedHref = applyLocaleToHref(isDangerous ? \"/\" : resolvedHref, locale);\n // Normalise trailing slash to match `trailingSlash` config so that rendered\n // hrefs avoid the redirect bounce. Mirrors Next.js's `addLocale`/`addBasePath`,\n // both of which run `normalizePathTrailingSlash` after prefixing — we apply\n // it once after locale prefixing (for prefetch/navigation paths that bypass\n // basePath) and again after `withBasePath` for the rendered `href` attribute.\n const normalizedHref = normalizePathTrailingSlash(localizedHref, __trailingSlash);\n // Full href with basePath for browser URLs and fetches, normalised again so\n // that combining a non-empty basePath with the bare root (`/`) still\n // produces a canonical href under `trailingSlash: false` (e.g. `/foo`\n // rather than `/foo/`).\n const fullHref = normalizePathTrailingSlash(\n withBasePath(normalizedHref, __basePath),\n __trailingSlash,\n );\n\n // Track pending state for useLinkStatus()\n const [pending, setPending] = useState(false);\n const mountedRef = useRef(true);\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n };\n }, []);\n\n // Prefetching: observe the element when it enters the viewport.\n // In App Router, null/undefined/\"auto\" is automatic prefetch and true opts\n // into a full RSC prefetch, matching Next.js's public prefetch contract.\n const internalRef = useRef<HTMLAnchorElement | null>(null);\n const prefetchMode = resolveLinkPrefetchMode(prefetchProp, isDangerous);\n const shouldViewportPrefetch = canLinkPrefetch({\n nodeEnv: process.env.NODE_ENV,\n prefetch: prefetchProp,\n isDangerous,\n });\n\n const setRefs = useCallback(\n (node: HTMLAnchorElement | null) => {\n internalRef.current = node;\n if (typeof forwardedRef === \"function\") forwardedRef(node);\n else if (forwardedRef)\n (forwardedRef as React.MutableRefObject<HTMLAnchorElement | null>).current = node;\n },\n [forwardedRef],\n );\n\n useEffect(() => {\n if (!shouldViewportPrefetch || typeof window === \"undefined\") return;\n const node = internalRef.current;\n if (!node) return;\n\n const hrefToPrefetch = getLinkPrefetchHref({\n href: normalizedHref,\n basePath: __basePath,\n currentOrigin: window.location.origin,\n });\n if (hrefToPrefetch == null) return;\n\n const observer = getSharedObserver();\n if (!observer) return;\n\n registerVisibleLinkPing();\n const instance: LinkPrefetchInstance = {\n href: hrefToPrefetch,\n isVisible: false,\n mode: prefetchMode,\n routerMode: getLinkPrefetchRouterMode(),\n viewportPrefetched: false,\n };\n observedLinkPrefetches.set(node, instance);\n observer.observe(node);\n\n return () => {\n observer.unobserve(node);\n observedLinkPrefetches.delete(node);\n visibleLinkPrefetches.delete(instance);\n };\n }, [shouldViewportPrefetch, prefetchMode, normalizedHref]);\n\n const prefetchOnIntent = useCallback(() => {\n if (\n !canLinkIntentPrefetch({\n nodeEnv: process.env.NODE_ENV,\n prefetch: prefetchProp,\n isDangerous,\n routerMode: getLinkPrefetchRouterMode(),\n })\n ) {\n return;\n }\n const intentMode = unstable_dynamicOnHover ? \"full\" : prefetchMode;\n if (unstable_dynamicOnHover && internalRef.current) {\n const instance = observedLinkPrefetches.get(internalRef.current);\n if (instance) {\n instance.mode = \"full\";\n }\n promotePrefetchEntriesForNavigation(normalizedHref);\n }\n prefetchUrl(normalizedHref, intentMode, \"high\");\n }, [prefetchProp, isDangerous, prefetchMode, normalizedHref, unstable_dynamicOnHover]);\n\n const handleMouseEnter = useCallback(\n (e: MouseEvent<HTMLAnchorElement>) => {\n onMouseEnter?.(e);\n prefetchOnIntent();\n },\n [onMouseEnter, prefetchOnIntent],\n );\n\n const handleTouchStart = useCallback(\n (e: TouchEvent<HTMLAnchorElement>) => {\n onTouchStart?.(e);\n prefetchOnIntent();\n },\n [onTouchStart, prefetchOnIntent],\n );\n\n const handleClick = async (e: MouseEvent<HTMLAnchorElement>) => {\n if (onClick) onClick(e);\n if (e.defaultPrevented) return;\n\n // Native download links must keep the browser's default behavior.\n if (e.currentTarget.hasAttribute(\"download\")) {\n return;\n }\n\n // Only intercept left clicks without modifiers (standard link behavior)\n if (e.button !== 0 || e.metaKey || e.ctrlKey || e.shiftKey || e.altKey) {\n return;\n }\n\n // Don't intercept links with target (e.g. target=\"_blank\")\n if (e.currentTarget.target && e.currentTarget.target !== \"_self\") {\n return;\n }\n\n // External links: let the browser handle it.\n // Same-origin absolute URLs (e.g. http://localhost:3000/about) are\n // normalized to local paths so they get client-side navigation.\n let navigateHref = normalizedHref;\n if (isAbsoluteOrProtocolRelativeUrl(resolvedHref)) {\n const localPath = toSameOriginAppPath(resolvedHref, __basePath);\n if (localPath == null) {\n // Truly external. Mirror Next.js `linkClicked`: when `replace` is set\n // we have to take over because the browser's default click navigation\n // pushes to history rather than replacing the current entry.\n // See `.nextjs-ref/packages/next/src/client/link.tsx` `linkClicked`.\n if (replace) {\n e.preventDefault();\n window.location.replace(resolvedHref);\n }\n return;\n }\n navigateHref = localPath;\n }\n\n e.preventDefault();\n\n // Resolve relative hrefs (#hash, ?query) against the current URL once so\n // onNavigate and the actual navigation target stay in sync.\n const absoluteHref = resolveRelativeHref(navigateHref, window.location.href, __basePath);\n const absoluteFullHref = toBrowserNavigationHref(\n navigateHref,\n window.location.href,\n __basePath,\n );\n\n // Call onNavigate callback if provided (Next.js 16 View Transitions support)\n if (onNavigate) {\n try {\n const navUrl = new URL(absoluteFullHref, window.location.origin);\n let prevented = false;\n const navEvent: NavigateEvent = {\n url: navUrl,\n preventDefault() {\n prevented = true;\n },\n get defaultPrevented() {\n return prevented;\n },\n };\n onNavigate(navEvent);\n // If the callback called preventDefault(), skip Link's default navigation.\n // The callback is responsible for its own navigation (e.g. via View Transitions API).\n if (navEvent.defaultPrevented) {\n return;\n }\n } catch {\n // Ignore URL parsing errors for relative/hash hrefs\n }\n }\n\n // App Router: delegate to navigateClientSide which handles scroll save,\n // hash-only changes, RSC fetch, and two-phase URL commit.\n if (getNavigationRuntime()?.functions.navigate) {\n setPending(true);\n React.startTransition(() => {\n void navigateClientSide(navigateHref, replace ? \"replace\" : \"push\", scroll, true).finally(\n () => {\n if (mountedRef.current) setPending(false);\n },\n );\n });\n return;\n } else {\n // Next.js only consumes onRouterTransitionStart in the App Router.\n // Pages Router still executes instrumentation-client side effects\n // during startup, but it does not invoke the named export on navigation.\n // Pages Router: use the Router singleton\n try {\n const routerModule = await import(\"next/router\");\n const Router = routerModule.default;\n await navigatePagesRouterLink(Router, {\n href: absoluteHref,\n replace,\n scroll,\n shallow,\n locale,\n });\n } catch {\n // Fallback to hard navigation if router fails\n if (replace) {\n window.history.replaceState({}, \"\", absoluteFullHref);\n } else {\n window.history.pushState({}, \"\", absoluteFullHref);\n }\n window.dispatchEvent(new PopStateEvent(\"popstate\"));\n }\n }\n };\n\n // Remove props that shouldn't be on <a>\n const { passHref: _p, ...anchorProps } = restWithoutLocale;\n\n const linkStatusValue = React.useMemo(() => ({ pending }), [pending]);\n\n // Block dangerous URI schemes (javascript:, data:, vbscript:).\n // Render an inert <a> without href to prevent XSS while preserving\n // styling, refs, and developer event handlers like onClick.\n // This check is placed after all hooks to satisfy the Rules of Hooks.\n if (isDangerous) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(`<Link> blocked dangerous href: ${resolvedHref}`);\n }\n // Match Next.js parity: when a user clicks a Link whose href has a\n // dangerous scheme, emit the same `console.error` that Next.js surfaces\n // via React's event-handler runtime when `router.push` throws.\n // Ported from Next.js: test/e2e/app-dir/javascript-urls/javascript-urls.test.ts\n // https://github.com/vercel/next.js/blob/canary/test/e2e/app-dir/javascript-urls/javascript-urls.test.ts\n const handleDangerousClick = (event: MouseEvent<HTMLAnchorElement>) => {\n if (onClick) onClick(event);\n reportBlockedDangerousNavigation();\n };\n return (\n <LinkStatusContext.Provider value={linkStatusValue}>\n <a\n ref={setRefs}\n onClick={handleDangerousClick}\n onMouseEnter={handleMouseEnter}\n onTouchStart={handleTouchStart}\n {...anchorProps}\n >\n {children}\n </a>\n </LinkStatusContext.Provider>\n );\n }\n\n return (\n <LinkStatusContext.Provider value={linkStatusValue}>\n <a\n ref={setRefs}\n href={fullHref}\n onClick={(event) => {\n void handleClick(event);\n }}\n onMouseEnter={handleMouseEnter}\n onTouchStart={handleTouchStart}\n {...anchorProps}\n >\n {children}\n </a>\n </LinkStatusContext.Provider>\n );\n});\n\nexport default Link;\n"],"mappings":"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"}
@@ -68,19 +68,7 @@ type Metadata = {
68
68
  description?: string;
69
69
  url?: string | URL;
70
70
  siteName?: string;
71
- images?: string | URL | {
72
- url: string | URL;
73
- width?: number;
74
- height?: number;
75
- alt?: string;
76
- type?: string;
77
- } | Array<string | URL | {
78
- url: string | URL;
79
- width?: number;
80
- height?: number;
81
- alt?: string;
82
- type?: string;
83
- }>;
71
+ images?: string | URL | SocialImageDescriptor | Array<string | URL | SocialImageDescriptor>;
84
72
  videos?: Array<{
85
73
  url: string | URL;
86
74
  width?: number;
@@ -101,19 +89,7 @@ type Metadata = {
101
89
  siteId?: string;
102
90
  title?: string;
103
91
  description?: string;
104
- images?: string | URL | {
105
- url: string | URL;
106
- alt?: string;
107
- width?: number;
108
- height?: number;
109
- type?: string;
110
- } | Array<string | URL | {
111
- url: string | URL;
112
- alt?: string;
113
- width?: number;
114
- height?: number;
115
- type?: string;
116
- }>;
92
+ images?: string | URL | SocialImageDescriptor | Array<string | URL | SocialImageDescriptor>;
117
93
  creator?: string;
118
94
  creatorId?: string;
119
95
  players?: TwitterPlayerDescriptor | TwitterPlayerDescriptor[];
@@ -205,6 +181,13 @@ type TwitterAppDescriptor = {
205
181
  };
206
182
  name?: string;
207
183
  };
184
+ type SocialImageDescriptor = {
185
+ url: string | URL;
186
+ alt?: string;
187
+ width?: number;
188
+ height?: number;
189
+ type?: string;
190
+ };
208
191
  type IconDescriptor = {
209
192
  url: string | URL;
210
193
  sizes?: string;
@@ -284,11 +267,14 @@ declare function mergeMetadataEntries(entries: readonly MetadataMergeEntry[]): M
284
267
  * to an empty object (so `await parent` never throws).
285
268
  */
286
269
  declare function resolveModuleMetadata(mod: Record<string, unknown>, params?: Record<string, string | string[]>, searchParams?: Record<string, string | string[]>, parent?: Promise<Metadata>): Promise<Metadata | null>;
287
- declare function MetadataHead({
288
- metadata
289
- }: {
270
+ type MetadataHeadProps = {
290
271
  metadata: Metadata;
291
- }): _$react_jsx_runtime0.JSX.Element;
272
+ pathname?: string;
273
+ };
274
+ declare function MetadataHead({
275
+ metadata,
276
+ pathname
277
+ }: MetadataHeadProps): _$react_jsx_runtime0.JSX.Element;
292
278
  //#endregion
293
279
  export { DEFAULT_VIEWPORT, Metadata, MetadataHead, MetadataMergeEntry, Viewport, ViewportHead, mergeMetadata, mergeMetadataEntries, mergeViewport, postProcessMetadata, resolveModuleMetadata, resolveModuleViewport };
294
280
  //# sourceMappingURL=metadata.d.ts.map