vinext 0.1.8 → 0.2.0
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/README.md +51 -30
- package/dist/build/inject-pregenerated-paths.d.ts +4 -0
- package/dist/build/inject-pregenerated-paths.js +18 -0
- package/dist/build/layout-classification.js +1 -1
- package/dist/build/nitro-route-rules.js +1 -1
- package/dist/build/pages-client-assets-module.d.ts +11 -0
- package/dist/build/pages-client-assets-module.js +27 -0
- package/dist/build/prerender.d.ts +2 -1
- package/dist/build/prerender.js +13 -6
- package/dist/build/report.d.ts +13 -2
- package/dist/build/report.js +99 -2
- package/dist/build/run-prerender.d.ts +7 -0
- package/dist/build/run-prerender.js +10 -1
- package/dist/build/standalone.js +2 -0
- package/dist/cache/cache-adapters-virtual.js +3 -3
- package/dist/check.js +40 -2
- package/dist/cli-args.d.ts +1 -2
- package/dist/cli-args.js +1 -1
- package/dist/cli-dev-config.d.ts +12 -0
- package/dist/cli-dev-config.js +23 -0
- package/dist/cli.js +111 -95
- package/dist/{server → client}/dev-error-overlay-store.d.ts +1 -1
- package/dist/{server → client}/dev-error-overlay-store.js +1 -1
- package/dist/{server → client}/dev-error-overlay.d.ts +1 -1
- package/dist/{server → client}/dev-error-overlay.js +2 -2
- package/dist/client/navigation-runtime.d.ts +2 -0
- package/dist/client/navigation-runtime.js +3 -1
- package/dist/client/window-next.d.ts +2 -1
- package/dist/cloudflare/index.d.ts +2 -2
- package/dist/cloudflare/index.js +2 -2
- package/dist/config/config-matchers.js +14 -10
- package/dist/config/next-config.d.ts +5 -3
- package/dist/config/next-config.js +44 -1
- package/dist/config/prerender.d.ts +34 -0
- package/dist/config/prerender.js +55 -0
- package/dist/entries/app-rsc-entry.d.ts +2 -1
- package/dist/entries/app-rsc-entry.js +40 -10
- package/dist/entries/app-rsc-manifest.js +2 -0
- package/dist/entries/pages-client-entry.d.ts +3 -0
- package/dist/entries/pages-client-entry.js +15 -1
- package/dist/entries/pages-server-entry.js +5 -2
- package/dist/image/image-adapters-virtual.d.ts +59 -0
- package/dist/image/image-adapters-virtual.js +59 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.js +167 -100
- package/dist/init-cloudflare.d.ts +43 -0
- package/dist/init-cloudflare.js +839 -0
- package/dist/init-platform.d.ts +40 -0
- package/dist/init-platform.js +195 -0
- package/dist/init.d.ts +16 -38
- package/dist/init.js +209 -99
- package/dist/node_modules/.pnpm/am-i-vibing@0.5.0/node_modules/am-i-vibing/dist/detector-1yx2Hoe0.js +294 -0
- package/dist/node_modules/.pnpm/process-ancestry@0.1.0/node_modules/process-ancestry/dist/index.js +94 -0
- package/dist/{cloudflare → packages/cloudflare}/src/cache/cdn-adapter.runtime.js +1 -1
- package/dist/{cloudflare → packages/cloudflare}/src/cache/kv-data-adapter.runtime.d.ts +2 -2
- package/dist/{cloudflare → packages/cloudflare}/src/cache/kv-data-adapter.runtime.js +1 -1
- package/dist/packages/cloudflare/src/deploy-config.js +150 -0
- package/dist/packages/cloudflare/src/deploy-help.js +55 -0
- package/dist/packages/cloudflare/src/deploy.js +276 -0
- package/dist/{cloudflare → packages/cloudflare/src}/tpr.d.ts +4 -41
- package/dist/{cloudflare → packages/cloudflare/src}/tpr.js +18 -15
- package/dist/plugins/ast-scope.d.ts +16 -0
- package/dist/plugins/ast-scope.js +62 -0
- package/dist/plugins/ast-utils.d.ts +27 -1
- package/dist/plugins/ast-utils.js +32 -1
- package/dist/plugins/css-module-imports.d.ts +14 -0
- package/dist/plugins/css-module-imports.js +59 -0
- package/dist/plugins/extensionless-dynamic-import.js +2 -2
- package/dist/plugins/ignore-dynamic-requests.d.ts +11 -0
- package/dist/plugins/ignore-dynamic-requests.js +530 -0
- package/dist/plugins/typeof-window.d.ts +1 -1
- package/dist/plugins/typeof-window.js +28 -56
- package/dist/routing/app-route-graph.d.ts +23 -2
- package/dist/routing/app-route-graph.js +126 -32
- package/dist/routing/file-matcher.d.ts +3 -0
- package/dist/routing/file-matcher.js +3 -0
- package/dist/routing/pages-router.js +2 -2
- package/dist/server/api-handler.js +9 -14
- package/dist/server/app-browser-action-result.d.ts +4 -1
- package/dist/server/app-browser-action-result.js +8 -1
- package/dist/server/app-browser-entry.js +161 -52
- package/dist/server/app-browser-interception-context.d.ts +1 -0
- package/dist/server/app-browser-interception-context.js +4 -2
- package/dist/server/app-browser-navigation-controller.d.ts +2 -0
- package/dist/server/app-browser-navigation-controller.js +60 -31
- package/dist/server/app-browser-server-action-client.d.ts +1 -1
- package/dist/server/app-browser-server-action-client.js +3 -4
- package/dist/server/app-browser-state.d.ts +11 -1
- package/dist/server/app-browser-state.js +25 -8
- package/dist/server/app-browser-visible-commit.d.ts +6 -1
- package/dist/server/app-browser-visible-commit.js +43 -25
- package/dist/server/app-elements-wire.d.ts +9 -2
- package/dist/server/app-elements-wire.js +8 -1
- package/dist/server/app-elements.d.ts +2 -2
- package/dist/server/app-elements.js +4 -3
- package/dist/server/app-fallback-renderer.d.ts +2 -1
- package/dist/server/app-fallback-renderer.js +10 -6
- package/dist/server/app-hydration-cache-publication.d.ts +11 -0
- package/dist/server/app-hydration-cache-publication.js +43 -0
- package/dist/server/app-middleware.d.ts +4 -3
- package/dist/server/app-middleware.js +8 -3
- package/dist/server/app-optimistic-routing.js +11 -4
- package/dist/server/app-page-cache-finalizer.js +2 -1
- package/dist/server/app-page-cache-render.d.ts +1 -0
- package/dist/server/app-page-cache-render.js +8 -4
- package/dist/server/app-page-cache.d.ts +1 -0
- package/dist/server/app-page-cache.js +5 -2
- package/dist/server/app-page-dispatch.js +1 -0
- package/dist/server/app-page-element-builder.d.ts +2 -1
- package/dist/server/app-page-element-builder.js +58 -4
- package/dist/server/app-page-probe.js +5 -0
- package/dist/server/app-page-render-identity.d.ts +1 -0
- package/dist/server/app-page-render-identity.js +1 -1
- package/dist/server/app-page-render.js +18 -0
- package/dist/server/app-page-request.d.ts +14 -0
- package/dist/server/app-page-request.js +69 -4
- package/dist/server/app-page-route-wiring.d.ts +8 -1
- package/dist/server/app-page-route-wiring.js +32 -18
- package/dist/server/app-page-segment-state.d.ts +2 -1
- package/dist/server/app-page-segment-state.js +3 -1
- package/dist/server/app-page-stream.d.ts +5 -0
- package/dist/server/app-page-stream.js +3 -1
- package/dist/server/app-route-handler-execution.js +5 -1
- package/dist/server/app-route-handler-response.js +1 -0
- package/dist/server/app-route-handler-runtime.js +1 -1
- package/dist/server/app-router-entry.js +9 -2
- package/dist/server/app-rsc-handler.d.ts +1 -0
- package/dist/server/app-rsc-handler.js +62 -31
- package/dist/server/app-rsc-request-normalization.d.ts +3 -2
- package/dist/server/app-rsc-request-normalization.js +6 -3
- package/dist/server/app-segment-config.d.ts +11 -0
- package/dist/server/app-segment-config.js +62 -6
- package/dist/server/app-server-action-execution.d.ts +1 -0
- package/dist/server/app-server-action-execution.js +58 -28
- package/dist/server/app-ssr-entry.d.ts +3 -0
- package/dist/server/app-ssr-entry.js +15 -7
- package/dist/server/app-ssr-stream.d.ts +7 -3
- package/dist/server/app-ssr-stream.js +10 -6
- package/dist/server/app-visited-response-cache.d.ts +6 -0
- package/dist/server/app-visited-response-cache.js +3 -1
- package/dist/server/client-trace-metadata.js +26 -0
- package/dist/server/default-global-not-found-module.d.ts +14 -0
- package/dist/server/default-global-not-found-module.js +14 -0
- package/dist/server/dev-route-files.js +4 -0
- package/dist/server/dev-server.js +19 -18
- package/dist/server/dev-stack-sourcemap.d.ts +1 -1
- package/dist/server/dev-stack-sourcemap.js +1 -1
- package/dist/server/fetch-handler.d.ts +2 -0
- package/dist/server/fetch-handler.js +18 -0
- package/dist/server/headers.d.ts +3 -15
- package/dist/server/headers.js +2 -15
- package/dist/server/image-optimization.d.ts +51 -1
- package/dist/server/image-optimization.js +52 -2
- package/dist/server/implicit-tags.js +1 -1
- package/dist/server/isr-cache.d.ts +1 -1
- package/dist/server/isr-cache.js +2 -2
- package/dist/server/metadata-routes.d.ts +3 -1
- package/dist/server/metadata-routes.js +12 -2
- package/dist/server/middleware-runtime.js +6 -1
- package/dist/server/navigation-planner.d.ts +1 -0
- package/dist/server/navigation-planner.js +14 -3
- package/dist/server/pages-api-route.js +2 -2
- package/dist/server/pages-asset-tags.d.ts +4 -6
- package/dist/server/pages-asset-tags.js +12 -12
- package/dist/server/pages-client-assets.d.ts +12 -0
- package/dist/server/pages-client-assets.js +10 -0
- package/dist/server/pages-node-compat.d.ts +8 -1
- package/dist/server/pages-node-compat.js +32 -4
- package/dist/server/pages-page-data.d.ts +24 -1
- package/dist/server/pages-page-data.js +45 -24
- package/dist/server/pages-page-handler.d.ts +2 -1
- package/dist/server/pages-page-handler.js +19 -12
- package/dist/server/pages-page-response.d.ts +7 -0
- package/dist/server/pages-page-response.js +4 -1
- package/dist/server/pages-request-pipeline.d.ts +2 -0
- package/dist/server/pages-request-pipeline.js +25 -1
- package/dist/server/pages-router-entry.d.ts +30 -0
- package/dist/server/pages-router-entry.js +108 -0
- package/dist/server/prerender-manifest.d.ts +3 -1
- package/dist/server/prerender-route-params.js +1 -1
- package/dist/server/prod-server.d.ts +1 -1
- package/dist/server/prod-server.js +33 -20
- package/dist/server/request-pipeline.js +1 -0
- package/dist/server/seed-cache.js +4 -4
- package/dist/shims/app-router-scroll-state.d.ts +1 -0
- package/dist/shims/app-router-scroll-state.js +1 -0
- package/dist/shims/app-router-scroll.js +2 -1
- package/dist/shims/cache.js +19 -15
- package/dist/shims/cdn-cache.js +1 -1
- package/dist/shims/dynamic-preload-chunks.js +2 -1
- package/dist/shims/form.d.ts +3 -1
- package/dist/shims/form.js +37 -43
- package/dist/shims/headers.d.ts +7 -1
- package/dist/shims/headers.js +17 -3
- package/dist/shims/image.js +75 -14
- package/dist/shims/internal/app-route-detection.d.ts +2 -17
- package/dist/shims/internal/app-route-detection.js +4 -17
- package/dist/shims/internal/hybrid-client-route-owner-direct.d.ts +23 -0
- package/dist/shims/internal/hybrid-client-route-owner-direct.js +51 -0
- package/dist/shims/internal/hybrid-client-route-owner.d.ts +2 -15
- package/dist/shims/internal/hybrid-client-route-owner.js +9 -60
- package/dist/shims/internal/pages-data-fetch-dedup.d.ts +9 -5
- package/dist/shims/internal/pages-data-fetch-dedup.js +73 -14
- package/dist/shims/internal/pages-data-target.d.ts +10 -9
- package/dist/shims/internal/pages-data-target.js +91 -12
- package/dist/shims/internal/pages-router-components.d.ts +7 -0
- package/dist/shims/internal/pages-router-components.js +13 -0
- package/dist/shims/layout-segment-context.d.ts +4 -1
- package/dist/shims/layout-segment-context.js +18 -4
- package/dist/shims/link.js +55 -26
- package/dist/shims/navigation.d.ts +5 -1
- package/dist/shims/navigation.js +45 -10
- package/dist/shims/navigation.react-server.js +1 -1
- package/dist/shims/root-params.d.ts +15 -1
- package/dist/shims/root-params.js +21 -1
- package/dist/shims/router.d.ts +5 -7
- package/dist/shims/router.js +362 -93
- package/dist/shims/server.js +3 -2
- package/dist/shims/slot.js +3 -6
- package/dist/utils/client-runtime-metadata.d.ts +2 -18
- package/dist/utils/client-runtime-metadata.js +31 -22
- package/dist/utils/dev-stack-sourcemap-endpoint.d.ts +4 -0
- package/dist/{server → utils}/dev-stack-sourcemap-endpoint.js +1 -1
- package/dist/utils/domain-locale.d.ts +6 -3
- package/dist/{server → utils}/middleware-request-headers.d.ts +1 -1
- package/dist/{server → utils}/middleware-request-headers.js +2 -2
- package/dist/utils/project.d.ts +48 -2
- package/dist/utils/project.js +225 -4
- package/dist/utils/protocol-headers.d.ts +17 -0
- package/dist/utils/protocol-headers.js +17 -0
- package/dist/utils/react-version.d.ts +4 -0
- package/dist/utils/react-version.js +44 -0
- package/package.json +47 -2
- package/dist/deploy.d.ts +0 -197
- package/dist/deploy.js +0 -1040
- package/dist/server/dev-stack-sourcemap-endpoint.d.ts +0 -4
- /package/dist/{cloudflare → packages/cloudflare}/src/utils/cache-control-metadata.js +0 -0
|
@@ -17,29 +17,30 @@ import { VINEXT_RSC_COMPATIBILITY_ID_HEADER, VINEXT_RSC_CONTENT_TYPE, createRscR
|
|
|
17
17
|
import { getNavigationRuntime, registerNavigationRuntimeBootstrap, registerNavigationRuntimeFunctions } from "../client/navigation-runtime.js";
|
|
18
18
|
import { notifyAppRouterTransitionStart } from "../client/instrumentation-client-state.js";
|
|
19
19
|
import "../client/instrumentation-client.js";
|
|
20
|
+
import { createBfcacheSegmentStateKeyMap, createInitialBfcacheIdMap } from "./app-bfcache-identity.js";
|
|
21
|
+
import { createDiscardedServerActionRefreshScheduler, createServerActionInitiationSnapshot, resolveServerActionOperationLane } from "./app-browser-action-result.js";
|
|
22
|
+
import { createClientReuseManifestHeaderFromVisibleAppState } from "./app-browser-client-reuse-manifest.js";
|
|
20
23
|
import { resolveManifestNavigationInterceptionContext, resolveMiddlewareRewriteNavigationInterceptionContext } from "./app-browser-interception-context.js";
|
|
21
24
|
import { readHistoryStatePreviousNextUrl } from "./app-history-state.js";
|
|
22
25
|
import { AppBrowserMpaNavigationScheduler } from "./app-browser-mpa-navigation.js";
|
|
23
26
|
import { blockDangerousStreamedRscRedirect } from "./app-browser-rsc-redirect.js";
|
|
24
27
|
import { navigationPlanner } from "./navigation-planner.js";
|
|
25
|
-
import { __basePath, appRouterInstance, commitClientNavigationState, consumePrefetchResponseForNavigation, createCachedRscResponseSnapshot, createClientNavigationRenderSnapshot, createSnapshotPathAndSearch, getClientNavigationRenderContext, getPrefetchCache, hasPrefetchCacheEntryForNavigation, invalidatePrefetchCache, pushHistoryStateWithoutNotify, replaceClientParamsWithoutNotify, replaceHistoryStateWithoutNotify, resolvePrefetchCacheEntryMountedSlotsHeader, restoreRscResponse, saveScrollPosition, setClientParams, setMountedSlotsHeader, setPendingPathname, useRouter } from "../shims/navigation.js";
|
|
26
|
-
import { createBfcacheSegmentStateKeyMap, createInitialBfcacheIdMap } from "./app-bfcache-identity.js";
|
|
27
|
-
import { createDiscardedServerActionRefreshScheduler, createServerActionInitiationSnapshot } from "./app-browser-action-result.js";
|
|
28
|
-
import { createClientReuseManifestHeaderFromVisibleAppState } from "./app-browser-client-reuse-manifest.js";
|
|
28
|
+
import { DYNAMIC_NAVIGATION_CACHE_TTL, PREFETCH_CACHE_TTL, __basePath, appRouterInstance, commitClientNavigationState, consumePrefetchResponseForNavigation, createCachedRscResponseSnapshot, createClientNavigationRenderSnapshot, createSnapshotPathAndSearch, deletePrefetchResponseSnapshot, getClientNavigationRenderContext, getPrefetchCache, hasPrefetchCacheEntryForNavigation, invalidatePrefetchCache, pushHistoryStateWithoutNotify, replaceClientParamsWithoutNotify, replaceHistoryStateWithoutNotify, resolvePrefetchCacheEntryMountedSlotsHeader, restoreRscResponse, saveScrollPosition, seedPrefetchResponseSnapshot, setClientParams, setMountedSlotsHeader, setPendingPathname, useRouter } from "../shims/navigation.js";
|
|
29
29
|
import { chunksToReadableStream, createProgressiveRscStream, getVinextBrowserGlobal } from "./app-browser-stream.js";
|
|
30
|
-
import { FRESH_APP_NAVIGATION_PAYLOAD_ORIGIN, VISITED_CACHE_APP_NAVIGATION_PAYLOAD_ORIGIN, isCacheRestorableAppPayloadMetadata, resolveInterceptionContextFromPreviousNextUrl } from "./app-browser-state.js";
|
|
30
|
+
import { COMMITTED_CACHE_APP_NAVIGATION_PAYLOAD_ORIGIN, FRESH_APP_NAVIGATION_PAYLOAD_ORIGIN, VISITED_CACHE_APP_NAVIGATION_PAYLOAD_ORIGIN, isCacheRestorableAppPayloadMetadata, isCompleteAppPayloadMetadata, resolveInterceptionContextFromPreviousNextUrl } from "./app-browser-state.js";
|
|
31
31
|
import { clearHardNavigationLoopGuard, createAppBrowserNavigationController, createBasePathStrippedPathAndSearch } from "./app-browser-navigation-controller.js";
|
|
32
32
|
import { consumeInitialFormState, createVinextHydrateRootOptions, hydrateRootInTransition } from "./app-browser-hydration.js";
|
|
33
33
|
import { AppBrowserHistoryController } from "./app-browser-history-controller.js";
|
|
34
34
|
import { createVisitedResponseCacheEntry, isVisitedResponseCacheEntryFresh } from "./app-visited-response-cache.js";
|
|
35
35
|
import { createPopstateRestoreHandler, restoreSynchronousPopstateScrollPosition } from "./app-browser-popstate.js";
|
|
36
36
|
import { createDevOnCaughtError, createOnUncaughtError, createProdOnCaughtError, prodOnRecoverableError } from "./app-browser-error.js";
|
|
37
|
+
import { createHydrationCachePublication } from "./app-hydration-cache-publication.js";
|
|
37
38
|
import { createOptimisticRouteTemplate, getOptimisticPrefetchSourceKey, getOptimisticRouteTemplateKey, resolveOptimisticNavigationPayload } from "./app-optimistic-routing.js";
|
|
38
39
|
import { removeStylesheetLinksCoveredByInlineCss } from "./app-inline-css-client.js";
|
|
39
40
|
import { createElement, startTransition, use, useEffect, useLayoutEffect, useMemo, useRef, useState } from "react";
|
|
40
41
|
import { flushSync } from "react-dom";
|
|
41
|
-
import { createFromFetch, createFromReadableStream, setServerCallback } from "@vitejs/plugin-rsc/browser";
|
|
42
42
|
import { createRoot, hydrateRoot } from "react-dom/client";
|
|
43
|
+
import { createFromFetch, createFromReadableStream, setServerCallback } from "@vitejs/plugin-rsc/browser";
|
|
43
44
|
import { hasServerActions, loadServerActionClient } from "virtual:vinext-app-capabilities";
|
|
44
45
|
//#region src/server/app-browser-entry.ts
|
|
45
46
|
function toActionType(kind) {
|
|
@@ -123,6 +124,7 @@ function isRouterStatePromise(value) {
|
|
|
123
124
|
}
|
|
124
125
|
let latestClientParams = {};
|
|
125
126
|
const visitedResponseCache = /* @__PURE__ */ new Map();
|
|
127
|
+
let clientNavigationCacheGeneration = 0;
|
|
126
128
|
let browserRouterStateHasEverCommitted = false;
|
|
127
129
|
const mpaNavigationScheduler = new AppBrowserMpaNavigationScheduler();
|
|
128
130
|
const unresolvedMpaNavigation = new Promise(() => {});
|
|
@@ -135,15 +137,17 @@ function waitForRscHmrSettle(delayMs = RSC_HMR_SETTLE_DELAY_MS) {
|
|
|
135
137
|
window.setTimeout(resolve, delayMs);
|
|
136
138
|
});
|
|
137
139
|
}
|
|
138
|
-
function restoreHistoryStateSnapshot(historyState) {
|
|
139
|
-
const navId = browserNavigationController.getActiveNavigationId();
|
|
140
|
+
function restoreHistoryStateSnapshot(historyState, navId, onApprovedBeforeCommit) {
|
|
140
141
|
let restored = false;
|
|
141
142
|
flushSync(() => {
|
|
142
143
|
restored = historyController.restoreHistorySnapshot({
|
|
143
144
|
historyState,
|
|
144
145
|
stageClientParams,
|
|
145
146
|
approveVisibleRestore: ({ state, beforeCommit }) => browserNavigationController.restoreHistorySnapshotVisibleState({
|
|
146
|
-
beforeCommit
|
|
147
|
+
beforeCommit: () => {
|
|
148
|
+
onApprovedBeforeCommit?.();
|
|
149
|
+
beforeCommit();
|
|
150
|
+
},
|
|
147
151
|
navId,
|
|
148
152
|
state,
|
|
149
153
|
targetHref: window.location.href
|
|
@@ -151,7 +155,7 @@ function restoreHistoryStateSnapshot(historyState) {
|
|
|
151
155
|
});
|
|
152
156
|
});
|
|
153
157
|
if (!restored) return false;
|
|
154
|
-
commitClientNavigationState();
|
|
158
|
+
commitClientNavigationState(navId, { releaseSnapshot: false });
|
|
155
159
|
return true;
|
|
156
160
|
}
|
|
157
161
|
function getBrowserRouterState() {
|
|
@@ -184,6 +188,7 @@ function clearPrefetchState() {
|
|
|
184
188
|
optimisticRouteTemplateLearning.clear();
|
|
185
189
|
}
|
|
186
190
|
function clearClientNavigationCaches() {
|
|
191
|
+
clientNavigationCacheGeneration += 1;
|
|
187
192
|
clearVisitedResponseCache();
|
|
188
193
|
clearPrefetchState();
|
|
189
194
|
historyController.invalidateRestorableClientState();
|
|
@@ -281,7 +286,7 @@ function createNavigationCommitEffect(options) {
|
|
|
281
286
|
commitClientNavigationState(navId);
|
|
282
287
|
};
|
|
283
288
|
}
|
|
284
|
-
async function renderNavigationPayload(payload, navigationSnapshot, targetHref, navId, historyUpdateMode, params, previousNextUrl, pendingRouterState, payloadOrigin, actionType = "navigate", operationLane = "navigation", traversalIntent = null, scrollIntent = null, restoredBfcacheIds = null, reuseCurrentBfcacheIds = true, visibleCommitMode = "transition") {
|
|
289
|
+
async function renderNavigationPayload(payload, navigationSnapshot, targetHref, navId, historyUpdateMode, params, previousNextUrl, pendingRouterState, payloadOrigin, actionType = "navigate", operationLane = "navigation", traversalIntent = null, scrollIntent = null, restoredBfcacheIds = null, reuseCurrentBfcacheIds = true, visibleCommitMode = "transition", onCommittedState, navigationCommitKind) {
|
|
285
290
|
syncServerActionHttpFallbackHead(null);
|
|
286
291
|
return browserNavigationController.renderNavigationPayload({
|
|
287
292
|
actionType,
|
|
@@ -300,7 +305,9 @@ async function renderNavigationPayload(payload, navigationSnapshot, targetHref,
|
|
|
300
305
|
targetHistoryIndex: traversalIntent === null ? void 0 : traversalIntent.targetHistoryIndex,
|
|
301
306
|
targetHref,
|
|
302
307
|
navId,
|
|
303
|
-
|
|
308
|
+
navigationCommitKind,
|
|
309
|
+
visibleCommitMode,
|
|
310
|
+
onCommittedState
|
|
304
311
|
});
|
|
305
312
|
}
|
|
306
313
|
async function commitSameUrlNavigatePayload(nextElements, actionInitiation, returnValue, revalidation = "none") {
|
|
@@ -341,7 +348,7 @@ function readVisitedResponseCacheCandidate(rscUrl, interceptionContext, mountedS
|
|
|
341
348
|
navigationKind,
|
|
342
349
|
now: Date.now()
|
|
343
350
|
}),
|
|
344
|
-
mountedSlotsMatch:
|
|
351
|
+
mountedSlotsMatch: cached.mountedSlotsHeader === mountedSlotsHeader,
|
|
345
352
|
navigationKind
|
|
346
353
|
}
|
|
347
354
|
};
|
|
@@ -359,20 +366,32 @@ function applyVisitedResponseCacheCandidateDecision(candidate, decision) {
|
|
|
359
366
|
function deleteVisitedResponse(rscUrl, interceptionContext) {
|
|
360
367
|
visitedResponseCache.delete(AppElementsWire.encodeCacheKey(rscUrl, interceptionContext));
|
|
361
368
|
}
|
|
362
|
-
function storeVisitedResponseSnapshot(rscUrl, interceptionContext, snapshot, params) {
|
|
369
|
+
function storeVisitedResponseSnapshot(rscUrl, interceptionContext, snapshot, params, prefetchFallbackTtlMs = DYNAMIC_NAVIGATION_CACHE_TTL, requestMountedSlotsHeader = snapshot.mountedSlotsHeader ?? null, elements) {
|
|
363
370
|
const cacheKey = AppElementsWire.encodeCacheKey(rscUrl, interceptionContext);
|
|
364
371
|
visitedResponseCache.delete(cacheKey);
|
|
365
372
|
evictVisitedResponseCacheIfNeeded();
|
|
366
|
-
const
|
|
367
|
-
|
|
368
|
-
|
|
373
|
+
const entry = createVisitedResponseCacheEntry({
|
|
374
|
+
fallbackTtlMs: prefetchFallbackTtlMs,
|
|
375
|
+
elements,
|
|
376
|
+
now: Date.now(),
|
|
377
|
+
mountedSlotsHeader: requestMountedSlotsHeader,
|
|
369
378
|
params,
|
|
370
379
|
response: snapshot
|
|
371
|
-
})
|
|
380
|
+
});
|
|
381
|
+
visitedResponseCache.set(cacheKey, entry);
|
|
382
|
+
seedPrefetchResponseSnapshot(rscUrl, snapshot, interceptionContext, requestMountedSlotsHeader, prefetchFallbackTtlMs);
|
|
383
|
+
return () => {
|
|
384
|
+
if (visitedResponseCache.get(cacheKey) === entry) visitedResponseCache.delete(cacheKey);
|
|
385
|
+
deletePrefetchResponseSnapshot(rscUrl, snapshot, interceptionContext);
|
|
386
|
+
};
|
|
372
387
|
}
|
|
373
388
|
function clientNavigationSnapshotHref(snapshot) {
|
|
374
389
|
return `${window.location.origin}${createSnapshotPathAndSearch(snapshot)}`;
|
|
375
390
|
}
|
|
391
|
+
function getCurrentMatchedRoutePathname() {
|
|
392
|
+
const routeKey = AppElementsWire.parseElementKey(getBrowserRouterState().routeId);
|
|
393
|
+
return routeKey?.kind === "route" ? routeKey.path : null;
|
|
394
|
+
}
|
|
376
395
|
function getRequestState(navigationKind, targetPathname, previousNextUrlOverride, traverseHistoryState) {
|
|
377
396
|
if (previousNextUrlOverride !== void 0) return {
|
|
378
397
|
interceptionContext: resolveInterceptionContextFromPreviousNextUrl(previousNextUrlOverride, __basePath),
|
|
@@ -397,6 +416,7 @@ function getRequestState(navigationKind, targetPathname, previousNextUrlOverride
|
|
|
397
416
|
};
|
|
398
417
|
const middlewareRewriteInterceptionContext = resolveMiddlewareRewriteNavigationInterceptionContext({
|
|
399
418
|
basePath: __basePath,
|
|
419
|
+
currentMatchedPathname: getCurrentMatchedRoutePathname(),
|
|
400
420
|
currentPathname: window.location.pathname,
|
|
401
421
|
routeManifest: getBrowserRouteManifest(),
|
|
402
422
|
targetPathname
|
|
@@ -462,7 +482,7 @@ function AppRouterRedirectBridge({ children }) {
|
|
|
462
482
|
function decodeAppElementsPromise(payload) {
|
|
463
483
|
return Promise.resolve(payload).then((elements) => AppElementsWire.decode(elements));
|
|
464
484
|
}
|
|
465
|
-
function BrowserRoot({ initialElements, initialNavigationSnapshot }) {
|
|
485
|
+
function BrowserRoot({ hydrationCachePublication, initialElements, initialNavigationSnapshot }) {
|
|
466
486
|
const resolvedElements = use(initialElements);
|
|
467
487
|
const initialMetadata = AppElementsWire.readMetadata(resolvedElements);
|
|
468
488
|
const [treeStateValue, setTreeStateValue] = useState(() => ({
|
|
@@ -502,19 +522,22 @@ function BrowserRoot({ initialElements, initialNavigationSnapshot }) {
|
|
|
502
522
|
return new Promise(() => {});
|
|
503
523
|
} });
|
|
504
524
|
browserRouterStateHasEverCommitted = true;
|
|
525
|
+
hydrationCachePublication.commit();
|
|
505
526
|
return () => {
|
|
527
|
+
hydrationCachePublication.invalidate();
|
|
506
528
|
registerNavigationRuntimeFunctions({ navigateExternal: void 0 });
|
|
507
529
|
detach();
|
|
508
530
|
setMountedSlotsHeader(null);
|
|
509
531
|
};
|
|
510
|
-
}, [setTreeStateValue]);
|
|
532
|
+
}, [hydrationCachePublication, setTreeStateValue]);
|
|
511
533
|
useEffect(() => {
|
|
534
|
+
hydrationCachePublication.complete();
|
|
512
535
|
const hydratedAt = performance.now();
|
|
513
536
|
window.__VINEXT_HYDRATED_AT = hydratedAt;
|
|
514
537
|
window.__NEXT_HYDRATED = true;
|
|
515
538
|
window.__NEXT_HYDRATED_AT = hydratedAt;
|
|
516
539
|
window.__NEXT_HYDRATED_CB?.();
|
|
517
|
-
}, []);
|
|
540
|
+
}, [hydrationCachePublication]);
|
|
518
541
|
useLayoutEffect(() => {
|
|
519
542
|
historyController.rememberHistoryStateSnapshot(treeState);
|
|
520
543
|
}, [treeState]);
|
|
@@ -673,11 +696,11 @@ function registerServerActionCallback() {
|
|
|
673
696
|
commitSameUrlNavigatePayload,
|
|
674
697
|
navigationPlanner,
|
|
675
698
|
performHardNavigation: (url, historyMode) => browserNavigationController.performHardNavigation(url, historyMode),
|
|
676
|
-
renderRedirectPayload(elements, target, actionInitiation) {
|
|
699
|
+
renderRedirectPayload(elements, target, actionInitiation, revalidation) {
|
|
677
700
|
const hashIdx = target.href.indexOf("#");
|
|
678
701
|
const actionScrollIntent = beginAppRouterScrollIntent((hashIdx !== -1 ? target.href.slice(hashIdx) : "") || null);
|
|
679
702
|
if (target.type === "push") saveScrollPosition();
|
|
680
|
-
renderNavigationPayload(Promise.resolve(elements), createClientNavigationRenderSnapshot(target.href, actionInitiation.routerState.navigationSnapshot.params), target.href, actionInitiation.navigationId, target.type === "push" ? "push" : "replace", {}, null, null, FRESH_APP_NAVIGATION_PAYLOAD_ORIGIN, target.type === "push" ? "navigate" : "replace",
|
|
703
|
+
renderNavigationPayload(Promise.resolve(elements), createClientNavigationRenderSnapshot(target.href, actionInitiation.routerState.navigationSnapshot.params), target.href, actionInitiation.navigationId, target.type === "push" ? "push" : "replace", {}, null, null, FRESH_APP_NAVIGATION_PAYLOAD_ORIGIN, target.type === "push" ? "navigate" : "replace", resolveServerActionOperationLane(revalidation), null, actionScrollIntent).catch(() => {
|
|
681
704
|
browserNavigationController.performHardNavigation(target.href);
|
|
682
705
|
});
|
|
683
706
|
},
|
|
@@ -692,32 +715,76 @@ async function main() {
|
|
|
692
715
|
installAppNavigationFailureListeners();
|
|
693
716
|
let devErrorOverlay = null;
|
|
694
717
|
if (import.meta.env.DEV) {
|
|
695
|
-
devErrorOverlay = await import("
|
|
718
|
+
devErrorOverlay = await import("../client/dev-error-overlay.js");
|
|
696
719
|
devErrorOverlay.installDevErrorOverlay();
|
|
697
720
|
devErrorOverlay.installViteHmrErrorHandler(import.meta.hot);
|
|
698
721
|
devErrorOverlay.reportInitialDevServerErrors();
|
|
699
722
|
}
|
|
723
|
+
const initialRscBootstrap = getNavigationRuntime()?.bootstrap.rsc;
|
|
700
724
|
const rscStream = await readInitialRscStream();
|
|
701
725
|
if (rscStream === null) return;
|
|
702
|
-
bootstrapHydration(rscStream, devErrorOverlay);
|
|
726
|
+
bootstrapHydration(rscStream, devErrorOverlay, initialRscBootstrap);
|
|
703
727
|
}
|
|
704
|
-
function bootstrapHydration(rscStream, devErrorOverlay) {
|
|
705
|
-
const
|
|
728
|
+
function bootstrapHydration(rscStream, devErrorOverlay, initialRscBootstrap) {
|
|
729
|
+
const hydrationCachePublication = createHydrationCachePublication();
|
|
730
|
+
const cacheGeneration = clientNavigationCacheGeneration;
|
|
731
|
+
const [reactBranch, cacheBranch] = rscStream.tee();
|
|
732
|
+
const root = decodeAppElementsPromise(createFromReadableStream(reactBranch));
|
|
706
733
|
const initialNavigationSnapshot = createClientNavigationRenderSnapshot(window.location.href, latestClientParams);
|
|
734
|
+
const initialParams = initialNavigationSnapshot.params;
|
|
735
|
+
const initialPathAndSearch = createSnapshotPathAndSearch(initialNavigationSnapshot);
|
|
736
|
+
const initialCacheBuffer = new Response(cacheBranch).arrayBuffer();
|
|
737
|
+
Promise.all([root, initialCacheBuffer]).then(async ([elements, buffer]) => {
|
|
738
|
+
if (cacheGeneration !== clientNavigationCacheGeneration) return;
|
|
739
|
+
const metadata = AppElementsWire.readMetadata(elements);
|
|
740
|
+
if (!isCompleteAppPayloadMetadata(metadata)) return;
|
|
741
|
+
const mountedSlotsHeader = getMountedSlotIdsHeader(elements);
|
|
742
|
+
const rscUrl = await createRscRequestUrl(initialPathAndSearch, createRscRequestHeaders({ mountedSlotsHeader }));
|
|
743
|
+
if (cacheGeneration !== clientNavigationCacheGeneration) return;
|
|
744
|
+
const snapshot = {
|
|
745
|
+
compatibilityIdHeader: CLIENT_RSC_COMPATIBILITY_ID,
|
|
746
|
+
buffer,
|
|
747
|
+
contentType: VINEXT_RSC_CONTENT_TYPE,
|
|
748
|
+
...initialRscBootstrap?.dynamicStaleTimeSeconds !== void 0 ? { dynamicStaleTimeSeconds: initialRscBootstrap.dynamicStaleTimeSeconds } : {},
|
|
749
|
+
mountedSlotsHeader,
|
|
750
|
+
paramsHeader: encodeURIComponent(JSON.stringify(initialParams)),
|
|
751
|
+
url: rscUrl
|
|
752
|
+
};
|
|
753
|
+
const fallbackTtlMs = initialRscBootstrap?.initialCacheKind === "static" ? PREFETCH_CACHE_TTL : DYNAMIC_NAVIGATION_CACHE_TTL;
|
|
754
|
+
hydrationCachePublication.publish(() => {
|
|
755
|
+
if (cacheGeneration !== clientNavigationCacheGeneration) return () => {};
|
|
756
|
+
if (isCacheRestorableAppPayloadMetadata(metadata)) return storeVisitedResponseSnapshot(rscUrl, metadata.interceptionContext, snapshot, initialParams, fallbackTtlMs, mountedSlotsHeader);
|
|
757
|
+
seedPrefetchResponseSnapshot(rscUrl, snapshot, metadata.interceptionContext, mountedSlotsHeader, fallbackTtlMs);
|
|
758
|
+
return () => deletePrefetchResponseSnapshot(rscUrl, snapshot, metadata.interceptionContext);
|
|
759
|
+
});
|
|
760
|
+
}).catch(() => {});
|
|
707
761
|
historyController.writeBootstrapHistoryMetadata();
|
|
708
|
-
const
|
|
762
|
+
const reportUncaughtError = createOnUncaughtError();
|
|
763
|
+
const onUncaughtError = (...args) => {
|
|
764
|
+
hydrationCachePublication.fail();
|
|
765
|
+
reportUncaughtError(...args);
|
|
766
|
+
};
|
|
767
|
+
const onRecoverableError = (...args) => {
|
|
768
|
+
hydrationCachePublication.fail();
|
|
769
|
+
prodOnRecoverableError(...args);
|
|
770
|
+
};
|
|
771
|
+
const invalidateOnCaughtError = (handler) => ((...args) => {
|
|
772
|
+
hydrationCachePublication.fail();
|
|
773
|
+
handler(...args);
|
|
774
|
+
});
|
|
709
775
|
const formState = consumeInitialFormState(getVinextBrowserGlobal());
|
|
710
776
|
const hydrateRootOptions = import.meta.env.DEV && devErrorOverlay ? createVinextHydrateRootOptions({
|
|
711
777
|
formState,
|
|
712
|
-
onCaughtError: createDevOnCaughtError(devErrorOverlay.devOnCaughtError, onUncaughtError),
|
|
778
|
+
onCaughtError: invalidateOnCaughtError(createDevOnCaughtError(devErrorOverlay.devOnCaughtError, onUncaughtError)),
|
|
713
779
|
onUncaughtError
|
|
714
780
|
}) : createVinextHydrateRootOptions({
|
|
715
781
|
formState,
|
|
716
|
-
onCaughtError: createProdOnCaughtError(onUncaughtError),
|
|
717
|
-
onRecoverableError
|
|
782
|
+
onCaughtError: invalidateOnCaughtError(createProdOnCaughtError(onUncaughtError)),
|
|
783
|
+
onRecoverableError,
|
|
718
784
|
onUncaughtError
|
|
719
785
|
});
|
|
720
786
|
const children = createElement(BrowserRoot, {
|
|
787
|
+
hydrationCachePublication,
|
|
721
788
|
initialElements: root,
|
|
722
789
|
initialNavigationSnapshot
|
|
723
790
|
});
|
|
@@ -739,15 +806,20 @@ function bootstrapHydration(rscStream, devErrorOverlay) {
|
|
|
739
806
|
});
|
|
740
807
|
markInitialAppRouterBootstrapHydrated();
|
|
741
808
|
let activeNavigationAbortController = null;
|
|
809
|
+
function abortSupersededNavigation() {
|
|
810
|
+
activeNavigationAbortController?.abort();
|
|
811
|
+
activeNavigationAbortController = null;
|
|
812
|
+
}
|
|
742
813
|
registerNavigationRuntimeFunctions({
|
|
743
814
|
clearNavigationCaches: clearClientNavigationCaches,
|
|
744
815
|
commitHashNavigation: (href, historyUpdateMode, scroll) => historyController.commitHashOnlyNavigation(href, historyUpdateMode, scroll),
|
|
745
816
|
navigate: async function navigateRsc(href, redirectDepth = 0, navigationKind = "navigate", historyUpdateMode, previousNextUrlOverride, programmaticTransition = false, traversalIntent, scrollIntent, visibleCommitMode = "transition") {
|
|
746
|
-
|
|
817
|
+
abortSupersededNavigation();
|
|
747
818
|
const navigationAbortController = new AbortController();
|
|
748
819
|
activeNavigationAbortController = navigationAbortController;
|
|
749
820
|
let pendingRouterState = null;
|
|
750
821
|
const navId = browserNavigationController.beginNavigation();
|
|
822
|
+
const navigationCacheGeneration = clientNavigationCacheGeneration;
|
|
751
823
|
discardedServerActionRefreshScheduler.markNavigationStart();
|
|
752
824
|
let currentHref = href;
|
|
753
825
|
let currentHistoryMode = historyUpdateMode;
|
|
@@ -855,9 +927,10 @@ function bootstrapHydration(rscStream, devErrorOverlay) {
|
|
|
855
927
|
if (!browserNavigationController.isCurrentNavigation(navId)) return;
|
|
856
928
|
const cachedParams = cachedRoute.params;
|
|
857
929
|
const cachedNavigationSnapshot = createClientNavigationRenderSnapshot(currentHref, cachedParams);
|
|
858
|
-
const cachedPayload = decodeAppElementsPromise(createFromFetch(Promise.resolve(restoreRscResponse(cachedRoute.response))));
|
|
930
|
+
const cachedPayload = cachedRoute.elements ? Promise.resolve(cachedRoute.elements) : decodeAppElementsPromise(createFromFetch(Promise.resolve(restoreRscResponse(cachedRoute.response))));
|
|
859
931
|
if (!browserNavigationController.isCurrentNavigation(navId)) return;
|
|
860
|
-
if (await renderNavigationPayload(cachedPayload, cachedNavigationSnapshot, currentHref, navId, currentHistoryMode, cachedParams, requestPreviousNextUrl, detachedNavigationCommits ? null : pendingRouterState, VISITED_CACHE_APP_NAVIGATION_PAYLOAD_ORIGIN, toActionType(navigationKind), toOperationLane(navigationKind), activeTraversalIntent, scrollIntent, restoredBfcacheIds, reuseCurrentBfcacheIds, visibleCommitMode) === "no-commit") {
|
|
932
|
+
if (await renderNavigationPayload(cachedPayload, cachedNavigationSnapshot, currentHref, navId, currentHistoryMode, cachedParams, requestPreviousNextUrl, detachedNavigationCommits ? null : pendingRouterState, cachedRoute.elements ? COMMITTED_CACHE_APP_NAVIGATION_PAYLOAD_ORIGIN : VISITED_CACHE_APP_NAVIGATION_PAYLOAD_ORIGIN, toActionType(navigationKind), toOperationLane(navigationKind), activeTraversalIntent, scrollIntent, restoredBfcacheIds, reuseCurrentBfcacheIds, visibleCommitMode) === "no-commit") {
|
|
933
|
+
if (!browserNavigationController.isCurrentNavigation(navId)) return;
|
|
861
934
|
deleteVisitedResponse(rscUrl, requestInterceptionContext);
|
|
862
935
|
continue;
|
|
863
936
|
}
|
|
@@ -909,7 +982,7 @@ function bootstrapHydration(rscStream, devErrorOverlay) {
|
|
|
909
982
|
if (optimisticPayload !== null) {
|
|
910
983
|
detachedNavigationCommits = true;
|
|
911
984
|
const optimisticNavigationSnapshot = createClientNavigationRenderSnapshot(currentHref, optimisticPayload.params);
|
|
912
|
-
renderNavigationPayload(Promise.resolve(optimisticPayload.elements), optimisticNavigationSnapshot, currentHref, navId, currentHistoryMode, optimisticPayload.params, requestPreviousNextUrl, null, FRESH_APP_NAVIGATION_PAYLOAD_ORIGIN, toActionType(navigationKind), toOperationLane(navigationKind), activeTraversalIntent, scrollIntent, restoredBfcacheIds, reuseCurrentBfcacheIds, visibleCommitMode).catch((error) => {
|
|
985
|
+
renderNavigationPayload(Promise.resolve(optimisticPayload.elements), optimisticNavigationSnapshot, currentHref, navId, currentHistoryMode, optimisticPayload.params, requestPreviousNextUrl, null, FRESH_APP_NAVIGATION_PAYLOAD_ORIGIN, toActionType(navigationKind), toOperationLane(navigationKind), activeTraversalIntent, scrollIntent, restoredBfcacheIds, reuseCurrentBfcacheIds, visibleCommitMode, void 0, "detached").catch((error) => {
|
|
913
986
|
if (browserNavigationController.isCurrentNavigation(navId)) console.error("[vinext] Optimistic RSC navigation error:", error);
|
|
914
987
|
});
|
|
915
988
|
}
|
|
@@ -975,21 +1048,47 @@ function bootstrapHydration(rscStream, devErrorOverlay) {
|
|
|
975
1048
|
if (!browserNavigationController.isCurrentNavigation(navId)) return;
|
|
976
1049
|
const rscPayload = decodeAppElementsPromise(createFromFetch(Promise.resolve(reactResponse)));
|
|
977
1050
|
if (!browserNavigationController.isCurrentNavigation(navId)) return;
|
|
978
|
-
|
|
1051
|
+
let committedState = null;
|
|
1052
|
+
if (await renderNavigationPayload(rscPayload, navigationSnapshot, currentHref, navId, currentHistoryMode, navParams, requestPreviousNextUrl, detachedNavigationCommits ? null : pendingRouterState, FRESH_APP_NAVIGATION_PAYLOAD_ORIGIN, toActionType(navigationKind), toOperationLane(navigationKind), activeTraversalIntent, scrollIntent, restoredBfcacheIds, reuseCurrentBfcacheIds, visibleCommitMode, (state) => {
|
|
1053
|
+
committedState = state;
|
|
1054
|
+
if (activeNavigationAbortController === navigationAbortController) activeNavigationAbortController = null;
|
|
1055
|
+
}, detachedNavigationCommits ? "authoritative" : void 0) !== "committed") return;
|
|
979
1056
|
if (!browserNavigationController.isCurrentNavigation(navId)) return;
|
|
980
1057
|
try {
|
|
981
1058
|
const renderedElements = await rscPayload;
|
|
1059
|
+
if (navigationCacheGeneration !== clientNavigationCacheGeneration) return;
|
|
982
1060
|
const metadata = AppElementsWire.readMetadata(renderedElements);
|
|
983
|
-
if (!isCacheRestorableAppPayloadMetadata(metadata)) {
|
|
984
|
-
cacheBufferPromise.catch(() => {});
|
|
985
|
-
return;
|
|
986
|
-
}
|
|
987
1061
|
const cacheBuffer = await cacheBufferPromise;
|
|
988
|
-
|
|
989
|
-
|
|
1062
|
+
if (navigationCacheGeneration !== clientNavigationCacheGeneration) return;
|
|
1063
|
+
const responseSnapshot = createCachedRscResponseSnapshot(navResponse, cacheBuffer, navResponseUrl);
|
|
1064
|
+
const { dynamicStaleTimeSeconds: _staticDynamicStaleTime, ...staticResponseSnapshot } = responseSnapshot;
|
|
1065
|
+
const snapshot = {
|
|
1066
|
+
...isCacheRestorableAppPayloadMetadata(metadata) ? staticResponseSnapshot : {
|
|
1067
|
+
...responseSnapshot,
|
|
1068
|
+
...responseSnapshot.dynamicStaleTimeSeconds === void 0 && metadata.dynamicStaleTimeSeconds !== void 0 ? { dynamicStaleTimeSeconds: metadata.dynamicStaleTimeSeconds } : {}
|
|
1069
|
+
},
|
|
990
1070
|
...navResponseExpiresAt !== void 0 ? { expiresAt: navResponseExpiresAt } : {},
|
|
991
1071
|
mountedSlotsHeader: getMountedSlotIdsHeader(renderedElements)
|
|
992
|
-
}
|
|
1072
|
+
};
|
|
1073
|
+
const interceptionContext = resolveVisitedResponseInterceptionContext(requestInterceptionContext, metadata.interceptionContext);
|
|
1074
|
+
if (isCacheRestorableAppPayloadMetadata(metadata)) {
|
|
1075
|
+
if (navigationCacheGeneration !== clientNavigationCacheGeneration) return;
|
|
1076
|
+
storeVisitedResponseSnapshot(rscUrl, interceptionContext, snapshot, navParams, PREFETCH_CACHE_TTL, mountedSlotsHeader);
|
|
1077
|
+
} else if (committedState !== null && getMountedSlotIdsHeader(committedState.elements) === null) {
|
|
1078
|
+
const state = committedState;
|
|
1079
|
+
const committedElements = {
|
|
1080
|
+
...state.elements,
|
|
1081
|
+
[AppElementsWire.keys.layoutFlags]: state.layoutFlags,
|
|
1082
|
+
[AppElementsWire.keys.layoutIds]: state.layoutIds,
|
|
1083
|
+
[AppElementsWire.keys.skippedLayoutIds]: [],
|
|
1084
|
+
[AppElementsWire.keys.slotBindings]: state.slotBindings
|
|
1085
|
+
};
|
|
1086
|
+
if (navigationCacheGeneration !== clientNavigationCacheGeneration) return;
|
|
1087
|
+
storeVisitedResponseSnapshot(rscUrl, interceptionContext, snapshot, navParams, DYNAMIC_NAVIGATION_CACHE_TTL, mountedSlotsHeader, committedElements);
|
|
1088
|
+
} else {
|
|
1089
|
+
if (navigationCacheGeneration !== clientNavigationCacheGeneration) return;
|
|
1090
|
+
seedPrefetchResponseSnapshot(rscUrl, snapshot, interceptionContext, mountedSlotsHeader, DYNAMIC_NAVIGATION_CACHE_TTL);
|
|
1091
|
+
}
|
|
993
1092
|
} catch {}
|
|
994
1093
|
return;
|
|
995
1094
|
}
|
|
@@ -1026,15 +1125,25 @@ function bootstrapHydration(rscStream, devErrorOverlay) {
|
|
|
1026
1125
|
restorePopstateScrollPosition(event.state);
|
|
1027
1126
|
return;
|
|
1028
1127
|
}
|
|
1128
|
+
const snapshotNavigationId = browserNavigationController.beginNavigation();
|
|
1129
|
+
if (restoreHistoryStateSnapshot(event.state, snapshotNavigationId, () => {
|
|
1130
|
+
abortSupersededNavigation();
|
|
1131
|
+
notifyAppRouterTransitionStart(href, "traverse");
|
|
1132
|
+
})) {
|
|
1133
|
+
window.__VINEXT_RSC_PENDING__ = null;
|
|
1134
|
+
restoreSynchronousPopstateScrollPosition({
|
|
1135
|
+
getActiveNavigationId: () => browserNavigationController.getActiveNavigationId(),
|
|
1136
|
+
isCurrentNavigation: (navId) => browserNavigationController.isCurrentNavigation(navId),
|
|
1137
|
+
markScrollRestoreConsumed: (navId) => {
|
|
1138
|
+
synchronousPopstateScrollRestoreNavigationId = navId;
|
|
1139
|
+
},
|
|
1140
|
+
restorePopstateScrollPosition
|
|
1141
|
+
}, event.state);
|
|
1142
|
+
browserNavigationController.finalizeNavigation(snapshotNavigationId, null);
|
|
1143
|
+
return;
|
|
1144
|
+
}
|
|
1145
|
+
browserNavigationController.finalizeNavigation(snapshotNavigationId, null);
|
|
1029
1146
|
handlePopstate(event);
|
|
1030
|
-
if (restoreHistoryStateSnapshot(event.state)) restoreSynchronousPopstateScrollPosition({
|
|
1031
|
-
getActiveNavigationId: () => browserNavigationController.getActiveNavigationId(),
|
|
1032
|
-
isCurrentNavigation: (navId) => browserNavigationController.isCurrentNavigation(navId),
|
|
1033
|
-
markScrollRestoreConsumed: (navId) => {
|
|
1034
|
-
synchronousPopstateScrollRestoreNavigationId = navId;
|
|
1035
|
-
},
|
|
1036
|
-
restorePopstateScrollPosition
|
|
1037
|
-
}, event.state);
|
|
1038
1147
|
});
|
|
1039
1148
|
if (import.meta.env.DEV && import.meta.hot) {
|
|
1040
1149
|
const applyRscHmrUpdate = async (updateId) => {
|
|
@@ -1053,7 +1162,7 @@ function bootstrapHydration(rscStream, devErrorOverlay) {
|
|
|
1053
1162
|
clearClientNavigationCaches();
|
|
1054
1163
|
const navigationSnapshot = createClientNavigationRenderSnapshot(window.location.href, latestClientParams);
|
|
1055
1164
|
devErrorOverlay?.dismissOverlay();
|
|
1056
|
-
const hmrHeaders = createRscRequestHeaders();
|
|
1165
|
+
const hmrHeaders = createRscRequestHeaders({ mountedSlotsHeader: getMountedSlotIdsHeader(browserNavigationController.getBrowserRouterState().elements) });
|
|
1057
1166
|
await browserNavigationController.hmrReplaceTree(decodeAppElementsPromise(createFromFetch(fetch(await createRscRequestUrl(window.location.pathname + window.location.search, hmrHeaders), { headers: hmrHeaders }))), navigationSnapshot);
|
|
1058
1167
|
};
|
|
1059
1168
|
const handleRscUpdate = async (updateId) => {
|
|
@@ -3,6 +3,7 @@ import { RouteManifest } from "../routing/app-route-graph.js";
|
|
|
3
3
|
//#region src/server/app-browser-interception-context.d.ts
|
|
4
4
|
type ResolveManifestNavigationInterceptionContextOptions = {
|
|
5
5
|
basePath: string;
|
|
6
|
+
currentMatchedPathname?: string | null;
|
|
6
7
|
currentPathname: string;
|
|
7
8
|
routeManifest: RouteManifest | null;
|
|
8
9
|
targetPathname: string;
|
|
@@ -29,13 +29,15 @@ function resolveManifestNavigationInterceptionContext(options) {
|
|
|
29
29
|
function resolveMiddlewareRewriteNavigationInterceptionContext(options) {
|
|
30
30
|
if (options.routeManifest === null) return null;
|
|
31
31
|
const currentPathname = stripBasePath(options.currentPathname, options.basePath);
|
|
32
|
+
const currentMatchedPathname = options.currentMatchedPathname ? stripBasePath(options.currentMatchedPathname, options.basePath) : null;
|
|
32
33
|
const targetPathname = stripBasePath(options.targetPathname, options.basePath);
|
|
33
34
|
const sourceParts = splitPathnameForRouteMatch(currentPathname);
|
|
35
|
+
const matchedSourceParts = currentMatchedPathname ? splitPathnameForRouteMatch(currentMatchedPathname) : null;
|
|
34
36
|
const targetParts = splitPathnameForRouteMatch(targetPathname);
|
|
35
37
|
for (const interception of options.routeManifest.segmentGraph.interceptions.values()) {
|
|
36
|
-
if (!matchRoutePatternPrefix(sourceParts, interception.sourcePatternParts)) continue;
|
|
37
38
|
if (!matchRoutePatternWithOptionalDynamicSegments(targetParts, interception.targetPatternParts)) continue;
|
|
38
|
-
return currentPathname;
|
|
39
|
+
if (matchRoutePatternPrefix(sourceParts, interception.sourcePatternParts)) return currentPathname;
|
|
40
|
+
if (currentMatchedPathname !== null && matchedSourceParts !== null && matchRoutePatternPrefix(matchedSourceParts, interception.sourcePatternParts)) return currentMatchedPathname;
|
|
39
41
|
}
|
|
40
42
|
return null;
|
|
41
43
|
}
|
|
@@ -77,7 +77,9 @@ type BrowserNavigationController = {
|
|
|
77
77
|
targetHistoryIndex?: number | null;
|
|
78
78
|
targetHref: string;
|
|
79
79
|
navId: number;
|
|
80
|
+
navigationCommitKind?: "authoritative" | "detached";
|
|
80
81
|
visibleCommitMode?: NavigationRuntimeVisibleCommitMode;
|
|
82
|
+
onCommittedState?: (state: AppRouterState) => void;
|
|
81
83
|
}): Promise<NavigationPayloadOutcome>;
|
|
82
84
|
commitSameUrlNavigatePayload(nextElements: Promise<AppElements>, navigationSnapshot: ClientNavigationRenderSnapshot, returnValue?: {
|
|
83
85
|
ok: boolean;
|