vinext 0.1.7 → 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.d.ts +18 -0
- package/dist/check.js +77 -19
- 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 +113 -97
- 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 +6 -3
- package/dist/config/next-config.js +47 -1
- package/dist/config/prerender.d.ts +34 -0
- package/dist/config/prerender.js +55 -0
- package/dist/config/server-external-packages.d.ts +4 -0
- package/dist/config/server-external-packages.js +91 -0
- package/dist/entries/app-rsc-entry.d.ts +2 -1
- package/dist/entries/app-rsc-entry.js +89 -15
- package/dist/entries/app-rsc-manifest.js +10 -0
- package/dist/entries/pages-client-entry.d.ts +3 -0
- package/dist/entries/pages-client-entry.js +16 -1
- package/dist/entries/pages-server-entry.js +6 -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 +211 -118
- 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 +208 -97
- 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/middleware-server-only.d.ts +8 -6
- package/dist/plugins/middleware-server-only.js +8 -7
- package/dist/plugins/optimize-imports.js +1 -1
- 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 +29 -4
- package/dist/routing/app-route-graph.js +182 -40
- package/dist/routing/app-router.d.ts +5 -0
- package/dist/routing/app-router.js +5 -0
- package/dist/routing/file-matcher.d.ts +8 -0
- package/dist/routing/file-matcher.js +10 -1
- 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 +194 -190
- package/dist/server/app-browser-history-controller.d.ts +2 -1
- package/dist/server/app-browser-history-controller.js +6 -2
- 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 +32 -0
- package/dist/server/app-browser-server-action-client.js +127 -0
- 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 +5 -2
- package/dist/server/app-fallback-renderer.js +15 -7
- 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-boundary-render.d.ts +3 -0
- package/dist/server/app-page-boundary-render.js +14 -3
- package/dist/server/app-page-cache-finalizer.d.ts +1 -0
- package/dist/server/app-page-cache-finalizer.js +10 -3
- 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.d.ts +33 -4
- package/dist/server/app-page-dispatch.js +63 -90
- package/dist/server/app-page-element-builder.d.ts +9 -2
- package/dist/server/app-page-element-builder.js +114 -23
- package/dist/server/app-page-head.d.ts +16 -1
- package/dist/server/app-page-head.js +44 -22
- package/dist/server/app-page-params.d.ts +2 -1
- package/dist/server/app-page-params.js +8 -1
- package/dist/server/app-page-ppr-runtime.d.ts +7 -0
- package/dist/server/app-page-ppr-runtime.js +70 -0
- package/dist/server/app-page-probe.d.ts +1 -0
- package/dist/server/app-page-probe.js +6 -1
- 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.d.ts +4 -1
- package/dist/server/app-page-render.js +26 -3
- package/dist/server/app-page-request.d.ts +22 -1
- package/dist/server/app-page-request.js +92 -15
- package/dist/server/app-page-route-wiring.d.ts +14 -2
- package/dist/server/app-page-route-wiring.js +61 -25
- package/dist/server/app-page-search-params-observation.d.ts +4 -2
- package/dist/server/app-page-search-params-observation.js +11 -7
- 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-ppr-fallback-shell-render.d.ts +4 -3
- package/dist/server/app-route-handler-dispatch.js +1 -0
- package/dist/server/app-route-handler-execution.js +7 -2
- package/dist/server/app-route-handler-response.js +1 -0
- package/dist/server/app-route-handler-runtime.js +1 -1
- package/dist/server/app-route-module-loader.d.ts +2 -0
- package/dist/server/app-route-module-loader.js +1 -0
- package/dist/server/app-router-entry.js +16 -8
- package/dist/server/app-rsc-errors.js +7 -1
- package/dist/server/app-rsc-handler.d.ts +3 -1
- package/dist/server/app-rsc-handler.js +67 -39
- 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-rsc-route-matching.d.ts +7 -0
- package/dist/server/app-rsc-route-matching.js +36 -3
- package/dist/server/app-segment-config.d.ts +12 -0
- package/dist/server/app-segment-config.js +91 -5
- package/dist/server/app-server-action-execution.d.ts +5 -0
- package/dist/server/app-server-action-execution.js +94 -33
- package/dist/server/app-ssr-entry.d.ts +3 -0
- package/dist/server/app-ssr-entry.js +19 -8
- package/dist/server/app-ssr-stream.d.ts +7 -3
- package/dist/server/app-ssr-stream.js +10 -6
- package/dist/server/app-static-generation.d.ts +1 -0
- package/dist/server/app-static-generation.js +1 -0
- 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 +5 -15
- package/dist/server/headers.js +4 -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 +48 -26
- package/dist/server/request-pipeline.js +1 -0
- package/dist/server/seed-cache.js +4 -4
- package/dist/server/worker-utils.d.ts +2 -1
- package/dist/server/worker-utils.js +7 -1
- 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/error-boundary.d.ts +19 -1
- package/dist/shims/error-boundary.js +11 -1
- package/dist/shims/form.d.ts +3 -1
- package/dist/shims/form.js +37 -43
- package/dist/shims/headers.d.ts +9 -1
- package/dist/shims/headers.js +31 -6
- 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 +70 -37
- package/dist/shims/metadata.d.ts +3 -2
- package/dist/shims/metadata.js +8 -4
- 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 +374 -94
- package/dist/shims/server.js +3 -2
- package/dist/shims/slot.js +3 -6
- package/dist/typegen.js +6 -5
- 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/path.d.ts +2 -1
- package/dist/utils/path.js +1 -1
- package/dist/utils/project.d.ts +52 -2
- package/dist/utils/project.js +230 -5
- 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 +53 -4
- package/dist/deploy.d.ts +0 -190
- package/dist/deploy.js +0 -1033
- package/dist/server/dev-stack-sourcemap-endpoint.d.ts +0 -4
- /package/dist/{cloudflare → packages/cloudflare}/src/utils/cache-control-metadata.js +0 -0
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { DANGEROUS_URL_BLOCK_MESSAGE, isDangerousScheme } from "../shims/url-safety.js";
|
|
1
|
+
import { VINEXT_CLIENT_REUSE_MANIFEST_HEADER, VINEXT_PARAMS_HEADER, VINEXT_RSC_REDIRECT_HEADER } from "./headers.js";
|
|
3
2
|
import { AppElementsWire } from "./app-elements-wire.js";
|
|
4
3
|
import { APP_RSC_RENDER_MODE_REFRESH_PRESERVE_UI } from "./app-rsc-render-mode.js";
|
|
5
4
|
import { getMountedSlotIdsHeader, resolveVisitedResponseInterceptionContext } from "./app-elements.js";
|
|
@@ -14,37 +13,35 @@ import { DevRecoveryBoundary, GlobalErrorBoundary, RedirectBoundary } from "../s
|
|
|
14
13
|
import { beginAppRouterScrollIntent, consumeAppRouterScrollIntent } from "../shims/app-router-scroll-state.js";
|
|
15
14
|
import { AppRouterScrollCommitProvider } from "../shims/app-router-scroll.js";
|
|
16
15
|
import { BfcacheStateKeyMapContext, ElementsContext, Slot } from "../shims/slot.js";
|
|
17
|
-
import { VINEXT_RSC_COMPATIBILITY_ID_HEADER, VINEXT_RSC_CONTENT_TYPE, createRscRequestHeaders, createRscRequestUrl,
|
|
16
|
+
import { VINEXT_RSC_COMPATIBILITY_ID_HEADER, VINEXT_RSC_CONTENT_TYPE, createRscRequestHeaders, createRscRequestUrl, getVinextRscCompatibilityId } from "./app-rsc-cache-busting.js";
|
|
18
17
|
import { getNavigationRuntime, registerNavigationRuntimeBootstrap, registerNavigationRuntimeFunctions } from "../client/navigation-runtime.js";
|
|
19
18
|
import { notifyAppRouterTransitionStart } from "../client/instrumentation-client-state.js";
|
|
20
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";
|
|
21
23
|
import { resolveManifestNavigationInterceptionContext, resolveMiddlewareRewriteNavigationInterceptionContext } from "./app-browser-interception-context.js";
|
|
22
24
|
import { readHistoryStatePreviousNextUrl } from "./app-history-state.js";
|
|
23
25
|
import { AppBrowserMpaNavigationScheduler } from "./app-browser-mpa-navigation.js";
|
|
24
26
|
import { blockDangerousStreamedRscRedirect } from "./app-browser-rsc-redirect.js";
|
|
25
27
|
import { navigationPlanner } from "./navigation-planner.js";
|
|
26
|
-
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";
|
|
27
|
-
import { createBfcacheSegmentStateKeyMap, createInitialBfcacheIdMap } from "./app-bfcache-identity.js";
|
|
28
|
-
import { createDiscardedServerActionRefreshScheduler, createServerActionInitiationSnapshot, createServerActionResultFacts, isServerActionResult, normalizeServerActionThrownValue, parseServerActionRevalidationHeader, readInvalidServerActionResponseError, shouldClearClientNavigationCachesForServerActionResult } from "./app-browser-action-result.js";
|
|
29
|
-
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";
|
|
30
29
|
import { chunksToReadableStream, createProgressiveRscStream, getVinextBrowserGlobal } from "./app-browser-stream.js";
|
|
31
|
-
import { FRESH_APP_NAVIGATION_PAYLOAD_ORIGIN, VISITED_CACHE_APP_NAVIGATION_PAYLOAD_ORIGIN, isCacheRestorableAppPayloadMetadata,
|
|
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";
|
|
32
31
|
import { clearHardNavigationLoopGuard, createAppBrowserNavigationController, createBasePathStrippedPathAndSearch } from "./app-browser-navigation-controller.js";
|
|
33
|
-
import { applyServerActionResultDecision } from "./app-browser-server-action-navigation.js";
|
|
34
32
|
import { consumeInitialFormState, createVinextHydrateRootOptions, hydrateRootInTransition } from "./app-browser-hydration.js";
|
|
35
33
|
import { AppBrowserHistoryController } from "./app-browser-history-controller.js";
|
|
36
34
|
import { createVisitedResponseCacheEntry, isVisitedResponseCacheEntryFresh } from "./app-visited-response-cache.js";
|
|
37
35
|
import { createPopstateRestoreHandler, restoreSynchronousPopstateScrollPosition } from "./app-browser-popstate.js";
|
|
38
36
|
import { createDevOnCaughtError, createOnUncaughtError, createProdOnCaughtError, prodOnRecoverableError } from "./app-browser-error.js";
|
|
39
|
-
import {
|
|
40
|
-
import { devOnCaughtError, installDevErrorOverlay, installViteHmrErrorHandler, reportInitialDevServerErrors } from "./dev-error-overlay.js";
|
|
41
|
-
import { throwOnServerActionNotFound } from "./server-action-not-found.js";
|
|
37
|
+
import { createHydrationCachePublication } from "./app-hydration-cache-publication.js";
|
|
42
38
|
import { createOptimisticRouteTemplate, getOptimisticPrefetchSourceKey, getOptimisticRouteTemplateKey, resolveOptimisticNavigationPayload } from "./app-optimistic-routing.js";
|
|
43
39
|
import { removeStylesheetLinksCoveredByInlineCss } from "./app-inline-css-client.js";
|
|
44
40
|
import { createElement, startTransition, use, useEffect, useLayoutEffect, useMemo, useRef, useState } from "react";
|
|
45
41
|
import { flushSync } from "react-dom";
|
|
46
|
-
import { createFromFetch, createFromReadableStream, createTemporaryReferenceSet, encodeReply, setServerCallback } from "@vitejs/plugin-rsc/browser";
|
|
47
42
|
import { createRoot, hydrateRoot } from "react-dom/client";
|
|
43
|
+
import { createFromFetch, createFromReadableStream, setServerCallback } from "@vitejs/plugin-rsc/browser";
|
|
44
|
+
import { hasServerActions, loadServerActionClient } from "virtual:vinext-app-capabilities";
|
|
48
45
|
//#region src/server/app-browser-entry.ts
|
|
49
46
|
function toActionType(kind) {
|
|
50
47
|
return kind === "traverse" ? "traverse" : "navigate";
|
|
@@ -94,10 +91,14 @@ const browserNavigationController = createAppBrowserNavigationController({
|
|
|
94
91
|
getRouteManifest: getBrowserRouteManifest,
|
|
95
92
|
syncHistoryStatePreviousNextUrl: (previousNextUrl, bfcacheIds) => historyController.syncCurrentHistoryStatePreviousNextUrl(previousNextUrl, bfcacheIds)
|
|
96
93
|
});
|
|
97
|
-
const discardedServerActionRefreshScheduler = createDiscardedServerActionRefreshScheduler({ runRefresh() {
|
|
94
|
+
const discardedServerActionRefreshScheduler = hasServerActions ? createDiscardedServerActionRefreshScheduler({ runRefresh() {
|
|
98
95
|
clearClientNavigationCaches();
|
|
99
96
|
getNavigationRuntime()?.functions.navigate?.(window.location.href, 0, "refresh", void 0, void 0, true);
|
|
100
|
-
} })
|
|
97
|
+
} }) : {
|
|
98
|
+
markNavigationSettled() {},
|
|
99
|
+
markNavigationStart() {},
|
|
100
|
+
schedule() {}
|
|
101
|
+
};
|
|
101
102
|
const NavigationCommitSignal = browserNavigationController.NavigationCommitSignal;
|
|
102
103
|
const ACTION_HTTP_FALLBACK_ROBOTS_META_ATTR = "data-vinext-action-http-fallback";
|
|
103
104
|
function syncServerActionHttpFallbackHead(status) {
|
|
@@ -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,55 +305,11 @@ 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
|
-
function resolveActionRedirectTarget(response) {
|
|
307
|
-
const actionRedirect = response.headers.get(ACTION_REDIRECT_HEADER);
|
|
308
|
-
if (!actionRedirect) return null;
|
|
309
|
-
if (isDangerousScheme(actionRedirect)) {
|
|
310
|
-
console.error(DANGEROUS_URL_BLOCK_MESSAGE);
|
|
311
|
-
return null;
|
|
312
|
-
}
|
|
313
|
-
try {
|
|
314
|
-
let redirectUrl;
|
|
315
|
-
if (actionRedirect.startsWith("/") || /^[a-z]+:/i.test(actionRedirect)) redirectUrl = new URL(actionRedirect, window.location.href);
|
|
316
|
-
else {
|
|
317
|
-
const baseParsed = new URL(window.location.href);
|
|
318
|
-
let baseDir = baseParsed.pathname;
|
|
319
|
-
if (!baseDir.endsWith("/")) baseDir = baseDir + "/";
|
|
320
|
-
redirectUrl = new URL(actionRedirect, `${baseParsed.origin}${baseDir}${baseParsed.search}`);
|
|
321
|
-
}
|
|
322
|
-
if (redirectUrl.origin !== window.location.origin) {
|
|
323
|
-
browserNavigationController.performHardNavigation(actionRedirect);
|
|
324
|
-
return null;
|
|
325
|
-
}
|
|
326
|
-
const statusHeader = response.headers.get(ACTION_REDIRECT_STATUS_HEADER);
|
|
327
|
-
const status = statusHeader ? parseInt(statusHeader, 10) : 307;
|
|
328
|
-
return {
|
|
329
|
-
href: redirectUrl.href,
|
|
330
|
-
type: response.headers.get("x-action-redirect-type") ?? "push",
|
|
331
|
-
status
|
|
332
|
-
};
|
|
333
|
-
} catch {
|
|
334
|
-
browserNavigationController.performHardNavigation(actionRedirect);
|
|
335
|
-
return null;
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
var ServerActionRedirectError = class extends Error {
|
|
339
|
-
digest;
|
|
340
|
-
handled = true;
|
|
341
|
-
constructor(target) {
|
|
342
|
-
super("NEXT_REDIRECT");
|
|
343
|
-
const redirectUrl = new URL(target.href, window.location.href);
|
|
344
|
-
const redirectHref = redirectUrl.pathname + redirectUrl.search + redirectUrl.hash;
|
|
345
|
-
const redirectType = target.type === "push" ? "push" : "replace";
|
|
346
|
-
this.digest = `NEXT_REDIRECT;${redirectType};${encodeURIComponent(redirectHref)};${target.status};`;
|
|
347
|
-
}
|
|
348
|
-
};
|
|
349
|
-
function createServerActionRedirectError(target) {
|
|
350
|
-
return new ServerActionRedirectError(target);
|
|
351
|
-
}
|
|
352
313
|
async function commitSameUrlNavigatePayload(nextElements, actionInitiation, returnValue, revalidation = "none") {
|
|
353
314
|
const navigationSnapshot = createClientNavigationRenderSnapshot(actionInitiation.href, actionInitiation.routerState.navigationSnapshot.params);
|
|
354
315
|
return browserNavigationController.commitSameUrlNavigatePayload(nextElements, navigationSnapshot, returnValue, actionInitiation.routerState, {
|
|
@@ -387,7 +348,7 @@ function readVisitedResponseCacheCandidate(rscUrl, interceptionContext, mountedS
|
|
|
387
348
|
navigationKind,
|
|
388
349
|
now: Date.now()
|
|
389
350
|
}),
|
|
390
|
-
mountedSlotsMatch:
|
|
351
|
+
mountedSlotsMatch: cached.mountedSlotsHeader === mountedSlotsHeader,
|
|
391
352
|
navigationKind
|
|
392
353
|
}
|
|
393
354
|
};
|
|
@@ -405,20 +366,32 @@ function applyVisitedResponseCacheCandidateDecision(candidate, decision) {
|
|
|
405
366
|
function deleteVisitedResponse(rscUrl, interceptionContext) {
|
|
406
367
|
visitedResponseCache.delete(AppElementsWire.encodeCacheKey(rscUrl, interceptionContext));
|
|
407
368
|
}
|
|
408
|
-
function storeVisitedResponseSnapshot(rscUrl, interceptionContext, snapshot, params) {
|
|
369
|
+
function storeVisitedResponseSnapshot(rscUrl, interceptionContext, snapshot, params, prefetchFallbackTtlMs = DYNAMIC_NAVIGATION_CACHE_TTL, requestMountedSlotsHeader = snapshot.mountedSlotsHeader ?? null, elements) {
|
|
409
370
|
const cacheKey = AppElementsWire.encodeCacheKey(rscUrl, interceptionContext);
|
|
410
371
|
visitedResponseCache.delete(cacheKey);
|
|
411
372
|
evictVisitedResponseCacheIfNeeded();
|
|
412
|
-
const
|
|
413
|
-
|
|
414
|
-
|
|
373
|
+
const entry = createVisitedResponseCacheEntry({
|
|
374
|
+
fallbackTtlMs: prefetchFallbackTtlMs,
|
|
375
|
+
elements,
|
|
376
|
+
now: Date.now(),
|
|
377
|
+
mountedSlotsHeader: requestMountedSlotsHeader,
|
|
415
378
|
params,
|
|
416
379
|
response: snapshot
|
|
417
|
-
})
|
|
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
|
+
};
|
|
418
387
|
}
|
|
419
388
|
function clientNavigationSnapshotHref(snapshot) {
|
|
420
389
|
return `${window.location.origin}${createSnapshotPathAndSearch(snapshot)}`;
|
|
421
390
|
}
|
|
391
|
+
function getCurrentMatchedRoutePathname() {
|
|
392
|
+
const routeKey = AppElementsWire.parseElementKey(getBrowserRouterState().routeId);
|
|
393
|
+
return routeKey?.kind === "route" ? routeKey.path : null;
|
|
394
|
+
}
|
|
422
395
|
function getRequestState(navigationKind, targetPathname, previousNextUrlOverride, traverseHistoryState) {
|
|
423
396
|
if (previousNextUrlOverride !== void 0) return {
|
|
424
397
|
interceptionContext: resolveInterceptionContextFromPreviousNextUrl(previousNextUrlOverride, __basePath),
|
|
@@ -443,6 +416,7 @@ function getRequestState(navigationKind, targetPathname, previousNextUrlOverride
|
|
|
443
416
|
};
|
|
444
417
|
const middlewareRewriteInterceptionContext = resolveMiddlewareRewriteNavigationInterceptionContext({
|
|
445
418
|
basePath: __basePath,
|
|
419
|
+
currentMatchedPathname: getCurrentMatchedRoutePathname(),
|
|
446
420
|
currentPathname: window.location.pathname,
|
|
447
421
|
routeManifest: getBrowserRouteManifest(),
|
|
448
422
|
targetPathname
|
|
@@ -508,7 +482,7 @@ function AppRouterRedirectBridge({ children }) {
|
|
|
508
482
|
function decodeAppElementsPromise(payload) {
|
|
509
483
|
return Promise.resolve(payload).then((elements) => AppElementsWire.decode(elements));
|
|
510
484
|
}
|
|
511
|
-
function BrowserRoot({ initialElements, initialNavigationSnapshot }) {
|
|
485
|
+
function BrowserRoot({ hydrationCachePublication, initialElements, initialNavigationSnapshot }) {
|
|
512
486
|
const resolvedElements = use(initialElements);
|
|
513
487
|
const initialMetadata = AppElementsWire.readMetadata(resolvedElements);
|
|
514
488
|
const [treeStateValue, setTreeStateValue] = useState(() => ({
|
|
@@ -548,19 +522,22 @@ function BrowserRoot({ initialElements, initialNavigationSnapshot }) {
|
|
|
548
522
|
return new Promise(() => {});
|
|
549
523
|
} });
|
|
550
524
|
browserRouterStateHasEverCommitted = true;
|
|
525
|
+
hydrationCachePublication.commit();
|
|
551
526
|
return () => {
|
|
527
|
+
hydrationCachePublication.invalidate();
|
|
552
528
|
registerNavigationRuntimeFunctions({ navigateExternal: void 0 });
|
|
553
529
|
detach();
|
|
554
530
|
setMountedSlotsHeader(null);
|
|
555
531
|
};
|
|
556
|
-
}, [setTreeStateValue]);
|
|
532
|
+
}, [hydrationCachePublication, setTreeStateValue]);
|
|
557
533
|
useEffect(() => {
|
|
534
|
+
hydrationCachePublication.complete();
|
|
558
535
|
const hydratedAt = performance.now();
|
|
559
536
|
window.__VINEXT_HYDRATED_AT = hydratedAt;
|
|
560
537
|
window.__NEXT_HYDRATED = true;
|
|
561
538
|
window.__NEXT_HYDRATED_AT = hydratedAt;
|
|
562
539
|
window.__NEXT_HYDRATED_CB?.();
|
|
563
|
-
}, []);
|
|
540
|
+
}, [hydrationCachePublication]);
|
|
564
541
|
useLayoutEffect(() => {
|
|
565
542
|
historyController.rememberHistoryStateSnapshot(treeState);
|
|
566
543
|
}, [treeState]);
|
|
@@ -709,120 +686,105 @@ function applyRuntimeRscBootstrap(rsc) {
|
|
|
709
686
|
if (rsc.nav) restoreHydrationNavigationContext(rsc.nav.pathname, rsc.nav.searchParams, params);
|
|
710
687
|
}
|
|
711
688
|
function registerServerActionCallback() {
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
const temporaryReferences = createTemporaryReferenceSet();
|
|
689
|
+
setServerCallback((id, args) => {
|
|
690
|
+
const releaseCacheInvalidationGuard = historyController.beginCacheInvalidationGuard();
|
|
715
691
|
const actionInitiation = createActionInitiationSnapshot();
|
|
716
|
-
|
|
717
|
-
const body = await encodeReply(args, { temporaryReferences });
|
|
718
|
-
const { headers } = resolveServerActionRequestState({
|
|
719
|
-
actionId: id,
|
|
692
|
+
return loadServerActionClient().then(({ invokeClientServerAction }) => invokeClientServerAction(id, args, actionInitiation, {
|
|
720
693
|
basePath: __basePath,
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
if (hasActionRedirect && !actionRedirectTarget) return;
|
|
733
|
-
const actionResultFacts = createServerActionResultFacts({
|
|
734
|
-
actionRedirectHref: actionRedirectTarget?.href ?? null,
|
|
735
|
-
actionRedirectType: actionRedirectTarget?.type ?? null,
|
|
736
|
-
clientCompatibilityId: CLIENT_RSC_COMPATIBILITY_ID,
|
|
737
|
-
compatibilityIdHeader: fetchResponse.headers.get(VINEXT_RSC_COMPATIBILITY_ID_HEADER),
|
|
738
|
-
contentTypeHeader: fetchResponse.headers.get("content-type"),
|
|
739
|
-
currentHref: actionInitiation.href,
|
|
740
|
-
origin: window.location.origin,
|
|
741
|
-
responseUrl: fetchResponse.url
|
|
742
|
-
});
|
|
743
|
-
const fetchResponseIsRsc = actionResultFacts.isRscContentType;
|
|
744
|
-
if (applyServerActionResultDecision(navigationPlanner.classifyServerActionResult(actionResultFacts), clearClientNavigationCaches, (url, historyMode) => browserNavigationController.performHardNavigation(url, historyMode))) return;
|
|
745
|
-
const revalidation = parseServerActionRevalidationHeader(fetchResponse.headers);
|
|
746
|
-
if (revalidation !== "none") clearClientNavigationCaches();
|
|
747
|
-
const invalidResponseError = await readInvalidServerActionResponseError(fetchResponse.clone(), actionRedirectTarget !== null);
|
|
748
|
-
if (invalidResponseError) throw invalidResponseError;
|
|
749
|
-
if (actionRedirectTarget && !fetchResponseIsRsc) {
|
|
750
|
-
browserNavigationController.performHardNavigation(actionRedirectTarget.href);
|
|
751
|
-
return;
|
|
752
|
-
}
|
|
753
|
-
const flightResponse = fetchResponse.status === 303 ? new Response(fetchResponse.body, {
|
|
754
|
-
headers: fetchResponse.headers,
|
|
755
|
-
status: 200,
|
|
756
|
-
statusText: "OK"
|
|
757
|
-
}) : fetchResponse;
|
|
758
|
-
const result = await createFromFetch(Promise.resolve(flightResponse), { temporaryReferences });
|
|
759
|
-
if (revalidation === "none" && shouldClearClientNavigationCachesForServerActionResult(result, revalidation)) clearClientNavigationCaches();
|
|
760
|
-
if (actionRedirectTarget) {
|
|
761
|
-
if (isServerActionResult(result) && result.root !== void 0) {
|
|
762
|
-
const decoded = AppElementsWire.decode(result.root);
|
|
763
|
-
const hashIdx = actionRedirectTarget.href.indexOf("#");
|
|
764
|
-
const actionScrollIntent = beginAppRouterScrollIntent((hashIdx !== -1 ? actionRedirectTarget.href.slice(hashIdx) : "") || null);
|
|
765
|
-
if (actionRedirectTarget.type === "push") saveScrollPosition();
|
|
766
|
-
renderNavigationPayload(Promise.resolve(decoded), createClientNavigationRenderSnapshot(actionRedirectTarget.href, actionInitiation.routerState.navigationSnapshot.params), actionRedirectTarget.href, actionInitiation.navigationId, actionRedirectTarget.type === "push" ? "push" : "replace", {}, null, null, FRESH_APP_NAVIGATION_PAYLOAD_ORIGIN, actionRedirectTarget.type === "push" ? "navigate" : "replace", "server-action", null, actionScrollIntent).catch(() => {
|
|
767
|
-
browserNavigationController.performHardNavigation(actionRedirectTarget.href);
|
|
694
|
+
clearClientNavigationCaches,
|
|
695
|
+
clientRscCompatibilityId: CLIENT_RSC_COMPATIBILITY_ID,
|
|
696
|
+
commitSameUrlNavigatePayload,
|
|
697
|
+
navigationPlanner,
|
|
698
|
+
performHardNavigation: (url, historyMode) => browserNavigationController.performHardNavigation(url, historyMode),
|
|
699
|
+
renderRedirectPayload(elements, target, actionInitiation, revalidation) {
|
|
700
|
+
const hashIdx = target.href.indexOf("#");
|
|
701
|
+
const actionScrollIntent = beginAppRouterScrollIntent((hashIdx !== -1 ? target.href.slice(hashIdx) : "") || null);
|
|
702
|
+
if (target.type === "push") saveScrollPosition();
|
|
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(() => {
|
|
704
|
+
browserNavigationController.performHardNavigation(target.href);
|
|
768
705
|
});
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
}
|
|
774
|
-
syncServerActionHttpFallbackHead(isServerActionResult(result) && result.root !== void 0 ? null : fetchResponse.status);
|
|
775
|
-
if (isServerActionResult(result)) {
|
|
776
|
-
if (result.root !== void 0) {
|
|
777
|
-
const returnValue = result.returnValue && !result.returnValue.ok ? {
|
|
778
|
-
ok: false,
|
|
779
|
-
data: normalizeServerActionThrownValue(result.returnValue.data, fetchResponse.status)
|
|
780
|
-
} : result.returnValue;
|
|
781
|
-
return commitSameUrlNavigatePayload(Promise.resolve(AppElementsWire.decode(result.root)), actionInitiation, returnValue, revalidation);
|
|
782
|
-
}
|
|
783
|
-
if (result.returnValue) {
|
|
784
|
-
if (!result.returnValue.ok) throw normalizeServerActionThrownValue(result.returnValue.data, fetchResponse.status);
|
|
785
|
-
return result.returnValue.data;
|
|
786
|
-
}
|
|
787
|
-
return;
|
|
788
|
-
}
|
|
789
|
-
return commitSameUrlNavigatePayload(Promise.resolve(AppElementsWire.decode(result)), actionInitiation, void 0, revalidation);
|
|
790
|
-
};
|
|
791
|
-
setServerCallback((id, args) => {
|
|
792
|
-
const releaseCacheInvalidationGuard = historyController.beginCacheInvalidationGuard();
|
|
793
|
-
return Promise.resolve().then(() => serverActionCallback(id, args)).finally(releaseCacheInvalidationGuard);
|
|
706
|
+
},
|
|
707
|
+
syncCurrentHistoryState: (previousNextUrl, bfcacheIds) => historyController.syncCurrentHistoryStatePreviousNextUrl(previousNextUrl, bfcacheIds),
|
|
708
|
+
syncServerActionHttpFallbackHead
|
|
709
|
+
})).finally(releaseCacheInvalidationGuard);
|
|
794
710
|
});
|
|
795
711
|
}
|
|
796
712
|
async function main() {
|
|
797
713
|
if (!claimInitialAppRouterBootstrap()) return;
|
|
798
|
-
registerServerActionCallback();
|
|
714
|
+
if (hasServerActions) registerServerActionCallback();
|
|
799
715
|
installAppNavigationFailureListeners();
|
|
716
|
+
let devErrorOverlay = null;
|
|
800
717
|
if (import.meta.env.DEV) {
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
718
|
+
devErrorOverlay = await import("../client/dev-error-overlay.js");
|
|
719
|
+
devErrorOverlay.installDevErrorOverlay();
|
|
720
|
+
devErrorOverlay.installViteHmrErrorHandler(import.meta.hot);
|
|
721
|
+
devErrorOverlay.reportInitialDevServerErrors();
|
|
804
722
|
}
|
|
723
|
+
const initialRscBootstrap = getNavigationRuntime()?.bootstrap.rsc;
|
|
805
724
|
const rscStream = await readInitialRscStream();
|
|
806
725
|
if (rscStream === null) return;
|
|
807
|
-
bootstrapHydration(rscStream);
|
|
726
|
+
bootstrapHydration(rscStream, devErrorOverlay, initialRscBootstrap);
|
|
808
727
|
}
|
|
809
|
-
function bootstrapHydration(rscStream) {
|
|
810
|
-
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));
|
|
811
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(() => {});
|
|
812
761
|
historyController.writeBootstrapHistoryMetadata();
|
|
813
|
-
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
|
+
});
|
|
814
775
|
const formState = consumeInitialFormState(getVinextBrowserGlobal());
|
|
815
|
-
const hydrateRootOptions = import.meta.env.DEV ? createVinextHydrateRootOptions({
|
|
776
|
+
const hydrateRootOptions = import.meta.env.DEV && devErrorOverlay ? createVinextHydrateRootOptions({
|
|
816
777
|
formState,
|
|
817
|
-
onCaughtError: createDevOnCaughtError(devOnCaughtError, onUncaughtError),
|
|
778
|
+
onCaughtError: invalidateOnCaughtError(createDevOnCaughtError(devErrorOverlay.devOnCaughtError, onUncaughtError)),
|
|
818
779
|
onUncaughtError
|
|
819
780
|
}) : createVinextHydrateRootOptions({
|
|
820
781
|
formState,
|
|
821
|
-
onCaughtError: createProdOnCaughtError(onUncaughtError),
|
|
822
|
-
onRecoverableError
|
|
782
|
+
onCaughtError: invalidateOnCaughtError(createProdOnCaughtError(onUncaughtError)),
|
|
783
|
+
onRecoverableError,
|
|
823
784
|
onUncaughtError
|
|
824
785
|
});
|
|
825
786
|
const children = createElement(BrowserRoot, {
|
|
787
|
+
hydrationCachePublication,
|
|
826
788
|
initialElements: root,
|
|
827
789
|
initialNavigationSnapshot
|
|
828
790
|
});
|
|
@@ -844,15 +806,20 @@ function bootstrapHydration(rscStream) {
|
|
|
844
806
|
});
|
|
845
807
|
markInitialAppRouterBootstrapHydrated();
|
|
846
808
|
let activeNavigationAbortController = null;
|
|
809
|
+
function abortSupersededNavigation() {
|
|
810
|
+
activeNavigationAbortController?.abort();
|
|
811
|
+
activeNavigationAbortController = null;
|
|
812
|
+
}
|
|
847
813
|
registerNavigationRuntimeFunctions({
|
|
848
814
|
clearNavigationCaches: clearClientNavigationCaches,
|
|
849
815
|
commitHashNavigation: (href, historyUpdateMode, scroll) => historyController.commitHashOnlyNavigation(href, historyUpdateMode, scroll),
|
|
850
816
|
navigate: async function navigateRsc(href, redirectDepth = 0, navigationKind = "navigate", historyUpdateMode, previousNextUrlOverride, programmaticTransition = false, traversalIntent, scrollIntent, visibleCommitMode = "transition") {
|
|
851
|
-
|
|
817
|
+
abortSupersededNavigation();
|
|
852
818
|
const navigationAbortController = new AbortController();
|
|
853
819
|
activeNavigationAbortController = navigationAbortController;
|
|
854
820
|
let pendingRouterState = null;
|
|
855
821
|
const navId = browserNavigationController.beginNavigation();
|
|
822
|
+
const navigationCacheGeneration = clientNavigationCacheGeneration;
|
|
856
823
|
discardedServerActionRefreshScheduler.markNavigationStart();
|
|
857
824
|
let currentHref = href;
|
|
858
825
|
let currentHistoryMode = historyUpdateMode;
|
|
@@ -960,9 +927,10 @@ function bootstrapHydration(rscStream) {
|
|
|
960
927
|
if (!browserNavigationController.isCurrentNavigation(navId)) return;
|
|
961
928
|
const cachedParams = cachedRoute.params;
|
|
962
929
|
const cachedNavigationSnapshot = createClientNavigationRenderSnapshot(currentHref, cachedParams);
|
|
963
|
-
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))));
|
|
964
931
|
if (!browserNavigationController.isCurrentNavigation(navId)) return;
|
|
965
|
-
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;
|
|
966
934
|
deleteVisitedResponse(rscUrl, requestInterceptionContext);
|
|
967
935
|
continue;
|
|
968
936
|
}
|
|
@@ -1014,7 +982,7 @@ function bootstrapHydration(rscStream) {
|
|
|
1014
982
|
if (optimisticPayload !== null) {
|
|
1015
983
|
detachedNavigationCommits = true;
|
|
1016
984
|
const optimisticNavigationSnapshot = createClientNavigationRenderSnapshot(currentHref, optimisticPayload.params);
|
|
1017
|
-
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) => {
|
|
1018
986
|
if (browserNavigationController.isCurrentNavigation(navId)) console.error("[vinext] Optimistic RSC navigation error:", error);
|
|
1019
987
|
});
|
|
1020
988
|
}
|
|
@@ -1080,21 +1048,47 @@ function bootstrapHydration(rscStream) {
|
|
|
1080
1048
|
if (!browserNavigationController.isCurrentNavigation(navId)) return;
|
|
1081
1049
|
const rscPayload = decodeAppElementsPromise(createFromFetch(Promise.resolve(reactResponse)));
|
|
1082
1050
|
if (!browserNavigationController.isCurrentNavigation(navId)) return;
|
|
1083
|
-
|
|
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;
|
|
1084
1056
|
if (!browserNavigationController.isCurrentNavigation(navId)) return;
|
|
1085
1057
|
try {
|
|
1086
1058
|
const renderedElements = await rscPayload;
|
|
1059
|
+
if (navigationCacheGeneration !== clientNavigationCacheGeneration) return;
|
|
1087
1060
|
const metadata = AppElementsWire.readMetadata(renderedElements);
|
|
1088
|
-
if (!isCacheRestorableAppPayloadMetadata(metadata)) {
|
|
1089
|
-
cacheBufferPromise.catch(() => {});
|
|
1090
|
-
return;
|
|
1091
|
-
}
|
|
1092
1061
|
const cacheBuffer = await cacheBufferPromise;
|
|
1093
|
-
|
|
1094
|
-
|
|
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
|
+
},
|
|
1095
1070
|
...navResponseExpiresAt !== void 0 ? { expiresAt: navResponseExpiresAt } : {},
|
|
1096
1071
|
mountedSlotsHeader: getMountedSlotIdsHeader(renderedElements)
|
|
1097
|
-
}
|
|
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
|
+
}
|
|
1098
1092
|
} catch {}
|
|
1099
1093
|
return;
|
|
1100
1094
|
}
|
|
@@ -1131,17 +1125,27 @@ function bootstrapHydration(rscStream) {
|
|
|
1131
1125
|
restorePopstateScrollPosition(event.state);
|
|
1132
1126
|
return;
|
|
1133
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);
|
|
1134
1146
|
handlePopstate(event);
|
|
1135
|
-
if (restoreHistoryStateSnapshot(event.state)) restoreSynchronousPopstateScrollPosition({
|
|
1136
|
-
getActiveNavigationId: () => browserNavigationController.getActiveNavigationId(),
|
|
1137
|
-
isCurrentNavigation: (navId) => browserNavigationController.isCurrentNavigation(navId),
|
|
1138
|
-
markScrollRestoreConsumed: (navId) => {
|
|
1139
|
-
synchronousPopstateScrollRestoreNavigationId = navId;
|
|
1140
|
-
},
|
|
1141
|
-
restorePopstateScrollPosition
|
|
1142
|
-
}, event.state);
|
|
1143
1147
|
});
|
|
1144
|
-
if (import.meta.hot) {
|
|
1148
|
+
if (import.meta.env.DEV && import.meta.hot) {
|
|
1145
1149
|
const applyRscHmrUpdate = async (updateId) => {
|
|
1146
1150
|
if (updateId !== latestRscHmrUpdateId) return;
|
|
1147
1151
|
if (document.documentElement.id === "__next_error__") {
|
|
@@ -1157,8 +1161,8 @@ function bootstrapHydration(rscStream) {
|
|
|
1157
1161
|
if (!browserNavigationController.hasBrowserRouterState()) return;
|
|
1158
1162
|
clearClientNavigationCaches();
|
|
1159
1163
|
const navigationSnapshot = createClientNavigationRenderSnapshot(window.location.href, latestClientParams);
|
|
1160
|
-
dismissOverlay();
|
|
1161
|
-
const hmrHeaders = createRscRequestHeaders();
|
|
1164
|
+
devErrorOverlay?.dismissOverlay();
|
|
1165
|
+
const hmrHeaders = createRscRequestHeaders({ mountedSlotsHeader: getMountedSlotIdsHeader(browserNavigationController.getBrowserRouterState().elements) });
|
|
1162
1166
|
await browserNavigationController.hmrReplaceTree(decodeAppElementsPromise(createFromFetch(fetch(await createRscRequestUrl(window.location.pathname + window.location.search, hmrHeaders), { headers: hmrHeaders }))), navigationSnapshot);
|
|
1163
1167
|
};
|
|
1164
1168
|
const handleRscUpdate = async (updateId) => {
|
|
@@ -45,6 +45,7 @@ type CommitNavigationHistoryOptions = {
|
|
|
45
45
|
targetHistoryIndex?: number | null;
|
|
46
46
|
stageClientParams: () => void;
|
|
47
47
|
};
|
|
48
|
+
declare function createCanonicalBrowserHistoryHref(href: string): string;
|
|
48
49
|
/**
|
|
49
50
|
* Owns App Router browser-history metadata and traversal bookkeeping behind a
|
|
50
51
|
* typed seam: traversal index allocation/commit, push/replace/traverse/hash-only
|
|
@@ -101,4 +102,4 @@ declare class AppBrowserHistoryController {
|
|
|
101
102
|
restoreHistorySnapshot(options: RestoreHistorySnapshotOptions): boolean;
|
|
102
103
|
}
|
|
103
104
|
//#endregion
|
|
104
|
-
export { AppBrowserHistoryController, RestorableSnapshotCandidate };
|
|
105
|
+
export { AppBrowserHistoryController, RestorableSnapshotCandidate, createCanonicalBrowserHistoryHref };
|