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.
- package/dist/build/google-fonts/fallback-metrics-data.js +14031 -0
- package/dist/build/google-fonts/fallback-metrics-data.js.map +1 -0
- package/dist/build/google-fonts/fallback-metrics.d.ts +13 -0
- package/dist/build/google-fonts/fallback-metrics.js +46 -0
- package/dist/build/google-fonts/fallback-metrics.js.map +1 -0
- package/dist/build/precompress.d.ts +13 -2
- package/dist/build/precompress.js +12 -3
- package/dist/build/precompress.js.map +1 -1
- package/dist/build/prerender.d.ts +1 -1
- package/dist/build/prerender.js +44 -14
- package/dist/build/prerender.js.map +1 -1
- package/dist/build/report.d.ts +5 -4
- package/dist/build/report.js +196 -348
- package/dist/build/report.js.map +1 -1
- package/dist/check.js +1 -0
- package/dist/check.js.map +1 -1
- package/dist/cli.js +60 -3
- package/dist/cli.js.map +1 -1
- package/dist/client/window-next.d.ts +3 -1
- package/dist/client/window-next.js.map +1 -1
- package/dist/config/dotenv.d.ts +11 -1
- package/dist/config/dotenv.js.map +1 -1
- package/dist/config/next-config.d.ts +87 -3
- package/dist/config/next-config.js +222 -6
- package/dist/config/next-config.js.map +1 -1
- package/dist/config/tsconfig-paths.d.ts +13 -0
- package/dist/config/tsconfig-paths.js +117 -0
- package/dist/config/tsconfig-paths.js.map +1 -0
- package/dist/deploy.js +3 -2
- package/dist/deploy.js.map +1 -1
- package/dist/entries/app-browser-entry.d.ts +2 -2
- package/dist/entries/app-browser-entry.js +26 -1
- package/dist/entries/app-browser-entry.js.map +1 -1
- package/dist/entries/app-rsc-entry.d.ts +19 -1
- package/dist/entries/app-rsc-entry.js +38 -12
- package/dist/entries/app-rsc-entry.js.map +1 -1
- package/dist/entries/app-rsc-manifest.d.ts +9 -0
- package/dist/entries/app-rsc-manifest.js +4 -1
- package/dist/entries/app-rsc-manifest.js.map +1 -1
- package/dist/entries/pages-client-entry.js +3 -5
- package/dist/entries/pages-client-entry.js.map +1 -1
- package/dist/entries/pages-server-entry.js +19 -1
- package/dist/entries/pages-server-entry.js.map +1 -1
- package/dist/index.js +130 -37
- package/dist/index.js.map +1 -1
- package/dist/plugins/client-reference-dedup.d.ts +15 -2
- package/dist/plugins/client-reference-dedup.js +138 -16
- package/dist/plugins/client-reference-dedup.js.map +1 -1
- package/dist/plugins/fonts.d.ts +2 -2
- package/dist/plugins/fonts.js +15 -6
- package/dist/plugins/fonts.js.map +1 -1
- package/dist/plugins/sass.d.ts +34 -0
- package/dist/plugins/sass.js +22 -0
- package/dist/plugins/sass.js.map +1 -0
- package/dist/routing/app-route-graph.d.ts +31 -2
- package/dist/routing/app-route-graph.js +82 -10
- package/dist/routing/app-route-graph.js.map +1 -1
- package/dist/routing/route-pattern.d.ts +56 -1
- package/dist/routing/route-pattern.js +60 -1
- package/dist/routing/route-pattern.js.map +1 -1
- package/dist/server/app-browser-action-result.d.ts +27 -2
- package/dist/server/app-browser-action-result.js +63 -2
- package/dist/server/app-browser-action-result.js.map +1 -1
- package/dist/server/app-browser-entry.js +262 -108
- package/dist/server/app-browser-entry.js.map +1 -1
- package/dist/server/app-browser-hydration.d.ts +13 -1
- package/dist/server/app-browser-hydration.js +9 -1
- package/dist/server/app-browser-hydration.js.map +1 -1
- package/dist/server/app-browser-navigation-controller.d.ts +14 -1
- package/dist/server/app-browser-navigation-controller.js +28 -9
- package/dist/server/app-browser-navigation-controller.js.map +1 -1
- package/dist/server/app-browser-popstate.d.ts +16 -0
- package/dist/server/app-browser-popstate.js +17 -0
- package/dist/server/app-browser-popstate.js.map +1 -0
- package/dist/server/app-browser-rsc-redirect.d.ts +28 -0
- package/dist/server/app-browser-rsc-redirect.js +37 -0
- package/dist/server/app-browser-rsc-redirect.js.map +1 -0
- package/dist/server/app-browser-state.d.ts +11 -7
- package/dist/server/app-browser-state.js +45 -27
- package/dist/server/app-browser-state.js.map +1 -1
- package/dist/server/app-browser-stream.d.ts +5 -4
- package/dist/server/app-browser-stream.js +5 -6
- package/dist/server/app-browser-stream.js.map +1 -1
- package/dist/server/app-browser-visible-commit.d.ts +5 -0
- package/dist/server/app-browser-visible-commit.js +38 -5
- package/dist/server/app-browser-visible-commit.js.map +1 -1
- package/dist/server/app-elements-wire.d.ts +38 -6
- package/dist/server/app-elements-wire.js +106 -6
- package/dist/server/app-elements-wire.js.map +1 -1
- package/dist/server/app-elements.d.ts +2 -2
- package/dist/server/app-elements.js +2 -2
- package/dist/server/app-elements.js.map +1 -1
- package/dist/server/app-fallback-renderer.d.ts +10 -1
- package/dist/server/app-fallback-renderer.js +37 -1
- package/dist/server/app-fallback-renderer.js.map +1 -1
- package/dist/server/app-history-state.d.ts +26 -0
- package/dist/server/app-history-state.js +53 -0
- package/dist/server/app-history-state.js.map +1 -0
- package/dist/server/app-page-boundary-render.d.ts +10 -1
- package/dist/server/app-page-boundary-render.js +13 -6
- package/dist/server/app-page-boundary-render.js.map +1 -1
- package/dist/server/app-page-boundary.js +3 -2
- package/dist/server/app-page-boundary.js.map +1 -1
- package/dist/server/app-page-cache.d.ts +13 -0
- package/dist/server/app-page-cache.js +25 -8
- package/dist/server/app-page-cache.js.map +1 -1
- package/dist/server/app-page-dispatch.d.ts +5 -0
- package/dist/server/app-page-dispatch.js +68 -11
- package/dist/server/app-page-dispatch.js.map +1 -1
- package/dist/server/app-page-element-builder.d.ts +7 -0
- package/dist/server/app-page-element-builder.js +32 -4
- package/dist/server/app-page-element-builder.js.map +1 -1
- package/dist/server/app-page-execution.js +2 -3
- package/dist/server/app-page-execution.js.map +1 -1
- package/dist/server/app-page-head.d.ts +7 -0
- package/dist/server/app-page-head.js +2 -1
- package/dist/server/app-page-head.js.map +1 -1
- package/dist/server/app-page-probe.d.ts +23 -1
- package/dist/server/app-page-probe.js +29 -1
- package/dist/server/app-page-probe.js.map +1 -1
- package/dist/server/app-page-render-observation.d.ts +35 -0
- package/dist/server/app-page-render-observation.js +68 -0
- package/dist/server/app-page-render-observation.js.map +1 -0
- package/dist/server/app-page-render.d.ts +5 -1
- package/dist/server/app-page-render.js +79 -3
- package/dist/server/app-page-render.js.map +1 -1
- package/dist/server/app-page-request.d.ts +1 -0
- package/dist/server/app-page-request.js.map +1 -1
- package/dist/server/app-page-response.js +3 -2
- package/dist/server/app-page-response.js.map +1 -1
- package/dist/server/app-page-route-wiring.d.ts +3 -1
- package/dist/server/app-page-route-wiring.js +42 -14
- package/dist/server/app-page-route-wiring.js.map +1 -1
- package/dist/server/app-page-stream.d.ts +2 -0
- package/dist/server/app-page-stream.js +1 -0
- package/dist/server/app-page-stream.js.map +1 -1
- package/dist/server/app-router-entry.js +1 -13
- package/dist/server/app-router-entry.js.map +1 -1
- package/dist/server/app-rsc-cache-busting.d.ts +19 -1
- package/dist/server/app-rsc-cache-busting.js +36 -1
- package/dist/server/app-rsc-cache-busting.js.map +1 -1
- package/dist/server/app-rsc-embedded-chunks.d.ts +9 -0
- package/dist/server/app-rsc-embedded-chunks.js +34 -0
- package/dist/server/app-rsc-embedded-chunks.js.map +1 -0
- package/dist/server/app-rsc-errors.d.ts +4 -1
- package/dist/server/app-rsc-errors.js +1 -1
- package/dist/server/app-rsc-errors.js.map +1 -1
- package/dist/server/app-rsc-handler.d.ts +12 -4
- package/dist/server/app-rsc-handler.js +6 -1
- package/dist/server/app-rsc-handler.js.map +1 -1
- package/dist/server/app-rsc-route-matching.d.ts +23 -0
- package/dist/server/app-rsc-route-matching.js +45 -23
- package/dist/server/app-rsc-route-matching.js.map +1 -1
- package/dist/server/app-server-action-execution.d.ts +35 -3
- package/dist/server/app-server-action-execution.js +87 -33
- package/dist/server/app-server-action-execution.js.map +1 -1
- package/dist/server/app-ssr-entry.d.ts +1 -0
- package/dist/server/app-ssr-entry.js +37 -13
- package/dist/server/app-ssr-entry.js.map +1 -1
- package/dist/server/app-ssr-error-meta.d.ts +14 -0
- package/dist/server/app-ssr-error-meta.js +50 -0
- package/dist/server/app-ssr-error-meta.js.map +1 -0
- package/dist/server/app-ssr-stream.d.ts +1 -1
- package/dist/server/app-ssr-stream.js +9 -12
- package/dist/server/app-ssr-stream.js.map +1 -1
- package/dist/server/artifact-compatibility.d.ts +12 -2
- package/dist/server/artifact-compatibility.js +12 -8
- package/dist/server/artifact-compatibility.js.map +1 -1
- package/dist/server/cache-proof.d.ts +124 -5
- package/dist/server/cache-proof.js +416 -18
- package/dist/server/cache-proof.js.map +1 -1
- package/dist/server/dev-lockfile.d.ts +110 -0
- package/dist/server/dev-lockfile.js +180 -0
- package/dist/server/dev-lockfile.js.map +1 -0
- package/dist/server/dev-server.js +15 -5
- package/dist/server/dev-server.js.map +1 -1
- package/dist/server/file-based-metadata.d.ts +13 -0
- package/dist/server/file-based-metadata.js +49 -2
- package/dist/server/file-based-metadata.js.map +1 -1
- package/dist/server/headers.d.ts +3 -1
- package/dist/server/headers.js +5 -2
- package/dist/server/headers.js.map +1 -1
- package/dist/server/html.js +1 -1
- package/dist/server/html.js.map +1 -1
- package/dist/server/http-error-responses.d.ts +10 -0
- package/dist/server/http-error-responses.js +11 -1
- package/dist/server/http-error-responses.js.map +1 -1
- package/dist/server/isr-cache.d.ts +2 -1
- package/dist/server/isr-cache.js +4 -2
- package/dist/server/isr-cache.js.map +1 -1
- package/dist/server/metadata-route-response.js +22 -5
- package/dist/server/metadata-route-response.js.map +1 -1
- package/dist/server/metadata-routes.js +27 -8
- package/dist/server/metadata-routes.js.map +1 -1
- package/dist/server/middleware-runtime.js +1 -0
- package/dist/server/middleware-runtime.js.map +1 -1
- package/dist/server/middleware.d.ts +12 -0
- package/dist/server/middleware.js +12 -0
- package/dist/server/middleware.js.map +1 -1
- package/dist/server/navigation-planner.d.ts +19 -5
- package/dist/server/navigation-planner.js +278 -17
- package/dist/server/navigation-planner.js.map +1 -1
- package/dist/server/navigation-trace.d.ts +8 -1
- package/dist/server/navigation-trace.js +7 -0
- package/dist/server/navigation-trace.js.map +1 -1
- package/dist/server/normalize-path.d.ts +2 -1
- package/dist/server/normalize-path.js +4 -1
- package/dist/server/normalize-path.js.map +1 -1
- package/dist/server/pages-api-route.js +1 -0
- package/dist/server/pages-api-route.js.map +1 -1
- package/dist/server/pages-page-data.d.ts +3 -2
- package/dist/server/pages-page-data.js +22 -3
- package/dist/server/pages-page-data.js.map +1 -1
- package/dist/server/pages-page-response.js +1 -1
- package/dist/server/prod-server.d.ts +28 -1
- package/dist/server/prod-server.js +62 -9
- package/dist/server/prod-server.js.map +1 -1
- package/dist/server/server-action-not-found.d.ts +16 -3
- package/dist/server/server-action-not-found.js +19 -1
- package/dist/server/server-action-not-found.js.map +1 -1
- package/dist/server/server-globals.d.ts +5 -0
- package/dist/server/server-globals.js +37 -0
- package/dist/server/server-globals.js.map +1 -0
- package/dist/server/static-file-cache.js +1 -1
- package/dist/server/static-file-cache.js.map +1 -1
- package/dist/shims/cache-runtime.d.ts +19 -2
- package/dist/shims/cache-runtime.js +67 -11
- package/dist/shims/cache-runtime.js.map +1 -1
- package/dist/shims/cache.d.ts +5 -18
- package/dist/shims/cache.js +2 -0
- package/dist/shims/cache.js.map +1 -1
- package/dist/shims/error-boundary.js +6 -8
- package/dist/shims/error-boundary.js.map +1 -1
- package/dist/shims/error.d.ts +18 -1
- package/dist/shims/error.js +56 -1
- package/dist/shims/error.js.map +1 -1
- package/dist/shims/fetch-cache.d.ts +4 -1
- package/dist/shims/fetch-cache.js +40 -5
- package/dist/shims/fetch-cache.js.map +1 -1
- package/dist/shims/font-google-base.d.ts +22 -8
- package/dist/shims/font-google-base.js +41 -71
- package/dist/shims/font-google-base.js.map +1 -1
- package/dist/shims/font-local.d.ts +3 -20
- package/dist/shims/font-local.js +23 -75
- package/dist/shims/font-local.js.map +1 -1
- package/dist/shims/font-utils.d.ts +51 -0
- package/dist/shims/font-utils.js +97 -0
- package/dist/shims/font-utils.js.map +1 -0
- package/dist/shims/hash-scroll.d.ts +7 -0
- package/dist/shims/hash-scroll.js +30 -0
- package/dist/shims/hash-scroll.js.map +1 -0
- package/dist/shims/headers.d.ts +8 -11
- package/dist/shims/headers.js +22 -2
- package/dist/shims/headers.js.map +1 -1
- package/dist/shims/image.d.ts +1 -0
- package/dist/shims/image.js +144 -78
- package/dist/shims/image.js.map +1 -1
- package/dist/shims/internal/app-router-context.d.ts +6 -6
- package/dist/shims/internal/app-router-context.js +17 -6
- package/dist/shims/internal/app-router-context.js.map +1 -1
- package/dist/shims/link-prefetch.d.ts +9 -1
- package/dist/shims/link-prefetch.js +11 -6
- package/dist/shims/link-prefetch.js.map +1 -1
- package/dist/shims/link.d.ts +12 -2
- package/dist/shims/link.js +78 -32
- package/dist/shims/link.js.map +1 -1
- package/dist/shims/metadata.d.ts +16 -30
- package/dist/shims/metadata.js +87 -28
- package/dist/shims/metadata.js.map +1 -1
- package/dist/shims/navigation.d.ts +158 -17
- package/dist/shims/navigation.js +324 -74
- package/dist/shims/navigation.js.map +1 -1
- package/dist/shims/navigation.react-server.d.ts +3 -2
- package/dist/shims/navigation.react-server.js +5 -2
- package/dist/shims/navigation.react-server.js.map +1 -1
- package/dist/shims/pages-router-runtime.d.ts +7 -0
- package/dist/shims/pages-router-runtime.js +16 -0
- package/dist/shims/pages-router-runtime.js.map +1 -0
- package/dist/shims/router.d.ts +32 -6
- package/dist/shims/router.js +197 -242
- package/dist/shims/router.js.map +1 -1
- package/dist/shims/script.js +110 -32
- package/dist/shims/script.js.map +1 -1
- package/dist/shims/server.js +2 -1
- package/dist/shims/server.js.map +1 -1
- package/dist/shims/slot.d.ts +1 -0
- package/dist/shims/slot.js +41 -1
- package/dist/shims/slot.js.map +1 -1
- package/dist/shims/unified-request-context.js +2 -0
- package/dist/shims/unified-request-context.js.map +1 -1
- package/dist/shims/unrecognized-action-error.d.ts +35 -0
- package/dist/shims/unrecognized-action-error.js +41 -0
- package/dist/shims/unrecognized-action-error.js.map +1 -0
- package/dist/shims/url-utils.d.ts +21 -1
- package/dist/shims/url-utils.js +67 -3
- package/dist/shims/url-utils.js.map +1 -1
- package/dist/utils/asset-prefix.d.ts +69 -0
- package/dist/utils/asset-prefix.js +91 -0
- package/dist/utils/asset-prefix.js.map +1 -0
- package/dist/utils/base-path.d.ts +7 -1
- package/dist/utils/base-path.js +10 -1
- package/dist/utils/base-path.js.map +1 -1
- package/dist/utils/navigation-signal.d.ts +1 -2
- package/dist/utils/navigation-signal.js +1 -1
- package/dist/utils/navigation-signal.js.map +1 -1
- package/dist/utils/sorted-array.d.ts +9 -0
- package/dist/utils/sorted-array.js +22 -0
- package/dist/utils/sorted-array.js.map +1 -0
- 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:
|
|
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__?:
|
|
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
|
|
25
|
+
* Convert embedded chunks back to a ReadableStream of Uint8Array chunks.
|
|
25
26
|
*/
|
|
26
|
-
declare function chunksToReadableStream(chunks: readonly
|
|
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
|
|
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(
|
|
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(
|
|
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(
|
|
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:
|
|
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
|
|
14
|
-
type
|
|
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
|