vinext 0.0.49 → 0.0.50

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 (390) hide show
  1. package/dist/build/client-build-config.js.map +1 -1
  2. package/dist/build/google-fonts/build-url.js.map +1 -1
  3. package/dist/build/google-fonts/get-axes.js.map +1 -1
  4. package/dist/build/google-fonts/sort-variants.js.map +1 -1
  5. package/dist/build/google-fonts/validate.js.map +1 -1
  6. package/dist/build/layout-classification.js.map +1 -1
  7. package/dist/build/nitro-route-rules.js.map +1 -1
  8. package/dist/build/precompress.js.map +1 -1
  9. package/dist/build/prerender.d.ts +17 -1
  10. package/dist/build/prerender.js +77 -16
  11. package/dist/build/prerender.js.map +1 -1
  12. package/dist/build/report.js.map +1 -1
  13. package/dist/build/route-classification-injector.js.map +1 -1
  14. package/dist/build/route-classification-manifest.js.map +1 -1
  15. package/dist/build/run-prerender.js.map +1 -1
  16. package/dist/build/server-manifest.js.map +1 -1
  17. package/dist/build/ssr-manifest.js.map +1 -1
  18. package/dist/build/standalone.js.map +1 -1
  19. package/dist/build/static-export.js.map +1 -1
  20. package/dist/check.js +1 -1
  21. package/dist/check.js.map +1 -1
  22. package/dist/cli-args.js.map +1 -1
  23. package/dist/cli.js +8 -4
  24. package/dist/cli.js.map +1 -1
  25. package/dist/client/instrumentation-client-state.js.map +1 -1
  26. package/dist/client/validate-module-path.js.map +1 -1
  27. package/dist/client/vinext-next-data.d.ts +5 -1
  28. package/dist/client/window-next.d.ts +149 -0
  29. package/dist/client/window-next.js +48 -0
  30. package/dist/client/window-next.js.map +1 -0
  31. package/dist/cloudflare/kv-cache-handler.js.map +1 -1
  32. package/dist/cloudflare/tpr.js +2 -1
  33. package/dist/cloudflare/tpr.js.map +1 -1
  34. package/dist/config/config-matchers.d.ts +3 -1
  35. package/dist/config/config-matchers.js +5 -4
  36. package/dist/config/config-matchers.js.map +1 -1
  37. package/dist/config/dotenv.js.map +1 -1
  38. package/dist/config/next-config.d.ts +6 -3
  39. package/dist/config/next-config.js +13 -2
  40. package/dist/config/next-config.js.map +1 -1
  41. package/dist/deploy.js +13 -5
  42. package/dist/deploy.js.map +1 -1
  43. package/dist/entries/app-browser-entry.d.ts +3 -1
  44. package/dist/entries/app-browser-entry.js +11 -2
  45. package/dist/entries/app-browser-entry.js.map +1 -1
  46. package/dist/entries/app-rsc-entry.js +11 -0
  47. package/dist/entries/app-rsc-entry.js.map +1 -1
  48. package/dist/entries/app-rsc-manifest.js +4 -0
  49. package/dist/entries/app-rsc-manifest.js.map +1 -1
  50. package/dist/entries/app-ssr-entry.js.map +1 -1
  51. package/dist/entries/pages-client-entry.js.map +1 -1
  52. package/dist/entries/pages-entry-helpers.js.map +1 -1
  53. package/dist/entries/pages-server-entry.js +15 -0
  54. package/dist/entries/pages-server-entry.js.map +1 -1
  55. package/dist/entries/runtime-entry-module.js.map +1 -1
  56. package/dist/index.js +76 -18
  57. package/dist/index.js.map +1 -1
  58. package/dist/init.js.map +1 -1
  59. package/dist/plugins/async-hooks-stub.js.map +1 -1
  60. package/dist/plugins/client-reference-dedup.js.map +1 -1
  61. package/dist/plugins/fonts.js.map +1 -1
  62. package/dist/plugins/instrumentation-client.js.map +1 -1
  63. package/dist/plugins/og-assets.js.map +1 -1
  64. package/dist/plugins/optimize-imports.js.map +1 -1
  65. package/dist/plugins/postcss.js.map +1 -1
  66. package/dist/plugins/rsc-client-reference-loaders.d.ts +7 -0
  67. package/dist/plugins/rsc-client-reference-loaders.js +48 -0
  68. package/dist/plugins/rsc-client-reference-loaders.js.map +1 -0
  69. package/dist/plugins/rsc-client-shim-excludes.js.map +1 -1
  70. package/dist/plugins/server-externals-manifest.js.map +1 -1
  71. package/dist/plugins/strip-server-exports.js.map +1 -1
  72. package/dist/routing/app-route-graph.d.ts +48 -5
  73. package/dist/routing/app-route-graph.js +159 -15
  74. package/dist/routing/app-route-graph.js.map +1 -1
  75. package/dist/routing/app-router.js.map +1 -1
  76. package/dist/routing/file-matcher.js.map +1 -1
  77. package/dist/routing/pages-router.js.map +1 -1
  78. package/dist/routing/route-matching.js.map +1 -1
  79. package/dist/routing/route-pattern.js.map +1 -1
  80. package/dist/routing/route-trie.js.map +1 -1
  81. package/dist/routing/route-validation.js.map +1 -1
  82. package/dist/routing/utils.js.map +1 -1
  83. package/dist/server/api-handler.js.map +1 -1
  84. package/dist/server/app-browser-action-result.d.ts +19 -0
  85. package/dist/server/app-browser-action-result.js +18 -0
  86. package/dist/server/app-browser-action-result.js.map +1 -0
  87. package/dist/server/app-browser-entry.js +91 -48
  88. package/dist/server/app-browser-entry.js.map +1 -1
  89. package/dist/server/app-browser-error.js.map +1 -1
  90. package/dist/server/app-browser-hydration.d.ts +19 -0
  91. package/dist/server/app-browser-hydration.js +22 -0
  92. package/dist/server/app-browser-hydration.js.map +1 -0
  93. package/dist/server/app-browser-navigation-controller.d.ts +6 -3
  94. package/dist/server/app-browser-navigation-controller.js +67 -19
  95. package/dist/server/app-browser-navigation-controller.js.map +1 -1
  96. package/dist/server/app-browser-state.d.ts +17 -17
  97. package/dist/server/app-browser-state.js +122 -36
  98. package/dist/server/app-browser-state.js.map +1 -1
  99. package/dist/server/app-browser-stream.d.ts +4 -0
  100. package/dist/server/app-browser-stream.js +24 -2
  101. package/dist/server/app-browser-stream.js.map +1 -1
  102. package/dist/server/app-browser-visible-commit.d.ts +6 -1
  103. package/dist/server/app-browser-visible-commit.js +34 -19
  104. package/dist/server/app-browser-visible-commit.js.map +1 -1
  105. package/dist/server/app-client-reference-preloader.js.map +1 -1
  106. package/dist/server/app-elements-wire.d.ts +6 -1
  107. package/dist/server/app-elements-wire.js +17 -1
  108. package/dist/server/app-elements-wire.js.map +1 -1
  109. package/dist/server/app-elements.d.ts +2 -2
  110. package/dist/server/app-elements.js +2 -2
  111. package/dist/server/app-elements.js.map +1 -1
  112. package/dist/server/app-fallback-renderer.js.map +1 -1
  113. package/dist/server/app-hook-warning-suppression.js.map +1 -1
  114. package/dist/server/app-middleware.d.ts +1 -1
  115. package/dist/server/app-middleware.js +4 -9
  116. package/dist/server/app-middleware.js.map +1 -1
  117. package/dist/server/app-mounted-slots-header.js.map +1 -1
  118. package/dist/server/app-page-boundary-render.d.ts +1 -0
  119. package/dist/server/app-page-boundary-render.js +14 -13
  120. package/dist/server/app-page-boundary-render.js.map +1 -1
  121. package/dist/server/app-page-boundary.d.ts +1 -0
  122. package/dist/server/app-page-boundary.js +7 -5
  123. package/dist/server/app-page-boundary.js.map +1 -1
  124. package/dist/server/app-page-cache.d.ts +10 -3
  125. package/dist/server/app-page-cache.js +42 -23
  126. package/dist/server/app-page-cache.js.map +1 -1
  127. package/dist/server/app-page-dispatch.d.ts +6 -1
  128. package/dist/server/app-page-dispatch.js +21 -7
  129. package/dist/server/app-page-dispatch.js.map +1 -1
  130. package/dist/server/app-page-element-builder.d.ts +3 -1
  131. package/dist/server/app-page-element-builder.js +6 -2
  132. package/dist/server/app-page-element-builder.js.map +1 -1
  133. package/dist/server/app-page-execution.js.map +1 -1
  134. package/dist/server/app-page-head.js +4 -0
  135. package/dist/server/app-page-head.js.map +1 -1
  136. package/dist/server/app-page-method.js.map +1 -1
  137. package/dist/server/app-page-params.js.map +1 -1
  138. package/dist/server/app-page-probe.js.map +1 -1
  139. package/dist/server/app-page-render.d.ts +7 -1
  140. package/dist/server/app-page-render.js +11 -4
  141. package/dist/server/app-page-render.js.map +1 -1
  142. package/dist/server/app-page-request.js +2 -1
  143. package/dist/server/app-page-request.js.map +1 -1
  144. package/dist/server/app-page-response.d.ts +2 -0
  145. package/dist/server/app-page-response.js +15 -5
  146. package/dist/server/app-page-response.js.map +1 -1
  147. package/dist/server/app-page-route-wiring.d.ts +6 -2
  148. package/dist/server/app-page-route-wiring.js +50 -49
  149. package/dist/server/app-page-route-wiring.js.map +1 -1
  150. package/dist/server/app-page-segment-state.d.ts +10 -0
  151. package/dist/server/app-page-segment-state.js +87 -0
  152. package/dist/server/app-page-segment-state.js.map +1 -0
  153. package/dist/server/app-page-stream.d.ts +7 -2
  154. package/dist/server/app-page-stream.js +3 -1
  155. package/dist/server/app-page-stream.js.map +1 -1
  156. package/dist/server/app-post-middleware-context.js.map +1 -1
  157. package/dist/server/app-prerender-endpoints.js.map +1 -1
  158. package/dist/server/app-prerender-static-params.js.map +1 -1
  159. package/dist/server/app-render-dependency.js.map +1 -1
  160. package/dist/server/app-request-context.js.map +1 -1
  161. package/dist/server/app-route-handler-cache.js.map +1 -1
  162. package/dist/server/app-route-handler-dispatch.js +3 -1
  163. package/dist/server/app-route-handler-dispatch.js.map +1 -1
  164. package/dist/server/app-route-handler-execution.js.map +1 -1
  165. package/dist/server/app-route-handler-policy.js +1 -0
  166. package/dist/server/app-route-handler-policy.js.map +1 -1
  167. package/dist/server/app-route-handler-response.js +4 -3
  168. package/dist/server/app-route-handler-response.js.map +1 -1
  169. package/dist/server/app-route-handler-runtime.js.map +1 -1
  170. package/dist/server/app-router-entry.js +6 -2
  171. package/dist/server/app-router-entry.js.map +1 -1
  172. package/dist/server/app-rsc-cache-busting.d.ts +5 -2
  173. package/dist/server/app-rsc-cache-busting.js +40 -19
  174. package/dist/server/app-rsc-cache-busting.js.map +1 -1
  175. package/dist/server/app-rsc-error-handler.js.map +1 -1
  176. package/dist/server/app-rsc-errors.js.map +1 -1
  177. package/dist/server/app-rsc-handler.d.ts +10 -1
  178. package/dist/server/app-rsc-handler.js +51 -17
  179. package/dist/server/app-rsc-handler.js.map +1 -1
  180. package/dist/server/app-rsc-render-mode.d.ts +11 -0
  181. package/dist/server/app-rsc-render-mode.js +21 -0
  182. package/dist/server/app-rsc-render-mode.js.map +1 -0
  183. package/dist/server/app-rsc-request-normalization.d.ts +4 -1
  184. package/dist/server/app-rsc-request-normalization.js +7 -2
  185. package/dist/server/app-rsc-request-normalization.js.map +1 -1
  186. package/dist/server/app-rsc-response-finalizer.d.ts +2 -1
  187. package/dist/server/app-rsc-response-finalizer.js +6 -1
  188. package/dist/server/app-rsc-response-finalizer.js.map +1 -1
  189. package/dist/server/app-rsc-route-matching.js.map +1 -1
  190. package/dist/server/app-segment-config.js.map +1 -1
  191. package/dist/server/app-server-action-execution.d.ts +16 -2
  192. package/dist/server/app-server-action-execution.js +79 -23
  193. package/dist/server/app-server-action-execution.js.map +1 -1
  194. package/dist/server/app-ssr-entry.d.ts +6 -0
  195. package/dist/server/app-ssr-entry.js +10 -4
  196. package/dist/server/app-ssr-entry.js.map +1 -1
  197. package/dist/server/app-ssr-stream.js.map +1 -1
  198. package/dist/server/app-static-generation.js.map +1 -1
  199. package/dist/server/artifact-compatibility.js.map +1 -1
  200. package/dist/server/cache-control.js +1 -0
  201. package/dist/server/cache-control.js.map +1 -1
  202. package/dist/server/cache-proof.js.map +1 -1
  203. package/dist/server/csp.js.map +1 -1
  204. package/dist/server/dev-error-overlay-store.js.map +1 -1
  205. package/dist/server/dev-error-overlay.js +5 -0
  206. package/dist/server/dev-error-overlay.js.map +1 -1
  207. package/dist/server/dev-module-runner.js.map +1 -1
  208. package/dist/server/dev-origin-check.js.map +1 -1
  209. package/dist/server/dev-route-files.js.map +1 -1
  210. package/dist/server/dev-server.js +8 -5
  211. package/dist/server/dev-server.js.map +1 -1
  212. package/dist/server/file-based-metadata.js.map +1 -1
  213. package/dist/server/headers.d.ts +79 -0
  214. package/dist/server/headers.js +101 -0
  215. package/dist/server/headers.js.map +1 -0
  216. package/dist/server/html.js.map +1 -1
  217. package/dist/server/http-error-responses.js.map +1 -1
  218. package/dist/server/image-optimization.d.ts +11 -1
  219. package/dist/server/image-optimization.js.map +1 -1
  220. package/dist/server/implicit-tags.js +2 -1
  221. package/dist/server/implicit-tags.js.map +1 -1
  222. package/dist/server/instrumentation-runtime.js.map +1 -1
  223. package/dist/server/instrumentation.js.map +1 -1
  224. package/dist/server/isr-cache.d.ts +10 -1
  225. package/dist/server/isr-cache.js +12 -3
  226. package/dist/server/isr-cache.js.map +1 -1
  227. package/dist/server/metadata-route-build-data.js.map +1 -1
  228. package/dist/server/metadata-route-response.js.map +1 -1
  229. package/dist/server/metadata-routes.js.map +1 -1
  230. package/dist/server/middleware-matcher.js.map +1 -1
  231. package/dist/server/middleware-request-headers.d.ts +4 -1
  232. package/dist/server/middleware-request-headers.js +15 -8
  233. package/dist/server/middleware-request-headers.js.map +1 -1
  234. package/dist/server/middleware-response-headers.d.ts +2 -1
  235. package/dist/server/middleware-response-headers.js +1 -1
  236. package/dist/server/middleware-response-headers.js.map +1 -1
  237. package/dist/server/middleware-runtime.d.ts +1 -0
  238. package/dist/server/middleware-runtime.js +6 -3
  239. package/dist/server/middleware-runtime.js.map +1 -1
  240. package/dist/server/middleware.js.map +1 -1
  241. package/dist/server/navigation-planner.d.ts +119 -0
  242. package/dist/server/navigation-planner.js +171 -0
  243. package/dist/server/navigation-planner.js.map +1 -0
  244. package/dist/server/navigation-trace.d.ts +12 -2
  245. package/dist/server/navigation-trace.js +13 -1
  246. package/dist/server/navigation-trace.js.map +1 -1
  247. package/dist/server/next-error-digest.d.ts +3 -2
  248. package/dist/server/next-error-digest.js +4 -2
  249. package/dist/server/next-error-digest.js.map +1 -1
  250. package/dist/server/normalize-path.js.map +1 -1
  251. package/dist/server/pages-api-route.js.map +1 -1
  252. package/dist/server/pages-i18n.js.map +1 -1
  253. package/dist/server/pages-media-type.js.map +1 -1
  254. package/dist/server/pages-node-compat.js.map +1 -1
  255. package/dist/server/pages-page-data.js +5 -2
  256. package/dist/server/pages-page-data.js.map +1 -1
  257. package/dist/server/pages-page-response.js +3 -2
  258. package/dist/server/pages-page-response.js.map +1 -1
  259. package/dist/server/prerender-work-unit-setup.js +1 -1
  260. package/dist/server/prerender-work-unit-setup.js.map +1 -1
  261. package/dist/server/prod-server.js +35 -13
  262. package/dist/server/prod-server.js.map +1 -1
  263. package/dist/server/request-log.js.map +1 -1
  264. package/dist/server/request-pipeline.d.ts +1 -13
  265. package/dist/server/request-pipeline.js +3 -25
  266. package/dist/server/request-pipeline.js.map +1 -1
  267. package/dist/server/rsc-stream-hints.js.map +1 -1
  268. package/dist/server/seed-cache.js.map +1 -1
  269. package/dist/server/server-action-not-found.js +3 -3
  270. package/dist/server/server-action-not-found.js.map +1 -1
  271. package/dist/server/socket-error-backstop.js.map +1 -1
  272. package/dist/server/static-file-cache.js.map +1 -1
  273. package/dist/server/worker-utils.d.ts +0 -7
  274. package/dist/server/worker-utils.js +3 -2
  275. package/dist/server/worker-utils.js.map +1 -1
  276. package/dist/shims/amp.js.map +1 -1
  277. package/dist/shims/app.d.ts +37 -4
  278. package/dist/shims/app.js +50 -1
  279. package/dist/shims/app.js.map +1 -0
  280. package/dist/shims/cache-for-request.js.map +1 -1
  281. package/dist/shims/cache-runtime.js +20 -8
  282. package/dist/shims/cache-runtime.js.map +1 -1
  283. package/dist/shims/cache.d.ts +15 -3
  284. package/dist/shims/cache.js +99 -15
  285. package/dist/shims/cache.js.map +1 -1
  286. package/dist/shims/client-hook-error.js.map +1 -1
  287. package/dist/shims/compat-router.js.map +1 -1
  288. package/dist/shims/config.js.map +1 -1
  289. package/dist/shims/constants.js.map +1 -1
  290. package/dist/shims/document.js.map +1 -1
  291. package/dist/shims/dynamic.d.ts +18 -10
  292. package/dist/shims/dynamic.js +107 -51
  293. package/dist/shims/dynamic.js.map +1 -1
  294. package/dist/shims/error-boundary.d.ts +35 -6
  295. package/dist/shims/error-boundary.js +118 -33
  296. package/dist/shims/error-boundary.js.map +1 -1
  297. package/dist/shims/error.js.map +1 -1
  298. package/dist/shims/fetch-cache.d.ts +22 -1
  299. package/dist/shims/fetch-cache.js +124 -13
  300. package/dist/shims/fetch-cache.js.map +1 -1
  301. package/dist/shims/font-google-base.js.map +1 -1
  302. package/dist/shims/font-local.js.map +1 -1
  303. package/dist/shims/form.js +3 -1
  304. package/dist/shims/form.js.map +1 -1
  305. package/dist/shims/head-state.js.map +1 -1
  306. package/dist/shims/head.d.ts +3 -1
  307. package/dist/shims/head.js +28 -16
  308. package/dist/shims/head.js.map +1 -1
  309. package/dist/shims/headers.d.ts +4 -2
  310. package/dist/shims/headers.js +24 -7
  311. package/dist/shims/headers.js.map +1 -1
  312. package/dist/shims/i18n-context.js.map +1 -1
  313. package/dist/shims/i18n-state.js.map +1 -1
  314. package/dist/shims/image-config.d.ts +14 -1
  315. package/dist/shims/image-config.js +24 -1
  316. package/dist/shims/image-config.js.map +1 -1
  317. package/dist/shims/image.js +15 -2
  318. package/dist/shims/image.js.map +1 -1
  319. package/dist/shims/internal/als-registry.js.map +1 -1
  320. package/dist/shims/internal/app-router-context.d.ts +1 -0
  321. package/dist/shims/internal/app-router-context.js.map +1 -1
  322. package/dist/shims/internal/cookie-serialize.js.map +1 -1
  323. package/dist/shims/internal/make-hanging-promise.d.ts +1 -1
  324. package/dist/shims/internal/make-hanging-promise.js +1 -1
  325. package/dist/shims/internal/make-hanging-promise.js.map +1 -1
  326. package/dist/shims/internal/parse-cookie-header.js.map +1 -1
  327. package/dist/shims/internal/utils.js.map +1 -1
  328. package/dist/shims/internal/work-unit-async-storage.js +2 -2
  329. package/dist/shims/internal/work-unit-async-storage.js.map +1 -1
  330. package/dist/shims/layout-segment-context.js.map +1 -1
  331. package/dist/shims/legacy-image.js.map +1 -1
  332. package/dist/shims/link-prefetch.d.ts +34 -0
  333. package/dist/shims/link-prefetch.js +40 -0
  334. package/dist/shims/link-prefetch.js.map +1 -0
  335. package/dist/shims/link.d.ts +27 -4
  336. package/dist/shims/link.js +91 -27
  337. package/dist/shims/link.js.map +1 -1
  338. package/dist/shims/metadata.js.map +1 -1
  339. package/dist/shims/navigation-state.js.map +1 -1
  340. package/dist/shims/navigation.d.ts +22 -1
  341. package/dist/shims/navigation.js +30 -15
  342. package/dist/shims/navigation.js.map +1 -1
  343. package/dist/shims/navigation.react-server.js.map +1 -1
  344. package/dist/shims/offline.js.map +1 -1
  345. package/dist/shims/readonly-url-search-params.js.map +1 -1
  346. package/dist/shims/request-context.js.map +1 -1
  347. package/dist/shims/root-params.js.map +1 -1
  348. package/dist/shims/router-state.js.map +1 -1
  349. package/dist/shims/router.d.ts +38 -2
  350. package/dist/shims/router.js +45 -17
  351. package/dist/shims/router.js.map +1 -1
  352. package/dist/shims/script-nonce-context.js.map +1 -1
  353. package/dist/shims/script.js.map +1 -1
  354. package/dist/shims/server.js +10 -14
  355. package/dist/shims/server.js.map +1 -1
  356. package/dist/shims/slot.d.ts +6 -1
  357. package/dist/shims/slot.js +20 -7
  358. package/dist/shims/slot.js.map +1 -1
  359. package/dist/shims/thenable-params.js.map +1 -1
  360. package/dist/shims/unified-request-context.js +3 -0
  361. package/dist/shims/unified-request-context.js.map +1 -1
  362. package/dist/shims/url-safety.js.map +1 -1
  363. package/dist/shims/url-utils.d.ts +2 -1
  364. package/dist/shims/url-utils.js +10 -1
  365. package/dist/shims/url-utils.js.map +1 -1
  366. package/dist/shims/use-merged-ref.js.map +1 -1
  367. package/dist/shims/web-vitals.d.ts +4 -21
  368. package/dist/shims/web-vitals.js +19 -6
  369. package/dist/shims/web-vitals.js.map +1 -1
  370. package/dist/utils/base-path.js.map +1 -1
  371. package/dist/utils/cache-control-metadata.js.map +1 -1
  372. package/dist/utils/domain-locale.js.map +1 -1
  373. package/dist/utils/encode-cache-tag.d.ts +31 -0
  374. package/dist/utils/encode-cache-tag.js +38 -0
  375. package/dist/utils/encode-cache-tag.js.map +1 -0
  376. package/dist/utils/error-cause.js.map +1 -1
  377. package/dist/utils/hash.js.map +1 -1
  378. package/dist/utils/lazy-chunks.js.map +1 -1
  379. package/dist/utils/manifest-paths.js.map +1 -1
  380. package/dist/utils/mdx-scan.js.map +1 -1
  381. package/dist/utils/navigation-signal.d.ts +6 -0
  382. package/dist/utils/navigation-signal.js +14 -0
  383. package/dist/utils/navigation-signal.js.map +1 -0
  384. package/dist/utils/project.js.map +1 -1
  385. package/dist/utils/public-routes.js.map +1 -1
  386. package/dist/utils/query.js.map +1 -1
  387. package/dist/utils/safe-json-file.js.map +1 -1
  388. package/dist/utils/text-stream.js.map +1 -1
  389. package/dist/utils/vinext-root.js.map +1 -1
  390. package/package.json +6 -4
@@ -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} 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 {\n createRscRequestHeaders,\n createRscRequestUrl,\n VINEXT_RSC_MOUNTED_SLOTS_HEADER,\n} from \"../server/app-rsc-cache-busting.js\";\nimport { isDangerousScheme } from \"./url-safety.js\";\nimport {\n resolveRelativeHref,\n toBrowserNavigationHref,\n toSameOriginAppPath,\n withBasePath,\n} from \"./url-utils.js\";\nimport { appendSearchParamsToUrl, type UrlQuery, urlQueryToSearchParams } from \"../utils/query.js\";\nimport { addLocalePrefix, getDomainLocaleUrl, type DomainLocale } from \"../utils/domain-locale.js\";\nimport { getI18nContext } from \"./i18n-context.js\";\nimport type { VinextNextData } from \"../client/vinext-next-data.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 (default: true, uses IntersectionObserver) */\n prefetch?: 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\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\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// 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): void {\n if (typeof window === \"undefined\") return;\n\n // Normalize same-origin absolute URLs to local paths before prefetching\n let prefetchHref = href;\n if (href.startsWith(\"http://\") || href.startsWith(\"https://\") || href.startsWith(\"//\")) {\n const localPath = toSameOriginAppPath(href, __basePath);\n if (localPath == null) return; // truly external — don't prefetch\n prefetchHref = localPath;\n }\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 const interceptionContext = getCurrentInterceptionContext();\n const mountedSlotsHeader = getMountedSlotsHeader();\n const headers = createRscRequestHeaders({ interceptionContext });\n if (mountedSlotsHeader) {\n headers.set(VINEXT_RSC_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: \"low\" as const,\n // @ts-expect-error — purpose is a valid fetch option in some browsers\n purpose: \"prefetch\",\n }),\n interceptionContext,\n mountedSlotsHeader,\n );\n } else if ((window.__NEXT_DATA__ as VinextNextData | undefined)?.__vinext?.pageModuleUrl) {\n // Pages Router: inject a prefetch link for the target page module\n // We can't easily resolve the target page's module URL from the Link,\n // so we create a <link rel=\"prefetch\"> for the HTML page which helps\n // the browser's preload scanner.\n const link = document.createElement(\"link\");\n link.rel = \"prefetch\";\n link.href = fullHref;\n link.as = \"document\";\n document.head.appendChild(link);\n }\n })().catch((error) => {\n console.error(\"[vinext] RSC prefetch setup error:\", error);\n });\n });\n}\n\n/**\n * Shared IntersectionObserver for viewport-based prefetching.\n * All Link elements use the same observer to minimize resource usage.\n */\nlet sharedObserver: IntersectionObserver | null = null;\nconst observerCallbacks = new WeakMap<Element, () => void>();\n\nfunction getSharedObserver(): IntersectionObserver | null {\n if (typeof window === \"undefined\" || typeof IntersectionObserver === \"undefined\") return null;\n if (sharedObserver) return sharedObserver;\n\n sharedObserver = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n const callback = observerCallbacks.get(entry.target);\n if (callback) {\n callback();\n // Unobserve after prefetching — only prefetch once\n sharedObserver?.unobserve(entry.target);\n observerCallbacks.delete(entry.target);\n }\n }\n }\n },\n {\n // Start prefetching when the link is within 250px of the viewport.\n // This gives the browser a head start before the user scrolls to it.\n rootMargin: \"250px\",\n },\n );\n\n return sharedObserver;\n}\n\nfunction getDefaultLocale(): string | undefined {\n if (typeof window !== \"undefined\") {\n return window.__VINEXT_DEFAULT_LOCALE__;\n }\n return getI18nContext()?.defaultLocale;\n}\n\nfunction getDomainLocales(): readonly DomainLocale[] | undefined {\n if (typeof window !== \"undefined\") {\n return (window.__NEXT_DATA__ as VinextNextData | undefined)?.domainLocales;\n }\n return getI18nContext()?.domainLocales;\n}\n\nfunction getCurrentHostname(): string | undefined {\n if (typeof window !== \"undefined\") return window.location.hostname;\n return getI18nContext()?.hostname;\n}\n\nfunction getDomainLocaleHref(href: string, locale: string): string | undefined {\n // Only cross-domain locale switches need a special absolute URL here.\n // Same-domain cases fall back to the standard locale-prefix logic below.\n return getDomainLocaleUrl(href, locale, {\n basePath: __basePath,\n currentHostname: getCurrentHostname(),\n domainItems: getDomainLocales(),\n });\n}\n\n/**\n * Apply locale prefix to a URL path based on the locale prop.\n * - locale=\"fr\" → prepend /fr (unless it already has a locale prefix)\n * - locale={false} → use the href as-is (no locale prefix, link to default)\n * - locale=undefined → use current locale (href as-is in most cases)\n */\nfunction applyLocaleToHref(href: string, locale: string | false | undefined): string {\n if (locale === false) {\n // Explicit false: no locale prefix\n return href;\n }\n\n if (locale === undefined) {\n // No locale prop: keep current behavior (href as-is)\n return href;\n }\n\n // Absolute and protocol-relative URLs must not be prefixed — locale\n // only applies to local paths.\n if (href.startsWith(\"http://\") || href.startsWith(\"https://\") || href.startsWith(\"//\")) {\n return href;\n }\n\n const domainLocaleHref = getDomainLocaleHref(href, locale);\n if (domainLocaleHref) {\n return domainLocaleHref;\n }\n\n return addLocalePrefix(href, locale, getDefaultLocale() ?? \"\");\n}\n\nconst Link = forwardRef<HTMLAnchorElement, LinkProps>(function Link(\n {\n href,\n as,\n replace = false,\n prefetch: prefetchProp,\n scroll = true,\n children,\n onClick,\n onNavigate,\n ...rest\n },\n forwardedRef,\n) {\n // Extract locale from rest props\n const { locale, ...restWithoutLocale } = rest;\n\n // If `as` is provided, use it as the actual URL (legacy Next.js pattern\n // where href is a route pattern like \"/user/[id]\" and as is \"/user/1\")\n const resolvedHref = as ?? resolveHref(href);\n\n const isDangerous = typeof resolvedHref === \"string\" && isDangerousScheme(resolvedHref);\n\n // Apply locale prefix if specified (safe even for dangerous hrefs since we\n // won't use the result when isDangerous is true)\n const localizedHref = applyLocaleToHref(isDangerous ? \"/\" : resolvedHref, locale);\n // Full href with basePath for browser URLs and fetches\n const fullHref = withBasePath(localizedHref, __basePath);\n\n // Track pending state for useLinkStatus()\n const [pending, setPending] = useState(false);\n const mountedRef = useRef(true);\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n };\n }, []);\n\n // Prefetching: observe the element when it enters the viewport.\n // prefetch={false} disables, prefetch={true} or undefined/null (default) enables.\n const internalRef = useRef<HTMLAnchorElement | null>(null);\n const shouldPrefetch = prefetchProp !== false && !isDangerous;\n\n const setRefs = useCallback(\n (node: HTMLAnchorElement | null) => {\n internalRef.current = node;\n if (typeof forwardedRef === \"function\") forwardedRef(node);\n else if (forwardedRef)\n (forwardedRef as React.MutableRefObject<HTMLAnchorElement | null>).current = node;\n },\n [forwardedRef],\n );\n\n useEffect(() => {\n if (!shouldPrefetch || typeof window === \"undefined\") return;\n const node = internalRef.current;\n if (!node) return;\n\n // Normalize same-origin absolute URLs; skip truly external ones\n let hrefToPrefetch = localizedHref;\n if (\n localizedHref.startsWith(\"http://\") ||\n localizedHref.startsWith(\"https://\") ||\n localizedHref.startsWith(\"//\")\n ) {\n const localPath = toSameOriginAppPath(localizedHref, __basePath);\n if (localPath == null) return; // truly external\n hrefToPrefetch = localPath;\n }\n\n const observer = getSharedObserver();\n if (!observer) return;\n\n observerCallbacks.set(node, () => prefetchUrl(hrefToPrefetch));\n observer.observe(node);\n\n return () => {\n observer.unobserve(node);\n observerCallbacks.delete(node);\n };\n }, [shouldPrefetch, localizedHref]);\n\n const handleClick = async (e: MouseEvent<HTMLAnchorElement>) => {\n if (onClick) onClick(e);\n if (e.defaultPrevented) return;\n\n // Only intercept left clicks without modifiers (standard link behavior)\n if (e.button !== 0 || e.metaKey || e.ctrlKey || e.shiftKey || e.altKey) {\n return;\n }\n\n // Don't intercept links with target (e.g. target=\"_blank\")\n if (e.currentTarget.target && e.currentTarget.target !== \"_self\") {\n return;\n }\n\n // External links: let the browser handle it.\n // Same-origin absolute URLs (e.g. http://localhost:3000/about) are\n // normalized to local paths so they get client-side navigation.\n let navigateHref = localizedHref;\n if (\n resolvedHref.startsWith(\"http://\") ||\n resolvedHref.startsWith(\"https://\") ||\n resolvedHref.startsWith(\"//\")\n ) {\n const localPath = toSameOriginAppPath(resolvedHref, __basePath);\n if (localPath == null) return; // truly external\n navigateHref = localPath;\n }\n\n e.preventDefault();\n\n // Resolve relative hrefs (#hash, ?query) against the current URL once so\n // onNavigate and the actual navigation target stay in sync.\n const absoluteHref = resolveRelativeHref(navigateHref, window.location.href, __basePath);\n const absoluteFullHref = toBrowserNavigationHref(\n navigateHref,\n window.location.href,\n __basePath,\n );\n\n // Call onNavigate callback if provided (Next.js 16 View Transitions support)\n if (onNavigate) {\n try {\n const navUrl = new URL(absoluteFullHref, window.location.origin);\n let prevented = false;\n const navEvent: NavigateEvent = {\n url: navUrl,\n preventDefault() {\n prevented = true;\n },\n get defaultPrevented() {\n return prevented;\n },\n };\n onNavigate(navEvent);\n // If the callback called preventDefault(), skip Link's default navigation.\n // The callback is responsible for its own navigation (e.g. via View Transitions API).\n if (navEvent.defaultPrevented) {\n return;\n }\n } catch {\n // Ignore URL parsing errors for relative/hash hrefs\n }\n }\n\n // App Router: delegate to navigateClientSide which handles scroll save,\n // hash-only changes, RSC fetch, and two-phase URL commit.\n if (typeof window.__VINEXT_RSC_NAVIGATE__ === \"function\") {\n setPending(true);\n try {\n await navigateClientSide(navigateHref, replace ? \"replace\" : \"push\", scroll);\n } finally {\n if (mountedRef.current) setPending(false);\n }\n } else {\n // Next.js only consumes onRouterTransitionStart in the App Router.\n // Pages Router still executes instrumentation-client side effects\n // during startup, but it does not invoke the named export on navigation.\n // Pages Router: use the Router singleton\n try {\n const routerModule = await import(\"next/router\");\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any -- vinext's Router shim accepts (url, as, options)\n const Router = routerModule.default as any;\n if (replace) {\n await Router.replace(absoluteHref, undefined, { scroll });\n } else {\n await Router.push(absoluteHref, undefined, { scroll });\n }\n } catch {\n // Fallback to hard navigation if router fails\n if (replace) {\n window.history.replaceState({}, \"\", absoluteFullHref);\n } else {\n window.history.pushState({}, \"\", absoluteFullHref);\n }\n window.dispatchEvent(new PopStateEvent(\"popstate\"));\n }\n }\n };\n\n // Remove props that shouldn't be on <a>\n const { passHref: _p, ...anchorProps } = restWithoutLocale;\n\n const linkStatusValue = React.useMemo(() => ({ pending }), [pending]);\n\n // Block dangerous URI schemes (javascript:, data:, vbscript:).\n // Render an inert <a> without href to prevent XSS while preserving\n // styling and attributes like className, id, aria-*.\n // This check is placed after all hooks to satisfy the Rules of Hooks.\n if (isDangerous) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(`<Link> blocked dangerous href: ${resolvedHref}`);\n }\n return <a {...anchorProps}>{children}</a>;\n }\n\n return (\n <LinkStatusContext.Provider value={linkStatusValue}>\n <a ref={setRefs} href={fullHref} onClick={handleClick} {...anchorProps}>\n {children}\n </a>\n </LinkStatusContext.Provider>\n );\n});\n\nexport default Link;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAkFA,MAAM,oBAAoB,cAAsC,EAAE,SAAS,OAAO,CAAC;;;;;;AAOnF,SAAgB,gBAAwC;AACtD,QAAO,WAAW,kBAAkB;;;AAItC,MAAM,aAAqB,QAAQ,IAAI,0BAA0B;AAEjE,SAAS,YAAY,MAAiC;AACpD,KAAI,OAAO,SAAS,SAAU,QAAO;CACrC,IAAI,MAAM,KAAK,YAAY;AAC3B,KAAI,KAAK,OAAO;EACd,MAAM,SAAS,uBAAuB,KAAK,MAAM;AACjD,QAAM,wBAAwB,KAAK,OAAO;;AAE5C,QAAO;;;;;;;;;;;;AAiBT,SAAS,YAAY,MAAoB;AACvC,KAAI,OAAO,WAAW,YAAa;CAGnC,IAAI,eAAe;AACnB,KAAI,KAAK,WAAW,UAAU,IAAI,KAAK,WAAW,WAAW,IAAI,KAAK,WAAW,KAAK,EAAE;EACtF,MAAM,YAAY,oBAAoB,MAAM,WAAW;AACvD,MAAI,aAAa,KAAM;AACvB,iBAAe;;CAGjB,MAAM,WAAW,wBAAwB,cAAc,OAAO,SAAS,MAAM,WAAW;AAIxF,EAFiB,OAAO,yBAAyB,OAAmB,WAAW,IAAI,IAAI,SAExE;AACb,GAAM,YAAY;AAChB,OAAI,OAAO,OAAO,4BAA4B,YAAY;IACxD,MAAM,sBAAsB,+BAA+B;IAC3D,MAAM,qBAAqB,uBAAuB;IAClD,MAAM,UAAU,wBAAwB,EAAE,qBAAqB,CAAC;AAChE,QAAI,mBACF,SAAQ,IAAI,iCAAiC,mBAAmB;IAIlE,MAAM,SAAS,MAAM,oBAAoB,UAAU,QAAQ;IAC3D,MAAM,WAAW,gBAAgB,eAAe,QAAQ,oBAAoB;IAC5E,MAAM,aAAa,mBAAmB;AACtC,QAAI,WAAW,IAAI,SAAS,CAAE;AAC9B,eAAW,IAAI,SAAS;AACxB,wBACE,QACA,MAAM,QAAQ;KACZ;KACA,aAAa;KACb,UAAU;KAEV,SAAS;KACV,CAAC,EACF,qBACA,mBACD;cACS,OAAO,eAA8C,UAAU,eAAe;IAKxF,MAAM,OAAO,SAAS,cAAc,OAAO;AAC3C,SAAK,MAAM;AACX,SAAK,OAAO;AACZ,SAAK,KAAK;AACV,aAAS,KAAK,YAAY,KAAK;;MAE/B,CAAC,OAAO,UAAU;AACpB,WAAQ,MAAM,sCAAsC,MAAM;IAC1D;GACF;;;;;;AAOJ,IAAI,iBAA8C;AAClD,MAAM,oCAAoB,IAAI,SAA8B;AAE5D,SAAS,oBAAiD;AACxD,KAAI,OAAO,WAAW,eAAe,OAAO,yBAAyB,YAAa,QAAO;AACzF,KAAI,eAAgB,QAAO;AAE3B,kBAAiB,IAAI,sBAClB,YAAY;AACX,OAAK,MAAM,SAAS,QAClB,KAAI,MAAM,gBAAgB;GACxB,MAAM,WAAW,kBAAkB,IAAI,MAAM,OAAO;AACpD,OAAI,UAAU;AACZ,cAAU;AAEV,oBAAgB,UAAU,MAAM,OAAO;AACvC,sBAAkB,OAAO,MAAM,OAAO;;;IAK9C,EAGE,YAAY,SACb,CACF;AAED,QAAO;;AAGT,SAAS,mBAAuC;AAC9C,KAAI,OAAO,WAAW,YACpB,QAAO,OAAO;AAEhB,QAAO,gBAAgB,EAAE;;AAG3B,SAAS,mBAAwD;AAC/D,KAAI,OAAO,WAAW,YACpB,QAAQ,OAAO,eAA8C;AAE/D,QAAO,gBAAgB,EAAE;;AAG3B,SAAS,qBAAyC;AAChD,KAAI,OAAO,WAAW,YAAa,QAAO,OAAO,SAAS;AAC1D,QAAO,gBAAgB,EAAE;;AAG3B,SAAS,oBAAoB,MAAc,QAAoC;AAG7E,QAAO,mBAAmB,MAAM,QAAQ;EACtC,UAAU;EACV,iBAAiB,oBAAoB;EACrC,aAAa,kBAAkB;EAChC,CAAC;;;;;;;;AASJ,SAAS,kBAAkB,MAAc,QAA4C;AACnF,KAAI,WAAW,MAEb,QAAO;AAGT,KAAI,WAAW,KAAA,EAEb,QAAO;AAKT,KAAI,KAAK,WAAW,UAAU,IAAI,KAAK,WAAW,WAAW,IAAI,KAAK,WAAW,KAAK,CACpF,QAAO;CAGT,MAAM,mBAAmB,oBAAoB,MAAM,OAAO;AAC1D,KAAI,iBACF,QAAO;AAGT,QAAO,gBAAgB,MAAM,QAAQ,kBAAkB,IAAI,GAAG;;AAGhE,MAAM,OAAO,WAAyC,SAAS,KAC7D,EACE,MACA,IACA,UAAU,OACV,UAAU,cACV,SAAS,MACT,UACA,SACA,YACA,GAAG,QAEL,cACA;CAEA,MAAM,EAAE,QAAQ,GAAG,sBAAsB;CAIzC,MAAM,eAAe,MAAM,YAAY,KAAK;CAE5C,MAAM,cAAc,OAAO,iBAAiB,YAAY,kBAAkB,aAAa;CAIvF,MAAM,gBAAgB,kBAAkB,cAAc,MAAM,cAAc,OAAO;CAEjF,MAAM,WAAW,aAAa,eAAe,WAAW;CAGxD,MAAM,CAAC,SAAS,cAAc,SAAS,MAAM;CAC7C,MAAM,aAAa,OAAO,KAAK;AAC/B,iBAAgB;AACd,aAAW,UAAU;AACrB,eAAa;AACX,cAAW,UAAU;;IAEtB,EAAE,CAAC;CAIN,MAAM,cAAc,OAAiC,KAAK;CAC1D,MAAM,iBAAiB,iBAAiB,SAAS,CAAC;CAElD,MAAM,UAAU,aACb,SAAmC;AAClC,cAAY,UAAU;AACtB,MAAI,OAAO,iBAAiB,WAAY,cAAa,KAAK;WACjD,aACN,cAAkE,UAAU;IAEjF,CAAC,aAAa,CACf;AAED,iBAAgB;AACd,MAAI,CAAC,kBAAkB,OAAO,WAAW,YAAa;EACtD,MAAM,OAAO,YAAY;AACzB,MAAI,CAAC,KAAM;EAGX,IAAI,iBAAiB;AACrB,MACE,cAAc,WAAW,UAAU,IACnC,cAAc,WAAW,WAAW,IACpC,cAAc,WAAW,KAAK,EAC9B;GACA,MAAM,YAAY,oBAAoB,eAAe,WAAW;AAChE,OAAI,aAAa,KAAM;AACvB,oBAAiB;;EAGnB,MAAM,WAAW,mBAAmB;AACpC,MAAI,CAAC,SAAU;AAEf,oBAAkB,IAAI,YAAY,YAAY,eAAe,CAAC;AAC9D,WAAS,QAAQ,KAAK;AAEtB,eAAa;AACX,YAAS,UAAU,KAAK;AACxB,qBAAkB,OAAO,KAAK;;IAE/B,CAAC,gBAAgB,cAAc,CAAC;CAEnC,MAAM,cAAc,OAAO,MAAqC;AAC9D,MAAI,QAAS,SAAQ,EAAE;AACvB,MAAI,EAAE,iBAAkB;AAGxB,MAAI,EAAE,WAAW,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,OAC9D;AAIF,MAAI,EAAE,cAAc,UAAU,EAAE,cAAc,WAAW,QACvD;EAMF,IAAI,eAAe;AACnB,MACE,aAAa,WAAW,UAAU,IAClC,aAAa,WAAW,WAAW,IACnC,aAAa,WAAW,KAAK,EAC7B;GACA,MAAM,YAAY,oBAAoB,cAAc,WAAW;AAC/D,OAAI,aAAa,KAAM;AACvB,kBAAe;;AAGjB,IAAE,gBAAgB;EAIlB,MAAM,eAAe,oBAAoB,cAAc,OAAO,SAAS,MAAM,WAAW;EACxF,MAAM,mBAAmB,wBACvB,cACA,OAAO,SAAS,MAChB,WACD;AAGD,MAAI,WACF,KAAI;GACF,MAAM,SAAS,IAAI,IAAI,kBAAkB,OAAO,SAAS,OAAO;GAChE,IAAI,YAAY;GAChB,MAAM,WAA0B;IAC9B,KAAK;IACL,iBAAiB;AACf,iBAAY;;IAEd,IAAI,mBAAmB;AACrB,YAAO;;IAEV;AACD,cAAW,SAAS;AAGpB,OAAI,SAAS,iBACX;UAEI;AAOV,MAAI,OAAO,OAAO,4BAA4B,YAAY;AACxD,cAAW,KAAK;AAChB,OAAI;AACF,UAAM,mBAAmB,cAAc,UAAU,YAAY,QAAQ,OAAO;aACpE;AACR,QAAI,WAAW,QAAS,YAAW,MAAM;;QAO3C,KAAI;GAGF,MAAM,UAFe,MAAM,OAAO,mBAEN;AAC5B,OAAI,QACF,OAAM,OAAO,QAAQ,cAAc,KAAA,GAAW,EAAE,QAAQ,CAAC;OAEzD,OAAM,OAAO,KAAK,cAAc,KAAA,GAAW,EAAE,QAAQ,CAAC;UAElD;AAEN,OAAI,QACF,QAAO,QAAQ,aAAa,EAAE,EAAE,IAAI,iBAAiB;OAErD,QAAO,QAAQ,UAAU,EAAE,EAAE,IAAI,iBAAiB;AAEpD,UAAO,cAAc,IAAI,cAAc,WAAW,CAAC;;;CAMzD,MAAM,EAAE,UAAU,IAAI,GAAG,gBAAgB;CAEzC,MAAM,kBAAkB,MAAM,eAAe,EAAE,SAAS,GAAG,CAAC,QAAQ,CAAC;AAMrE,KAAI,aAAa;AACf,MAAI,QAAQ,IAAI,aAAa,aAC3B,SAAQ,KAAK,kCAAkC,eAAe;AAEhE,SAAO,oBAAC,KAAD;GAAG,GAAI;GAAc;GAAa,CAAA;;AAG3C,QACE,oBAAC,kBAAkB,UAAnB;EAA4B,OAAO;YACjC,oBAAC,KAAD;GAAG,KAAK;GAAS,MAAM;GAAU,SAAS;GAAa,GAAI;GACxD;GACC,CAAA;EACuB,CAAA;EAE/B"}
1
+ {"version":3,"file":"link.js","names":[],"sources":["../../src/shims/link.tsx"],"sourcesContent":["\"use client\";\n\n/**\n * next/link shim\n *\n * Renders an <a> tag with client-side navigation support.\n * On click, prevents full page reload and triggers client-side\n * page swap via the router's navigation system.\n */\nimport React, {\n forwardRef,\n useRef,\n useEffect,\n useCallback,\n useContext,\n createContext,\n useState,\n type AnchorHTMLAttributes,\n type MouseEvent,\n type TouchEvent,\n} from \"react\";\n// Import shared RSC prefetch utilities from navigation shim (relative path\n// so this resolves both via the Vite plugin and in direct vitest imports)\nimport {\n getCurrentInterceptionContext,\n getPrefetchedUrls,\n getMountedSlotsHeader,\n navigateClientSide,\n prefetchRscResponse,\n} from \"./navigation.js\";\nimport { AppElementsWire } from \"../server/app-elements.js\";\nimport { createRscRequestHeaders, createRscRequestUrl } from \"../server/app-rsc-cache-busting.js\";\nimport { VINEXT_MOUNTED_SLOTS_HEADER } from \"../server/headers.js\";\nimport { isDangerousScheme } from \"./url-safety.js\";\nimport { canLinkPrefetch, getLinkPrefetchHref } from \"./link-prefetch.js\";\nimport {\n resolveRelativeHref,\n toBrowserNavigationHref,\n toSameOriginAppPath,\n withBasePath,\n} from \"./url-utils.js\";\nimport { appendSearchParamsToUrl, type UrlQuery, urlQueryToSearchParams } from \"../utils/query.js\";\nimport { addLocalePrefix, getDomainLocaleUrl, type DomainLocale } from \"../utils/domain-locale.js\";\nimport { getI18nContext } from \"./i18n-context.js\";\nimport type { VinextLinkPrefetchRoute, VinextNextData } from \"../client/vinext-next-data.js\";\nimport { createRouteTrieCache, matchRouteWithTrie } from \"../routing/route-matching.js\";\nimport { stripBasePath } from \"../utils/base-path.js\";\n\ntype NavigateEvent = {\n url: URL;\n /** Call to prevent the Link's default navigation (e.g. for View Transitions). */\n preventDefault(): void;\n /** Whether preventDefault() has been called. */\n defaultPrevented: boolean;\n};\n\ntype LinkProps = {\n href: string | { pathname?: string; query?: UrlQuery };\n /** URL displayed in the browser (when href is a route pattern like /user/[id]) */\n as?: string;\n /** Replace the current history entry instead of pushing */\n replace?: boolean;\n /** Prefetch the page in the background (App Router default: auto, Pages Router default: true) */\n prefetch?: boolean | \"auto\" | null;\n /** Whether to pass the href to the child element */\n passHref?: boolean;\n /** Scroll to top on navigation (default: true) */\n scroll?: boolean;\n /** Locale for i18n (used for locale-prefixed URLs) */\n locale?: string | false;\n /** Called before navigation happens (Next.js 16). Return value is ignored. */\n onNavigate?: (event: NavigateEvent) => void;\n children?: React.ReactNode;\n} & Omit<AnchorHTMLAttributes<HTMLAnchorElement>, \"href\">;\n\ntype LinkPrefetchMode = \"disabled\" | \"auto\" | \"full\";\n\ndeclare global {\n // Window is an ambient interface from lib.dom; interface merging is required\n // for this global browser hook.\n // oxlint-disable-next-line typescript-eslint/consistent-type-definitions\n interface Window {\n __VINEXT_LINK_PREFETCH_ROUTES__?: VinextLinkPrefetchRoute[];\n }\n}\n\n// ---------------------------------------------------------------------------\n// useLinkStatus — reports the pending state of a parent <Link> navigation\n// ---------------------------------------------------------------------------\n\ntype LinkStatusContextValue = {\n pending: boolean;\n};\n\nconst LinkStatusContext = createContext<LinkStatusContextValue>({ pending: false });\n\n/**\n * useLinkStatus returns the pending state of the enclosing <Link>.\n * In Next.js, this is used to show loading indicators while a\n * prefetch-triggered navigation is in progress.\n */\nexport function useLinkStatus(): LinkStatusContextValue {\n return useContext(LinkStatusContext);\n}\n\n/** basePath from next.config.js, injected by the plugin at build time */\nconst __basePath: string = process.env.__NEXT_ROUTER_BASEPATH ?? \"\";\nconst linkPrefetchRouteTrieCache = createRouteTrieCache<VinextLinkPrefetchRoute>();\n\nfunction resolveHref(href: LinkProps[\"href\"]): string {\n if (typeof href === \"string\") return href;\n let url = href.pathname ?? \"/\";\n if (href.query) {\n const params = urlQueryToSearchParams(href.query);\n url = appendSearchParamsToUrl(url, params);\n }\n return url;\n}\n\nexport function resolveLinkPrefetchMode(\n prefetchProp: LinkProps[\"prefetch\"],\n isDangerous: boolean,\n): LinkPrefetchMode {\n if (isDangerous || prefetchProp === false) return \"disabled\";\n if (prefetchProp === true) return \"full\";\n return \"auto\";\n}\n\nfunction toSameOriginRouteHref(href: string): string | null {\n if (typeof window === \"undefined\") return null;\n\n let url: URL;\n try {\n url = new URL(href, window.location.href);\n } catch {\n return null;\n }\n\n if (url.origin !== window.location.origin) return null;\n\n return `${stripBasePath(url.pathname, __basePath)}${url.search}`;\n}\n\nexport function canAutoPrefetchFullAppRoute(href: string): boolean {\n if (typeof window === \"undefined\") return false;\n\n const routes = window.__VINEXT_LINK_PREFETCH_ROUTES__;\n if (!routes) return false;\n\n const routeHref = toSameOriginRouteHref(href);\n if (routeHref === null) return false;\n\n const match = matchRouteWithTrie(routeHref, routes, linkPrefetchRouteTrieCache);\n if (!match) return false;\n\n return !match.route.isDynamic;\n}\n\n// ---------------------------------------------------------------------------\n// Prefetching infrastructure\n// ---------------------------------------------------------------------------\n\n/**\n * Prefetch a URL for faster navigation.\n *\n * For App Router (RSC): fetches the .rsc payload in the background and\n * stores it in an in-memory cache for instant use during navigation.\n * For Pages Router: injects a <link rel=\"prefetch\"> for the page module.\n *\n * Uses `requestIdleCallback` (or `setTimeout` fallback) to avoid blocking\n * the main thread during initial page load.\n */\nfunction prefetchUrl(href: string, mode: LinkPrefetchMode, priority: \"low\" | \"high\" = \"low\"): void {\n if (typeof window === \"undefined\") return;\n\n const prefetchHref = getLinkPrefetchHref({\n href,\n basePath: __basePath,\n currentOrigin: window.location.origin,\n });\n if (prefetchHref == null) return;\n\n const fullHref = toBrowserNavigationHref(prefetchHref, window.location.href, __basePath);\n\n const schedule = window.requestIdleCallback ?? ((fn: () => void) => setTimeout(fn, 100));\n\n schedule(() => {\n void (async () => {\n if (typeof window.__VINEXT_RSC_NAVIGATE__ === \"function\") {\n // `auto`/`null`/undefined should not behave like `prefetch={true}` for\n // App Router dynamic routes. Next.js may prefetch a loading-boundary\n // shell for dynamic routes, but vinext's current client cache stores\n // complete RSC responses only; keep automatic full prefetch to route\n // shapes that are statically known safe until segment prefetch exists.\n if (mode === \"auto\" && !canAutoPrefetchFullAppRoute(prefetchHref)) return;\n\n const interceptionContext = getCurrentInterceptionContext();\n const mountedSlotsHeader = getMountedSlotsHeader();\n const headers = createRscRequestHeaders({ interceptionContext });\n if (mountedSlotsHeader) {\n headers.set(VINEXT_MOUNTED_SLOTS_HEADER, mountedSlotsHeader);\n }\n // Distinguish the same visible URL when it is prefetched from different\n // request contexts such as /feed vs /gallery or different mounted slots.\n const rscUrl = await createRscRequestUrl(fullHref, headers);\n const cacheKey = AppElementsWire.encodeCacheKey(rscUrl, interceptionContext);\n const prefetched = getPrefetchedUrls();\n if (prefetched.has(cacheKey)) return;\n prefetched.add(cacheKey);\n prefetchRscResponse(\n rscUrl,\n fetch(rscUrl, {\n headers,\n credentials: \"include\",\n priority,\n // @ts-expect-error — purpose is a valid fetch option in some browsers\n purpose: \"prefetch\",\n }),\n interceptionContext,\n mountedSlotsHeader,\n );\n } else if ((window.__NEXT_DATA__ as VinextNextData | undefined)?.__vinext?.pageModuleUrl) {\n // Pages Router: inject a prefetch link for the target page module\n // We can't easily resolve the target page's module URL from the Link,\n // so we create a <link rel=\"prefetch\"> for the HTML page which helps\n // the browser's preload scanner.\n const link = document.createElement(\"link\");\n link.rel = \"prefetch\";\n link.href = fullHref;\n link.as = \"document\";\n document.head.appendChild(link);\n }\n })().catch((error) => {\n console.error(\"[vinext] RSC prefetch setup error:\", error);\n });\n });\n}\n\n/**\n * Shared IntersectionObserver for viewport-based prefetching.\n * All Link elements use the same observer to minimize resource usage.\n */\nlet sharedObserver: IntersectionObserver | null = null;\nconst observerCallbacks = new WeakMap<Element, () => void>();\n\nfunction getSharedObserver(): IntersectionObserver | null {\n if (typeof window === \"undefined\" || typeof IntersectionObserver === \"undefined\") return null;\n if (sharedObserver) return sharedObserver;\n\n sharedObserver = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n const callback = observerCallbacks.get(entry.target);\n if (callback) {\n callback();\n // Unobserve after prefetching — only prefetch once\n sharedObserver?.unobserve(entry.target);\n observerCallbacks.delete(entry.target);\n }\n }\n }\n },\n {\n // Start prefetching when the link is within 250px of the viewport.\n // This gives the browser a head start before the user scrolls to it.\n rootMargin: \"250px\",\n },\n );\n\n return sharedObserver;\n}\n\nfunction getDefaultLocale(): string | undefined {\n if (typeof window !== \"undefined\") {\n return window.__VINEXT_DEFAULT_LOCALE__;\n }\n return getI18nContext()?.defaultLocale;\n}\n\nfunction getDomainLocales(): readonly DomainLocale[] | undefined {\n if (typeof window !== \"undefined\") {\n return (window.__NEXT_DATA__ as VinextNextData | undefined)?.domainLocales;\n }\n return getI18nContext()?.domainLocales;\n}\n\nfunction getCurrentHostname(): string | undefined {\n if (typeof window !== \"undefined\") return window.location.hostname;\n return getI18nContext()?.hostname;\n}\n\nfunction getDomainLocaleHref(href: string, locale: string): string | undefined {\n // Only cross-domain locale switches need a special absolute URL here.\n // Same-domain cases fall back to the standard locale-prefix logic below.\n return getDomainLocaleUrl(href, locale, {\n basePath: __basePath,\n currentHostname: getCurrentHostname(),\n domainItems: getDomainLocales(),\n });\n}\n\n/**\n * Apply locale prefix to a URL path based on the locale prop.\n * - locale=\"fr\" → prepend /fr (unless it already has a locale prefix)\n * - locale={false} → use the href as-is (no locale prefix, link to default)\n * - locale=undefined → use current locale (href as-is in most cases)\n */\nfunction applyLocaleToHref(href: string, locale: string | false | undefined): string {\n if (locale === false) {\n // Explicit false: no locale prefix\n return href;\n }\n\n if (locale === undefined) {\n // No locale prop: keep current behavior (href as-is)\n return href;\n }\n\n // Absolute and protocol-relative URLs must not be prefixed — locale\n // only applies to local paths.\n if (href.startsWith(\"http://\") || href.startsWith(\"https://\") || href.startsWith(\"//\")) {\n return href;\n }\n\n const domainLocaleHref = getDomainLocaleHref(href, locale);\n if (domainLocaleHref) {\n return domainLocaleHref;\n }\n\n return addLocalePrefix(href, locale, getDefaultLocale() ?? \"\");\n}\n\nconst Link = forwardRef<HTMLAnchorElement, LinkProps>(function Link(\n {\n href,\n as,\n replace = false,\n prefetch: prefetchProp,\n scroll = true,\n children,\n onClick,\n onMouseEnter,\n onTouchStart,\n onNavigate,\n ...rest\n },\n forwardedRef,\n) {\n // Extract locale from rest props\n const { locale, ...restWithoutLocale } = rest;\n\n // If `as` is provided, use it as the actual URL (legacy Next.js pattern\n // where href is a route pattern like \"/user/[id]\" and as is \"/user/1\")\n const resolvedHref = as ?? resolveHref(href);\n\n const isDangerous = typeof resolvedHref === \"string\" && isDangerousScheme(resolvedHref);\n\n // Apply locale prefix if specified (safe even for dangerous hrefs since we\n // won't use the result when isDangerous is true)\n const localizedHref = applyLocaleToHref(isDangerous ? \"/\" : resolvedHref, locale);\n // Full href with basePath for browser URLs and fetches\n const fullHref = withBasePath(localizedHref, __basePath);\n\n // Track pending state for useLinkStatus()\n const [pending, setPending] = useState(false);\n const mountedRef = useRef(true);\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n };\n }, []);\n\n // Prefetching: observe the element when it enters the viewport.\n // In App Router, null/undefined/\"auto\" is automatic prefetch and true opts\n // into a full RSC prefetch, matching Next.js's public prefetch contract.\n const internalRef = useRef<HTMLAnchorElement | null>(null);\n const prefetchMode = resolveLinkPrefetchMode(prefetchProp, isDangerous);\n const shouldPrefetch = canLinkPrefetch({\n nodeEnv: process.env.NODE_ENV,\n prefetch: prefetchProp,\n isDangerous,\n });\n\n const setRefs = useCallback(\n (node: HTMLAnchorElement | null) => {\n internalRef.current = node;\n if (typeof forwardedRef === \"function\") forwardedRef(node);\n else if (forwardedRef)\n (forwardedRef as React.MutableRefObject<HTMLAnchorElement | null>).current = node;\n },\n [forwardedRef],\n );\n\n useEffect(() => {\n if (!shouldPrefetch || typeof window === \"undefined\") return;\n const node = internalRef.current;\n if (!node) return;\n\n const hrefToPrefetch = getLinkPrefetchHref({\n href: localizedHref,\n basePath: __basePath,\n currentOrigin: window.location.origin,\n });\n if (hrefToPrefetch == null) return;\n\n const observer = getSharedObserver();\n if (!observer) return;\n\n observerCallbacks.set(node, () => prefetchUrl(hrefToPrefetch, prefetchMode, \"low\"));\n observer.observe(node);\n\n return () => {\n observer.unobserve(node);\n observerCallbacks.delete(node);\n };\n }, [shouldPrefetch, prefetchMode, localizedHref]);\n\n const prefetchOnIntent = useCallback(() => {\n if (!shouldPrefetch) return;\n prefetchUrl(localizedHref, prefetchMode, \"high\");\n }, [shouldPrefetch, prefetchMode, localizedHref]);\n\n const handleMouseEnter = useCallback(\n (e: MouseEvent<HTMLAnchorElement>) => {\n onMouseEnter?.(e);\n prefetchOnIntent();\n },\n [onMouseEnter, prefetchOnIntent],\n );\n\n const handleTouchStart = useCallback(\n (e: TouchEvent<HTMLAnchorElement>) => {\n onTouchStart?.(e);\n prefetchOnIntent();\n },\n [onTouchStart, prefetchOnIntent],\n );\n\n const handleClick = async (e: MouseEvent<HTMLAnchorElement>) => {\n if (onClick) onClick(e);\n if (e.defaultPrevented) return;\n\n // Only intercept left clicks without modifiers (standard link behavior)\n if (e.button !== 0 || e.metaKey || e.ctrlKey || e.shiftKey || e.altKey) {\n return;\n }\n\n // Don't intercept links with target (e.g. target=\"_blank\")\n if (e.currentTarget.target && e.currentTarget.target !== \"_self\") {\n return;\n }\n\n // External links: let the browser handle it.\n // Same-origin absolute URLs (e.g. http://localhost:3000/about) are\n // normalized to local paths so they get client-side navigation.\n let navigateHref = localizedHref;\n if (\n resolvedHref.startsWith(\"http://\") ||\n resolvedHref.startsWith(\"https://\") ||\n resolvedHref.startsWith(\"//\")\n ) {\n const localPath = toSameOriginAppPath(resolvedHref, __basePath);\n if (localPath == null) return; // truly external\n navigateHref = localPath;\n }\n\n e.preventDefault();\n\n // Resolve relative hrefs (#hash, ?query) against the current URL once so\n // onNavigate and the actual navigation target stay in sync.\n const absoluteHref = resolveRelativeHref(navigateHref, window.location.href, __basePath);\n const absoluteFullHref = toBrowserNavigationHref(\n navigateHref,\n window.location.href,\n __basePath,\n );\n\n // Call onNavigate callback if provided (Next.js 16 View Transitions support)\n if (onNavigate) {\n try {\n const navUrl = new URL(absoluteFullHref, window.location.origin);\n let prevented = false;\n const navEvent: NavigateEvent = {\n url: navUrl,\n preventDefault() {\n prevented = true;\n },\n get defaultPrevented() {\n return prevented;\n },\n };\n onNavigate(navEvent);\n // If the callback called preventDefault(), skip Link's default navigation.\n // The callback is responsible for its own navigation (e.g. via View Transitions API).\n if (navEvent.defaultPrevented) {\n return;\n }\n } catch {\n // Ignore URL parsing errors for relative/hash hrefs\n }\n }\n\n // App Router: delegate to navigateClientSide which handles scroll save,\n // hash-only changes, RSC fetch, and two-phase URL commit.\n if (typeof window.__VINEXT_RSC_NAVIGATE__ === \"function\") {\n setPending(true);\n React.startTransition(() => {\n void navigateClientSide(navigateHref, replace ? \"replace\" : \"push\", scroll, true).finally(\n () => {\n if (mountedRef.current) setPending(false);\n },\n );\n });\n return;\n } else {\n // Next.js only consumes onRouterTransitionStart in the App Router.\n // Pages Router still executes instrumentation-client side effects\n // during startup, but it does not invoke the named export on navigation.\n // Pages Router: use the Router singleton\n try {\n const routerModule = await import(\"next/router\");\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any -- vinext's Router shim accepts (url, as, options)\n const Router = routerModule.default as any;\n if (replace) {\n await Router.replace(absoluteHref, undefined, { scroll });\n } else {\n await Router.push(absoluteHref, undefined, { scroll });\n }\n } catch {\n // Fallback to hard navigation if router fails\n if (replace) {\n window.history.replaceState({}, \"\", absoluteFullHref);\n } else {\n window.history.pushState({}, \"\", absoluteFullHref);\n }\n window.dispatchEvent(new PopStateEvent(\"popstate\"));\n }\n }\n };\n\n // Remove props that shouldn't be on <a>\n const { passHref: _p, ...anchorProps } = restWithoutLocale;\n\n const linkStatusValue = React.useMemo(() => ({ pending }), [pending]);\n\n // Block dangerous URI schemes (javascript:, data:, vbscript:).\n // Render an inert <a> without href to prevent XSS while preserving\n // styling and attributes like className, id, aria-*.\n // This check is placed after all hooks to satisfy the Rules of Hooks.\n if (isDangerous) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(`<Link> blocked dangerous href: ${resolvedHref}`);\n }\n return (\n <a {...anchorProps} onMouseEnter={handleMouseEnter} onTouchStart={handleTouchStart}>\n {children}\n </a>\n );\n }\n\n return (\n <LinkStatusContext.Provider value={linkStatusValue}>\n <a\n ref={setRefs}\n href={fullHref}\n onClick={(event) => {\n void handleClick(event);\n }}\n onMouseEnter={handleMouseEnter}\n onTouchStart={handleTouchStart}\n {...anchorProps}\n >\n {children}\n </a>\n </LinkStatusContext.Provider>\n );\n});\n\nexport default Link;\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"metadata.js","names":[],"sources":["../../src/shims/metadata.tsx"],"sourcesContent":["/**\n * Metadata support for App Router.\n *\n * Handles `export const metadata` and `export async function generateMetadata()`.\n * Resolves metadata from layouts and pages (pages override layouts).\n */\nimport React from \"react\";\nimport { makeThenableParams } from \"./thenable-params.js\";\n\n// ---------------------------------------------------------------------------\n// Viewport types and resolution\n// ---------------------------------------------------------------------------\n\nexport type Viewport = {\n /** Viewport width (default: \"device-width\") */\n width?: string | number;\n /** Viewport height */\n height?: string | number;\n /** Initial scale */\n initialScale?: number;\n /** Minimum scale */\n minimumScale?: number;\n /** Maximum scale */\n maximumScale?: number;\n /** Whether user can scale */\n userScalable?: boolean;\n /** Theme color — single color or array of { media, color } */\n themeColor?: string | Array<{ media?: string; color: string }>;\n /** Color scheme: 'light' | 'dark' | 'light dark' | 'normal' */\n colorScheme?: string;\n};\n\n/**\n * Resolve viewport config from a module. Handles both static `viewport` export\n * and async `generateViewport()` function.\n */\nexport async function resolveModuleViewport(\n mod: Record<string, unknown>,\n params: Record<string, string | string[]>,\n): Promise<Viewport | null> {\n if (typeof mod.generateViewport === \"function\") {\n const asyncParams = makeThenableParams(params);\n return await mod.generateViewport({ params: asyncParams });\n }\n if (mod.viewport && typeof mod.viewport === \"object\") {\n return mod.viewport as Viewport;\n }\n return null;\n}\n\n/**\n * Merge viewport configs from multiple sources (layouts + page).\n * Later entries override earlier ones.\n */\nexport const DEFAULT_VIEWPORT: Viewport = {\n width: \"device-width\",\n initialScale: 1,\n};\n\nexport function mergeViewport(viewportList: Viewport[]): Viewport {\n const merged: Viewport = { ...DEFAULT_VIEWPORT };\n for (const vp of viewportList) {\n Object.assign(merged, vp);\n }\n return merged;\n}\n\n/**\n * React component that renders viewport meta tags into <head>.\n */\nexport function ViewportHead({ viewport }: { viewport: Viewport }) {\n const elements: React.ReactElement[] = [];\n let key = 0;\n\n // Build viewport content string\n const parts: string[] = [];\n if (viewport.width !== undefined) parts.push(`width=${viewport.width}`);\n if (viewport.height !== undefined) parts.push(`height=${viewport.height}`);\n if (viewport.initialScale !== undefined) parts.push(`initial-scale=${viewport.initialScale}`);\n if (viewport.minimumScale !== undefined) parts.push(`minimum-scale=${viewport.minimumScale}`);\n if (viewport.maximumScale !== undefined) parts.push(`maximum-scale=${viewport.maximumScale}`);\n if (viewport.userScalable !== undefined)\n parts.push(`user-scalable=${viewport.userScalable ? \"yes\" : \"no\"}`);\n\n if (parts.length > 0) {\n elements.push(<meta key={key++} name=\"viewport\" content={parts.join(\", \")} />);\n }\n\n // Theme color\n if (viewport.themeColor) {\n if (typeof viewport.themeColor === \"string\") {\n elements.push(<meta key={key++} name=\"theme-color\" content={viewport.themeColor} />);\n } else if (Array.isArray(viewport.themeColor)) {\n for (const entry of viewport.themeColor) {\n elements.push(\n <meta\n key={key++}\n name=\"theme-color\"\n content={entry.color}\n {...(entry.media ? { media: entry.media } : {})}\n />,\n );\n }\n }\n }\n\n // Color scheme\n if (viewport.colorScheme) {\n elements.push(<meta key={key++} name=\"color-scheme\" content={viewport.colorScheme} />);\n }\n\n return <>{elements}</>;\n}\n\n// ---------------------------------------------------------------------------\n// Metadata types and resolution\n// ---------------------------------------------------------------------------\n\nexport type Metadata = {\n title?: string | { default?: string; template?: string; absolute?: string };\n description?: string;\n generator?: string;\n applicationName?: string;\n referrer?: string;\n keywords?: string | string[];\n authors?: Array<{ name?: string; url?: string }> | { name?: string; url?: string };\n creator?: string;\n publisher?: string;\n robots?:\n | string\n | {\n index?: boolean;\n follow?: boolean;\n googleBot?: string | { index?: boolean; follow?: boolean; [key: string]: unknown };\n [key: string]: unknown;\n };\n openGraph?: {\n title?: string;\n description?: string;\n url?: string | URL;\n siteName?: string;\n images?:\n | string\n | URL\n | { url: string | URL; width?: number; height?: number; alt?: string; type?: string }\n | Array<\n | string\n | URL\n | { url: string | URL; width?: number; height?: number; alt?: string; type?: string }\n >;\n videos?: Array<{ url: string | URL; width?: number; height?: number }>;\n audio?: Array<{ url: string | URL }>;\n locale?: string;\n type?: string;\n publishedTime?: string;\n modifiedTime?: string;\n authors?: string[];\n };\n twitter?: {\n card?: string;\n site?: string;\n siteId?: string;\n title?: string;\n description?: string;\n images?:\n | string\n | URL\n | { url: string | URL; alt?: string; width?: number; height?: number; type?: string }\n | Array<\n | string\n | URL\n | { url: string | URL; alt?: string; width?: number; height?: number; type?: string }\n >;\n creator?: string;\n creatorId?: string;\n players?: TwitterPlayerDescriptor | TwitterPlayerDescriptor[];\n app?: TwitterAppDescriptor;\n };\n icons?: IconsMetadata;\n manifest?: string | URL;\n alternates?: {\n canonical?: string | URL;\n languages?: Record<string, string | URL>;\n media?: Record<string, string | URL>;\n types?: Record<string, string | URL>;\n };\n verification?: {\n google?: string;\n yahoo?: string;\n yandex?: string;\n other?: Record<string, string | string[]>;\n };\n metadataBase?: URL | null;\n appleWebApp?: {\n capable?: boolean;\n title?: string;\n statusBarStyle?: string;\n startupImage?: string | Array<{ url: string; media?: string }>;\n };\n formatDetection?: {\n email?: boolean;\n address?: boolean;\n telephone?: boolean;\n };\n category?: string;\n itunes?: {\n appId: string;\n appArgument?: string;\n };\n appLinks?: {\n ios?: AppLinksApple | AppLinksApple[];\n iphone?: AppLinksApple | AppLinksApple[];\n ipad?: AppLinksApple | AppLinksApple[];\n android?: AppLinksAndroid | AppLinksAndroid[];\n windows_phone?: AppLinksWindows | AppLinksWindows[];\n windows?: AppLinksWindows | AppLinksWindows[];\n windows_universal?: AppLinksWindows | AppLinksWindows[];\n web?: AppLinksWeb | AppLinksWeb[];\n };\n other?: Record<string, string | string[]>;\n [key: string]: unknown;\n};\n\ntype AppLinksApple = {\n url: string | URL;\n app_store_id?: string | number;\n app_name?: string;\n};\n\ntype AppLinksAndroid = {\n package: string;\n url?: string | URL;\n class?: string;\n app_name?: string;\n};\n\ntype AppLinksWindows = {\n url: string | URL;\n app_id?: string;\n app_name?: string;\n};\n\ntype AppLinksWeb = {\n url: string | URL;\n should_fallback?: boolean;\n};\n\ntype TwitterPlayerDescriptor = {\n playerUrl: string | URL;\n streamUrl: string | URL;\n width: number;\n height: number;\n};\n\ntype TwitterAppDescriptor = {\n id: {\n iphone?: string | number;\n ipad?: string | number;\n googleplay?: string;\n };\n url?: {\n iphone?: string | URL;\n ipad?: string | URL;\n googleplay?: string | URL;\n };\n name?: string;\n};\n\ntype IconDescriptor = {\n url: string | URL;\n sizes?: string;\n type?: string;\n media?: string;\n};\n\ntype AppleIconDescriptor = {\n url: string | URL;\n sizes?: string;\n type?: string;\n};\n\ntype IconInput = string | URL | IconDescriptor;\ntype AppleIconInput = string | URL | AppleIconDescriptor;\n\ntype IconsMap = {\n icon?: IconInput | IconInput[];\n shortcut?: string | URL | Array<string | URL>;\n apple?: AppleIconInput | AppleIconInput[];\n other?: Array<{ rel: string; url: string | URL; sizes?: string; type?: string }>;\n};\n\ntype IconsMetadata = IconInput | IconInput[] | IconsMap;\n\nexport type MetadataMergeEntry = {\n contributesTitle?: boolean;\n isPage?: boolean;\n metadata: Metadata;\n};\n\n/**\n * Merge metadata from multiple sources (layouts + page).\n *\n * The list is ordered [rootLayout, nestedLayout, ..., page].\n * Title template from layouts applies to the page title but NOT to\n * the segment that defines the template itself. `title.absolute`\n * skips all templates. `title.default` is the fallback when no\n * child provides a title.\n *\n * Shallow merge: later entries override earlier ones (per Next.js docs).\n */\nexport function mergeMetadata(metadataList: Metadata[]): Metadata {\n const merged = mergeMetadataEntries(\n metadataList.map((metadata, index) => ({\n isPage: index === metadataList.length - 1,\n metadata,\n })),\n );\n return postProcessMetadata(merged);\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return (\n typeof value === \"object\" && value !== null && !Array.isArray(value) && !(value instanceof URL)\n );\n}\n\nfunction isOtherMetadata(value: unknown): value is NonNullable<Metadata[\"other\"]> {\n if (!isPlainObject(value)) return false;\n return Object.values(value).every((item) => {\n if (typeof item === \"string\") return true;\n return Array.isArray(item) && item.every((nestedItem) => typeof nestedItem === \"string\");\n });\n}\n\n/**\n * Extract a plain string title from a metadata title value.\n */\nfunction resolveStringTitle(title: Metadata[\"title\"]): string | undefined {\n if (typeof title === \"string\") return title;\n if (title && typeof title === \"object\") {\n return title.absolute ?? title.default ?? undefined;\n }\n return undefined;\n}\n\n/**\n * Post-process merged metadata to cross-fill openGraph and Twitter fields.\n *\n * Next.js runs this once after all layouts/pages and file-based metadata\n * have been resolved. When openGraph exists, it auto-fills missing\n * twitter:title/description/images from openGraph (falling back to root\n * metadata title/description). Existing openGraph/twitter objects also inherit\n * missing title/description from root metadata.\n *\n * Ported from Next.js:\n * https://github.com/vercel/next.js/blob/canary/packages/next/src/lib/metadata/resolve-metadata.ts\n */\nexport function postProcessMetadata(merged: Metadata): Metadata {\n // Shallow-clone to avoid mutating the caller's object.\n // Both current call sites (mergeMetadata, resolveAppPageHead) pass\n // freshly-constructed objects, but this guards against future misuse.\n const result = { ...merged };\n\n const resolvedTitle = resolveStringTitle(result.title);\n\n // openGraph inherits title/description from root metadata when absent\n if (result.openGraph) {\n const og = { ...result.openGraph };\n if (!og.title && resolvedTitle) {\n og.title = resolvedTitle;\n }\n if (!og.description && result.description) {\n og.description = result.description;\n }\n result.openGraph = og;\n }\n\n if (result.openGraph) {\n const autoFill: {\n title?: string;\n description?: string;\n images?: NonNullable<Metadata[\"twitter\"]>[\"images\"];\n } = {};\n\n const existingTwitter = result.twitter;\n const hasTwTitle = existingTwitter ? Boolean(existingTwitter.title) : false;\n const hasTwDescription = existingTwitter ? Boolean(existingTwitter.description) : false;\n const hasTwImages = existingTwitter\n ? Object.prototype.hasOwnProperty.call(existingTwitter, \"images\") &&\n Boolean(existingTwitter.images)\n : false;\n\n if (!hasTwTitle) {\n if (result.openGraph.title) {\n autoFill.title = result.openGraph.title;\n } else if (resolvedTitle) {\n autoFill.title = resolvedTitle;\n }\n }\n if (!hasTwDescription) {\n autoFill.description = result.openGraph.description || result.description || undefined;\n }\n if (!hasTwImages) {\n autoFill.images = result.openGraph.images;\n }\n\n if (Object.keys(autoFill).length > 0) {\n if (existingTwitter) {\n result.twitter = { ...existingTwitter, ...autoFill };\n } else {\n result.twitter = autoFill;\n }\n }\n }\n\n if (result.twitter) {\n const tw = { ...result.twitter };\n if (!tw.title && resolvedTitle) {\n tw.title = resolvedTitle;\n }\n if (!tw.description && result.description) {\n tw.description = result.description;\n }\n result.twitter = tw;\n }\n\n // If twitter exists (either originally or via auto-fill), ensure card type is set.\n // Next.js resolveTwitter defaults: summary_large_image when images present, else summary.\n if (result.twitter) {\n const tw = { ...result.twitter };\n if (!tw.card) {\n const images = tw.images;\n const hasImages = Array.isArray(images) ? images.length > 0 : Boolean(images);\n tw.card = hasImages ? \"summary_large_image\" : \"summary\";\n }\n result.twitter = tw;\n }\n\n return result;\n}\n\n/**\n * Merge metadata from multiple sources (layouts + page).\n *\n * The list is ordered [rootLayout, nestedLayout, ..., page].\n * Title template from layouts applies to the page title but NOT to\n * the segment that defines the template itself. `title.absolute`\n * skips all templates. `title.default` is the fallback when no\n * child provides a title.\n *\n * For top-level keys, later entries override earlier ones. `other` custom meta\n * tags are the exception: Next.js merges those across segments.\n */\nexport function mergeMetadataEntries(entries: readonly MetadataMergeEntry[]): Metadata {\n if (entries.length === 0) return {};\n\n const merged: Metadata = {};\n\n // Track the most recent title template from LAYOUTS (not from page).\n let parentTemplate: string | undefined;\n\n for (const entry of entries) {\n const meta = entry.metadata;\n const isPage = Boolean(entry.isPage);\n const contributesTitle = entry.contributesTitle !== false;\n\n // Collect template from layouts only (page templates are ignored per Next.js spec)\n if (\n contributesTitle &&\n !isPage &&\n meta.title &&\n typeof meta.title === \"object\" &&\n meta.title.template\n ) {\n parentTemplate = meta.title.template;\n }\n\n // Merge non-title keys\n for (const key of Object.keys(meta)) {\n if (key === \"title\") continue; // Handle title separately below\n\n const incoming = meta[key];\n const existing = merged[key];\n\n if (key === \"other\" && isOtherMetadata(existing) && isOtherMetadata(incoming)) {\n merged.other = { ...existing, ...incoming };\n } else {\n // Plain replacement for everything else\n merged[key] = incoming;\n }\n }\n\n // Title resolution\n if (contributesTitle && meta.title !== undefined) {\n merged.title = meta.title;\n }\n }\n\n // Now resolve the final title, applying the parent template if applicable\n const finalTitle = merged.title;\n if (finalTitle) {\n if (typeof finalTitle === \"string\") {\n // Simple string title — apply parent template\n if (parentTemplate) {\n merged.title = parentTemplate.replace(\"%s\", finalTitle);\n }\n } else if (typeof finalTitle === \"object\") {\n if (finalTitle.absolute) {\n // Absolute title — skip all templates\n merged.title = finalTitle.absolute;\n } else if (finalTitle.default) {\n // Title object with default — this is used when the segment IS the\n // defining layout (its own default doesn't get template-wrapped)\n merged.title = finalTitle.default;\n } else if (finalTitle.template && !finalTitle.default && !finalTitle.absolute) {\n // Template only with no default — no title to render\n merged.title = undefined;\n }\n }\n }\n\n return merged;\n}\n\n/**\n * Resolve metadata from a module. Handles both static `metadata` export\n * and async `generateMetadata()` function.\n *\n * @param parent - A Promise that resolves to the accumulated (merged) metadata\n * from all ancestor segments. Passed as the second argument to\n * `generateMetadata()`, matching Next.js's eager-execution-with-serial-\n * resolution approach. If not provided, defaults to a promise that resolves\n * to an empty object (so `await parent` never throws).\n */\nexport async function resolveModuleMetadata(\n mod: Record<string, unknown>,\n params: Record<string, string | string[]> = {},\n searchParams?: Record<string, string | string[]>,\n parent: Promise<Metadata> = Promise.resolve({}),\n): Promise<Metadata | null> {\n if (typeof mod.generateMetadata === \"function\") {\n // Next.js 16 passes params/searchParams as Promises (async pattern).\n // makeThenableParams() normalises null-prototype + preserves sync access.\n const asyncParams = makeThenableParams(params);\n const props =\n searchParams === undefined\n ? { params: asyncParams }\n : { params: asyncParams, searchParams: makeThenableParams(searchParams) };\n return await mod.generateMetadata(props, parent);\n }\n if (mod.metadata && typeof mod.metadata === \"object\") {\n return mod.metadata as Metadata;\n }\n return null;\n}\n\n/**\n * React component that renders metadata as HTML head elements.\n * Used by the RSC entry to inject into the <head>.\n */\nfunction isIconDescriptor(value: unknown): value is IconDescriptor {\n if (typeof value !== \"object\" || value === null || value instanceof URL || Array.isArray(value)) {\n return false;\n }\n const urlValue = Reflect.get(value, \"url\");\n return typeof urlValue === \"string\" || urlValue instanceof URL;\n}\n\nfunction isIconsMap(value: IconsMetadata): value is IconsMap {\n return (\n typeof value === \"object\" &&\n !(value instanceof URL) &&\n !Array.isArray(value) &&\n !isIconDescriptor(value)\n );\n}\n\nfunction normalizeUrlDescriptor<T extends { url: string | URL }>(\n value: string | URL | T,\n createDescriptor: (url: string | URL) => T,\n): T {\n if (typeof value === \"string\" || value instanceof URL) {\n return createDescriptor(value);\n }\n return value;\n}\n\nfunction normalizeUrlDescriptorEntries<T extends { url: string | URL }>(\n value: string | URL | T | Array<string | URL | T> | undefined,\n createDescriptor: (url: string | URL) => T,\n): T[] {\n if (!value) {\n return [];\n }\n\n if (Array.isArray(value)) {\n return value.map((entry) => normalizeUrlDescriptor(entry, createDescriptor));\n }\n\n return [normalizeUrlDescriptor(value, createDescriptor)];\n}\n\nexport function MetadataHead({ metadata }: { metadata: Metadata }) {\n const elements: React.ReactElement[] = [];\n let key = 0;\n\n // Resolve metadataBase for URL composition\n const base = metadata.metadataBase;\n function resolveUrl(url: string | URL): string;\n function resolveUrl(url: string | URL | undefined): string | undefined;\n function resolveUrl(url: string | URL | undefined): string | undefined {\n if (!url) return undefined;\n // Coerce URL objects to strings (Next.js metadata allows string | URL)\n const s = typeof url === \"string\" ? url : url instanceof URL ? url.toString() : String(url);\n if (!base) return s;\n if (s.startsWith(\"http://\") || s.startsWith(\"https://\") || s.startsWith(\"//\")) return s;\n try {\n return new URL(s, base).toString();\n } catch {\n return s;\n }\n }\n\n // Title\n const title =\n typeof metadata.title === \"string\"\n ? metadata.title\n : typeof metadata.title === \"object\"\n ? metadata.title.absolute || metadata.title.default\n : undefined;\n if (title) {\n elements.push(<title key={key++}>{title}</title>);\n }\n\n // Description\n if (metadata.description) {\n elements.push(<meta key={key++} name=\"description\" content={metadata.description} />);\n }\n\n // Generator\n if (metadata.generator) {\n elements.push(<meta key={key++} name=\"generator\" content={metadata.generator} />);\n }\n\n // Application name\n if (metadata.applicationName) {\n elements.push(<meta key={key++} name=\"application-name\" content={metadata.applicationName} />);\n }\n\n // Referrer\n if (metadata.referrer) {\n elements.push(<meta key={key++} name=\"referrer\" content={metadata.referrer} />);\n }\n\n // Keywords\n if (metadata.keywords) {\n const kw = Array.isArray(metadata.keywords) ? metadata.keywords.join(\",\") : metadata.keywords;\n elements.push(<meta key={key++} name=\"keywords\" content={kw} />);\n }\n\n // Authors\n if (metadata.authors) {\n const authorList = Array.isArray(metadata.authors) ? metadata.authors : [metadata.authors];\n for (const author of authorList) {\n if (author.name) {\n elements.push(<meta key={key++} name=\"author\" content={author.name} />);\n }\n if (author.url) {\n elements.push(<link key={key++} rel=\"author\" href={author.url} />);\n }\n }\n }\n\n // Creator\n if (metadata.creator) {\n elements.push(<meta key={key++} name=\"creator\" content={metadata.creator} />);\n }\n\n // Publisher\n if (metadata.publisher) {\n elements.push(<meta key={key++} name=\"publisher\" content={metadata.publisher} />);\n }\n\n // Format detection\n if (metadata.formatDetection) {\n const parts: string[] = [];\n if (metadata.formatDetection.telephone === false) parts.push(\"telephone=no\");\n if (metadata.formatDetection.address === false) parts.push(\"address=no\");\n if (metadata.formatDetection.email === false) parts.push(\"email=no\");\n if (parts.length > 0) {\n elements.push(<meta key={key++} name=\"format-detection\" content={parts.join(\", \")} />);\n }\n }\n\n // Category\n if (metadata.category) {\n elements.push(<meta key={key++} name=\"category\" content={metadata.category} />);\n }\n\n // Robots\n if (metadata.robots) {\n if (typeof metadata.robots === \"string\") {\n elements.push(<meta key={key++} name=\"robots\" content={metadata.robots} />);\n } else {\n const { googleBot, ...robotsRest } = metadata.robots;\n const robotParts: string[] = [];\n for (const [k, v] of Object.entries(robotsRest)) {\n if (v === true) robotParts.push(k);\n else if (v === false) robotParts.push(`no${k}`);\n else if (typeof v === \"string\" || typeof v === \"number\") robotParts.push(`${k}:${v}`);\n }\n if (robotParts.length > 0) {\n elements.push(<meta key={key++} name=\"robots\" content={robotParts.join(\", \")} />);\n }\n // googlebot\n if (googleBot) {\n if (typeof googleBot === \"string\") {\n elements.push(<meta key={key++} name=\"googlebot\" content={googleBot} />);\n } else {\n const gbParts: string[] = [];\n for (const [k, v] of Object.entries(googleBot)) {\n if (v === true) gbParts.push(k);\n else if (v === false) gbParts.push(`no${k}`);\n else if (typeof v === \"string\" || typeof v === \"number\") gbParts.push(`${k}:${v}`);\n }\n if (gbParts.length > 0) {\n elements.push(<meta key={key++} name=\"googlebot\" content={gbParts.join(\", \")} />);\n }\n }\n }\n }\n }\n\n // Open Graph\n if (metadata.openGraph) {\n const og = metadata.openGraph;\n if (og.title) elements.push(<meta key={key++} property=\"og:title\" content={og.title} />);\n if (og.description)\n elements.push(<meta key={key++} property=\"og:description\" content={og.description} />);\n if (og.url) elements.push(<meta key={key++} property=\"og:url\" content={resolveUrl(og.url)} />);\n if (og.siteName)\n elements.push(<meta key={key++} property=\"og:site_name\" content={og.siteName} />);\n if (og.type) elements.push(<meta key={key++} property=\"og:type\" content={og.type} />);\n if (og.locale) elements.push(<meta key={key++} property=\"og:locale\" content={og.locale} />);\n if (og.publishedTime)\n elements.push(\n <meta key={key++} property=\"article:published_time\" content={og.publishedTime} />,\n );\n if (og.modifiedTime)\n elements.push(\n <meta key={key++} property=\"article:modified_time\" content={og.modifiedTime} />,\n );\n if (og.authors) {\n for (const author of og.authors) {\n elements.push(<meta key={key++} property=\"article:author\" content={author} />);\n }\n }\n if (og.images) {\n const imgList =\n typeof og.images === \"string\" || og.images instanceof URL\n ? [{ url: og.images }]\n : Array.isArray(og.images)\n ? og.images\n : [og.images];\n for (const img of imgList) {\n const imgUrl = typeof img === \"string\" || img instanceof URL ? img : img.url;\n elements.push(<meta key={key++} property=\"og:image\" content={resolveUrl(imgUrl)} />);\n if (typeof img !== \"string\" && !(img instanceof URL)) {\n if (img.width)\n elements.push(\n <meta key={key++} property=\"og:image:width\" content={String(img.width)} />,\n );\n if (img.height)\n elements.push(\n <meta key={key++} property=\"og:image:height\" content={String(img.height)} />,\n );\n if (img.type)\n elements.push(<meta key={key++} property=\"og:image:type\" content={img.type} />);\n if (img.alt)\n elements.push(<meta key={key++} property=\"og:image:alt\" content={img.alt} />);\n }\n }\n }\n if (og.videos) {\n for (const video of og.videos) {\n elements.push(<meta key={key++} property=\"og:video\" content={resolveUrl(video.url)} />);\n if (video.width)\n elements.push(\n <meta key={key++} property=\"og:video:width\" content={String(video.width)} />,\n );\n if (video.height)\n elements.push(\n <meta key={key++} property=\"og:video:height\" content={String(video.height)} />,\n );\n }\n }\n if (og.audio) {\n for (const audio of og.audio) {\n elements.push(<meta key={key++} property=\"og:audio\" content={resolveUrl(audio.url)} />);\n }\n }\n }\n\n // Twitter\n if (metadata.twitter) {\n const tw = metadata.twitter;\n if (tw.card) elements.push(<meta key={key++} name=\"twitter:card\" content={tw.card} />);\n if (tw.site) elements.push(<meta key={key++} name=\"twitter:site\" content={tw.site} />);\n if (tw.siteId) elements.push(<meta key={key++} name=\"twitter:site:id\" content={tw.siteId} />);\n if (tw.title) elements.push(<meta key={key++} name=\"twitter:title\" content={tw.title} />);\n if (tw.description)\n elements.push(<meta key={key++} name=\"twitter:description\" content={tw.description} />);\n if (tw.creator) elements.push(<meta key={key++} name=\"twitter:creator\" content={tw.creator} />);\n if (tw.creatorId)\n elements.push(<meta key={key++} name=\"twitter:creator:id\" content={tw.creatorId} />);\n if (tw.images) {\n const imgList =\n typeof tw.images === \"string\" || tw.images instanceof URL\n ? [tw.images]\n : Array.isArray(tw.images)\n ? tw.images\n : [tw.images];\n for (const img of imgList) {\n const imgUrl = typeof img === \"string\" || img instanceof URL ? img : img.url;\n elements.push(<meta key={key++} name=\"twitter:image\" content={resolveUrl(imgUrl)} />);\n if (typeof img !== \"string\" && !(img instanceof URL)) {\n if (img.type) {\n elements.push(<meta key={key++} name=\"twitter:image:type\" content={img.type} />);\n }\n if (img.width) {\n elements.push(\n <meta key={key++} name=\"twitter:image:width\" content={String(img.width)} />,\n );\n }\n if (img.height) {\n elements.push(\n <meta key={key++} name=\"twitter:image:height\" content={String(img.height)} />,\n );\n }\n if (img.alt) {\n elements.push(<meta key={key++} name=\"twitter:image:alt\" content={img.alt} />);\n }\n }\n }\n }\n // Twitter player cards\n if (tw.players) {\n const players = Array.isArray(tw.players) ? tw.players : [tw.players];\n for (const player of players) {\n const playerUrl = player.playerUrl.toString();\n const streamUrl = player.streamUrl.toString();\n elements.push(<meta key={key++} name=\"twitter:player\" content={resolveUrl(playerUrl)} />);\n elements.push(\n <meta key={key++} name=\"twitter:player:stream\" content={resolveUrl(streamUrl)} />,\n );\n elements.push(\n <meta key={key++} name=\"twitter:player:width\" content={String(player.width)} />,\n );\n elements.push(\n <meta key={key++} name=\"twitter:player:height\" content={String(player.height)} />,\n );\n }\n }\n // Twitter app cards\n if (tw.app) {\n const { app } = tw;\n for (const platform of [\"iphone\", \"ipad\", \"googleplay\"] as const) {\n if (app.name) {\n elements.push(\n <meta key={key++} name={`twitter:app:name:${platform}`} content={app.name} />,\n );\n }\n if (app.id[platform] !== undefined) {\n elements.push(\n <meta\n key={key++}\n name={`twitter:app:id:${platform}`}\n content={String(app.id[platform])}\n />,\n );\n }\n if (app.url?.[platform] !== undefined) {\n const appUrl = app.url[platform]!.toString();\n elements.push(\n <meta key={key++} name={`twitter:app:url:${platform}`} content={resolveUrl(appUrl)} />,\n );\n }\n }\n }\n }\n\n // Icons\n if (metadata.icons) {\n const iconEntries = isIconsMap(metadata.icons)\n ? normalizeUrlDescriptorEntries(metadata.icons.icon, (url): IconDescriptor => ({ url }))\n : normalizeUrlDescriptorEntries(metadata.icons, (url): IconDescriptor => ({ url }));\n\n // Shortcut icon\n if (isIconsMap(metadata.icons) && metadata.icons.shortcut) {\n const shortcuts = Array.isArray(metadata.icons.shortcut)\n ? metadata.icons.shortcut\n : [metadata.icons.shortcut];\n for (const s of shortcuts) {\n elements.push(<link key={key++} rel=\"shortcut icon\" href={resolveUrl(s)} />);\n }\n }\n // Icon\n if (iconEntries.length > 0) {\n for (const i of iconEntries) {\n elements.push(\n <link\n key={key++}\n rel=\"icon\"\n href={resolveUrl(i.url)}\n {...(i.sizes ? { sizes: i.sizes } : {})}\n {...(i.type ? { type: i.type } : {})}\n {...(i.media ? { media: i.media } : {})}\n />,\n );\n }\n }\n // Apple touch icon\n if (isIconsMap(metadata.icons) && metadata.icons.apple) {\n for (const a of normalizeUrlDescriptorEntries(\n metadata.icons.apple,\n (url): AppleIconDescriptor => ({ url }),\n )) {\n elements.push(\n <link\n key={key++}\n rel=\"apple-touch-icon\"\n href={resolveUrl(a.url)}\n {...(a.sizes ? { sizes: a.sizes } : {})}\n {...(a.type ? { type: a.type } : {})}\n />,\n );\n }\n }\n // Other custom icon relations\n if (isIconsMap(metadata.icons) && metadata.icons.other) {\n for (const o of metadata.icons.other) {\n elements.push(\n <link\n key={key++}\n rel={o.rel}\n href={resolveUrl(o.url)}\n {...(o.sizes ? { sizes: o.sizes } : {})}\n />,\n );\n }\n }\n }\n\n // Manifest\n if (metadata.manifest) {\n elements.push(<link key={key++} rel=\"manifest\" href={resolveUrl(metadata.manifest)} />);\n }\n\n // Alternates\n if (metadata.alternates) {\n const alt = metadata.alternates;\n if (alt.canonical) {\n elements.push(<link key={key++} rel=\"canonical\" href={resolveUrl(alt.canonical)} />);\n }\n if (alt.languages) {\n for (const [lang, href] of Object.entries(alt.languages)) {\n elements.push(<link key={key++} rel=\"alternate\" hrefLang={lang} href={resolveUrl(href)} />);\n }\n }\n if (alt.media) {\n for (const [media, href] of Object.entries(alt.media)) {\n elements.push(<link key={key++} rel=\"alternate\" media={media} href={resolveUrl(href)} />);\n }\n }\n if (alt.types) {\n for (const [type, href] of Object.entries(alt.types)) {\n elements.push(<link key={key++} rel=\"alternate\" type={type} href={resolveUrl(href)} />);\n }\n }\n }\n\n // Verification\n if (metadata.verification) {\n const v = metadata.verification;\n if (v.google)\n elements.push(<meta key={key++} name=\"google-site-verification\" content={v.google} />);\n if (v.yahoo) elements.push(<meta key={key++} name=\"y_key\" content={v.yahoo} />);\n if (v.yandex) elements.push(<meta key={key++} name=\"yandex-verification\" content={v.yandex} />);\n if (v.other) {\n for (const [name, content] of Object.entries(v.other)) {\n const values = Array.isArray(content) ? content : [content];\n for (const val of values) {\n elements.push(<meta key={key++} name={name} content={val} />);\n }\n }\n }\n }\n\n // Apple Web App\n if (metadata.appleWebApp) {\n const awa = metadata.appleWebApp;\n if (awa.capable !== false) {\n elements.push(<meta key={key++} name=\"mobile-web-app-capable\" content=\"yes\" />);\n }\n if (awa.title) {\n elements.push(<meta key={key++} name=\"apple-mobile-web-app-title\" content={awa.title} />);\n }\n if (awa.statusBarStyle) {\n elements.push(\n <meta\n key={key++}\n name=\"apple-mobile-web-app-status-bar-style\"\n content={awa.statusBarStyle}\n />,\n );\n }\n if (awa.startupImage) {\n const imgs =\n typeof awa.startupImage === \"string\" ? [{ url: awa.startupImage }] : awa.startupImage;\n for (const img of imgs) {\n elements.push(\n <link\n key={key++}\n rel=\"apple-touch-startup-image\"\n href={resolveUrl(img.url)}\n {...(img.media ? { media: img.media } : {})}\n />,\n );\n }\n }\n }\n\n // iTunes\n if (metadata.itunes) {\n const { appId, appArgument } = metadata.itunes;\n let content = `app-id=${appId}`;\n if (appArgument) {\n content += `, app-argument=${appArgument}`;\n }\n elements.push(<meta key={key++} name=\"apple-itunes-app\" content={content} />);\n }\n\n // App Links\n if (metadata.appLinks) {\n const al = metadata.appLinks;\n const platforms = [\n \"ios\",\n \"iphone\",\n \"ipad\",\n \"android\",\n \"windows_phone\",\n \"windows\",\n \"windows_universal\",\n \"web\",\n ] as const;\n for (const platform of platforms) {\n const entries = al[platform];\n if (!entries) continue;\n const list = Array.isArray(entries) ? entries : [entries];\n for (const entry of list) {\n for (const [k, v] of Object.entries(entry)) {\n if (v === undefined || v === null) continue;\n const str = String(v);\n const content = k === \"url\" ? resolveUrl(str) : str;\n elements.push(<meta key={key++} property={`al:${platform}:${k}`} content={content} />);\n }\n }\n }\n }\n\n // Other custom meta tags\n if (metadata.other) {\n for (const [name, content] of Object.entries(metadata.other)) {\n const values = Array.isArray(content) ? content : [content];\n for (const val of values) {\n elements.push(<meta key={key++} name={name} content={val} />);\n }\n }\n }\n\n return <>{elements}</>;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"metadata.js","names":[],"sources":["../../src/shims/metadata.tsx"],"sourcesContent":["/**\n * Metadata support for App Router.\n *\n * Handles `export const metadata` and `export async function generateMetadata()`.\n * Resolves metadata from layouts and pages (pages override layouts).\n */\nimport React from \"react\";\nimport { makeThenableParams } from \"./thenable-params.js\";\n\n// ---------------------------------------------------------------------------\n// Viewport types and resolution\n// ---------------------------------------------------------------------------\n\nexport type Viewport = {\n /** Viewport width (default: \"device-width\") */\n width?: string | number;\n /** Viewport height */\n height?: string | number;\n /** Initial scale */\n initialScale?: number;\n /** Minimum scale */\n minimumScale?: number;\n /** Maximum scale */\n maximumScale?: number;\n /** Whether user can scale */\n userScalable?: boolean;\n /** Theme color — single color or array of { media, color } */\n themeColor?: string | Array<{ media?: string; color: string }>;\n /** Color scheme: 'light' | 'dark' | 'light dark' | 'normal' */\n colorScheme?: string;\n};\n\n/**\n * Resolve viewport config from a module. Handles both static `viewport` export\n * and async `generateViewport()` function.\n */\nexport async function resolveModuleViewport(\n mod: Record<string, unknown>,\n params: Record<string, string | string[]>,\n): Promise<Viewport | null> {\n if (typeof mod.generateViewport === \"function\") {\n const asyncParams = makeThenableParams(params);\n return await mod.generateViewport({ params: asyncParams });\n }\n if (mod.viewport && typeof mod.viewport === \"object\") {\n return mod.viewport as Viewport;\n }\n return null;\n}\n\n/**\n * Merge viewport configs from multiple sources (layouts + page).\n * Later entries override earlier ones.\n */\nexport const DEFAULT_VIEWPORT: Viewport = {\n width: \"device-width\",\n initialScale: 1,\n};\n\nexport function mergeViewport(viewportList: Viewport[]): Viewport {\n const merged: Viewport = { ...DEFAULT_VIEWPORT };\n for (const vp of viewportList) {\n Object.assign(merged, vp);\n }\n return merged;\n}\n\n/**\n * React component that renders viewport meta tags into <head>.\n */\nexport function ViewportHead({ viewport }: { viewport: Viewport }) {\n const elements: React.ReactElement[] = [];\n let key = 0;\n\n // Build viewport content string\n const parts: string[] = [];\n if (viewport.width !== undefined) parts.push(`width=${viewport.width}`);\n if (viewport.height !== undefined) parts.push(`height=${viewport.height}`);\n if (viewport.initialScale !== undefined) parts.push(`initial-scale=${viewport.initialScale}`);\n if (viewport.minimumScale !== undefined) parts.push(`minimum-scale=${viewport.minimumScale}`);\n if (viewport.maximumScale !== undefined) parts.push(`maximum-scale=${viewport.maximumScale}`);\n if (viewport.userScalable !== undefined)\n parts.push(`user-scalable=${viewport.userScalable ? \"yes\" : \"no\"}`);\n\n if (parts.length > 0) {\n elements.push(<meta key={key++} name=\"viewport\" content={parts.join(\", \")} />);\n }\n\n // Theme color\n if (viewport.themeColor) {\n if (typeof viewport.themeColor === \"string\") {\n elements.push(<meta key={key++} name=\"theme-color\" content={viewport.themeColor} />);\n } else if (Array.isArray(viewport.themeColor)) {\n for (const entry of viewport.themeColor) {\n elements.push(\n <meta\n key={key++}\n name=\"theme-color\"\n content={entry.color}\n {...(entry.media ? { media: entry.media } : {})}\n />,\n );\n }\n }\n }\n\n // Color scheme\n if (viewport.colorScheme) {\n elements.push(<meta key={key++} name=\"color-scheme\" content={viewport.colorScheme} />);\n }\n\n return <>{elements}</>;\n}\n\n// ---------------------------------------------------------------------------\n// Metadata types and resolution\n// ---------------------------------------------------------------------------\n\nexport type Metadata = {\n title?: string | { default?: string; template?: string; absolute?: string };\n description?: string;\n generator?: string;\n applicationName?: string;\n referrer?: string;\n keywords?: string | string[];\n authors?: Array<{ name?: string; url?: string }> | { name?: string; url?: string };\n creator?: string;\n publisher?: string;\n robots?:\n | string\n | {\n index?: boolean;\n follow?: boolean;\n googleBot?: string | { index?: boolean; follow?: boolean; [key: string]: unknown };\n [key: string]: unknown;\n };\n openGraph?: {\n title?: string;\n description?: string;\n url?: string | URL;\n siteName?: string;\n images?:\n | string\n | URL\n | { url: string | URL; width?: number; height?: number; alt?: string; type?: string }\n | Array<\n | string\n | URL\n | { url: string | URL; width?: number; height?: number; alt?: string; type?: string }\n >;\n videos?: Array<{ url: string | URL; width?: number; height?: number }>;\n audio?: Array<{ url: string | URL }>;\n locale?: string;\n type?: string;\n publishedTime?: string;\n modifiedTime?: string;\n authors?: string[];\n };\n twitter?: {\n card?: string;\n site?: string;\n siteId?: string;\n title?: string;\n description?: string;\n images?:\n | string\n | URL\n | { url: string | URL; alt?: string; width?: number; height?: number; type?: string }\n | Array<\n | string\n | URL\n | { url: string | URL; alt?: string; width?: number; height?: number; type?: string }\n >;\n creator?: string;\n creatorId?: string;\n players?: TwitterPlayerDescriptor | TwitterPlayerDescriptor[];\n app?: TwitterAppDescriptor;\n };\n icons?: IconsMetadata;\n manifest?: string | URL;\n alternates?: {\n canonical?: string | URL;\n languages?: Record<string, string | URL>;\n media?: Record<string, string | URL>;\n types?: Record<string, string | URL>;\n };\n verification?: {\n google?: string;\n yahoo?: string;\n yandex?: string;\n other?: Record<string, string | string[]>;\n };\n metadataBase?: URL | null;\n appleWebApp?: {\n capable?: boolean;\n title?: string;\n statusBarStyle?: string;\n startupImage?: string | Array<{ url: string; media?: string }>;\n };\n formatDetection?: {\n email?: boolean;\n address?: boolean;\n telephone?: boolean;\n };\n category?: string;\n itunes?: {\n appId: string;\n appArgument?: string;\n };\n appLinks?: {\n ios?: AppLinksApple | AppLinksApple[];\n iphone?: AppLinksApple | AppLinksApple[];\n ipad?: AppLinksApple | AppLinksApple[];\n android?: AppLinksAndroid | AppLinksAndroid[];\n windows_phone?: AppLinksWindows | AppLinksWindows[];\n windows?: AppLinksWindows | AppLinksWindows[];\n windows_universal?: AppLinksWindows | AppLinksWindows[];\n web?: AppLinksWeb | AppLinksWeb[];\n };\n other?: Record<string, string | string[]>;\n [key: string]: unknown;\n};\n\ntype AppLinksApple = {\n url: string | URL;\n app_store_id?: string | number;\n app_name?: string;\n};\n\ntype AppLinksAndroid = {\n package: string;\n url?: string | URL;\n class?: string;\n app_name?: string;\n};\n\ntype AppLinksWindows = {\n url: string | URL;\n app_id?: string;\n app_name?: string;\n};\n\ntype AppLinksWeb = {\n url: string | URL;\n should_fallback?: boolean;\n};\n\ntype TwitterPlayerDescriptor = {\n playerUrl: string | URL;\n streamUrl: string | URL;\n width: number;\n height: number;\n};\n\ntype TwitterAppDescriptor = {\n id: {\n iphone?: string | number;\n ipad?: string | number;\n googleplay?: string;\n };\n url?: {\n iphone?: string | URL;\n ipad?: string | URL;\n googleplay?: string | URL;\n };\n name?: string;\n};\n\ntype IconDescriptor = {\n url: string | URL;\n sizes?: string;\n type?: string;\n media?: string;\n};\n\ntype AppleIconDescriptor = {\n url: string | URL;\n sizes?: string;\n type?: string;\n};\n\ntype IconInput = string | URL | IconDescriptor;\ntype AppleIconInput = string | URL | AppleIconDescriptor;\n\ntype IconsMap = {\n icon?: IconInput | IconInput[];\n shortcut?: string | URL | Array<string | URL>;\n apple?: AppleIconInput | AppleIconInput[];\n other?: Array<{ rel: string; url: string | URL; sizes?: string; type?: string }>;\n};\n\ntype IconsMetadata = IconInput | IconInput[] | IconsMap;\n\nexport type MetadataMergeEntry = {\n contributesTitle?: boolean;\n isPage?: boolean;\n metadata: Metadata;\n};\n\n/**\n * Merge metadata from multiple sources (layouts + page).\n *\n * The list is ordered [rootLayout, nestedLayout, ..., page].\n * Title template from layouts applies to the page title but NOT to\n * the segment that defines the template itself. `title.absolute`\n * skips all templates. `title.default` is the fallback when no\n * child provides a title.\n *\n * Shallow merge: later entries override earlier ones (per Next.js docs).\n */\nexport function mergeMetadata(metadataList: Metadata[]): Metadata {\n const merged = mergeMetadataEntries(\n metadataList.map((metadata, index) => ({\n isPage: index === metadataList.length - 1,\n metadata,\n })),\n );\n return postProcessMetadata(merged);\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return (\n typeof value === \"object\" && value !== null && !Array.isArray(value) && !(value instanceof URL)\n );\n}\n\nfunction isOtherMetadata(value: unknown): value is NonNullable<Metadata[\"other\"]> {\n if (!isPlainObject(value)) return false;\n return Object.values(value).every((item) => {\n if (typeof item === \"string\") return true;\n return Array.isArray(item) && item.every((nestedItem) => typeof nestedItem === \"string\");\n });\n}\n\n/**\n * Extract a plain string title from a metadata title value.\n */\nfunction resolveStringTitle(title: Metadata[\"title\"]): string | undefined {\n if (typeof title === \"string\") return title;\n if (title && typeof title === \"object\") {\n return title.absolute ?? title.default ?? undefined;\n }\n return undefined;\n}\n\n/**\n * Post-process merged metadata to cross-fill openGraph and Twitter fields.\n *\n * Next.js runs this once after all layouts/pages and file-based metadata\n * have been resolved. When openGraph exists, it auto-fills missing\n * twitter:title/description/images from openGraph (falling back to root\n * metadata title/description). Existing openGraph/twitter objects also inherit\n * missing title/description from root metadata.\n *\n * Ported from Next.js:\n * https://github.com/vercel/next.js/blob/canary/packages/next/src/lib/metadata/resolve-metadata.ts\n */\nexport function postProcessMetadata(merged: Metadata): Metadata {\n // Shallow-clone to avoid mutating the caller's object.\n // Both current call sites (mergeMetadata, resolveAppPageHead) pass\n // freshly-constructed objects, but this guards against future misuse.\n const result = { ...merged };\n\n const resolvedTitle = resolveStringTitle(result.title);\n\n // openGraph inherits title/description from root metadata when absent\n if (result.openGraph) {\n const og = { ...result.openGraph };\n if (!og.title && resolvedTitle) {\n og.title = resolvedTitle;\n }\n if (!og.description && result.description) {\n og.description = result.description;\n }\n result.openGraph = og;\n }\n\n if (result.openGraph) {\n const autoFill: {\n title?: string;\n description?: string;\n images?: NonNullable<Metadata[\"twitter\"]>[\"images\"];\n } = {};\n\n const existingTwitter = result.twitter;\n const hasTwTitle = existingTwitter ? Boolean(existingTwitter.title) : false;\n const hasTwDescription = existingTwitter ? Boolean(existingTwitter.description) : false;\n const hasTwImages = existingTwitter\n ? Object.prototype.hasOwnProperty.call(existingTwitter, \"images\") &&\n Boolean(existingTwitter.images)\n : false;\n\n if (!hasTwTitle) {\n if (result.openGraph.title) {\n autoFill.title = result.openGraph.title;\n } else if (resolvedTitle) {\n autoFill.title = resolvedTitle;\n }\n }\n if (!hasTwDescription) {\n autoFill.description = result.openGraph.description || result.description || undefined;\n }\n if (!hasTwImages) {\n autoFill.images = result.openGraph.images;\n }\n\n if (Object.keys(autoFill).length > 0) {\n if (existingTwitter) {\n result.twitter = { ...existingTwitter, ...autoFill };\n } else {\n result.twitter = autoFill;\n }\n }\n }\n\n if (result.twitter) {\n const tw = { ...result.twitter };\n if (!tw.title && resolvedTitle) {\n tw.title = resolvedTitle;\n }\n if (!tw.description && result.description) {\n tw.description = result.description;\n }\n result.twitter = tw;\n }\n\n // If twitter exists (either originally or via auto-fill), ensure card type is set.\n // Next.js resolveTwitter defaults: summary_large_image when images present, else summary.\n if (result.twitter) {\n const tw = { ...result.twitter };\n if (!tw.card) {\n const images = tw.images;\n const hasImages = Array.isArray(images) ? images.length > 0 : Boolean(images);\n tw.card = hasImages ? \"summary_large_image\" : \"summary\";\n }\n result.twitter = tw;\n }\n\n return result;\n}\n\n/**\n * Merge metadata from multiple sources (layouts + page).\n *\n * The list is ordered [rootLayout, nestedLayout, ..., page].\n * Title template from layouts applies to the page title but NOT to\n * the segment that defines the template itself. `title.absolute`\n * skips all templates. `title.default` is the fallback when no\n * child provides a title.\n *\n * For top-level keys, later entries override earlier ones. `other` custom meta\n * tags are the exception: Next.js merges those across segments.\n */\nexport function mergeMetadataEntries(entries: readonly MetadataMergeEntry[]): Metadata {\n if (entries.length === 0) return {};\n\n const merged: Metadata = {};\n\n // Track the most recent title template from LAYOUTS (not from page).\n let parentTemplate: string | undefined;\n\n for (const entry of entries) {\n const meta = entry.metadata;\n const isPage = Boolean(entry.isPage);\n const contributesTitle = entry.contributesTitle !== false;\n\n // Collect template from layouts only (page templates are ignored per Next.js spec)\n if (\n contributesTitle &&\n !isPage &&\n meta.title &&\n typeof meta.title === \"object\" &&\n meta.title.template\n ) {\n parentTemplate = meta.title.template;\n }\n\n // Merge non-title keys\n for (const key of Object.keys(meta)) {\n if (key === \"title\") continue; // Handle title separately below\n\n const incoming = meta[key];\n const existing = merged[key];\n\n if (key === \"other\" && isOtherMetadata(existing) && isOtherMetadata(incoming)) {\n merged.other = { ...existing, ...incoming };\n } else {\n // Plain replacement for everything else\n merged[key] = incoming;\n }\n }\n\n // Title resolution\n if (contributesTitle && meta.title !== undefined) {\n merged.title = meta.title;\n }\n }\n\n // Now resolve the final title, applying the parent template if applicable\n const finalTitle = merged.title;\n if (finalTitle) {\n if (typeof finalTitle === \"string\") {\n // Simple string title — apply parent template\n if (parentTemplate) {\n merged.title = parentTemplate.replace(\"%s\", finalTitle);\n }\n } else if (typeof finalTitle === \"object\") {\n if (finalTitle.absolute) {\n // Absolute title — skip all templates\n merged.title = finalTitle.absolute;\n } else if (finalTitle.default) {\n // Title object with default — this is used when the segment IS the\n // defining layout (its own default doesn't get template-wrapped)\n merged.title = finalTitle.default;\n } else if (finalTitle.template && !finalTitle.default && !finalTitle.absolute) {\n // Template only with no default — no title to render\n merged.title = undefined;\n }\n }\n }\n\n return merged;\n}\n\n/**\n * Resolve metadata from a module. Handles both static `metadata` export\n * and async `generateMetadata()` function.\n *\n * @param parent - A Promise that resolves to the accumulated (merged) metadata\n * from all ancestor segments. Passed as the second argument to\n * `generateMetadata()`, matching Next.js's eager-execution-with-serial-\n * resolution approach. If not provided, defaults to a promise that resolves\n * to an empty object (so `await parent` never throws).\n */\nexport async function resolveModuleMetadata(\n mod: Record<string, unknown>,\n params: Record<string, string | string[]> = {},\n searchParams?: Record<string, string | string[]>,\n parent: Promise<Metadata> = Promise.resolve({}),\n): Promise<Metadata | null> {\n if (typeof mod.generateMetadata === \"function\") {\n // Next.js 16 passes params/searchParams as Promises (async pattern).\n // makeThenableParams() normalises null-prototype + preserves sync access.\n const asyncParams = makeThenableParams(params);\n const props =\n searchParams === undefined\n ? { params: asyncParams }\n : { params: asyncParams, searchParams: makeThenableParams(searchParams) };\n return await mod.generateMetadata(props, parent);\n }\n if (mod.metadata && typeof mod.metadata === \"object\") {\n return mod.metadata as Metadata;\n }\n return null;\n}\n\n/**\n * React component that renders metadata as HTML head elements.\n * Used by the RSC entry to inject into the <head>.\n */\nfunction isIconDescriptor(value: unknown): value is IconDescriptor {\n if (typeof value !== \"object\" || value === null || value instanceof URL || Array.isArray(value)) {\n return false;\n }\n const urlValue = Reflect.get(value, \"url\");\n return typeof urlValue === \"string\" || urlValue instanceof URL;\n}\n\nfunction isIconsMap(value: IconsMetadata): value is IconsMap {\n return (\n typeof value === \"object\" &&\n !(value instanceof URL) &&\n !Array.isArray(value) &&\n !isIconDescriptor(value)\n );\n}\n\nfunction normalizeUrlDescriptor<T extends { url: string | URL }>(\n value: string | URL | T,\n createDescriptor: (url: string | URL) => T,\n): T {\n if (typeof value === \"string\" || value instanceof URL) {\n return createDescriptor(value);\n }\n return value;\n}\n\nfunction normalizeUrlDescriptorEntries<T extends { url: string | URL }>(\n value: string | URL | T | Array<string | URL | T> | undefined,\n createDescriptor: (url: string | URL) => T,\n): T[] {\n if (!value) {\n return [];\n }\n\n if (Array.isArray(value)) {\n return value.map((entry) => normalizeUrlDescriptor(entry, createDescriptor));\n }\n\n return [normalizeUrlDescriptor(value, createDescriptor)];\n}\n\nexport function MetadataHead({ metadata }: { metadata: Metadata }) {\n const elements: React.ReactElement[] = [];\n let key = 0;\n\n // Resolve metadataBase for URL composition\n const base = metadata.metadataBase;\n function resolveUrl(url: string | URL): string;\n function resolveUrl(url: string | URL | undefined): string | undefined;\n function resolveUrl(url: string | URL | undefined): string | undefined {\n if (!url) return undefined;\n // Coerce URL objects to strings (Next.js metadata allows string | URL)\n const s = typeof url === \"string\" ? url : url instanceof URL ? url.toString() : String(url);\n if (!base) return s;\n if (s.startsWith(\"http://\") || s.startsWith(\"https://\") || s.startsWith(\"//\")) return s;\n try {\n return new URL(s, base).toString();\n } catch {\n return s;\n }\n }\n\n // Title\n const title =\n typeof metadata.title === \"string\"\n ? metadata.title\n : typeof metadata.title === \"object\"\n ? metadata.title.absolute || metadata.title.default\n : undefined;\n if (title) {\n elements.push(<title key={key++}>{title}</title>);\n }\n\n // Description\n if (metadata.description) {\n elements.push(<meta key={key++} name=\"description\" content={metadata.description} />);\n }\n\n // Generator\n if (metadata.generator) {\n elements.push(<meta key={key++} name=\"generator\" content={metadata.generator} />);\n }\n\n // Application name\n if (metadata.applicationName) {\n elements.push(<meta key={key++} name=\"application-name\" content={metadata.applicationName} />);\n }\n\n // Referrer\n if (metadata.referrer) {\n elements.push(<meta key={key++} name=\"referrer\" content={metadata.referrer} />);\n }\n\n // Keywords\n if (metadata.keywords) {\n const kw = Array.isArray(metadata.keywords) ? metadata.keywords.join(\",\") : metadata.keywords;\n elements.push(<meta key={key++} name=\"keywords\" content={kw} />);\n }\n\n // Authors\n if (metadata.authors) {\n const authorList = Array.isArray(metadata.authors) ? metadata.authors : [metadata.authors];\n for (const author of authorList) {\n if (author.name) {\n elements.push(<meta key={key++} name=\"author\" content={author.name} />);\n }\n if (author.url) {\n elements.push(<link key={key++} rel=\"author\" href={author.url} />);\n }\n }\n }\n\n // Creator\n if (metadata.creator) {\n elements.push(<meta key={key++} name=\"creator\" content={metadata.creator} />);\n }\n\n // Publisher\n if (metadata.publisher) {\n elements.push(<meta key={key++} name=\"publisher\" content={metadata.publisher} />);\n }\n\n // Format detection\n if (metadata.formatDetection) {\n const parts: string[] = [];\n if (metadata.formatDetection.telephone === false) parts.push(\"telephone=no\");\n if (metadata.formatDetection.address === false) parts.push(\"address=no\");\n if (metadata.formatDetection.email === false) parts.push(\"email=no\");\n if (parts.length > 0) {\n elements.push(<meta key={key++} name=\"format-detection\" content={parts.join(\", \")} />);\n }\n }\n\n // Category\n if (metadata.category) {\n elements.push(<meta key={key++} name=\"category\" content={metadata.category} />);\n }\n\n // Robots\n if (metadata.robots) {\n if (typeof metadata.robots === \"string\") {\n elements.push(<meta key={key++} name=\"robots\" content={metadata.robots} />);\n } else {\n const { googleBot, ...robotsRest } = metadata.robots;\n const robotParts: string[] = [];\n for (const [k, v] of Object.entries(robotsRest)) {\n if (v === true) robotParts.push(k);\n else if (v === false) robotParts.push(`no${k}`);\n else if (typeof v === \"string\" || typeof v === \"number\") robotParts.push(`${k}:${v}`);\n }\n if (robotParts.length > 0) {\n elements.push(<meta key={key++} name=\"robots\" content={robotParts.join(\", \")} />);\n }\n // googlebot\n if (googleBot) {\n if (typeof googleBot === \"string\") {\n elements.push(<meta key={key++} name=\"googlebot\" content={googleBot} />);\n } else {\n const gbParts: string[] = [];\n for (const [k, v] of Object.entries(googleBot)) {\n if (v === true) gbParts.push(k);\n else if (v === false) gbParts.push(`no${k}`);\n else if (typeof v === \"string\" || typeof v === \"number\") gbParts.push(`${k}:${v}`);\n }\n if (gbParts.length > 0) {\n elements.push(<meta key={key++} name=\"googlebot\" content={gbParts.join(\", \")} />);\n }\n }\n }\n }\n }\n\n // Open Graph\n if (metadata.openGraph) {\n const og = metadata.openGraph;\n if (og.title) elements.push(<meta key={key++} property=\"og:title\" content={og.title} />);\n if (og.description)\n elements.push(<meta key={key++} property=\"og:description\" content={og.description} />);\n if (og.url) elements.push(<meta key={key++} property=\"og:url\" content={resolveUrl(og.url)} />);\n if (og.siteName)\n elements.push(<meta key={key++} property=\"og:site_name\" content={og.siteName} />);\n if (og.type) elements.push(<meta key={key++} property=\"og:type\" content={og.type} />);\n if (og.locale) elements.push(<meta key={key++} property=\"og:locale\" content={og.locale} />);\n if (og.publishedTime)\n elements.push(\n <meta key={key++} property=\"article:published_time\" content={og.publishedTime} />,\n );\n if (og.modifiedTime)\n elements.push(\n <meta key={key++} property=\"article:modified_time\" content={og.modifiedTime} />,\n );\n if (og.authors) {\n for (const author of og.authors) {\n elements.push(<meta key={key++} property=\"article:author\" content={author} />);\n }\n }\n if (og.images) {\n const imgList =\n typeof og.images === \"string\" || og.images instanceof URL\n ? [{ url: og.images }]\n : Array.isArray(og.images)\n ? og.images\n : [og.images];\n for (const img of imgList) {\n const imgUrl = typeof img === \"string\" || img instanceof URL ? img : img.url;\n elements.push(<meta key={key++} property=\"og:image\" content={resolveUrl(imgUrl)} />);\n if (typeof img !== \"string\" && !(img instanceof URL)) {\n if (img.width)\n elements.push(\n <meta key={key++} property=\"og:image:width\" content={String(img.width)} />,\n );\n if (img.height)\n elements.push(\n <meta key={key++} property=\"og:image:height\" content={String(img.height)} />,\n );\n if (img.type)\n elements.push(<meta key={key++} property=\"og:image:type\" content={img.type} />);\n if (img.alt)\n elements.push(<meta key={key++} property=\"og:image:alt\" content={img.alt} />);\n }\n }\n }\n if (og.videos) {\n for (const video of og.videos) {\n elements.push(<meta key={key++} property=\"og:video\" content={resolveUrl(video.url)} />);\n if (video.width)\n elements.push(\n <meta key={key++} property=\"og:video:width\" content={String(video.width)} />,\n );\n if (video.height)\n elements.push(\n <meta key={key++} property=\"og:video:height\" content={String(video.height)} />,\n );\n }\n }\n if (og.audio) {\n for (const audio of og.audio) {\n elements.push(<meta key={key++} property=\"og:audio\" content={resolveUrl(audio.url)} />);\n }\n }\n }\n\n // Twitter\n if (metadata.twitter) {\n const tw = metadata.twitter;\n if (tw.card) elements.push(<meta key={key++} name=\"twitter:card\" content={tw.card} />);\n if (tw.site) elements.push(<meta key={key++} name=\"twitter:site\" content={tw.site} />);\n if (tw.siteId) elements.push(<meta key={key++} name=\"twitter:site:id\" content={tw.siteId} />);\n if (tw.title) elements.push(<meta key={key++} name=\"twitter:title\" content={tw.title} />);\n if (tw.description)\n elements.push(<meta key={key++} name=\"twitter:description\" content={tw.description} />);\n if (tw.creator) elements.push(<meta key={key++} name=\"twitter:creator\" content={tw.creator} />);\n if (tw.creatorId)\n elements.push(<meta key={key++} name=\"twitter:creator:id\" content={tw.creatorId} />);\n if (tw.images) {\n const imgList =\n typeof tw.images === \"string\" || tw.images instanceof URL\n ? [tw.images]\n : Array.isArray(tw.images)\n ? tw.images\n : [tw.images];\n for (const img of imgList) {\n const imgUrl = typeof img === \"string\" || img instanceof URL ? img : img.url;\n elements.push(<meta key={key++} name=\"twitter:image\" content={resolveUrl(imgUrl)} />);\n if (typeof img !== \"string\" && !(img instanceof URL)) {\n if (img.type) {\n elements.push(<meta key={key++} name=\"twitter:image:type\" content={img.type} />);\n }\n if (img.width) {\n elements.push(\n <meta key={key++} name=\"twitter:image:width\" content={String(img.width)} />,\n );\n }\n if (img.height) {\n elements.push(\n <meta key={key++} name=\"twitter:image:height\" content={String(img.height)} />,\n );\n }\n if (img.alt) {\n elements.push(<meta key={key++} name=\"twitter:image:alt\" content={img.alt} />);\n }\n }\n }\n }\n // Twitter player cards\n if (tw.players) {\n const players = Array.isArray(tw.players) ? tw.players : [tw.players];\n for (const player of players) {\n const playerUrl = player.playerUrl.toString();\n const streamUrl = player.streamUrl.toString();\n elements.push(<meta key={key++} name=\"twitter:player\" content={resolveUrl(playerUrl)} />);\n elements.push(\n <meta key={key++} name=\"twitter:player:stream\" content={resolveUrl(streamUrl)} />,\n );\n elements.push(\n <meta key={key++} name=\"twitter:player:width\" content={String(player.width)} />,\n );\n elements.push(\n <meta key={key++} name=\"twitter:player:height\" content={String(player.height)} />,\n );\n }\n }\n // Twitter app cards\n if (tw.app) {\n const { app } = tw;\n for (const platform of [\"iphone\", \"ipad\", \"googleplay\"] as const) {\n if (app.name) {\n elements.push(\n <meta key={key++} name={`twitter:app:name:${platform}`} content={app.name} />,\n );\n }\n if (app.id[platform] !== undefined) {\n elements.push(\n <meta\n key={key++}\n name={`twitter:app:id:${platform}`}\n content={String(app.id[platform])}\n />,\n );\n }\n if (app.url?.[platform] !== undefined) {\n const appUrl = app.url[platform]!.toString();\n elements.push(\n <meta key={key++} name={`twitter:app:url:${platform}`} content={resolveUrl(appUrl)} />,\n );\n }\n }\n }\n }\n\n // Icons\n if (metadata.icons) {\n const iconEntries = isIconsMap(metadata.icons)\n ? normalizeUrlDescriptorEntries(metadata.icons.icon, (url): IconDescriptor => ({ url }))\n : normalizeUrlDescriptorEntries(metadata.icons, (url): IconDescriptor => ({ url }));\n\n // Shortcut icon\n if (isIconsMap(metadata.icons) && metadata.icons.shortcut) {\n const shortcuts = Array.isArray(metadata.icons.shortcut)\n ? metadata.icons.shortcut\n : [metadata.icons.shortcut];\n for (const s of shortcuts) {\n elements.push(<link key={key++} rel=\"shortcut icon\" href={resolveUrl(s)} />);\n }\n }\n // Icon\n if (iconEntries.length > 0) {\n for (const i of iconEntries) {\n elements.push(\n <link\n key={key++}\n rel=\"icon\"\n href={resolveUrl(i.url)}\n {...(i.sizes ? { sizes: i.sizes } : {})}\n {...(i.type ? { type: i.type } : {})}\n {...(i.media ? { media: i.media } : {})}\n />,\n );\n }\n }\n // Apple touch icon\n if (isIconsMap(metadata.icons) && metadata.icons.apple) {\n for (const a of normalizeUrlDescriptorEntries(\n metadata.icons.apple,\n (url): AppleIconDescriptor => ({ url }),\n )) {\n elements.push(\n <link\n key={key++}\n rel=\"apple-touch-icon\"\n href={resolveUrl(a.url)}\n {...(a.sizes ? { sizes: a.sizes } : {})}\n {...(a.type ? { type: a.type } : {})}\n />,\n );\n }\n }\n // Other custom icon relations\n if (isIconsMap(metadata.icons) && metadata.icons.other) {\n for (const o of metadata.icons.other) {\n elements.push(\n <link\n key={key++}\n rel={o.rel}\n href={resolveUrl(o.url)}\n {...(o.sizes ? { sizes: o.sizes } : {})}\n />,\n );\n }\n }\n }\n\n // Manifest\n if (metadata.manifest) {\n elements.push(<link key={key++} rel=\"manifest\" href={resolveUrl(metadata.manifest)} />);\n }\n\n // Alternates\n if (metadata.alternates) {\n const alt = metadata.alternates;\n if (alt.canonical) {\n elements.push(<link key={key++} rel=\"canonical\" href={resolveUrl(alt.canonical)} />);\n }\n if (alt.languages) {\n for (const [lang, href] of Object.entries(alt.languages)) {\n elements.push(<link key={key++} rel=\"alternate\" hrefLang={lang} href={resolveUrl(href)} />);\n }\n }\n if (alt.media) {\n for (const [media, href] of Object.entries(alt.media)) {\n elements.push(<link key={key++} rel=\"alternate\" media={media} href={resolveUrl(href)} />);\n }\n }\n if (alt.types) {\n for (const [type, href] of Object.entries(alt.types)) {\n elements.push(<link key={key++} rel=\"alternate\" type={type} href={resolveUrl(href)} />);\n }\n }\n }\n\n // Verification\n if (metadata.verification) {\n const v = metadata.verification;\n if (v.google)\n elements.push(<meta key={key++} name=\"google-site-verification\" content={v.google} />);\n if (v.yahoo) elements.push(<meta key={key++} name=\"y_key\" content={v.yahoo} />);\n if (v.yandex) elements.push(<meta key={key++} name=\"yandex-verification\" content={v.yandex} />);\n if (v.other) {\n for (const [name, content] of Object.entries(v.other)) {\n const values = Array.isArray(content) ? content : [content];\n for (const val of values) {\n elements.push(<meta key={key++} name={name} content={val} />);\n }\n }\n }\n }\n\n // Apple Web App\n if (metadata.appleWebApp) {\n const awa = metadata.appleWebApp;\n if (awa.capable !== false) {\n elements.push(<meta key={key++} name=\"mobile-web-app-capable\" content=\"yes\" />);\n }\n if (awa.title) {\n elements.push(<meta key={key++} name=\"apple-mobile-web-app-title\" content={awa.title} />);\n }\n if (awa.statusBarStyle) {\n elements.push(\n <meta\n key={key++}\n name=\"apple-mobile-web-app-status-bar-style\"\n content={awa.statusBarStyle}\n />,\n );\n }\n if (awa.startupImage) {\n const imgs =\n typeof awa.startupImage === \"string\" ? [{ url: awa.startupImage }] : awa.startupImage;\n for (const img of imgs) {\n elements.push(\n <link\n key={key++}\n rel=\"apple-touch-startup-image\"\n href={resolveUrl(img.url)}\n {...(img.media ? { media: img.media } : {})}\n />,\n );\n }\n }\n }\n\n // iTunes\n if (metadata.itunes) {\n const { appId, appArgument } = metadata.itunes;\n let content = `app-id=${appId}`;\n if (appArgument) {\n content += `, app-argument=${appArgument}`;\n }\n elements.push(<meta key={key++} name=\"apple-itunes-app\" content={content} />);\n }\n\n // App Links\n if (metadata.appLinks) {\n const al = metadata.appLinks;\n const platforms = [\n \"ios\",\n \"iphone\",\n \"ipad\",\n \"android\",\n \"windows_phone\",\n \"windows\",\n \"windows_universal\",\n \"web\",\n ] as const;\n for (const platform of platforms) {\n const entries = al[platform];\n if (!entries) continue;\n const list = Array.isArray(entries) ? entries : [entries];\n for (const entry of list) {\n for (const [k, v] of Object.entries(entry)) {\n if (v === undefined || v === null) continue;\n const str = String(v);\n const content = k === \"url\" ? resolveUrl(str) : str;\n elements.push(<meta key={key++} property={`al:${platform}:${k}`} content={content} />);\n }\n }\n }\n }\n\n // Other custom meta tags\n if (metadata.other) {\n for (const [name, content] of Object.entries(metadata.other)) {\n const values = Array.isArray(content) ? content : [content];\n for (const val of values) {\n elements.push(<meta key={key++} name={name} content={val} />);\n }\n }\n }\n\n return <>{elements}</>;\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"navigation-state.js","names":[],"sources":["../../src/shims/navigation-state.ts"],"sourcesContent":["/**\n * Server-only navigation state backed by AsyncLocalStorage.\n *\n * This module provides request-scoped isolation for navigation context\n * and useServerInsertedHTML callbacks. Without ALS, concurrent requests\n * on Cloudflare Workers would share module-level state and leak data\n * (pathnames, params, CSS-in-JS styles) between requests.\n *\n * This module is server-only — it imports node:async_hooks and must NOT\n * be bundled for the browser. The dual-environment navigation.ts shim\n * uses a registration pattern so it works in both environments.\n */\n\nimport { getOrCreateAls } from \"./internal/als-registry.js\";\nimport {\n _registerStateAccessors,\n type NavigationContext,\n GLOBAL_ACCESSORS_KEY,\n} from \"./navigation.js\";\nimport {\n isInsideUnifiedScope,\n getRequestContext,\n runWithUnifiedStateMutation,\n} from \"./unified-request-context.js\";\n\n// ---------------------------------------------------------------------------\n// ALS setup — same pattern as headers.ts\n// ---------------------------------------------------------------------------\n\nexport type NavigationState = {\n serverContext: NavigationContext | null;\n serverInsertedHTMLCallbacks: Array<() => unknown>;\n};\n\nconst _FALLBACK_KEY = Symbol.for(\"vinext.navigation.fallback\");\nconst _g = globalThis as unknown as Record<PropertyKey, unknown>;\nconst _als = getOrCreateAls<NavigationState>(\"vinext.navigation.als\");\n\nconst _fallbackState = (_g[_FALLBACK_KEY] ??= {\n serverContext: null,\n serverInsertedHTMLCallbacks: [],\n} satisfies NavigationState) as NavigationState;\n\nfunction _getState(): NavigationState {\n if (isInsideUnifiedScope()) {\n return getRequestContext();\n }\n return _als.getStore() ?? _fallbackState;\n}\n\n/**\n * Run a function within a navigation ALS scope.\n * Ensures per-request isolation for navigation context and\n * useServerInsertedHTML callbacks on concurrent runtimes.\n */\nexport function runWithNavigationContext<T>(fn: () => Promise<T>): Promise<T>;\nexport function runWithNavigationContext<T>(fn: () => T | Promise<T>): T | Promise<T>;\nexport function runWithNavigationContext<T>(fn: () => T | Promise<T>): T | Promise<T> {\n if (isInsideUnifiedScope()) {\n return runWithUnifiedStateMutation((uCtx) => {\n uCtx.serverContext = null;\n uCtx.serverInsertedHTMLCallbacks = [];\n }, fn);\n }\n const state: NavigationState = {\n serverContext: null,\n serverInsertedHTMLCallbacks: [],\n };\n return _als.run(state, fn);\n}\n\n/**\n * Run a function with a fresh useServerInsertedHTML callback list while\n * preserving the current navigation context.\n *\n * Used by the Pages Router ISR cache-fill pass: it is the same request/path,\n * but it needs a fresh callback collection so CSS-in-JS insertions from the\n * streamed render cannot accumulate into the cache-fill render.\n */\nexport function runWithServerInsertedHTMLState<T>(fn: () => Promise<T>): Promise<T>;\nexport function runWithServerInsertedHTMLState<T>(fn: () => T | Promise<T>): T | Promise<T>;\nexport function runWithServerInsertedHTMLState<T>(fn: () => T | Promise<T>): T | Promise<T> {\n if (isInsideUnifiedScope()) {\n return runWithUnifiedStateMutation((uCtx) => {\n uCtx.serverInsertedHTMLCallbacks = [];\n }, fn);\n }\n\n const parentState = _als.getStore() ?? _fallbackState;\n const state: NavigationState = {\n serverContext: parentState.serverContext,\n serverInsertedHTMLCallbacks: [],\n };\n return _als.run(state, fn);\n}\n\n// ---------------------------------------------------------------------------\n// Register ALS-backed accessors into navigation.ts\n//\n// Two registration paths (issue #688):\n// 1. _registerStateAccessors — updates the module-level function pointers\n// in the same module instance that imported us (the SSR entry's copy).\n// 2. globalThis[Symbol.for(...)] — makes the accessors discoverable by ANY\n// module instance of navigation.ts, even if Vite created a separate one\n// for \"use client\" components due to pre-bundling or env separation.\n// ---------------------------------------------------------------------------\n\nconst _accessors = {\n getServerContext(): NavigationContext | null {\n return _getState().serverContext;\n },\n\n setServerContext(ctx: NavigationContext | null): void {\n _getState().serverContext = ctx;\n },\n\n getInsertedHTMLCallbacks(): Array<() => unknown> {\n return _getState().serverInsertedHTMLCallbacks;\n },\n\n clearInsertedHTMLCallbacks(): void {\n _getState().serverInsertedHTMLCallbacks = [];\n },\n} satisfies Parameters<typeof _registerStateAccessors>[0];\n\n_registerStateAccessors(_accessors);\n(globalThis as unknown as Record<PropertyKey, unknown>)[GLOBAL_ACCESSORS_KEY] = _accessors;\n"],"mappings":";;;;;;;;;;;;;;;;AAkCA,MAAM,gBAAgB,OAAO,IAAI,6BAA6B;AAC9D,MAAM,KAAK;AACX,MAAM,OAAO,eAAgC,wBAAwB;AAErE,MAAM,iBAAkB,GAAG,mBAAmB;CAC5C,eAAe;CACf,6BAA6B,EAAE;CAChC;AAED,SAAS,YAA6B;AACpC,KAAI,sBAAsB,CACxB,QAAO,mBAAmB;AAE5B,QAAO,KAAK,UAAU,IAAI;;AAU5B,SAAgB,yBAA4B,IAA0C;AACpF,KAAI,sBAAsB,CACxB,QAAO,6BAA6B,SAAS;AAC3C,OAAK,gBAAgB;AACrB,OAAK,8BAA8B,EAAE;IACpC,GAAG;AAMR,QAAO,KAAK,IAJmB;EAC7B,eAAe;EACf,6BAA6B,EAAE;EAChC,EACsB,GAAG;;AAa5B,SAAgB,+BAAkC,IAA0C;AAC1F,KAAI,sBAAsB,CACxB,QAAO,6BAA6B,SAAS;AAC3C,OAAK,8BAA8B,EAAE;IACpC,GAAG;CAIR,MAAM,QAAyB;EAC7B,gBAFkB,KAAK,UAAU,IAAI,gBAEV;EAC3B,6BAA6B,EAAE;EAChC;AACD,QAAO,KAAK,IAAI,OAAO,GAAG;;AAc5B,MAAM,aAAa;CACjB,mBAA6C;AAC3C,SAAO,WAAW,CAAC;;CAGrB,iBAAiB,KAAqC;AACpD,aAAW,CAAC,gBAAgB;;CAG9B,2BAAiD;AAC/C,SAAO,WAAW,CAAC;;CAGrB,6BAAmC;AACjC,aAAW,CAAC,8BAA8B,EAAE;;CAE/C;AAED,wBAAwB,WAAW;AACnC,WAAwD,wBAAwB"}
1
+ {"version":3,"file":"navigation-state.js","names":[],"sources":["../../src/shims/navigation-state.ts"],"sourcesContent":["/**\n * Server-only navigation state backed by AsyncLocalStorage.\n *\n * This module provides request-scoped isolation for navigation context\n * and useServerInsertedHTML callbacks. Without ALS, concurrent requests\n * on Cloudflare Workers would share module-level state and leak data\n * (pathnames, params, CSS-in-JS styles) between requests.\n *\n * This module is server-only — it imports node:async_hooks and must NOT\n * be bundled for the browser. The dual-environment navigation.ts shim\n * uses a registration pattern so it works in both environments.\n */\n\nimport { getOrCreateAls } from \"./internal/als-registry.js\";\nimport {\n _registerStateAccessors,\n type NavigationContext,\n GLOBAL_ACCESSORS_KEY,\n} from \"./navigation.js\";\nimport {\n isInsideUnifiedScope,\n getRequestContext,\n runWithUnifiedStateMutation,\n} from \"./unified-request-context.js\";\n\n// ---------------------------------------------------------------------------\n// ALS setup — same pattern as headers.ts\n// ---------------------------------------------------------------------------\n\nexport type NavigationState = {\n serverContext: NavigationContext | null;\n serverInsertedHTMLCallbacks: Array<() => unknown>;\n};\n\nconst _FALLBACK_KEY = Symbol.for(\"vinext.navigation.fallback\");\nconst _g = globalThis as unknown as Record<PropertyKey, unknown>;\nconst _als = getOrCreateAls<NavigationState>(\"vinext.navigation.als\");\n\nconst _fallbackState = (_g[_FALLBACK_KEY] ??= {\n serverContext: null,\n serverInsertedHTMLCallbacks: [],\n} satisfies NavigationState) as NavigationState;\n\nfunction _getState(): NavigationState {\n if (isInsideUnifiedScope()) {\n return getRequestContext();\n }\n return _als.getStore() ?? _fallbackState;\n}\n\n/**\n * Run a function within a navigation ALS scope.\n * Ensures per-request isolation for navigation context and\n * useServerInsertedHTML callbacks on concurrent runtimes.\n */\nexport function runWithNavigationContext<T>(fn: () => Promise<T>): Promise<T>;\nexport function runWithNavigationContext<T>(fn: () => T | Promise<T>): T | Promise<T>;\nexport function runWithNavigationContext<T>(fn: () => T | Promise<T>): T | Promise<T> {\n if (isInsideUnifiedScope()) {\n return runWithUnifiedStateMutation((uCtx) => {\n uCtx.serverContext = null;\n uCtx.serverInsertedHTMLCallbacks = [];\n }, fn);\n }\n const state: NavigationState = {\n serverContext: null,\n serverInsertedHTMLCallbacks: [],\n };\n return _als.run(state, fn);\n}\n\n/**\n * Run a function with a fresh useServerInsertedHTML callback list while\n * preserving the current navigation context.\n *\n * Used by the Pages Router ISR cache-fill pass: it is the same request/path,\n * but it needs a fresh callback collection so CSS-in-JS insertions from the\n * streamed render cannot accumulate into the cache-fill render.\n */\nexport function runWithServerInsertedHTMLState<T>(fn: () => Promise<T>): Promise<T>;\nexport function runWithServerInsertedHTMLState<T>(fn: () => T | Promise<T>): T | Promise<T>;\nexport function runWithServerInsertedHTMLState<T>(fn: () => T | Promise<T>): T | Promise<T> {\n if (isInsideUnifiedScope()) {\n return runWithUnifiedStateMutation((uCtx) => {\n uCtx.serverInsertedHTMLCallbacks = [];\n }, fn);\n }\n\n const parentState = _als.getStore() ?? _fallbackState;\n const state: NavigationState = {\n serverContext: parentState.serverContext,\n serverInsertedHTMLCallbacks: [],\n };\n return _als.run(state, fn);\n}\n\n// ---------------------------------------------------------------------------\n// Register ALS-backed accessors into navigation.ts\n//\n// Two registration paths (issue #688):\n// 1. _registerStateAccessors — updates the module-level function pointers\n// in the same module instance that imported us (the SSR entry's copy).\n// 2. globalThis[Symbol.for(...)] — makes the accessors discoverable by ANY\n// module instance of navigation.ts, even if Vite created a separate one\n// for \"use client\" components due to pre-bundling or env separation.\n// ---------------------------------------------------------------------------\n\nconst _accessors = {\n getServerContext(): NavigationContext | null {\n return _getState().serverContext;\n },\n\n setServerContext(ctx: NavigationContext | null): void {\n _getState().serverContext = ctx;\n },\n\n getInsertedHTMLCallbacks(): Array<() => unknown> {\n return _getState().serverInsertedHTMLCallbacks;\n },\n\n clearInsertedHTMLCallbacks(): void {\n _getState().serverInsertedHTMLCallbacks = [];\n },\n} satisfies Parameters<typeof _registerStateAccessors>[0];\n\n_registerStateAccessors(_accessors);\n(globalThis as unknown as Record<PropertyKey, unknown>)[GLOBAL_ACCESSORS_KEY] = _accessors;\n"],"mappings":";;;;;;;;;;;;;;;;AAkCA,MAAM,gBAAgB,OAAO,IAAI,6BAA6B;AAC9D,MAAM,KAAK;AACX,MAAM,OAAO,eAAgC,wBAAwB;AAErE,MAAM,iBAAkB,GAAG,mBAAmB;CAC5C,eAAe;CACf,6BAA6B,EAAE;CAChC;AAED,SAAS,YAA6B;CACpC,IAAI,sBAAsB,EACxB,OAAO,mBAAmB;CAE5B,OAAO,KAAK,UAAU,IAAI;;AAU5B,SAAgB,yBAA4B,IAA0C;CACpF,IAAI,sBAAsB,EACxB,OAAO,6BAA6B,SAAS;EAC3C,KAAK,gBAAgB;EACrB,KAAK,8BAA8B,EAAE;IACpC,GAAG;CAMR,OAAO,KAAK,IAAI;EAHd,eAAe;EACf,6BAA6B,EAAE;EAEZ,EAAE,GAAG;;AAa5B,SAAgB,+BAAkC,IAA0C;CAC1F,IAAI,sBAAsB,EACxB,OAAO,6BAA6B,SAAS;EAC3C,KAAK,8BAA8B,EAAE;IACpC,GAAG;CAIR,MAAM,QAAyB;EAC7B,gBAFkB,KAAK,UAAU,IAAI,gBAEV;EAC3B,6BAA6B,EAAE;EAChC;CACD,OAAO,KAAK,IAAI,OAAO,GAAG;;AAc5B,MAAM,aAAa;CACjB,mBAA6C;EAC3C,OAAO,WAAW,CAAC;;CAGrB,iBAAiB,KAAqC;EACpD,WAAW,CAAC,gBAAgB;;CAG9B,2BAAiD;EAC/C,OAAO,WAAW,CAAC;;CAGrB,6BAAmC;EACjC,WAAW,CAAC,8BAA8B,EAAE;;CAE/C;AAED,wBAAwB,WAAW;AACnC,WAAwD,wBAAwB"}
@@ -212,6 +212,26 @@ declare function replaceHistoryStateWithoutNotify(data: unknown, unused: string,
212
212
  * Navigate to a URL, handling external URLs, hash-only changes, and RSC navigation.
213
213
  */
214
214
  declare function navigateClientSide(href: string, mode: "push" | "replace", scroll: boolean, programmaticTransition?: boolean): Promise<void>;
215
+ /**
216
+ * Public App Router instance, exposed for the browser entry so it can wire
217
+ * `window.next.router` to the same singleton returned from `useRouter()`.
218
+ *
219
+ * Mirrors `publicAppRouterInstance` from Next.js's
220
+ * `packages/next/src/client/components/app-router-instance.ts` (line 392).
221
+ */
222
+ declare const appRouterInstance: {
223
+ bfcacheId: string;
224
+ push(href: string, options?: {
225
+ scroll?: boolean;
226
+ }): void;
227
+ replace(href: string, options?: {
228
+ scroll?: boolean;
229
+ }): void;
230
+ back(): void;
231
+ forward(): void;
232
+ refresh(): void;
233
+ prefetch(href: string): void;
234
+ };
215
235
  /**
216
236
  * App Router's useRouter — returns push/replace/back/forward/refresh.
217
237
  * Different from Pages Router's useRouter (next/router).
@@ -221,6 +241,7 @@ declare function navigateClientSide(href: string, mode: "push" | "replace", scro
221
241
  * (e.g. useMemo / useEffect deps, React.memo) don't re-render unnecessarily.
222
242
  */
223
243
  declare function useRouter(): {
244
+ bfcacheId: string;
224
245
  push(href: string, options?: {
225
246
  scroll?: boolean;
226
247
  }): void;
@@ -352,5 +373,5 @@ declare function forbidden(): never;
352
373
  */
353
374
  declare function unauthorized(): never;
354
375
  //#endregion
355
- export { CachedRscResponse, ClientNavigationRenderSnapshot, GLOBAL_ACCESSORS_KEY, HTTP_ERROR_FALLBACK_ERROR_CODE, MAX_PREFETCH_CACHE_SIZE, NavigationContext, PREFETCH_CACHE_TTL, PrefetchCacheEntry, ReadonlyURLSearchParams, RedirectType, SegmentMap, ServerInsertedHTMLContext, __basePath, _registerStateAccessors, activateNavigationSnapshot, clearPendingPathname, clearServerInsertedHTML, commitClientNavigationState, consumePrefetchResponse, createClientNavigationRenderSnapshot, flushServerInsertedHTML, forbidden, getAccessFallbackHTTPStatus, getClientNavigationRenderContext, getClientNavigationState, getClientParams, getCurrentInterceptionContext, getCurrentNextUrl, getLayoutSegmentContext, getMountedSlotsHeader, getNavigationContext, getPrefetchCache, getPrefetchedUrls, isHTTPAccessFallbackError, navigateClientSide, notFound, permanentRedirect, prefetchRscResponse, pushHistoryStateWithoutNotify, redirect, renderServerInsertedHTML, replaceClientParamsWithoutNotify, replaceHistoryStateWithoutNotify, restoreRscResponse, setClientParams, setMountedSlotsHeader, setNavigationContext, setPendingPathname, snapshotRscResponse, storePrefetchResponse, unauthorized, useParams, usePathname, useRouter, useSearchParams, useSelectedLayoutSegment, useSelectedLayoutSegments, useServerInsertedHTML };
376
+ export { CachedRscResponse, ClientNavigationRenderSnapshot, GLOBAL_ACCESSORS_KEY, HTTP_ERROR_FALLBACK_ERROR_CODE, MAX_PREFETCH_CACHE_SIZE, NavigationContext, PREFETCH_CACHE_TTL, PrefetchCacheEntry, ReadonlyURLSearchParams, RedirectType, SegmentMap, ServerInsertedHTMLContext, __basePath, _registerStateAccessors, activateNavigationSnapshot, appRouterInstance, clearPendingPathname, clearServerInsertedHTML, commitClientNavigationState, consumePrefetchResponse, createClientNavigationRenderSnapshot, flushServerInsertedHTML, forbidden, getAccessFallbackHTTPStatus, getClientNavigationRenderContext, getClientNavigationState, getClientParams, getCurrentInterceptionContext, getCurrentNextUrl, getLayoutSegmentContext, getMountedSlotsHeader, getNavigationContext, getPrefetchCache, getPrefetchedUrls, isHTTPAccessFallbackError, navigateClientSide, notFound, permanentRedirect, prefetchRscResponse, pushHistoryStateWithoutNotify, redirect, renderServerInsertedHTML, replaceClientParamsWithoutNotify, replaceHistoryStateWithoutNotify, restoreRscResponse, setClientParams, setMountedSlotsHeader, setNavigationContext, setPendingPathname, snapshotRscResponse, storePrefetchResponse, unauthorized, useParams, usePathname, useRouter, useSearchParams, useSelectedLayoutSegment, useSelectedLayoutSegments, useServerInsertedHTML };
356
377
  //# sourceMappingURL=navigation.d.ts.map
@@ -1,10 +1,11 @@
1
1
  import { stripBasePath } from "../utils/base-path.js";
2
+ import { VINEXT_MOUNTED_SLOTS_HEADER, VINEXT_PARAMS_HEADER } from "../server/headers.js";
2
3
  import { assertSafeNavigationUrl } from "./url-safety.js";
3
- import { toBrowserNavigationHref, toSameOriginAppPath } from "./url-utils.js";
4
+ import { isHashOnlyBrowserUrlChange, toBrowserNavigationHref, toSameOriginAppPath } from "./url-utils.js";
4
5
  import { notifyAppRouterTransitionStart } from "../client/instrumentation-client-state.js";
5
6
  import { AppElementsWire } from "../server/app-elements-wire.js";
6
7
  import "../server/app-elements.js";
7
- import { VINEXT_RSC_MOUNTED_SLOTS_HEADER, createRscRequestHeaders, createRscRequestUrl } from "../server/app-rsc-cache-busting.js";
8
+ import { createRscRequestHeaders, createRscRequestUrl } from "../server/app-rsc-cache-busting.js";
8
9
  import { ReadonlyURLSearchParams } from "./readonly-url-search-params.js";
9
10
  import * as React$1 from "react";
10
11
  //#region src/shims/navigation.ts
@@ -209,8 +210,8 @@ async function snapshotRscResponse(response) {
209
210
  return {
210
211
  buffer: await response.arrayBuffer(),
211
212
  contentType: response.headers.get("content-type") ?? "text/x-component",
212
- mountedSlotsHeader: response.headers.get("X-Vinext-Mounted-Slots"),
213
- paramsHeader: response.headers.get("X-Vinext-Params"),
213
+ mountedSlotsHeader: response.headers.get(VINEXT_MOUNTED_SLOTS_HEADER),
214
+ paramsHeader: response.headers.get(VINEXT_PARAMS_HEADER),
214
215
  url: response.url
215
216
  };
216
217
  }
@@ -231,8 +232,8 @@ async function snapshotRscResponse(response) {
231
232
  */
232
233
  function restoreRscResponse(cached, copy = true) {
233
234
  const headers = new Headers({ "content-type": cached.contentType });
234
- if (cached.mountedSlotsHeader != null) headers.set("X-Vinext-Mounted-Slots", cached.mountedSlotsHeader);
235
- if (cached.paramsHeader != null) headers.set("X-Vinext-Params", cached.paramsHeader);
235
+ if (cached.mountedSlotsHeader != null) headers.set(VINEXT_MOUNTED_SLOTS_HEADER, cached.mountedSlotsHeader);
236
+ if (cached.paramsHeader != null) headers.set(VINEXT_PARAMS_HEADER, cached.paramsHeader);
236
237
  return new Response(copy ? cached.buffer.slice(0) : cached.buffer, {
237
238
  status: 200,
238
239
  headers
@@ -543,13 +544,7 @@ function isExternalUrl(href) {
543
544
  function isHashOnlyChange(href) {
544
545
  if (typeof window === "undefined") return false;
545
546
  if (href.startsWith("#")) return true;
546
- try {
547
- const current = new URL(window.location.href);
548
- const next = new URL(href, window.location.href);
549
- return stripBasePath(current.pathname, __basePath) === stripBasePath(next.pathname, __basePath) && current.search === next.search && next.hash !== "";
550
- } catch {
551
- return false;
552
- }
547
+ return isHashOnlyBrowserUrlChange(href, window.location.href, __basePath);
553
548
  }
554
549
  /**
555
550
  * Scroll to a hash target element, or to the top if no hash.
@@ -692,7 +687,17 @@ async function navigateClientSide(href, mode, scroll, programmaticTransition = f
692
687
  if (scroll) if (hash) scrollToHash(hash);
693
688
  else window.scrollTo(0, 0);
694
689
  }
690
+ /**
691
+ * App Router public router instance. Mirrors Next.js's
692
+ * `publicAppRouterInstance` from
693
+ * `packages/next/src/client/components/app-router-instance.ts`.
694
+ *
695
+ * Exported so the App Router browser entry can install it on
696
+ * `window.next.router` for Next.js parity (see `client/window-next.ts`).
697
+ * Internal callers in this file continue to use `_appRouter` for brevity.
698
+ */
695
699
  const _appRouter = {
700
+ bfcacheId: "0",
696
701
  push(href, options) {
697
702
  assertSafeNavigationUrl(href);
698
703
  if (isServer) return;
@@ -717,6 +722,8 @@ const _appRouter = {
717
722
  },
718
723
  refresh() {
719
724
  if (isServer) return;
725
+ const clearCaches = window.__VINEXT_CLEAR_NAV_CACHES__;
726
+ if (typeof clearCaches === "function") clearCaches();
720
727
  const rscNavigate = window.__VINEXT_RSC_NAVIGATE__;
721
728
  if (typeof rscNavigate === "function") {
722
729
  const navigate = () => {
@@ -739,7 +746,7 @@ const _appRouter = {
739
746
  const interceptionContext = getCurrentInterceptionContext();
740
747
  const mountedSlotsHeader = getMountedSlotsHeader();
741
748
  const headers = createRscRequestHeaders({ interceptionContext });
742
- if (mountedSlotsHeader) headers.set(VINEXT_RSC_MOUNTED_SLOTS_HEADER, mountedSlotsHeader);
749
+ if (mountedSlotsHeader) headers.set(VINEXT_MOUNTED_SLOTS_HEADER, mountedSlotsHeader);
743
750
  const rscUrl = await createRscRequestUrl(fullHref, headers);
744
751
  const cacheKey = AppElementsWire.encodeCacheKey(rscUrl, interceptionContext);
745
752
  const prefetched = getPrefetchedUrls();
@@ -756,6 +763,14 @@ const _appRouter = {
756
763
  }
757
764
  };
758
765
  /**
766
+ * Public App Router instance, exposed for the browser entry so it can wire
767
+ * `window.next.router` to the same singleton returned from `useRouter()`.
768
+ *
769
+ * Mirrors `publicAppRouterInstance` from Next.js's
770
+ * `packages/next/src/client/components/app-router-instance.ts` (line 392).
771
+ */
772
+ const appRouterInstance = _appRouter;
773
+ /**
759
774
  * App Router's useRouter — returns push/replace/back/forward/refresh.
760
775
  * Different from Pages Router's useRouter (next/router).
761
776
  *
@@ -970,6 +985,6 @@ if (!isServer) {
970
985
  }
971
986
  }
972
987
  //#endregion
973
- export { GLOBAL_ACCESSORS_KEY, HTTP_ERROR_FALLBACK_ERROR_CODE, MAX_PREFETCH_CACHE_SIZE, PREFETCH_CACHE_TTL, ReadonlyURLSearchParams, RedirectType, ServerInsertedHTMLContext, __basePath, _registerStateAccessors, activateNavigationSnapshot, clearPendingPathname, clearServerInsertedHTML, commitClientNavigationState, consumePrefetchResponse, createClientNavigationRenderSnapshot, flushServerInsertedHTML, forbidden, getAccessFallbackHTTPStatus, getClientNavigationRenderContext, getClientNavigationState, getClientParams, getCurrentInterceptionContext, getCurrentNextUrl, getLayoutSegmentContext, getMountedSlotsHeader, getNavigationContext, getPrefetchCache, getPrefetchedUrls, isHTTPAccessFallbackError, navigateClientSide, notFound, permanentRedirect, prefetchRscResponse, pushHistoryStateWithoutNotify, redirect, renderServerInsertedHTML, replaceClientParamsWithoutNotify, replaceHistoryStateWithoutNotify, restoreRscResponse, setClientParams, setMountedSlotsHeader, setNavigationContext, setPendingPathname, snapshotRscResponse, storePrefetchResponse, unauthorized, useParams, usePathname, useRouter, useSearchParams, useSelectedLayoutSegment, useSelectedLayoutSegments, useServerInsertedHTML };
988
+ export { GLOBAL_ACCESSORS_KEY, HTTP_ERROR_FALLBACK_ERROR_CODE, MAX_PREFETCH_CACHE_SIZE, PREFETCH_CACHE_TTL, ReadonlyURLSearchParams, RedirectType, ServerInsertedHTMLContext, __basePath, _registerStateAccessors, activateNavigationSnapshot, appRouterInstance, clearPendingPathname, clearServerInsertedHTML, commitClientNavigationState, consumePrefetchResponse, createClientNavigationRenderSnapshot, flushServerInsertedHTML, forbidden, getAccessFallbackHTTPStatus, getClientNavigationRenderContext, getClientNavigationState, getClientParams, getCurrentInterceptionContext, getCurrentNextUrl, getLayoutSegmentContext, getMountedSlotsHeader, getNavigationContext, getPrefetchCache, getPrefetchedUrls, isHTTPAccessFallbackError, navigateClientSide, notFound, permanentRedirect, prefetchRscResponse, pushHistoryStateWithoutNotify, redirect, renderServerInsertedHTML, replaceClientParamsWithoutNotify, replaceHistoryStateWithoutNotify, restoreRscResponse, setClientParams, setMountedSlotsHeader, setNavigationContext, setPendingPathname, snapshotRscResponse, storePrefetchResponse, unauthorized, useParams, usePathname, useRouter, useSearchParams, useSelectedLayoutSegment, useSelectedLayoutSegments, useServerInsertedHTML };
974
989
 
975
990
  //# sourceMappingURL=navigation.js.map