vinext 0.0.51 → 0.0.53

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (423) hide show
  1. package/README.md +1 -1
  2. package/dist/build/clean-output.d.ts +14 -0
  3. package/dist/build/clean-output.js +36 -0
  4. package/dist/build/clean-output.js.map +1 -0
  5. package/dist/build/precompress.d.ts +7 -7
  6. package/dist/build/precompress.js +18 -17
  7. package/dist/build/precompress.js.map +1 -1
  8. package/dist/build/prerender.d.ts +9 -16
  9. package/dist/build/prerender.js +88 -50
  10. package/dist/build/prerender.js.map +1 -1
  11. package/dist/build/run-prerender.js +10 -1
  12. package/dist/build/run-prerender.js.map +1 -1
  13. package/dist/build/static-export.d.ts +5 -0
  14. package/dist/build/static-export.js +8 -3
  15. package/dist/build/static-export.js.map +1 -1
  16. package/dist/check.js +4 -0
  17. package/dist/check.js.map +1 -1
  18. package/dist/cli-args.d.ts +1 -0
  19. package/dist/cli-args.js +5 -0
  20. package/dist/cli-args.js.map +1 -1
  21. package/dist/cli.js +58 -4
  22. package/dist/cli.js.map +1 -1
  23. package/dist/client/instrumentation-client-inject.d.ts +34 -0
  24. package/dist/client/instrumentation-client-inject.js +57 -0
  25. package/dist/client/instrumentation-client-inject.js.map +1 -0
  26. package/dist/client/navigation-runtime.d.ts +60 -0
  27. package/dist/client/navigation-runtime.js +171 -0
  28. package/dist/client/navigation-runtime.js.map +1 -0
  29. package/dist/client/pages-router-link-navigation.d.ts +26 -0
  30. package/dist/client/pages-router-link-navigation.js +14 -0
  31. package/dist/client/pages-router-link-navigation.js.map +1 -0
  32. package/dist/client/vinext-next-data.d.ts +14 -3
  33. package/dist/client/vinext-next-data.js +50 -1
  34. package/dist/client/vinext-next-data.js.map +1 -0
  35. package/dist/client/window-next.d.ts +10 -2
  36. package/dist/client/window-next.js.map +1 -1
  37. package/dist/cloudflare/kv-cache-handler.js +2 -1
  38. package/dist/cloudflare/kv-cache-handler.js.map +1 -1
  39. package/dist/cloudflare/tpr.js +1 -1
  40. package/dist/cloudflare/tpr.js.map +1 -1
  41. package/dist/config/config-matchers.d.ts +63 -16
  42. package/dist/config/config-matchers.js +145 -9
  43. package/dist/config/config-matchers.js.map +1 -1
  44. package/dist/config/next-config.d.ts +32 -5
  45. package/dist/config/next-config.js +55 -15
  46. package/dist/config/next-config.js.map +1 -1
  47. package/dist/deploy.js +130 -46
  48. package/dist/deploy.js.map +1 -1
  49. package/dist/entries/app-browser-entry.js +9 -3
  50. package/dist/entries/app-browser-entry.js.map +1 -1
  51. package/dist/entries/app-rsc-entry.d.ts +4 -2
  52. package/dist/entries/app-rsc-entry.js +76 -16
  53. package/dist/entries/app-rsc-entry.js.map +1 -1
  54. package/dist/entries/app-rsc-manifest.d.ts +1 -0
  55. package/dist/entries/app-rsc-manifest.js +53 -6
  56. package/dist/entries/app-rsc-manifest.js.map +1 -1
  57. package/dist/entries/app-ssr-entry.d.ts +3 -3
  58. package/dist/entries/app-ssr-entry.js +4 -4
  59. package/dist/entries/app-ssr-entry.js.map +1 -1
  60. package/dist/entries/pages-client-entry.js +40 -3
  61. package/dist/entries/pages-client-entry.js.map +1 -1
  62. package/dist/entries/pages-server-entry.js +261 -31
  63. package/dist/entries/pages-server-entry.js.map +1 -1
  64. package/dist/entries/runtime-entry-module.d.ts +2 -1
  65. package/dist/entries/runtime-entry-module.js +9 -3
  66. package/dist/entries/runtime-entry-module.js.map +1 -1
  67. package/dist/index.js +161 -46
  68. package/dist/index.js.map +1 -1
  69. package/dist/plugins/css-data-url.d.ts +7 -0
  70. package/dist/plugins/css-data-url.js +81 -0
  71. package/dist/plugins/css-data-url.js.map +1 -0
  72. package/dist/plugins/fonts.js +30 -5
  73. package/dist/plugins/fonts.js.map +1 -1
  74. package/dist/plugins/middleware-server-only.d.ts +54 -0
  75. package/dist/plugins/middleware-server-only.js +91 -0
  76. package/dist/plugins/middleware-server-only.js.map +1 -0
  77. package/dist/plugins/optimize-imports.js +4 -4
  78. package/dist/plugins/optimize-imports.js.map +1 -1
  79. package/dist/plugins/strip-server-exports.js +5 -8
  80. package/dist/plugins/strip-server-exports.js.map +1 -1
  81. package/dist/routing/app-route-graph.d.ts +20 -1
  82. package/dist/routing/app-route-graph.js +58 -6
  83. package/dist/routing/app-route-graph.js.map +1 -1
  84. package/dist/routing/app-router.d.ts +2 -2
  85. package/dist/routing/app-router.js +2 -2
  86. package/dist/routing/app-router.js.map +1 -1
  87. package/dist/routing/route-trie.js +13 -18
  88. package/dist/routing/route-trie.js.map +1 -1
  89. package/dist/routing/utils.d.ts +12 -1
  90. package/dist/routing/utils.js +18 -1
  91. package/dist/routing/utils.js.map +1 -1
  92. package/dist/server/api-handler.js +153 -42
  93. package/dist/server/api-handler.js.map +1 -1
  94. package/dist/server/app-browser-action-result.d.ts +16 -1
  95. package/dist/server/app-browser-action-result.js +15 -1
  96. package/dist/server/app-browser-action-result.js.map +1 -1
  97. package/dist/server/app-browser-entry.js +309 -155
  98. package/dist/server/app-browser-entry.js.map +1 -1
  99. package/dist/server/app-browser-interception-context.d.ts +24 -0
  100. package/dist/server/app-browser-interception-context.js +32 -0
  101. package/dist/server/app-browser-interception-context.js.map +1 -0
  102. package/dist/server/app-browser-navigation-controller.d.ts +3 -1
  103. package/dist/server/app-browser-navigation-controller.js +5 -1
  104. package/dist/server/app-browser-navigation-controller.js.map +1 -1
  105. package/dist/server/app-browser-rsc-redirect.d.ts +2 -1
  106. package/dist/server/app-browser-rsc-redirect.js +2 -2
  107. package/dist/server/app-browser-rsc-redirect.js.map +1 -1
  108. package/dist/server/app-browser-state.d.ts +18 -1
  109. package/dist/server/app-browser-state.js +19 -1
  110. package/dist/server/app-browser-state.js.map +1 -1
  111. package/dist/server/app-browser-stream.d.ts +5 -14
  112. package/dist/server/app-browser-stream.js +13 -7
  113. package/dist/server/app-browser-stream.js.map +1 -1
  114. package/dist/server/app-browser-visible-commit.d.ts +2 -1
  115. package/dist/server/app-browser-visible-commit.js +1 -0
  116. package/dist/server/app-browser-visible-commit.js.map +1 -1
  117. package/dist/server/app-elements-wire.d.ts +10 -5
  118. package/dist/server/app-elements-wire.js +84 -2
  119. package/dist/server/app-elements-wire.js.map +1 -1
  120. package/dist/server/app-elements.d.ts +3 -2
  121. package/dist/server/app-elements.js +3 -2
  122. package/dist/server/app-elements.js.map +1 -1
  123. package/dist/server/app-fallback-renderer.d.ts +12 -3
  124. package/dist/server/app-fallback-renderer.js +15 -8
  125. package/dist/server/app-fallback-renderer.js.map +1 -1
  126. package/dist/server/app-history-state.js +6 -2
  127. package/dist/server/app-history-state.js.map +1 -1
  128. package/dist/server/app-interception-context-header.d.ts +33 -0
  129. package/dist/server/app-interception-context-header.js +44 -0
  130. package/dist/server/app-interception-context-header.js.map +1 -0
  131. package/dist/server/app-middleware.d.ts +13 -0
  132. package/dist/server/app-middleware.js +3 -1
  133. package/dist/server/app-middleware.js.map +1 -1
  134. package/dist/server/app-mounted-slots-header.d.ts +19 -0
  135. package/dist/server/app-mounted-slots-header.js +40 -1
  136. package/dist/server/app-mounted-slots-header.js.map +1 -1
  137. package/dist/server/app-optimistic-routing.d.ts +54 -0
  138. package/dist/server/app-optimistic-routing.js +208 -0
  139. package/dist/server/app-optimistic-routing.js.map +1 -0
  140. package/dist/server/app-page-boundary-render.d.ts +1 -0
  141. package/dist/server/app-page-boundary-render.js +2 -0
  142. package/dist/server/app-page-boundary-render.js.map +1 -1
  143. package/dist/server/app-page-boundary.d.ts +1 -0
  144. package/dist/server/app-page-boundary.js +2 -0
  145. package/dist/server/app-page-boundary.js.map +1 -1
  146. package/dist/server/app-page-cache.d.ts +15 -1
  147. package/dist/server/app-page-cache.js +68 -7
  148. package/dist/server/app-page-cache.js.map +1 -1
  149. package/dist/server/app-page-dispatch.d.ts +5 -0
  150. package/dist/server/app-page-dispatch.js +39 -5
  151. package/dist/server/app-page-dispatch.js.map +1 -1
  152. package/dist/server/app-page-element-builder.d.ts +2 -1
  153. package/dist/server/app-page-element-builder.js +7 -3
  154. package/dist/server/app-page-element-builder.js.map +1 -1
  155. package/dist/server/app-page-execution.d.ts +29 -1
  156. package/dist/server/app-page-execution.js +91 -4
  157. package/dist/server/app-page-execution.js.map +1 -1
  158. package/dist/server/app-page-head.d.ts +1 -0
  159. package/dist/server/app-page-head.js +29 -2
  160. package/dist/server/app-page-head.js.map +1 -1
  161. package/dist/server/app-page-probe.js +1 -1
  162. package/dist/server/app-page-render-observation.js +1 -1
  163. package/dist/server/app-page-render.d.ts +3 -0
  164. package/dist/server/app-page-render.js +7 -3
  165. package/dist/server/app-page-render.js.map +1 -1
  166. package/dist/server/app-page-response.d.ts +11 -1
  167. package/dist/server/app-page-response.js +18 -5
  168. package/dist/server/app-page-response.js.map +1 -1
  169. package/dist/server/app-page-route-wiring.d.ts +1 -0
  170. package/dist/server/app-page-route-wiring.js +35 -15
  171. package/dist/server/app-page-route-wiring.js.map +1 -1
  172. package/dist/server/app-page-stream.d.ts +4 -0
  173. package/dist/server/app-page-stream.js +3 -0
  174. package/dist/server/app-page-stream.js.map +1 -1
  175. package/dist/server/app-prerender-static-params.d.ts +2 -1
  176. package/dist/server/app-prerender-static-params.js +44 -8
  177. package/dist/server/app-prerender-static-params.js.map +1 -1
  178. package/dist/server/app-route-handler-cache.d.ts +2 -2
  179. package/dist/server/app-route-handler-cache.js +3 -2
  180. package/dist/server/app-route-handler-cache.js.map +1 -1
  181. package/dist/server/app-route-handler-dispatch.d.ts +7 -1
  182. package/dist/server/app-route-handler-dispatch.js +4 -1
  183. package/dist/server/app-route-handler-dispatch.js.map +1 -1
  184. package/dist/server/app-route-handler-execution.d.ts +18 -2
  185. package/dist/server/app-route-handler-execution.js +1 -0
  186. package/dist/server/app-route-handler-execution.js.map +1 -1
  187. package/dist/server/app-route-handler-response.js +6 -5
  188. package/dist/server/app-route-handler-response.js.map +1 -1
  189. package/dist/server/app-router-entry.js +6 -2
  190. package/dist/server/app-router-entry.js.map +1 -1
  191. package/dist/server/app-rsc-handler.d.ts +11 -1
  192. package/dist/server/app-rsc-handler.js +48 -21
  193. package/dist/server/app-rsc-handler.js.map +1 -1
  194. package/dist/server/app-rsc-render-mode.d.ts +4 -3
  195. package/dist/server/app-rsc-render-mode.js +7 -1
  196. package/dist/server/app-rsc-render-mode.js.map +1 -1
  197. package/dist/server/app-rsc-request-normalization.d.ts +4 -1
  198. package/dist/server/app-rsc-request-normalization.js +6 -2
  199. package/dist/server/app-rsc-request-normalization.js.map +1 -1
  200. package/dist/server/app-rsc-response-finalizer.d.ts +8 -1
  201. package/dist/server/app-rsc-response-finalizer.js +10 -3
  202. package/dist/server/app-rsc-response-finalizer.js.map +1 -1
  203. package/dist/server/app-rsc-route-matching.js +2 -2
  204. package/dist/server/app-rsc-route-matching.js.map +1 -1
  205. package/dist/server/app-segment-config.d.ts +4 -1
  206. package/dist/server/app-segment-config.js +6 -1
  207. package/dist/server/app-segment-config.js.map +1 -1
  208. package/dist/server/app-server-action-execution.d.ts +1 -0
  209. package/dist/server/app-server-action-execution.js +5 -1
  210. package/dist/server/app-server-action-execution.js.map +1 -1
  211. package/dist/server/app-ssr-entry.d.ts +2 -0
  212. package/dist/server/app-ssr-entry.js +92 -55
  213. package/dist/server/app-ssr-entry.js.map +1 -1
  214. package/dist/server/app-ssr-stream.d.ts +30 -2
  215. package/dist/server/app-ssr-stream.js +95 -8
  216. package/dist/server/app-ssr-stream.js.map +1 -1
  217. package/dist/server/app-static-generation.d.ts +1 -0
  218. package/dist/server/app-static-generation.js +2 -1
  219. package/dist/server/app-static-generation.js.map +1 -1
  220. package/dist/server/artifact-compatibility.d.ts +1 -1
  221. package/dist/server/artifact-compatibility.js.map +1 -1
  222. package/dist/server/cache-headers.d.ts +7 -0
  223. package/dist/server/cache-headers.js +19 -0
  224. package/dist/server/cache-headers.js.map +1 -0
  225. package/dist/server/cache-proof.d.ts +49 -3
  226. package/dist/server/cache-proof.js +78 -22
  227. package/dist/server/cache-proof.js.map +1 -1
  228. package/dist/server/client-reuse-manifest.d.ts +99 -0
  229. package/dist/server/client-reuse-manifest.js +212 -0
  230. package/dist/server/client-reuse-manifest.js.map +1 -0
  231. package/dist/server/default-global-error-module.d.ts +20 -0
  232. package/dist/server/default-global-error-module.js +20 -0
  233. package/dist/server/default-global-error-module.js.map +1 -0
  234. package/dist/server/default-not-found-module.d.ts +20 -0
  235. package/dist/server/default-not-found-module.js +20 -0
  236. package/dist/server/default-not-found-module.js.map +1 -0
  237. package/dist/server/dev-server.d.ts +10 -2
  238. package/dist/server/dev-server.js +99 -36
  239. package/dist/server/dev-server.js.map +1 -1
  240. package/dist/server/edge-api-runtime.d.ts +5 -0
  241. package/dist/server/edge-api-runtime.js +8 -0
  242. package/dist/server/edge-api-runtime.js.map +1 -0
  243. package/dist/server/headers.d.ts +22 -1
  244. package/dist/server/headers.js +22 -1
  245. package/dist/server/headers.js.map +1 -1
  246. package/dist/server/http-error-responses.d.ts +16 -1
  247. package/dist/server/http-error-responses.js +21 -1
  248. package/dist/server/http-error-responses.js.map +1 -1
  249. package/dist/server/image-optimization.d.ts +13 -4
  250. package/dist/server/image-optimization.js +15 -4
  251. package/dist/server/image-optimization.js.map +1 -1
  252. package/dist/server/isr-cache.d.ts +6 -2
  253. package/dist/server/isr-cache.js +20 -4
  254. package/dist/server/isr-cache.js.map +1 -1
  255. package/dist/server/middleware-runtime.d.ts +15 -0
  256. package/dist/server/middleware-runtime.js +59 -7
  257. package/dist/server/middleware-runtime.js.map +1 -1
  258. package/dist/server/middleware.d.ts +1 -1
  259. package/dist/server/middleware.js +5 -3
  260. package/dist/server/middleware.js.map +1 -1
  261. package/dist/server/navigation-planner.d.ts +9 -3
  262. package/dist/server/navigation-planner.js +98 -25
  263. package/dist/server/navigation-planner.js.map +1 -1
  264. package/dist/server/navigation-trace.d.ts +2 -1
  265. package/dist/server/navigation-trace.js +1 -0
  266. package/dist/server/navigation-trace.js.map +1 -1
  267. package/dist/server/pages-api-route.d.ts +45 -1
  268. package/dist/server/pages-api-route.js +27 -4
  269. package/dist/server/pages-api-route.js.map +1 -1
  270. package/dist/server/pages-body-parser-config.d.ts +60 -0
  271. package/dist/server/pages-body-parser-config.js +79 -0
  272. package/dist/server/pages-body-parser-config.js.map +1 -0
  273. package/dist/server/pages-data-route.d.ts +77 -0
  274. package/dist/server/pages-data-route.js +98 -0
  275. package/dist/server/pages-data-route.js.map +1 -0
  276. package/dist/server/pages-default-404.d.ts +31 -0
  277. package/dist/server/pages-default-404.js +40 -0
  278. package/dist/server/pages-default-404.js.map +1 -0
  279. package/dist/server/pages-i18n.d.ts +51 -1
  280. package/dist/server/pages-i18n.js +61 -1
  281. package/dist/server/pages-i18n.js.map +1 -1
  282. package/dist/server/pages-node-compat.d.ts +10 -0
  283. package/dist/server/pages-node-compat.js +12 -1
  284. package/dist/server/pages-node-compat.js.map +1 -1
  285. package/dist/server/pages-page-data.d.ts +69 -2
  286. package/dist/server/pages-page-data.js +47 -31
  287. package/dist/server/pages-page-data.js.map +1 -1
  288. package/dist/server/pages-page-response.d.ts +13 -1
  289. package/dist/server/pages-page-response.js +16 -11
  290. package/dist/server/pages-page-response.js.map +1 -1
  291. package/dist/server/prerender-route-params.d.ts +14 -0
  292. package/dist/server/prerender-route-params.js +94 -0
  293. package/dist/server/prerender-route-params.js.map +1 -0
  294. package/dist/server/prod-server.d.ts +15 -37
  295. package/dist/server/prod-server.js +143 -107
  296. package/dist/server/prod-server.js.map +1 -1
  297. package/dist/server/proxy-trust.d.ts +41 -0
  298. package/dist/server/proxy-trust.js +70 -0
  299. package/dist/server/proxy-trust.js.map +1 -0
  300. package/dist/server/request-pipeline.d.ts +13 -4
  301. package/dist/server/request-pipeline.js +32 -14
  302. package/dist/server/request-pipeline.js.map +1 -1
  303. package/dist/server/seed-cache.d.ts +12 -31
  304. package/dist/server/seed-cache.js +30 -37
  305. package/dist/server/seed-cache.js.map +1 -1
  306. package/dist/server/server-action-not-found.js +8 -3
  307. package/dist/server/server-action-not-found.js.map +1 -1
  308. package/dist/server/skip-cache-proof.d.ts +41 -0
  309. package/dist/server/skip-cache-proof.js +101 -0
  310. package/dist/server/skip-cache-proof.js.map +1 -0
  311. package/dist/server/static-file-cache.d.ts +1 -1
  312. package/dist/server/static-file-cache.js +8 -7
  313. package/dist/server/static-file-cache.js.map +1 -1
  314. package/dist/server/streaming-metadata.d.ts +5 -0
  315. package/dist/server/streaming-metadata.js +10 -0
  316. package/dist/server/streaming-metadata.js.map +1 -0
  317. package/dist/shims/app-router-scroll-state.d.ts +12 -0
  318. package/dist/shims/app-router-scroll-state.js +38 -0
  319. package/dist/shims/app-router-scroll-state.js.map +1 -0
  320. package/dist/shims/app-router-scroll.d.ts +14 -0
  321. package/dist/shims/app-router-scroll.js +100 -0
  322. package/dist/shims/app-router-scroll.js.map +1 -0
  323. package/dist/shims/before-interactive-context.d.ts +30 -0
  324. package/dist/shims/before-interactive-context.js +10 -0
  325. package/dist/shims/before-interactive-context.js.map +1 -0
  326. package/dist/shims/cache-runtime.d.ts +1 -1
  327. package/dist/shims/cache-runtime.js +14 -1
  328. package/dist/shims/cache-runtime.js.map +1 -1
  329. package/dist/shims/client-locale.d.ts +15 -0
  330. package/dist/shims/client-locale.js +13 -0
  331. package/dist/shims/client-locale.js.map +1 -0
  332. package/dist/shims/default-global-error.d.ts +32 -0
  333. package/dist/shims/default-global-error.js +181 -0
  334. package/dist/shims/default-global-error.js.map +1 -0
  335. package/dist/shims/default-not-found.d.ts +12 -0
  336. package/dist/shims/default-not-found.js +61 -0
  337. package/dist/shims/default-not-found.js.map +1 -0
  338. package/dist/shims/document.d.ts +59 -3
  339. package/dist/shims/document.js +36 -5
  340. package/dist/shims/document.js.map +1 -1
  341. package/dist/shims/error-boundary.d.ts +2 -2
  342. package/dist/shims/font-local.d.ts +5 -0
  343. package/dist/shims/font-local.js +6 -2
  344. package/dist/shims/font-local.js.map +1 -1
  345. package/dist/shims/form.js +13 -6
  346. package/dist/shims/form.js.map +1 -1
  347. package/dist/shims/head.js +4 -4
  348. package/dist/shims/head.js.map +1 -1
  349. package/dist/shims/headers.d.ts +6 -2
  350. package/dist/shims/headers.js +64 -21
  351. package/dist/shims/headers.js.map +1 -1
  352. package/dist/shims/image.d.ts +1 -1
  353. package/dist/shims/image.js +4 -4
  354. package/dist/shims/image.js.map +1 -1
  355. package/dist/shims/internal/pages-data-target.d.ts +58 -0
  356. package/dist/shims/internal/pages-data-target.js +91 -0
  357. package/dist/shims/internal/pages-data-target.js.map +1 -0
  358. package/dist/shims/internal/pages-data-url.d.ts +42 -0
  359. package/dist/shims/internal/pages-data-url.js +73 -0
  360. package/dist/shims/internal/pages-data-url.js.map +1 -0
  361. package/dist/shims/link.d.ts +21 -3
  362. package/dist/shims/link.js +189 -30
  363. package/dist/shims/link.js.map +1 -1
  364. package/dist/shims/metadata.d.ts +2 -1
  365. package/dist/shims/metadata.js +65 -6
  366. package/dist/shims/metadata.js.map +1 -1
  367. package/dist/shims/navigation.d.ts +8 -2
  368. package/dist/shims/navigation.js +67 -23
  369. package/dist/shims/navigation.js.map +1 -1
  370. package/dist/shims/og.d.ts +18 -2
  371. package/dist/shims/og.js +49 -1
  372. package/dist/shims/og.js.map +1 -0
  373. package/dist/shims/request-state-types.d.ts +1 -1
  374. package/dist/shims/root-params.d.ts +3 -1
  375. package/dist/shims/root-params.js +11 -3
  376. package/dist/shims/root-params.js.map +1 -1
  377. package/dist/shims/router-state.d.ts +1 -0
  378. package/dist/shims/router-state.js.map +1 -1
  379. package/dist/shims/router.d.ts +12 -5
  380. package/dist/shims/router.js +535 -86
  381. package/dist/shims/router.js.map +1 -1
  382. package/dist/shims/script.js +86 -12
  383. package/dist/shims/script.js.map +1 -1
  384. package/dist/shims/server.d.ts +21 -4
  385. package/dist/shims/server.js +30 -9
  386. package/dist/shims/server.js.map +1 -1
  387. package/dist/shims/slot.js +5 -1
  388. package/dist/shims/slot.js.map +1 -1
  389. package/dist/shims/unified-request-context.d.ts +1 -1
  390. package/dist/shims/url-safety.d.ts +23 -1
  391. package/dist/shims/url-safety.js +29 -2
  392. package/dist/shims/url-safety.js.map +1 -1
  393. package/dist/shims/url-utils.d.ts +2 -1
  394. package/dist/shims/url-utils.js +15 -4
  395. package/dist/shims/url-utils.js.map +1 -1
  396. package/dist/typegen.d.ts +10 -0
  397. package/dist/typegen.js +242 -0
  398. package/dist/typegen.js.map +1 -0
  399. package/dist/utils/asset-prefix.d.ts +33 -5
  400. package/dist/utils/asset-prefix.js +39 -6
  401. package/dist/utils/asset-prefix.js.map +1 -1
  402. package/dist/utils/cache-control-metadata.d.ts +2 -1
  403. package/dist/utils/cache-control-metadata.js +1 -3
  404. package/dist/utils/cache-control-metadata.js.map +1 -1
  405. package/dist/utils/domain-locale.d.ts +2 -1
  406. package/dist/utils/domain-locale.js +9 -1
  407. package/dist/utils/domain-locale.js.map +1 -1
  408. package/dist/utils/html-limited-bots.d.ts +5 -0
  409. package/dist/utils/html-limited-bots.js +15 -0
  410. package/dist/utils/html-limited-bots.js.map +1 -0
  411. package/dist/utils/lazy-chunks.d.ts +1 -1
  412. package/dist/utils/lazy-chunks.js +1 -1
  413. package/dist/utils/lazy-chunks.js.map +1 -1
  414. package/dist/utils/prerender-output-paths.d.ts +15 -0
  415. package/dist/utils/prerender-output-paths.js +24 -0
  416. package/dist/utils/prerender-output-paths.js.map +1 -0
  417. package/dist/utils/query.d.ts +23 -1
  418. package/dist/utils/query.js +46 -2
  419. package/dist/utils/query.js.map +1 -1
  420. package/dist/utils/record.d.ts +5 -0
  421. package/dist/utils/record.js +8 -0
  422. package/dist/utils/record.js.map +1 -0
  423. package/package.json +11 -3
@@ -1,22 +1,24 @@
1
1
  import { stripBasePath } from "../utils/base-path.js";
2
- import { ACTION_REDIRECT_HEADER, VINEXT_MOUNTED_SLOTS_HEADER, VINEXT_PARAMS_HEADER } from "./headers.js";
2
+ import { ACTION_REDIRECT_HEADER, VINEXT_MOUNTED_SLOTS_HEADER, VINEXT_PARAMS_HEADER, VINEXT_RSC_REDIRECT_HEADER } from "./headers.js";
3
3
  import { DANGEROUS_URL_BLOCK_MESSAGE, isDangerousScheme } from "../shims/url-safety.js";
4
+ import { AppElementsWire } from "./app-elements-wire.js";
4
5
  import { APP_RSC_RENDER_MODE_REFRESH_PRESERVE_UI } from "./app-rsc-render-mode.js";
5
6
  import { installWindowNext } from "../client/window-next.js";
6
7
  import { scrollToHashTargetOnNextFrame } from "../shims/hash-scroll.js";
8
+ import { getNavigationRuntime, registerNavigationRuntimeBootstrap, registerNavigationRuntimeFunctions } from "../client/navigation-runtime.js";
7
9
  import { notifyAppRouterTransitionStart } from "../client/instrumentation-client-state.js";
8
- import { AppElementsWire } from "./app-elements-wire.js";
9
10
  import { getMountedSlotIdsHeader, resolveVisitedResponseInterceptionContext } from "./app-elements.js";
11
+ import { resolveManifestNavigationInterceptionContext } from "./app-browser-interception-context.js";
10
12
  import { createHistoryStateWithNavigationMetadata, createHistoryStateWithPreviousNextUrl, readHistoryStatePreviousNextUrl, readHistoryStateTraversalIndex, resolveHistoryTraversalIntent } from "./app-history-state.js";
11
13
  import { VINEXT_RSC_COMPATIBILITY_ID_HEADER, createRscRequestHeaders, createRscRequestUrl, getVinextRscCompatibilityId, resolveHardNavigationTargetFromRscResponse, resolveRscCompatibilityNavigationDecision } from "./app-rsc-cache-busting.js";
12
14
  import { AppRouterContext } from "../shims/internal/app-router-context.js";
13
- import { __basePath, appRouterInstance, commitClientNavigationState, consumePrefetchResponse, createCachedRscResponseSnapshot, createClientNavigationRenderSnapshot, getClientNavigationRenderContext, getCurrentInterceptionContext, getCurrentNextUrl, invalidatePrefetchCache, pushHistoryStateWithoutNotify, replaceClientParamsWithoutNotify, replaceHistoryStateWithoutNotify, restoreRscResponse, setClientParams, setMountedSlotsHeader, setNavigationContext, setPendingPathname } from "../shims/navigation.js";
15
+ import { __basePath, appRouterInstance, commitClientNavigationState, consumePrefetchResponse, createCachedRscResponseSnapshot, createClientNavigationRenderSnapshot, getClientNavigationRenderContext, getPrefetchCache, invalidatePrefetchCache, navigateClientSide, pushHistoryStateWithoutNotify, replaceClientParamsWithoutNotify, replaceHistoryStateWithoutNotify, restoreRscResponse, setClientParams, setMountedSlotsHeader, setNavigationContext, setPendingPathname } from "../shims/navigation.js";
14
16
  import { DevRecoveryBoundary, RedirectBoundary } from "../shims/error-boundary.js";
15
17
  import { ElementsContext, Slot } from "../shims/slot.js";
16
18
  import "../client/instrumentation-client.js";
17
- import { createDiscardedServerActionRefreshScheduler, createServerActionInitiationSnapshot, isServerActionResult, parseServerActionRevalidationHeader, shouldClearClientNavigationCachesForServerActionResult } from "./app-browser-action-result.js";
19
+ import { createDiscardedServerActionRefreshScheduler, createServerActionInitiationSnapshot, isServerActionResult, parseServerActionRevalidationHeader, resolveServerActionRedirectLocation, shouldClearClientNavigationCachesForServerActionResult } from "./app-browser-action-result.js";
18
20
  import { chunksToReadableStream, createProgressiveRscStream, getVinextBrowserGlobal } from "./app-browser-stream.js";
19
- import { resolveInterceptionContextFromPreviousNextUrl, resolveServerActionRequestState } from "./app-browser-state.js";
21
+ import { FRESH_APP_NAVIGATION_PAYLOAD_ORIGIN, VISITED_CACHE_APP_NAVIGATION_PAYLOAD_ORIGIN, isCacheRestorableAppPayloadMetadata, resolveInterceptionContextFromPreviousNextUrl, resolveServerActionRequestState } from "./app-browser-state.js";
20
22
  import { clearHardNavigationLoopGuard, createAppBrowserNavigationController } from "./app-browser-navigation-controller.js";
21
23
  import { consumeInitialFormState, createVinextHydrateRootOptions, hydrateRootInTransition } from "./app-browser-hydration.js";
22
24
  import { createPopstateRestoreHandler } from "./app-browser-popstate.js";
@@ -25,6 +27,7 @@ import { dismissOverlay } from "./dev-error-overlay-store.js";
25
27
  import { devOnCaughtError, devOnUncaughtError, installDevErrorOverlay } from "./dev-error-overlay.js";
26
28
  import { throwOnServerActionNotFound } from "./server-action-not-found.js";
27
29
  import { resolveRscRedirectLifecycleHop } from "./app-browser-rsc-redirect.js";
30
+ import { createOptimisticRouteTemplate, getOptimisticPrefetchSourceKey, getOptimisticRouteTemplateKey, resolveOptimisticNavigationPayload } from "./app-optimistic-routing.js";
28
31
  import { createElement, startTransition, use, useLayoutEffect, useRef, useState } from "react";
29
32
  import { createFromFetch, createFromReadableStream, createTemporaryReferenceSet, encodeReply, setServerCallback } from "@vitejs/plugin-rsc/browser";
30
33
  import { hydrateRoot } from "react-dom/client";
@@ -44,8 +47,11 @@ const MAX_VISITED_RESPONSE_CACHE_SIZE = 50;
44
47
  const VISITED_RESPONSE_CACHE_TTL = 5 * 6e4;
45
48
  const MAX_TRAVERSAL_CACHE_TTL = 30 * 6e4;
46
49
  const CLIENT_RSC_COMPATIBILITY_ID = getVinextRscCompatibilityId();
50
+ const optimisticRouteTemplates = /* @__PURE__ */ new Map();
51
+ const optimisticRouteTemplateSources = /* @__PURE__ */ new Set();
52
+ const optimisticRouteTemplateLearning = /* @__PURE__ */ new Map();
47
53
  function getBrowserRouteManifest() {
48
- return window.__VINEXT_ROUTE_MANIFEST__ ?? null;
54
+ return getNavigationRuntime()?.bootstrap.routeManifest ?? null;
49
55
  }
50
56
  const browserNavigationController = createAppBrowserNavigationController({
51
57
  getRouteManifest: getBrowserRouteManifest,
@@ -53,9 +59,7 @@ const browserNavigationController = createAppBrowserNavigationController({
53
59
  });
54
60
  const discardedServerActionRefreshScheduler = createDiscardedServerActionRefreshScheduler({ runRefresh() {
55
61
  clearClientNavigationCaches();
56
- const rscNavigate = window.__VINEXT_RSC_NAVIGATE__;
57
- if (typeof rscNavigate !== "function") return;
58
- rscNavigate(window.location.href, 0, "refresh", void 0, void 0, true);
62
+ getNavigationRuntime()?.functions.navigate?.(window.location.href, 0, "refresh", void 0, void 0, true);
59
63
  } });
60
64
  const NavigationCommitSignal = browserNavigationController.NavigationCommitSignal;
61
65
  function parseEncodedJsonHeader(value) {
@@ -139,11 +143,80 @@ function clearVisitedResponseCache() {
139
143
  }
140
144
  function clearPrefetchState() {
141
145
  invalidatePrefetchCache();
146
+ optimisticRouteTemplates.clear();
147
+ optimisticRouteTemplateSources.clear();
148
+ optimisticRouteTemplateLearning.clear();
142
149
  }
143
150
  function clearClientNavigationCaches() {
144
151
  clearVisitedResponseCache();
145
152
  clearPrefetchState();
146
153
  }
154
+ function isSettledPrefetchCacheEntry(entry) {
155
+ return entry.outcome === "cache-seeded" && entry.pending === void 0 && entry.snapshot !== void 0;
156
+ }
157
+ function parsePrefetchCacheKey(cacheKey) {
158
+ const separatorIndex = cacheKey.indexOf("\0");
159
+ if (separatorIndex === -1) return {
160
+ interceptionContext: null,
161
+ rscUrl: cacheKey
162
+ };
163
+ return {
164
+ interceptionContext: cacheKey.slice(separatorIndex + 1),
165
+ rscUrl: cacheKey.slice(0, separatorIndex)
166
+ };
167
+ }
168
+ async function learnOptimisticRouteTemplateFromPrefetch(options) {
169
+ const source = parsePrefetchCacheKey(options.cacheKey);
170
+ if (source.interceptionContext !== options.interceptionContext) return false;
171
+ if ((options.entry.snapshot.mountedSlotsHeader ?? null) !== options.mountedSlotsHeader) return false;
172
+ if (options.interceptionContext !== null) return false;
173
+ const elements = await decodeAppElementsPromise(createFromFetch(Promise.resolve(restoreRscResponse(options.entry.snapshot))));
174
+ const template = createOptimisticRouteTemplate({
175
+ allowLoadingShell: options.entry.optimisticRouteShell === true,
176
+ basePath: __basePath,
177
+ elements,
178
+ href: options.entry.snapshot.url || source.rscUrl,
179
+ interceptionContext: options.interceptionContext,
180
+ mountedSlotsHeader: options.mountedSlotsHeader,
181
+ routeManifest: options.routeManifest
182
+ });
183
+ if (template === null) return false;
184
+ optimisticRouteTemplates.set(getOptimisticRouteTemplateKey({
185
+ interceptionContext: options.interceptionContext,
186
+ mountedSlotsHeader: options.mountedSlotsHeader,
187
+ routeId: template.routeId
188
+ }), template);
189
+ return true;
190
+ }
191
+ async function learnOptimisticRouteTemplatesFromPrefetchCache(options) {
192
+ if (options.routeManifest === null) return;
193
+ const learning = [...optimisticRouteTemplateLearning.values()];
194
+ for (const [cacheKey, entry] of getPrefetchCache()) {
195
+ const sourceKey = getOptimisticPrefetchSourceKey({
196
+ cacheKey,
197
+ interceptionContext: options.interceptionContext,
198
+ mountedSlotsHeader: options.mountedSlotsHeader
199
+ });
200
+ if (optimisticRouteTemplateSources.has(sourceKey)) continue;
201
+ if (optimisticRouteTemplateLearning.has(sourceKey)) continue;
202
+ if (!isSettledPrefetchCacheEntry(entry)) continue;
203
+ const promise = learnOptimisticRouteTemplateFromPrefetch({
204
+ cacheKey,
205
+ entry,
206
+ interceptionContext: options.interceptionContext,
207
+ mountedSlotsHeader: options.mountedSlotsHeader,
208
+ routeManifest: options.routeManifest
209
+ }).then((learned) => {
210
+ if (learned) optimisticRouteTemplateSources.add(sourceKey);
211
+ }).finally(() => {
212
+ optimisticRouteTemplateLearning.delete(sourceKey);
213
+ });
214
+ optimisticRouteTemplateLearning.set(sourceKey, promise);
215
+ learning.push(promise);
216
+ }
217
+ if (learning.length === 0) return;
218
+ await Promise.allSettled(learning);
219
+ }
147
220
  function syncCurrentHistoryStatePreviousNextUrl(previousNextUrl) {
148
221
  if (readHistoryStatePreviousNextUrl(window.history.state) === previousNextUrl) return;
149
222
  const nextHistoryState = createHistoryStateWithPreviousNextUrl(window.history.state, previousNextUrl);
@@ -194,7 +267,7 @@ function createNavigationCommitEffect(options) {
194
267
  commitClientNavigationState(navId);
195
268
  };
196
269
  }
197
- async function renderNavigationPayload(payload, navigationSnapshot, targetHref, navId, historyUpdateMode, params, previousNextUrl, pendingRouterState, actionType = "navigate", operationLane = "navigation", traversalIntent = null) {
270
+ async function renderNavigationPayload(payload, navigationSnapshot, targetHref, navId, historyUpdateMode, params, previousNextUrl, pendingRouterState, payloadOrigin, actionType = "navigate", operationLane = "navigation", traversalIntent = null) {
198
271
  try {
199
272
  return await browserNavigationController.renderNavigationPayload({
200
273
  actionType,
@@ -206,6 +279,7 @@ async function renderNavigationPayload(payload, navigationSnapshot, targetHref,
206
279
  navigationSnapshot,
207
280
  nextElements: payload,
208
281
  operationLane,
282
+ payloadOrigin,
209
283
  params,
210
284
  pendingRouterState,
211
285
  previousNextUrl,
@@ -274,7 +348,7 @@ function storeVisitedResponseSnapshot(rscUrl, interceptionContext, snapshot, par
274
348
  response: snapshot
275
349
  });
276
350
  }
277
- function getRequestState(navigationKind, previousNextUrlOverride, traverseHistoryState) {
351
+ function getRequestState(navigationKind, targetPathname, previousNextUrlOverride, traverseHistoryState) {
278
352
  if (previousNextUrlOverride !== void 0) return {
279
353
  interceptionContext: resolveInterceptionContextFromPreviousNextUrl(previousNextUrlOverride, __basePath),
280
354
  previousNextUrl: previousNextUrlOverride
@@ -286,9 +360,19 @@ function getRequestState(navigationKind, previousNextUrlOverride, traverseHistor
286
360
  interceptionContext: resolveInterceptionContextFromPreviousNextUrl(currentPreviousNextUrl, __basePath),
287
361
  previousNextUrl: currentPreviousNextUrl
288
362
  };
363
+ const manifestInterceptionContext = resolveManifestNavigationInterceptionContext({
364
+ basePath: __basePath,
365
+ currentPathname: window.location.pathname,
366
+ routeManifest: getBrowserRouteManifest(),
367
+ targetPathname
368
+ });
369
+ if (manifestInterceptionContext !== null) return {
370
+ interceptionContext: manifestInterceptionContext,
371
+ previousNextUrl: window.location.pathname + window.location.search
372
+ };
289
373
  return {
290
- interceptionContext: getCurrentInterceptionContext(),
291
- previousNextUrl: getCurrentNextUrl()
374
+ interceptionContext: null,
375
+ previousNextUrl: null
292
376
  };
293
377
  }
294
378
  case "traverse": {
@@ -338,7 +422,11 @@ function BrowserRoot({ initialElements, initialNavigationSnapshot }) {
338
422
  useLayoutEffect(() => {
339
423
  const detach = browserNavigationController.attachBrowserRouterState(setTreeStateValue, stateRef);
340
424
  browserRouterStateHasEverCommitted = true;
341
- window.__VINEXT_HYDRATED_AT = performance.now();
425
+ const hydratedAt = performance.now();
426
+ window.__VINEXT_HYDRATED_AT = hydratedAt;
427
+ window.__NEXT_HYDRATED = true;
428
+ window.__NEXT_HYDRATED_AT = hydratedAt;
429
+ window.__NEXT_HYDRATED_CB?.();
342
430
  return () => {
343
431
  detach();
344
432
  setMountedSlotsHeader(null);
@@ -346,7 +434,7 @@ function BrowserRoot({ initialElements, initialNavigationSnapshot }) {
346
434
  }, [setTreeStateValue]);
347
435
  useLayoutEffect(() => {
348
436
  setMountedSlotsHeader(getMountedSlotIdsHeader(stateRef.current.elements));
349
- window.__VINEXT_PING_VISIBLE_LINKS__?.();
437
+ getNavigationRuntime()?.functions.pingVisibleLinks?.();
350
438
  }, [treeState.elements]);
351
439
  useLayoutEffect(() => {
352
440
  if (treeState.renderId !== 0) return;
@@ -429,16 +517,17 @@ function recoverFromBadInitialRscResponse(reason) {
429
517
  }
430
518
  async function readInitialRscStream() {
431
519
  const vinext = getVinextBrowserGlobal();
432
- if (vinext.__VINEXT_RSC__ || vinext.__VINEXT_RSC_CHUNKS__ || vinext.__VINEXT_RSC_DONE__) {
520
+ const runtimeRsc = getNavigationRuntime()?.bootstrap.rsc;
521
+ if (runtimeRsc || vinext.__VINEXT_RSC_CHUNKS__ || vinext.__VINEXT_RSC_DONE__) {
433
522
  clearReloadFlag();
434
523
  clearHardNavigationLoopGuard();
435
- if (vinext.__VINEXT_RSC__) {
436
- const embedData = vinext.__VINEXT_RSC__;
437
- delete vinext.__VINEXT_RSC__;
438
- const params = embedData.params ?? {};
439
- if (embedData.params) applyClientParams(embedData.params);
440
- if (embedData.nav) restoreHydrationNavigationContext(embedData.nav.pathname, embedData.nav.searchParams, params);
441
- return chunksToReadableStream(embedData.rsc);
524
+ if (runtimeRsc) {
525
+ applyRuntimeRscBootstrap(runtimeRsc);
526
+ if (runtimeRsc.done) {
527
+ registerNavigationRuntimeBootstrap({ rsc: void 0 });
528
+ return chunksToReadableStream(runtimeRsc.rsc);
529
+ }
530
+ return createProgressiveRscStream();
442
531
  }
443
532
  const params = vinext.__VINEXT_RSC_PARAMS__ ?? {};
444
533
  if (vinext.__VINEXT_RSC_PARAMS__) applyClientParams(vinext.__VINEXT_RSC_PARAMS__);
@@ -464,6 +553,11 @@ async function readInitialRscStream() {
464
553
  restoreHydrationNavigationContext(window.location.pathname, window.location.search, params);
465
554
  return rscResponse.body;
466
555
  }
556
+ function applyRuntimeRscBootstrap(rsc) {
557
+ const params = rsc.params ?? {};
558
+ if (rsc.params) applyClientParams(rsc.params);
559
+ if (rsc.nav) restoreHydrationNavigationContext(rsc.nav.pathname, rsc.nav.searchParams, params);
560
+ }
467
561
  function registerServerActionCallback() {
468
562
  setServerCallback(async (id, args) => {
469
563
  const temporaryReferences = createTemporaryReferenceSet();
@@ -488,15 +582,24 @@ function registerServerActionCallback() {
488
582
  console.error(DANGEROUS_URL_BLOCK_MESSAGE);
489
583
  return;
490
584
  }
585
+ const historyUpdateMode = (fetchResponse.headers.get("x-action-redirect-type") ?? "push") === "push" ? "push" : "replace";
586
+ const hardNavigationMode = historyUpdateMode === "push" ? "assign" : "replace";
587
+ let redirectLocation;
491
588
  try {
492
- if (new URL(actionRedirect, window.location.origin).origin !== window.location.origin) {
493
- window.location.href = actionRedirect;
494
- return;
495
- }
496
- } catch {}
589
+ redirectLocation = resolveServerActionRedirectLocation({
590
+ currentHref: actionInitiation.href,
591
+ location: actionRedirect,
592
+ origin: window.location.origin
593
+ });
594
+ } catch {
595
+ clearClientNavigationCaches();
596
+ browserNavigationController.performHardNavigation(actionRedirect, hardNavigationMode);
597
+ return;
598
+ }
497
599
  clearClientNavigationCaches();
498
- if ((fetchResponse.headers.get("x-action-redirect-type") ?? "replace") === "push") window.location.assign(actionRedirect);
499
- else window.location.replace(actionRedirect);
600
+ startTransition(() => {
601
+ navigateClientSide(redirectLocation.href, historyUpdateMode, true, true);
602
+ });
500
603
  return;
501
604
  }
502
605
  if (resolveRscCompatibilityNavigationDecision({
@@ -506,7 +609,7 @@ function registerServerActionCallback() {
506
609
  responseCompatibilityId: fetchResponse.headers.get("X-Vinext-RSC-Compatibility-Id"),
507
610
  responseUrl: fetchResponse.url
508
611
  }).kind === "hard-navigate") {
509
- window.location.reload();
612
+ browserNavigationController.performHardNavigation(actionInitiation.href);
510
613
  return;
511
614
  }
512
615
  const revalidation = parseServerActionRevalidationHeader(fetchResponse.headers);
@@ -557,150 +660,201 @@ function bootstrapHydration(rscStream) {
557
660
  options: hydrateRootOptions,
558
661
  startTransition
559
662
  });
560
- window.__VINEXT_CLEAR_NAV_CACHES__ = clearClientNavigationCaches;
561
- window.__VINEXT_RSC_COMMIT_HASH_NAVIGATION__ = commitHashOnlyNavigation;
562
- window.__VINEXT_RSC_NAVIGATE__ = async function navigateRsc(href, redirectDepth = 0, navigationKind = "navigate", historyUpdateMode, previousNextUrlOverride, programmaticTransition = false, traversalIntent) {
563
- let pendingRouterState = null;
564
- const navId = browserNavigationController.beginNavigation();
565
- discardedServerActionRefreshScheduler.markNavigationStart();
566
- let currentHref = href;
567
- let currentHistoryMode = historyUpdateMode;
568
- let currentPrevNextUrl = previousNextUrlOverride;
569
- let redirectCount = redirectDepth;
570
- const activeTraversalIntent = navigationKind === "traverse" ? traversalIntent ?? resolveHistoryTraversalIntent({
571
- currentHistoryIndex: currentHistoryTraversalIndex,
572
- historyState: window.history.state
573
- }) : null;
574
- try {
575
- const shouldUsePendingRouterState = programmaticTransition;
576
- if (shouldUsePendingRouterState && hasBrowserRouterState()) pendingRouterState = beginPendingBrowserRouterState();
577
- else {
578
- await waitForBrowserRouterStateReady();
579
- if (!browserNavigationController.isCurrentNavigation(navId)) return;
580
- if (shouldUsePendingRouterState) pendingRouterState = beginPendingBrowserRouterState();
581
- }
582
- while (true) {
583
- const url = new URL(currentHref, window.location.origin);
584
- const requestState = getRequestState(navigationKind, currentPrevNextUrl, activeTraversalIntent?.historyState);
585
- const requestInterceptionContext = requestState.interceptionContext;
586
- const requestPreviousNextUrl = requestState.previousNextUrl;
587
- if (navigationKind === "refresh") syncCurrentHistoryStatePreviousNextUrl(requestPreviousNextUrl);
588
- setPendingPathname(url.pathname, navId);
589
- const elementsAtNavStart = getBrowserRouterState().elements;
590
- const mountedSlotsHeader = getMountedSlotIdsHeader(elementsAtNavStart);
591
- const requestHeaders = createRscRequestHeaders({
592
- interceptionContext: requestInterceptionContext,
593
- renderMode: navigationKind === "refresh" ? APP_RSC_RENDER_MODE_REFRESH_PRESERVE_UI : void 0
594
- });
595
- if (mountedSlotsHeader) requestHeaders.set(VINEXT_MOUNTED_SLOTS_HEADER, mountedSlotsHeader);
596
- const rscUrl = await createRscRequestUrl(url.pathname + url.search, requestHeaders);
597
- const cachedRoute = getVisitedResponse(rscUrl, requestInterceptionContext, mountedSlotsHeader, navigationKind);
598
- if (cachedRoute) {
663
+ registerNavigationRuntimeFunctions({
664
+ clearNavigationCaches: clearClientNavigationCaches,
665
+ commitHashNavigation: commitHashOnlyNavigation,
666
+ navigate: async function navigateRsc(href, redirectDepth = 0, navigationKind = "navigate", historyUpdateMode, previousNextUrlOverride, programmaticTransition = false, traversalIntent) {
667
+ let pendingRouterState = null;
668
+ const navId = browserNavigationController.beginNavigation();
669
+ discardedServerActionRefreshScheduler.markNavigationStart();
670
+ let currentHref = href;
671
+ let currentHistoryMode = historyUpdateMode;
672
+ let currentPrevNextUrl = previousNextUrlOverride;
673
+ let redirectCount = redirectDepth;
674
+ let detachedNavigationCommits = false;
675
+ const activeTraversalIntent = navigationKind === "traverse" ? traversalIntent ?? resolveHistoryTraversalIntent({
676
+ currentHistoryIndex: currentHistoryTraversalIndex,
677
+ historyState: window.history.state
678
+ }) : null;
679
+ try {
680
+ const shouldUsePendingRouterState = programmaticTransition;
681
+ if (shouldUsePendingRouterState && hasBrowserRouterState()) pendingRouterState = beginPendingBrowserRouterState();
682
+ else {
683
+ await waitForBrowserRouterStateReady();
684
+ if (!browserNavigationController.isCurrentNavigation(navId)) return;
685
+ if (shouldUsePendingRouterState) pendingRouterState = beginPendingBrowserRouterState();
686
+ }
687
+ while (true) {
688
+ const url = new URL(currentHref, window.location.origin);
689
+ const requestState = getRequestState(navigationKind, url.pathname, currentPrevNextUrl, activeTraversalIntent?.historyState);
690
+ const requestInterceptionContext = requestState.interceptionContext;
691
+ const requestPreviousNextUrl = requestState.previousNextUrl;
692
+ if (navigationKind === "refresh") syncCurrentHistoryStatePreviousNextUrl(requestPreviousNextUrl);
693
+ setPendingPathname(url.pathname, navId);
694
+ const elementsAtNavStart = getBrowserRouterState().elements;
695
+ const mountedSlotsHeader = getMountedSlotIdsHeader(elementsAtNavStart);
696
+ const requestHeaders = createRscRequestHeaders({
697
+ interceptionContext: requestInterceptionContext,
698
+ renderMode: navigationKind === "refresh" ? APP_RSC_RENDER_MODE_REFRESH_PRESERVE_UI : void 0
699
+ });
700
+ if (mountedSlotsHeader) requestHeaders.set(VINEXT_MOUNTED_SLOTS_HEADER, mountedSlotsHeader);
701
+ const rscUrl = await createRscRequestUrl(url.pathname + url.search, requestHeaders);
702
+ const cachedRoute = getVisitedResponse(rscUrl, requestInterceptionContext, mountedSlotsHeader, navigationKind);
703
+ if (cachedRoute) {
704
+ const compatibilityDecision = resolveRscCompatibilityNavigationDecision({
705
+ clientCompatibilityId: CLIENT_RSC_COMPATIBILITY_ID,
706
+ currentHref,
707
+ origin: window.location.origin,
708
+ responseCompatibilityId: cachedRoute.response.compatibilityIdHeader,
709
+ responseUrl: cachedRoute.response.url
710
+ });
711
+ if (compatibilityDecision.kind === "hard-navigate") {
712
+ browserNavigationController.performHardNavigation(compatibilityDecision.hardNavigationTarget);
713
+ return;
714
+ }
715
+ if (!browserNavigationController.isCurrentNavigation(navId)) return;
716
+ const cachedParams = cachedRoute.params;
717
+ const cachedNavigationSnapshot = createClientNavigationRenderSnapshot(currentHref, cachedParams);
718
+ const cachedPayload = decodeAppElementsPromise(createFromFetch(Promise.resolve(restoreRscResponse(cachedRoute.response))));
719
+ if (!browserNavigationController.isCurrentNavigation(navId)) return;
720
+ await renderNavigationPayload(cachedPayload, cachedNavigationSnapshot, currentHref, navId, currentHistoryMode, cachedParams, requestPreviousNextUrl, detachedNavigationCommits ? null : pendingRouterState, VISITED_CACHE_APP_NAVIGATION_PAYLOAD_ORIGIN, toActionType(navigationKind), toOperationLane(navigationKind), activeTraversalIntent);
721
+ return;
722
+ }
723
+ let navResponse;
724
+ let navResponseUrl = null;
725
+ if (navigationKind !== "refresh") {
726
+ const prefetchedResponse = consumePrefetchResponse(rscUrl, requestInterceptionContext, mountedSlotsHeader);
727
+ if (prefetchedResponse) {
728
+ navResponse = restoreRscResponse(prefetchedResponse, false);
729
+ navResponseUrl = prefetchedResponse.url;
730
+ }
731
+ }
732
+ if (!navResponse && navigationKind === "navigate") {
733
+ const routeManifest = getBrowserRouteManifest();
734
+ await learnOptimisticRouteTemplatesFromPrefetchCache({
735
+ interceptionContext: requestInterceptionContext,
736
+ mountedSlotsHeader,
737
+ routeManifest
738
+ });
739
+ if (!browserNavigationController.isCurrentNavigation(navId)) return;
740
+ if (routeManifest !== null) {
741
+ const optimisticPayload = resolveOptimisticNavigationPayload({
742
+ basePath: __basePath,
743
+ href: currentHref,
744
+ interceptionContext: requestInterceptionContext,
745
+ mountedSlotsHeader,
746
+ routeManifest,
747
+ templates: optimisticRouteTemplates
748
+ });
749
+ if (optimisticPayload !== null) {
750
+ detachedNavigationCommits = true;
751
+ const optimisticNavigationSnapshot = createClientNavigationRenderSnapshot(currentHref, optimisticPayload.params);
752
+ renderNavigationPayload(Promise.resolve(optimisticPayload.elements), optimisticNavigationSnapshot, currentHref, navId, currentHistoryMode, optimisticPayload.params, requestPreviousNextUrl, null, FRESH_APP_NAVIGATION_PAYLOAD_ORIGIN, toActionType(navigationKind), toOperationLane(navigationKind), activeTraversalIntent).catch((error) => {
753
+ if (browserNavigationController.isCurrentNavigation(navId)) console.error("[vinext] Optimistic RSC navigation error:", error);
754
+ });
755
+ }
756
+ }
757
+ }
758
+ if (!navResponse) navResponse = await fetch(rscUrl, {
759
+ headers: requestHeaders,
760
+ credentials: "include"
761
+ });
762
+ if (!browserNavigationController.isCurrentNavigation(navId)) return;
763
+ const isRscResponse = (navResponse.headers.get("content-type") ?? "").startsWith("text/x-component");
764
+ if (!navResponse.ok || !isRscResponse || !navResponse.body) {
765
+ const responseUrl = navResponseUrl ?? navResponse.url;
766
+ browserNavigationController.performHardNavigation(resolveHardNavigationTargetFromRscResponse(responseUrl, currentHref, window.location.origin));
767
+ return;
768
+ }
599
769
  const compatibilityDecision = resolveRscCompatibilityNavigationDecision({
600
770
  clientCompatibilityId: CLIENT_RSC_COMPATIBILITY_ID,
601
771
  currentHref,
602
772
  origin: window.location.origin,
603
- responseCompatibilityId: cachedRoute.response.compatibilityIdHeader,
604
- responseUrl: cachedRoute.response.url
773
+ responseCompatibilityId: navResponse.headers.get(VINEXT_RSC_COMPATIBILITY_ID_HEADER),
774
+ responseUrl: navResponseUrl ?? navResponse.url
605
775
  });
606
776
  if (compatibilityDecision.kind === "hard-navigate") {
607
- window.location.href = compatibilityDecision.hardNavigationTarget;
777
+ browserNavigationController.performHardNavigation(compatibilityDecision.hardNavigationTarget);
778
+ return;
779
+ }
780
+ const redirectDecision = resolveRscRedirectLifecycleHop({
781
+ currentHref,
782
+ historyUpdateMode: currentHistoryMode ?? "replace",
783
+ origin: window.location.origin,
784
+ redirectDepth: redirectCount,
785
+ requestPreviousNextUrl,
786
+ responseUrl: navResponseUrl ?? navResponse.url
787
+ });
788
+ if (redirectDecision.kind === "terminal-hard-navigation") {
789
+ if (redirectDecision.reason === "maxRedirectsExceeded") console.error("[vinext] Too many RSC redirects — aborting navigation to prevent infinite loop.");
790
+ browserNavigationController.performHardNavigation(redirectDecision.href);
608
791
  return;
609
792
  }
793
+ if (redirectDecision.kind === "follow") {
794
+ currentHref = redirectDecision.href;
795
+ currentHistoryMode = redirectDecision.historyUpdateMode;
796
+ currentPrevNextUrl = redirectDecision.previousNextUrl;
797
+ redirectCount = redirectDecision.redirectDepth;
798
+ continue;
799
+ }
800
+ const flightRedirectTarget = navResponse.headers.get(VINEXT_RSC_REDIRECT_HEADER);
801
+ if (flightRedirectTarget) {
802
+ navResponse.body?.cancel().catch(() => {});
803
+ const resolvedTarget = new URL(flightRedirectTarget, window.location.origin);
804
+ if (resolvedTarget.origin !== window.location.origin) {
805
+ browserNavigationController.performHardNavigation(resolvedTarget.href);
806
+ return;
807
+ }
808
+ if (redirectCount >= 10) {
809
+ console.error("[vinext] Too many RSC redirects — aborting navigation to prevent infinite loop.");
810
+ browserNavigationController.performHardNavigation(resolvedTarget.href);
811
+ return;
812
+ }
813
+ currentHref = `${resolvedTarget.pathname}${resolvedTarget.search}${resolvedTarget.hash}`;
814
+ redirectCount += 1;
815
+ continue;
816
+ }
817
+ const navParams = parseEncodedJsonHeader(navResponse.headers.get("X-Vinext-Params")) ?? {};
818
+ const navigationSnapshot = createClientNavigationRenderSnapshot(currentHref, navParams);
819
+ const navBody = navResponse.body;
820
+ if (!navBody) return;
821
+ const [reactBranch, cacheBranch] = navBody.tee();
822
+ const reactResponse = new Response(reactBranch, {
823
+ status: navResponse.status,
824
+ headers: navResponse.headers
825
+ });
826
+ const cacheBufferPromise = new Response(cacheBranch).arrayBuffer();
610
827
  if (!browserNavigationController.isCurrentNavigation(navId)) return;
611
- const cachedParams = cachedRoute.params;
612
- const cachedNavigationSnapshot = createClientNavigationRenderSnapshot(currentHref, cachedParams);
613
- const cachedPayload = decodeAppElementsPromise(createFromFetch(Promise.resolve(restoreRscResponse(cachedRoute.response))));
828
+ const rscPayload = decodeAppElementsPromise(createFromFetch(Promise.resolve(reactResponse)));
614
829
  if (!browserNavigationController.isCurrentNavigation(navId)) return;
615
- await renderNavigationPayload(cachedPayload, cachedNavigationSnapshot, currentHref, navId, currentHistoryMode, cachedParams, requestPreviousNextUrl, pendingRouterState, toActionType(navigationKind), toOperationLane(navigationKind), activeTraversalIntent);
616
- return;
617
- }
618
- let navResponse;
619
- let navResponseUrl = null;
620
- if (navigationKind !== "refresh") {
621
- const prefetchedResponse = consumePrefetchResponse(rscUrl, requestInterceptionContext, mountedSlotsHeader);
622
- if (prefetchedResponse) {
623
- navResponse = restoreRscResponse(prefetchedResponse, false);
624
- navResponseUrl = prefetchedResponse.url;
830
+ if (await renderNavigationPayload(rscPayload, navigationSnapshot, currentHref, navId, currentHistoryMode, navParams, requestPreviousNextUrl, detachedNavigationCommits ? null : pendingRouterState, FRESH_APP_NAVIGATION_PAYLOAD_ORIGIN, toActionType(navigationKind), toOperationLane(navigationKind), activeTraversalIntent) !== "committed") return;
831
+ if (!browserNavigationController.isCurrentNavigation(navId)) return;
832
+ const resolvedElements = await rscPayload;
833
+ const metadata = AppElementsWire.readMetadata(resolvedElements);
834
+ if (!isCacheRestorableAppPayloadMetadata(metadata)) {
835
+ cacheBufferPromise.catch(() => {});
836
+ return;
625
837
  }
626
- }
627
- if (!navResponse) navResponse = await fetch(rscUrl, {
628
- headers: requestHeaders,
629
- credentials: "include"
630
- });
631
- if (!browserNavigationController.isCurrentNavigation(navId)) return;
632
- const isRscResponse = (navResponse.headers.get("content-type") ?? "").startsWith("text/x-component");
633
- if (!navResponse.ok || !isRscResponse || !navResponse.body) {
634
- const responseUrl = navResponseUrl ?? navResponse.url;
635
- window.location.href = resolveHardNavigationTargetFromRscResponse(responseUrl, currentHref, window.location.origin);
636
- return;
637
- }
638
- const compatibilityDecision = resolveRscCompatibilityNavigationDecision({
639
- clientCompatibilityId: CLIENT_RSC_COMPATIBILITY_ID,
640
- currentHref,
641
- origin: window.location.origin,
642
- responseCompatibilityId: navResponse.headers.get(VINEXT_RSC_COMPATIBILITY_ID_HEADER),
643
- responseUrl: navResponseUrl ?? navResponse.url
644
- });
645
- if (compatibilityDecision.kind === "hard-navigate") {
646
- window.location.href = compatibilityDecision.hardNavigationTarget;
647
- return;
648
- }
649
- const redirectDecision = resolveRscRedirectLifecycleHop({
650
- currentHref,
651
- historyUpdateMode: currentHistoryMode ?? "replace",
652
- origin: window.location.origin,
653
- redirectDepth: redirectCount,
654
- requestPreviousNextUrl,
655
- responseUrl: navResponseUrl ?? navResponse.url
656
- });
657
- if (redirectDecision.kind === "terminal-hard-navigation") {
658
- if (redirectDecision.reason === "maxRedirectsExceeded") console.error("[vinext] Too many RSC redirects — aborting navigation to prevent infinite loop.");
659
- window.location.href = redirectDecision.href;
838
+ cacheBufferPromise.then((cacheBuffer) => {
839
+ storeVisitedResponseSnapshot(rscUrl, resolveVisitedResponseInterceptionContext(requestInterceptionContext, metadata.interceptionContext), createCachedRscResponseSnapshot(navResponse, cacheBuffer, navResponseUrl), navParams);
840
+ }).catch(() => {});
660
841
  return;
661
842
  }
662
- if (redirectDecision.kind === "follow") {
663
- currentHref = redirectDecision.href;
664
- currentHistoryMode = redirectDecision.historyUpdateMode;
665
- currentPrevNextUrl = redirectDecision.previousNextUrl;
666
- redirectCount = redirectDecision.redirectDepth;
667
- continue;
668
- }
669
- const navParams = parseEncodedJsonHeader(navResponse.headers.get("X-Vinext-Params")) ?? {};
670
- const navigationSnapshot = createClientNavigationRenderSnapshot(currentHref, navParams);
671
- const navBody = navResponse.body;
672
- if (!navBody) return;
673
- const [reactBranch, cacheBranch] = navBody.tee();
674
- const reactResponse = new Response(reactBranch, {
675
- status: navResponse.status,
676
- headers: navResponse.headers
677
- });
678
- const cacheBufferPromise = new Response(cacheBranch).arrayBuffer();
679
- if (!browserNavigationController.isCurrentNavigation(navId)) return;
680
- const rscPayload = decodeAppElementsPromise(createFromFetch(Promise.resolve(reactResponse)));
681
- if (!browserNavigationController.isCurrentNavigation(navId)) return;
682
- if (await renderNavigationPayload(rscPayload, navigationSnapshot, currentHref, navId, currentHistoryMode, navParams, requestPreviousNextUrl, pendingRouterState, toActionType(navigationKind), toOperationLane(navigationKind), activeTraversalIntent) !== "committed") return;
843
+ } catch (error) {
683
844
  if (!browserNavigationController.isCurrentNavigation(navId)) return;
684
- const resolvedElements = await rscPayload;
685
- const metadata = AppElementsWire.readMetadata(resolvedElements);
686
- const cacheBuffer = await cacheBufferPromise;
687
- storeVisitedResponseSnapshot(rscUrl, resolveVisitedResponseInterceptionContext(requestInterceptionContext, metadata.interceptionContext), createCachedRscResponseSnapshot(navResponse, cacheBuffer, navResponseUrl), navParams);
688
- return;
845
+ if (!isPageUnloading) console.error("[vinext] RSC navigation error:", error);
846
+ browserNavigationController.performHardNavigation(currentHref);
847
+ } finally {
848
+ browserNavigationController.finalizeNavigation(navId, pendingRouterState);
849
+ discardedServerActionRefreshScheduler.markNavigationSettled();
689
850
  }
690
- } catch (error) {
691
- if (!browserNavigationController.isCurrentNavigation(navId)) return;
692
- if (!isPageUnloading) console.error("[vinext] RSC navigation error:", error);
693
- window.location.href = currentHref;
694
- } finally {
695
- browserNavigationController.finalizeNavigation(navId, pendingRouterState);
696
- discardedServerActionRefreshScheduler.markNavigationSettled();
697
851
  }
698
- };
852
+ });
699
853
  if ("scrollRestoration" in history) history.scrollRestoration = "manual";
700
854
  const handlePopstate = createPopstateRestoreHandler({
701
855
  getActiveNavigationId: browserNavigationController.getActiveNavigationId.bind(browserNavigationController),
702
856
  getPendingNavigation: () => window.__VINEXT_RSC_PENDING__,
703
- getNavigate: () => window.__VINEXT_RSC_NAVIGATE__,
857
+ getNavigate: () => getNavigationRuntime()?.functions.navigate,
704
858
  isCurrentNavigation: browserNavigationController.isCurrentNavigation.bind(browserNavigationController),
705
859
  notifyAppRouterTransitionStart: (href) => {
706
860
  notifyAppRouterTransitionStart(href, "traverse");