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,4 +1,5 @@
1
1
  import { RSC_FORM_STATE_GLOBAL } from "./app-browser-hydration.js";
2
+ import { RscEmbeddedChunk } from "./app-rsc-embedded-chunks.js";
2
3
  import { ReactFormState } from "react-dom/client";
3
4
 
4
5
  //#region src/server/app-browser-stream.d.ts
@@ -7,13 +8,13 @@ type NavigationSnapshot = {
7
8
  searchParams: [string, string][];
8
9
  };
9
10
  type LegacyRscEmbedData = {
10
- rsc: string[];
11
+ rsc: RscEmbeddedChunk[];
11
12
  params?: Record<string, string | string[]>;
12
13
  nav?: NavigationSnapshot;
13
14
  };
14
15
  type VinextBrowserGlobals = {
15
16
  __VINEXT_RSC__?: LegacyRscEmbedData;
16
- __VINEXT_RSC_CHUNKS__?: string[];
17
+ __VINEXT_RSC_CHUNKS__?: RscEmbeddedChunk[];
17
18
  __VINEXT_RSC_DONE__?: boolean;
18
19
  [RSC_FORM_STATE_GLOBAL]?: ReactFormState;
19
20
  __VINEXT_RSC_PARAMS__?: Record<string, string | string[]>;
@@ -21,9 +22,9 @@ type VinextBrowserGlobals = {
21
22
  };
22
23
  declare function getVinextBrowserGlobal(): typeof globalThis & VinextBrowserGlobals;
23
24
  /**
24
- * Convert embedded text chunks back to a ReadableStream of Uint8Array chunks.
25
+ * Convert embedded chunks back to a ReadableStream of Uint8Array chunks.
25
26
  */
26
- declare function chunksToReadableStream(chunks: readonly string[]): ReadableStream<Uint8Array>;
27
+ declare function chunksToReadableStream(chunks: readonly RscEmbeddedChunk[]): ReadableStream<Uint8Array>;
27
28
  /**
28
29
  * Create a ReadableStream from progressively-embedded RSC chunks.
29
30
  *
@@ -1,3 +1,4 @@
1
+ import { decodeRscEmbeddedChunk } from "./app-rsc-embedded-chunks.js";
1
2
  //#region src/server/app-browser-stream.ts
2
3
  function getVinextBrowserGlobal() {
3
4
  return globalThis;
@@ -6,12 +7,11 @@ function createUnexpectedRscStreamCloseError() {
6
7
  return /* @__PURE__ */ new Error("The connection to the page was unexpectedly closed, possibly due to the stop button being clicked, loss of Wi-Fi, or an unstable internet connection.");
7
8
  }
8
9
  /**
9
- * Convert embedded text chunks back to a ReadableStream of Uint8Array chunks.
10
+ * Convert embedded chunks back to a ReadableStream of Uint8Array chunks.
10
11
  */
11
12
  function chunksToReadableStream(chunks) {
12
- const encoder = new TextEncoder();
13
13
  return new ReadableStream({ start(controller) {
14
- for (const chunk of chunks) controller.enqueue(encoder.encode(chunk));
14
+ for (const chunk of chunks) controller.enqueue(decodeRscEmbeddedChunk(chunk));
15
15
  controller.close();
16
16
  } });
17
17
  }
@@ -23,11 +23,10 @@ function chunksToReadableStream(chunks) {
23
23
  * instead of polling with setTimeout.
24
24
  */
25
25
  function createProgressiveRscStream() {
26
- const encoder = new TextEncoder();
27
26
  return new ReadableStream({ start(controller) {
28
27
  const vinext = getVinextBrowserGlobal();
29
28
  const initialChunks = vinext.__VINEXT_RSC_CHUNKS__ ?? [];
30
- for (const chunk of initialChunks) controller.enqueue(encoder.encode(chunk));
29
+ for (const chunk of initialChunks) controller.enqueue(decodeRscEmbeddedChunk(chunk));
31
30
  if (vinext.__VINEXT_RSC_DONE__) {
32
31
  controller.close();
33
32
  return;
@@ -57,7 +56,7 @@ function createProgressiveRscStream() {
57
56
  arr.push = function(...chunks) {
58
57
  const length = Array.prototype.push.apply(this, chunks);
59
58
  if (closed) return length;
60
- for (const chunk of chunks) controller.enqueue(encoder.encode(chunk));
59
+ for (const chunk of chunks) controller.enqueue(decodeRscEmbeddedChunk(chunk));
61
60
  if (vinext.__VINEXT_RSC_DONE__) closeOnce();
62
61
  return length;
63
62
  };
@@ -1 +1 @@
1
- {"version":3,"file":"app-browser-stream.js","names":[],"sources":["../../src/server/app-browser-stream.ts"],"sourcesContent":["import type { ReactFormState } from \"react-dom/client\";\nimport { RSC_FORM_STATE_GLOBAL } from \"./app-browser-hydration.js\";\n\ntype NavigationSnapshot = {\n pathname: string;\n searchParams: [string, string][];\n};\n\ntype LegacyRscEmbedData = {\n rsc: string[];\n params?: Record<string, string | string[]>;\n nav?: NavigationSnapshot;\n};\n\ntype VinextBrowserGlobals = {\n __VINEXT_RSC__?: LegacyRscEmbedData;\n __VINEXT_RSC_CHUNKS__?: string[];\n __VINEXT_RSC_DONE__?: boolean;\n [RSC_FORM_STATE_GLOBAL]?: ReactFormState;\n __VINEXT_RSC_PARAMS__?: Record<string, string | string[]>;\n __VINEXT_RSC_NAV__?: NavigationSnapshot;\n};\n\nexport function getVinextBrowserGlobal(): typeof globalThis & VinextBrowserGlobals {\n return globalThis as typeof globalThis & VinextBrowserGlobals;\n}\n\nfunction createUnexpectedRscStreamCloseError(): Error {\n return new Error(\n \"The connection to the page was unexpectedly closed, possibly due to the stop button being clicked, loss of Wi-Fi, or an unstable internet connection.\",\n );\n}\n\n/**\n * Convert embedded text chunks back to a ReadableStream of Uint8Array chunks.\n */\nexport function chunksToReadableStream(chunks: readonly string[]): ReadableStream<Uint8Array> {\n const encoder = new TextEncoder();\n return new ReadableStream<Uint8Array>({\n start(controller) {\n for (const chunk of chunks) {\n controller.enqueue(encoder.encode(chunk));\n }\n controller.close();\n },\n });\n}\n\n/**\n * Create a ReadableStream from progressively-embedded RSC chunks.\n *\n * The server pushes chunks into `__VINEXT_RSC_CHUNKS__` via inline <script>\n * tags. We monkey-patch `push()` so new chunks stream to React immediately\n * instead of polling with setTimeout.\n */\nexport function createProgressiveRscStream(): ReadableStream<Uint8Array> {\n const encoder = new TextEncoder();\n\n return new ReadableStream<Uint8Array>({\n start(controller) {\n const vinext = getVinextBrowserGlobal();\n const initialChunks = vinext.__VINEXT_RSC_CHUNKS__ ?? [];\n\n for (const chunk of initialChunks) {\n controller.enqueue(encoder.encode(chunk));\n }\n\n if (vinext.__VINEXT_RSC_DONE__) {\n controller.close();\n return;\n }\n\n let closed = false;\n let cancelDocumentCompletionCheck: (() => void) | undefined;\n const cancelPendingDocumentCompletionCheck = () => {\n const cancel = cancelDocumentCompletionCheck;\n cancelDocumentCompletionCheck = undefined;\n cancel?.();\n };\n const closeOnce = () => {\n if (!closed) {\n closed = true;\n cancelPendingDocumentCompletionCheck();\n controller.close();\n }\n };\n const errorOnce = () => {\n if (!closed) {\n closed = true;\n cancelPendingDocumentCompletionCheck();\n controller.error(createUnexpectedRscStreamCloseError());\n }\n };\n\n const arr = (vinext.__VINEXT_RSC_CHUNKS__ ??= []);\n arr.push = function (...chunks: string[]): number {\n const length = Array.prototype.push.apply(this, chunks);\n\n if (closed) return length;\n\n for (const chunk of chunks) {\n controller.enqueue(encoder.encode(chunk));\n }\n\n if (vinext.__VINEXT_RSC_DONE__) {\n closeOnce();\n }\n\n return length;\n };\n\n if (typeof document !== \"undefined\") {\n if (document.readyState === \"loading\") {\n document.addEventListener(\"DOMContentLoaded\", errorOnce);\n cancelDocumentCompletionCheck = () =>\n document.removeEventListener(\"DOMContentLoaded\", errorOnce);\n } else {\n const timeoutId = setTimeout(errorOnce);\n cancelDocumentCompletionCheck = () => clearTimeout(timeoutId);\n }\n }\n },\n });\n}\n"],"mappings":";AAuBA,SAAgB,yBAAmE;CACjF,OAAO;;AAGT,SAAS,sCAA6C;CACpD,uBAAO,IAAI,MACT,wJACD;;;;;AAMH,SAAgB,uBAAuB,QAAuD;CAC5F,MAAM,UAAU,IAAI,aAAa;CACjC,OAAO,IAAI,eAA2B,EACpC,MAAM,YAAY;EAChB,KAAK,MAAM,SAAS,QAClB,WAAW,QAAQ,QAAQ,OAAO,MAAM,CAAC;EAE3C,WAAW,OAAO;IAErB,CAAC;;;;;;;;;AAUJ,SAAgB,6BAAyD;CACvE,MAAM,UAAU,IAAI,aAAa;CAEjC,OAAO,IAAI,eAA2B,EACpC,MAAM,YAAY;EAChB,MAAM,SAAS,wBAAwB;EACvC,MAAM,gBAAgB,OAAO,yBAAyB,EAAE;EAExD,KAAK,MAAM,SAAS,eAClB,WAAW,QAAQ,QAAQ,OAAO,MAAM,CAAC;EAG3C,IAAI,OAAO,qBAAqB;GAC9B,WAAW,OAAO;GAClB;;EAGF,IAAI,SAAS;EACb,IAAI;EACJ,MAAM,6CAA6C;GACjD,MAAM,SAAS;GACf,gCAAgC,KAAA;GAChC,UAAU;;EAEZ,MAAM,kBAAkB;GACtB,IAAI,CAAC,QAAQ;IACX,SAAS;IACT,sCAAsC;IACtC,WAAW,OAAO;;;EAGtB,MAAM,kBAAkB;GACtB,IAAI,CAAC,QAAQ;IACX,SAAS;IACT,sCAAsC;IACtC,WAAW,MAAM,qCAAqC,CAAC;;;EAI3D,MAAM,MAAO,OAAO,0BAA0B,EAAE;EAChD,IAAI,OAAO,SAAU,GAAG,QAA0B;GAChD,MAAM,SAAS,MAAM,UAAU,KAAK,MAAM,MAAM,OAAO;GAEvD,IAAI,QAAQ,OAAO;GAEnB,KAAK,MAAM,SAAS,QAClB,WAAW,QAAQ,QAAQ,OAAO,MAAM,CAAC;GAG3C,IAAI,OAAO,qBACT,WAAW;GAGb,OAAO;;EAGT,IAAI,OAAO,aAAa,aACtB,IAAI,SAAS,eAAe,WAAW;GACrC,SAAS,iBAAiB,oBAAoB,UAAU;GACxD,sCACE,SAAS,oBAAoB,oBAAoB,UAAU;SACxD;GACL,MAAM,YAAY,WAAW,UAAU;GACvC,sCAAsC,aAAa,UAAU;;IAIpE,CAAC"}
1
+ {"version":3,"file":"app-browser-stream.js","names":[],"sources":["../../src/server/app-browser-stream.ts"],"sourcesContent":["import type { ReactFormState } from \"react-dom/client\";\nimport { RSC_FORM_STATE_GLOBAL } from \"./app-browser-hydration.js\";\nimport { decodeRscEmbeddedChunk, type RscEmbeddedChunk } from \"./app-rsc-embedded-chunks.js\";\n\ntype NavigationSnapshot = {\n pathname: string;\n searchParams: [string, string][];\n};\n\ntype LegacyRscEmbedData = {\n rsc: RscEmbeddedChunk[];\n params?: Record<string, string | string[]>;\n nav?: NavigationSnapshot;\n};\n\ntype VinextBrowserGlobals = {\n __VINEXT_RSC__?: LegacyRscEmbedData;\n __VINEXT_RSC_CHUNKS__?: RscEmbeddedChunk[];\n __VINEXT_RSC_DONE__?: boolean;\n [RSC_FORM_STATE_GLOBAL]?: ReactFormState;\n __VINEXT_RSC_PARAMS__?: Record<string, string | string[]>;\n __VINEXT_RSC_NAV__?: NavigationSnapshot;\n};\n\nexport function getVinextBrowserGlobal(): typeof globalThis & VinextBrowserGlobals {\n return globalThis as typeof globalThis & VinextBrowserGlobals;\n}\n\nfunction createUnexpectedRscStreamCloseError(): Error {\n return new Error(\n \"The connection to the page was unexpectedly closed, possibly due to the stop button being clicked, loss of Wi-Fi, or an unstable internet connection.\",\n );\n}\n\n/**\n * Convert embedded chunks back to a ReadableStream of Uint8Array chunks.\n */\nexport function chunksToReadableStream(\n chunks: readonly RscEmbeddedChunk[],\n): ReadableStream<Uint8Array> {\n return new ReadableStream<Uint8Array>({\n start(controller) {\n for (const chunk of chunks) {\n controller.enqueue(decodeRscEmbeddedChunk(chunk));\n }\n controller.close();\n },\n });\n}\n\n/**\n * Create a ReadableStream from progressively-embedded RSC chunks.\n *\n * The server pushes chunks into `__VINEXT_RSC_CHUNKS__` via inline <script>\n * tags. We monkey-patch `push()` so new chunks stream to React immediately\n * instead of polling with setTimeout.\n */\nexport function createProgressiveRscStream(): ReadableStream<Uint8Array> {\n return new ReadableStream<Uint8Array>({\n start(controller) {\n const vinext = getVinextBrowserGlobal();\n const initialChunks = vinext.__VINEXT_RSC_CHUNKS__ ?? [];\n\n for (const chunk of initialChunks) {\n controller.enqueue(decodeRscEmbeddedChunk(chunk));\n }\n\n if (vinext.__VINEXT_RSC_DONE__) {\n controller.close();\n return;\n }\n\n let closed = false;\n let cancelDocumentCompletionCheck: (() => void) | undefined;\n const cancelPendingDocumentCompletionCheck = () => {\n const cancel = cancelDocumentCompletionCheck;\n cancelDocumentCompletionCheck = undefined;\n cancel?.();\n };\n const closeOnce = () => {\n if (!closed) {\n closed = true;\n cancelPendingDocumentCompletionCheck();\n controller.close();\n }\n };\n const errorOnce = () => {\n if (!closed) {\n closed = true;\n cancelPendingDocumentCompletionCheck();\n controller.error(createUnexpectedRscStreamCloseError());\n }\n };\n\n const arr = (vinext.__VINEXT_RSC_CHUNKS__ ??= []);\n arr.push = function (...chunks: RscEmbeddedChunk[]): number {\n const length = Array.prototype.push.apply(this, chunks);\n\n if (closed) return length;\n\n for (const chunk of chunks) {\n controller.enqueue(decodeRscEmbeddedChunk(chunk));\n }\n\n if (vinext.__VINEXT_RSC_DONE__) {\n closeOnce();\n }\n\n return length;\n };\n\n if (typeof document !== \"undefined\") {\n if (document.readyState === \"loading\") {\n document.addEventListener(\"DOMContentLoaded\", errorOnce);\n cancelDocumentCompletionCheck = () =>\n document.removeEventListener(\"DOMContentLoaded\", errorOnce);\n } else {\n const timeoutId = setTimeout(errorOnce);\n cancelDocumentCompletionCheck = () => clearTimeout(timeoutId);\n }\n }\n },\n });\n}\n"],"mappings":";;AAwBA,SAAgB,yBAAmE;CACjF,OAAO;;AAGT,SAAS,sCAA6C;CACpD,uBAAO,IAAI,MACT,wJACD;;;;;AAMH,SAAgB,uBACd,QAC4B;CAC5B,OAAO,IAAI,eAA2B,EACpC,MAAM,YAAY;EAChB,KAAK,MAAM,SAAS,QAClB,WAAW,QAAQ,uBAAuB,MAAM,CAAC;EAEnD,WAAW,OAAO;IAErB,CAAC;;;;;;;;;AAUJ,SAAgB,6BAAyD;CACvE,OAAO,IAAI,eAA2B,EACpC,MAAM,YAAY;EAChB,MAAM,SAAS,wBAAwB;EACvC,MAAM,gBAAgB,OAAO,yBAAyB,EAAE;EAExD,KAAK,MAAM,SAAS,eAClB,WAAW,QAAQ,uBAAuB,MAAM,CAAC;EAGnD,IAAI,OAAO,qBAAqB;GAC9B,WAAW,OAAO;GAClB;;EAGF,IAAI,SAAS;EACb,IAAI;EACJ,MAAM,6CAA6C;GACjD,MAAM,SAAS;GACf,gCAAgC,KAAA;GAChC,UAAU;;EAEZ,MAAM,kBAAkB;GACtB,IAAI,CAAC,QAAQ;IACX,SAAS;IACT,sCAAsC;IACtC,WAAW,OAAO;;;EAGtB,MAAM,kBAAkB;GACtB,IAAI,CAAC,QAAQ;IACX,SAAS;IACT,sCAAsC;IACtC,WAAW,MAAM,qCAAqC,CAAC;;;EAI3D,MAAM,MAAO,OAAO,0BAA0B,EAAE;EAChD,IAAI,OAAO,SAAU,GAAG,QAAoC;GAC1D,MAAM,SAAS,MAAM,UAAU,KAAK,MAAM,MAAM,OAAO;GAEvD,IAAI,QAAQ,OAAO;GAEnB,KAAK,MAAM,SAAS,QAClB,WAAW,QAAQ,uBAAuB,MAAM,CAAC;GAGnD,IAAI,OAAO,qBACT,WAAW;GAGb,OAAO;;EAGT,IAAI,OAAO,aAAa,aACtB,IAAI,SAAS,eAAe,WAAW;GACrC,SAAS,iBAAiB,oBAAoB,UAAU;GACxD,sCACE,SAAS,oBAAoB,oBAAoB,UAAU;SACxD;GACL,MAAM,YAAY,WAAW,UAAU;GACvC,sCAAsC,aAAa,UAAU;;IAIpE,CAAC"}
@@ -1,3 +1,4 @@
1
+ import { RouteManifest } from "../routing/app-route-graph.js";
1
2
  import { ClientNavigationRenderSnapshot } from "../shims/navigation.js";
2
3
  import { AppElements } from "./app-elements-wire.js";
3
4
  import { NavigationTrace } from "./navigation-trace.js";
@@ -9,6 +10,7 @@ type VisibleCommitDecision = {
9
10
  disposition: "commit";
10
11
  preserveAbsentSlots: boolean;
11
12
  preserveElementIds: readonly string[];
13
+ preservePreviousSlotIds: readonly string[];
12
14
  trace: NavigationTrace;
13
15
  };
14
16
  type HardNavigateCommitDecision = {
@@ -25,6 +27,7 @@ type ApprovedVisibleCommit = {
25
27
  readonly [approvedVisibleCommitBrand]: true;
26
28
  readonly action: AppRouterAction;
27
29
  readonly decision: VisibleCommitDecision;
30
+ readonly interception: AppRouterAction["interception"];
28
31
  readonly interceptionContext: string | null;
29
32
  readonly previousNextUrl: string | null;
30
33
  readonly rootLayoutTreePath: string | null;
@@ -51,6 +54,7 @@ declare function approvePendingNavigationCommit(options: {
51
54
  activeNavigationId: number;
52
55
  currentState: AppRouterState;
53
56
  pending: PendingNavigationCommit;
57
+ routeManifest?: RouteManifest | null;
54
58
  startedNavigationId: number;
55
59
  targetHref: string;
56
60
  }): CommitApproval;
@@ -64,6 +68,7 @@ declare function resolveAndClassifyNavigationCommit(options: {
64
68
  operationLane: OperationLane;
65
69
  previousNextUrl?: string | null;
66
70
  renderId: number;
71
+ routeManifest?: RouteManifest | null;
67
72
  startedNavigationId: number;
68
73
  targetHref: string;
69
74
  type: "navigate" | "replace" | "traverse";
@@ -1,3 +1,5 @@
1
+ import { normalizeAppElementsSlotBindings } from "./app-elements-wire.js";
2
+ import "./app-elements.js";
1
3
  import { mergeElements } from "../shims/slot.js";
2
4
  import { NavigationTraceReasonCodes, NavigationTraceTransactionCodes, createNavigationTrace, prependNavigationTraceEntry } from "./navigation-trace.js";
3
5
  import { createPendingNavigationCommit, resolvePendingNavigationCommitDispositionDecision } from "./app-browser-state.js";
@@ -27,6 +29,28 @@ function commitVisibleRouterState(state, nextState, operation) {
27
29
  visibleCommitVersion
28
30
  };
29
31
  }
32
+ function mergeSlotBindings(previousBindings, nextBindings, layoutIds, preservePreviousSlotIds) {
33
+ if (preservePreviousSlotIds.length === 0) return nextBindings;
34
+ const preservedSlotIds = new Set(preservePreviousSlotIds);
35
+ const previousBindingsBySlotId = /* @__PURE__ */ new Map();
36
+ for (const binding of previousBindings) {
37
+ if (!preservedSlotIds.has(binding.slotId)) continue;
38
+ previousBindingsBySlotId.set(binding.slotId, binding);
39
+ }
40
+ const mergedBindings = [];
41
+ const seenSlotIds = /* @__PURE__ */ new Set();
42
+ for (const binding of nextBindings) {
43
+ const previousBinding = previousBindingsBySlotId.get(binding.slotId);
44
+ mergedBindings.push(previousBinding ?? binding);
45
+ seenSlotIds.add(binding.slotId);
46
+ }
47
+ for (const slotId of preservePreviousSlotIds) {
48
+ if (seenSlotIds.has(slotId)) continue;
49
+ const previousBinding = previousBindingsBySlotId.get(slotId);
50
+ if (previousBinding) mergedBindings.push(previousBinding);
51
+ }
52
+ return normalizeAppElementsSlotBindings(mergedBindings, { layoutIds });
53
+ }
30
54
  function reduceApprovedVisibleCommitState(state, commit) {
31
55
  const { action } = commit;
32
56
  switch (action.type) {
@@ -35,8 +59,10 @@ function reduceApprovedVisibleCommitState(state, commit) {
35
59
  elements: mergeElements(state.elements, action.elements, {
36
60
  clearAbsentSlots: action.type === "traverse",
37
61
  preserveAbsentSlots: commit.decision.preserveAbsentSlots,
38
- preserveElementIds: commit.decision.preserveElementIds
62
+ preserveElementIds: commit.decision.preserveElementIds,
63
+ preservePreviousSlotIds: commit.decision.preservePreviousSlotIds
39
64
  }),
65
+ interception: action.interception,
40
66
  interceptionContext: action.interceptionContext,
41
67
  layoutFlags: mergeLayoutFlags(state.layoutFlags, action.layoutFlags, commit.decision.preserveElementIds),
42
68
  layoutIds: action.layoutIds,
@@ -44,10 +70,12 @@ function reduceApprovedVisibleCommitState(state, commit) {
44
70
  previousNextUrl: action.previousNextUrl,
45
71
  renderId: action.renderId,
46
72
  rootLayoutTreePath: action.rootLayoutTreePath,
47
- routeId: action.routeId
73
+ routeId: action.routeId,
74
+ slotBindings: mergeSlotBindings(state.slotBindings, action.slotBindings, action.layoutIds, commit.decision.preservePreviousSlotIds)
48
75
  }, action.operation);
49
76
  case "replace": return commitVisibleRouterState(state, {
50
77
  elements: action.elements,
78
+ interception: action.interception,
51
79
  interceptionContext: action.interceptionContext,
52
80
  layoutFlags: action.layoutFlags,
53
81
  layoutIds: action.layoutIds,
@@ -55,7 +83,8 @@ function reduceApprovedVisibleCommitState(state, commit) {
55
83
  previousNextUrl: action.previousNextUrl,
56
84
  renderId: action.renderId,
57
85
  rootLayoutTreePath: action.rootLayoutTreePath,
58
- routeId: action.routeId
86
+ routeId: action.routeId,
87
+ slotBindings: action.slotBindings
59
88
  }, action.operation);
60
89
  default: {
61
90
  const _exhaustive = action.type;
@@ -74,15 +103,16 @@ function resolvePendingNavigationCommitDecision(options) {
74
103
  disposition: "hard-navigate",
75
104
  trace: decision.trace
76
105
  };
77
- case "dispatch": return createVisibleCommitDecision(decision.trace, decision.preserveElementIds, decision.preserveAbsentSlots);
106
+ case "dispatch": return createVisibleCommitDecision(decision.trace, decision.preserveElementIds, decision.preserveAbsentSlots, decision.preservePreviousSlotIds);
78
107
  default: throw new Error("[vinext] Unknown navigation commit disposition: " + String(decision));
79
108
  }
80
109
  }
81
- function createVisibleCommitDecision(trace = createNavigationTrace(NavigationTraceReasonCodes.commitCurrent), preserveElementIds = [], preserveAbsentSlots = false) {
110
+ function createVisibleCommitDecision(trace = createNavigationTrace(NavigationTraceReasonCodes.commitCurrent), preserveElementIds = [], preserveAbsentSlots = false, preservePreviousSlotIds = []) {
82
111
  return {
83
112
  disposition: "commit",
84
113
  preserveAbsentSlots,
85
114
  preserveElementIds: [...preserveElementIds],
115
+ preservePreviousSlotIds: [...preservePreviousSlotIds],
86
116
  trace
87
117
  };
88
118
  }
@@ -100,6 +130,7 @@ function createApprovedVisibleCommit(options) {
100
130
  [approvedVisibleCommitBrand]: true,
101
131
  action: options.pending.action,
102
132
  decision: options.decision,
133
+ interception: options.pending.interception,
103
134
  interceptionContext: options.pending.interceptionContext,
104
135
  previousNextUrl: options.pending.previousNextUrl,
105
136
  rootLayoutTreePath: options.pending.rootLayoutTreePath,
@@ -147,6 +178,7 @@ function approvePendingNavigationCommit(options) {
147
178
  activeNavigationId: options.activeNavigationId,
148
179
  currentState: options.currentState,
149
180
  pending: options.pending,
181
+ routeManifest: options.routeManifest ?? null,
150
182
  startedNavigationId: options.startedNavigationId,
151
183
  targetHref: options.targetHref
152
184
  }), options.pending);
@@ -181,6 +213,7 @@ async function resolveAndClassifyNavigationCommit(options) {
181
213
  activeNavigationId: options.getActiveNavigationId?.() ?? options.activeNavigationId,
182
214
  currentState: approvalState,
183
215
  pending,
216
+ routeManifest: options.routeManifest ?? null,
184
217
  startedNavigationId: options.startedNavigationId,
185
218
  targetHref: options.targetHref
186
219
  });
@@ -1 +1 @@
1
- {"version":3,"file":"app-browser-visible-commit.js","names":["_exhaustive"],"sources":["../../src/server/app-browser-visible-commit.ts"],"sourcesContent":["import type { ClientNavigationRenderSnapshot } from \"vinext/shims/navigation\";\nimport { mergeElements } from \"vinext/shims/slot\";\nimport type { AppElements } from \"./app-elements.js\";\nimport {\n createPendingNavigationCommit,\n resolvePendingNavigationCommitDispositionDecision,\n type AppRouterAction,\n type AppRouterState,\n type CommittedOperationRecord,\n type OperationLane,\n type PendingNavigationCommit,\n type PendingOperationRecord,\n} from \"./app-browser-state.js\";\nimport {\n NavigationTraceReasonCodes,\n NavigationTraceTransactionCodes,\n createNavigationTrace,\n prependNavigationTraceEntry,\n type NavigationTrace,\n type NavigationTraceFields,\n type NavigationTraceTransactionCode,\n} from \"./navigation-trace.js\";\n\ntype VisibleCommitDecision = {\n disposition: \"commit\";\n preserveAbsentSlots: boolean;\n preserveElementIds: readonly string[];\n trace: NavigationTrace;\n};\ntype HardNavigateCommitDecision = {\n disposition: \"hard-navigate\";\n trace: NavigationTrace;\n};\ntype NoCommitDecision = {\n disposition: \"no-commit\";\n trace: NavigationTrace;\n};\ntype CommitDecision = VisibleCommitDecision | HardNavigateCommitDecision | NoCommitDecision;\nconst approvedVisibleCommitBrand: unique symbol = Symbol(\"ApprovedVisibleCommit\");\nexport type ApprovedVisibleCommit = {\n readonly [approvedVisibleCommitBrand]: true;\n readonly action: AppRouterAction;\n readonly decision: VisibleCommitDecision;\n readonly interceptionContext: string | null;\n readonly previousNextUrl: string | null;\n readonly rootLayoutTreePath: string | null;\n readonly routeId: string;\n};\ntype VisibleCommitApproval = {\n approvedCommit: ApprovedVisibleCommit;\n decision: VisibleCommitDecision;\n};\ntype NonVisibleCommitApproval = {\n approvedCommit: null;\n decision: HardNavigateCommitDecision | NoCommitDecision;\n};\ntype CommitApproval = VisibleCommitApproval | NonVisibleCommitApproval;\ntype ClassifiedPendingNavigationCommit = {\n approvedCommit: ApprovedVisibleCommit | null;\n decision: CommitDecision;\n pending: PendingNavigationCommit;\n trace: NavigationTrace;\n};\n\nexport function applyApprovedVisibleCommit(\n state: AppRouterState,\n commit: ApprovedVisibleCommit,\n): AppRouterState {\n assertApprovedVisibleCommit(commit);\n return reduceApprovedVisibleCommitState(state, commit);\n}\n\nfunction assertApprovedVisibleCommit(commit: ApprovedVisibleCommit): void {\n if (commit[approvedVisibleCommitBrand] !== true) {\n throw new Error(\"[vinext] Visible router state mutation requires ApprovedVisibleCommit\");\n }\n}\n\nfunction commitOperationRecord(\n operation: PendingOperationRecord,\n visibleCommitVersion: number,\n): CommittedOperationRecord {\n return {\n id: operation.id,\n lane: operation.lane,\n startedVisibleCommitVersion: operation.startedVisibleCommitVersion,\n state: \"committed\",\n visibleCommitVersion,\n };\n}\n\nfunction commitVisibleRouterState(\n state: AppRouterState,\n nextState: Omit<AppRouterState, \"activeOperation\" | \"visibleCommitVersion\">,\n operation: PendingOperationRecord,\n): AppRouterState {\n // Single owner for visibleCommitVersion: only an ApprovedVisibleCommit may\n // advance it, and every accepted visible mutation advances it exactly once.\n const visibleCommitVersion = state.visibleCommitVersion + 1;\n return {\n ...nextState,\n activeOperation: commitOperationRecord(operation, visibleCommitVersion),\n visibleCommitVersion,\n };\n}\n\nfunction reduceApprovedVisibleCommitState(\n state: AppRouterState,\n commit: ApprovedVisibleCommit,\n): AppRouterState {\n const { action } = commit;\n switch (action.type) {\n case \"traverse\":\n case \"navigate\":\n return commitVisibleRouterState(\n state,\n {\n elements: mergeElements(state.elements, action.elements, {\n clearAbsentSlots: action.type === \"traverse\",\n preserveAbsentSlots: commit.decision.preserveAbsentSlots,\n preserveElementIds: commit.decision.preserveElementIds,\n }),\n interceptionContext: action.interceptionContext,\n layoutFlags: mergeLayoutFlags(\n state.layoutFlags,\n action.layoutFlags,\n commit.decision.preserveElementIds,\n ),\n layoutIds: action.layoutIds,\n navigationSnapshot: action.navigationSnapshot,\n previousNextUrl: action.previousNextUrl,\n renderId: action.renderId,\n rootLayoutTreePath: action.rootLayoutTreePath,\n routeId: action.routeId,\n },\n action.operation,\n );\n case \"replace\":\n return commitVisibleRouterState(\n state,\n {\n elements: action.elements,\n interceptionContext: action.interceptionContext,\n layoutFlags: action.layoutFlags,\n layoutIds: action.layoutIds,\n navigationSnapshot: action.navigationSnapshot,\n previousNextUrl: action.previousNextUrl,\n renderId: action.renderId,\n rootLayoutTreePath: action.rootLayoutTreePath,\n routeId: action.routeId,\n },\n action.operation,\n );\n default: {\n const _exhaustive: never = action.type;\n throw new Error(\"[vinext] Unknown router action: \" + String(_exhaustive));\n }\n }\n}\n\nfunction resolvePendingNavigationCommitDecision(options: {\n activeNavigationId: number;\n currentState: AppRouterState;\n pending: PendingNavigationCommit;\n startedNavigationId: number;\n targetHref: string;\n}): CommitDecision {\n const decision = resolvePendingNavigationCommitDispositionDecision(options);\n\n switch (decision.disposition) {\n case \"skip\":\n return { disposition: \"no-commit\", trace: decision.trace };\n case \"hard-navigate\":\n return { disposition: \"hard-navigate\", trace: decision.trace };\n case \"dispatch\":\n return createVisibleCommitDecision(\n decision.trace,\n decision.preserveElementIds,\n decision.preserveAbsentSlots,\n );\n default: {\n const _exhaustive: never = decision;\n throw new Error(\"[vinext] Unknown navigation commit disposition: \" + String(_exhaustive));\n }\n }\n}\n\nfunction createVisibleCommitDecision(\n trace: NavigationTrace = createNavigationTrace(NavigationTraceReasonCodes.commitCurrent),\n preserveElementIds: readonly string[] = [],\n preserveAbsentSlots: boolean = false,\n): VisibleCommitDecision {\n return {\n disposition: \"commit\",\n preserveAbsentSlots,\n preserveElementIds: [...preserveElementIds],\n trace,\n };\n}\n\nfunction mergeLayoutFlags(\n previousFlags: AppRouterState[\"layoutFlags\"],\n nextFlags: AppRouterState[\"layoutFlags\"],\n preserveElementIds: readonly string[],\n): AppRouterState[\"layoutFlags\"] {\n const merged: Record<string, \"s\" | \"d\"> = { ...nextFlags };\n for (const id of preserveElementIds) {\n if (Object.hasOwn(merged, id)) continue;\n const value = previousFlags[id];\n if (value) merged[id] = value;\n }\n return merged;\n}\n\nfunction createApprovedVisibleCommit(options: {\n decision: VisibleCommitDecision;\n pending: PendingNavigationCommit;\n}): ApprovedVisibleCommit {\n return {\n [approvedVisibleCommitBrand]: true,\n action: options.pending.action,\n decision: options.decision,\n interceptionContext: options.pending.interceptionContext,\n previousNextUrl: options.pending.previousNextUrl,\n rootLayoutTreePath: options.pending.rootLayoutTreePath,\n routeId: options.pending.routeId,\n };\n}\n\nfunction createCommitTransactionFields(pending: PendingNavigationCommit): NavigationTraceFields {\n return {\n operationLane: pending.action.operation.lane,\n pendingOperationId: pending.action.operation.id,\n startedVisibleCommitVersion: pending.action.operation.startedVisibleCommitVersion,\n };\n}\n\nfunction prependCommitTransactionTrace(\n trace: NavigationTrace,\n code: NavigationTraceTransactionCode,\n pending: PendingNavigationCommit,\n): NavigationTrace {\n return prependNavigationTraceEntry(trace, code, createCommitTransactionFields(pending));\n}\n\nfunction addCommitTransactionTrace(\n decision: CommitDecision,\n pending: PendingNavigationCommit,\n): CommitDecision {\n switch (decision.disposition) {\n case \"commit\":\n return {\n ...decision,\n trace: prependCommitTransactionTrace(\n decision.trace,\n NavigationTraceTransactionCodes.visibleCommit,\n pending,\n ),\n };\n case \"hard-navigate\":\n return {\n ...decision,\n trace: prependCommitTransactionTrace(\n decision.trace,\n NavigationTraceTransactionCodes.hardNavigate,\n pending,\n ),\n };\n case \"no-commit\":\n return {\n ...decision,\n trace: prependCommitTransactionTrace(\n decision.trace,\n NavigationTraceTransactionCodes.noCommit,\n pending,\n ),\n };\n default: {\n const _exhaustive: never = decision;\n throw new Error(\"[vinext] Unknown commit decision: \" + String(_exhaustive));\n }\n }\n}\n\nexport function approveHmrVisibleCommit(pending: PendingNavigationCommit): ApprovedVisibleCommit {\n if (pending.action.operation.lane !== \"hmr\") {\n throw new Error(\"[vinext] HMR visible commit approval requires an HMR pending operation\");\n }\n\n const decision = addCommitTransactionTrace(createVisibleCommitDecision(), pending);\n // This guard is a type narrowing assertion: createVisibleCommitDecision()\n // structurally produces a commit decision, and addCommitTransactionTrace()\n // must preserve that disposition while adding operator trace context.\n if (decision.disposition !== \"commit\") {\n throw new Error(\"[vinext] HMR visible commit approval did not produce a commit decision\");\n }\n\n return createApprovedVisibleCommit({\n decision,\n pending,\n });\n}\n\nexport function approvePendingNavigationCommit(options: {\n activeNavigationId: number;\n currentState: AppRouterState;\n pending: PendingNavigationCommit;\n startedNavigationId: number;\n targetHref: string;\n}): CommitApproval {\n const decision = addCommitTransactionTrace(\n resolvePendingNavigationCommitDecision({\n activeNavigationId: options.activeNavigationId,\n currentState: options.currentState,\n pending: options.pending,\n startedNavigationId: options.startedNavigationId,\n targetHref: options.targetHref,\n }),\n options.pending,\n );\n\n switch (decision.disposition) {\n case \"commit\":\n return {\n approvedCommit: createApprovedVisibleCommit({\n decision,\n pending: options.pending,\n }),\n decision,\n };\n case \"hard-navigate\":\n case \"no-commit\":\n return {\n approvedCommit: null,\n decision,\n };\n default: {\n const _exhaustive: never = decision;\n throw new Error(\"[vinext] Unknown commit decision: \" + String(_exhaustive));\n }\n }\n}\n\nexport async function resolveAndClassifyNavigationCommit(options: {\n activeNavigationId: number;\n currentState: AppRouterState;\n // When provided, these getters are called after awaiting nextElements so\n // approval uses the latest lifecycle authority instead of the call snapshot.\n getActiveNavigationId?: () => number;\n getCurrentStateForApproval?: () => AppRouterState;\n navigationSnapshot: ClientNavigationRenderSnapshot;\n nextElements: Promise<AppElements>;\n operationLane: OperationLane;\n previousNextUrl?: string | null;\n renderId: number;\n startedNavigationId: number;\n targetHref: string;\n type: \"navigate\" | \"replace\" | \"traverse\";\n}): Promise<ClassifiedPendingNavigationCommit> {\n const pending = await createPendingNavigationCommit({\n currentState: options.currentState,\n nextElements: options.nextElements,\n navigationSnapshot: options.navigationSnapshot,\n operationLane: options.operationLane,\n previousNextUrl: options.previousNextUrl,\n renderId: options.renderId,\n type: options.type,\n });\n\n const approvalState = options.getCurrentStateForApproval?.() ?? options.currentState;\n const approval = approvePendingNavigationCommit({\n activeNavigationId: options.getActiveNavigationId?.() ?? options.activeNavigationId,\n currentState: approvalState,\n pending,\n startedNavigationId: options.startedNavigationId,\n targetHref: options.targetHref,\n });\n\n return {\n approvedCommit: approval.approvedCommit,\n decision: approval.decision,\n pending,\n trace: approval.decision.trace,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"app-browser-visible-commit.js","names":["_exhaustive"],"sources":["../../src/server/app-browser-visible-commit.ts"],"sourcesContent":["import type { ClientNavigationRenderSnapshot } from \"vinext/shims/navigation\";\nimport type { RouteManifest } from \"../routing/app-route-graph.js\";\nimport { mergeElements } from \"vinext/shims/slot\";\nimport {\n normalizeAppElementsSlotBindings,\n type AppElements,\n type AppElementsSlotBinding,\n} from \"./app-elements.js\";\nimport {\n createPendingNavigationCommit,\n resolvePendingNavigationCommitDispositionDecision,\n type AppRouterAction,\n type AppRouterState,\n type CommittedOperationRecord,\n type OperationLane,\n type PendingNavigationCommit,\n type PendingOperationRecord,\n} from \"./app-browser-state.js\";\nimport {\n NavigationTraceReasonCodes,\n NavigationTraceTransactionCodes,\n createNavigationTrace,\n prependNavigationTraceEntry,\n type NavigationTrace,\n type NavigationTraceFields,\n type NavigationTraceTransactionCode,\n} from \"./navigation-trace.js\";\n\ntype VisibleCommitDecision = {\n disposition: \"commit\";\n preserveAbsentSlots: boolean;\n preserveElementIds: readonly string[];\n preservePreviousSlotIds: readonly string[];\n trace: NavigationTrace;\n};\ntype HardNavigateCommitDecision = {\n disposition: \"hard-navigate\";\n trace: NavigationTrace;\n};\ntype NoCommitDecision = {\n disposition: \"no-commit\";\n trace: NavigationTrace;\n};\ntype CommitDecision = VisibleCommitDecision | HardNavigateCommitDecision | NoCommitDecision;\nconst approvedVisibleCommitBrand: unique symbol = Symbol(\"ApprovedVisibleCommit\");\nexport type ApprovedVisibleCommit = {\n readonly [approvedVisibleCommitBrand]: true;\n readonly action: AppRouterAction;\n readonly decision: VisibleCommitDecision;\n readonly interception: AppRouterAction[\"interception\"];\n readonly interceptionContext: string | null;\n readonly previousNextUrl: string | null;\n readonly rootLayoutTreePath: string | null;\n readonly routeId: string;\n};\ntype VisibleCommitApproval = {\n approvedCommit: ApprovedVisibleCommit;\n decision: VisibleCommitDecision;\n};\ntype NonVisibleCommitApproval = {\n approvedCommit: null;\n decision: HardNavigateCommitDecision | NoCommitDecision;\n};\ntype CommitApproval = VisibleCommitApproval | NonVisibleCommitApproval;\ntype ClassifiedPendingNavigationCommit = {\n approvedCommit: ApprovedVisibleCommit | null;\n decision: CommitDecision;\n pending: PendingNavigationCommit;\n trace: NavigationTrace;\n};\n\nexport function applyApprovedVisibleCommit(\n state: AppRouterState,\n commit: ApprovedVisibleCommit,\n): AppRouterState {\n assertApprovedVisibleCommit(commit);\n return reduceApprovedVisibleCommitState(state, commit);\n}\n\nfunction assertApprovedVisibleCommit(commit: ApprovedVisibleCommit): void {\n if (commit[approvedVisibleCommitBrand] !== true) {\n throw new Error(\"[vinext] Visible router state mutation requires ApprovedVisibleCommit\");\n }\n}\n\nfunction commitOperationRecord(\n operation: PendingOperationRecord,\n visibleCommitVersion: number,\n): CommittedOperationRecord {\n return {\n id: operation.id,\n lane: operation.lane,\n startedVisibleCommitVersion: operation.startedVisibleCommitVersion,\n state: \"committed\",\n visibleCommitVersion,\n };\n}\n\nfunction commitVisibleRouterState(\n state: AppRouterState,\n nextState: Omit<AppRouterState, \"activeOperation\" | \"visibleCommitVersion\">,\n operation: PendingOperationRecord,\n): AppRouterState {\n // Single owner for visibleCommitVersion: only an ApprovedVisibleCommit may\n // advance it, and every accepted visible mutation advances it exactly once.\n const visibleCommitVersion = state.visibleCommitVersion + 1;\n return {\n ...nextState,\n activeOperation: commitOperationRecord(operation, visibleCommitVersion),\n visibleCommitVersion,\n };\n}\n\nfunction mergeSlotBindings(\n previousBindings: readonly AppElementsSlotBinding[],\n nextBindings: readonly AppElementsSlotBinding[],\n layoutIds: readonly string[],\n preservePreviousSlotIds: readonly string[],\n): readonly AppElementsSlotBinding[] {\n if (preservePreviousSlotIds.length === 0) return nextBindings;\n\n const preservedSlotIds = new Set(preservePreviousSlotIds);\n const previousBindingsBySlotId = new Map<string, AppElementsSlotBinding>();\n for (const binding of previousBindings) {\n if (!preservedSlotIds.has(binding.slotId)) continue;\n previousBindingsBySlotId.set(binding.slotId, binding);\n }\n\n const mergedBindings: AppElementsSlotBinding[] = [];\n const seenSlotIds = new Set<string>();\n for (const binding of nextBindings) {\n const previousBinding = previousBindingsBySlotId.get(binding.slotId);\n mergedBindings.push(previousBinding ?? binding);\n seenSlotIds.add(binding.slotId);\n }\n for (const slotId of preservePreviousSlotIds) {\n if (seenSlotIds.has(slotId)) continue;\n const previousBinding = previousBindingsBySlotId.get(slotId);\n if (previousBinding) mergedBindings.push(previousBinding);\n }\n return normalizeAppElementsSlotBindings(mergedBindings, { layoutIds });\n}\n\nfunction reduceApprovedVisibleCommitState(\n state: AppRouterState,\n commit: ApprovedVisibleCommit,\n): AppRouterState {\n const { action } = commit;\n switch (action.type) {\n case \"traverse\":\n case \"navigate\":\n return commitVisibleRouterState(\n state,\n {\n elements: mergeElements(state.elements, action.elements, {\n clearAbsentSlots: action.type === \"traverse\",\n preserveAbsentSlots: commit.decision.preserveAbsentSlots,\n preserveElementIds: commit.decision.preserveElementIds,\n preservePreviousSlotIds: commit.decision.preservePreviousSlotIds,\n }),\n interception: action.interception,\n interceptionContext: action.interceptionContext,\n layoutFlags: mergeLayoutFlags(\n state.layoutFlags,\n action.layoutFlags,\n commit.decision.preserveElementIds,\n ),\n layoutIds: action.layoutIds,\n navigationSnapshot: action.navigationSnapshot,\n previousNextUrl: action.previousNextUrl,\n renderId: action.renderId,\n rootLayoutTreePath: action.rootLayoutTreePath,\n routeId: action.routeId,\n slotBindings: mergeSlotBindings(\n state.slotBindings,\n action.slotBindings,\n action.layoutIds,\n commit.decision.preservePreviousSlotIds,\n ),\n },\n action.operation,\n );\n case \"replace\":\n return commitVisibleRouterState(\n state,\n {\n elements: action.elements,\n interception: action.interception,\n interceptionContext: action.interceptionContext,\n layoutFlags: action.layoutFlags,\n layoutIds: action.layoutIds,\n navigationSnapshot: action.navigationSnapshot,\n previousNextUrl: action.previousNextUrl,\n renderId: action.renderId,\n rootLayoutTreePath: action.rootLayoutTreePath,\n routeId: action.routeId,\n slotBindings: action.slotBindings,\n },\n action.operation,\n );\n default: {\n const _exhaustive: never = action.type;\n throw new Error(\"[vinext] Unknown router action: \" + String(_exhaustive));\n }\n }\n}\n\nfunction resolvePendingNavigationCommitDecision(options: {\n activeNavigationId: number;\n currentState: AppRouterState;\n pending: PendingNavigationCommit;\n routeManifest?: RouteManifest | null;\n startedNavigationId: number;\n targetHref: string;\n}): CommitDecision {\n const decision = resolvePendingNavigationCommitDispositionDecision(options);\n\n switch (decision.disposition) {\n case \"skip\":\n return { disposition: \"no-commit\", trace: decision.trace };\n case \"hard-navigate\":\n return { disposition: \"hard-navigate\", trace: decision.trace };\n case \"dispatch\":\n return createVisibleCommitDecision(\n decision.trace,\n decision.preserveElementIds,\n decision.preserveAbsentSlots,\n decision.preservePreviousSlotIds,\n );\n default: {\n const _exhaustive: never = decision;\n throw new Error(\"[vinext] Unknown navigation commit disposition: \" + String(_exhaustive));\n }\n }\n}\n\nfunction createVisibleCommitDecision(\n trace: NavigationTrace = createNavigationTrace(NavigationTraceReasonCodes.commitCurrent),\n preserveElementIds: readonly string[] = [],\n preserveAbsentSlots: boolean = false,\n preservePreviousSlotIds: readonly string[] = [],\n): VisibleCommitDecision {\n return {\n disposition: \"commit\",\n preserveAbsentSlots,\n preserveElementIds: [...preserveElementIds],\n preservePreviousSlotIds: [...preservePreviousSlotIds],\n trace,\n };\n}\n\nfunction mergeLayoutFlags(\n previousFlags: AppRouterState[\"layoutFlags\"],\n nextFlags: AppRouterState[\"layoutFlags\"],\n preserveElementIds: readonly string[],\n): AppRouterState[\"layoutFlags\"] {\n const merged: Record<string, \"s\" | \"d\"> = { ...nextFlags };\n for (const id of preserveElementIds) {\n if (Object.hasOwn(merged, id)) continue;\n const value = previousFlags[id];\n if (value) merged[id] = value;\n }\n return merged;\n}\n\nfunction createApprovedVisibleCommit(options: {\n decision: VisibleCommitDecision;\n pending: PendingNavigationCommit;\n}): ApprovedVisibleCommit {\n return {\n [approvedVisibleCommitBrand]: true,\n action: options.pending.action,\n decision: options.decision,\n interception: options.pending.interception,\n interceptionContext: options.pending.interceptionContext,\n previousNextUrl: options.pending.previousNextUrl,\n rootLayoutTreePath: options.pending.rootLayoutTreePath,\n routeId: options.pending.routeId,\n };\n}\n\nfunction createCommitTransactionFields(pending: PendingNavigationCommit): NavigationTraceFields {\n return {\n operationLane: pending.action.operation.lane,\n pendingOperationId: pending.action.operation.id,\n startedVisibleCommitVersion: pending.action.operation.startedVisibleCommitVersion,\n };\n}\n\nfunction prependCommitTransactionTrace(\n trace: NavigationTrace,\n code: NavigationTraceTransactionCode,\n pending: PendingNavigationCommit,\n): NavigationTrace {\n return prependNavigationTraceEntry(trace, code, createCommitTransactionFields(pending));\n}\n\nfunction addCommitTransactionTrace(\n decision: CommitDecision,\n pending: PendingNavigationCommit,\n): CommitDecision {\n switch (decision.disposition) {\n case \"commit\":\n return {\n ...decision,\n trace: prependCommitTransactionTrace(\n decision.trace,\n NavigationTraceTransactionCodes.visibleCommit,\n pending,\n ),\n };\n case \"hard-navigate\":\n return {\n ...decision,\n trace: prependCommitTransactionTrace(\n decision.trace,\n NavigationTraceTransactionCodes.hardNavigate,\n pending,\n ),\n };\n case \"no-commit\":\n return {\n ...decision,\n trace: prependCommitTransactionTrace(\n decision.trace,\n NavigationTraceTransactionCodes.noCommit,\n pending,\n ),\n };\n default: {\n const _exhaustive: never = decision;\n throw new Error(\"[vinext] Unknown commit decision: \" + String(_exhaustive));\n }\n }\n}\n\nexport function approveHmrVisibleCommit(pending: PendingNavigationCommit): ApprovedVisibleCommit {\n if (pending.action.operation.lane !== \"hmr\") {\n throw new Error(\"[vinext] HMR visible commit approval requires an HMR pending operation\");\n }\n\n const decision = addCommitTransactionTrace(createVisibleCommitDecision(), pending);\n // This guard is a type narrowing assertion: createVisibleCommitDecision()\n // structurally produces a commit decision, and addCommitTransactionTrace()\n // must preserve that disposition while adding operator trace context.\n if (decision.disposition !== \"commit\") {\n throw new Error(\"[vinext] HMR visible commit approval did not produce a commit decision\");\n }\n\n return createApprovedVisibleCommit({\n decision,\n pending,\n });\n}\n\nexport function approvePendingNavigationCommit(options: {\n activeNavigationId: number;\n currentState: AppRouterState;\n pending: PendingNavigationCommit;\n routeManifest?: RouteManifest | null;\n startedNavigationId: number;\n targetHref: string;\n}): CommitApproval {\n const decision = addCommitTransactionTrace(\n resolvePendingNavigationCommitDecision({\n activeNavigationId: options.activeNavigationId,\n currentState: options.currentState,\n pending: options.pending,\n routeManifest: options.routeManifest ?? null,\n startedNavigationId: options.startedNavigationId,\n targetHref: options.targetHref,\n }),\n options.pending,\n );\n\n switch (decision.disposition) {\n case \"commit\":\n return {\n approvedCommit: createApprovedVisibleCommit({\n decision,\n pending: options.pending,\n }),\n decision,\n };\n case \"hard-navigate\":\n case \"no-commit\":\n return {\n approvedCommit: null,\n decision,\n };\n default: {\n const _exhaustive: never = decision;\n throw new Error(\"[vinext] Unknown commit decision: \" + String(_exhaustive));\n }\n }\n}\n\nexport async function resolveAndClassifyNavigationCommit(options: {\n activeNavigationId: number;\n currentState: AppRouterState;\n // When provided, these getters are called after awaiting nextElements so\n // approval uses the latest lifecycle authority instead of the call snapshot.\n getActiveNavigationId?: () => number;\n getCurrentStateForApproval?: () => AppRouterState;\n navigationSnapshot: ClientNavigationRenderSnapshot;\n nextElements: Promise<AppElements>;\n operationLane: OperationLane;\n previousNextUrl?: string | null;\n renderId: number;\n routeManifest?: RouteManifest | null;\n startedNavigationId: number;\n targetHref: string;\n type: \"navigate\" | \"replace\" | \"traverse\";\n}): Promise<ClassifiedPendingNavigationCommit> {\n const pending = await createPendingNavigationCommit({\n currentState: options.currentState,\n nextElements: options.nextElements,\n navigationSnapshot: options.navigationSnapshot,\n operationLane: options.operationLane,\n previousNextUrl: options.previousNextUrl,\n renderId: options.renderId,\n type: options.type,\n });\n\n const approvalState = options.getCurrentStateForApproval?.() ?? options.currentState;\n const approval = approvePendingNavigationCommit({\n activeNavigationId: options.getActiveNavigationId?.() ?? options.activeNavigationId,\n currentState: approvalState,\n pending,\n routeManifest: options.routeManifest ?? null,\n startedNavigationId: options.startedNavigationId,\n targetHref: options.targetHref,\n });\n\n return {\n approvedCommit: approval.approvedCommit,\n decision: approval.decision,\n pending,\n trace: approval.decision.trace,\n };\n}\n"],"mappings":"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"}
@@ -1,17 +1,38 @@
1
+ import { RenderObservation } from "./cache-proof.js";
1
2
  import { ArtifactCompatibilityEnvelope } from "./artifact-compatibility.js";
2
3
  import { ReactNode } from "react";
3
4
 
4
5
  //#region src/server/app-elements-wire.d.ts
5
6
  declare const APP_ARTIFACT_COMPATIBILITY_KEY = "__artifactCompatibility";
7
+ declare const APP_INTERCEPTION_KEY = "__interception";
6
8
  declare const APP_INTERCEPTION_CONTEXT_KEY = "__interceptionContext";
7
9
  declare const APP_LAYOUT_IDS_KEY = "__layoutIds";
8
10
  declare const APP_LAYOUT_FLAGS_KEY = "__layoutFlags";
11
+ declare const APP_RENDER_OBSERVATION_KEY = "__renderObservation";
9
12
  declare const APP_ROUTE_KEY = "__route";
10
13
  declare const APP_ROOT_LAYOUT_KEY = "__rootLayout";
14
+ declare const APP_SLOT_BINDINGS_KEY = "__slotBindings";
11
15
  declare const APP_UNMATCHED_SLOT_WIRE_VALUE = "__VINEXT_UNMATCHED_SLOT__";
12
16
  declare const UNMATCHED_SLOT: unique symbol;
13
- type AppElementValue = ReactNode | typeof UNMATCHED_SLOT | string | null;
14
- type AppWireElementValue = ReactNode | string | null;
17
+ type AppElementsSlotBindingState = "active" | "default" | "unmatched";
18
+ type AppElementsSlotBinding = Readonly<{
19
+ ownerLayoutId: string | null;
20
+ slotId: string;
21
+ state: AppElementsSlotBindingState;
22
+ }>;
23
+ type AppElementsInterception = Readonly<{
24
+ sourceMatchedUrl: string;
25
+ sourceRouteId: string;
26
+ slotId: string;
27
+ targetMatchedUrl: string;
28
+ targetRouteId: string;
29
+ }>;
30
+ declare function compareAppElementsSlotIds(left: string, right: string): number;
31
+ declare function normalizeAppElementsSlotBindings(slotBindings: readonly AppElementsSlotBinding[], options?: {
32
+ layoutIds?: readonly string[];
33
+ }): readonly AppElementsSlotBinding[];
34
+ type AppElementValue = ReactNode | typeof UNMATCHED_SLOT | string | null | LayoutFlags | ArtifactCompatibilityEnvelope | AppElementsInterception | readonly AppElementsSlotBinding[];
35
+ type AppWireElementValue = ReactNode | string | null | LayoutFlags | ArtifactCompatibilityEnvelope | AppElementsInterception | readonly AppElementsSlotBinding[];
15
36
  type AppElements = Readonly<Record<string, AppElementValue>>;
16
37
  type AppWireElements = Readonly<Record<string, AppWireElementValue>>;
17
38
  /**
@@ -34,11 +55,13 @@ type AppWireElements = Readonly<Record<string, AppWireElementValue>>;
34
55
  type LayoutFlags = Readonly<Record<string, "s" | "d">>;
35
56
  type AppElementsMetadata = {
36
57
  artifactCompatibility: ArtifactCompatibilityEnvelope;
58
+ interception: AppElementsInterception | null;
37
59
  interceptionContext: string | null;
38
60
  layoutIds: readonly string[];
39
61
  layoutFlags: LayoutFlags;
40
62
  routeId: string;
41
63
  rootLayoutTreePath: string | null;
64
+ slotBindings: readonly AppElementsSlotBinding[];
42
65
  };
43
66
  type AppElementsWireElementKey = {
44
67
  kind: "layout";
@@ -60,16 +83,20 @@ type AppElementsWireElementKey = {
60
83
  treePath: string;
61
84
  };
62
85
  type AppElementsWireMetadataInput = {
86
+ interception?: AppElementsInterception | null;
63
87
  interceptionContext: string | null;
64
88
  layoutIds?: readonly string[];
65
89
  routeId: string;
66
90
  rootLayoutTreePath: string | null;
91
+ slotBindings?: readonly AppElementsSlotBinding[];
67
92
  };
68
93
  type AppElementsWireMetadataEntries = Readonly<{
69
94
  [APP_ROUTE_KEY]: string;
95
+ [APP_INTERCEPTION_KEY]?: AppElementsInterception;
70
96
  [APP_INTERCEPTION_CONTEXT_KEY]: string | null;
71
97
  [APP_LAYOUT_IDS_KEY]: readonly string[];
72
98
  [APP_ROOT_LAYOUT_KEY]: string | null;
99
+ [APP_SLOT_BINDINGS_KEY]?: readonly AppElementsSlotBinding[];
73
100
  }>;
74
101
  /**
75
102
  * The outgoing wire payload shape. Includes ReactNode values for the
@@ -77,14 +104,17 @@ type AppElementsWireMetadataEntries = Readonly<{
77
104
  * known keys (e.g. __layoutFlags). Distinct from AppElements / AppWireElements
78
105
  * which only carry render-time values.
79
106
  */
80
- type AppOutgoingElements = Readonly<Record<string, ReactNode | LayoutFlags | ArtifactCompatibilityEnvelope>>;
107
+ type AppOutgoingElements = Readonly<Record<string, ReactNode | LayoutFlags | ArtifactCompatibilityEnvelope | AppElementsInterception | RenderObservation | readonly AppElementsSlotBinding[]>>;
81
108
  type AppElementsWireKeys = {
82
109
  readonly artifactCompatibility: typeof APP_ARTIFACT_COMPATIBILITY_KEY;
110
+ readonly interception: typeof APP_INTERCEPTION_KEY;
83
111
  readonly interceptionContext: typeof APP_INTERCEPTION_CONTEXT_KEY;
84
112
  readonly layoutIds: typeof APP_LAYOUT_IDS_KEY;
85
113
  readonly layoutFlags: typeof APP_LAYOUT_FLAGS_KEY;
114
+ readonly renderObservation: typeof APP_RENDER_OBSERVATION_KEY;
86
115
  readonly rootLayout: typeof APP_ROOT_LAYOUT_KEY;
87
116
  readonly route: typeof APP_ROUTE_KEY;
117
+ readonly slotBindings: typeof APP_SLOT_BINDINGS_KEY;
88
118
  };
89
119
  type AppElementsWireCodec = {
90
120
  readonly keys: AppElementsWireKeys;
@@ -94,9 +124,10 @@ type AppElementsWireCodec = {
94
124
  encodeCacheKey(rscUrl: string, interceptionContext: string | null): string;
95
125
  encodeLayoutId(treePath: string): string;
96
126
  encodeOutgoingPayload(input: {
97
- element: ReactNode | Readonly<Record<string, ReactNode>>;
127
+ element: ReactNode | Readonly<Record<string, ReactNode | AppElementsInterception | readonly AppElementsSlotBinding[]>>;
98
128
  artifactCompatibility?: ArtifactCompatibilityEnvelope;
99
129
  layoutFlags: LayoutFlags;
130
+ renderObservation?: RenderObservation;
100
131
  }): ReactNode | AppOutgoingElements;
101
132
  encodePageId(routePath: string, interceptionContext: string | null): string;
102
133
  encodeRouteId(routePath: string, interceptionContext: string | null): string;
@@ -124,12 +155,13 @@ declare function withLayoutFlags<T extends Record<string, unknown>>(elements: T,
124
155
  [APP_LAYOUT_FLAGS_KEY]: LayoutFlags;
125
156
  };
126
157
  declare function buildOutgoingAppPayload(input: {
127
- element: ReactNode | Readonly<Record<string, ReactNode>>;
158
+ element: ReactNode | Readonly<Record<string, ReactNode | AppElementsInterception | readonly AppElementsSlotBinding[]>>;
128
159
  artifactCompatibility?: ArtifactCompatibilityEnvelope;
129
160
  layoutFlags: LayoutFlags;
161
+ renderObservation?: RenderObservation;
130
162
  }): ReactNode | AppOutgoingElements;
131
163
  declare function readAppElementsMetadata(elements: Readonly<Record<string, unknown>>): AppElementsMetadata;
132
164
  declare const AppElementsWire: AppElementsWireCodec;
133
165
  //#endregion
134
- export { APP_ARTIFACT_COMPATIBILITY_KEY, APP_INTERCEPTION_CONTEXT_KEY, APP_LAYOUT_FLAGS_KEY, APP_LAYOUT_IDS_KEY, APP_ROOT_LAYOUT_KEY, APP_ROUTE_KEY, APP_UNMATCHED_SLOT_WIRE_VALUE, AppElementValue, AppElements, AppElementsWire, AppOutgoingElements, AppWireElements, LayoutFlags, UNMATCHED_SLOT, buildOutgoingAppPayload, isAppElementsRecord, normalizeAppElements, readAppElementsMetadata, withLayoutFlags };
166
+ export { APP_ARTIFACT_COMPATIBILITY_KEY, APP_INTERCEPTION_CONTEXT_KEY, APP_INTERCEPTION_KEY, APP_LAYOUT_FLAGS_KEY, APP_LAYOUT_IDS_KEY, APP_RENDER_OBSERVATION_KEY, APP_ROOT_LAYOUT_KEY, APP_ROUTE_KEY, APP_SLOT_BINDINGS_KEY, APP_UNMATCHED_SLOT_WIRE_VALUE, AppElementValue, AppElements, AppElementsInterception, AppElementsSlotBinding, AppElementsSlotBindingState, AppElementsWire, AppOutgoingElements, AppWireElements, LayoutFlags, UNMATCHED_SLOT, buildOutgoingAppPayload, compareAppElementsSlotIds, isAppElementsRecord, normalizeAppElements, normalizeAppElementsSlotBindings, readAppElementsMetadata, withLayoutFlags };
135
167
  //# sourceMappingURL=app-elements-wire.d.ts.map