vinext 0.0.53 → 0.0.55

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 (276) hide show
  1. package/README.md +1 -0
  2. package/dist/build/inline-css.d.ts +7 -0
  3. package/dist/build/inline-css.js +50 -0
  4. package/dist/build/inline-css.js.map +1 -0
  5. package/dist/build/prerender.js +2 -1
  6. package/dist/build/prerender.js.map +1 -1
  7. package/dist/check.js +19 -3
  8. package/dist/check.js.map +1 -1
  9. package/dist/client/navigation-runtime.d.ts +3 -1
  10. package/dist/client/navigation-runtime.js +1 -1
  11. package/dist/client/navigation-runtime.js.map +1 -1
  12. package/dist/client/window-next.d.ts +7 -0
  13. package/dist/client/window-next.js.map +1 -1
  14. package/dist/config/next-config.d.ts +97 -2
  15. package/dist/config/next-config.js +155 -6
  16. package/dist/config/next-config.js.map +1 -1
  17. package/dist/config/tsconfig-paths.d.ts +12 -3
  18. package/dist/config/tsconfig-paths.js +55 -24
  19. package/dist/config/tsconfig-paths.js.map +1 -1
  20. package/dist/deploy.js +13 -0
  21. package/dist/deploy.js.map +1 -1
  22. package/dist/entries/app-browser-entry.d.ts +11 -1
  23. package/dist/entries/app-browser-entry.js +16 -6
  24. package/dist/entries/app-browser-entry.js.map +1 -1
  25. package/dist/entries/app-rsc-entry.d.ts +9 -1
  26. package/dist/entries/app-rsc-entry.js +30 -5
  27. package/dist/entries/app-rsc-entry.js.map +1 -1
  28. package/dist/entries/app-rsc-manifest.d.ts +21 -1
  29. package/dist/entries/app-rsc-manifest.js +28 -9
  30. package/dist/entries/app-rsc-manifest.js.map +1 -1
  31. package/dist/entries/pages-client-entry.d.ts +4 -1
  32. package/dist/entries/pages-client-entry.js +18 -2
  33. package/dist/entries/pages-client-entry.js.map +1 -1
  34. package/dist/entries/pages-server-entry.js +123 -8
  35. package/dist/entries/pages-server-entry.js.map +1 -1
  36. package/dist/entries/runtime-entry-module.d.ts +1 -10
  37. package/dist/entries/runtime-entry-module.js +2 -12
  38. package/dist/entries/runtime-entry-module.js.map +1 -1
  39. package/dist/index.js +144 -44
  40. package/dist/index.js.map +1 -1
  41. package/dist/plugins/import-meta-url.d.ts +16 -0
  42. package/dist/plugins/import-meta-url.js +193 -0
  43. package/dist/plugins/import-meta-url.js.map +1 -0
  44. package/dist/plugins/remove-console.d.ts +16 -0
  45. package/dist/plugins/remove-console.js +176 -0
  46. package/dist/plugins/remove-console.js.map +1 -0
  47. package/dist/routing/app-route-graph.d.ts +24 -1
  48. package/dist/routing/app-route-graph.js +52 -4
  49. package/dist/routing/app-route-graph.js.map +1 -1
  50. package/dist/routing/app-router.d.ts +2 -2
  51. package/dist/routing/app-router.js +2 -2
  52. package/dist/routing/app-router.js.map +1 -1
  53. package/dist/routing/file-matcher.d.ts +21 -1
  54. package/dist/routing/file-matcher.js +39 -1
  55. package/dist/routing/file-matcher.js.map +1 -1
  56. package/dist/routing/pages-router.d.ts +1 -1
  57. package/dist/routing/pages-router.js +10 -3
  58. package/dist/routing/pages-router.js.map +1 -1
  59. package/dist/server/api-handler.js +1 -1
  60. package/dist/server/app-browser-action-result.d.ts +9 -16
  61. package/dist/server/app-browser-action-result.js +25 -14
  62. package/dist/server/app-browser-action-result.js.map +1 -1
  63. package/dist/server/app-browser-entry.js +195 -60
  64. package/dist/server/app-browser-entry.js.map +1 -1
  65. package/dist/server/app-browser-mpa-navigation.d.ts +16 -0
  66. package/dist/server/app-browser-mpa-navigation.js +36 -0
  67. package/dist/server/app-browser-mpa-navigation.js.map +1 -0
  68. package/dist/server/app-browser-navigation-controller.d.ts +2 -0
  69. package/dist/server/app-browser-navigation-controller.js +4 -0
  70. package/dist/server/app-browser-navigation-controller.js.map +1 -1
  71. package/dist/server/app-browser-popstate.d.ts +3 -1
  72. package/dist/server/app-browser-popstate.js +15 -1
  73. package/dist/server/app-browser-popstate.js.map +1 -1
  74. package/dist/server/app-browser-state.js +2 -1
  75. package/dist/server/app-browser-state.js.map +1 -1
  76. package/dist/server/app-elements-wire.d.ts +13 -4
  77. package/dist/server/app-elements-wire.js +10 -1
  78. package/dist/server/app-elements-wire.js.map +1 -1
  79. package/dist/server/app-elements.d.ts +2 -2
  80. package/dist/server/app-elements.js +2 -2
  81. package/dist/server/app-elements.js.map +1 -1
  82. package/dist/server/app-fallback-renderer.d.ts +15 -5
  83. package/dist/server/app-fallback-renderer.js +10 -4
  84. package/dist/server/app-fallback-renderer.js.map +1 -1
  85. package/dist/server/app-inline-css-client.d.ts +7 -0
  86. package/dist/server/app-inline-css-client.js +37 -0
  87. package/dist/server/app-inline-css-client.js.map +1 -0
  88. package/dist/server/app-layout-param-observation.d.ts +30 -0
  89. package/dist/server/app-layout-param-observation.js +130 -0
  90. package/dist/server/app-layout-param-observation.js.map +1 -0
  91. package/dist/server/app-page-boundary-render.js +2 -2
  92. package/dist/server/app-page-boundary-render.js.map +1 -1
  93. package/dist/server/app-page-boundary.d.ts +21 -1
  94. package/dist/server/app-page-boundary.js +28 -3
  95. package/dist/server/app-page-boundary.js.map +1 -1
  96. package/dist/server/app-page-cache.d.ts +7 -3
  97. package/dist/server/app-page-cache.js +7 -7
  98. package/dist/server/app-page-cache.js.map +1 -1
  99. package/dist/server/app-page-dispatch.d.ts +10 -1
  100. package/dist/server/app-page-dispatch.js +126 -79
  101. package/dist/server/app-page-dispatch.js.map +1 -1
  102. package/dist/server/app-page-element-builder.js +12 -28
  103. package/dist/server/app-page-element-builder.js.map +1 -1
  104. package/dist/server/app-page-params.d.ts +2 -1
  105. package/dist/server/app-page-params.js +14 -1
  106. package/dist/server/app-page-params.js.map +1 -1
  107. package/dist/server/app-page-probe.d.ts +12 -1
  108. package/dist/server/app-page-probe.js +116 -1
  109. package/dist/server/app-page-probe.js.map +1 -1
  110. package/dist/server/app-page-render-identity.d.ts +22 -0
  111. package/dist/server/app-page-render-identity.js +42 -0
  112. package/dist/server/app-page-render-identity.js.map +1 -0
  113. package/dist/server/app-page-render.d.ts +8 -1
  114. package/dist/server/app-page-render.js +4 -1
  115. package/dist/server/app-page-render.js.map +1 -1
  116. package/dist/server/app-page-request.d.ts +6 -3
  117. package/dist/server/app-page-request.js +5 -2
  118. package/dist/server/app-page-request.js.map +1 -1
  119. package/dist/server/app-page-response.js +2 -2
  120. package/dist/server/app-page-response.js.map +1 -1
  121. package/dist/server/app-page-route-wiring.d.ts +15 -0
  122. package/dist/server/app-page-route-wiring.js +7 -5
  123. package/dist/server/app-page-route-wiring.js.map +1 -1
  124. package/dist/server/app-page-stream.d.ts +11 -0
  125. package/dist/server/app-page-stream.js +1 -0
  126. package/dist/server/app-page-stream.js.map +1 -1
  127. package/dist/server/app-route-handler-response.js +37 -5
  128. package/dist/server/app-route-handler-response.js.map +1 -1
  129. package/dist/server/app-rsc-cache-busting.d.ts +3 -2
  130. package/dist/server/app-rsc-cache-busting.js +9 -7
  131. package/dist/server/app-rsc-cache-busting.js.map +1 -1
  132. package/dist/server/app-rsc-handler.d.ts +14 -3
  133. package/dist/server/app-rsc-handler.js +56 -6
  134. package/dist/server/app-rsc-handler.js.map +1 -1
  135. package/dist/server/app-rsc-request-normalization.d.ts +2 -1
  136. package/dist/server/app-rsc-request-normalization.js +3 -2
  137. package/dist/server/app-rsc-request-normalization.js.map +1 -1
  138. package/dist/server/app-segment-config.d.ts +1 -1
  139. package/dist/server/app-segment-config.js +4 -1
  140. package/dist/server/app-segment-config.js.map +1 -1
  141. package/dist/server/app-server-action-execution.d.ts +26 -3
  142. package/dist/server/app-server-action-execution.js +240 -29
  143. package/dist/server/app-server-action-execution.js.map +1 -1
  144. package/dist/server/app-ssr-entry.d.ts +6 -0
  145. package/dist/server/app-ssr-entry.js +22 -7
  146. package/dist/server/app-ssr-entry.js.map +1 -1
  147. package/dist/server/app-ssr-error-meta.js +3 -3
  148. package/dist/server/app-ssr-error-meta.js.map +1 -1
  149. package/dist/server/app-ssr-stream.d.ts +2 -1
  150. package/dist/server/app-ssr-stream.js +176 -31
  151. package/dist/server/app-ssr-stream.js.map +1 -1
  152. package/dist/server/artifact-compatibility.d.ts +2 -1
  153. package/dist/server/artifact-compatibility.js +10 -1
  154. package/dist/server/artifact-compatibility.js.map +1 -1
  155. package/dist/server/client-reuse-manifest.d.ts +9 -4
  156. package/dist/server/client-reuse-manifest.js +2 -1
  157. package/dist/server/client-reuse-manifest.js.map +1 -1
  158. package/dist/server/client-trace-metadata.d.ts +31 -0
  159. package/dist/server/client-trace-metadata.js +83 -0
  160. package/dist/server/client-trace-metadata.js.map +1 -0
  161. package/dist/server/cookie-utils.d.ts +13 -0
  162. package/dist/server/cookie-utils.js +20 -0
  163. package/dist/server/cookie-utils.js.map +1 -0
  164. package/dist/server/dev-server.d.ts +8 -1
  165. package/dist/server/dev-server.js +83 -12
  166. package/dist/server/dev-server.js.map +1 -1
  167. package/dist/server/document-initial-head.d.ts +7 -0
  168. package/dist/server/document-initial-head.js +35 -0
  169. package/dist/server/document-initial-head.js.map +1 -0
  170. package/dist/server/html.d.ts +2 -1
  171. package/dist/server/html.js +6 -1
  172. package/dist/server/html.js.map +1 -1
  173. package/dist/server/isr-cache.d.ts +7 -5
  174. package/dist/server/isr-cache.js +17 -6
  175. package/dist/server/isr-cache.js.map +1 -1
  176. package/dist/server/middleware-runtime.js +1 -2
  177. package/dist/server/middleware-runtime.js.map +1 -1
  178. package/dist/server/pages-document-initial-props.d.ts +89 -0
  179. package/dist/server/pages-document-initial-props.js +140 -0
  180. package/dist/server/pages-document-initial-props.js.map +1 -0
  181. package/dist/server/pages-node-compat.js +1 -1
  182. package/dist/server/pages-page-data.js +3 -0
  183. package/dist/server/pages-page-data.js.map +1 -1
  184. package/dist/server/pages-page-method.d.ts +48 -0
  185. package/dist/server/pages-page-method.js +19 -0
  186. package/dist/server/pages-page-method.js.map +1 -0
  187. package/dist/server/pages-page-response.d.ts +20 -0
  188. package/dist/server/pages-page-response.js +37 -7
  189. package/dist/server/pages-page-response.js.map +1 -1
  190. package/dist/server/pages-serializable-props.d.ts +25 -0
  191. package/dist/server/pages-serializable-props.js +69 -0
  192. package/dist/server/pages-serializable-props.js.map +1 -0
  193. package/dist/server/prod-server.js +16 -6
  194. package/dist/server/prod-server.js.map +1 -1
  195. package/dist/server/server-action-not-found.js +3 -2
  196. package/dist/server/server-action-not-found.js.map +1 -1
  197. package/dist/server/skip-cache-proof.d.ts +23 -2
  198. package/dist/server/skip-cache-proof.js +81 -12
  199. package/dist/server/skip-cache-proof.js.map +1 -1
  200. package/dist/server/static-file-cache.js +2 -1
  201. package/dist/server/static-file-cache.js.map +1 -1
  202. package/dist/server/static-layout-client-reuse-proof.d.ts +16 -0
  203. package/dist/server/static-layout-client-reuse-proof.js +35 -0
  204. package/dist/server/static-layout-client-reuse-proof.js.map +1 -0
  205. package/dist/shims/app-router-scroll-state.d.ts +4 -2
  206. package/dist/shims/app-router-scroll-state.js +16 -3
  207. package/dist/shims/app-router-scroll-state.js.map +1 -1
  208. package/dist/shims/app-router-scroll.d.ts +16 -2
  209. package/dist/shims/app-router-scroll.js +18 -3
  210. package/dist/shims/app-router-scroll.js.map +1 -1
  211. package/dist/shims/cache.d.ts +27 -1
  212. package/dist/shims/cache.js +108 -6
  213. package/dist/shims/cache.js.map +1 -1
  214. package/dist/shims/document.d.ts +6 -0
  215. package/dist/shims/document.js +7 -8
  216. package/dist/shims/document.js.map +1 -1
  217. package/dist/shims/error-boundary.d.ts +4 -4
  218. package/dist/shims/error-boundary.js +27 -28
  219. package/dist/shims/error-boundary.js.map +1 -1
  220. package/dist/shims/error.js +3 -0
  221. package/dist/shims/error.js.map +1 -1
  222. package/dist/shims/fetch-cache.d.ts +3 -1
  223. package/dist/shims/fetch-cache.js +16 -5
  224. package/dist/shims/fetch-cache.js.map +1 -1
  225. package/dist/shims/hash-scroll.d.ts +4 -1
  226. package/dist/shims/hash-scroll.js +13 -1
  227. package/dist/shims/hash-scroll.js.map +1 -1
  228. package/dist/shims/head-state.d.ts +1 -0
  229. package/dist/shims/head-state.js +18 -3
  230. package/dist/shims/head-state.js.map +1 -1
  231. package/dist/shims/head.d.ts +35 -1
  232. package/dist/shims/head.js +113 -14
  233. package/dist/shims/head.js.map +1 -1
  234. package/dist/shims/headers.d.ts +7 -0
  235. package/dist/shims/headers.js +9 -1
  236. package/dist/shims/headers.js.map +1 -1
  237. package/dist/shims/internal/app-route-detection.d.ts +37 -0
  238. package/dist/shims/internal/app-route-detection.js +69 -0
  239. package/dist/shims/internal/app-route-detection.js.map +1 -0
  240. package/dist/shims/internal/pages-data-fetch-dedup.d.ts +56 -0
  241. package/dist/shims/internal/pages-data-fetch-dedup.js +70 -0
  242. package/dist/shims/internal/pages-data-fetch-dedup.js.map +1 -0
  243. package/dist/shims/link.d.ts +18 -2
  244. package/dist/shims/link.js +98 -8
  245. package/dist/shims/link.js.map +1 -1
  246. package/dist/shims/metadata.d.ts +7 -6
  247. package/dist/shims/metadata.js +9 -5
  248. package/dist/shims/metadata.js.map +1 -1
  249. package/dist/shims/navigation.d.ts +40 -3
  250. package/dist/shims/navigation.js +124 -25
  251. package/dist/shims/navigation.js.map +1 -1
  252. package/dist/shims/router.d.ts +5 -0
  253. package/dist/shims/router.js +51 -21
  254. package/dist/shims/router.js.map +1 -1
  255. package/dist/shims/script.d.ts +11 -1
  256. package/dist/shims/script.js +75 -6
  257. package/dist/shims/script.js.map +1 -1
  258. package/dist/shims/thenable-params.d.ts +5 -2
  259. package/dist/shims/thenable-params.js +25 -1
  260. package/dist/shims/thenable-params.js.map +1 -1
  261. package/dist/shims/unified-request-context.js +3 -0
  262. package/dist/shims/unified-request-context.js.map +1 -1
  263. package/dist/utils/client-build-manifest.d.ts +15 -0
  264. package/dist/utils/client-build-manifest.js +54 -0
  265. package/dist/utils/client-build-manifest.js.map +1 -0
  266. package/dist/utils/hash.js +1 -1
  267. package/dist/utils/hash.js.map +1 -1
  268. package/dist/utils/lazy-chunks.d.ts +1 -1
  269. package/dist/utils/lazy-chunks.js.map +1 -1
  270. package/dist/utils/path.d.ts +13 -0
  271. package/dist/utils/path.js +16 -0
  272. package/dist/utils/path.js.map +1 -0
  273. package/dist/utils/vite-version.d.ts +11 -0
  274. package/dist/utils/vite-version.js +36 -0
  275. package/dist/utils/vite-version.js.map +1 -0
  276. package/package.json +2 -2
@@ -2,16 +2,16 @@ import { stripBasePath } from "../utils/base-path.js";
2
2
  import { VINEXT_MOUNTED_SLOTS_HEADER, VINEXT_PARAMS_HEADER } from "../server/headers.js";
3
3
  import { assertSafeNavigationUrl } from "./url-safety.js";
4
4
  import { AppElementsWire } from "../server/app-elements-wire.js";
5
+ import "../server/app-elements.js";
6
+ import { AppRouterContext } from "./internal/app-router-context.js";
5
7
  import { isAbsoluteOrProtocolRelativeUrl, isHashOnlyBrowserUrlChange, toBrowserNavigationHref, toSameOriginAppPath, withBasePath } from "./url-utils.js";
6
- import { scrollToHashTarget } from "./hash-scroll.js";
8
+ import { retryScrollTo, scrollToHashTarget } from "./hash-scroll.js";
7
9
  import { getNavigationRuntime, hasAppNavigationRuntime } from "../client/navigation-runtime.js";
8
10
  import { notifyAppRouterTransitionStart } from "../client/instrumentation-client-state.js";
9
- import "../server/app-elements.js";
10
11
  import { resolveManifestNavigationInterceptionContext } from "../server/app-browser-interception-context.js";
11
12
  import { createExternalHistoryStatePreservingMetadata } from "../server/app-history-state.js";
12
13
  import { VINEXT_RSC_COMPATIBILITY_ID_HEADER, createRscRequestHeaders, createRscRequestUrl } from "../server/app-rsc-cache-busting.js";
13
14
  import { ReadonlyURLSearchParams } from "./readonly-url-search-params.js";
14
- import { AppRouterContext } from "./internal/app-router-context.js";
15
15
  import { beginAppRouterScrollIntent, clearAppRouterScrollIntent, consumeAppRouterScrollIntent } from "./app-router-scroll-state.js";
16
16
  import { UnrecognizedActionError, unstable_isUnrecognizedActionError } from "./unrecognized-action-error.js";
17
17
  import * as React$1 from "react";
@@ -140,8 +140,28 @@ const isServer = typeof window === "undefined";
140
140
  const __basePath = process.env.__NEXT_ROUTER_BASEPATH ?? "";
141
141
  /** Maximum number of entries in the RSC prefetch cache. */
142
142
  const MAX_PREFETCH_CACHE_SIZE = 50;
143
- /** TTL for prefetch cache entries in ms (matches Next.js static prefetch TTL). */
144
- const PREFETCH_CACHE_TTL = 3e4;
143
+ /**
144
+ * TTL for prefetch cache entries in ms.
145
+ *
146
+ * Mirrors Next.js' `STATIC_STALETIME_MS` derivation. The plugin injects
147
+ * `process.env.__NEXT_CLIENT_ROUTER_STATIC_STALETIME` from
148
+ * `experimental.staleTimes.static` (in seconds) at build time; we convert
149
+ * to ms here.
150
+ *
151
+ * Falls back to vinext's historical default of 30s when the env var is
152
+ * absent (e.g. unit tests that import this module without going through
153
+ * the plugin's `define` pipeline). When the plugin is active and the user
154
+ * has not set `experimental.staleTimes`, Next.js' 300s default applies
155
+ * (see `resolveStaleTimes` in `config/next-config.ts`).
156
+ */
157
+ function resolvePrefetchCacheTtl() {
158
+ const raw = process.env.__NEXT_CLIENT_ROUTER_STATIC_STALETIME;
159
+ if (raw === void 0 || raw === "") return 3e4;
160
+ const seconds = Number(raw);
161
+ if (!Number.isFinite(seconds) || seconds < 0) return 3e4;
162
+ return seconds * 1e3;
163
+ }
164
+ const PREFETCH_CACHE_TTL = resolvePrefetchCacheTtl();
145
165
  function getCurrentInterceptionContext() {
146
166
  if (isServer) return null;
147
167
  return stripBasePath(window.location.pathname, __basePath);
@@ -189,7 +209,7 @@ function evictPrefetchCacheIfNeeded() {
189
209
  if (cache.size < 50) return;
190
210
  const now = Date.now();
191
211
  const prefetched = getPrefetchedUrls();
192
- for (const [key, entry] of cache) if (now - entry.timestamp >= 3e4) deletePrefetchCacheEntry(cache, prefetched, key, entry, true);
212
+ for (const [key, entry] of cache) if (now - entry.timestamp >= PREFETCH_CACHE_TTL) deletePrefetchCacheEntry(cache, prefetched, key, entry, true);
193
213
  while (cache.size >= 50) {
194
214
  const oldest = cache.keys().next().value;
195
215
  if (oldest !== void 0) {
@@ -394,11 +414,24 @@ function consumePrefetchResponse(rscUrl, interceptionContext = null, mountedSlot
394
414
  deletePrefetchCacheEntry(cache, getPrefetchedUrls(), cacheKey, entry, false);
395
415
  if (entry.snapshot) {
396
416
  if ((entry.snapshot.mountedSlotsHeader ?? null) !== mountedSlotsHeader) return null;
397
- if (Date.now() - entry.timestamp >= 3e4) return null;
417
+ if (Date.now() - entry.timestamp >= PREFETCH_CACHE_TTL) return null;
398
418
  return entry.snapshot;
399
419
  }
400
420
  return null;
401
421
  }
422
+ async function consumePrefetchResponseForNavigation(rscUrl, interceptionContext = null, mountedSlotsHeader = null, options) {
423
+ const cacheKey = AppElementsWire.encodeCacheKey(rscUrl, interceptionContext);
424
+ const cache = getPrefetchCache();
425
+ const entry = cache.get(cacheKey);
426
+ if (!entry) return null;
427
+ if (entry.cacheForNavigation === false) return null;
428
+ if (entry.pending !== void 0) {
429
+ await entry.pending.catch(() => {});
430
+ if (cache.get(cacheKey) !== entry) return null;
431
+ }
432
+ if (options?.shouldConsume?.() === false) return null;
433
+ return consumePrefetchResponse(rscUrl, interceptionContext, mountedSlotsHeader);
434
+ }
402
435
  const _CLIENT_NAV_STATE_KEY = Symbol.for("vinext.clientNavigationState");
403
436
  const _MOUNTED_SLOTS_HEADER_KEY = Symbol.for("vinext.mountedSlotsHeader");
404
437
  function setMountedSlotsHeader(header) {
@@ -597,9 +630,9 @@ function clearPendingPathname(navId) {
597
630
  }
598
631
  function getClientParamsSnapshot() {
599
632
  const state = getClientNavigationState();
600
- if (state && Object.keys(state.clientParams).length > 0) return state.clientParams;
601
633
  const pagesCtx = _getPagesNavigationContext();
602
634
  if (pagesCtx) return pagesCtx.params;
635
+ if (state && Object.keys(state.clientParams).length > 0) return state.clientParams;
603
636
  return state?.clientParams ?? _EMPTY_PARAMS;
604
637
  }
605
638
  function getServerParamsSnapshot() {
@@ -766,14 +799,8 @@ function restoreScrollPosition(state) {
766
799
  const { __vinext_scrollX: x, __vinext_scrollY: y } = state;
767
800
  Promise.resolve().then(() => {
768
801
  const pending = window.__VINEXT_RSC_PENDING__ ?? null;
769
- if (pending) pending.then(() => {
770
- requestAnimationFrame(() => {
771
- window.scrollTo(x, y);
772
- });
773
- });
774
- else requestAnimationFrame(() => {
775
- window.scrollTo(x, y);
776
- });
802
+ if (pending) pending.then(() => retryScrollTo(x, y));
803
+ else retryScrollTo(x, y);
777
804
  });
778
805
  }
779
806
  }
@@ -785,8 +812,15 @@ async function navigateClientSide(href, mode, scroll, programmaticTransition = f
785
812
  if (isExternalUrl(href)) {
786
813
  const localPath = toSameOriginAppPath(href, __basePath);
787
814
  if (localPath == null) {
815
+ notifyAppRouterTransitionStart(href, mode);
816
+ const externalNavigate = getNavigationRuntime()?.functions.navigateExternal;
817
+ if (externalNavigate) {
818
+ await externalNavigate(href, mode);
819
+ return;
820
+ }
788
821
  if (mode === "replace") window.location.replace(href);
789
822
  else window.location.assign(href);
823
+ await new Promise(() => {});
790
824
  return;
791
825
  }
792
826
  normalizedHref = localPath;
@@ -807,7 +841,7 @@ async function navigateClientSide(href, mode, scroll, programmaticTransition = f
807
841
  if (!scroll) clearAppRouterScrollIntent();
808
842
  const appNavigate = getNavigationRuntime()?.functions.navigate;
809
843
  try {
810
- if (appNavigate) await appNavigate(fullHref, 0, "navigate", mode, void 0, programmaticTransition);
844
+ if (appNavigate) await appNavigate(fullHref, 0, "navigate", mode, void 0, programmaticTransition, void 0, scrollIntent);
811
845
  else {
812
846
  if (mode === "replace") replaceHistoryStateWithoutNotify(null, "", fullHref);
813
847
  else pushHistoryStateWithoutNotify(null, "", fullHref);
@@ -822,6 +856,22 @@ async function navigateClientSide(href, mode, scroll, programmaticTransition = f
822
856
  if (fallbackIntent) applyAppRouterScrollFallback(fallbackIntent);
823
857
  }
824
858
  }
859
+ let scheduledAppRouterNavigationCount = 0;
860
+ function trackScheduledAppRouterNavigation() {
861
+ scheduledAppRouterNavigationCount += 1;
862
+ let released = false;
863
+ return () => {
864
+ if (released) return;
865
+ released = true;
866
+ scheduledAppRouterNavigationCount = Math.max(0, scheduledAppRouterNavigationCount - 1);
867
+ };
868
+ }
869
+ function hasScheduledAppRouterNavigation() {
870
+ return scheduledAppRouterNavigationCount > 0;
871
+ }
872
+ function releaseScheduledAppRouterNavigationAfterCurrentTask(release) {
873
+ queueMicrotask(release);
874
+ }
825
875
  /**
826
876
  * Public App Router instance, exposed for the browser entry so it can wire
827
877
  * `window.next.router` to the same singleton returned from `useRouter()`.
@@ -834,16 +884,30 @@ const appRouterInstance = {
834
884
  push(href, options) {
835
885
  assertSafeNavigationUrl(href);
836
886
  if (isServer) return;
837
- React$1.startTransition(() => {
838
- navigateClientSide(href, "push", options?.scroll !== false, true);
839
- });
887
+ const releaseNavigation = trackScheduledAppRouterNavigation();
888
+ try {
889
+ React$1.startTransition(() => {
890
+ navigateClientSide(href, "push", options?.scroll !== false, true);
891
+ });
892
+ } catch (error) {
893
+ releaseNavigation();
894
+ throw error;
895
+ }
896
+ releaseScheduledAppRouterNavigationAfterCurrentTask(releaseNavigation);
840
897
  },
841
898
  replace(href, options) {
842
899
  assertSafeNavigationUrl(href);
843
900
  if (isServer) return;
844
- React$1.startTransition(() => {
845
- navigateClientSide(href, "replace", options?.scroll !== false, true);
846
- });
901
+ const releaseNavigation = trackScheduledAppRouterNavigation();
902
+ try {
903
+ React$1.startTransition(() => {
904
+ navigateClientSide(href, "replace", options?.scroll !== false, true);
905
+ });
906
+ } catch (error) {
907
+ releaseNavigation();
908
+ throw error;
909
+ }
910
+ releaseScheduledAppRouterNavigationAfterCurrentTask(releaseNavigation);
847
911
  },
848
912
  back() {
849
913
  if (isServer) return;
@@ -856,6 +920,7 @@ const appRouterInstance = {
856
920
  refresh() {
857
921
  if (isServer) return;
858
922
  getNavigationRuntime()?.functions.clearNavigationCaches?.();
923
+ if (hasScheduledAppRouterNavigation()) return;
859
924
  const rscNavigate = getNavigationRuntime()?.functions.navigate;
860
925
  if (rscNavigate) {
861
926
  const navigate = () => {
@@ -1135,10 +1200,44 @@ function unauthorized() {
1135
1200
  * `shims/error-boundary.tsx`.
1136
1201
  */
1137
1202
  function isRedirectError(error) {
1138
- if (!error || typeof error !== "object" || !("digest" in error) || typeof error.digest !== "string") return false;
1203
+ if (!error || typeof error !== "object") return false;
1204
+ if (!("digest" in error)) return false;
1205
+ if (typeof error.digest !== "string") return false;
1139
1206
  return error.digest.startsWith("NEXT_REDIRECT;");
1140
1207
  }
1141
1208
  /**
1209
+ * Parse a redirect error digest into its URL and type components.
1210
+ *
1211
+ * Supports two formats:
1212
+ * - vinext's 3-part: `NEXT_REDIRECT;{type};{encoded-url}`
1213
+ * - Next.js's 5-part: `NEXT_REDIRECT;{type};{url};{status};{isClient}`
1214
+ *
1215
+ * The URL segment is always percent-encoded on the write side
1216
+ * (encodeURIComponent is used), so re-joining with ";" for the 5-part
1217
+ * format is defensive — it correctly handles any unencoded ";" that
1218
+ * might appear in an externally-sourced digest.
1219
+ *
1220
+ * Returns null for malformed digests that have an empty URL segment, or
1221
+ * when the URL contains invalid percent-encoding.
1222
+ */
1223
+ function decodeRedirectError(digest) {
1224
+ if (!digest.startsWith("NEXT_REDIRECT;")) return null;
1225
+ const parts = digest.split(";");
1226
+ const encodedTarget = parts.length >= 5 ? parts.slice(2, -2).join(";") : parts[2];
1227
+ if (!encodedTarget) return null;
1228
+ let url;
1229
+ try {
1230
+ url = decodeURIComponent(encodedTarget);
1231
+ } catch {
1232
+ return null;
1233
+ }
1234
+ const type = parts[1] === "push" ? "push" : "replace";
1235
+ return {
1236
+ url,
1237
+ type
1238
+ };
1239
+ }
1240
+ /**
1142
1241
  * Returns true if the error is a Next.js navigation signal — either a redirect
1143
1242
  * or an HTTP access fallback (notFound / forbidden / unauthorized).
1144
1243
  *
@@ -1279,6 +1378,6 @@ if (!isServer) {
1279
1378
  }
1280
1379
  }
1281
1380
  //#endregion
1282
- export { BailoutToCSRError, DynamicServerError, GLOBAL_ACCESSORS_KEY, HTTP_ERROR_FALLBACK_ERROR_CODE, MAX_PREFETCH_CACHE_SIZE, PREFETCH_CACHE_TTL, ReadonlyURLSearchParams, RedirectType, ServerInsertedHTMLContext, UnrecognizedActionError, __basePath, _registerStateAccessors, activateNavigationSnapshot, appRouterInstance, clearPendingPathname, clearServerInsertedHTML, commitClientNavigationState, consumePrefetchResponse, createCachedRscResponseSnapshot, createClientNavigationRenderSnapshot, flushServerInsertedHTML, forbidden, getAccessFallbackHTTPStatus, getClientNavigationRenderContext, getClientNavigationState, getClientParams, getCurrentInterceptionContext, getCurrentNextUrl, getLayoutSegmentContext, getMountedSlotsHeader, getNavigationContext, getPrefetchCache, getPrefetchInterceptionContext, getPrefetchedUrls, invalidatePrefetchCache, isBailoutToCSRError, isDynamicServerError, isHTTPAccessFallbackError, isNextRouterError, isRedirectError, navigateClientSide, notFound, permanentRedirect, prefetchRscResponse, pushHistoryStateWithoutNotify, redirect, renderServerInsertedHTML, replaceClientParamsWithoutNotify, replaceHistoryStateWithoutNotify, restoreRscResponse, setClientParams, setMountedSlotsHeader, setNavigationContext, setPendingPathname, snapshotRscResponse, storePrefetchResponse, unauthorized, unstable_isUnrecognizedActionError, unstable_rethrow, useParams, usePathname, useRouter, useSearchParams, useSelectedLayoutSegment, useSelectedLayoutSegments, useServerInsertedHTML };
1381
+ export { BailoutToCSRError, DynamicServerError, GLOBAL_ACCESSORS_KEY, HTTP_ERROR_FALLBACK_ERROR_CODE, MAX_PREFETCH_CACHE_SIZE, PREFETCH_CACHE_TTL, ReadonlyURLSearchParams, RedirectType, ServerInsertedHTMLContext, UnrecognizedActionError, __basePath, _registerStateAccessors, activateNavigationSnapshot, appRouterInstance, clearPendingPathname, clearServerInsertedHTML, commitClientNavigationState, consumePrefetchResponse, consumePrefetchResponseForNavigation, createCachedRscResponseSnapshot, createClientNavigationRenderSnapshot, decodeRedirectError, flushServerInsertedHTML, forbidden, getAccessFallbackHTTPStatus, getClientNavigationRenderContext, getClientNavigationState, getClientParams, getCurrentInterceptionContext, getCurrentNextUrl, getLayoutSegmentContext, getMountedSlotsHeader, getNavigationContext, getPrefetchCache, getPrefetchInterceptionContext, getPrefetchedUrls, invalidatePrefetchCache, isBailoutToCSRError, isDynamicServerError, isHTTPAccessFallbackError, isNextRouterError, isRedirectError, navigateClientSide, notFound, permanentRedirect, prefetchRscResponse, pushHistoryStateWithoutNotify, redirect, renderServerInsertedHTML, replaceClientParamsWithoutNotify, replaceHistoryStateWithoutNotify, restoreRscResponse, saveScrollPosition, setClientParams, setMountedSlotsHeader, setNavigationContext, setPendingPathname, snapshotRscResponse, storePrefetchResponse, unauthorized, unstable_isUnrecognizedActionError, unstable_rethrow, useParams, usePathname, useRouter, useSearchParams, useSelectedLayoutSegment, useSelectedLayoutSegments, useServerInsertedHTML };
1283
1382
 
1284
1383
  //# sourceMappingURL=navigation.js.map