vinext 0.0.50 → 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 (309) 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 +12 -3
  8. package/dist/build/precompress.js.map +1 -1
  9. package/dist/build/prerender.d.ts +1 -1
  10. package/dist/build/prerender.js +44 -14
  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 +1 -0
  16. package/dist/check.js.map +1 -1
  17. package/dist/cli.js +60 -3
  18. package/dist/cli.js.map +1 -1
  19. package/dist/client/window-next.d.ts +3 -1
  20. package/dist/client/window-next.js.map +1 -1
  21. package/dist/config/dotenv.d.ts +11 -1
  22. package/dist/config/dotenv.js.map +1 -1
  23. package/dist/config/next-config.d.ts +87 -3
  24. package/dist/config/next-config.js +222 -6
  25. package/dist/config/next-config.js.map +1 -1
  26. package/dist/config/tsconfig-paths.d.ts +13 -0
  27. package/dist/config/tsconfig-paths.js +117 -0
  28. package/dist/config/tsconfig-paths.js.map +1 -0
  29. package/dist/deploy.js +3 -2
  30. package/dist/deploy.js.map +1 -1
  31. package/dist/entries/app-browser-entry.d.ts +2 -2
  32. package/dist/entries/app-browser-entry.js +26 -1
  33. package/dist/entries/app-browser-entry.js.map +1 -1
  34. package/dist/entries/app-rsc-entry.d.ts +19 -1
  35. package/dist/entries/app-rsc-entry.js +38 -12
  36. package/dist/entries/app-rsc-entry.js.map +1 -1
  37. package/dist/entries/app-rsc-manifest.d.ts +9 -0
  38. package/dist/entries/app-rsc-manifest.js +4 -1
  39. package/dist/entries/app-rsc-manifest.js.map +1 -1
  40. package/dist/entries/pages-client-entry.js +3 -5
  41. package/dist/entries/pages-client-entry.js.map +1 -1
  42. package/dist/entries/pages-server-entry.js +19 -1
  43. package/dist/entries/pages-server-entry.js.map +1 -1
  44. package/dist/index.js +130 -37
  45. package/dist/index.js.map +1 -1
  46. package/dist/plugins/client-reference-dedup.d.ts +15 -2
  47. package/dist/plugins/client-reference-dedup.js +138 -16
  48. package/dist/plugins/client-reference-dedup.js.map +1 -1
  49. package/dist/plugins/fonts.d.ts +2 -2
  50. package/dist/plugins/fonts.js +15 -6
  51. package/dist/plugins/fonts.js.map +1 -1
  52. package/dist/plugins/sass.d.ts +34 -0
  53. package/dist/plugins/sass.js +22 -0
  54. package/dist/plugins/sass.js.map +1 -0
  55. package/dist/routing/app-route-graph.d.ts +31 -2
  56. package/dist/routing/app-route-graph.js +82 -10
  57. package/dist/routing/app-route-graph.js.map +1 -1
  58. package/dist/routing/route-pattern.d.ts +56 -1
  59. package/dist/routing/route-pattern.js +60 -1
  60. package/dist/routing/route-pattern.js.map +1 -1
  61. package/dist/server/app-browser-action-result.d.ts +27 -2
  62. package/dist/server/app-browser-action-result.js +63 -2
  63. package/dist/server/app-browser-action-result.js.map +1 -1
  64. package/dist/server/app-browser-entry.js +262 -108
  65. package/dist/server/app-browser-entry.js.map +1 -1
  66. package/dist/server/app-browser-hydration.d.ts +13 -1
  67. package/dist/server/app-browser-hydration.js +9 -1
  68. package/dist/server/app-browser-hydration.js.map +1 -1
  69. package/dist/server/app-browser-navigation-controller.d.ts +14 -1
  70. package/dist/server/app-browser-navigation-controller.js +28 -9
  71. package/dist/server/app-browser-navigation-controller.js.map +1 -1
  72. package/dist/server/app-browser-popstate.d.ts +16 -0
  73. package/dist/server/app-browser-popstate.js +17 -0
  74. package/dist/server/app-browser-popstate.js.map +1 -0
  75. package/dist/server/app-browser-rsc-redirect.d.ts +28 -0
  76. package/dist/server/app-browser-rsc-redirect.js +37 -0
  77. package/dist/server/app-browser-rsc-redirect.js.map +1 -0
  78. package/dist/server/app-browser-state.d.ts +11 -7
  79. package/dist/server/app-browser-state.js +45 -27
  80. package/dist/server/app-browser-state.js.map +1 -1
  81. package/dist/server/app-browser-stream.d.ts +5 -4
  82. package/dist/server/app-browser-stream.js +5 -6
  83. package/dist/server/app-browser-stream.js.map +1 -1
  84. package/dist/server/app-browser-visible-commit.d.ts +5 -0
  85. package/dist/server/app-browser-visible-commit.js +38 -5
  86. package/dist/server/app-browser-visible-commit.js.map +1 -1
  87. package/dist/server/app-elements-wire.d.ts +38 -6
  88. package/dist/server/app-elements-wire.js +106 -6
  89. package/dist/server/app-elements-wire.js.map +1 -1
  90. package/dist/server/app-elements.d.ts +2 -2
  91. package/dist/server/app-elements.js +2 -2
  92. package/dist/server/app-elements.js.map +1 -1
  93. package/dist/server/app-fallback-renderer.d.ts +10 -1
  94. package/dist/server/app-fallback-renderer.js +37 -1
  95. package/dist/server/app-fallback-renderer.js.map +1 -1
  96. package/dist/server/app-history-state.d.ts +26 -0
  97. package/dist/server/app-history-state.js +53 -0
  98. package/dist/server/app-history-state.js.map +1 -0
  99. package/dist/server/app-page-boundary-render.d.ts +10 -1
  100. package/dist/server/app-page-boundary-render.js +13 -6
  101. package/dist/server/app-page-boundary-render.js.map +1 -1
  102. package/dist/server/app-page-boundary.js +3 -2
  103. package/dist/server/app-page-boundary.js.map +1 -1
  104. package/dist/server/app-page-cache.d.ts +13 -0
  105. package/dist/server/app-page-cache.js +25 -8
  106. package/dist/server/app-page-cache.js.map +1 -1
  107. package/dist/server/app-page-dispatch.d.ts +5 -0
  108. package/dist/server/app-page-dispatch.js +68 -11
  109. package/dist/server/app-page-dispatch.js.map +1 -1
  110. package/dist/server/app-page-element-builder.d.ts +7 -0
  111. package/dist/server/app-page-element-builder.js +32 -4
  112. package/dist/server/app-page-element-builder.js.map +1 -1
  113. package/dist/server/app-page-execution.js +2 -3
  114. package/dist/server/app-page-execution.js.map +1 -1
  115. package/dist/server/app-page-head.d.ts +7 -0
  116. package/dist/server/app-page-head.js +2 -1
  117. package/dist/server/app-page-head.js.map +1 -1
  118. package/dist/server/app-page-probe.d.ts +23 -1
  119. package/dist/server/app-page-probe.js +29 -1
  120. package/dist/server/app-page-probe.js.map +1 -1
  121. package/dist/server/app-page-render-observation.d.ts +35 -0
  122. package/dist/server/app-page-render-observation.js +68 -0
  123. package/dist/server/app-page-render-observation.js.map +1 -0
  124. package/dist/server/app-page-render.d.ts +5 -1
  125. package/dist/server/app-page-render.js +79 -3
  126. package/dist/server/app-page-render.js.map +1 -1
  127. package/dist/server/app-page-request.d.ts +1 -0
  128. package/dist/server/app-page-request.js.map +1 -1
  129. package/dist/server/app-page-response.js +3 -2
  130. package/dist/server/app-page-response.js.map +1 -1
  131. package/dist/server/app-page-route-wiring.d.ts +3 -1
  132. package/dist/server/app-page-route-wiring.js +42 -14
  133. package/dist/server/app-page-route-wiring.js.map +1 -1
  134. package/dist/server/app-page-stream.d.ts +2 -0
  135. package/dist/server/app-page-stream.js +1 -0
  136. package/dist/server/app-page-stream.js.map +1 -1
  137. package/dist/server/app-router-entry.js +1 -13
  138. package/dist/server/app-router-entry.js.map +1 -1
  139. package/dist/server/app-rsc-cache-busting.d.ts +19 -1
  140. package/dist/server/app-rsc-cache-busting.js +36 -1
  141. package/dist/server/app-rsc-cache-busting.js.map +1 -1
  142. package/dist/server/app-rsc-embedded-chunks.d.ts +9 -0
  143. package/dist/server/app-rsc-embedded-chunks.js +34 -0
  144. package/dist/server/app-rsc-embedded-chunks.js.map +1 -0
  145. package/dist/server/app-rsc-errors.d.ts +4 -1
  146. package/dist/server/app-rsc-errors.js +1 -1
  147. package/dist/server/app-rsc-errors.js.map +1 -1
  148. package/dist/server/app-rsc-handler.d.ts +12 -4
  149. package/dist/server/app-rsc-handler.js +6 -1
  150. package/dist/server/app-rsc-handler.js.map +1 -1
  151. package/dist/server/app-rsc-route-matching.d.ts +23 -0
  152. package/dist/server/app-rsc-route-matching.js +45 -23
  153. package/dist/server/app-rsc-route-matching.js.map +1 -1
  154. package/dist/server/app-server-action-execution.d.ts +35 -3
  155. package/dist/server/app-server-action-execution.js +87 -33
  156. package/dist/server/app-server-action-execution.js.map +1 -1
  157. package/dist/server/app-ssr-entry.d.ts +1 -0
  158. package/dist/server/app-ssr-entry.js +37 -13
  159. package/dist/server/app-ssr-entry.js.map +1 -1
  160. package/dist/server/app-ssr-error-meta.d.ts +14 -0
  161. package/dist/server/app-ssr-error-meta.js +50 -0
  162. package/dist/server/app-ssr-error-meta.js.map +1 -0
  163. package/dist/server/app-ssr-stream.d.ts +1 -1
  164. package/dist/server/app-ssr-stream.js +9 -12
  165. package/dist/server/app-ssr-stream.js.map +1 -1
  166. package/dist/server/artifact-compatibility.d.ts +12 -2
  167. package/dist/server/artifact-compatibility.js +12 -8
  168. package/dist/server/artifact-compatibility.js.map +1 -1
  169. package/dist/server/cache-proof.d.ts +124 -5
  170. package/dist/server/cache-proof.js +416 -18
  171. package/dist/server/cache-proof.js.map +1 -1
  172. package/dist/server/dev-lockfile.d.ts +110 -0
  173. package/dist/server/dev-lockfile.js +180 -0
  174. package/dist/server/dev-lockfile.js.map +1 -0
  175. package/dist/server/dev-server.js +15 -5
  176. package/dist/server/dev-server.js.map +1 -1
  177. package/dist/server/file-based-metadata.d.ts +13 -0
  178. package/dist/server/file-based-metadata.js +49 -2
  179. package/dist/server/file-based-metadata.js.map +1 -1
  180. package/dist/server/headers.d.ts +3 -1
  181. package/dist/server/headers.js +5 -2
  182. package/dist/server/headers.js.map +1 -1
  183. package/dist/server/html.js +1 -1
  184. package/dist/server/html.js.map +1 -1
  185. package/dist/server/http-error-responses.d.ts +10 -0
  186. package/dist/server/http-error-responses.js +11 -1
  187. package/dist/server/http-error-responses.js.map +1 -1
  188. package/dist/server/isr-cache.d.ts +2 -1
  189. package/dist/server/isr-cache.js +4 -2
  190. package/dist/server/isr-cache.js.map +1 -1
  191. package/dist/server/metadata-route-response.js +22 -5
  192. package/dist/server/metadata-route-response.js.map +1 -1
  193. package/dist/server/metadata-routes.js +27 -8
  194. package/dist/server/metadata-routes.js.map +1 -1
  195. package/dist/server/middleware-runtime.js +1 -0
  196. package/dist/server/middleware-runtime.js.map +1 -1
  197. package/dist/server/middleware.d.ts +12 -0
  198. package/dist/server/middleware.js +12 -0
  199. package/dist/server/middleware.js.map +1 -1
  200. package/dist/server/navigation-planner.d.ts +19 -5
  201. package/dist/server/navigation-planner.js +278 -17
  202. package/dist/server/navigation-planner.js.map +1 -1
  203. package/dist/server/navigation-trace.d.ts +8 -1
  204. package/dist/server/navigation-trace.js +7 -0
  205. package/dist/server/navigation-trace.js.map +1 -1
  206. package/dist/server/normalize-path.d.ts +2 -1
  207. package/dist/server/normalize-path.js +4 -1
  208. package/dist/server/normalize-path.js.map +1 -1
  209. package/dist/server/pages-api-route.js +1 -0
  210. package/dist/server/pages-api-route.js.map +1 -1
  211. package/dist/server/pages-page-data.d.ts +3 -2
  212. package/dist/server/pages-page-data.js +22 -3
  213. package/dist/server/pages-page-data.js.map +1 -1
  214. package/dist/server/pages-page-response.js +1 -1
  215. package/dist/server/prod-server.d.ts +28 -1
  216. package/dist/server/prod-server.js +62 -9
  217. package/dist/server/prod-server.js.map +1 -1
  218. package/dist/server/server-action-not-found.d.ts +16 -3
  219. package/dist/server/server-action-not-found.js +19 -1
  220. package/dist/server/server-action-not-found.js.map +1 -1
  221. package/dist/server/server-globals.d.ts +5 -0
  222. package/dist/server/server-globals.js +37 -0
  223. package/dist/server/server-globals.js.map +1 -0
  224. package/dist/server/static-file-cache.js +1 -1
  225. package/dist/server/static-file-cache.js.map +1 -1
  226. package/dist/shims/cache-runtime.d.ts +19 -2
  227. package/dist/shims/cache-runtime.js +67 -11
  228. package/dist/shims/cache-runtime.js.map +1 -1
  229. package/dist/shims/cache.d.ts +5 -18
  230. package/dist/shims/cache.js +2 -0
  231. package/dist/shims/cache.js.map +1 -1
  232. package/dist/shims/error-boundary.js +6 -8
  233. package/dist/shims/error-boundary.js.map +1 -1
  234. package/dist/shims/error.d.ts +18 -1
  235. package/dist/shims/error.js +56 -1
  236. package/dist/shims/error.js.map +1 -1
  237. package/dist/shims/fetch-cache.d.ts +4 -1
  238. package/dist/shims/fetch-cache.js +40 -5
  239. package/dist/shims/fetch-cache.js.map +1 -1
  240. package/dist/shims/font-google-base.d.ts +22 -8
  241. package/dist/shims/font-google-base.js +41 -71
  242. package/dist/shims/font-google-base.js.map +1 -1
  243. package/dist/shims/font-local.d.ts +3 -20
  244. package/dist/shims/font-local.js +23 -75
  245. package/dist/shims/font-local.js.map +1 -1
  246. package/dist/shims/font-utils.d.ts +51 -0
  247. package/dist/shims/font-utils.js +97 -0
  248. package/dist/shims/font-utils.js.map +1 -0
  249. package/dist/shims/hash-scroll.d.ts +7 -0
  250. package/dist/shims/hash-scroll.js +30 -0
  251. package/dist/shims/hash-scroll.js.map +1 -0
  252. package/dist/shims/headers.d.ts +8 -11
  253. package/dist/shims/headers.js +22 -2
  254. package/dist/shims/headers.js.map +1 -1
  255. package/dist/shims/image.d.ts +1 -0
  256. package/dist/shims/image.js +144 -78
  257. package/dist/shims/image.js.map +1 -1
  258. package/dist/shims/internal/app-router-context.d.ts +6 -6
  259. package/dist/shims/internal/app-router-context.js +17 -6
  260. package/dist/shims/internal/app-router-context.js.map +1 -1
  261. package/dist/shims/link-prefetch.d.ts +9 -1
  262. package/dist/shims/link-prefetch.js +11 -6
  263. package/dist/shims/link-prefetch.js.map +1 -1
  264. package/dist/shims/link.d.ts +12 -2
  265. package/dist/shims/link.js +78 -32
  266. package/dist/shims/link.js.map +1 -1
  267. package/dist/shims/metadata.d.ts +16 -30
  268. package/dist/shims/metadata.js +87 -28
  269. package/dist/shims/metadata.js.map +1 -1
  270. package/dist/shims/navigation.d.ts +158 -17
  271. package/dist/shims/navigation.js +324 -74
  272. package/dist/shims/navigation.js.map +1 -1
  273. package/dist/shims/navigation.react-server.d.ts +3 -2
  274. package/dist/shims/navigation.react-server.js +5 -2
  275. package/dist/shims/navigation.react-server.js.map +1 -1
  276. package/dist/shims/pages-router-runtime.d.ts +7 -0
  277. package/dist/shims/pages-router-runtime.js +16 -0
  278. package/dist/shims/pages-router-runtime.js.map +1 -0
  279. package/dist/shims/router.d.ts +32 -6
  280. package/dist/shims/router.js +197 -242
  281. package/dist/shims/router.js.map +1 -1
  282. package/dist/shims/script.js +110 -32
  283. package/dist/shims/script.js.map +1 -1
  284. package/dist/shims/server.js +2 -1
  285. package/dist/shims/server.js.map +1 -1
  286. package/dist/shims/slot.d.ts +1 -0
  287. package/dist/shims/slot.js +41 -1
  288. package/dist/shims/slot.js.map +1 -1
  289. package/dist/shims/unified-request-context.js +2 -0
  290. package/dist/shims/unified-request-context.js.map +1 -1
  291. package/dist/shims/unrecognized-action-error.d.ts +35 -0
  292. package/dist/shims/unrecognized-action-error.js +41 -0
  293. package/dist/shims/unrecognized-action-error.js.map +1 -0
  294. package/dist/shims/url-utils.d.ts +21 -1
  295. package/dist/shims/url-utils.js +67 -3
  296. package/dist/shims/url-utils.js.map +1 -1
  297. package/dist/utils/asset-prefix.d.ts +69 -0
  298. package/dist/utils/asset-prefix.js +91 -0
  299. package/dist/utils/asset-prefix.js.map +1 -0
  300. package/dist/utils/base-path.d.ts +7 -1
  301. package/dist/utils/base-path.js +10 -1
  302. package/dist/utils/base-path.js.map +1 -1
  303. package/dist/utils/navigation-signal.d.ts +1 -2
  304. package/dist/utils/navigation-signal.js +1 -1
  305. package/dist/utils/navigation-signal.js.map +1 -1
  306. package/dist/utils/sorted-array.d.ts +9 -0
  307. package/dist/utils/sorted-array.js +22 -0
  308. package/dist/utils/sorted-array.js.map +1 -0
  309. package/package.json +3 -3
@@ -1,11 +1,14 @@
1
1
  import { stripBasePath } from "../utils/base-path.js";
2
+ import { matchRoutePattern, routePatternParts } from "../routing/route-pattern.js";
2
3
  import { RouterContext } from "./internal/router-context.js";
3
4
  import { isValidModulePath } from "../client/validate-module-path.js";
4
5
  import { installWindowNext } from "../client/window-next.js";
5
- import { isHashOnlyBrowserUrlChange, toBrowserNavigationHref, toSameOriginAppPath } from "./url-utils.js";
6
+ import { isAbsoluteOrProtocolRelativeUrl, isHashOnlyBrowserUrlChange, toBrowserNavigationHref, toSameOriginAppPath } from "./url-utils.js";
6
7
  import { addLocalePrefix, getDomainLocaleUrl } from "../utils/domain-locale.js";
7
8
  import { addQueryParam, appendSearchParamsToUrl, urlQueryToSearchParams } from "../utils/query.js";
8
- import { createElement, useCallback, useEffect, useMemo, useState } from "react";
9
+ import { scrollToHashTarget } from "./hash-scroll.js";
10
+ import { setPagesRouterPopStateHandler } from "./pages-router-runtime.js";
11
+ import { createElement, useContext, useEffect, useMemo, useState } from "react";
9
12
  //#region src/shims/router.ts
10
13
  /**
11
14
  * next/router shim
@@ -70,14 +73,14 @@ function getDomainLocalePath(url, locale) {
70
73
  */
71
74
  function applyNavigationLocale(url, locale) {
72
75
  if (!locale || typeof window === "undefined") return url;
73
- if (url.startsWith("http://") || url.startsWith("https://") || url.startsWith("//")) return url;
76
+ if (isAbsoluteOrProtocolRelativeUrl(url)) return url;
74
77
  const domainLocalePath = getDomainLocalePath(url, locale);
75
78
  if (domainLocalePath) return domainLocalePath;
76
79
  return addLocalePrefix(url, locale, window.__VINEXT_DEFAULT_LOCALE__ ?? "");
77
80
  }
78
81
  /** Check if a URL is external (any URL scheme per RFC 3986, or protocol-relative) */
79
82
  function isExternalUrl(url) {
80
- return /^[a-z][a-z0-9+.-]*:/i.test(url) || url.startsWith("//");
83
+ return isAbsoluteOrProtocolRelativeUrl(url);
81
84
  }
82
85
  /** Resolve a hash URL to a basePath-stripped app URL for event payloads */
83
86
  function resolveHashUrl(url) {
@@ -96,15 +99,6 @@ function isHashOnlyChange(href) {
96
99
  if (typeof window === "undefined") return false;
97
100
  return isHashOnlyBrowserUrlChange(href, window.location.href, __basePath);
98
101
  }
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
102
  /** Save current scroll position into history state for back/forward restoration */
109
103
  function saveScrollPosition() {
110
104
  const state = window.history.state ?? {};
@@ -137,6 +131,60 @@ function _registerRouterStateAccessors(accessors) {
137
131
  function setSSRContext(ctx) {
138
132
  _setSSRContextImpl(ctx);
139
133
  }
134
+ let _cachedClientPagesNavCtx = null;
135
+ let _cachedClientPagesNavCtxKey = null;
136
+ function _buildClientPagesNavigationContext(routePattern, resolvedPath, searchString) {
137
+ const cacheKey = `${routePattern}|${resolvedPath}|${searchString}`;
138
+ if (_cachedClientPagesNavCtxKey === cacheKey && _cachedClientPagesNavCtx) return _cachedClientPagesNavCtx;
139
+ const ctx = {
140
+ pathname: resolvedPath,
141
+ searchParams: new URLSearchParams(searchString),
142
+ params: routePattern ? extractRouteParamsFromPath(routePattern, resolvedPath) ?? {} : {}
143
+ };
144
+ _cachedClientPagesNavCtx = ctx;
145
+ _cachedClientPagesNavCtxKey = cacheKey;
146
+ return ctx;
147
+ }
148
+ /**
149
+ * Cross-router compat shim source for `next/navigation` hooks.
150
+ *
151
+ * Returns the current Pages Router state shaped as a navigation context so
152
+ * the App Router hooks (useParams/useSearchParams/usePathname) can act as
153
+ * compat shims when invoked inside a Pages Router render. Mirrors Next.js's
154
+ * `adaptForPathParams` and `adaptForSearchParams` in
155
+ * .nextjs-ref/packages/next/src/shared/lib/router/adapters.tsx, which Next.js
156
+ * uses to populate SearchParamsContext / PathParamsContext for the Pages
157
+ * Router (see packages/next/src/server/render.tsx and
158
+ * packages/next/src/client/index.tsx).
159
+ *
160
+ * Returns `null` when there is no Pages Router state available — e.g. App
161
+ * Router pages, RSC-only renders, or pre-router renders. Callers should
162
+ * treat null as "App Router context, use normal app-router state".
163
+ */
164
+ function getPagesNavigationContext() {
165
+ if (typeof window === "undefined") {
166
+ const ssrCtx = _getSSRContext();
167
+ if (!ssrCtx) return null;
168
+ let searchParams;
169
+ let resolvedPath;
170
+ try {
171
+ const url = new URL(ssrCtx.asPath, "http://_");
172
+ searchParams = url.searchParams;
173
+ resolvedPath = url.pathname;
174
+ } catch {
175
+ searchParams = new URLSearchParams();
176
+ resolvedPath = ssrCtx.pathname;
177
+ }
178
+ const params = extractRouteParamsFromPath(ssrCtx.pathname, resolvedPath) ?? {};
179
+ return {
180
+ pathname: resolvedPath,
181
+ searchParams,
182
+ params
183
+ };
184
+ }
185
+ const resolvedPath = stripBasePath(window.location.pathname, __basePath);
186
+ return _buildClientPagesNavigationContext(window.__NEXT_DATA__?.page ?? "", resolvedPath, window.location.search);
187
+ }
140
188
  /**
141
189
  * Extract param names from a Next.js route pattern.
142
190
  * E.g., "/posts/[id]" → ["id"], "/docs/[...slug]" → ["slug"],
@@ -152,6 +200,26 @@ function extractRouteParamNames(pattern) {
152
200
  for (const m of colonMatches) names.push(m[1]);
153
201
  return names;
154
202
  }
203
+ function splitPathSegments(pathname) {
204
+ return pathname.split("/").filter(Boolean);
205
+ }
206
+ function extractRouteParamsFromPath(pattern, pathname) {
207
+ return matchRoutePattern(splitPathSegments(pathname), routePatternParts(pattern));
208
+ }
209
+ function getRouteQueryFromNextData(nextData, resolvedPath) {
210
+ const routeQuery = {};
211
+ if (!nextData?.query || !nextData.page) return routeQuery;
212
+ const routeParamNames = extractRouteParamNames(nextData.page);
213
+ if (routeParamNames.length === 0) return routeQuery;
214
+ const currentRouteParams = extractRouteParamsFromPath(nextData.page, resolvedPath);
215
+ if (currentRouteParams) return currentRouteParams;
216
+ for (const key of routeParamNames) {
217
+ const value = nextData.query[key];
218
+ if (typeof value === "string") routeQuery[key] = value;
219
+ else if (Array.isArray(value)) routeQuery[key] = [...value];
220
+ }
221
+ return routeQuery;
222
+ }
155
223
  function getPathnameAndQuery() {
156
224
  if (typeof window === "undefined") {
157
225
  const _ssrCtx = _getSSRContext();
@@ -172,16 +240,8 @@ function getPathnameAndQuery() {
172
240
  }
173
241
  const resolvedPath = stripBasePath(window.location.pathname, __basePath);
174
242
  const pathname = window.__NEXT_DATA__?.page ?? resolvedPath;
175
- const routeQuery = {};
176
243
  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
- }
244
+ const routeQuery = getRouteQueryFromNextData(nextData, resolvedPath);
185
245
  const searchQuery = {};
186
246
  const params = new URLSearchParams(window.location.search);
187
247
  for (const [key, value] of params) addQueryParam(searchQuery, key, value);
@@ -346,9 +406,8 @@ async function runNavigateClient(fullUrl, resolvedUrl) {
346
406
  }
347
407
  /**
348
408
  * 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.
409
+ * and a set of navigation methods. Shared by the Pages Router context provider
410
+ * and tests so the public router shape stays in sync.
352
411
  */
353
412
  function buildRouterValue(pathname, query, asPath, methods) {
354
413
  const _ssrState = _getSSRContext();
@@ -374,10 +433,98 @@ function buildRouterValue(pathname, query, asPath, methods) {
374
433
  events: routerEvents
375
434
  };
376
435
  }
436
+ /** Extract the hash fragment from a URL, including the leading `#`. */
437
+ function extractHash(url) {
438
+ const i = url.indexOf("#");
439
+ return i === -1 ? "" : url.slice(i);
440
+ }
441
+ /** Notify in-page listeners (e.g. useRouter hooks) that navigation occurred. */
442
+ function dispatchNavigateEvent() {
443
+ window.dispatchEvent(new CustomEvent("vinext:navigate"));
444
+ }
445
+ /**
446
+ * Update history with the new URL and refresh the hash-only-detection tracker.
447
+ * Centralises the `pushState`/`replaceState` branch so callers don't repeat it.
448
+ */
449
+ function updateHistory(mode, url) {
450
+ if (mode === "push") window.history.pushState({}, "", url);
451
+ else window.history.replaceState({}, "", url);
452
+ _lastPathnameAndSearch = window.location.pathname + window.location.search;
453
+ }
454
+ /**
455
+ * Shared client-side navigation flow used by both `useRouter()` and the
456
+ * `Router` singleton. The only differences between push/replace are the
457
+ * history method (`pushState` vs `replaceState`), the external-URL fallback
458
+ * (`assign` vs `replace`), and the fact that push saves scroll position for
459
+ * back/forward restoration while replace does not.
460
+ *
461
+ * `onStateUpdate` lets the hook trigger a `setState` re-render at the same
462
+ * point that hashChangeComplete/routeChangeComplete fires; the singleton
463
+ * passes no callback.
464
+ */
465
+ async function performNavigation(url, as, options, mode, onStateUpdate) {
466
+ let resolved = resolveNavigationTarget(url, as, options?.locale);
467
+ if (isExternalUrl(resolved)) {
468
+ const localPath = toSameOriginAppPath(resolved, __basePath);
469
+ if (localPath == null) {
470
+ if (mode === "push") window.location.assign(resolved);
471
+ else window.location.replace(resolved);
472
+ return true;
473
+ }
474
+ resolved = localPath;
475
+ }
476
+ const full = toBrowserNavigationHref(resolved, window.location.href, __basePath);
477
+ const shallow = options?.shallow ?? false;
478
+ const doScroll = options?.scroll !== false;
479
+ if (isHashOnlyChange(full)) {
480
+ const eventUrl = resolveHashUrl(full);
481
+ routerEvents.emit("hashChangeStart", eventUrl, { shallow });
482
+ updateHistory(mode, resolved.startsWith("#") ? resolved : full);
483
+ if (doScroll) scrollToHashTarget(extractHash(resolved));
484
+ onStateUpdate?.();
485
+ routerEvents.emit("hashChangeComplete", eventUrl, { shallow });
486
+ dispatchNavigateEvent();
487
+ return true;
488
+ }
489
+ if (mode === "push") saveScrollPosition();
490
+ routerEvents.emit("routeChangeStart", resolved, { shallow });
491
+ routerEvents.emit("beforeHistoryChange", resolved, { shallow });
492
+ updateHistory(mode, full);
493
+ if (!shallow) {
494
+ const result = await runNavigateClient(full, resolved);
495
+ if (result === "cancelled") return true;
496
+ if (result === "failed") return false;
497
+ }
498
+ onStateUpdate?.();
499
+ routerEvents.emit("routeChangeComplete", resolved, { shallow });
500
+ const hash = extractHash(resolved);
501
+ if (doScroll) if (hash) scrollToHashTarget(hash);
502
+ else window.scrollTo(0, 0);
503
+ dispatchNavigateEvent();
504
+ return true;
505
+ }
506
+ /** Inject a `<link rel="prefetch">` for the target page. */
507
+ async function prefetchUrl(url) {
508
+ if (typeof document !== "undefined") {
509
+ const link = document.createElement("link");
510
+ link.rel = "prefetch";
511
+ link.href = url;
512
+ link.as = "document";
513
+ document.head.appendChild(link);
514
+ }
515
+ }
377
516
  /**
378
517
  * useRouter hook - Pages Router compatible.
518
+ *
519
+ * Ported from Next.js: packages/next/src/client/router.ts
520
+ * https://github.com/vercel/next.js/blob/canary/packages/next/src/client/router.ts
379
521
  */
380
522
  function useRouter() {
523
+ const router = useContext(RouterContext);
524
+ if (!router) throw new Error("NextRouter was not mounted. https://nextjs.org/docs/messages/next-router-not-mounted");
525
+ return router;
526
+ }
527
+ function PagesRouterProvider({ children }) {
381
528
  const [{ pathname, query, asPath }, setState] = useState(getPathnameAndQuery);
382
529
  useEffect(() => {
383
530
  const onNavigate = ((_e) => {
@@ -386,125 +533,23 @@ function useRouter() {
386
533
  window.addEventListener("vinext:navigate", onNavigate);
387
534
  return () => window.removeEventListener("vinext:navigate", onNavigate);
388
535
  }, []);
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
- }
536
+ const router = useMemo(() => buildRouterValue(pathname, query, asPath, {
537
+ push: Router.push,
538
+ replace: Router.replace,
539
+ back: Router.back,
540
+ reload: Router.reload,
541
+ prefetch: Router.prefetch,
542
+ beforePopState: Router.beforePopState
494
543
  }), [
495
544
  pathname,
496
545
  query,
497
- asPath,
498
- push,
499
- replace,
500
- back,
501
- reload,
502
- prefetch
546
+ asPath
503
547
  ]);
548
+ return createElement(RouterContext.Provider, { value: router }, children);
504
549
  }
505
550
  let _beforePopStateCb;
506
551
  let _lastPathnameAndSearch = typeof window !== "undefined" ? window.location.pathname + window.location.search : "";
507
- if (typeof window !== "undefined") window.addEventListener("popstate", (e) => {
552
+ function handlePagesRouterPopState(e) {
508
553
  const browserUrl = window.location.pathname + window.location.search;
509
554
  const appUrl = stripBasePath(window.location.pathname, __basePath) + window.location.search;
510
555
  const isHashOnly = browserUrl === _lastPathnameAndSearch;
@@ -519,9 +564,9 @@ if (typeof window !== "undefined") window.addEventListener("popstate", (e) => {
519
564
  if (isHashOnly) {
520
565
  const hashUrl = appUrl + window.location.hash;
521
566
  routerEvents.emit("hashChangeStart", hashUrl, { shallow: false });
522
- scrollToHash(window.location.hash);
567
+ scrollToHashTarget(window.location.hash);
523
568
  routerEvents.emit("hashChangeComplete", hashUrl, { shallow: false });
524
- window.dispatchEvent(new CustomEvent("vinext:navigate"));
569
+ dispatchNavigateEvent();
525
570
  return;
526
571
  }
527
572
  const fullAppUrl = appUrl + window.location.hash;
@@ -531,30 +576,21 @@ if (typeof window !== "undefined") window.addEventListener("popstate", (e) => {
531
576
  if (await runNavigateClient(browserUrl, fullAppUrl) === "completed") {
532
577
  routerEvents.emit("routeChangeComplete", fullAppUrl, { shallow: false });
533
578
  restoreScrollPosition(e.state);
534
- window.dispatchEvent(new CustomEvent("vinext:navigate"));
579
+ dispatchNavigateEvent();
535
580
  }
536
581
  })();
537
- });
582
+ }
583
+ setPagesRouterPopStateHandler(handlePagesRouterPopState);
538
584
  /**
539
585
  * Wrap a React element in a RouterContext.Provider so that
540
586
  * next/compat/router's useRouter() returns the real Pages Router value.
541
587
  *
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.
588
+ * The provider owns the reactive Pages Router snapshot so next/router and
589
+ * next/compat/router consumers share one context value instead of each hook
590
+ * installing its own global URL-change listener.
546
591
  */
547
592
  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);
593
+ return createElement(PagesRouterProvider, null, element);
558
594
  }
559
595
  /**
560
596
  * Higher-order component that injects the Pages Router `router` instance as
@@ -589,101 +625,20 @@ function withRouter(ComposedComponent) {
589
625
  return WithRouterWrapper;
590
626
  }
591
627
  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;
601
- }
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;
613
- }
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;
623
- }
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
- },
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;
640
- }
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;
652
- }
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;
661
- }
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
- },
628
+ push: (url, as, options) => performNavigation(url, as, options, "push"),
629
+ replace: (url, as, options) => performNavigation(url, as, options, "replace"),
669
630
  back: () => window.history.back(),
670
631
  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);
678
- }
679
- },
632
+ prefetch: prefetchUrl,
680
633
  beforePopState: (cb) => {
681
634
  _beforePopStateCb = cb;
682
635
  },
683
636
  events: routerEvents
684
637
  };
685
638
  if (typeof window !== "undefined") installWindowNext({ router: Router });
639
+ const _PAGES_NAVIGATION_ACCESSOR_KEY = Symbol.for("vinext.navigation.pagesNavigationContextAccessor");
640
+ globalThis[_PAGES_NAVIGATION_ACCESSOR_KEY] = getPagesNavigationContext;
686
641
  //#endregion
687
- export { _registerRouterStateAccessors, applyNavigationLocale, Router as default, isExternalUrl, isHashOnlyChange, setSSRContext, useRouter, withRouter, wrapWithRouterContext };
642
+ export { _registerRouterStateAccessors, applyNavigationLocale, Router as default, getPagesNavigationContext, isExternalUrl, isHashOnlyChange, setSSRContext, useRouter, withRouter, wrapWithRouterContext };
688
643
 
689
644
  //# sourceMappingURL=router.js.map