vinext 0.0.50 → 0.0.52

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (462) hide show
  1. package/dist/build/google-fonts/fallback-metrics-data.js +14031 -0
  2. package/dist/build/google-fonts/fallback-metrics-data.js.map +1 -0
  3. package/dist/build/google-fonts/fallback-metrics.d.ts +13 -0
  4. package/dist/build/google-fonts/fallback-metrics.js +46 -0
  5. package/dist/build/google-fonts/fallback-metrics.js.map +1 -0
  6. package/dist/build/precompress.d.ts +13 -2
  7. package/dist/build/precompress.js +23 -13
  8. package/dist/build/precompress.js.map +1 -1
  9. package/dist/build/prerender.d.ts +4 -15
  10. package/dist/build/prerender.js +83 -53
  11. package/dist/build/prerender.js.map +1 -1
  12. package/dist/build/report.d.ts +5 -4
  13. package/dist/build/report.js +196 -348
  14. package/dist/build/report.js.map +1 -1
  15. package/dist/check.js +5 -0
  16. package/dist/check.js.map +1 -1
  17. package/dist/cli-args.d.ts +1 -0
  18. package/dist/cli-args.js +5 -0
  19. package/dist/cli-args.js.map +1 -1
  20. package/dist/cli.js +99 -3
  21. package/dist/cli.js.map +1 -1
  22. package/dist/client/navigation-runtime.d.ts +47 -0
  23. package/dist/client/navigation-runtime.js +156 -0
  24. package/dist/client/navigation-runtime.js.map +1 -0
  25. package/dist/client/pages-router-link-navigation.d.ts +26 -0
  26. package/dist/client/pages-router-link-navigation.js +14 -0
  27. package/dist/client/pages-router-link-navigation.js.map +1 -0
  28. package/dist/client/vinext-next-data.d.ts +12 -2
  29. package/dist/client/vinext-next-data.js +50 -1
  30. package/dist/client/vinext-next-data.js.map +1 -0
  31. package/dist/client/window-next.d.ts +3 -1
  32. package/dist/client/window-next.js.map +1 -1
  33. package/dist/cloudflare/kv-cache-handler.js +2 -1
  34. package/dist/cloudflare/kv-cache-handler.js.map +1 -1
  35. package/dist/config/config-matchers.d.ts +63 -16
  36. package/dist/config/config-matchers.js +143 -8
  37. package/dist/config/config-matchers.js.map +1 -1
  38. package/dist/config/dotenv.d.ts +11 -1
  39. package/dist/config/dotenv.js.map +1 -1
  40. package/dist/config/next-config.d.ts +107 -5
  41. package/dist/config/next-config.js +233 -7
  42. package/dist/config/next-config.js.map +1 -1
  43. package/dist/config/tsconfig-paths.d.ts +13 -0
  44. package/dist/config/tsconfig-paths.js +117 -0
  45. package/dist/config/tsconfig-paths.js.map +1 -0
  46. package/dist/deploy.js +104 -41
  47. package/dist/deploy.js.map +1 -1
  48. package/dist/entries/app-browser-entry.d.ts +2 -2
  49. package/dist/entries/app-browser-entry.js +34 -3
  50. package/dist/entries/app-browser-entry.js.map +1 -1
  51. package/dist/entries/app-rsc-entry.d.ts +19 -1
  52. package/dist/entries/app-rsc-entry.js +89 -23
  53. package/dist/entries/app-rsc-entry.js.map +1 -1
  54. package/dist/entries/app-rsc-manifest.d.ts +10 -0
  55. package/dist/entries/app-rsc-manifest.js +57 -7
  56. package/dist/entries/app-rsc-manifest.js.map +1 -1
  57. package/dist/entries/app-ssr-entry.d.ts +3 -3
  58. package/dist/entries/app-ssr-entry.js +4 -4
  59. package/dist/entries/app-ssr-entry.js.map +1 -1
  60. package/dist/entries/pages-client-entry.js +21 -7
  61. package/dist/entries/pages-client-entry.js.map +1 -1
  62. package/dist/entries/pages-server-entry.js +77 -9
  63. package/dist/entries/pages-server-entry.js.map +1 -1
  64. package/dist/entries/runtime-entry-module.d.ts +2 -1
  65. package/dist/entries/runtime-entry-module.js +9 -3
  66. package/dist/entries/runtime-entry-module.js.map +1 -1
  67. package/dist/index.js +260 -75
  68. package/dist/index.js.map +1 -1
  69. package/dist/plugins/client-reference-dedup.d.ts +15 -2
  70. package/dist/plugins/client-reference-dedup.js +138 -16
  71. package/dist/plugins/client-reference-dedup.js.map +1 -1
  72. package/dist/plugins/css-data-url.d.ts +7 -0
  73. package/dist/plugins/css-data-url.js +81 -0
  74. package/dist/plugins/css-data-url.js.map +1 -0
  75. package/dist/plugins/fonts.d.ts +2 -2
  76. package/dist/plugins/fonts.js +20 -9
  77. package/dist/plugins/fonts.js.map +1 -1
  78. package/dist/plugins/middleware-server-only.d.ts +54 -0
  79. package/dist/plugins/middleware-server-only.js +91 -0
  80. package/dist/plugins/middleware-server-only.js.map +1 -0
  81. package/dist/plugins/optimize-imports.js +4 -4
  82. package/dist/plugins/optimize-imports.js.map +1 -1
  83. package/dist/plugins/sass.d.ts +34 -0
  84. package/dist/plugins/sass.js +22 -0
  85. package/dist/plugins/sass.js.map +1 -0
  86. package/dist/plugins/strip-server-exports.js +5 -8
  87. package/dist/plugins/strip-server-exports.js.map +1 -1
  88. package/dist/routing/app-route-graph.d.ts +50 -2
  89. package/dist/routing/app-route-graph.js +140 -16
  90. package/dist/routing/app-route-graph.js.map +1 -1
  91. package/dist/routing/app-router.d.ts +2 -2
  92. package/dist/routing/app-router.js +2 -2
  93. package/dist/routing/app-router.js.map +1 -1
  94. package/dist/routing/route-pattern.d.ts +56 -1
  95. package/dist/routing/route-pattern.js +60 -1
  96. package/dist/routing/route-pattern.js.map +1 -1
  97. package/dist/routing/utils.d.ts +2 -1
  98. package/dist/routing/utils.js +4 -1
  99. package/dist/routing/utils.js.map +1 -1
  100. package/dist/server/api-handler.js +139 -37
  101. package/dist/server/api-handler.js.map +1 -1
  102. package/dist/server/app-browser-action-result.d.ts +27 -2
  103. package/dist/server/app-browser-action-result.js +63 -2
  104. package/dist/server/app-browser-action-result.js.map +1 -1
  105. package/dist/server/app-browser-entry.js +493 -195
  106. package/dist/server/app-browser-entry.js.map +1 -1
  107. package/dist/server/app-browser-hydration.d.ts +13 -1
  108. package/dist/server/app-browser-hydration.js +9 -1
  109. package/dist/server/app-browser-hydration.js.map +1 -1
  110. package/dist/server/app-browser-interception-context.d.ts +24 -0
  111. package/dist/server/app-browser-interception-context.js +32 -0
  112. package/dist/server/app-browser-interception-context.js.map +1 -0
  113. package/dist/server/app-browser-navigation-controller.d.ts +17 -2
  114. package/dist/server/app-browser-navigation-controller.js +33 -10
  115. package/dist/server/app-browser-navigation-controller.js.map +1 -1
  116. package/dist/server/app-browser-popstate.d.ts +16 -0
  117. package/dist/server/app-browser-popstate.js +17 -0
  118. package/dist/server/app-browser-popstate.js.map +1 -0
  119. package/dist/server/app-browser-rsc-redirect.d.ts +29 -0
  120. package/dist/server/app-browser-rsc-redirect.js +37 -0
  121. package/dist/server/app-browser-rsc-redirect.js.map +1 -0
  122. package/dist/server/app-browser-state.d.ts +28 -7
  123. package/dist/server/app-browser-state.js +63 -27
  124. package/dist/server/app-browser-state.js.map +1 -1
  125. package/dist/server/app-browser-stream.d.ts +9 -17
  126. package/dist/server/app-browser-stream.js +18 -13
  127. package/dist/server/app-browser-stream.js.map +1 -1
  128. package/dist/server/app-browser-visible-commit.d.ts +7 -1
  129. package/dist/server/app-browser-visible-commit.js +39 -5
  130. package/dist/server/app-browser-visible-commit.js.map +1 -1
  131. package/dist/server/app-elements-wire.d.ts +43 -6
  132. package/dist/server/app-elements-wire.js +189 -7
  133. package/dist/server/app-elements-wire.js.map +1 -1
  134. package/dist/server/app-elements.d.ts +3 -2
  135. package/dist/server/app-elements.js +3 -2
  136. package/dist/server/app-elements.js.map +1 -1
  137. package/dist/server/app-fallback-renderer.d.ts +10 -1
  138. package/dist/server/app-fallback-renderer.js +41 -3
  139. package/dist/server/app-fallback-renderer.js.map +1 -1
  140. package/dist/server/app-history-state.d.ts +26 -0
  141. package/dist/server/app-history-state.js +53 -0
  142. package/dist/server/app-history-state.js.map +1 -0
  143. package/dist/server/app-middleware.d.ts +13 -0
  144. package/dist/server/app-middleware.js +3 -1
  145. package/dist/server/app-middleware.js.map +1 -1
  146. package/dist/server/app-optimistic-routing.d.ts +54 -0
  147. package/dist/server/app-optimistic-routing.js +200 -0
  148. package/dist/server/app-optimistic-routing.js.map +1 -0
  149. package/dist/server/app-page-boundary-render.d.ts +10 -1
  150. package/dist/server/app-page-boundary-render.js +13 -6
  151. package/dist/server/app-page-boundary-render.js.map +1 -1
  152. package/dist/server/app-page-boundary.js +3 -2
  153. package/dist/server/app-page-boundary.js.map +1 -1
  154. package/dist/server/app-page-cache.d.ts +26 -1
  155. package/dist/server/app-page-cache.js +86 -14
  156. package/dist/server/app-page-cache.js.map +1 -1
  157. package/dist/server/app-page-dispatch.d.ts +7 -0
  158. package/dist/server/app-page-dispatch.js +96 -12
  159. package/dist/server/app-page-dispatch.js.map +1 -1
  160. package/dist/server/app-page-element-builder.d.ts +7 -0
  161. package/dist/server/app-page-element-builder.js +34 -5
  162. package/dist/server/app-page-element-builder.js.map +1 -1
  163. package/dist/server/app-page-execution.d.ts +28 -1
  164. package/dist/server/app-page-execution.js +91 -7
  165. package/dist/server/app-page-execution.js.map +1 -1
  166. package/dist/server/app-page-head.d.ts +7 -0
  167. package/dist/server/app-page-head.js +23 -3
  168. package/dist/server/app-page-head.js.map +1 -1
  169. package/dist/server/app-page-probe.d.ts +23 -1
  170. package/dist/server/app-page-probe.js +29 -1
  171. package/dist/server/app-page-probe.js.map +1 -1
  172. package/dist/server/app-page-render-observation.d.ts +35 -0
  173. package/dist/server/app-page-render-observation.js +68 -0
  174. package/dist/server/app-page-render-observation.js.map +1 -0
  175. package/dist/server/app-page-render.d.ts +7 -1
  176. package/dist/server/app-page-render.js +81 -4
  177. package/dist/server/app-page-render.js.map +1 -1
  178. package/dist/server/app-page-request.d.ts +1 -0
  179. package/dist/server/app-page-request.js.map +1 -1
  180. package/dist/server/app-page-response.js +7 -5
  181. package/dist/server/app-page-response.js.map +1 -1
  182. package/dist/server/app-page-route-wiring.d.ts +3 -1
  183. package/dist/server/app-page-route-wiring.js +59 -24
  184. package/dist/server/app-page-route-wiring.js.map +1 -1
  185. package/dist/server/app-page-stream.d.ts +5 -0
  186. package/dist/server/app-page-stream.js +2 -0
  187. package/dist/server/app-page-stream.js.map +1 -1
  188. package/dist/server/app-prerender-static-params.d.ts +2 -1
  189. package/dist/server/app-prerender-static-params.js +44 -8
  190. package/dist/server/app-prerender-static-params.js.map +1 -1
  191. package/dist/server/app-route-handler-cache.d.ts +2 -2
  192. package/dist/server/app-route-handler-cache.js +3 -2
  193. package/dist/server/app-route-handler-cache.js.map +1 -1
  194. package/dist/server/app-route-handler-dispatch.d.ts +6 -1
  195. package/dist/server/app-route-handler-dispatch.js +1 -1
  196. package/dist/server/app-route-handler-dispatch.js.map +1 -1
  197. package/dist/server/app-route-handler-execution.d.ts +17 -2
  198. package/dist/server/app-route-handler-execution.js.map +1 -1
  199. package/dist/server/app-route-handler-response.js +5 -4
  200. package/dist/server/app-route-handler-response.js.map +1 -1
  201. package/dist/server/app-router-entry.js +7 -15
  202. package/dist/server/app-router-entry.js.map +1 -1
  203. package/dist/server/app-rsc-cache-busting.d.ts +19 -1
  204. package/dist/server/app-rsc-cache-busting.js +36 -1
  205. package/dist/server/app-rsc-cache-busting.js.map +1 -1
  206. package/dist/server/app-rsc-embedded-chunks.d.ts +9 -0
  207. package/dist/server/app-rsc-embedded-chunks.js +34 -0
  208. package/dist/server/app-rsc-embedded-chunks.js.map +1 -0
  209. package/dist/server/app-rsc-errors.d.ts +4 -1
  210. package/dist/server/app-rsc-errors.js +1 -1
  211. package/dist/server/app-rsc-errors.js.map +1 -1
  212. package/dist/server/app-rsc-handler.d.ts +21 -5
  213. package/dist/server/app-rsc-handler.js +38 -15
  214. package/dist/server/app-rsc-handler.js.map +1 -1
  215. package/dist/server/app-rsc-render-mode.d.ts +4 -3
  216. package/dist/server/app-rsc-render-mode.js +7 -1
  217. package/dist/server/app-rsc-render-mode.js.map +1 -1
  218. package/dist/server/app-rsc-request-normalization.d.ts +4 -1
  219. package/dist/server/app-rsc-request-normalization.js +4 -1
  220. package/dist/server/app-rsc-request-normalization.js.map +1 -1
  221. package/dist/server/app-rsc-response-finalizer.d.ts +8 -1
  222. package/dist/server/app-rsc-response-finalizer.js +10 -3
  223. package/dist/server/app-rsc-response-finalizer.js.map +1 -1
  224. package/dist/server/app-rsc-route-matching.d.ts +23 -0
  225. package/dist/server/app-rsc-route-matching.js +47 -25
  226. package/dist/server/app-rsc-route-matching.js.map +1 -1
  227. package/dist/server/app-server-action-execution.d.ts +35 -3
  228. package/dist/server/app-server-action-execution.js +87 -33
  229. package/dist/server/app-server-action-execution.js.map +1 -1
  230. package/dist/server/app-ssr-entry.d.ts +3 -0
  231. package/dist/server/app-ssr-entry.js +83 -58
  232. package/dist/server/app-ssr-entry.js.map +1 -1
  233. package/dist/server/app-ssr-error-meta.d.ts +14 -0
  234. package/dist/server/app-ssr-error-meta.js +50 -0
  235. package/dist/server/app-ssr-error-meta.js.map +1 -0
  236. package/dist/server/app-ssr-stream.d.ts +7 -2
  237. package/dist/server/app-ssr-stream.js +26 -15
  238. package/dist/server/app-ssr-stream.js.map +1 -1
  239. package/dist/server/artifact-compatibility.d.ts +13 -3
  240. package/dist/server/artifact-compatibility.js +12 -8
  241. package/dist/server/artifact-compatibility.js.map +1 -1
  242. package/dist/server/cache-headers.d.ts +7 -0
  243. package/dist/server/cache-headers.js +19 -0
  244. package/dist/server/cache-headers.js.map +1 -0
  245. package/dist/server/cache-proof.d.ts +170 -5
  246. package/dist/server/cache-proof.js +472 -18
  247. package/dist/server/cache-proof.js.map +1 -1
  248. package/dist/server/client-reuse-manifest.d.ts +99 -0
  249. package/dist/server/client-reuse-manifest.js +212 -0
  250. package/dist/server/client-reuse-manifest.js.map +1 -0
  251. package/dist/server/default-global-error-module.d.ts +20 -0
  252. package/dist/server/default-global-error-module.js +20 -0
  253. package/dist/server/default-global-error-module.js.map +1 -0
  254. package/dist/server/dev-lockfile.d.ts +110 -0
  255. package/dist/server/dev-lockfile.js +180 -0
  256. package/dist/server/dev-lockfile.js.map +1 -0
  257. package/dist/server/dev-server.d.ts +9 -1
  258. package/dist/server/dev-server.js +76 -19
  259. package/dist/server/dev-server.js.map +1 -1
  260. package/dist/server/edge-api-runtime.d.ts +5 -0
  261. package/dist/server/edge-api-runtime.js +8 -0
  262. package/dist/server/edge-api-runtime.js.map +1 -0
  263. package/dist/server/file-based-metadata.d.ts +13 -0
  264. package/dist/server/file-based-metadata.js +49 -2
  265. package/dist/server/file-based-metadata.js.map +1 -1
  266. package/dist/server/headers.d.ts +20 -1
  267. package/dist/server/headers.js +22 -2
  268. package/dist/server/headers.js.map +1 -1
  269. package/dist/server/html.js +1 -1
  270. package/dist/server/html.js.map +1 -1
  271. package/dist/server/http-error-responses.d.ts +26 -1
  272. package/dist/server/http-error-responses.js +32 -2
  273. package/dist/server/http-error-responses.js.map +1 -1
  274. package/dist/server/isr-cache.d.ts +8 -3
  275. package/dist/server/isr-cache.js +24 -6
  276. package/dist/server/isr-cache.js.map +1 -1
  277. package/dist/server/metadata-route-response.js +22 -5
  278. package/dist/server/metadata-route-response.js.map +1 -1
  279. package/dist/server/metadata-routes.js +27 -8
  280. package/dist/server/metadata-routes.js.map +1 -1
  281. package/dist/server/middleware-runtime.d.ts +15 -0
  282. package/dist/server/middleware-runtime.js +60 -7
  283. package/dist/server/middleware-runtime.js.map +1 -1
  284. package/dist/server/middleware.d.ts +13 -1
  285. package/dist/server/middleware.js +16 -2
  286. package/dist/server/middleware.js.map +1 -1
  287. package/dist/server/navigation-planner.d.ts +26 -6
  288. package/dist/server/navigation-planner.js +358 -24
  289. package/dist/server/navigation-planner.js.map +1 -1
  290. package/dist/server/navigation-trace.d.ts +9 -1
  291. package/dist/server/navigation-trace.js +8 -0
  292. package/dist/server/navigation-trace.js.map +1 -1
  293. package/dist/server/normalize-path.d.ts +2 -1
  294. package/dist/server/normalize-path.js +4 -1
  295. package/dist/server/normalize-path.js.map +1 -1
  296. package/dist/server/pages-api-route.d.ts +27 -1
  297. package/dist/server/pages-api-route.js +25 -3
  298. package/dist/server/pages-api-route.js.map +1 -1
  299. package/dist/server/pages-data-route.d.ts +77 -0
  300. package/dist/server/pages-data-route.js +97 -0
  301. package/dist/server/pages-data-route.js.map +1 -0
  302. package/dist/server/pages-i18n.d.ts +51 -1
  303. package/dist/server/pages-i18n.js +61 -1
  304. package/dist/server/pages-i18n.js.map +1 -1
  305. package/dist/server/pages-page-data.d.ts +32 -4
  306. package/dist/server/pages-page-data.js +52 -19
  307. package/dist/server/pages-page-data.js.map +1 -1
  308. package/dist/server/pages-page-response.d.ts +11 -1
  309. package/dist/server/pages-page-response.js +6 -4
  310. package/dist/server/pages-page-response.js.map +1 -1
  311. package/dist/server/prod-server.d.ts +26 -1
  312. package/dist/server/prod-server.js +150 -44
  313. package/dist/server/prod-server.js.map +1 -1
  314. package/dist/server/request-pipeline.d.ts +11 -2
  315. package/dist/server/request-pipeline.js +28 -11
  316. package/dist/server/request-pipeline.js.map +1 -1
  317. package/dist/server/seed-cache.d.ts +12 -31
  318. package/dist/server/seed-cache.js +22 -35
  319. package/dist/server/seed-cache.js.map +1 -1
  320. package/dist/server/server-action-not-found.d.ts +16 -3
  321. package/dist/server/server-action-not-found.js +27 -4
  322. package/dist/server/server-action-not-found.js.map +1 -1
  323. package/dist/server/server-globals.d.ts +5 -0
  324. package/dist/server/server-globals.js +37 -0
  325. package/dist/server/server-globals.js.map +1 -0
  326. package/dist/server/skip-cache-proof.d.ts +41 -0
  327. package/dist/server/skip-cache-proof.js +101 -0
  328. package/dist/server/skip-cache-proof.js.map +1 -0
  329. package/dist/server/static-file-cache.d.ts +1 -1
  330. package/dist/server/static-file-cache.js +7 -6
  331. package/dist/server/static-file-cache.js.map +1 -1
  332. package/dist/shims/cache-runtime.d.ts +19 -2
  333. package/dist/shims/cache-runtime.js +67 -11
  334. package/dist/shims/cache-runtime.js.map +1 -1
  335. package/dist/shims/cache.d.ts +5 -18
  336. package/dist/shims/cache.js +2 -0
  337. package/dist/shims/cache.js.map +1 -1
  338. package/dist/shims/client-locale.d.ts +15 -0
  339. package/dist/shims/client-locale.js +13 -0
  340. package/dist/shims/client-locale.js.map +1 -0
  341. package/dist/shims/default-global-error.d.ts +32 -0
  342. package/dist/shims/default-global-error.js +181 -0
  343. package/dist/shims/default-global-error.js.map +1 -0
  344. package/dist/shims/document.d.ts +59 -3
  345. package/dist/shims/document.js +36 -5
  346. package/dist/shims/document.js.map +1 -1
  347. package/dist/shims/error-boundary.d.ts +2 -2
  348. package/dist/shims/error-boundary.js +6 -8
  349. package/dist/shims/error-boundary.js.map +1 -1
  350. package/dist/shims/error.d.ts +18 -1
  351. package/dist/shims/error.js +56 -1
  352. package/dist/shims/error.js.map +1 -1
  353. package/dist/shims/fetch-cache.d.ts +4 -1
  354. package/dist/shims/fetch-cache.js +40 -5
  355. package/dist/shims/fetch-cache.js.map +1 -1
  356. package/dist/shims/font-google-base.d.ts +22 -8
  357. package/dist/shims/font-google-base.js +41 -71
  358. package/dist/shims/font-google-base.js.map +1 -1
  359. package/dist/shims/font-local.d.ts +3 -20
  360. package/dist/shims/font-local.js +23 -75
  361. package/dist/shims/font-local.js.map +1 -1
  362. package/dist/shims/font-utils.d.ts +51 -0
  363. package/dist/shims/font-utils.js +97 -0
  364. package/dist/shims/font-utils.js.map +1 -0
  365. package/dist/shims/form.js +13 -6
  366. package/dist/shims/form.js.map +1 -1
  367. package/dist/shims/hash-scroll.d.ts +7 -0
  368. package/dist/shims/hash-scroll.js +30 -0
  369. package/dist/shims/hash-scroll.js.map +1 -0
  370. package/dist/shims/headers.d.ts +8 -11
  371. package/dist/shims/headers.js +22 -2
  372. package/dist/shims/headers.js.map +1 -1
  373. package/dist/shims/image.d.ts +1 -0
  374. package/dist/shims/image.js +144 -78
  375. package/dist/shims/image.js.map +1 -1
  376. package/dist/shims/internal/app-router-context.d.ts +6 -6
  377. package/dist/shims/internal/app-router-context.js +17 -6
  378. package/dist/shims/internal/app-router-context.js.map +1 -1
  379. package/dist/shims/link-prefetch.d.ts +9 -1
  380. package/dist/shims/link-prefetch.js +11 -6
  381. package/dist/shims/link-prefetch.js.map +1 -1
  382. package/dist/shims/link.d.ts +33 -5
  383. package/dist/shims/link.js +205 -50
  384. package/dist/shims/link.js.map +1 -1
  385. package/dist/shims/metadata.d.ts +16 -30
  386. package/dist/shims/metadata.js +91 -32
  387. package/dist/shims/metadata.js.map +1 -1
  388. package/dist/shims/navigation.d.ts +164 -17
  389. package/dist/shims/navigation.js +355 -84
  390. package/dist/shims/navigation.js.map +1 -1
  391. package/dist/shims/navigation.react-server.d.ts +3 -2
  392. package/dist/shims/navigation.react-server.js +5 -2
  393. package/dist/shims/navigation.react-server.js.map +1 -1
  394. package/dist/shims/og.d.ts +18 -2
  395. package/dist/shims/og.js +49 -1
  396. package/dist/shims/og.js.map +1 -0
  397. package/dist/shims/pages-router-runtime.d.ts +7 -0
  398. package/dist/shims/pages-router-runtime.js +16 -0
  399. package/dist/shims/pages-router-runtime.js.map +1 -0
  400. package/dist/shims/request-state-types.d.ts +1 -1
  401. package/dist/shims/root-params.d.ts +3 -1
  402. package/dist/shims/root-params.js +11 -3
  403. package/dist/shims/root-params.js.map +1 -1
  404. package/dist/shims/router-state.d.ts +1 -0
  405. package/dist/shims/router-state.js.map +1 -1
  406. package/dist/shims/router.d.ts +40 -7
  407. package/dist/shims/router.js +355 -250
  408. package/dist/shims/router.js.map +1 -1
  409. package/dist/shims/script.js +110 -32
  410. package/dist/shims/script.js.map +1 -1
  411. package/dist/shims/server.d.ts +21 -4
  412. package/dist/shims/server.js +31 -10
  413. package/dist/shims/server.js.map +1 -1
  414. package/dist/shims/slot.d.ts +1 -0
  415. package/dist/shims/slot.js +45 -1
  416. package/dist/shims/slot.js.map +1 -1
  417. package/dist/shims/unified-request-context.d.ts +1 -1
  418. package/dist/shims/unified-request-context.js +2 -0
  419. package/dist/shims/unified-request-context.js.map +1 -1
  420. package/dist/shims/unrecognized-action-error.d.ts +35 -0
  421. package/dist/shims/unrecognized-action-error.js +41 -0
  422. package/dist/shims/unrecognized-action-error.js.map +1 -0
  423. package/dist/shims/url-safety.d.ts +23 -1
  424. package/dist/shims/url-safety.js +29 -2
  425. package/dist/shims/url-safety.js.map +1 -1
  426. package/dist/shims/url-utils.d.ts +21 -1
  427. package/dist/shims/url-utils.js +67 -3
  428. package/dist/shims/url-utils.js.map +1 -1
  429. package/dist/typegen.d.ts +10 -0
  430. package/dist/typegen.js +242 -0
  431. package/dist/typegen.js.map +1 -0
  432. package/dist/utils/asset-prefix.d.ts +97 -0
  433. package/dist/utils/asset-prefix.js +124 -0
  434. package/dist/utils/asset-prefix.js.map +1 -0
  435. package/dist/utils/base-path.d.ts +7 -1
  436. package/dist/utils/base-path.js +10 -1
  437. package/dist/utils/base-path.js.map +1 -1
  438. package/dist/utils/cache-control-metadata.d.ts +2 -1
  439. package/dist/utils/cache-control-metadata.js +1 -3
  440. package/dist/utils/cache-control-metadata.js.map +1 -1
  441. package/dist/utils/domain-locale.d.ts +2 -1
  442. package/dist/utils/domain-locale.js +9 -1
  443. package/dist/utils/domain-locale.js.map +1 -1
  444. package/dist/utils/lazy-chunks.d.ts +1 -1
  445. package/dist/utils/lazy-chunks.js +1 -1
  446. package/dist/utils/lazy-chunks.js.map +1 -1
  447. package/dist/utils/navigation-signal.d.ts +1 -2
  448. package/dist/utils/navigation-signal.js +1 -1
  449. package/dist/utils/navigation-signal.js.map +1 -1
  450. package/dist/utils/prerender-output-paths.d.ts +15 -0
  451. package/dist/utils/prerender-output-paths.js +24 -0
  452. package/dist/utils/prerender-output-paths.js.map +1 -0
  453. package/dist/utils/query.d.ts +17 -1
  454. package/dist/utils/query.js +36 -1
  455. package/dist/utils/query.js.map +1 -1
  456. package/dist/utils/record.d.ts +5 -0
  457. package/dist/utils/record.js +8 -0
  458. package/dist/utils/record.js.map +1 -0
  459. package/dist/utils/sorted-array.d.ts +9 -0
  460. package/dist/utils/sorted-array.js +22 -0
  461. package/dist/utils/sorted-array.js.map +1 -0
  462. package/package.json +13 -5
@@ -1,11 +1,17 @@
1
1
  import { stripBasePath } from "../utils/base-path.js";
2
+ import { assertSafeNavigationUrl } from "./url-safety.js";
3
+ import { addQueryParam, appendSearchParamsToUrl, urlQueryToSearchParams } from "../utils/query.js";
4
+ import { matchRoutePattern, routePatternParts } from "../routing/route-pattern.js";
2
5
  import { RouterContext } from "./internal/router-context.js";
6
+ import { applyVinextLocaleGlobals, extractVinextNextDataJson, parseVinextNextDataJson } from "../client/vinext-next-data.js";
3
7
  import { isValidModulePath } from "../client/validate-module-path.js";
4
8
  import { installWindowNext } from "../client/window-next.js";
5
- import { isHashOnlyBrowserUrlChange, toBrowserNavigationHref, toSameOriginAppPath } from "./url-utils.js";
6
- import { addLocalePrefix, getDomainLocaleUrl } from "../utils/domain-locale.js";
7
- import { addQueryParam, appendSearchParamsToUrl, urlQueryToSearchParams } from "../utils/query.js";
8
- import { createElement, useCallback, useEffect, useMemo, useState } from "react";
9
+ import { isAbsoluteOrProtocolRelativeUrl, isHashOnlyBrowserUrlChange, normalizePathTrailingSlash, toBrowserNavigationHref, toSameOriginAppPath } from "./url-utils.js";
10
+ import { addLocalePrefix, getDomainLocaleUrl, getLocalePathPrefix } from "../utils/domain-locale.js";
11
+ import { scrollToHashTarget } from "./hash-scroll.js";
12
+ import { setPagesRouterPopStateHandler } from "./pages-router-runtime.js";
13
+ import { getCurrentBrowserLocale } from "./client-locale.js";
14
+ import { createElement, useContext, useEffect, useMemo, useState } from "react";
9
15
  //#region src/shims/router.ts
10
16
  /**
11
17
  * next/router shim
@@ -16,6 +22,8 @@ import { createElement, useCallback, useEffect, useMemo, useState } from "react"
16
22
  */
17
23
  /** basePath from next.config.js, injected by the plugin at build time */
18
24
  const __basePath = process.env.__NEXT_ROUTER_BASEPATH ?? "";
25
+ /** trailingSlash from next.config.js, injected by the plugin at build time */
26
+ const __trailingSlash = process.env.__VINEXT_TRAILING_SLASH === "true";
19
27
  function createRouterEvents() {
20
28
  const listeners = /* @__PURE__ */ new Map();
21
29
  return {
@@ -51,6 +59,18 @@ function resolveUrl(url) {
51
59
  function resolveNavigationTarget(url, as, locale) {
52
60
  return applyNavigationLocale(as ?? resolveUrl(url), locale);
53
61
  }
62
+ function getCurrentUrlLocale() {
63
+ return getCurrentBrowserLocale({
64
+ basePath: __basePath,
65
+ domainLocales: getDomainLocales(),
66
+ hostname: getCurrentHostname()
67
+ });
68
+ }
69
+ function resolveTransitionLocale(locale) {
70
+ if (typeof window === "undefined") return void 0;
71
+ if (locale === false) return window.__VINEXT_DEFAULT_LOCALE__;
72
+ return locale ?? getCurrentUrlLocale();
73
+ }
54
74
  function getDomainLocales() {
55
75
  return window.__NEXT_DATA__?.domainLocales;
56
76
  }
@@ -70,14 +90,31 @@ function getDomainLocalePath(url, locale) {
70
90
  */
71
91
  function applyNavigationLocale(url, locale) {
72
92
  if (!locale || typeof window === "undefined") return url;
73
- if (url.startsWith("http://") || url.startsWith("https://") || url.startsWith("//")) return url;
93
+ if (isAbsoluteOrProtocolRelativeUrl(url)) return url;
94
+ if (getLocalePathPrefix(url, window.__VINEXT_LOCALES__)) return url;
74
95
  const domainLocalePath = getDomainLocalePath(url, locale);
75
96
  if (domainLocalePath) return domainLocalePath;
76
97
  return addLocalePrefix(url, locale, window.__VINEXT_DEFAULT_LOCALE__ ?? "");
77
98
  }
99
+ function isDefaultLocaleRootNavigation(url, locale) {
100
+ if (typeof window === "undefined") return false;
101
+ if (!locale || locale !== window.__VINEXT_DEFAULT_LOCALE__) return false;
102
+ let parsed;
103
+ try {
104
+ parsed = new URL(url, window.location.href);
105
+ } catch {
106
+ return false;
107
+ }
108
+ return stripBasePath(parsed.pathname, __basePath) === "/";
109
+ }
110
+ function getPagesHtmlFetchUrl(browserUrl, locale) {
111
+ if (!isDefaultLocaleRootNavigation(browserUrl, locale)) return browserUrl;
112
+ const parsed = new URL(browserUrl, window.location.href);
113
+ return normalizePathTrailingSlash(toBrowserNavigationHref(`${normalizePathTrailingSlash(`/${locale}`, __trailingSlash)}${parsed.search}${parsed.hash}`, window.location.href, __basePath), __trailingSlash);
114
+ }
78
115
  /** Check if a URL is external (any URL scheme per RFC 3986, or protocol-relative) */
79
116
  function isExternalUrl(url) {
80
- return /^[a-z][a-z0-9+.-]*:/i.test(url) || url.startsWith("//");
117
+ return isAbsoluteOrProtocolRelativeUrl(url);
81
118
  }
82
119
  /** Resolve a hash URL to a basePath-stripped app URL for event payloads */
83
120
  function resolveHashUrl(url) {
@@ -96,15 +133,6 @@ function isHashOnlyChange(href) {
96
133
  if (typeof window === "undefined") return false;
97
134
  return isHashOnlyBrowserUrlChange(href, window.location.href, __basePath);
98
135
  }
99
- /** Scroll to hash target element, or top if no hash */
100
- function scrollToHash(hash) {
101
- if (!hash || hash === "#") {
102
- window.scrollTo(0, 0);
103
- return;
104
- }
105
- const el = document.getElementById(hash.slice(1));
106
- if (el) el.scrollIntoView({ behavior: "auto" });
107
- }
108
136
  /** Save current scroll position into history state for back/forward restoration */
109
137
  function saveScrollPosition() {
110
138
  const state = window.history.state ?? {};
@@ -137,6 +165,60 @@ function _registerRouterStateAccessors(accessors) {
137
165
  function setSSRContext(ctx) {
138
166
  _setSSRContextImpl(ctx);
139
167
  }
168
+ let _cachedClientPagesNavCtx = null;
169
+ let _cachedClientPagesNavCtxKey = null;
170
+ function _buildClientPagesNavigationContext(routePattern, resolvedPath, searchString) {
171
+ const cacheKey = `${routePattern}|${resolvedPath}|${searchString}`;
172
+ if (_cachedClientPagesNavCtxKey === cacheKey && _cachedClientPagesNavCtx) return _cachedClientPagesNavCtx;
173
+ const ctx = {
174
+ pathname: resolvedPath,
175
+ searchParams: new URLSearchParams(searchString),
176
+ params: routePattern ? extractRouteParamsFromPath(routePattern, resolvedPath) ?? {} : {}
177
+ };
178
+ _cachedClientPagesNavCtx = ctx;
179
+ _cachedClientPagesNavCtxKey = cacheKey;
180
+ return ctx;
181
+ }
182
+ /**
183
+ * Cross-router compat shim source for `next/navigation` hooks.
184
+ *
185
+ * Returns the current Pages Router state shaped as a navigation context so
186
+ * the App Router hooks (useParams/useSearchParams/usePathname) can act as
187
+ * compat shims when invoked inside a Pages Router render. Mirrors Next.js's
188
+ * `adaptForPathParams` and `adaptForSearchParams` in
189
+ * .nextjs-ref/packages/next/src/shared/lib/router/adapters.tsx, which Next.js
190
+ * uses to populate SearchParamsContext / PathParamsContext for the Pages
191
+ * Router (see packages/next/src/server/render.tsx and
192
+ * packages/next/src/client/index.tsx).
193
+ *
194
+ * Returns `null` when there is no Pages Router state available — e.g. App
195
+ * Router pages, RSC-only renders, or pre-router renders. Callers should
196
+ * treat null as "App Router context, use normal app-router state".
197
+ */
198
+ function getPagesNavigationContext() {
199
+ if (typeof window === "undefined") {
200
+ const ssrCtx = _getSSRContext();
201
+ if (!ssrCtx) return null;
202
+ let searchParams;
203
+ let resolvedPath;
204
+ try {
205
+ const url = new URL(ssrCtx.asPath, "http://_");
206
+ searchParams = url.searchParams;
207
+ resolvedPath = url.pathname;
208
+ } catch {
209
+ searchParams = new URLSearchParams();
210
+ resolvedPath = ssrCtx.pathname;
211
+ }
212
+ const params = extractRouteParamsFromPath(ssrCtx.pathname, resolvedPath) ?? {};
213
+ return {
214
+ pathname: resolvedPath,
215
+ searchParams,
216
+ params
217
+ };
218
+ }
219
+ const resolvedPath = stripBasePath(window.location.pathname, __basePath);
220
+ return _buildClientPagesNavigationContext(window.__NEXT_DATA__?.page ?? "", resolvedPath, window.location.search);
221
+ }
140
222
  /**
141
223
  * Extract param names from a Next.js route pattern.
142
224
  * E.g., "/posts/[id]" → ["id"], "/docs/[...slug]" → ["slug"],
@@ -152,6 +234,26 @@ function extractRouteParamNames(pattern) {
152
234
  for (const m of colonMatches) names.push(m[1]);
153
235
  return names;
154
236
  }
237
+ function splitPathSegments(pathname) {
238
+ return pathname.split("/").filter(Boolean);
239
+ }
240
+ function extractRouteParamsFromPath(pattern, pathname) {
241
+ return matchRoutePattern(splitPathSegments(pathname), routePatternParts(pattern));
242
+ }
243
+ function getRouteQueryFromNextData(nextData, resolvedPath) {
244
+ const routeQuery = {};
245
+ if (!nextData?.query || !nextData.page) return routeQuery;
246
+ const routeParamNames = extractRouteParamNames(nextData.page);
247
+ if (routeParamNames.length === 0) return routeQuery;
248
+ const currentRouteParams = extractRouteParamsFromPath(nextData.page, resolvedPath);
249
+ if (currentRouteParams) return currentRouteParams;
250
+ for (const key of routeParamNames) {
251
+ const value = nextData.query[key];
252
+ if (typeof value === "string") routeQuery[key] = value;
253
+ else if (Array.isArray(value)) routeQuery[key] = [...value];
254
+ }
255
+ return routeQuery;
256
+ }
155
257
  function getPathnameAndQuery() {
156
258
  if (typeof window === "undefined") {
157
259
  const _ssrCtx = _getSSRContext();
@@ -172,16 +274,8 @@ function getPathnameAndQuery() {
172
274
  }
173
275
  const resolvedPath = stripBasePath(window.location.pathname, __basePath);
174
276
  const pathname = window.__NEXT_DATA__?.page ?? resolvedPath;
175
- const routeQuery = {};
176
277
  const nextData = window.__NEXT_DATA__;
177
- if (nextData && nextData.query && nextData.page) {
178
- const routeParamNames = extractRouteParamNames(nextData.page);
179
- for (const key of routeParamNames) {
180
- const value = nextData.query[key];
181
- if (typeof value === "string") routeQuery[key] = value;
182
- else if (Array.isArray(value)) routeQuery[key] = [...value];
183
- }
184
- }
278
+ const routeQuery = getRouteQueryFromNextData(nextData, resolvedPath);
185
279
  const searchQuery = {};
186
280
  const params = new URLSearchParams(window.location.search);
187
281
  for (const [key, value] of params) addQueryParam(searchQuery, key, value);
@@ -243,7 +337,7 @@ function scheduleHardNavigationAndThrow(url, message) {
243
337
  * Throws on hard-navigation failures (non-OK response, missing data) so the
244
338
  * caller can distinguish success from failure for event emission.
245
339
  */
246
- async function navigateClient(url) {
340
+ async function navigateClient(url, fetchUrl = url) {
247
341
  if (typeof window === "undefined") return;
248
342
  const root = window.__VINEXT_ROOT__;
249
343
  if (!root) {
@@ -261,7 +355,7 @@ async function navigateClient(url) {
261
355
  try {
262
356
  let res;
263
357
  try {
264
- res = await fetch(url, {
358
+ res = await fetch(fetchUrl, {
265
359
  headers: { Accept: "text/html" },
266
360
  signal: controller.signal
267
361
  });
@@ -273,9 +367,9 @@ async function navigateClient(url) {
273
367
  if (!res.ok) scheduleHardNavigationAndThrow(url, `Navigation failed: ${res.status} ${res.statusText}`);
274
368
  const html = await res.text();
275
369
  assertStillCurrent();
276
- const match = html.match(/<script>window\.__NEXT_DATA__\s*=\s*(.*?)<\/script>/);
277
- if (!match) scheduleHardNavigationAndThrow(url, "Navigation failed: missing __NEXT_DATA__ in response");
278
- const nextData = JSON.parse(match[1]);
370
+ const nextDataJson = extractVinextNextDataJson(html);
371
+ if (!nextDataJson) scheduleHardNavigationAndThrow(url, "Navigation failed: missing __NEXT_DATA__ in response");
372
+ const nextData = parseVinextNextDataJson(nextDataJson);
279
373
  const { pageProps } = nextData.props;
280
374
  let pageModuleUrl = nextData.__vinext?.pageModuleUrl;
281
375
  if (!pageModuleUrl) {
@@ -316,6 +410,7 @@ async function navigateClient(url) {
316
410
  else element = React.createElement(PageComponent, pageProps);
317
411
  element = wrapWithRouterContext(element);
318
412
  window.__NEXT_DATA__ = nextData;
413
+ applyVinextLocaleGlobals(window, nextData);
319
414
  root.render(element);
320
415
  } finally {
321
416
  if (navId === _navigationId) _activeAbortController = null;
@@ -333,9 +428,9 @@ async function navigateClient(url) {
333
428
  * - "failed" — genuine error, caller should return false (hard nav is already
334
429
  * scheduled as recovery)
335
430
  */
336
- async function runNavigateClient(fullUrl, resolvedUrl) {
431
+ async function runNavigateClient(fullUrl, resolvedUrl, fetchUrl = fullUrl) {
337
432
  try {
338
- await navigateClient(fullUrl);
433
+ await navigateClient(fullUrl, fetchUrl);
339
434
  return "completed";
340
435
  } catch (err) {
341
436
  routerEvents.emit("routeChangeError", err, resolvedUrl, { shallow: false });
@@ -346,9 +441,8 @@ async function runNavigateClient(fullUrl, resolvedUrl) {
346
441
  }
347
442
  /**
348
443
  * Build the full router value object from the current pathname, query, asPath,
349
- * and a set of navigation methods. Shared by useRouter() (which passes
350
- * hook-derived callbacks) and wrapWithRouterContext() (which passes the Router
351
- * singleton methods) so the shape stays in sync.
444
+ * and a set of navigation methods. Shared by the Pages Router context provider
445
+ * and tests so the public router shape stays in sync.
352
446
  */
353
447
  function buildRouterValue(pathname, query, asPath, methods) {
354
448
  const _ssrState = _getSSRContext();
@@ -369,15 +463,125 @@ function buildRouterValue(pathname, query, asPath, methods) {
369
463
  domainLocales,
370
464
  isReady: true,
371
465
  isPreview: false,
372
- isFallback: typeof window !== "undefined" && nextData?.isFallback === true,
466
+ isFallback: typeof window !== "undefined" ? nextData?.isFallback === true : _ssrState?.isFallback === true,
373
467
  ...methods,
374
468
  events: routerEvents
375
469
  };
376
470
  }
471
+ /** Extract the hash fragment from a URL, including the leading `#`. */
472
+ function extractHash(url) {
473
+ const i = url.indexOf("#");
474
+ return i === -1 ? "" : url.slice(i);
475
+ }
476
+ /** Notify in-page listeners (e.g. useRouter hooks) that navigation occurred. */
477
+ function dispatchNavigateEvent() {
478
+ window.dispatchEvent(new CustomEvent("vinext:navigate"));
479
+ }
480
+ /**
481
+ * Update history with the new URL and refresh the hash-only-detection tracker.
482
+ * Centralises the `pushState`/`replaceState` branch so callers don't repeat it.
483
+ */
484
+ function updateHistory(mode, url) {
485
+ if (mode === "push") window.history.pushState({}, "", url);
486
+ else window.history.replaceState({}, "", url);
487
+ _lastPathnameAndSearch = window.location.pathname + window.location.search;
488
+ }
489
+ /**
490
+ * Throw the canonical "no router instance" error used when a Pages Router
491
+ * navigation method (push/replace/back/reload/prefetch/beforePopState) is
492
+ * invoked during SSR or prerendering.
493
+ *
494
+ * Mirrors Next.js's `ServerRouter.push`/`replace`/etc. which all call
495
+ * `noRouter()` in `packages/next/src/server/render.tsx`. The error message
496
+ * matches Next.js verbatim so userland error handling and docs links work
497
+ * unchanged.
498
+ *
499
+ * Ported from Next.js: packages/next/src/server/render.tsx
500
+ * https://github.com/vercel/next.js/blob/canary/packages/next/src/server/render.tsx
501
+ */
502
+ function throwNoRouterInstance() {
503
+ throw new Error("No router instance found. you should only use \"next/router\" inside the client side of your app. https://nextjs.org/docs/messages/no-router-instance");
504
+ }
505
+ /**
506
+ * Shared client-side navigation flow used by both `useRouter()` and the
507
+ * `Router` singleton. The only differences between push/replace are the
508
+ * history method (`pushState` vs `replaceState`), the external-URL fallback
509
+ * (`assign` vs `replace`), and the fact that push saves scroll position for
510
+ * back/forward restoration while replace does not.
511
+ *
512
+ * `onStateUpdate` lets the hook trigger a `setState` re-render at the same
513
+ * point that hashChangeComplete/routeChangeComplete fires; the singleton
514
+ * passes no callback.
515
+ */
516
+ async function performNavigation(url, as, options, mode, onStateUpdate) {
517
+ if (typeof window === "undefined") throwNoRouterInstance();
518
+ assertSafeNavigationUrl(resolveUrl(url));
519
+ if (as !== void 0) assertSafeNavigationUrl(String(as));
520
+ const navigationLocale = resolveTransitionLocale(options?.locale);
521
+ let resolved = resolveNavigationTarget(url, as, navigationLocale);
522
+ if (isExternalUrl(resolved)) {
523
+ const localPath = toSameOriginAppPath(resolved, __basePath);
524
+ if (localPath == null) {
525
+ if (mode === "push") window.location.assign(resolved);
526
+ else window.location.replace(resolved);
527
+ return true;
528
+ }
529
+ resolved = localPath;
530
+ }
531
+ resolved = normalizePathTrailingSlash(resolved, __trailingSlash);
532
+ const full = normalizePathTrailingSlash(toBrowserNavigationHref(resolved, window.location.href, __basePath), __trailingSlash);
533
+ const htmlFetchUrl = getPagesHtmlFetchUrl(full, navigationLocale);
534
+ const shallow = options?.shallow ?? false;
535
+ const doScroll = options?.scroll !== false;
536
+ if (isHashOnlyChange(full)) {
537
+ const eventUrl = resolveHashUrl(full);
538
+ routerEvents.emit("hashChangeStart", eventUrl, { shallow });
539
+ updateHistory(mode, resolved.startsWith("#") ? resolved : full);
540
+ if (doScroll) scrollToHashTarget(extractHash(resolved));
541
+ onStateUpdate?.();
542
+ routerEvents.emit("hashChangeComplete", eventUrl, { shallow });
543
+ dispatchNavigateEvent();
544
+ return true;
545
+ }
546
+ if (mode === "push") saveScrollPosition();
547
+ routerEvents.emit("routeChangeStart", resolved, { shallow });
548
+ routerEvents.emit("beforeHistoryChange", resolved, { shallow });
549
+ updateHistory(mode, full);
550
+ if (!shallow) {
551
+ const result = await runNavigateClient(full, resolved, htmlFetchUrl);
552
+ if (result === "cancelled") return true;
553
+ if (result === "failed") return false;
554
+ }
555
+ onStateUpdate?.();
556
+ routerEvents.emit("routeChangeComplete", resolved, { shallow });
557
+ const hash = extractHash(resolved);
558
+ if (doScroll) if (hash) scrollToHashTarget(hash);
559
+ else window.scrollTo(0, 0);
560
+ dispatchNavigateEvent();
561
+ return true;
562
+ }
563
+ /** Inject a `<link rel="prefetch">` for the target page. */
564
+ async function prefetchUrl(url) {
565
+ if (typeof document !== "undefined") {
566
+ const link = document.createElement("link");
567
+ link.rel = "prefetch";
568
+ link.href = url;
569
+ link.as = "document";
570
+ document.head.appendChild(link);
571
+ }
572
+ }
377
573
  /**
378
574
  * useRouter hook - Pages Router compatible.
575
+ *
576
+ * Ported from Next.js: packages/next/src/client/router.ts
577
+ * https://github.com/vercel/next.js/blob/canary/packages/next/src/client/router.ts
379
578
  */
380
579
  function useRouter() {
580
+ const router = useContext(RouterContext);
581
+ if (!router) throw new Error("NextRouter was not mounted. https://nextjs.org/docs/messages/next-router-not-mounted");
582
+ return router;
583
+ }
584
+ function PagesRouterProvider({ children }) {
381
585
  const [{ pathname, query, asPath }, setState] = useState(getPathnameAndQuery);
382
586
  useEffect(() => {
383
587
  const onNavigate = ((_e) => {
@@ -386,125 +590,23 @@ function useRouter() {
386
590
  window.addEventListener("vinext:navigate", onNavigate);
387
591
  return () => window.removeEventListener("vinext:navigate", onNavigate);
388
592
  }, []);
389
- const push = useCallback(async (url, as, options) => {
390
- let resolved = resolveNavigationTarget(url, as, options?.locale);
391
- if (isExternalUrl(resolved)) {
392
- const localPath = toSameOriginAppPath(resolved, __basePath);
393
- if (localPath == null) {
394
- window.location.assign(resolved);
395
- return true;
396
- }
397
- resolved = localPath;
398
- }
399
- const full = toBrowserNavigationHref(resolved, window.location.href, __basePath);
400
- if (isHashOnlyChange(full)) {
401
- const eventUrl = resolveHashUrl(full);
402
- routerEvents.emit("hashChangeStart", eventUrl, { shallow: options?.shallow ?? false });
403
- const hash = resolved.includes("#") ? resolved.slice(resolved.indexOf("#")) : "";
404
- window.history.pushState({}, "", resolved.startsWith("#") ? resolved : full);
405
- _lastPathnameAndSearch = window.location.pathname + window.location.search;
406
- scrollToHash(hash);
407
- setState(getPathnameAndQuery());
408
- routerEvents.emit("hashChangeComplete", eventUrl, { shallow: options?.shallow ?? false });
409
- window.dispatchEvent(new CustomEvent("vinext:navigate"));
410
- return true;
411
- }
412
- saveScrollPosition();
413
- routerEvents.emit("routeChangeStart", resolved, { shallow: options?.shallow ?? false });
414
- routerEvents.emit("beforeHistoryChange", resolved, { shallow: options?.shallow ?? false });
415
- window.history.pushState({}, "", full);
416
- _lastPathnameAndSearch = window.location.pathname + window.location.search;
417
- if (!options?.shallow) {
418
- const result = await runNavigateClient(full, resolved);
419
- if (result === "cancelled") return true;
420
- if (result === "failed") return false;
421
- }
422
- setState(getPathnameAndQuery());
423
- routerEvents.emit("routeChangeComplete", resolved, { shallow: options?.shallow ?? false });
424
- const hash = resolved.includes("#") ? resolved.slice(resolved.indexOf("#")) : "";
425
- if (hash) scrollToHash(hash);
426
- else if (options?.scroll !== false) window.scrollTo(0, 0);
427
- window.dispatchEvent(new CustomEvent("vinext:navigate"));
428
- return true;
429
- }, []);
430
- const replace = useCallback(async (url, as, options) => {
431
- let resolved = resolveNavigationTarget(url, as, options?.locale);
432
- if (isExternalUrl(resolved)) {
433
- const localPath = toSameOriginAppPath(resolved, __basePath);
434
- if (localPath == null) {
435
- window.location.replace(resolved);
436
- return true;
437
- }
438
- resolved = localPath;
439
- }
440
- const full = toBrowserNavigationHref(resolved, window.location.href, __basePath);
441
- if (isHashOnlyChange(full)) {
442
- const eventUrl = resolveHashUrl(full);
443
- routerEvents.emit("hashChangeStart", eventUrl, { shallow: options?.shallow ?? false });
444
- const hash = resolved.includes("#") ? resolved.slice(resolved.indexOf("#")) : "";
445
- window.history.replaceState({}, "", resolved.startsWith("#") ? resolved : full);
446
- _lastPathnameAndSearch = window.location.pathname + window.location.search;
447
- scrollToHash(hash);
448
- setState(getPathnameAndQuery());
449
- routerEvents.emit("hashChangeComplete", eventUrl, { shallow: options?.shallow ?? false });
450
- window.dispatchEvent(new CustomEvent("vinext:navigate"));
451
- return true;
452
- }
453
- routerEvents.emit("routeChangeStart", resolved, { shallow: options?.shallow ?? false });
454
- routerEvents.emit("beforeHistoryChange", resolved, { shallow: options?.shallow ?? false });
455
- window.history.replaceState({}, "", full);
456
- _lastPathnameAndSearch = window.location.pathname + window.location.search;
457
- if (!options?.shallow) {
458
- const result = await runNavigateClient(full, resolved);
459
- if (result === "cancelled") return true;
460
- if (result === "failed") return false;
461
- }
462
- setState(getPathnameAndQuery());
463
- routerEvents.emit("routeChangeComplete", resolved, { shallow: options?.shallow ?? false });
464
- const hash = resolved.includes("#") ? resolved.slice(resolved.indexOf("#")) : "";
465
- if (hash) scrollToHash(hash);
466
- else if (options?.scroll !== false) window.scrollTo(0, 0);
467
- window.dispatchEvent(new CustomEvent("vinext:navigate"));
468
- return true;
469
- }, []);
470
- const back = useCallback(() => {
471
- window.history.back();
472
- }, []);
473
- const reload = useCallback(() => {
474
- window.location.reload();
475
- }, []);
476
- const prefetch = useCallback(async (url) => {
477
- if (typeof document !== "undefined") {
478
- const link = document.createElement("link");
479
- link.rel = "prefetch";
480
- link.href = url;
481
- link.as = "document";
482
- document.head.appendChild(link);
483
- }
484
- }, []);
485
- return useMemo(() => buildRouterValue(pathname, query, asPath, {
486
- push,
487
- replace,
488
- back,
489
- reload,
490
- prefetch,
491
- beforePopState: (cb) => {
492
- _beforePopStateCb = cb;
493
- }
593
+ const router = useMemo(() => buildRouterValue(pathname, query, asPath, {
594
+ push: Router.push,
595
+ replace: Router.replace,
596
+ back: Router.back,
597
+ reload: Router.reload,
598
+ prefetch: Router.prefetch,
599
+ beforePopState: Router.beforePopState
494
600
  }), [
495
601
  pathname,
496
602
  query,
497
- asPath,
498
- push,
499
- replace,
500
- back,
501
- reload,
502
- prefetch
603
+ asPath
503
604
  ]);
605
+ return createElement(RouterContext.Provider, { value: router }, children);
504
606
  }
505
607
  let _beforePopStateCb;
506
608
  let _lastPathnameAndSearch = typeof window !== "undefined" ? window.location.pathname + window.location.search : "";
507
- if (typeof window !== "undefined") window.addEventListener("popstate", (e) => {
609
+ function handlePagesRouterPopState(e) {
508
610
  const browserUrl = window.location.pathname + window.location.search;
509
611
  const appUrl = stripBasePath(window.location.pathname, __basePath) + window.location.search;
510
612
  const isHashOnly = browserUrl === _lastPathnameAndSearch;
@@ -519,42 +621,33 @@ if (typeof window !== "undefined") window.addEventListener("popstate", (e) => {
519
621
  if (isHashOnly) {
520
622
  const hashUrl = appUrl + window.location.hash;
521
623
  routerEvents.emit("hashChangeStart", hashUrl, { shallow: false });
522
- scrollToHash(window.location.hash);
624
+ scrollToHashTarget(window.location.hash);
523
625
  routerEvents.emit("hashChangeComplete", hashUrl, { shallow: false });
524
- window.dispatchEvent(new CustomEvent("vinext:navigate"));
626
+ dispatchNavigateEvent();
525
627
  return;
526
628
  }
527
629
  const fullAppUrl = appUrl + window.location.hash;
528
630
  routerEvents.emit("routeChangeStart", fullAppUrl, { shallow: false });
529
631
  routerEvents.emit("beforeHistoryChange", fullAppUrl, { shallow: false });
530
632
  (async () => {
531
- if (await runNavigateClient(browserUrl, fullAppUrl) === "completed") {
633
+ if (await runNavigateClient(browserUrl, fullAppUrl, getPagesHtmlFetchUrl(browserUrl, window.__VINEXT_LOCALE__)) === "completed") {
532
634
  routerEvents.emit("routeChangeComplete", fullAppUrl, { shallow: false });
533
635
  restoreScrollPosition(e.state);
534
- window.dispatchEvent(new CustomEvent("vinext:navigate"));
636
+ dispatchNavigateEvent();
535
637
  }
536
638
  })();
537
- });
639
+ }
640
+ setPagesRouterPopStateHandler(handlePagesRouterPopState);
538
641
  /**
539
642
  * Wrap a React element in a RouterContext.Provider so that
540
643
  * next/compat/router's useRouter() returns the real Pages Router value.
541
644
  *
542
- * This is a plain function, NOT a React component it builds the router
543
- * value object directly from the current SSR context (server) or
544
- * window.location + Router singleton (client), avoiding duplicate state
545
- * that a hook-based component would create.
645
+ * The provider owns the reactive Pages Router snapshot so next/router and
646
+ * next/compat/router consumers share one context value instead of each hook
647
+ * installing its own global URL-change listener.
546
648
  */
547
649
  function wrapWithRouterContext(element) {
548
- const { pathname, query, asPath } = getPathnameAndQuery();
549
- const routerValue = buildRouterValue(pathname, query, asPath, {
550
- push: Router.push,
551
- replace: Router.replace,
552
- back: Router.back,
553
- reload: Router.reload,
554
- prefetch: Router.prefetch,
555
- beforePopState: Router.beforePopState
556
- });
557
- return createElement(RouterContext.Provider, { value: routerValue }, element);
650
+ return createElement(PagesRouterProvider, null, element);
558
651
  }
559
652
  /**
560
653
  * Higher-order component that injects the Pages Router `router` instance as
@@ -588,102 +681,114 @@ function withRouter(ComposedComponent) {
588
681
  if (process.env.NODE_ENV !== "production") WithRouterWrapper.displayName = `withRouter(${composed.displayName || composed.name || "Unknown"})`;
589
682
  return WithRouterWrapper;
590
683
  }
591
- const Router = {
592
- push: async (url, as, options) => {
593
- let resolved = resolveNavigationTarget(url, as, options?.locale);
594
- if (isExternalUrl(resolved)) {
595
- const localPath = toSameOriginAppPath(resolved, __basePath);
596
- if (localPath == null) {
597
- window.location.assign(resolved);
598
- return true;
599
- }
600
- resolved = localPath;
684
+ const Router = Object.defineProperties({
685
+ push: (url, as, options) => {
686
+ if (typeof window === "undefined") throwNoRouterInstance();
687
+ return performNavigation(url, as, options, "push");
688
+ },
689
+ replace: (url, as, options) => {
690
+ if (typeof window === "undefined") throwNoRouterInstance();
691
+ return performNavigation(url, as, options, "replace");
692
+ },
693
+ back: () => {
694
+ if (typeof window === "undefined") throwNoRouterInstance();
695
+ window.history.back();
696
+ },
697
+ reload: () => {
698
+ if (typeof window === "undefined") throwNoRouterInstance();
699
+ window.location.reload();
700
+ },
701
+ prefetch: (url) => {
702
+ if (typeof window === "undefined") throwNoRouterInstance();
703
+ return prefetchUrl(url);
704
+ },
705
+ beforePopState: (cb) => {
706
+ if (typeof window === "undefined") throwNoRouterInstance();
707
+ _beforePopStateCb = cb;
708
+ },
709
+ events: routerEvents
710
+ }, {
711
+ pathname: {
712
+ enumerable: true,
713
+ get() {
714
+ return getPathnameAndQuery().pathname;
601
715
  }
602
- const full = toBrowserNavigationHref(resolved, window.location.href, __basePath);
603
- if (isHashOnlyChange(full)) {
604
- const eventUrl = resolveHashUrl(full);
605
- routerEvents.emit("hashChangeStart", eventUrl, { shallow: options?.shallow ?? false });
606
- const hash = resolved.includes("#") ? resolved.slice(resolved.indexOf("#")) : "";
607
- window.history.pushState({}, "", resolved.startsWith("#") ? resolved : full);
608
- _lastPathnameAndSearch = window.location.pathname + window.location.search;
609
- scrollToHash(hash);
610
- routerEvents.emit("hashChangeComplete", eventUrl, { shallow: options?.shallow ?? false });
611
- window.dispatchEvent(new CustomEvent("vinext:navigate"));
612
- return true;
716
+ },
717
+ route: {
718
+ enumerable: true,
719
+ get() {
720
+ const { pathname } = getPathnameAndQuery();
721
+ if (typeof window === "undefined") return pathname;
722
+ return window.__NEXT_DATA__?.page ?? pathname;
723
+ }
724
+ },
725
+ query: {
726
+ enumerable: true,
727
+ get() {
728
+ return getPathnameAndQuery().query;
613
729
  }
614
- saveScrollPosition();
615
- routerEvents.emit("routeChangeStart", resolved, { shallow: options?.shallow ?? false });
616
- routerEvents.emit("beforeHistoryChange", resolved, { shallow: options?.shallow ?? false });
617
- window.history.pushState({}, "", full);
618
- _lastPathnameAndSearch = window.location.pathname + window.location.search;
619
- if (!options?.shallow) {
620
- const result = await runNavigateClient(full, resolved);
621
- if (result === "cancelled") return true;
622
- if (result === "failed") return false;
730
+ },
731
+ asPath: {
732
+ enumerable: true,
733
+ get() {
734
+ return getPathnameAndQuery().asPath;
623
735
  }
624
- routerEvents.emit("routeChangeComplete", resolved, { shallow: options?.shallow ?? false });
625
- const hash = resolved.includes("#") ? resolved.slice(resolved.indexOf("#")) : "";
626
- if (hash) scrollToHash(hash);
627
- else if (options?.scroll !== false) window.scrollTo(0, 0);
628
- window.dispatchEvent(new CustomEvent("vinext:navigate"));
629
- return true;
630
736
  },
631
- replace: async (url, as, options) => {
632
- let resolved = resolveNavigationTarget(url, as, options?.locale);
633
- if (isExternalUrl(resolved)) {
634
- const localPath = toSameOriginAppPath(resolved, __basePath);
635
- if (localPath == null) {
636
- window.location.replace(resolved);
637
- return true;
638
- }
639
- resolved = localPath;
737
+ basePath: {
738
+ enumerable: true,
739
+ value: __basePath,
740
+ writable: false
741
+ },
742
+ locale: {
743
+ enumerable: true,
744
+ get() {
745
+ if (typeof window === "undefined") return _getSSRContext()?.locale;
746
+ return window.__VINEXT_LOCALE__;
640
747
  }
641
- const full = toBrowserNavigationHref(resolved, window.location.href, __basePath);
642
- if (isHashOnlyChange(full)) {
643
- const eventUrl = resolveHashUrl(full);
644
- routerEvents.emit("hashChangeStart", eventUrl, { shallow: options?.shallow ?? false });
645
- const hash = resolved.includes("#") ? resolved.slice(resolved.indexOf("#")) : "";
646
- window.history.replaceState({}, "", resolved.startsWith("#") ? resolved : full);
647
- _lastPathnameAndSearch = window.location.pathname + window.location.search;
648
- scrollToHash(hash);
649
- routerEvents.emit("hashChangeComplete", eventUrl, { shallow: options?.shallow ?? false });
650
- window.dispatchEvent(new CustomEvent("vinext:navigate"));
651
- return true;
748
+ },
749
+ locales: {
750
+ enumerable: true,
751
+ get() {
752
+ if (typeof window === "undefined") return _getSSRContext()?.locales;
753
+ return window.__VINEXT_LOCALES__;
652
754
  }
653
- routerEvents.emit("routeChangeStart", resolved, { shallow: options?.shallow ?? false });
654
- routerEvents.emit("beforeHistoryChange", resolved, { shallow: options?.shallow ?? false });
655
- window.history.replaceState({}, "", full);
656
- _lastPathnameAndSearch = window.location.pathname + window.location.search;
657
- if (!options?.shallow) {
658
- const result = await runNavigateClient(full, resolved);
659
- if (result === "cancelled") return true;
660
- if (result === "failed") return false;
755
+ },
756
+ defaultLocale: {
757
+ enumerable: true,
758
+ get() {
759
+ if (typeof window === "undefined") return _getSSRContext()?.defaultLocale;
760
+ return window.__VINEXT_DEFAULT_LOCALE__;
661
761
  }
662
- routerEvents.emit("routeChangeComplete", resolved, { shallow: options?.shallow ?? false });
663
- const hash = resolved.includes("#") ? resolved.slice(resolved.indexOf("#")) : "";
664
- if (hash) scrollToHash(hash);
665
- else if (options?.scroll !== false) window.scrollTo(0, 0);
666
- window.dispatchEvent(new CustomEvent("vinext:navigate"));
667
- return true;
668
762
  },
669
- back: () => window.history.back(),
670
- reload: () => window.location.reload(),
671
- prefetch: async (url) => {
672
- if (typeof document !== "undefined") {
673
- const link = document.createElement("link");
674
- link.rel = "prefetch";
675
- link.href = url;
676
- link.as = "document";
677
- document.head.appendChild(link);
763
+ domainLocales: {
764
+ enumerable: true,
765
+ get() {
766
+ if (typeof window === "undefined") return _getSSRContext()?.domainLocales;
767
+ return window.__NEXT_DATA__?.domainLocales;
678
768
  }
679
769
  },
680
- beforePopState: (cb) => {
681
- _beforePopStateCb = cb;
770
+ isReady: {
771
+ enumerable: true,
772
+ value: true,
773
+ writable: false
682
774
  },
683
- events: routerEvents
684
- };
775
+ isPreview: {
776
+ enumerable: true,
777
+ value: false,
778
+ writable: false
779
+ },
780
+ isFallback: {
781
+ enumerable: true,
782
+ get() {
783
+ if (typeof window === "undefined") return _getSSRContext()?.isFallback === true;
784
+ return window.__NEXT_DATA__?.isFallback === true;
785
+ }
786
+ }
787
+ });
685
788
  if (typeof window !== "undefined") installWindowNext({ router: Router });
789
+ const _PAGES_NAVIGATION_ACCESSOR_KEY = Symbol.for("vinext.navigation.pagesNavigationContextAccessor");
790
+ globalThis[_PAGES_NAVIGATION_ACCESSOR_KEY] = getPagesNavigationContext;
686
791
  //#endregion
687
- export { _registerRouterStateAccessors, applyNavigationLocale, Router as default, isExternalUrl, isHashOnlyChange, setSSRContext, useRouter, withRouter, wrapWithRouterContext };
792
+ export { _registerRouterStateAccessors, applyNavigationLocale, Router as default, getPagesNavigationContext, isExternalUrl, isHashOnlyChange, setSSRContext, useRouter, withRouter, wrapWithRouterContext };
688
793
 
689
794
  //# sourceMappingURL=router.js.map