vinext 0.0.51 → 0.0.53

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 (423) hide show
  1. package/README.md +1 -1
  2. package/dist/build/clean-output.d.ts +14 -0
  3. package/dist/build/clean-output.js +36 -0
  4. package/dist/build/clean-output.js.map +1 -0
  5. package/dist/build/precompress.d.ts +7 -7
  6. package/dist/build/precompress.js +18 -17
  7. package/dist/build/precompress.js.map +1 -1
  8. package/dist/build/prerender.d.ts +9 -16
  9. package/dist/build/prerender.js +88 -50
  10. package/dist/build/prerender.js.map +1 -1
  11. package/dist/build/run-prerender.js +10 -1
  12. package/dist/build/run-prerender.js.map +1 -1
  13. package/dist/build/static-export.d.ts +5 -0
  14. package/dist/build/static-export.js +8 -3
  15. package/dist/build/static-export.js.map +1 -1
  16. package/dist/check.js +4 -0
  17. package/dist/check.js.map +1 -1
  18. package/dist/cli-args.d.ts +1 -0
  19. package/dist/cli-args.js +5 -0
  20. package/dist/cli-args.js.map +1 -1
  21. package/dist/cli.js +58 -4
  22. package/dist/cli.js.map +1 -1
  23. package/dist/client/instrumentation-client-inject.d.ts +34 -0
  24. package/dist/client/instrumentation-client-inject.js +57 -0
  25. package/dist/client/instrumentation-client-inject.js.map +1 -0
  26. package/dist/client/navigation-runtime.d.ts +60 -0
  27. package/dist/client/navigation-runtime.js +171 -0
  28. package/dist/client/navigation-runtime.js.map +1 -0
  29. package/dist/client/pages-router-link-navigation.d.ts +26 -0
  30. package/dist/client/pages-router-link-navigation.js +14 -0
  31. package/dist/client/pages-router-link-navigation.js.map +1 -0
  32. package/dist/client/vinext-next-data.d.ts +14 -3
  33. package/dist/client/vinext-next-data.js +50 -1
  34. package/dist/client/vinext-next-data.js.map +1 -0
  35. package/dist/client/window-next.d.ts +10 -2
  36. package/dist/client/window-next.js.map +1 -1
  37. package/dist/cloudflare/kv-cache-handler.js +2 -1
  38. package/dist/cloudflare/kv-cache-handler.js.map +1 -1
  39. package/dist/cloudflare/tpr.js +1 -1
  40. package/dist/cloudflare/tpr.js.map +1 -1
  41. package/dist/config/config-matchers.d.ts +63 -16
  42. package/dist/config/config-matchers.js +145 -9
  43. package/dist/config/config-matchers.js.map +1 -1
  44. package/dist/config/next-config.d.ts +32 -5
  45. package/dist/config/next-config.js +55 -15
  46. package/dist/config/next-config.js.map +1 -1
  47. package/dist/deploy.js +130 -46
  48. package/dist/deploy.js.map +1 -1
  49. package/dist/entries/app-browser-entry.js +9 -3
  50. package/dist/entries/app-browser-entry.js.map +1 -1
  51. package/dist/entries/app-rsc-entry.d.ts +4 -2
  52. package/dist/entries/app-rsc-entry.js +76 -16
  53. package/dist/entries/app-rsc-entry.js.map +1 -1
  54. package/dist/entries/app-rsc-manifest.d.ts +1 -0
  55. package/dist/entries/app-rsc-manifest.js +53 -6
  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 +40 -3
  61. package/dist/entries/pages-client-entry.js.map +1 -1
  62. package/dist/entries/pages-server-entry.js +261 -31
  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 +161 -46
  68. package/dist/index.js.map +1 -1
  69. package/dist/plugins/css-data-url.d.ts +7 -0
  70. package/dist/plugins/css-data-url.js +81 -0
  71. package/dist/plugins/css-data-url.js.map +1 -0
  72. package/dist/plugins/fonts.js +30 -5
  73. package/dist/plugins/fonts.js.map +1 -1
  74. package/dist/plugins/middleware-server-only.d.ts +54 -0
  75. package/dist/plugins/middleware-server-only.js +91 -0
  76. package/dist/plugins/middleware-server-only.js.map +1 -0
  77. package/dist/plugins/optimize-imports.js +4 -4
  78. package/dist/plugins/optimize-imports.js.map +1 -1
  79. package/dist/plugins/strip-server-exports.js +5 -8
  80. package/dist/plugins/strip-server-exports.js.map +1 -1
  81. package/dist/routing/app-route-graph.d.ts +20 -1
  82. package/dist/routing/app-route-graph.js +58 -6
  83. package/dist/routing/app-route-graph.js.map +1 -1
  84. package/dist/routing/app-router.d.ts +2 -2
  85. package/dist/routing/app-router.js +2 -2
  86. package/dist/routing/app-router.js.map +1 -1
  87. package/dist/routing/route-trie.js +13 -18
  88. package/dist/routing/route-trie.js.map +1 -1
  89. package/dist/routing/utils.d.ts +12 -1
  90. package/dist/routing/utils.js +18 -1
  91. package/dist/routing/utils.js.map +1 -1
  92. package/dist/server/api-handler.js +153 -42
  93. package/dist/server/api-handler.js.map +1 -1
  94. package/dist/server/app-browser-action-result.d.ts +16 -1
  95. package/dist/server/app-browser-action-result.js +15 -1
  96. package/dist/server/app-browser-action-result.js.map +1 -1
  97. package/dist/server/app-browser-entry.js +309 -155
  98. package/dist/server/app-browser-entry.js.map +1 -1
  99. package/dist/server/app-browser-interception-context.d.ts +24 -0
  100. package/dist/server/app-browser-interception-context.js +32 -0
  101. package/dist/server/app-browser-interception-context.js.map +1 -0
  102. package/dist/server/app-browser-navigation-controller.d.ts +3 -1
  103. package/dist/server/app-browser-navigation-controller.js +5 -1
  104. package/dist/server/app-browser-navigation-controller.js.map +1 -1
  105. package/dist/server/app-browser-rsc-redirect.d.ts +2 -1
  106. package/dist/server/app-browser-rsc-redirect.js +2 -2
  107. package/dist/server/app-browser-rsc-redirect.js.map +1 -1
  108. package/dist/server/app-browser-state.d.ts +18 -1
  109. package/dist/server/app-browser-state.js +19 -1
  110. package/dist/server/app-browser-state.js.map +1 -1
  111. package/dist/server/app-browser-stream.d.ts +5 -14
  112. package/dist/server/app-browser-stream.js +13 -7
  113. package/dist/server/app-browser-stream.js.map +1 -1
  114. package/dist/server/app-browser-visible-commit.d.ts +2 -1
  115. package/dist/server/app-browser-visible-commit.js +1 -0
  116. package/dist/server/app-browser-visible-commit.js.map +1 -1
  117. package/dist/server/app-elements-wire.d.ts +10 -5
  118. package/dist/server/app-elements-wire.js +84 -2
  119. package/dist/server/app-elements-wire.js.map +1 -1
  120. package/dist/server/app-elements.d.ts +3 -2
  121. package/dist/server/app-elements.js +3 -2
  122. package/dist/server/app-elements.js.map +1 -1
  123. package/dist/server/app-fallback-renderer.d.ts +12 -3
  124. package/dist/server/app-fallback-renderer.js +15 -8
  125. package/dist/server/app-fallback-renderer.js.map +1 -1
  126. package/dist/server/app-history-state.js +6 -2
  127. package/dist/server/app-history-state.js.map +1 -1
  128. package/dist/server/app-interception-context-header.d.ts +33 -0
  129. package/dist/server/app-interception-context-header.js +44 -0
  130. package/dist/server/app-interception-context-header.js.map +1 -0
  131. package/dist/server/app-middleware.d.ts +13 -0
  132. package/dist/server/app-middleware.js +3 -1
  133. package/dist/server/app-middleware.js.map +1 -1
  134. package/dist/server/app-mounted-slots-header.d.ts +19 -0
  135. package/dist/server/app-mounted-slots-header.js +40 -1
  136. package/dist/server/app-mounted-slots-header.js.map +1 -1
  137. package/dist/server/app-optimistic-routing.d.ts +54 -0
  138. package/dist/server/app-optimistic-routing.js +208 -0
  139. package/dist/server/app-optimistic-routing.js.map +1 -0
  140. package/dist/server/app-page-boundary-render.d.ts +1 -0
  141. package/dist/server/app-page-boundary-render.js +2 -0
  142. package/dist/server/app-page-boundary-render.js.map +1 -1
  143. package/dist/server/app-page-boundary.d.ts +1 -0
  144. package/dist/server/app-page-boundary.js +2 -0
  145. package/dist/server/app-page-boundary.js.map +1 -1
  146. package/dist/server/app-page-cache.d.ts +15 -1
  147. package/dist/server/app-page-cache.js +68 -7
  148. package/dist/server/app-page-cache.js.map +1 -1
  149. package/dist/server/app-page-dispatch.d.ts +5 -0
  150. package/dist/server/app-page-dispatch.js +39 -5
  151. package/dist/server/app-page-dispatch.js.map +1 -1
  152. package/dist/server/app-page-element-builder.d.ts +2 -1
  153. package/dist/server/app-page-element-builder.js +7 -3
  154. package/dist/server/app-page-element-builder.js.map +1 -1
  155. package/dist/server/app-page-execution.d.ts +29 -1
  156. package/dist/server/app-page-execution.js +91 -4
  157. package/dist/server/app-page-execution.js.map +1 -1
  158. package/dist/server/app-page-head.d.ts +1 -0
  159. package/dist/server/app-page-head.js +29 -2
  160. package/dist/server/app-page-head.js.map +1 -1
  161. package/dist/server/app-page-probe.js +1 -1
  162. package/dist/server/app-page-render-observation.js +1 -1
  163. package/dist/server/app-page-render.d.ts +3 -0
  164. package/dist/server/app-page-render.js +7 -3
  165. package/dist/server/app-page-render.js.map +1 -1
  166. package/dist/server/app-page-response.d.ts +11 -1
  167. package/dist/server/app-page-response.js +18 -5
  168. package/dist/server/app-page-response.js.map +1 -1
  169. package/dist/server/app-page-route-wiring.d.ts +1 -0
  170. package/dist/server/app-page-route-wiring.js +35 -15
  171. package/dist/server/app-page-route-wiring.js.map +1 -1
  172. package/dist/server/app-page-stream.d.ts +4 -0
  173. package/dist/server/app-page-stream.js +3 -0
  174. package/dist/server/app-page-stream.js.map +1 -1
  175. package/dist/server/app-prerender-static-params.d.ts +2 -1
  176. package/dist/server/app-prerender-static-params.js +44 -8
  177. package/dist/server/app-prerender-static-params.js.map +1 -1
  178. package/dist/server/app-route-handler-cache.d.ts +2 -2
  179. package/dist/server/app-route-handler-cache.js +3 -2
  180. package/dist/server/app-route-handler-cache.js.map +1 -1
  181. package/dist/server/app-route-handler-dispatch.d.ts +7 -1
  182. package/dist/server/app-route-handler-dispatch.js +4 -1
  183. package/dist/server/app-route-handler-dispatch.js.map +1 -1
  184. package/dist/server/app-route-handler-execution.d.ts +18 -2
  185. package/dist/server/app-route-handler-execution.js +1 -0
  186. package/dist/server/app-route-handler-execution.js.map +1 -1
  187. package/dist/server/app-route-handler-response.js +6 -5
  188. package/dist/server/app-route-handler-response.js.map +1 -1
  189. package/dist/server/app-router-entry.js +6 -2
  190. package/dist/server/app-router-entry.js.map +1 -1
  191. package/dist/server/app-rsc-handler.d.ts +11 -1
  192. package/dist/server/app-rsc-handler.js +48 -21
  193. package/dist/server/app-rsc-handler.js.map +1 -1
  194. package/dist/server/app-rsc-render-mode.d.ts +4 -3
  195. package/dist/server/app-rsc-render-mode.js +7 -1
  196. package/dist/server/app-rsc-render-mode.js.map +1 -1
  197. package/dist/server/app-rsc-request-normalization.d.ts +4 -1
  198. package/dist/server/app-rsc-request-normalization.js +6 -2
  199. package/dist/server/app-rsc-request-normalization.js.map +1 -1
  200. package/dist/server/app-rsc-response-finalizer.d.ts +8 -1
  201. package/dist/server/app-rsc-response-finalizer.js +10 -3
  202. package/dist/server/app-rsc-response-finalizer.js.map +1 -1
  203. package/dist/server/app-rsc-route-matching.js +2 -2
  204. package/dist/server/app-rsc-route-matching.js.map +1 -1
  205. package/dist/server/app-segment-config.d.ts +4 -1
  206. package/dist/server/app-segment-config.js +6 -1
  207. package/dist/server/app-segment-config.js.map +1 -1
  208. package/dist/server/app-server-action-execution.d.ts +1 -0
  209. package/dist/server/app-server-action-execution.js +5 -1
  210. package/dist/server/app-server-action-execution.js.map +1 -1
  211. package/dist/server/app-ssr-entry.d.ts +2 -0
  212. package/dist/server/app-ssr-entry.js +92 -55
  213. package/dist/server/app-ssr-entry.js.map +1 -1
  214. package/dist/server/app-ssr-stream.d.ts +30 -2
  215. package/dist/server/app-ssr-stream.js +95 -8
  216. package/dist/server/app-ssr-stream.js.map +1 -1
  217. package/dist/server/app-static-generation.d.ts +1 -0
  218. package/dist/server/app-static-generation.js +2 -1
  219. package/dist/server/app-static-generation.js.map +1 -1
  220. package/dist/server/artifact-compatibility.d.ts +1 -1
  221. package/dist/server/artifact-compatibility.js.map +1 -1
  222. package/dist/server/cache-headers.d.ts +7 -0
  223. package/dist/server/cache-headers.js +19 -0
  224. package/dist/server/cache-headers.js.map +1 -0
  225. package/dist/server/cache-proof.d.ts +49 -3
  226. package/dist/server/cache-proof.js +78 -22
  227. package/dist/server/cache-proof.js.map +1 -1
  228. package/dist/server/client-reuse-manifest.d.ts +99 -0
  229. package/dist/server/client-reuse-manifest.js +212 -0
  230. package/dist/server/client-reuse-manifest.js.map +1 -0
  231. package/dist/server/default-global-error-module.d.ts +20 -0
  232. package/dist/server/default-global-error-module.js +20 -0
  233. package/dist/server/default-global-error-module.js.map +1 -0
  234. package/dist/server/default-not-found-module.d.ts +20 -0
  235. package/dist/server/default-not-found-module.js +20 -0
  236. package/dist/server/default-not-found-module.js.map +1 -0
  237. package/dist/server/dev-server.d.ts +10 -2
  238. package/dist/server/dev-server.js +99 -36
  239. package/dist/server/dev-server.js.map +1 -1
  240. package/dist/server/edge-api-runtime.d.ts +5 -0
  241. package/dist/server/edge-api-runtime.js +8 -0
  242. package/dist/server/edge-api-runtime.js.map +1 -0
  243. package/dist/server/headers.d.ts +22 -1
  244. package/dist/server/headers.js +22 -1
  245. package/dist/server/headers.js.map +1 -1
  246. package/dist/server/http-error-responses.d.ts +16 -1
  247. package/dist/server/http-error-responses.js +21 -1
  248. package/dist/server/http-error-responses.js.map +1 -1
  249. package/dist/server/image-optimization.d.ts +13 -4
  250. package/dist/server/image-optimization.js +15 -4
  251. package/dist/server/image-optimization.js.map +1 -1
  252. package/dist/server/isr-cache.d.ts +6 -2
  253. package/dist/server/isr-cache.js +20 -4
  254. package/dist/server/isr-cache.js.map +1 -1
  255. package/dist/server/middleware-runtime.d.ts +15 -0
  256. package/dist/server/middleware-runtime.js +59 -7
  257. package/dist/server/middleware-runtime.js.map +1 -1
  258. package/dist/server/middleware.d.ts +1 -1
  259. package/dist/server/middleware.js +5 -3
  260. package/dist/server/middleware.js.map +1 -1
  261. package/dist/server/navigation-planner.d.ts +9 -3
  262. package/dist/server/navigation-planner.js +98 -25
  263. package/dist/server/navigation-planner.js.map +1 -1
  264. package/dist/server/navigation-trace.d.ts +2 -1
  265. package/dist/server/navigation-trace.js +1 -0
  266. package/dist/server/navigation-trace.js.map +1 -1
  267. package/dist/server/pages-api-route.d.ts +45 -1
  268. package/dist/server/pages-api-route.js +27 -4
  269. package/dist/server/pages-api-route.js.map +1 -1
  270. package/dist/server/pages-body-parser-config.d.ts +60 -0
  271. package/dist/server/pages-body-parser-config.js +79 -0
  272. package/dist/server/pages-body-parser-config.js.map +1 -0
  273. package/dist/server/pages-data-route.d.ts +77 -0
  274. package/dist/server/pages-data-route.js +98 -0
  275. package/dist/server/pages-data-route.js.map +1 -0
  276. package/dist/server/pages-default-404.d.ts +31 -0
  277. package/dist/server/pages-default-404.js +40 -0
  278. package/dist/server/pages-default-404.js.map +1 -0
  279. package/dist/server/pages-i18n.d.ts +51 -1
  280. package/dist/server/pages-i18n.js +61 -1
  281. package/dist/server/pages-i18n.js.map +1 -1
  282. package/dist/server/pages-node-compat.d.ts +10 -0
  283. package/dist/server/pages-node-compat.js +12 -1
  284. package/dist/server/pages-node-compat.js.map +1 -1
  285. package/dist/server/pages-page-data.d.ts +69 -2
  286. package/dist/server/pages-page-data.js +47 -31
  287. package/dist/server/pages-page-data.js.map +1 -1
  288. package/dist/server/pages-page-response.d.ts +13 -1
  289. package/dist/server/pages-page-response.js +16 -11
  290. package/dist/server/pages-page-response.js.map +1 -1
  291. package/dist/server/prerender-route-params.d.ts +14 -0
  292. package/dist/server/prerender-route-params.js +94 -0
  293. package/dist/server/prerender-route-params.js.map +1 -0
  294. package/dist/server/prod-server.d.ts +15 -37
  295. package/dist/server/prod-server.js +143 -107
  296. package/dist/server/prod-server.js.map +1 -1
  297. package/dist/server/proxy-trust.d.ts +41 -0
  298. package/dist/server/proxy-trust.js +70 -0
  299. package/dist/server/proxy-trust.js.map +1 -0
  300. package/dist/server/request-pipeline.d.ts +13 -4
  301. package/dist/server/request-pipeline.js +32 -14
  302. package/dist/server/request-pipeline.js.map +1 -1
  303. package/dist/server/seed-cache.d.ts +12 -31
  304. package/dist/server/seed-cache.js +30 -37
  305. package/dist/server/seed-cache.js.map +1 -1
  306. package/dist/server/server-action-not-found.js +8 -3
  307. package/dist/server/server-action-not-found.js.map +1 -1
  308. package/dist/server/skip-cache-proof.d.ts +41 -0
  309. package/dist/server/skip-cache-proof.js +101 -0
  310. package/dist/server/skip-cache-proof.js.map +1 -0
  311. package/dist/server/static-file-cache.d.ts +1 -1
  312. package/dist/server/static-file-cache.js +8 -7
  313. package/dist/server/static-file-cache.js.map +1 -1
  314. package/dist/server/streaming-metadata.d.ts +5 -0
  315. package/dist/server/streaming-metadata.js +10 -0
  316. package/dist/server/streaming-metadata.js.map +1 -0
  317. package/dist/shims/app-router-scroll-state.d.ts +12 -0
  318. package/dist/shims/app-router-scroll-state.js +38 -0
  319. package/dist/shims/app-router-scroll-state.js.map +1 -0
  320. package/dist/shims/app-router-scroll.d.ts +14 -0
  321. package/dist/shims/app-router-scroll.js +100 -0
  322. package/dist/shims/app-router-scroll.js.map +1 -0
  323. package/dist/shims/before-interactive-context.d.ts +30 -0
  324. package/dist/shims/before-interactive-context.js +10 -0
  325. package/dist/shims/before-interactive-context.js.map +1 -0
  326. package/dist/shims/cache-runtime.d.ts +1 -1
  327. package/dist/shims/cache-runtime.js +14 -1
  328. package/dist/shims/cache-runtime.js.map +1 -1
  329. package/dist/shims/client-locale.d.ts +15 -0
  330. package/dist/shims/client-locale.js +13 -0
  331. package/dist/shims/client-locale.js.map +1 -0
  332. package/dist/shims/default-global-error.d.ts +32 -0
  333. package/dist/shims/default-global-error.js +181 -0
  334. package/dist/shims/default-global-error.js.map +1 -0
  335. package/dist/shims/default-not-found.d.ts +12 -0
  336. package/dist/shims/default-not-found.js +61 -0
  337. package/dist/shims/default-not-found.js.map +1 -0
  338. package/dist/shims/document.d.ts +59 -3
  339. package/dist/shims/document.js +36 -5
  340. package/dist/shims/document.js.map +1 -1
  341. package/dist/shims/error-boundary.d.ts +2 -2
  342. package/dist/shims/font-local.d.ts +5 -0
  343. package/dist/shims/font-local.js +6 -2
  344. package/dist/shims/font-local.js.map +1 -1
  345. package/dist/shims/form.js +13 -6
  346. package/dist/shims/form.js.map +1 -1
  347. package/dist/shims/head.js +4 -4
  348. package/dist/shims/head.js.map +1 -1
  349. package/dist/shims/headers.d.ts +6 -2
  350. package/dist/shims/headers.js +64 -21
  351. package/dist/shims/headers.js.map +1 -1
  352. package/dist/shims/image.d.ts +1 -1
  353. package/dist/shims/image.js +4 -4
  354. package/dist/shims/image.js.map +1 -1
  355. package/dist/shims/internal/pages-data-target.d.ts +58 -0
  356. package/dist/shims/internal/pages-data-target.js +91 -0
  357. package/dist/shims/internal/pages-data-target.js.map +1 -0
  358. package/dist/shims/internal/pages-data-url.d.ts +42 -0
  359. package/dist/shims/internal/pages-data-url.js +73 -0
  360. package/dist/shims/internal/pages-data-url.js.map +1 -0
  361. package/dist/shims/link.d.ts +21 -3
  362. package/dist/shims/link.js +189 -30
  363. package/dist/shims/link.js.map +1 -1
  364. package/dist/shims/metadata.d.ts +2 -1
  365. package/dist/shims/metadata.js +65 -6
  366. package/dist/shims/metadata.js.map +1 -1
  367. package/dist/shims/navigation.d.ts +8 -2
  368. package/dist/shims/navigation.js +67 -23
  369. package/dist/shims/navigation.js.map +1 -1
  370. package/dist/shims/og.d.ts +18 -2
  371. package/dist/shims/og.js +49 -1
  372. package/dist/shims/og.js.map +1 -0
  373. package/dist/shims/request-state-types.d.ts +1 -1
  374. package/dist/shims/root-params.d.ts +3 -1
  375. package/dist/shims/root-params.js +11 -3
  376. package/dist/shims/root-params.js.map +1 -1
  377. package/dist/shims/router-state.d.ts +1 -0
  378. package/dist/shims/router-state.js.map +1 -1
  379. package/dist/shims/router.d.ts +12 -5
  380. package/dist/shims/router.js +535 -86
  381. package/dist/shims/router.js.map +1 -1
  382. package/dist/shims/script.js +86 -12
  383. package/dist/shims/script.js.map +1 -1
  384. package/dist/shims/server.d.ts +21 -4
  385. package/dist/shims/server.js +30 -9
  386. package/dist/shims/server.js.map +1 -1
  387. package/dist/shims/slot.js +5 -1
  388. package/dist/shims/slot.js.map +1 -1
  389. package/dist/shims/unified-request-context.d.ts +1 -1
  390. package/dist/shims/url-safety.d.ts +23 -1
  391. package/dist/shims/url-safety.js +29 -2
  392. package/dist/shims/url-safety.js.map +1 -1
  393. package/dist/shims/url-utils.d.ts +2 -1
  394. package/dist/shims/url-utils.js +15 -4
  395. package/dist/shims/url-utils.js.map +1 -1
  396. package/dist/typegen.d.ts +10 -0
  397. package/dist/typegen.js +242 -0
  398. package/dist/typegen.js.map +1 -0
  399. package/dist/utils/asset-prefix.d.ts +33 -5
  400. package/dist/utils/asset-prefix.js +39 -6
  401. package/dist/utils/asset-prefix.js.map +1 -1
  402. package/dist/utils/cache-control-metadata.d.ts +2 -1
  403. package/dist/utils/cache-control-metadata.js +1 -3
  404. package/dist/utils/cache-control-metadata.js.map +1 -1
  405. package/dist/utils/domain-locale.d.ts +2 -1
  406. package/dist/utils/domain-locale.js +9 -1
  407. package/dist/utils/domain-locale.js.map +1 -1
  408. package/dist/utils/html-limited-bots.d.ts +5 -0
  409. package/dist/utils/html-limited-bots.js +15 -0
  410. package/dist/utils/html-limited-bots.js.map +1 -0
  411. package/dist/utils/lazy-chunks.d.ts +1 -1
  412. package/dist/utils/lazy-chunks.js +1 -1
  413. package/dist/utils/lazy-chunks.js.map +1 -1
  414. package/dist/utils/prerender-output-paths.d.ts +15 -0
  415. package/dist/utils/prerender-output-paths.js +24 -0
  416. package/dist/utils/prerender-output-paths.js.map +1 -0
  417. package/dist/utils/query.d.ts +23 -1
  418. package/dist/utils/query.js +46 -2
  419. package/dist/utils/query.js.map +1 -1
  420. package/dist/utils/record.d.ts +5 -0
  421. package/dist/utils/record.js +8 -0
  422. package/dist/utils/record.js.map +1 -0
  423. package/package.json +11 -3
@@ -2,14 +2,19 @@
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 { isAbsoluteOrProtocolRelativeUrl, normalizePathTrailingSlash, 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";
9
7
  import { AppElementsWire } from "../server/app-elements-wire.js";
8
+ import { APP_RSC_RENDER_MODE_PREFETCH_LOADING_SHELL } from "../server/app-rsc-render-mode.js";
9
+ import { addLocalePrefix, getDomainLocaleUrl } from "../utils/domain-locale.js";
10
+ import { prefetchPagesData, resolvePagesDataNavigationTarget } from "./internal/pages-data-target.js";
11
+ import { isAbsoluteOrProtocolRelativeUrl, normalizePathTrailingSlash, resolveRelativeHref, toBrowserNavigationHref, toSameOriginAppPath, withBasePath } from "./url-utils.js";
12
+ import { getCurrentBrowserLocale } from "./client-locale.js";
13
+ import { getNavigationRuntime, hasAppNavigationRuntime, registerNavigationRuntimeFunctions } from "../client/navigation-runtime.js";
10
14
  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";
15
+ import { createRscRequestHeaders, createRscRequestUrl, stripRscCacheBustingSearchParam, stripRscSuffix } from "../server/app-rsc-cache-busting.js";
16
+ import { getMountedSlotsHeader, getPrefetchCache, getPrefetchInterceptionContext, getPrefetchedUrls, navigateClientSide, prefetchRscResponse } from "./navigation.js";
17
+ import { navigatePagesRouterLink } from "../client/pages-router-link-navigation.js";
13
18
  import { getI18nContext } from "./i18n-context.js";
14
19
  import { canLinkIntentPrefetch, canLinkPrefetch, getLinkPrefetchHref } from "./link-prefetch.js";
15
20
  import React, { createContext, forwardRef, useCallback, useContext, useEffect, useRef, useState } from "react";
@@ -45,6 +50,50 @@ function resolveHref(href) {
45
50
  }
46
51
  return url;
47
52
  }
53
+ /**
54
+ * Collapse repeated forward-slashes (and convert backslashes to forward-slashes)
55
+ * in the path portion of a URL, preserving any query string.
56
+ *
57
+ * Ported from Next.js: packages/next/src/shared/lib/utils/normalize-repeated-slashes.ts
58
+ * https://github.com/vercel/next.js/blob/canary/packages/next/src/shared/lib/utils/normalize-repeated-slashes.ts
59
+ */
60
+ function normalizeRepeatedSlashes(url) {
61
+ const urlParts = url.split("?");
62
+ const urlNoQueryString = urlParts.shift() ?? "";
63
+ const queryString = urlParts.join("?");
64
+ return urlNoQueryString.replace(/\\/g, "/").replace(/\/\/+/g, "/") + (queryString ? `?${queryString}` : "");
65
+ }
66
+ /**
67
+ * Emit Next.js's "Invalid href" `console.error` when `href` contains repeated
68
+ * forward slashes or backslashes in its path portion, and return the
69
+ * normalized URL (with `\\` converted to `/` and runs of `/` collapsed). If
70
+ * the href is already well-formed, the original string is returned unchanged.
71
+ *
72
+ * Ported from Next.js: packages/next/src/client/resolve-href.ts
73
+ * https://github.com/vercel/next.js/blob/canary/packages/next/src/client/resolve-href.ts
74
+ *
75
+ * Matches the message asserted by:
76
+ * test/e2e/repeated-forward-slashes-error/repeated-forward-slashes-error.test.ts
77
+ *
78
+ * Note: Next.js fires this warning unconditionally on every call to
79
+ * `resolveHref`. We mirror that behaviour (no dedup) for exact parity.
80
+ *
81
+ * Note: Next.js uses `router.pathname` (the route pattern, e.g.
82
+ * `/posts/[id]`) for the "in page" segment of the message. We do not have
83
+ * cheap access to the route pattern from inside the Link shim, so we
84
+ * fall back to `window.location.pathname` (or `"/"` during SSR). The text
85
+ * is cosmetic and is not asserted by the Next.js compat test.
86
+ */
87
+ function warnAndNormalizeRepeatedSlashesInHref(urlAsString) {
88
+ if (urlAsString.startsWith("//")) return urlAsString;
89
+ const urlProtoMatch = urlAsString.match(/^[a-z][a-z0-9+.-]*:\/\//i);
90
+ const urlAsStringNoProto = urlProtoMatch ? urlAsString.slice(urlProtoMatch[0].length) : urlAsString;
91
+ if (!(urlAsStringNoProto.split("?", 1)[0] || "").match(/(\/\/|\\)/)) return urlAsString;
92
+ const pathname = typeof window !== "undefined" && window.location ? window.location.pathname : "/";
93
+ console.error(`Invalid href '${urlAsString}' passed to next/router in page: '${pathname}'. Repeated forward-slashes (//) or backslashes \\ are not valid in the href.`);
94
+ const normalizedNoProto = normalizeRepeatedSlashes(urlAsStringNoProto);
95
+ return (urlProtoMatch ? urlProtoMatch[0] : "") + normalizedNoProto;
96
+ }
48
97
  function resolveLinkPrefetchMode(prefetchProp, isDangerous) {
49
98
  if (isDangerous || prefetchProp === false) return "disabled";
50
99
  if (prefetchProp === true) return "full";
@@ -62,7 +111,7 @@ function toSameOriginRouteHref(href) {
62
111
  return `${stripBasePath(url.pathname, __basePath)}${url.search}`;
63
112
  }
64
113
  function getLinkPrefetchRouterMode() {
65
- return typeof window !== "undefined" && typeof window.__VINEXT_RSC_NAVIGATE__ === "function" ? "app" : "pages";
114
+ return hasAppNavigationRuntime() ? "app" : "pages";
66
115
  }
67
116
  function canAutoPrefetchFullAppRoute(href) {
68
117
  if (typeof window === "undefined") return false;
@@ -74,6 +123,31 @@ function canAutoPrefetchFullAppRoute(href) {
74
123
  if (!match) return false;
75
124
  return !match.route.isDynamic;
76
125
  }
126
+ function resolveAutoAppRoutePrefetch(href) {
127
+ if (typeof window === "undefined") return {
128
+ cacheForNavigation: false,
129
+ shouldPrefetch: false
130
+ };
131
+ const routes = window.__VINEXT_LINK_PREFETCH_ROUTES__;
132
+ if (!routes) return {
133
+ cacheForNavigation: false,
134
+ shouldPrefetch: false
135
+ };
136
+ const routeHref = toSameOriginRouteHref(href);
137
+ if (routeHref === null) return {
138
+ cacheForNavigation: false,
139
+ shouldPrefetch: false
140
+ };
141
+ const match = matchRouteWithTrie(routeHref, routes, linkPrefetchRouteTrieCache);
142
+ if (!match) return {
143
+ cacheForNavigation: false,
144
+ shouldPrefetch: false
145
+ };
146
+ return {
147
+ cacheForNavigation: !match.route.isDynamic,
148
+ shouldPrefetch: !match.route.isDynamic || match.route.canPrefetchLoadingShell
149
+ };
150
+ }
77
151
  /**
78
152
  * Prefetch a URL for faster navigation.
79
153
  *
@@ -95,35 +169,78 @@ function prefetchUrl(href, mode, priority = "low") {
95
169
  const fullHref = toBrowserNavigationHref(prefetchHref, window.location.href, __basePath);
96
170
  (window.requestIdleCallback ?? ((fn) => setTimeout(fn, 100)))(() => {
97
171
  (async () => {
98
- if (typeof window.__VINEXT_RSC_NAVIGATE__ === "function") {
99
- if (mode === "auto" && !canAutoPrefetchFullAppRoute(prefetchHref)) return;
100
- const interceptionContext = getCurrentInterceptionContext();
172
+ if (hasAppNavigationRuntime()) {
173
+ const autoPrefetch = mode === "auto" ? resolveAutoAppRoutePrefetch(prefetchHref) : {
174
+ cacheForNavigation: true,
175
+ shouldPrefetch: true
176
+ };
177
+ if (!autoPrefetch.shouldPrefetch) return;
178
+ const interceptionContext = getPrefetchInterceptionContext(fullHref);
101
179
  const mountedSlotsHeader = getMountedSlotsHeader();
102
- const headers = createRscRequestHeaders({ interceptionContext });
180
+ const isOptimisticRouteShellPrefetch = !autoPrefetch.cacheForNavigation;
181
+ if (isOptimisticRouteShellPrefetch && interceptionContext !== null) return;
182
+ const headers = createRscRequestHeaders({
183
+ interceptionContext,
184
+ renderMode: isOptimisticRouteShellPrefetch ? APP_RSC_RENDER_MODE_PREFETCH_LOADING_SHELL : void 0
185
+ });
103
186
  if (mountedSlotsHeader) headers.set(VINEXT_MOUNTED_SLOTS_HEADER, mountedSlotsHeader);
104
187
  const rscUrl = await createRscRequestUrl(fullHref, headers);
105
188
  const cacheKey = AppElementsWire.encodeCacheKey(rscUrl, interceptionContext);
106
189
  const prefetched = getPrefetchedUrls();
107
- if (prefetched.has(cacheKey)) return;
190
+ if (prefetched.has(cacheKey)) {
191
+ if (autoPrefetch.cacheForNavigation) {
192
+ const existing = getPrefetchCache().get(cacheKey);
193
+ if (existing?.cacheForNavigation === false) existing.cacheForNavigation = true;
194
+ }
195
+ return;
196
+ }
108
197
  prefetched.add(cacheKey);
109
198
  prefetchRscResponse(rscUrl, fetch(rscUrl, {
110
199
  headers,
111
200
  credentials: "include",
112
201
  priority,
113
202
  purpose: "prefetch"
114
- }), interceptionContext, mountedSlotsHeader);
115
- } else if (window.__NEXT_DATA__?.__vinext?.pageModuleUrl) {
116
- const link = document.createElement("link");
117
- link.rel = "prefetch";
118
- link.href = fullHref;
119
- link.as = "document";
120
- document.head.appendChild(link);
203
+ }), interceptionContext, mountedSlotsHeader, void 0, {
204
+ cacheForNavigation: autoPrefetch.cacheForNavigation,
205
+ optimisticRouteShell: isOptimisticRouteShellPrefetch
206
+ });
207
+ } else if (window.__NEXT_DATA__) {
208
+ const dataTarget = resolvePagesDataNavigationTarget(fullHref, __basePath);
209
+ if (dataTarget) prefetchPagesData(dataTarget);
210
+ else {
211
+ const link = document.createElement("link");
212
+ link.rel = "prefetch";
213
+ link.href = fullHref;
214
+ link.as = "document";
215
+ document.head.appendChild(link);
216
+ }
121
217
  }
122
218
  })().catch((error) => {
123
219
  console.error("[vinext] RSC prefetch setup error:", error);
124
220
  });
125
221
  });
126
222
  }
223
+ function promotePrefetchEntriesForNavigation(href) {
224
+ if (typeof window === "undefined") return;
225
+ let target;
226
+ try {
227
+ target = new URL(toBrowserNavigationHref(href, window.location.href, __basePath), window.location.href);
228
+ } catch {
229
+ return;
230
+ }
231
+ for (const [cacheKey, entry] of getPrefetchCache()) {
232
+ if (entry.optimisticRouteShell === true) continue;
233
+ const [rscUrl] = cacheKey.split("\0", 1);
234
+ let cached;
235
+ try {
236
+ cached = new URL(rscUrl, window.location.href);
237
+ } catch {
238
+ continue;
239
+ }
240
+ stripRscCacheBustingSearchParam(cached);
241
+ if (stripRscSuffix(cached.pathname) === target.pathname && cached.search === target.search) entry.cacheForNavigation = true;
242
+ }
243
+ }
127
244
  /**
128
245
  * Shared IntersectionObserver for viewport-based prefetching.
129
246
  * All Link elements use the same observer to minimize resource usage.
@@ -142,7 +259,7 @@ function setVisibleLinkPrefetch(instance, isVisible) {
142
259
  }
143
260
  function registerVisibleLinkPing() {
144
261
  if (typeof window === "undefined") return;
145
- window.__VINEXT_PING_VISIBLE_LINKS__ = pingVisibleLinkPrefetches;
262
+ registerNavigationRuntimeFunctions({ pingVisibleLinks: pingVisibleLinkPrefetches });
146
263
  }
147
264
  function pingVisibleLinkPrefetches() {
148
265
  for (const instance of visibleLinkPrefetches) if (instance.isVisible && instance.routerMode === "app") prefetchUrl(instance.href, instance.mode, "low");
@@ -163,6 +280,14 @@ function getDefaultLocale() {
163
280
  if (typeof window !== "undefined") return window.__VINEXT_DEFAULT_LOCALE__;
164
281
  return getI18nContext()?.defaultLocale;
165
282
  }
283
+ function getCurrentLocale() {
284
+ if (typeof window !== "undefined") return getCurrentBrowserLocale({
285
+ basePath: __basePath,
286
+ domainLocales: getDomainLocales(),
287
+ hostname: getCurrentHostname()
288
+ });
289
+ return getI18nContext()?.locale;
290
+ }
166
291
  function getDomainLocales() {
167
292
  if (typeof window !== "undefined") return window.__NEXT_DATA__?.domainLocales;
168
293
  return getI18nContext()?.domainLocales;
@@ -178,6 +303,17 @@ function getDomainLocaleHref(href, locale) {
178
303
  domainItems: getDomainLocales()
179
304
  });
180
305
  }
306
+ function addLocalePrefixForRoot(href, locale) {
307
+ if (href !== "/" && !href.startsWith("/?") && !href.startsWith("/#")) return;
308
+ let parsed;
309
+ try {
310
+ parsed = new URL(href, "http://vinext.local");
311
+ } catch {
312
+ return;
313
+ }
314
+ if (parsed.origin !== "http://vinext.local" || parsed.pathname !== "/") return;
315
+ return `/${locale}${parsed.search}${parsed.hash}`;
316
+ }
181
317
  /**
182
318
  * Apply locale prefix to a URL path based on the locale prop.
183
319
  * - locale="fr" → prepend /fr (unless it already has a locale prefix)
@@ -186,15 +322,22 @@ function getDomainLocaleHref(href, locale) {
186
322
  */
187
323
  function applyLocaleToHref(href, locale) {
188
324
  if (locale === false) return href;
189
- if (locale === void 0) return href;
325
+ const resolvedLocale = locale ?? getCurrentLocale();
326
+ if (resolvedLocale === void 0) return href;
190
327
  if (isAbsoluteOrProtocolRelativeUrl(href)) return href;
191
- const domainLocaleHref = getDomainLocaleHref(href, locale);
328
+ const domainLocaleHref = getDomainLocaleHref(href, resolvedLocale);
192
329
  if (domainLocaleHref) return domainLocaleHref;
193
- return addLocalePrefix(href, locale, getDefaultLocale() ?? "");
330
+ const defaultLocale = getDefaultLocale() ?? "";
331
+ if (resolvedLocale.toLowerCase() === defaultLocale.toLowerCase()) {
332
+ const localeRootHref = addLocalePrefixForRoot(href, resolvedLocale);
333
+ if (localeRootHref) return localeRootHref;
334
+ }
335
+ return addLocalePrefix(href, resolvedLocale, defaultLocale);
194
336
  }
195
- const Link = forwardRef(function Link({ href, as, replace = false, prefetch: prefetchProp, scroll = true, children, onClick, onMouseEnter, onTouchStart, onNavigate, unstable_dynamicOnHover = false, ...rest }, forwardedRef) {
337
+ 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) {
196
338
  const { locale, ...restWithoutLocale } = rest;
197
- const resolvedHref = as ?? resolveHref(href);
339
+ const rawResolvedHref = as ?? resolveHref(href);
340
+ const resolvedHref = typeof rawResolvedHref === "string" ? warnAndNormalizeRepeatedSlashesInHref(rawResolvedHref) : rawResolvedHref;
198
341
  const isDangerous = typeof resolvedHref === "string" && isDangerousScheme(resolvedHref);
199
342
  const normalizedHref = normalizePathTrailingSlash(applyLocaleToHref(isDangerous ? "/" : resolvedHref, locale), __trailingSlash);
200
343
  const fullHref = normalizePathTrailingSlash(withBasePath(normalizedHref, __basePath), __trailingSlash);
@@ -261,6 +404,7 @@ const Link = forwardRef(function Link({ href, as, replace = false, prefetch: pre
261
404
  if (unstable_dynamicOnHover && internalRef.current) {
262
405
  const instance = observedLinkPrefetches.get(internalRef.current);
263
406
  if (instance) instance.mode = "full";
407
+ promotePrefetchEntriesForNavigation(normalizedHref);
264
408
  }
265
409
  prefetchUrl(normalizedHref, intentMode, "high");
266
410
  }, [
@@ -287,7 +431,13 @@ const Link = forwardRef(function Link({ href, as, replace = false, prefetch: pre
287
431
  let navigateHref = normalizedHref;
288
432
  if (isAbsoluteOrProtocolRelativeUrl(resolvedHref)) {
289
433
  const localPath = toSameOriginAppPath(resolvedHref, __basePath);
290
- if (localPath == null) return;
434
+ if (localPath == null) {
435
+ if (replace) {
436
+ e.preventDefault();
437
+ window.location.replace(resolvedHref);
438
+ }
439
+ return;
440
+ }
291
441
  navigateHref = localPath;
292
442
  }
293
443
  e.preventDefault();
@@ -308,7 +458,7 @@ const Link = forwardRef(function Link({ href, as, replace = false, prefetch: pre
308
458
  onNavigate(navEvent);
309
459
  if (navEvent.defaultPrevented) return;
310
460
  } catch {}
311
- if (typeof window.__VINEXT_RSC_NAVIGATE__ === "function") {
461
+ if (getNavigationRuntime()?.functions.navigate) {
312
462
  setPending(true);
313
463
  React.startTransition(() => {
314
464
  navigateClientSide(navigateHref, replace ? "replace" : "push", scroll, true).finally(() => {
@@ -318,8 +468,13 @@ const Link = forwardRef(function Link({ href, as, replace = false, prefetch: pre
318
468
  return;
319
469
  } else try {
320
470
  const Router = (await import("next/router.js")).default;
321
- if (replace) await Router.replace(absoluteHref, void 0, { scroll });
322
- else await Router.push(absoluteHref, void 0, { scroll });
471
+ await navigatePagesRouterLink(Router, {
472
+ href: absoluteHref,
473
+ replace,
474
+ scroll,
475
+ shallow,
476
+ locale
477
+ });
323
478
  } catch {
324
479
  if (replace) window.history.replaceState({}, "", absoluteFullHref);
325
480
  else window.history.pushState({}, "", absoluteFullHref);
@@ -330,11 +485,15 @@ const Link = forwardRef(function Link({ href, as, replace = false, prefetch: pre
330
485
  const linkStatusValue = React.useMemo(() => ({ pending }), [pending]);
331
486
  if (isDangerous) {
332
487
  if (process.env.NODE_ENV !== "production") console.warn(`<Link> blocked dangerous href: ${resolvedHref}`);
488
+ const handleDangerousClick = (event) => {
489
+ if (onClick) onClick(event);
490
+ reportBlockedDangerousNavigation();
491
+ };
333
492
  return /* @__PURE__ */ jsx(LinkStatusContext.Provider, {
334
493
  value: linkStatusValue,
335
494
  children: /* @__PURE__ */ jsx("a", {
336
495
  ref: setRefs,
337
- onClick,
496
+ onClick: handleDangerousClick,
338
497
  onMouseEnter: handleMouseEnter,
339
498
  onTouchStart: handleTouchStart,
340
499
  ...anchorProps,
@@ -358,6 +517,6 @@ const Link = forwardRef(function Link({ href, as, replace = false, prefetch: pre
358
517
  });
359
518
  });
360
519
  //#endregion
361
- export { canAutoPrefetchFullAppRoute, Link as default, resolveLinkPrefetchMode, useLinkStatus };
520
+ export { canAutoPrefetchFullAppRoute, Link as default, resolveAutoAppRoutePrefetch, resolveLinkPrefetchMode, useLinkStatus };
362
521
 
363
522
  //# 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 {\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 { 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 /**\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 /** 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 typeof window !== \"undefined\" && typeof window.__VINEXT_RSC_NAVIGATE__ === \"function\"\n ? \"app\"\n : \"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\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;\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 window.__VINEXT_PING_VISIBLE_LINKS__ = 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 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 (isAbsoluteOrProtocolRelativeUrl(href)) {\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 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 }\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) 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, 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 return (\n <LinkStatusContext.Provider value={linkStatusValue}>\n <a\n ref={setRefs}\n onClick={onClick}\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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"}
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 {\n prefetchPagesData,\n resolvePagesDataNavigationTarget,\n} from \"./internal/pages-data-target.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\n/**\n * Collapse repeated forward-slashes (and convert backslashes to forward-slashes)\n * in the path portion of a URL, preserving any query string.\n *\n * Ported from Next.js: packages/next/src/shared/lib/utils/normalize-repeated-slashes.ts\n * https://github.com/vercel/next.js/blob/canary/packages/next/src/shared/lib/utils/normalize-repeated-slashes.ts\n */\nfunction normalizeRepeatedSlashes(url: string): string {\n const urlParts = url.split(\"?\");\n const urlNoQueryString = urlParts.shift() ?? \"\";\n const queryString = urlParts.join(\"?\");\n return (\n urlNoQueryString.replace(/\\\\/g, \"/\").replace(/\\/\\/+/g, \"/\") +\n (queryString ? `?${queryString}` : \"\")\n );\n}\n\n/**\n * Emit Next.js's \"Invalid href\" `console.error` when `href` contains repeated\n * forward slashes or backslashes in its path portion, and return the\n * normalized URL (with `\\\\` converted to `/` and runs of `/` collapsed). If\n * the href is already well-formed, the original string is returned unchanged.\n *\n * Ported from Next.js: packages/next/src/client/resolve-href.ts\n * https://github.com/vercel/next.js/blob/canary/packages/next/src/client/resolve-href.ts\n *\n * Matches the message asserted by:\n * test/e2e/repeated-forward-slashes-error/repeated-forward-slashes-error.test.ts\n *\n * Note: Next.js fires this warning unconditionally on every call to\n * `resolveHref`. We mirror that behaviour (no dedup) for exact parity.\n *\n * Note: Next.js uses `router.pathname` (the route pattern, e.g.\n * `/posts/[id]`) for the \"in page\" segment of the message. We do not have\n * cheap access to the route pattern from inside the Link shim, so we\n * fall back to `window.location.pathname` (or `\"/\"` during SSR). The text\n * is cosmetic and is not asserted by the Next.js compat test.\n */\nfunction warnAndNormalizeRepeatedSlashesInHref(urlAsString: string): string {\n // Protocol-relative URLs (e.g. \"//example.com/path\") are treated by vinext\n // as external — see `isAbsoluteOrProtocolRelativeUrl` in url-utils. We\n // intentionally skip the repeated-slash warning and normalization for them\n // so that locale prefixing and same-origin detection elsewhere in this\n // shim continue to receive the original href. (Next.js itself does flag\n // these, but our external-URL handling supersedes that behaviour.)\n if (urlAsString.startsWith(\"//\")) return urlAsString;\n\n // Strip any protocol prefix (e.g. \"https://\") so we do not flag the\n // legitimate `//` that separates the scheme from the authority.\n const urlProtoMatch = urlAsString.match(/^[a-z][a-z0-9+.-]*:\\/\\//i);\n const urlAsStringNoProto = urlProtoMatch\n ? urlAsString.slice(urlProtoMatch[0].length)\n : urlAsString;\n const urlParts = urlAsStringNoProto.split(\"?\", 1);\n if (!(urlParts[0] || \"\").match(/(\\/\\/|\\\\)/)) return urlAsString;\n\n const pathname =\n typeof window !== \"undefined\" && window.location ? window.location.pathname : \"/\";\n console.error(\n `Invalid href '${urlAsString}' passed to next/router in page: '${pathname}'. Repeated forward-slashes (//) or backslashes \\\\ are not valid in the href.`,\n );\n\n const normalizedNoProto = normalizeRepeatedSlashes(urlAsStringNoProto);\n return (urlProtoMatch ? urlProtoMatch[0] : \"\") + normalizedNoProto;\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__) {\n // Pages Router prefetch. When a code-split loader is registered for\n // the target route (prod builds expose them on window via the\n // generated client entry), prefetch the data JSON + warm the page\n // chunk in parallel — matching the actual navigation, so the click\n // is a double cache hit. Otherwise (dev, or unmapped route) fall\n // back to the legacy `<link rel=\"prefetch\" as=\"document\">` so the\n // browser still preloads the HTML.\n //\n // The decision helper + prefetch action live in shims/internal/ so\n // this file does not pull in the router shim at module init time,\n // which would create a circular import and grow the SSR module graph.\n const dataTarget = resolvePagesDataNavigationTarget(fullHref, __basePath);\n if (dataTarget) {\n prefetchPagesData(dataTarget);\n } else {\n // Legacy fallback: hint the browser to preload the HTML document.\n // Used in dev (no loader map populated) and for routes not in the\n // client loader map.\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 }\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 rawResolvedHref = as ?? resolveHref(href);\n\n // Mirror Next.js: emit a console.error when the href contains repeated\n // forward-slashes (e.g. \"/foo//bar\") or backslashes, and then normalize the\n // href so navigation targets the collapsed path rather than the raw one.\n // See packages/next/src/client/resolve-href.ts.\n const resolvedHref =\n typeof rawResolvedHref === \"string\"\n ? warnAndNormalizeRepeatedSlashesInHref(rawResolvedHref)\n : rawResolvedHref;\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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"}
@@ -271,10 +271,11 @@ type MetadataHeadProps = {
271
271
  metadata: Metadata;
272
272
  pathname?: string;
273
273
  };
274
+ declare function renderMetadataToHtml(metadata: Metadata, pathname?: string): string;
274
275
  declare function MetadataHead({
275
276
  metadata,
276
277
  pathname
277
278
  }: MetadataHeadProps): _$react_jsx_runtime0.JSX.Element;
278
279
  //#endregion
279
- export { DEFAULT_VIEWPORT, Metadata, MetadataHead, MetadataMergeEntry, Viewport, ViewportHead, mergeMetadata, mergeMetadataEntries, mergeViewport, postProcessMetadata, resolveModuleMetadata, resolveModuleViewport };
280
+ export { DEFAULT_VIEWPORT, Metadata, MetadataHead, MetadataMergeEntry, Viewport, ViewportHead, mergeMetadata, mergeMetadataEntries, mergeViewport, postProcessMetadata, renderMetadataToHtml, resolveModuleMetadata, resolveModuleViewport };
280
281
  //# sourceMappingURL=metadata.d.ts.map