vinext 0.0.49 → 0.0.51

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 (506) 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/fallback-metrics-data.js +14031 -0
  4. package/dist/build/google-fonts/fallback-metrics-data.js.map +1 -0
  5. package/dist/build/google-fonts/fallback-metrics.d.ts +13 -0
  6. package/dist/build/google-fonts/fallback-metrics.js +46 -0
  7. package/dist/build/google-fonts/fallback-metrics.js.map +1 -0
  8. package/dist/build/google-fonts/get-axes.js.map +1 -1
  9. package/dist/build/google-fonts/sort-variants.js.map +1 -1
  10. package/dist/build/google-fonts/validate.js.map +1 -1
  11. package/dist/build/layout-classification.js.map +1 -1
  12. package/dist/build/nitro-route-rules.js.map +1 -1
  13. package/dist/build/precompress.d.ts +13 -2
  14. package/dist/build/precompress.js +12 -3
  15. package/dist/build/precompress.js.map +1 -1
  16. package/dist/build/prerender.d.ts +17 -1
  17. package/dist/build/prerender.js +114 -23
  18. package/dist/build/prerender.js.map +1 -1
  19. package/dist/build/report.d.ts +5 -4
  20. package/dist/build/report.js +196 -348
  21. package/dist/build/report.js.map +1 -1
  22. package/dist/build/route-classification-injector.js.map +1 -1
  23. package/dist/build/route-classification-manifest.js.map +1 -1
  24. package/dist/build/run-prerender.js.map +1 -1
  25. package/dist/build/server-manifest.js.map +1 -1
  26. package/dist/build/ssr-manifest.js.map +1 -1
  27. package/dist/build/standalone.js.map +1 -1
  28. package/dist/build/static-export.js.map +1 -1
  29. package/dist/check.js +2 -1
  30. package/dist/check.js.map +1 -1
  31. package/dist/cli-args.js.map +1 -1
  32. package/dist/cli.js +68 -7
  33. package/dist/cli.js.map +1 -1
  34. package/dist/client/instrumentation-client-state.js.map +1 -1
  35. package/dist/client/validate-module-path.js.map +1 -1
  36. package/dist/client/vinext-next-data.d.ts +5 -1
  37. package/dist/client/window-next.d.ts +151 -0
  38. package/dist/client/window-next.js +48 -0
  39. package/dist/client/window-next.js.map +1 -0
  40. package/dist/cloudflare/kv-cache-handler.js.map +1 -1
  41. package/dist/cloudflare/tpr.js +2 -1
  42. package/dist/cloudflare/tpr.js.map +1 -1
  43. package/dist/config/config-matchers.d.ts +3 -1
  44. package/dist/config/config-matchers.js +5 -4
  45. package/dist/config/config-matchers.js.map +1 -1
  46. package/dist/config/dotenv.d.ts +11 -1
  47. package/dist/config/dotenv.js.map +1 -1
  48. package/dist/config/next-config.d.ts +93 -6
  49. package/dist/config/next-config.js +233 -6
  50. package/dist/config/next-config.js.map +1 -1
  51. package/dist/config/tsconfig-paths.d.ts +13 -0
  52. package/dist/config/tsconfig-paths.js +117 -0
  53. package/dist/config/tsconfig-paths.js.map +1 -0
  54. package/dist/deploy.js +16 -7
  55. package/dist/deploy.js.map +1 -1
  56. package/dist/entries/app-browser-entry.d.ts +3 -1
  57. package/dist/entries/app-browser-entry.js +36 -2
  58. package/dist/entries/app-browser-entry.js.map +1 -1
  59. package/dist/entries/app-rsc-entry.d.ts +19 -1
  60. package/dist/entries/app-rsc-entry.js +49 -12
  61. package/dist/entries/app-rsc-entry.js.map +1 -1
  62. package/dist/entries/app-rsc-manifest.d.ts +9 -0
  63. package/dist/entries/app-rsc-manifest.js +8 -1
  64. package/dist/entries/app-rsc-manifest.js.map +1 -1
  65. package/dist/entries/app-ssr-entry.js.map +1 -1
  66. package/dist/entries/pages-client-entry.js +3 -5
  67. package/dist/entries/pages-client-entry.js.map +1 -1
  68. package/dist/entries/pages-entry-helpers.js.map +1 -1
  69. package/dist/entries/pages-server-entry.js +34 -1
  70. package/dist/entries/pages-server-entry.js.map +1 -1
  71. package/dist/entries/runtime-entry-module.js.map +1 -1
  72. package/dist/index.js +204 -53
  73. package/dist/index.js.map +1 -1
  74. package/dist/init.js.map +1 -1
  75. package/dist/plugins/async-hooks-stub.js.map +1 -1
  76. package/dist/plugins/client-reference-dedup.d.ts +15 -2
  77. package/dist/plugins/client-reference-dedup.js +138 -16
  78. package/dist/plugins/client-reference-dedup.js.map +1 -1
  79. package/dist/plugins/fonts.d.ts +2 -2
  80. package/dist/plugins/fonts.js +15 -6
  81. package/dist/plugins/fonts.js.map +1 -1
  82. package/dist/plugins/instrumentation-client.js.map +1 -1
  83. package/dist/plugins/og-assets.js.map +1 -1
  84. package/dist/plugins/optimize-imports.js.map +1 -1
  85. package/dist/plugins/postcss.js.map +1 -1
  86. package/dist/plugins/rsc-client-reference-loaders.d.ts +7 -0
  87. package/dist/plugins/rsc-client-reference-loaders.js +48 -0
  88. package/dist/plugins/rsc-client-reference-loaders.js.map +1 -0
  89. package/dist/plugins/rsc-client-shim-excludes.js.map +1 -1
  90. package/dist/plugins/sass.d.ts +34 -0
  91. package/dist/plugins/sass.js +22 -0
  92. package/dist/plugins/sass.js.map +1 -0
  93. package/dist/plugins/server-externals-manifest.js.map +1 -1
  94. package/dist/plugins/strip-server-exports.js.map +1 -1
  95. package/dist/routing/app-route-graph.d.ts +78 -6
  96. package/dist/routing/app-route-graph.js +241 -25
  97. package/dist/routing/app-route-graph.js.map +1 -1
  98. package/dist/routing/app-router.js.map +1 -1
  99. package/dist/routing/file-matcher.js.map +1 -1
  100. package/dist/routing/pages-router.js.map +1 -1
  101. package/dist/routing/route-matching.js.map +1 -1
  102. package/dist/routing/route-pattern.d.ts +56 -1
  103. package/dist/routing/route-pattern.js +60 -1
  104. package/dist/routing/route-pattern.js.map +1 -1
  105. package/dist/routing/route-trie.js.map +1 -1
  106. package/dist/routing/route-validation.js.map +1 -1
  107. package/dist/routing/utils.js.map +1 -1
  108. package/dist/server/api-handler.js.map +1 -1
  109. package/dist/server/app-browser-action-result.d.ts +44 -0
  110. package/dist/server/app-browser-action-result.js +79 -0
  111. package/dist/server/app-browser-action-result.js.map +1 -0
  112. package/dist/server/app-browser-entry.js +330 -133
  113. package/dist/server/app-browser-entry.js.map +1 -1
  114. package/dist/server/app-browser-error.js.map +1 -1
  115. package/dist/server/app-browser-hydration.d.ts +31 -0
  116. package/dist/server/app-browser-hydration.js +30 -0
  117. package/dist/server/app-browser-hydration.js.map +1 -0
  118. package/dist/server/app-browser-navigation-controller.d.ts +20 -4
  119. package/dist/server/app-browser-navigation-controller.js +90 -23
  120. package/dist/server/app-browser-navigation-controller.js.map +1 -1
  121. package/dist/server/app-browser-popstate.d.ts +16 -0
  122. package/dist/server/app-browser-popstate.js +17 -0
  123. package/dist/server/app-browser-popstate.js.map +1 -0
  124. package/dist/server/app-browser-rsc-redirect.d.ts +28 -0
  125. package/dist/server/app-browser-rsc-redirect.js +37 -0
  126. package/dist/server/app-browser-rsc-redirect.js.map +1 -0
  127. package/dist/server/app-browser-state.d.ts +27 -23
  128. package/dist/server/app-browser-state.js +158 -54
  129. package/dist/server/app-browser-state.js.map +1 -1
  130. package/dist/server/app-browser-stream.d.ts +9 -4
  131. package/dist/server/app-browser-stream.js +29 -8
  132. package/dist/server/app-browser-stream.js.map +1 -1
  133. package/dist/server/app-browser-visible-commit.d.ts +11 -1
  134. package/dist/server/app-browser-visible-commit.js +69 -21
  135. package/dist/server/app-browser-visible-commit.js.map +1 -1
  136. package/dist/server/app-client-reference-preloader.js.map +1 -1
  137. package/dist/server/app-elements-wire.d.ts +43 -6
  138. package/dist/server/app-elements-wire.js +121 -5
  139. package/dist/server/app-elements-wire.js.map +1 -1
  140. package/dist/server/app-elements.d.ts +2 -2
  141. package/dist/server/app-elements.js +2 -2
  142. package/dist/server/app-elements.js.map +1 -1
  143. package/dist/server/app-fallback-renderer.d.ts +10 -1
  144. package/dist/server/app-fallback-renderer.js +37 -1
  145. package/dist/server/app-fallback-renderer.js.map +1 -1
  146. package/dist/server/app-history-state.d.ts +26 -0
  147. package/dist/server/app-history-state.js +53 -0
  148. package/dist/server/app-history-state.js.map +1 -0
  149. package/dist/server/app-hook-warning-suppression.js.map +1 -1
  150. package/dist/server/app-middleware.d.ts +1 -1
  151. package/dist/server/app-middleware.js +4 -9
  152. package/dist/server/app-middleware.js.map +1 -1
  153. package/dist/server/app-mounted-slots-header.js.map +1 -1
  154. package/dist/server/app-page-boundary-render.d.ts +11 -1
  155. package/dist/server/app-page-boundary-render.js +27 -19
  156. package/dist/server/app-page-boundary-render.js.map +1 -1
  157. package/dist/server/app-page-boundary.d.ts +1 -0
  158. package/dist/server/app-page-boundary.js +10 -7
  159. package/dist/server/app-page-boundary.js.map +1 -1
  160. package/dist/server/app-page-cache.d.ts +23 -3
  161. package/dist/server/app-page-cache.js +63 -27
  162. package/dist/server/app-page-cache.js.map +1 -1
  163. package/dist/server/app-page-dispatch.d.ts +11 -1
  164. package/dist/server/app-page-dispatch.js +85 -14
  165. package/dist/server/app-page-dispatch.js.map +1 -1
  166. package/dist/server/app-page-element-builder.d.ts +10 -1
  167. package/dist/server/app-page-element-builder.js +38 -6
  168. package/dist/server/app-page-element-builder.js.map +1 -1
  169. package/dist/server/app-page-execution.js +2 -3
  170. package/dist/server/app-page-execution.js.map +1 -1
  171. package/dist/server/app-page-head.d.ts +7 -0
  172. package/dist/server/app-page-head.js +6 -1
  173. package/dist/server/app-page-head.js.map +1 -1
  174. package/dist/server/app-page-method.js.map +1 -1
  175. package/dist/server/app-page-params.js.map +1 -1
  176. package/dist/server/app-page-probe.d.ts +23 -1
  177. package/dist/server/app-page-probe.js +29 -1
  178. package/dist/server/app-page-probe.js.map +1 -1
  179. package/dist/server/app-page-render-observation.d.ts +35 -0
  180. package/dist/server/app-page-render-observation.js +68 -0
  181. package/dist/server/app-page-render-observation.js.map +1 -0
  182. package/dist/server/app-page-render.d.ts +12 -2
  183. package/dist/server/app-page-render.js +90 -7
  184. package/dist/server/app-page-render.js.map +1 -1
  185. package/dist/server/app-page-request.d.ts +1 -0
  186. package/dist/server/app-page-request.js +2 -1
  187. package/dist/server/app-page-request.js.map +1 -1
  188. package/dist/server/app-page-response.d.ts +2 -0
  189. package/dist/server/app-page-response.js +18 -7
  190. package/dist/server/app-page-response.js.map +1 -1
  191. package/dist/server/app-page-route-wiring.d.ts +9 -3
  192. package/dist/server/app-page-route-wiring.js +91 -62
  193. package/dist/server/app-page-route-wiring.js.map +1 -1
  194. package/dist/server/app-page-segment-state.d.ts +10 -0
  195. package/dist/server/app-page-segment-state.js +87 -0
  196. package/dist/server/app-page-segment-state.js.map +1 -0
  197. package/dist/server/app-page-stream.d.ts +9 -2
  198. package/dist/server/app-page-stream.js +4 -1
  199. package/dist/server/app-page-stream.js.map +1 -1
  200. package/dist/server/app-post-middleware-context.js.map +1 -1
  201. package/dist/server/app-prerender-endpoints.js.map +1 -1
  202. package/dist/server/app-prerender-static-params.js.map +1 -1
  203. package/dist/server/app-render-dependency.js.map +1 -1
  204. package/dist/server/app-request-context.js.map +1 -1
  205. package/dist/server/app-route-handler-cache.js.map +1 -1
  206. package/dist/server/app-route-handler-dispatch.js +3 -1
  207. package/dist/server/app-route-handler-dispatch.js.map +1 -1
  208. package/dist/server/app-route-handler-execution.js.map +1 -1
  209. package/dist/server/app-route-handler-policy.js +1 -0
  210. package/dist/server/app-route-handler-policy.js.map +1 -1
  211. package/dist/server/app-route-handler-response.js +4 -3
  212. package/dist/server/app-route-handler-response.js.map +1 -1
  213. package/dist/server/app-route-handler-runtime.js.map +1 -1
  214. package/dist/server/app-router-entry.js +7 -15
  215. package/dist/server/app-router-entry.js.map +1 -1
  216. package/dist/server/app-rsc-cache-busting.d.ts +23 -2
  217. package/dist/server/app-rsc-cache-busting.js +75 -19
  218. package/dist/server/app-rsc-cache-busting.js.map +1 -1
  219. package/dist/server/app-rsc-embedded-chunks.d.ts +9 -0
  220. package/dist/server/app-rsc-embedded-chunks.js +34 -0
  221. package/dist/server/app-rsc-embedded-chunks.js.map +1 -0
  222. package/dist/server/app-rsc-error-handler.js.map +1 -1
  223. package/dist/server/app-rsc-errors.d.ts +4 -1
  224. package/dist/server/app-rsc-errors.js +1 -1
  225. package/dist/server/app-rsc-errors.js.map +1 -1
  226. package/dist/server/app-rsc-handler.d.ts +18 -1
  227. package/dist/server/app-rsc-handler.js +55 -16
  228. package/dist/server/app-rsc-handler.js.map +1 -1
  229. package/dist/server/app-rsc-render-mode.d.ts +11 -0
  230. package/dist/server/app-rsc-render-mode.js +21 -0
  231. package/dist/server/app-rsc-render-mode.js.map +1 -0
  232. package/dist/server/app-rsc-request-normalization.d.ts +4 -1
  233. package/dist/server/app-rsc-request-normalization.js +7 -2
  234. package/dist/server/app-rsc-request-normalization.js.map +1 -1
  235. package/dist/server/app-rsc-response-finalizer.d.ts +2 -1
  236. package/dist/server/app-rsc-response-finalizer.js +6 -1
  237. package/dist/server/app-rsc-response-finalizer.js.map +1 -1
  238. package/dist/server/app-rsc-route-matching.d.ts +23 -0
  239. package/dist/server/app-rsc-route-matching.js +45 -23
  240. package/dist/server/app-rsc-route-matching.js.map +1 -1
  241. package/dist/server/app-segment-config.js.map +1 -1
  242. package/dist/server/app-server-action-execution.d.ts +51 -5
  243. package/dist/server/app-server-action-execution.js +161 -51
  244. package/dist/server/app-server-action-execution.js.map +1 -1
  245. package/dist/server/app-ssr-entry.d.ts +7 -0
  246. package/dist/server/app-ssr-entry.js +44 -14
  247. package/dist/server/app-ssr-entry.js.map +1 -1
  248. package/dist/server/app-ssr-error-meta.d.ts +14 -0
  249. package/dist/server/app-ssr-error-meta.js +50 -0
  250. package/dist/server/app-ssr-error-meta.js.map +1 -0
  251. package/dist/server/app-ssr-stream.d.ts +1 -1
  252. package/dist/server/app-ssr-stream.js +9 -12
  253. package/dist/server/app-ssr-stream.js.map +1 -1
  254. package/dist/server/app-static-generation.js.map +1 -1
  255. package/dist/server/artifact-compatibility.d.ts +12 -2
  256. package/dist/server/artifact-compatibility.js +12 -8
  257. package/dist/server/artifact-compatibility.js.map +1 -1
  258. package/dist/server/cache-control.js +1 -0
  259. package/dist/server/cache-control.js.map +1 -1
  260. package/dist/server/cache-proof.d.ts +124 -5
  261. package/dist/server/cache-proof.js +416 -18
  262. package/dist/server/cache-proof.js.map +1 -1
  263. package/dist/server/csp.js.map +1 -1
  264. package/dist/server/dev-error-overlay-store.js.map +1 -1
  265. package/dist/server/dev-error-overlay.js +5 -0
  266. package/dist/server/dev-error-overlay.js.map +1 -1
  267. package/dist/server/dev-lockfile.d.ts +110 -0
  268. package/dist/server/dev-lockfile.js +180 -0
  269. package/dist/server/dev-lockfile.js.map +1 -0
  270. package/dist/server/dev-module-runner.js.map +1 -1
  271. package/dist/server/dev-origin-check.js.map +1 -1
  272. package/dist/server/dev-route-files.js.map +1 -1
  273. package/dist/server/dev-server.js +23 -10
  274. package/dist/server/dev-server.js.map +1 -1
  275. package/dist/server/file-based-metadata.d.ts +13 -0
  276. package/dist/server/file-based-metadata.js +49 -2
  277. package/dist/server/file-based-metadata.js.map +1 -1
  278. package/dist/server/headers.d.ts +81 -0
  279. package/dist/server/headers.js +104 -0
  280. package/dist/server/headers.js.map +1 -0
  281. package/dist/server/html.js +1 -1
  282. package/dist/server/html.js.map +1 -1
  283. package/dist/server/http-error-responses.d.ts +10 -0
  284. package/dist/server/http-error-responses.js +11 -1
  285. package/dist/server/http-error-responses.js.map +1 -1
  286. package/dist/server/image-optimization.d.ts +11 -1
  287. package/dist/server/image-optimization.js.map +1 -1
  288. package/dist/server/implicit-tags.js +2 -1
  289. package/dist/server/implicit-tags.js.map +1 -1
  290. package/dist/server/instrumentation-runtime.js.map +1 -1
  291. package/dist/server/instrumentation.js.map +1 -1
  292. package/dist/server/isr-cache.d.ts +12 -2
  293. package/dist/server/isr-cache.js +16 -5
  294. package/dist/server/isr-cache.js.map +1 -1
  295. package/dist/server/metadata-route-build-data.js.map +1 -1
  296. package/dist/server/metadata-route-response.js +22 -5
  297. package/dist/server/metadata-route-response.js.map +1 -1
  298. package/dist/server/metadata-routes.js +27 -8
  299. package/dist/server/metadata-routes.js.map +1 -1
  300. package/dist/server/middleware-matcher.js.map +1 -1
  301. package/dist/server/middleware-request-headers.d.ts +4 -1
  302. package/dist/server/middleware-request-headers.js +15 -8
  303. package/dist/server/middleware-request-headers.js.map +1 -1
  304. package/dist/server/middleware-response-headers.d.ts +2 -1
  305. package/dist/server/middleware-response-headers.js +1 -1
  306. package/dist/server/middleware-response-headers.js.map +1 -1
  307. package/dist/server/middleware-runtime.d.ts +1 -0
  308. package/dist/server/middleware-runtime.js +7 -3
  309. package/dist/server/middleware-runtime.js.map +1 -1
  310. package/dist/server/middleware.d.ts +12 -0
  311. package/dist/server/middleware.js +12 -0
  312. package/dist/server/middleware.js.map +1 -1
  313. package/dist/server/navigation-planner.d.ts +133 -0
  314. package/dist/server/navigation-planner.js +432 -0
  315. package/dist/server/navigation-planner.js.map +1 -0
  316. package/dist/server/navigation-trace.d.ts +19 -2
  317. package/dist/server/navigation-trace.js +20 -1
  318. package/dist/server/navigation-trace.js.map +1 -1
  319. package/dist/server/next-error-digest.d.ts +3 -2
  320. package/dist/server/next-error-digest.js +4 -2
  321. package/dist/server/next-error-digest.js.map +1 -1
  322. package/dist/server/normalize-path.d.ts +2 -1
  323. package/dist/server/normalize-path.js +4 -1
  324. package/dist/server/normalize-path.js.map +1 -1
  325. package/dist/server/pages-api-route.js +1 -0
  326. package/dist/server/pages-api-route.js.map +1 -1
  327. package/dist/server/pages-i18n.js.map +1 -1
  328. package/dist/server/pages-media-type.js.map +1 -1
  329. package/dist/server/pages-node-compat.js.map +1 -1
  330. package/dist/server/pages-page-data.d.ts +3 -2
  331. package/dist/server/pages-page-data.js +27 -5
  332. package/dist/server/pages-page-data.js.map +1 -1
  333. package/dist/server/pages-page-response.js +2 -1
  334. package/dist/server/pages-page-response.js.map +1 -1
  335. package/dist/server/prerender-work-unit-setup.js +1 -1
  336. package/dist/server/prerender-work-unit-setup.js.map +1 -1
  337. package/dist/server/prod-server.d.ts +28 -1
  338. package/dist/server/prod-server.js +97 -22
  339. package/dist/server/prod-server.js.map +1 -1
  340. package/dist/server/request-log.js.map +1 -1
  341. package/dist/server/request-pipeline.d.ts +1 -13
  342. package/dist/server/request-pipeline.js +3 -25
  343. package/dist/server/request-pipeline.js.map +1 -1
  344. package/dist/server/rsc-stream-hints.js.map +1 -1
  345. package/dist/server/seed-cache.js.map +1 -1
  346. package/dist/server/server-action-not-found.d.ts +16 -3
  347. package/dist/server/server-action-not-found.js +22 -4
  348. package/dist/server/server-action-not-found.js.map +1 -1
  349. package/dist/server/server-globals.d.ts +5 -0
  350. package/dist/server/server-globals.js +37 -0
  351. package/dist/server/server-globals.js.map +1 -0
  352. package/dist/server/socket-error-backstop.js.map +1 -1
  353. package/dist/server/static-file-cache.js +1 -1
  354. package/dist/server/static-file-cache.js.map +1 -1
  355. package/dist/server/worker-utils.d.ts +0 -7
  356. package/dist/server/worker-utils.js +3 -2
  357. package/dist/server/worker-utils.js.map +1 -1
  358. package/dist/shims/amp.js.map +1 -1
  359. package/dist/shims/app.d.ts +37 -4
  360. package/dist/shims/app.js +50 -1
  361. package/dist/shims/app.js.map +1 -0
  362. package/dist/shims/cache-for-request.js.map +1 -1
  363. package/dist/shims/cache-runtime.d.ts +19 -2
  364. package/dist/shims/cache-runtime.js +87 -19
  365. package/dist/shims/cache-runtime.js.map +1 -1
  366. package/dist/shims/cache.d.ts +20 -21
  367. package/dist/shims/cache.js +101 -15
  368. package/dist/shims/cache.js.map +1 -1
  369. package/dist/shims/client-hook-error.js.map +1 -1
  370. package/dist/shims/compat-router.js.map +1 -1
  371. package/dist/shims/config.js.map +1 -1
  372. package/dist/shims/constants.js.map +1 -1
  373. package/dist/shims/document.js.map +1 -1
  374. package/dist/shims/dynamic.d.ts +18 -10
  375. package/dist/shims/dynamic.js +107 -51
  376. package/dist/shims/dynamic.js.map +1 -1
  377. package/dist/shims/error-boundary.d.ts +35 -6
  378. package/dist/shims/error-boundary.js +116 -33
  379. package/dist/shims/error-boundary.js.map +1 -1
  380. package/dist/shims/error.d.ts +18 -1
  381. package/dist/shims/error.js +56 -1
  382. package/dist/shims/error.js.map +1 -1
  383. package/dist/shims/fetch-cache.d.ts +25 -1
  384. package/dist/shims/fetch-cache.js +159 -13
  385. package/dist/shims/fetch-cache.js.map +1 -1
  386. package/dist/shims/font-google-base.d.ts +22 -8
  387. package/dist/shims/font-google-base.js +41 -71
  388. package/dist/shims/font-google-base.js.map +1 -1
  389. package/dist/shims/font-local.d.ts +3 -20
  390. package/dist/shims/font-local.js +23 -75
  391. package/dist/shims/font-local.js.map +1 -1
  392. package/dist/shims/font-utils.d.ts +51 -0
  393. package/dist/shims/font-utils.js +97 -0
  394. package/dist/shims/font-utils.js.map +1 -0
  395. package/dist/shims/form.js +3 -1
  396. package/dist/shims/form.js.map +1 -1
  397. package/dist/shims/hash-scroll.d.ts +7 -0
  398. package/dist/shims/hash-scroll.js +30 -0
  399. package/dist/shims/hash-scroll.js.map +1 -0
  400. package/dist/shims/head-state.js.map +1 -1
  401. package/dist/shims/head.d.ts +3 -1
  402. package/dist/shims/head.js +28 -16
  403. package/dist/shims/head.js.map +1 -1
  404. package/dist/shims/headers.d.ts +11 -12
  405. package/dist/shims/headers.js +45 -8
  406. package/dist/shims/headers.js.map +1 -1
  407. package/dist/shims/i18n-context.js.map +1 -1
  408. package/dist/shims/i18n-state.js.map +1 -1
  409. package/dist/shims/image-config.d.ts +14 -1
  410. package/dist/shims/image-config.js +24 -1
  411. package/dist/shims/image-config.js.map +1 -1
  412. package/dist/shims/image.d.ts +1 -0
  413. package/dist/shims/image.js +159 -80
  414. package/dist/shims/image.js.map +1 -1
  415. package/dist/shims/internal/als-registry.js.map +1 -1
  416. package/dist/shims/internal/app-router-context.d.ts +7 -6
  417. package/dist/shims/internal/app-router-context.js +17 -6
  418. package/dist/shims/internal/app-router-context.js.map +1 -1
  419. package/dist/shims/internal/cookie-serialize.js.map +1 -1
  420. package/dist/shims/internal/make-hanging-promise.d.ts +1 -1
  421. package/dist/shims/internal/make-hanging-promise.js +1 -1
  422. package/dist/shims/internal/make-hanging-promise.js.map +1 -1
  423. package/dist/shims/internal/parse-cookie-header.js.map +1 -1
  424. package/dist/shims/internal/utils.js.map +1 -1
  425. package/dist/shims/internal/work-unit-async-storage.js +2 -2
  426. package/dist/shims/internal/work-unit-async-storage.js.map +1 -1
  427. package/dist/shims/layout-segment-context.js.map +1 -1
  428. package/dist/shims/legacy-image.js.map +1 -1
  429. package/dist/shims/link-prefetch.d.ts +42 -0
  430. package/dist/shims/link-prefetch.js +45 -0
  431. package/dist/shims/link-prefetch.js.map +1 -0
  432. package/dist/shims/link.d.ts +37 -4
  433. package/dist/shims/link.js +156 -46
  434. package/dist/shims/link.js.map +1 -1
  435. package/dist/shims/metadata.d.ts +16 -30
  436. package/dist/shims/metadata.js +87 -28
  437. package/dist/shims/metadata.js.map +1 -1
  438. package/dist/shims/navigation-state.js.map +1 -1
  439. package/dist/shims/navigation.d.ts +172 -10
  440. package/dist/shims/navigation.js +335 -70
  441. package/dist/shims/navigation.js.map +1 -1
  442. package/dist/shims/navigation.react-server.d.ts +3 -2
  443. package/dist/shims/navigation.react-server.js +5 -2
  444. package/dist/shims/navigation.react-server.js.map +1 -1
  445. package/dist/shims/offline.js.map +1 -1
  446. package/dist/shims/pages-router-runtime.d.ts +7 -0
  447. package/dist/shims/pages-router-runtime.js +16 -0
  448. package/dist/shims/pages-router-runtime.js.map +1 -0
  449. package/dist/shims/readonly-url-search-params.js.map +1 -1
  450. package/dist/shims/request-context.js.map +1 -1
  451. package/dist/shims/root-params.js.map +1 -1
  452. package/dist/shims/router-state.js.map +1 -1
  453. package/dist/shims/router.d.ts +69 -7
  454. package/dist/shims/router.js +232 -249
  455. package/dist/shims/router.js.map +1 -1
  456. package/dist/shims/script-nonce-context.js.map +1 -1
  457. package/dist/shims/script.js +110 -32
  458. package/dist/shims/script.js.map +1 -1
  459. package/dist/shims/server.js +12 -15
  460. package/dist/shims/server.js.map +1 -1
  461. package/dist/shims/slot.d.ts +7 -1
  462. package/dist/shims/slot.js +60 -7
  463. package/dist/shims/slot.js.map +1 -1
  464. package/dist/shims/thenable-params.js.map +1 -1
  465. package/dist/shims/unified-request-context.js +5 -0
  466. package/dist/shims/unified-request-context.js.map +1 -1
  467. package/dist/shims/unrecognized-action-error.d.ts +35 -0
  468. package/dist/shims/unrecognized-action-error.js +41 -0
  469. package/dist/shims/unrecognized-action-error.js.map +1 -0
  470. package/dist/shims/url-safety.js.map +1 -1
  471. package/dist/shims/url-utils.d.ts +22 -1
  472. package/dist/shims/url-utils.js +76 -3
  473. package/dist/shims/url-utils.js.map +1 -1
  474. package/dist/shims/use-merged-ref.js.map +1 -1
  475. package/dist/shims/web-vitals.d.ts +4 -21
  476. package/dist/shims/web-vitals.js +19 -6
  477. package/dist/shims/web-vitals.js.map +1 -1
  478. package/dist/utils/asset-prefix.d.ts +69 -0
  479. package/dist/utils/asset-prefix.js +91 -0
  480. package/dist/utils/asset-prefix.js.map +1 -0
  481. package/dist/utils/base-path.d.ts +7 -1
  482. package/dist/utils/base-path.js +10 -1
  483. package/dist/utils/base-path.js.map +1 -1
  484. package/dist/utils/cache-control-metadata.js.map +1 -1
  485. package/dist/utils/domain-locale.js.map +1 -1
  486. package/dist/utils/encode-cache-tag.d.ts +31 -0
  487. package/dist/utils/encode-cache-tag.js +38 -0
  488. package/dist/utils/encode-cache-tag.js.map +1 -0
  489. package/dist/utils/error-cause.js.map +1 -1
  490. package/dist/utils/hash.js.map +1 -1
  491. package/dist/utils/lazy-chunks.js.map +1 -1
  492. package/dist/utils/manifest-paths.js.map +1 -1
  493. package/dist/utils/mdx-scan.js.map +1 -1
  494. package/dist/utils/navigation-signal.d.ts +5 -0
  495. package/dist/utils/navigation-signal.js +14 -0
  496. package/dist/utils/navigation-signal.js.map +1 -0
  497. package/dist/utils/project.js.map +1 -1
  498. package/dist/utils/public-routes.js.map +1 -1
  499. package/dist/utils/query.js.map +1 -1
  500. package/dist/utils/safe-json-file.js.map +1 -1
  501. package/dist/utils/sorted-array.d.ts +9 -0
  502. package/dist/utils/sorted-array.js +22 -0
  503. package/dist/utils/sorted-array.js.map +1 -0
  504. package/dist/utils/text-stream.js.map +1 -1
  505. package/dist/utils/vinext-root.js.map +1 -1
  506. package/package.json +8 -6
@@ -1,21 +1,31 @@
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
3
  import { DANGEROUS_URL_BLOCK_MESSAGE, isDangerousScheme } from "../shims/url-safety.js";
4
+ import { APP_RSC_RENDER_MODE_REFRESH_PRESERVE_UI } from "./app-rsc-render-mode.js";
5
+ import { installWindowNext } from "../client/window-next.js";
6
+ import { scrollToHashTargetOnNextFrame } from "../shims/hash-scroll.js";
3
7
  import { notifyAppRouterTransitionStart } from "../client/instrumentation-client-state.js";
4
8
  import { AppElementsWire } from "./app-elements-wire.js";
5
9
  import { getMountedSlotIdsHeader, resolveVisitedResponseInterceptionContext } from "./app-elements.js";
6
- import { VINEXT_RSC_MOUNTED_SLOTS_HEADER, createRscRequestHeaders, createRscRequestUrl, stripRscCacheBustingSearchParam, stripRscSuffix } from "./app-rsc-cache-busting.js";
7
- import { __basePath, commitClientNavigationState, consumePrefetchResponse, createClientNavigationRenderSnapshot, getClientNavigationRenderContext, getClientNavigationState, getCurrentInterceptionContext, getCurrentNextUrl, getPrefetchCache, getPrefetchedUrls, pushHistoryStateWithoutNotify, replaceClientParamsWithoutNotify, replaceHistoryStateWithoutNotify, restoreRscResponse, setClientParams, setMountedSlotsHeader, setNavigationContext, setPendingPathname, snapshotRscResponse } from "../shims/navigation.js";
8
- import { DevRecoveryBoundary } from "../shims/error-boundary.js";
10
+ import { createHistoryStateWithNavigationMetadata, createHistoryStateWithPreviousNextUrl, readHistoryStatePreviousNextUrl, readHistoryStateTraversalIndex, resolveHistoryTraversalIntent } from "./app-history-state.js";
11
+ import { VINEXT_RSC_COMPATIBILITY_ID_HEADER, createRscRequestHeaders, createRscRequestUrl, getVinextRscCompatibilityId, resolveHardNavigationTargetFromRscResponse, resolveRscCompatibilityNavigationDecision } from "./app-rsc-cache-busting.js";
12
+ 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";
14
+ import { DevRecoveryBoundary, RedirectBoundary } from "../shims/error-boundary.js";
9
15
  import { ElementsContext, Slot } from "../shims/slot.js";
10
16
  import "../client/instrumentation-client.js";
17
+ import { createDiscardedServerActionRefreshScheduler, createServerActionInitiationSnapshot, isServerActionResult, parseServerActionRevalidationHeader, shouldClearClientNavigationCachesForServerActionResult } from "./app-browser-action-result.js";
11
18
  import { chunksToReadableStream, createProgressiveRscStream, getVinextBrowserGlobal } from "./app-browser-stream.js";
12
- import { createHistoryStateWithPreviousNextUrl, readHistoryStatePreviousNextUrl, resolveInterceptionContextFromPreviousNextUrl, resolveServerActionRequestState } from "./app-browser-state.js";
13
- import { createAppBrowserNavigationController } from "./app-browser-navigation-controller.js";
19
+ import { resolveInterceptionContextFromPreviousNextUrl, resolveServerActionRequestState } from "./app-browser-state.js";
20
+ import { clearHardNavigationLoopGuard, createAppBrowserNavigationController } from "./app-browser-navigation-controller.js";
21
+ import { consumeInitialFormState, createVinextHydrateRootOptions, hydrateRootInTransition } from "./app-browser-hydration.js";
22
+ import { createPopstateRestoreHandler } from "./app-browser-popstate.js";
14
23
  import { createOnUncaughtError } from "./app-browser-error.js";
15
24
  import { dismissOverlay } from "./dev-error-overlay-store.js";
16
25
  import { devOnCaughtError, devOnUncaughtError, installDevErrorOverlay } from "./dev-error-overlay.js";
17
- import { getServerActionNotFoundClientMessage, isServerActionNotFoundResponse } from "./server-action-not-found.js";
18
- import { createElement, use, useLayoutEffect, useRef, useState } from "react";
26
+ import { throwOnServerActionNotFound } from "./server-action-not-found.js";
27
+ import { resolveRscRedirectLifecycleHop } from "./app-browser-rsc-redirect.js";
28
+ import { createElement, startTransition, use, useLayoutEffect, useRef, useState } from "react";
19
29
  import { createFromFetch, createFromReadableStream, createTemporaryReferenceSet, encodeReply, setServerCallback } from "@vitejs/plugin-rsc/browser";
20
30
  import { hydrateRoot } from "react-dom/client";
21
31
  //#region src/server/app-browser-entry.ts
@@ -33,7 +43,20 @@ function toOperationLane(kind) {
33
43
  const MAX_VISITED_RESPONSE_CACHE_SIZE = 50;
34
44
  const VISITED_RESPONSE_CACHE_TTL = 5 * 6e4;
35
45
  const MAX_TRAVERSAL_CACHE_TTL = 30 * 6e4;
36
- const browserNavigationController = createAppBrowserNavigationController();
46
+ const CLIENT_RSC_COMPATIBILITY_ID = getVinextRscCompatibilityId();
47
+ function getBrowserRouteManifest() {
48
+ return window.__VINEXT_ROUTE_MANIFEST__ ?? null;
49
+ }
50
+ const browserNavigationController = createAppBrowserNavigationController({
51
+ getRouteManifest: getBrowserRouteManifest,
52
+ syncHistoryStatePreviousNextUrl: syncCurrentHistoryStatePreviousNextUrl
53
+ });
54
+ const discardedServerActionRefreshScheduler = createDiscardedServerActionRefreshScheduler({ runRefresh() {
55
+ 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);
59
+ } });
37
60
  const NavigationCommitSignal = browserNavigationController.NavigationCommitSignal;
38
61
  function parseEncodedJsonHeader(value) {
39
62
  if (!value) return null;
@@ -50,8 +73,46 @@ let latestClientParams = {};
50
73
  const visitedResponseCache = /* @__PURE__ */ new Map();
51
74
  let browserRouterStateHasEverCommitted = false;
52
75
  let pendingNavigationRecoveryHref = null;
53
- function isServerActionResult(value) {
54
- return !!value && typeof value === "object" && "root" in value;
76
+ let currentHistoryTraversalIndex = readHistoryStateTraversalIndex(window.history.state) ?? 0;
77
+ let nextHistoryTraversalIndex = currentHistoryTraversalIndex;
78
+ function allocateNavigationHistoryTraversalIndex(historyUpdateMode) {
79
+ switch (historyUpdateMode) {
80
+ case "push": return nextHistoryTraversalIndex + 1;
81
+ case "replace": return currentHistoryTraversalIndex;
82
+ case void 0: return null;
83
+ default: throw new Error("[vinext] Unknown history update mode: " + String(historyUpdateMode));
84
+ }
85
+ }
86
+ function commitHistoryTraversalIndex(index) {
87
+ currentHistoryTraversalIndex = index;
88
+ if (index !== null) nextHistoryTraversalIndex = Math.max(nextHistoryTraversalIndex, index);
89
+ }
90
+ function commitHashOnlyNavigation(href, historyUpdateMode, scroll) {
91
+ const navigationHistoryIndex = allocateNavigationHistoryTraversalIndex(historyUpdateMode);
92
+ const previousNextUrl = hasBrowserRouterState() ? getBrowserRouterState().previousNextUrl : readHistoryStatePreviousNextUrl(window.history.state);
93
+ const historyState = createHistoryStateWithNavigationMetadata(createHashOnlyNavigationBaseHistoryState(historyUpdateMode, scroll), {
94
+ previousNextUrl,
95
+ traversalIndex: navigationHistoryIndex
96
+ });
97
+ if (historyUpdateMode === "replace") replaceHistoryStateWithoutNotify(historyState, "", href);
98
+ else pushHistoryStateWithoutNotify(historyState, "", href);
99
+ commitHistoryTraversalIndex(navigationHistoryIndex);
100
+ }
101
+ function createHashOnlyNavigationBaseHistoryState(historyUpdateMode, scroll) {
102
+ if (historyUpdateMode !== "replace") return null;
103
+ return scroll ? stripVinextScrollState(window.history.state) : window.history.state;
104
+ }
105
+ function stripVinextScrollState(state) {
106
+ if (!state || typeof state !== "object") return state;
107
+ const nextState = {};
108
+ for (const [key, value] of Object.entries(state)) {
109
+ if (key === "__vinext_scrollX" || key === "__vinext_scrollY") continue;
110
+ nextState[key] = value;
111
+ }
112
+ return Object.keys(nextState).length > 0 ? nextState : null;
113
+ }
114
+ function commitTraversalIndexFromHistoryState(historyState) {
115
+ commitHistoryTraversalIndex(readHistoryStateTraversalIndex(historyState));
55
116
  }
56
117
  function getBrowserRouterState() {
57
118
  return browserNavigationController.getBrowserRouterState();
@@ -77,30 +138,63 @@ function clearVisitedResponseCache() {
77
138
  visitedResponseCache.clear();
78
139
  }
79
140
  function clearPrefetchState() {
80
- getPrefetchCache().clear();
81
- getPrefetchedUrls().clear();
141
+ invalidatePrefetchCache();
82
142
  }
83
143
  function clearClientNavigationCaches() {
84
144
  clearVisitedResponseCache();
85
145
  clearPrefetchState();
86
146
  }
147
+ function syncCurrentHistoryStatePreviousNextUrl(previousNextUrl) {
148
+ if (readHistoryStatePreviousNextUrl(window.history.state) === previousNextUrl) return;
149
+ const nextHistoryState = createHistoryStateWithPreviousNextUrl(window.history.state, previousNextUrl);
150
+ replaceHistoryStateWithoutNotify(nextHistoryState, "", window.location.href);
151
+ if (readHistoryStatePreviousNextUrl(window.history.state) === previousNextUrl) return;
152
+ window.history.replaceState(nextHistoryState, "", window.location.href);
153
+ }
154
+ function createActionInitiationSnapshot() {
155
+ const routerState = getBrowserRouterState();
156
+ return createServerActionInitiationSnapshot({
157
+ href: window.location.href,
158
+ navigationId: browserNavigationController.getActiveNavigationId(),
159
+ routerState
160
+ });
161
+ }
87
162
  function createNavigationCommitEffect(options) {
88
- const { href, historyUpdateMode, navId, params, previousNextUrl } = options;
163
+ const { href, historyUpdateMode, navId, params, previousNextUrl, targetHistoryIndex } = options;
89
164
  return () => {
90
165
  if (!browserNavigationController.isCurrentNavigation(navId)) {
91
166
  commitClientNavigationState(void 0, { releaseSnapshot: true });
92
167
  return;
93
168
  }
94
169
  const targetHref = new URL(href, window.location.origin).href;
95
- stageClientParams(params);
96
- const historyState = createHistoryStateWithPreviousNextUrl(historyUpdateMode === "replace" ? window.history.state : null, previousNextUrl);
97
- if (historyUpdateMode === "replace" && window.location.href !== targetHref) replaceHistoryStateWithoutNotify(historyState, "", href);
98
- else if (historyUpdateMode === "push" && window.location.href !== targetHref) pushHistoryStateWithoutNotify(historyState, "", href);
170
+ const preserveExistingState = historyUpdateMode === "replace";
171
+ const navigationHistoryIndex = targetHistoryIndex !== void 0 ? targetHistoryIndex : allocateNavigationHistoryTraversalIndex(historyUpdateMode);
172
+ const historyState = createHistoryStateWithNavigationMetadata(preserveExistingState ? window.history.state : null, {
173
+ previousNextUrl,
174
+ traversalIndex: navigationHistoryIndex
175
+ });
176
+ let wroteHistoryState = false;
177
+ if (historyUpdateMode === "replace" && window.location.href !== targetHref) {
178
+ stageClientParams(params);
179
+ replaceHistoryStateWithoutNotify(historyState, "", href);
180
+ wroteHistoryState = true;
181
+ commitHistoryTraversalIndex(navigationHistoryIndex);
182
+ } else if (historyUpdateMode === "push" && window.location.href !== targetHref) {
183
+ stageClientParams(params);
184
+ pushHistoryStateWithoutNotify(historyState, "", href);
185
+ wroteHistoryState = true;
186
+ commitHistoryTraversalIndex(navigationHistoryIndex);
187
+ }
188
+ if (!wroteHistoryState) {
189
+ syncCurrentHistoryStatePreviousNextUrl(previousNextUrl);
190
+ stageClientParams(params);
191
+ if (targetHistoryIndex !== void 0) commitHistoryTraversalIndex(targetHistoryIndex);
192
+ }
99
193
  pendingNavigationRecoveryHref = null;
100
194
  commitClientNavigationState(navId);
101
195
  };
102
196
  }
103
- async function renderNavigationPayload(payload, navigationSnapshot, targetHref, navId, historyUpdateMode, params, previousNextUrl, pendingRouterState, useTransition = true, actionType = "navigate", operationLane = "navigation") {
197
+ async function renderNavigationPayload(payload, navigationSnapshot, targetHref, navId, historyUpdateMode, params, previousNextUrl, pendingRouterState, actionType = "navigate", operationLane = "navigation", traversalIntent = null) {
104
198
  try {
105
199
  return await browserNavigationController.renderNavigationPayload({
106
200
  actionType,
@@ -115,18 +209,25 @@ async function renderNavigationPayload(payload, navigationSnapshot, targetHref,
115
209
  params,
116
210
  pendingRouterState,
117
211
  previousNextUrl,
212
+ targetHistoryIndex: traversalIntent === null ? void 0 : traversalIntent.targetHistoryIndex,
118
213
  targetHref,
119
- navId,
120
- useTransition
214
+ navId
121
215
  });
122
216
  } catch (error) {
123
217
  pendingNavigationRecoveryHref = null;
124
218
  throw error;
125
219
  }
126
220
  }
127
- async function commitSameUrlNavigatePayload(nextElements, returnValue, actionInitiationState) {
128
- const navigationSnapshot = createClientNavigationRenderSnapshot(window.location.href, latestClientParams);
129
- return browserNavigationController.commitSameUrlNavigatePayload(nextElements, navigationSnapshot, returnValue, actionInitiationState);
221
+ async function commitSameUrlNavigatePayload(nextElements, actionInitiation, returnValue, revalidation = "none") {
222
+ const navigationSnapshot = createClientNavigationRenderSnapshot(actionInitiation.href, actionInitiation.routerState.navigationSnapshot.params);
223
+ return browserNavigationController.commitSameUrlNavigatePayload(nextElements, navigationSnapshot, returnValue, actionInitiation.routerState, {
224
+ onDiscardedRevalidation() {
225
+ discardedServerActionRefreshScheduler.schedule();
226
+ },
227
+ revalidation,
228
+ startedNavigationId: actionInitiation.navigationId,
229
+ targetHref: actionInitiation.href
230
+ });
130
231
  }
131
232
  function evictVisitedResponseCacheIfNeeded() {
132
233
  while (visitedResponseCache.size >= MAX_VISITED_RESPONSE_CACHE_SIZE) {
@@ -173,18 +274,25 @@ function storeVisitedResponseSnapshot(rscUrl, interceptionContext, snapshot, par
173
274
  response: snapshot
174
275
  });
175
276
  }
176
- function getRequestState(navigationKind, previousNextUrlOverride) {
277
+ function getRequestState(navigationKind, previousNextUrlOverride, traverseHistoryState) {
177
278
  if (previousNextUrlOverride !== void 0) return {
178
279
  interceptionContext: resolveInterceptionContextFromPreviousNextUrl(previousNextUrlOverride, __basePath),
179
280
  previousNextUrl: previousNextUrlOverride
180
281
  };
181
282
  switch (navigationKind) {
182
- case "navigate": return {
183
- interceptionContext: getCurrentInterceptionContext(),
184
- previousNextUrl: getCurrentNextUrl()
185
- };
283
+ case "navigate": {
284
+ const currentPreviousNextUrl = getBrowserRouterState().previousNextUrl;
285
+ if (currentPreviousNextUrl !== null) return {
286
+ interceptionContext: resolveInterceptionContextFromPreviousNextUrl(currentPreviousNextUrl, __basePath),
287
+ previousNextUrl: currentPreviousNextUrl
288
+ };
289
+ return {
290
+ interceptionContext: getCurrentInterceptionContext(),
291
+ previousNextUrl: getCurrentNextUrl()
292
+ };
293
+ }
186
294
  case "traverse": {
187
- const previousNextUrl = readHistoryStatePreviousNextUrl(window.history.state);
295
+ const previousNextUrl = readHistoryStatePreviousNextUrl(traverseHistoryState ?? window.history.state);
188
296
  return {
189
297
  interceptionContext: resolveInterceptionContextFromPreviousNextUrl(previousNextUrl, __basePath),
190
298
  previousNextUrl
@@ -212,13 +320,16 @@ function BrowserRoot({ initialElements, initialNavigationSnapshot }) {
212
320
  const [treeStateValue, setTreeStateValue] = useState({
213
321
  activeOperation: null,
214
322
  elements: resolvedElements,
323
+ interception: initialMetadata.interception,
215
324
  interceptionContext: initialMetadata.interceptionContext,
325
+ layoutIds: initialMetadata.layoutIds,
216
326
  layoutFlags: initialMetadata.layoutFlags,
217
327
  navigationSnapshot: initialNavigationSnapshot,
218
328
  previousNextUrl: null,
219
329
  renderId: 0,
220
330
  rootLayoutTreePath: initialMetadata.rootLayoutTreePath,
221
331
  routeId: initialMetadata.routeId,
332
+ slotBindings: initialMetadata.slotBindings,
222
333
  visibleCommitVersion: 0
223
334
  });
224
335
  const treeState = isRouterStatePromise(treeStateValue) ? use(treeStateValue) : treeStateValue;
@@ -227,6 +338,7 @@ function BrowserRoot({ initialElements, initialNavigationSnapshot }) {
227
338
  useLayoutEffect(() => {
228
339
  const detach = browserNavigationController.attachBrowserRouterState(setTreeStateValue, stateRef);
229
340
  browserRouterStateHasEverCommitted = true;
341
+ window.__VINEXT_HYDRATED_AT = performance.now();
230
342
  return () => {
231
343
  detach();
232
344
  setMountedSlotsHeader(null);
@@ -234,12 +346,17 @@ function BrowserRoot({ initialElements, initialNavigationSnapshot }) {
234
346
  }, [setTreeStateValue]);
235
347
  useLayoutEffect(() => {
236
348
  setMountedSlotsHeader(getMountedSlotIdsHeader(stateRef.current.elements));
349
+ window.__VINEXT_PING_VISIBLE_LINKS__?.();
237
350
  }, [treeState.elements]);
238
351
  useLayoutEffect(() => {
239
352
  if (treeState.renderId !== 0) return;
240
- replaceHistoryStateWithoutNotify(createHistoryStateWithPreviousNextUrl(window.history.state, treeState.previousNextUrl), "", window.location.href);
353
+ replaceHistoryStateWithoutNotify(createHistoryStateWithNavigationMetadata(window.history.state, {
354
+ previousNextUrl: treeState.previousNextUrl,
355
+ traversalIndex: currentHistoryTraversalIndex
356
+ }), "", window.location.href);
241
357
  }, [treeState.previousNextUrl, treeState.renderId]);
242
- const innerTree = createElement(NavigationCommitSignal, { renderId: treeState.renderId }, createElement(ElementsContext.Provider, { value: treeState.elements }, createElement(Slot, { id: treeState.routeId })));
358
+ const routeTree = createElement(RedirectBoundary, null, createElement(NavigationCommitSignal, { renderId: treeState.renderId }, createElement(ElementsContext.Provider, { value: treeState.elements }, createElement(Slot, { id: treeState.routeId }))));
359
+ const innerTree = AppRouterContext ? createElement(AppRouterContext.Provider, { value: appRouterInstance }, routeTree) : routeTree;
243
360
  const committedTree = import.meta.env.DEV ? createElement(DevRecoveryBoundary, {
244
361
  resetKey: treeState.renderId,
245
362
  onCatch: handleDevRecoveryBoundaryCatch
@@ -255,31 +372,9 @@ function restoreHydrationNavigationContext(pathname, searchParams, params) {
255
372
  params
256
373
  });
257
374
  }
258
- function decodeHashFragment(fragment) {
259
- try {
260
- return decodeURIComponent(fragment);
261
- } catch {
262
- return fragment;
263
- }
264
- }
265
- function scrollToHashTarget(hash) {
266
- const fragment = decodeHashFragment(hash.startsWith("#") ? hash.slice(1) : hash);
267
- requestAnimationFrame(() => {
268
- if (fragment === "" || fragment === "top") {
269
- window.scrollTo(0, 0);
270
- return;
271
- }
272
- const idElement = document.getElementById(fragment);
273
- if (idElement) {
274
- idElement.scrollIntoView({ behavior: "auto" });
275
- return;
276
- }
277
- document.getElementsByName(fragment)[0]?.scrollIntoView({ behavior: "auto" });
278
- });
279
- }
280
375
  function restorePopstateScrollPosition(state) {
281
376
  if (!(state && typeof state === "object" && "__vinext_scrollY" in state)) {
282
- if (window.location.hash) scrollToHashTarget(window.location.hash);
377
+ if (window.location.hash) scrollToHashTargetOnNextFrame(window.location.hash);
283
378
  return;
284
379
  }
285
380
  const y = Number(state.__vinext_scrollY);
@@ -288,6 +383,15 @@ function restorePopstateScrollPosition(state) {
288
383
  window.scrollTo(x, y);
289
384
  });
290
385
  }
386
+ function isSameAppRoutePopstateTarget(href) {
387
+ if (!hasBrowserRouterState()) return false;
388
+ const target = new URL(href, window.location.origin);
389
+ const routerState = getBrowserRouterState();
390
+ const targetPathname = stripBasePath(target.pathname, __basePath);
391
+ const targetSearch = new URLSearchParams(target.search).toString();
392
+ const currentSearch = routerState.navigationSnapshot.searchParams.toString();
393
+ return targetPathname === routerState.navigationSnapshot.pathname && targetSearch === currentSearch;
394
+ }
291
395
  let isPageUnloading = false;
292
396
  const RSC_RELOAD_KEY = "__vinext_rsc_initial_reload__";
293
397
  function readReloadFlag() {
@@ -327,6 +431,7 @@ async function readInitialRscStream() {
327
431
  const vinext = getVinextBrowserGlobal();
328
432
  if (vinext.__VINEXT_RSC__ || vinext.__VINEXT_RSC_CHUNKS__ || vinext.__VINEXT_RSC_DONE__) {
329
433
  clearReloadFlag();
434
+ clearHardNavigationLoopGuard();
330
435
  if (vinext.__VINEXT_RSC__) {
331
436
  const embedData = vinext.__VINEXT_RSC__;
332
437
  delete vinext.__VINEXT_RSC__;
@@ -350,7 +455,8 @@ async function readInitialRscStream() {
350
455
  if (!contentType.startsWith("text/x-component")) return recoverFromBadInitialRscResponse(`returned non-RSC content-type "${contentType || "(missing)"}"`);
351
456
  if (!rscResponse.body) return recoverFromBadInitialRscResponse("returned empty body");
352
457
  clearReloadFlag();
353
- const parsedParams = parseEncodedJsonHeader(rscResponse.headers.get("X-Vinext-Params"));
458
+ clearHardNavigationLoopGuard();
459
+ const parsedParams = parseEncodedJsonHeader(rscResponse.headers.get(VINEXT_PARAMS_HEADER));
354
460
  const params = parsedParams ?? {};
355
461
  if (parsedParams) try {
356
462
  applyClientParams(parsedParams);
@@ -361,21 +467,22 @@ async function readInitialRscStream() {
361
467
  function registerServerActionCallback() {
362
468
  setServerCallback(async (id, args) => {
363
469
  const temporaryReferences = createTemporaryReferenceSet();
470
+ const actionInitiation = createActionInitiationSnapshot();
471
+ syncCurrentHistoryStatePreviousNextUrl(actionInitiation.routerState.previousNextUrl);
364
472
  const body = await encodeReply(args, { temporaryReferences });
365
- const currentState = getBrowserRouterState();
366
473
  const { headers } = resolveServerActionRequestState({
367
474
  actionId: id,
368
475
  basePath: __basePath,
369
- elements: currentState.elements,
370
- previousNextUrl: currentState.previousNextUrl
476
+ elements: actionInitiation.routerState.elements,
477
+ previousNextUrl: actionInitiation.routerState.previousNextUrl
371
478
  });
372
- const fetchResponse = await fetch(await createRscRequestUrl(window.location.pathname + window.location.search, headers), {
479
+ const fetchResponse = await fetch(await createRscRequestUrl(actionInitiation.path, headers), {
373
480
  method: "POST",
374
481
  headers,
375
482
  body
376
483
  });
377
- if (isServerActionNotFoundResponse(fetchResponse)) throw new Error(getServerActionNotFoundClientMessage(id));
378
- const actionRedirect = fetchResponse.headers.get("x-action-redirect");
484
+ throwOnServerActionNotFound(fetchResponse, id);
485
+ const actionRedirect = fetchResponse.headers.get(ACTION_REDIRECT_HEADER);
379
486
  if (actionRedirect) {
380
487
  if (isDangerousScheme(actionRedirect)) {
381
488
  console.error(DANGEROUS_URL_BLOCK_MESSAGE);
@@ -387,14 +494,33 @@ function registerServerActionCallback() {
387
494
  return;
388
495
  }
389
496
  } catch {}
497
+ clearClientNavigationCaches();
390
498
  if ((fetchResponse.headers.get("x-action-redirect-type") ?? "replace") === "push") window.location.assign(actionRedirect);
391
499
  else window.location.replace(actionRedirect);
392
500
  return;
393
501
  }
394
- clearClientNavigationCaches();
502
+ if (resolveRscCompatibilityNavigationDecision({
503
+ clientCompatibilityId: CLIENT_RSC_COMPATIBILITY_ID,
504
+ currentHref: actionInitiation.href,
505
+ origin: window.location.origin,
506
+ responseCompatibilityId: fetchResponse.headers.get("X-Vinext-RSC-Compatibility-Id"),
507
+ responseUrl: fetchResponse.url
508
+ }).kind === "hard-navigate") {
509
+ window.location.reload();
510
+ return;
511
+ }
512
+ const revalidation = parseServerActionRevalidationHeader(fetchResponse.headers);
395
513
  const result = await createFromFetch(Promise.resolve(fetchResponse), { temporaryReferences });
396
- if (isServerActionResult(result)) return commitSameUrlNavigatePayload(Promise.resolve(AppElementsWire.decode(result.root)), result.returnValue, currentState);
397
- return commitSameUrlNavigatePayload(Promise.resolve(AppElementsWire.decode(result)), void 0, currentState);
514
+ if (shouldClearClientNavigationCachesForServerActionResult(result, revalidation)) clearClientNavigationCaches();
515
+ if (isServerActionResult(result)) {
516
+ if (result.root !== void 0) return commitSameUrlNavigatePayload(Promise.resolve(AppElementsWire.decode(result.root)), actionInitiation, result.returnValue, revalidation);
517
+ if (result.returnValue) {
518
+ if (!result.returnValue.ok) throw result.returnValue.data;
519
+ return result.returnValue.data;
520
+ }
521
+ return;
522
+ }
523
+ return commitSameUrlNavigatePayload(Promise.resolve(AppElementsWire.decode(result)), actionInitiation, void 0, revalidation);
398
524
  });
399
525
  }
400
526
  async function main() {
@@ -407,57 +533,86 @@ function bootstrapHydration(rscStream) {
407
533
  if (import.meta.env.DEV) installDevErrorOverlay();
408
534
  const root = decodeAppElementsPromise(createFromReadableStream(rscStream));
409
535
  const initialNavigationSnapshot = createClientNavigationRenderSnapshot(window.location.href, latestClientParams);
410
- replaceHistoryStateWithoutNotify(createHistoryStateWithPreviousNextUrl(window.history.state, null), "", window.location.href);
536
+ replaceHistoryStateWithoutNotify(createHistoryStateWithNavigationMetadata(window.history.state, {
537
+ previousNextUrl: null,
538
+ traversalIndex: currentHistoryTraversalIndex
539
+ }), "", window.location.href);
411
540
  const onUncaughtError = import.meta.env.DEV ? devOnUncaughtError : createOnUncaughtError(() => pendingNavigationRecoveryHref);
412
- window.__VINEXT_RSC_ROOT__ = hydrateRoot(document, createElement(BrowserRoot, {
413
- initialElements: root,
414
- initialNavigationSnapshot
415
- }), import.meta.env.DEV ? {
541
+ const formState = consumeInitialFormState(getVinextBrowserGlobal());
542
+ const hydrateRootOptions = import.meta.env.DEV ? createVinextHydrateRootOptions({
543
+ formState,
416
544
  onCaughtError: devOnCaughtError,
417
545
  onUncaughtError
418
- } : { onUncaughtError });
419
- window.__VINEXT_HYDRATED_AT = performance.now();
420
- window.__VINEXT_RSC_NAVIGATE__ = async function navigateRsc(href, redirectDepth = 0, navigationKind = "navigate", historyUpdateMode, previousNextUrlOverride, programmaticTransition = false) {
546
+ }) : createVinextHydrateRootOptions({
547
+ formState,
548
+ onUncaughtError
549
+ });
550
+ window.__VINEXT_RSC_ROOT__ = hydrateRootInTransition({
551
+ children: createElement(BrowserRoot, {
552
+ initialElements: root,
553
+ initialNavigationSnapshot
554
+ }),
555
+ container: document,
556
+ hydrateRoot,
557
+ options: hydrateRootOptions,
558
+ startTransition
559
+ });
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) {
421
563
  let pendingRouterState = null;
422
564
  const navId = browserNavigationController.beginNavigation();
565
+ discardedServerActionRefreshScheduler.markNavigationStart();
423
566
  let currentHref = href;
424
567
  let currentHistoryMode = historyUpdateMode;
425
568
  let currentPrevNextUrl = previousNextUrlOverride;
426
569
  let redirectCount = redirectDepth;
570
+ const activeTraversalIntent = navigationKind === "traverse" ? traversalIntent ?? resolveHistoryTraversalIntent({
571
+ currentHistoryIndex: currentHistoryTraversalIndex,
572
+ historyState: window.history.state
573
+ }) : null;
427
574
  try {
428
- if (programmaticTransition && hasBrowserRouterState()) pendingRouterState = beginPendingBrowserRouterState();
575
+ const shouldUsePendingRouterState = programmaticTransition;
576
+ if (shouldUsePendingRouterState && hasBrowserRouterState()) pendingRouterState = beginPendingBrowserRouterState();
429
577
  else {
430
578
  await waitForBrowserRouterStateReady();
431
579
  if (!browserNavigationController.isCurrentNavigation(navId)) return;
432
- if (programmaticTransition) pendingRouterState = beginPendingBrowserRouterState();
580
+ if (shouldUsePendingRouterState) pendingRouterState = beginPendingBrowserRouterState();
433
581
  }
434
582
  while (true) {
435
- if (redirectCount > 10) {
436
- console.error("[vinext] Too many RSC redirects — aborting navigation to prevent infinite loop.");
437
- window.location.href = currentHref;
438
- return;
439
- }
440
583
  const url = new URL(currentHref, window.location.origin);
441
- const requestState = getRequestState(navigationKind, currentPrevNextUrl);
584
+ const requestState = getRequestState(navigationKind, currentPrevNextUrl, activeTraversalIntent?.historyState);
442
585
  const requestInterceptionContext = requestState.interceptionContext;
443
586
  const requestPreviousNextUrl = requestState.previousNextUrl;
444
- const navState = getClientNavigationState();
445
- const currentPath = navState?.pendingPathname ?? navState?.cachedPathname ?? stripBasePath(window.location.pathname, __basePath);
446
- const isSameRoute = stripBasePath(url.pathname, __basePath) === currentPath;
587
+ if (navigationKind === "refresh") syncCurrentHistoryStatePreviousNextUrl(requestPreviousNextUrl);
447
588
  setPendingPathname(url.pathname, navId);
448
589
  const elementsAtNavStart = getBrowserRouterState().elements;
449
590
  const mountedSlotsHeader = getMountedSlotIdsHeader(elementsAtNavStart);
450
- const requestHeaders = createRscRequestHeaders({ interceptionContext: requestInterceptionContext });
451
- if (mountedSlotsHeader) requestHeaders.set(VINEXT_RSC_MOUNTED_SLOTS_HEADER, mountedSlotsHeader);
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);
452
596
  const rscUrl = await createRscRequestUrl(url.pathname + url.search, requestHeaders);
453
597
  const cachedRoute = getVisitedResponse(rscUrl, requestInterceptionContext, mountedSlotsHeader, navigationKind);
454
598
  if (cachedRoute) {
599
+ const compatibilityDecision = resolveRscCompatibilityNavigationDecision({
600
+ clientCompatibilityId: CLIENT_RSC_COMPATIBILITY_ID,
601
+ currentHref,
602
+ origin: window.location.origin,
603
+ responseCompatibilityId: cachedRoute.response.compatibilityIdHeader,
604
+ responseUrl: cachedRoute.response.url
605
+ });
606
+ if (compatibilityDecision.kind === "hard-navigate") {
607
+ window.location.href = compatibilityDecision.hardNavigationTarget;
608
+ return;
609
+ }
455
610
  if (!browserNavigationController.isCurrentNavigation(navId)) return;
456
611
  const cachedParams = cachedRoute.params;
457
612
  const cachedNavigationSnapshot = createClientNavigationRenderSnapshot(currentHref, cachedParams);
458
613
  const cachedPayload = decodeAppElementsPromise(createFromFetch(Promise.resolve(restoreRscResponse(cachedRoute.response))));
459
614
  if (!browserNavigationController.isCurrentNavigation(navId)) return;
460
- await renderNavigationPayload(cachedPayload, cachedNavigationSnapshot, currentHref, navId, currentHistoryMode, cachedParams, requestPreviousNextUrl, pendingRouterState, isSameRoute, toActionType(navigationKind), toOperationLane(navigationKind));
615
+ await renderNavigationPayload(cachedPayload, cachedNavigationSnapshot, currentHref, navId, currentHistoryMode, cachedParams, requestPreviousNextUrl, pendingRouterState, toActionType(navigationKind), toOperationLane(navigationKind), activeTraversalIntent);
461
616
  return;
462
617
  }
463
618
  let navResponse;
@@ -477,41 +632,59 @@ function bootstrapHydration(rscStream) {
477
632
  const isRscResponse = (navResponse.headers.get("content-type") ?? "").startsWith("text/x-component");
478
633
  if (!navResponse.ok || !isRscResponse || !navResponse.body) {
479
634
  const responseUrl = navResponseUrl ?? navResponse.url;
480
- let hardNavTarget = currentHref;
481
- if (responseUrl) {
482
- const parsed = new URL(responseUrl, window.location.origin);
483
- stripRscCacheBustingSearchParam(parsed);
484
- const origUrl = new URL(currentHref, window.location.origin);
485
- let pathname = stripRscSuffix(parsed.pathname);
486
- if (origUrl.pathname.length > 1 && origUrl.pathname.endsWith("/") && !pathname.endsWith("/")) pathname += "/";
487
- hardNavTarget = pathname + parsed.search;
488
- if (origUrl.hash) hardNavTarget += origUrl.hash;
489
- }
490
- window.location.href = hardNavTarget;
635
+ window.location.href = resolveHardNavigationTargetFromRscResponse(responseUrl, currentHref, window.location.origin);
491
636
  return;
492
637
  }
493
- const finalUrl = new URL(navResponseUrl ?? navResponse.url, window.location.origin);
494
- stripRscCacheBustingSearchParam(finalUrl);
495
- const requestedUrl = new URL(rscUrl, window.location.origin);
496
- if (finalUrl.pathname !== requestedUrl.pathname) {
497
- const destinationPath = stripRscSuffix(finalUrl.pathname) + finalUrl.search;
498
- replaceHistoryStateWithoutNotify(createHistoryStateWithPreviousNextUrl(null, requestPreviousNextUrl), "", destinationPath);
499
- currentHref = destinationPath;
500
- currentHistoryMode = void 0;
501
- currentPrevNextUrl = requestPreviousNextUrl;
502
- redirectCount += 1;
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;
660
+ return;
661
+ }
662
+ if (redirectDecision.kind === "follow") {
663
+ currentHref = redirectDecision.href;
664
+ currentHistoryMode = redirectDecision.historyUpdateMode;
665
+ currentPrevNextUrl = redirectDecision.previousNextUrl;
666
+ redirectCount = redirectDecision.redirectDepth;
503
667
  continue;
504
668
  }
505
669
  const navParams = parseEncodedJsonHeader(navResponse.headers.get("X-Vinext-Params")) ?? {};
506
670
  const navigationSnapshot = createClientNavigationRenderSnapshot(currentHref, navParams);
507
- const responseSnapshot = await snapshotRscResponse(navResponse);
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();
508
679
  if (!browserNavigationController.isCurrentNavigation(navId)) return;
509
- const rscPayload = decodeAppElementsPromise(createFromFetch(Promise.resolve(restoreRscResponse(responseSnapshot))));
680
+ const rscPayload = decodeAppElementsPromise(createFromFetch(Promise.resolve(reactResponse)));
510
681
  if (!browserNavigationController.isCurrentNavigation(navId)) return;
511
- if (await renderNavigationPayload(rscPayload, navigationSnapshot, currentHref, navId, currentHistoryMode, navParams, requestPreviousNextUrl, pendingRouterState, isSameRoute, toActionType(navigationKind), toOperationLane(navigationKind)) !== "committed") return;
682
+ if (await renderNavigationPayload(rscPayload, navigationSnapshot, currentHref, navId, currentHistoryMode, navParams, requestPreviousNextUrl, pendingRouterState, toActionType(navigationKind), toOperationLane(navigationKind), activeTraversalIntent) !== "committed") return;
512
683
  if (!browserNavigationController.isCurrentNavigation(navId)) return;
513
684
  const resolvedElements = await rscPayload;
514
- storeVisitedResponseSnapshot(rscUrl, resolveVisitedResponseInterceptionContext(requestInterceptionContext, AppElementsWire.readMetadata(resolvedElements).interceptionContext), responseSnapshot, navParams);
685
+ const metadata = AppElementsWire.readMetadata(resolvedElements);
686
+ const cacheBuffer = await cacheBufferPromise;
687
+ storeVisitedResponseSnapshot(rscUrl, resolveVisitedResponseInterceptionContext(requestInterceptionContext, metadata.interceptionContext), createCachedRscResponseSnapshot(navResponse, cacheBuffer, navResponseUrl), navParams);
515
688
  return;
516
689
  }
517
690
  } catch (error) {
@@ -520,37 +693,61 @@ function bootstrapHydration(rscStream) {
520
693
  window.location.href = currentHref;
521
694
  } finally {
522
695
  browserNavigationController.finalizeNavigation(navId, pendingRouterState);
696
+ discardedServerActionRefreshScheduler.markNavigationSettled();
523
697
  }
524
698
  };
525
699
  if ("scrollRestoration" in history) history.scrollRestoration = "manual";
700
+ const handlePopstate = createPopstateRestoreHandler({
701
+ getActiveNavigationId: browserNavigationController.getActiveNavigationId.bind(browserNavigationController),
702
+ getPendingNavigation: () => window.__VINEXT_RSC_PENDING__,
703
+ getNavigate: () => window.__VINEXT_RSC_NAVIGATE__,
704
+ isCurrentNavigation: browserNavigationController.isCurrentNavigation.bind(browserNavigationController),
705
+ notifyAppRouterTransitionStart: (href) => {
706
+ notifyAppRouterTransitionStart(href, "traverse");
707
+ },
708
+ restorePopstateScrollPosition,
709
+ setPendingNavigation: (pendingNavigation) => {
710
+ window.__VINEXT_RSC_PENDING__ = pendingNavigation;
711
+ }
712
+ });
526
713
  window.addEventListener("popstate", (event) => {
527
- notifyAppRouterTransitionStart(window.location.href, "traverse");
528
- const pendingNavigation = window.__VINEXT_RSC_NAVIGATE__?.(window.location.href, 0, "traverse") ?? Promise.resolve();
529
- window.__VINEXT_RSC_PENDING__ = pendingNavigation;
530
- pendingNavigation.finally(() => {
714
+ const href = window.location.href;
715
+ if (isSameAppRoutePopstateTarget(href)) {
716
+ notifyAppRouterTransitionStart(href, "traverse");
717
+ commitTraversalIndexFromHistoryState(event.state);
531
718
  restorePopstateScrollPosition(event.state);
532
- if (window.__VINEXT_RSC_PENDING__ === pendingNavigation) window.__VINEXT_RSC_PENDING__ = null;
533
- });
534
- });
535
- if (import.meta.hot) import.meta.hot.on("rsc:update", async () => {
536
- try {
537
- if (browserRouterStateHasEverCommitted && !browserNavigationController.hasBrowserRouterState()) {
538
- window.location.reload();
539
- return;
540
- }
541
- await waitForBrowserRouterStateReady();
542
- if (!browserNavigationController.hasBrowserRouterState()) return;
543
- clearClientNavigationCaches();
544
- const navigationSnapshot = createClientNavigationRenderSnapshot(window.location.href, latestClientParams);
545
- dismissOverlay();
546
- const hmrHeaders = createRscRequestHeaders();
547
- await browserNavigationController.hmrReplaceTree(decodeAppElementsPromise(createFromFetch(fetch(await createRscRequestUrl(window.location.pathname + window.location.search, hmrHeaders), { headers: hmrHeaders }))), navigationSnapshot);
548
- } catch (error) {
549
- console.error("[vinext] RSC HMR error:", error);
719
+ return;
550
720
  }
721
+ handlePopstate(event);
551
722
  });
723
+ if (import.meta.hot) {
724
+ const handleRscUpdate = async () => {
725
+ try {
726
+ if (browserRouterStateHasEverCommitted && !browserNavigationController.hasBrowserRouterState()) {
727
+ window.location.reload();
728
+ return;
729
+ }
730
+ await waitForBrowserRouterStateReady();
731
+ if (!browserNavigationController.hasBrowserRouterState()) return;
732
+ clearClientNavigationCaches();
733
+ const navigationSnapshot = createClientNavigationRenderSnapshot(window.location.href, latestClientParams);
734
+ dismissOverlay();
735
+ const hmrHeaders = createRscRequestHeaders();
736
+ await browserNavigationController.hmrReplaceTree(decodeAppElementsPromise(createFromFetch(fetch(await createRscRequestUrl(window.location.pathname + window.location.search, hmrHeaders), { headers: hmrHeaders }))), navigationSnapshot);
737
+ } catch (error) {
738
+ console.error("[vinext] RSC HMR error:", error);
739
+ }
740
+ };
741
+ import.meta.hot.on("rsc:update", () => {
742
+ handleRscUpdate();
743
+ });
744
+ }
552
745
  }
553
746
  if (typeof document !== "undefined") {
747
+ installWindowNext({
748
+ appDir: true,
749
+ router: appRouterInstance
750
+ });
554
751
  window.addEventListener("pagehide", () => {
555
752
  isPageUnloading = true;
556
753
  });