vinext 0.0.46 → 0.0.48
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 +8 -6
- package/dist/build/layout-classification.js +3 -1
- package/dist/build/layout-classification.js.map +1 -1
- package/dist/build/prerender.d.ts +2 -1
- package/dist/build/prerender.js +80 -24
- package/dist/build/prerender.js.map +1 -1
- package/dist/build/report.d.ts +9 -5
- package/dist/build/report.js +17 -7
- package/dist/build/report.js.map +1 -1
- package/dist/build/route-classification-injector.d.ts +35 -0
- package/dist/build/route-classification-injector.js +61 -0
- package/dist/build/route-classification-injector.js.map +1 -0
- package/dist/build/route-classification-manifest.d.ts +1 -1
- package/dist/build/run-prerender.d.ts +5 -0
- package/dist/build/run-prerender.js +4 -1
- package/dist/build/run-prerender.js.map +1 -1
- package/dist/build/server-manifest.js +2 -7
- package/dist/build/server-manifest.js.map +1 -1
- package/dist/build/standalone.js +3 -5
- package/dist/build/standalone.js.map +1 -1
- package/dist/build/static-export.d.ts +1 -1
- package/dist/check.js +45 -29
- package/dist/check.js.map +1 -1
- package/dist/cli-args.d.ts +33 -0
- package/dist/cli-args.js +121 -0
- package/dist/cli-args.js.map +1 -0
- package/dist/cli.js +11 -20
- package/dist/cli.js.map +1 -1
- package/dist/cloudflare/kv-cache-handler.js +29 -9
- package/dist/cloudflare/kv-cache-handler.js.map +1 -1
- package/dist/config/config-matchers.js +46 -37
- package/dist/config/config-matchers.js.map +1 -1
- package/dist/config/next-config.d.ts +4 -2
- package/dist/config/next-config.js +3 -0
- package/dist/config/next-config.js.map +1 -1
- package/dist/deploy.d.ts +18 -2
- package/dist/deploy.js +47 -4
- package/dist/deploy.js.map +1 -1
- package/dist/entries/app-rsc-entry.d.ts +4 -3
- package/dist/entries/app-rsc-entry.js +379 -858
- package/dist/entries/app-rsc-entry.js.map +1 -1
- package/dist/entries/app-rsc-manifest.d.ts +1 -1
- package/dist/entries/app-rsc-manifest.js +6 -1
- package/dist/entries/app-rsc-manifest.js.map +1 -1
- package/dist/entries/pages-client-entry.js +3 -2
- package/dist/entries/pages-client-entry.js.map +1 -1
- package/dist/entries/pages-server-entry.js +19 -61
- package/dist/entries/pages-server-entry.js.map +1 -1
- package/dist/entries/runtime-entry-module.d.ts +12 -3
- package/dist/entries/runtime-entry-module.js +15 -4
- package/dist/entries/runtime-entry-module.js.map +1 -1
- package/dist/index.js +40 -58
- package/dist/index.js.map +1 -1
- package/dist/plugins/fonts.js +54 -32
- package/dist/plugins/fonts.js.map +1 -1
- package/dist/plugins/og-assets.js +15 -16
- package/dist/plugins/og-assets.js.map +1 -1
- package/dist/plugins/rsc-client-shim-excludes.d.ts +2 -1
- package/dist/plugins/rsc-client-shim-excludes.js +11 -1
- package/dist/plugins/rsc-client-shim-excludes.js.map +1 -1
- package/dist/routing/app-route-graph.d.ts +195 -0
- package/dist/routing/app-route-graph.js +1022 -0
- package/dist/routing/app-route-graph.js.map +1 -0
- package/dist/routing/app-router.d.ts +14 -88
- package/dist/routing/app-router.js +21 -712
- package/dist/routing/app-router.js.map +1 -1
- package/dist/routing/file-matcher.d.ts +3 -1
- package/dist/routing/file-matcher.js +6 -1
- package/dist/routing/file-matcher.js.map +1 -1
- package/dist/routing/pages-router.js +10 -19
- package/dist/routing/pages-router.js.map +1 -1
- package/dist/routing/route-matching.d.ts +28 -0
- package/dist/routing/route-matching.js +44 -0
- package/dist/routing/route-matching.js.map +1 -0
- package/dist/routing/route-pattern.js +4 -1
- package/dist/routing/route-pattern.js.map +1 -1
- package/dist/routing/route-trie.d.ts +8 -0
- package/dist/routing/route-trie.js +12 -1
- package/dist/routing/route-trie.js.map +1 -1
- package/dist/routing/route-validation.js +3 -4
- package/dist/routing/route-validation.js.map +1 -1
- package/dist/routing/utils.d.ts +8 -1
- package/dist/routing/utils.js +25 -2
- package/dist/routing/utils.js.map +1 -1
- package/dist/server/app-browser-entry.js +145 -294
- package/dist/server/app-browser-entry.js.map +1 -1
- package/dist/server/app-browser-error.d.ts +3 -4
- package/dist/server/app-browser-error.js +8 -4
- package/dist/server/app-browser-error.js.map +1 -1
- package/dist/server/app-browser-navigation-controller.d.ts +75 -0
- package/dist/server/app-browser-navigation-controller.js +290 -0
- package/dist/server/app-browser-navigation-controller.js.map +1 -0
- package/dist/server/app-browser-state.d.ts +33 -15
- package/dist/server/app-browser-state.js +52 -59
- package/dist/server/app-browser-state.js.map +1 -1
- package/dist/server/app-browser-visible-commit.d.ts +68 -0
- package/dist/server/app-browser-visible-commit.js +182 -0
- package/dist/server/app-browser-visible-commit.js.map +1 -0
- package/dist/server/app-client-reference-preloader.d.ts +15 -0
- package/dist/server/app-client-reference-preloader.js +46 -0
- package/dist/server/app-client-reference-preloader.js.map +1 -0
- package/dist/server/app-elements-wire.d.ts +130 -0
- package/dist/server/app-elements-wire.js +205 -0
- package/dist/server/app-elements-wire.js.map +1 -0
- package/dist/server/app-elements.d.ts +2 -84
- package/dist/server/app-elements.js +4 -107
- package/dist/server/app-elements.js.map +1 -1
- package/dist/server/app-fallback-renderer.d.ts +57 -0
- package/dist/server/app-fallback-renderer.js +79 -0
- package/dist/server/app-fallback-renderer.js.map +1 -0
- package/dist/server/app-hook-warning-suppression.d.ts +7 -0
- package/dist/server/app-hook-warning-suppression.js +12 -0
- package/dist/server/app-hook-warning-suppression.js.map +1 -0
- package/dist/server/app-middleware.d.ts +2 -1
- package/dist/server/app-middleware.js +34 -11
- package/dist/server/app-middleware.js.map +1 -1
- package/dist/server/app-mounted-slots-header.d.ts +17 -0
- package/dist/server/app-mounted-slots-header.js +21 -0
- package/dist/server/app-mounted-slots-header.js.map +1 -0
- package/dist/server/app-page-boundary-render.d.ts +3 -3
- package/dist/server/app-page-boundary-render.js +8 -5
- package/dist/server/app-page-boundary-render.js.map +1 -1
- package/dist/server/app-page-boundary.js +2 -1
- package/dist/server/app-page-boundary.js.map +1 -1
- package/dist/server/app-page-cache.d.ts +19 -4
- package/dist/server/app-page-cache.js +60 -22
- package/dist/server/app-page-cache.js.map +1 -1
- package/dist/server/app-page-dispatch.d.ts +9 -5
- package/dist/server/app-page-dispatch.js +41 -17
- package/dist/server/app-page-dispatch.js.map +1 -1
- package/dist/server/app-page-element-builder.d.ts +61 -0
- package/dist/server/app-page-element-builder.js +142 -0
- package/dist/server/app-page-element-builder.js.map +1 -0
- package/dist/server/app-page-execution.d.ts +23 -5
- package/dist/server/app-page-execution.js +39 -24
- package/dist/server/app-page-execution.js.map +1 -1
- package/dist/server/app-page-head.js +2 -1
- package/dist/server/app-page-head.js.map +1 -1
- package/dist/server/app-page-method.js +2 -5
- package/dist/server/app-page-method.js.map +1 -1
- package/dist/server/app-page-params.d.ts +2 -1
- package/dist/server/app-page-params.js +3 -3
- package/dist/server/app-page-params.js.map +1 -1
- package/dist/server/app-page-probe.d.ts +1 -1
- package/dist/server/app-page-probe.js +5 -1
- package/dist/server/app-page-probe.js.map +1 -1
- package/dist/server/app-page-render.d.ts +6 -2
- package/dist/server/app-page-render.js +118 -30
- package/dist/server/app-page-render.js.map +1 -1
- package/dist/server/app-page-request.d.ts +19 -5
- package/dist/server/app-page-request.js +49 -7
- package/dist/server/app-page-request.js.map +1 -1
- package/dist/server/app-page-response.d.ts +1 -0
- package/dist/server/app-page-response.js +6 -9
- package/dist/server/app-page-response.js.map +1 -1
- package/dist/server/app-page-route-wiring.d.ts +20 -4
- package/dist/server/app-page-route-wiring.js +15 -12
- package/dist/server/app-page-route-wiring.js.map +1 -1
- package/dist/server/app-page-stream.d.ts +7 -0
- package/dist/server/app-page-stream.js +9 -2
- package/dist/server/app-page-stream.js.map +1 -1
- package/dist/server/app-post-middleware-context.d.ts +16 -0
- package/dist/server/app-post-middleware-context.js +28 -0
- package/dist/server/app-post-middleware-context.js.map +1 -0
- package/dist/server/app-prerender-endpoints.js +3 -2
- package/dist/server/app-prerender-endpoints.js.map +1 -1
- package/dist/server/app-request-context.d.ts +22 -0
- package/dist/server/app-request-context.js +30 -0
- package/dist/server/app-request-context.js.map +1 -0
- package/dist/server/app-route-handler-cache.d.ts +1 -0
- package/dist/server/app-route-handler-cache.js +7 -2
- package/dist/server/app-route-handler-cache.js.map +1 -1
- package/dist/server/app-route-handler-dispatch.d.ts +1 -0
- package/dist/server/app-route-handler-dispatch.js +8 -5
- package/dist/server/app-route-handler-dispatch.js.map +1 -1
- package/dist/server/app-route-handler-execution.d.ts +2 -1
- package/dist/server/app-route-handler-execution.js +2 -2
- package/dist/server/app-route-handler-execution.js.map +1 -1
- package/dist/server/app-route-handler-policy.js +13 -13
- package/dist/server/app-route-handler-policy.js.map +1 -1
- package/dist/server/app-route-handler-response.d.ts +4 -2
- package/dist/server/app-route-handler-response.js +9 -7
- package/dist/server/app-route-handler-response.js.map +1 -1
- package/dist/server/app-route-handler-runtime.d.ts +9 -1
- package/dist/server/app-route-handler-runtime.js +11 -1
- package/dist/server/app-route-handler-runtime.js.map +1 -1
- package/dist/server/app-router-entry.js +9 -4
- package/dist/server/app-router-entry.js.map +1 -1
- package/dist/server/app-rsc-cache-busting.d.ts +34 -0
- package/dist/server/app-rsc-cache-busting.js +137 -0
- package/dist/server/app-rsc-cache-busting.js.map +1 -0
- package/dist/server/app-rsc-error-handler.d.ts +21 -0
- package/dist/server/app-rsc-error-handler.js +30 -0
- package/dist/server/app-rsc-error-handler.js.map +1 -0
- package/dist/server/app-rsc-handler.d.ts +117 -0
- package/dist/server/app-rsc-handler.js +271 -0
- package/dist/server/app-rsc-handler.js.map +1 -0
- package/dist/server/app-rsc-request-normalization.d.ts +42 -0
- package/dist/server/app-rsc-request-normalization.js +67 -0
- package/dist/server/app-rsc-request-normalization.js.map +1 -0
- package/dist/server/app-rsc-response-finalizer.d.ts +30 -0
- package/dist/server/app-rsc-response-finalizer.js +38 -0
- package/dist/server/app-rsc-response-finalizer.js.map +1 -0
- package/dist/server/app-rsc-route-matching.js +8 -4
- package/dist/server/app-rsc-route-matching.js.map +1 -1
- package/dist/server/app-segment-config.d.ts +33 -0
- package/dist/server/app-segment-config.js +90 -0
- package/dist/server/app-segment-config.js.map +1 -0
- package/dist/server/app-server-action-execution.d.ts +2 -0
- package/dist/server/app-server-action-execution.js +45 -51
- package/dist/server/app-server-action-execution.js.map +1 -1
- package/dist/server/app-ssr-entry.js +21 -20
- package/dist/server/app-ssr-entry.js.map +1 -1
- package/dist/server/artifact-compatibility.d.ts +44 -0
- package/dist/server/artifact-compatibility.js +82 -0
- package/dist/server/artifact-compatibility.js.map +1 -0
- package/dist/server/cache-control.d.ts +24 -0
- package/dist/server/cache-control.js +33 -0
- package/dist/server/cache-control.js.map +1 -0
- package/dist/server/cache-proof.d.ts +200 -0
- package/dist/server/cache-proof.js +342 -0
- package/dist/server/cache-proof.js.map +1 -0
- package/dist/server/dev-error-overlay-store.d.ts +23 -0
- package/dist/server/dev-error-overlay-store.js +67 -0
- package/dist/server/dev-error-overlay-store.js.map +1 -0
- package/dist/server/dev-error-overlay.d.ts +15 -0
- package/dist/server/dev-error-overlay.js +548 -0
- package/dist/server/dev-error-overlay.js.map +1 -0
- package/dist/server/dev-origin-check.js +8 -4
- package/dist/server/dev-origin-check.js.map +1 -1
- package/dist/server/dev-server.js +1 -6
- package/dist/server/dev-server.js.map +1 -1
- package/dist/server/http-error-responses.d.ts +67 -0
- package/dist/server/http-error-responses.js +77 -0
- package/dist/server/http-error-responses.js.map +1 -0
- package/dist/server/image-optimization.js +2 -1
- package/dist/server/image-optimization.js.map +1 -1
- package/dist/server/instrumentation-runtime.d.ts +44 -0
- package/dist/server/instrumentation-runtime.js +29 -0
- package/dist/server/instrumentation-runtime.js.map +1 -0
- package/dist/server/isr-cache.d.ts +2 -7
- package/dist/server/isr-cache.js +7 -10
- package/dist/server/isr-cache.js.map +1 -1
- package/dist/server/metadata-route-response.js +6 -5
- package/dist/server/metadata-route-response.js.map +1 -1
- package/dist/server/metadata-routes.d.ts +1 -0
- package/dist/server/metadata-routes.js +6 -0
- package/dist/server/metadata-routes.js.map +1 -1
- package/dist/server/middleware-matcher.js +2 -2
- package/dist/server/middleware-matcher.js.map +1 -1
- package/dist/server/middleware-response-headers.js +21 -0
- package/dist/server/middleware-response-headers.js.map +1 -1
- package/dist/server/middleware-runtime.js +3 -3
- package/dist/server/middleware-runtime.js.map +1 -1
- package/dist/server/navigation-trace.d.ts +33 -0
- package/dist/server/navigation-trace.js +35 -0
- package/dist/server/navigation-trace.js.map +1 -0
- package/dist/server/next-error-digest.d.ts +44 -0
- package/dist/server/next-error-digest.js +40 -0
- package/dist/server/next-error-digest.js.map +1 -0
- package/dist/server/pages-api-route.js +2 -1
- package/dist/server/pages-api-route.js.map +1 -1
- package/dist/server/pages-node-compat.js +4 -16
- package/dist/server/pages-node-compat.js.map +1 -1
- package/dist/server/pages-page-data.d.ts +2 -1
- package/dist/server/pages-page-data.js +6 -5
- package/dist/server/pages-page-data.js.map +1 -1
- package/dist/server/pages-page-response.d.ts +3 -8
- package/dist/server/pages-page-response.js +46 -15
- package/dist/server/pages-page-response.js.map +1 -1
- package/dist/server/prod-server.d.ts +6 -0
- package/dist/server/prod-server.js +28 -21
- package/dist/server/prod-server.js.map +1 -1
- package/dist/server/request-pipeline.d.ts +42 -1
- package/dist/server/request-pipeline.js +97 -17
- package/dist/server/request-pipeline.js.map +1 -1
- package/dist/server/rsc-stream-hints.d.ts +3 -1
- package/dist/server/rsc-stream-hints.js +4 -1
- package/dist/server/rsc-stream-hints.js.map +1 -1
- package/dist/server/seed-cache.js +19 -8
- package/dist/server/seed-cache.js.map +1 -1
- package/dist/shims/cache-runtime.d.ts +2 -2
- package/dist/shims/cache-runtime.js +31 -17
- package/dist/shims/cache-runtime.js.map +1 -1
- package/dist/shims/cache.d.ts +15 -3
- package/dist/shims/cache.js +45 -20
- package/dist/shims/cache.js.map +1 -1
- package/dist/shims/error-boundary.d.ts +17 -1
- package/dist/shims/error-boundary.js +31 -1
- package/dist/shims/error-boundary.js.map +1 -1
- package/dist/shims/fetch-cache.d.ts +4 -1
- package/dist/shims/fetch-cache.js +57 -16
- package/dist/shims/fetch-cache.js.map +1 -1
- package/dist/shims/head-state.js +2 -3
- package/dist/shims/head-state.js.map +1 -1
- package/dist/shims/headers.js +4 -44
- package/dist/shims/headers.js.map +1 -1
- package/dist/shims/i18n-state.js +2 -3
- package/dist/shims/i18n-state.js.map +1 -1
- package/dist/shims/image.js +93 -5
- package/dist/shims/image.js.map +1 -1
- package/dist/shims/internal/als-registry.d.ts +15 -0
- package/dist/shims/internal/als-registry.js +55 -0
- package/dist/shims/internal/als-registry.js.map +1 -0
- package/dist/shims/internal/cookie-serialize.d.ts +46 -0
- package/dist/shims/internal/cookie-serialize.js +51 -0
- package/dist/shims/internal/cookie-serialize.js.map +1 -0
- package/dist/shims/link.js +31 -26
- package/dist/shims/link.js.map +1 -1
- package/dist/shims/metadata.d.ts +26 -1
- package/dist/shims/metadata.js +94 -4
- package/dist/shims/metadata.js.map +1 -1
- package/dist/shims/navigation-state.js +2 -3
- package/dist/shims/navigation-state.js.map +1 -1
- package/dist/shims/navigation.d.ts +2 -7
- package/dist/shims/navigation.js +44 -36
- package/dist/shims/navigation.js.map +1 -1
- package/dist/shims/request-context.js +2 -4
- package/dist/shims/request-context.js.map +1 -1
- package/dist/shims/request-state-types.d.ts +1 -1
- package/dist/shims/router-state.js +2 -3
- package/dist/shims/router-state.js.map +1 -1
- package/dist/shims/router.js +2 -2
- package/dist/shims/router.js.map +1 -1
- package/dist/shims/server.js +5 -30
- package/dist/shims/server.js.map +1 -1
- package/dist/shims/slot.d.ts +1 -1
- package/dist/shims/slot.js +5 -4
- package/dist/shims/slot.js.map +1 -1
- package/dist/shims/thenable-params.d.ts +5 -2
- package/dist/shims/thenable-params.js +26 -6
- package/dist/shims/thenable-params.js.map +1 -1
- package/dist/shims/unified-request-context.d.ts +1 -1
- package/dist/shims/unified-request-context.js +3 -14
- package/dist/shims/unified-request-context.js.map +1 -1
- package/dist/shims/use-merged-ref.d.ts +7 -0
- package/dist/shims/use-merged-ref.js +40 -0
- package/dist/shims/use-merged-ref.js.map +1 -0
- package/dist/utils/base-path.d.ts +7 -1
- package/dist/utils/base-path.js +12 -1
- package/dist/utils/base-path.js.map +1 -1
- package/dist/utils/cache-control-metadata.d.ts +6 -0
- package/dist/utils/cache-control-metadata.js +16 -0
- package/dist/utils/cache-control-metadata.js.map +1 -0
- package/dist/utils/safe-json-file.d.ts +18 -0
- package/dist/utils/safe-json-file.js +25 -0
- package/dist/utils/safe-json-file.js.map +1 -0
- package/dist/utils/text-stream.d.ts +29 -0
- package/dist/utils/text-stream.js +66 -0
- package/dist/utils/text-stream.js.map +1 -0
- package/package.json +5 -5
|
@@ -1,94 +1,69 @@
|
|
|
1
|
-
import { DANGEROUS_URL_BLOCK_MESSAGE, isDangerousScheme } from "../shims/url-safety.js";
|
|
2
1
|
import { stripBasePath } from "../utils/base-path.js";
|
|
2
|
+
import { DANGEROUS_URL_BLOCK_MESSAGE, isDangerousScheme } from "../shims/url-safety.js";
|
|
3
3
|
import { notifyAppRouterTransitionStart } from "../client/instrumentation-client-state.js";
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
4
|
+
import { AppElementsWire } from "./app-elements-wire.js";
|
|
5
|
+
import { getMountedSlotIdsHeader, resolveVisitedResponseInterceptionContext } from "./app-elements.js";
|
|
6
|
+
import { VINEXT_RSC_MOUNTED_SLOTS_HEADER, createRscRequestHeaders, createRscRequestUrl, stripRscCacheBustingSearchParam, stripRscSuffix } from "./app-rsc-cache-busting.js";
|
|
7
|
+
import { __basePath, commitClientNavigationState, consumePrefetchResponse, createClientNavigationRenderSnapshot, getClientNavigationRenderContext, getClientNavigationState, getCurrentInterceptionContext, getCurrentNextUrl, getPrefetchCache, getPrefetchedUrls, pushHistoryStateWithoutNotify, replaceClientParamsWithoutNotify, replaceHistoryStateWithoutNotify, restoreRscResponse, setClientParams, setMountedSlotsHeader, setNavigationContext, setPendingPathname, snapshotRscResponse } from "../shims/navigation.js";
|
|
8
|
+
import { DevRecoveryBoundary } from "../shims/error-boundary.js";
|
|
6
9
|
import { ElementsContext, Slot } from "../shims/slot.js";
|
|
7
10
|
import "../client/instrumentation-client.js";
|
|
8
11
|
import { chunksToReadableStream, createProgressiveRscStream, getVinextBrowserGlobal } from "./app-browser-stream.js";
|
|
9
|
-
import { createHistoryStateWithPreviousNextUrl,
|
|
10
|
-
import {
|
|
12
|
+
import { createHistoryStateWithPreviousNextUrl, readHistoryStatePreviousNextUrl, resolveInterceptionContextFromPreviousNextUrl, resolveServerActionRequestState } from "./app-browser-state.js";
|
|
13
|
+
import { createAppBrowserNavigationController } from "./app-browser-navigation-controller.js";
|
|
14
|
+
import { createOnUncaughtError } from "./app-browser-error.js";
|
|
15
|
+
import { dismissOverlay } from "./dev-error-overlay-store.js";
|
|
16
|
+
import { devOnCaughtError, devOnUncaughtError, installDevErrorOverlay } from "./dev-error-overlay.js";
|
|
11
17
|
import { getServerActionNotFoundClientMessage, isServerActionNotFoundResponse } from "./server-action-not-found.js";
|
|
12
|
-
import { createElement,
|
|
18
|
+
import { createElement, use, useLayoutEffect, useRef, useState } from "react";
|
|
13
19
|
import { createFromFetch, createFromReadableStream, createTemporaryReferenceSet, encodeReply, setServerCallback } from "@vitejs/plugin-rsc/browser";
|
|
14
20
|
import { hydrateRoot } from "react-dom/client";
|
|
15
21
|
//#region src/server/app-browser-entry.ts
|
|
16
22
|
function toActionType(kind) {
|
|
17
23
|
return kind === "traverse" ? "traverse" : "navigate";
|
|
18
24
|
}
|
|
25
|
+
function toOperationLane(kind) {
|
|
26
|
+
switch (kind) {
|
|
27
|
+
case "navigate": return "navigation";
|
|
28
|
+
case "refresh": return "refresh";
|
|
29
|
+
case "traverse": return "traverse";
|
|
30
|
+
default: throw new Error("[vinext] Unknown navigation kind: " + String(kind));
|
|
31
|
+
}
|
|
32
|
+
}
|
|
19
33
|
const MAX_VISITED_RESPONSE_CACHE_SIZE = 50;
|
|
20
34
|
const VISITED_RESPONSE_CACHE_TTL = 5 * 6e4;
|
|
21
35
|
const MAX_TRAVERSAL_CACHE_TTL = 30 * 6e4;
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
36
|
+
const browserNavigationController = createAppBrowserNavigationController();
|
|
37
|
+
const NavigationCommitSignal = browserNavigationController.NavigationCommitSignal;
|
|
38
|
+
function parseEncodedJsonHeader(value) {
|
|
39
|
+
if (!value) return null;
|
|
40
|
+
try {
|
|
41
|
+
return JSON.parse(decodeURIComponent(value));
|
|
42
|
+
} catch {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
26
46
|
function isRouterStatePromise(value) {
|
|
27
47
|
return value instanceof Promise;
|
|
28
48
|
}
|
|
29
|
-
let setBrowserRouterState = null;
|
|
30
|
-
let browserRouterStateRef = null;
|
|
31
|
-
let activePendingBrowserRouterState = null;
|
|
32
49
|
let latestClientParams = {};
|
|
33
50
|
const visitedResponseCache = /* @__PURE__ */ new Map();
|
|
34
|
-
let
|
|
35
|
-
let
|
|
36
|
-
let browserRouterStateHasCommitted = false;
|
|
51
|
+
let browserRouterStateHasEverCommitted = false;
|
|
52
|
+
let pendingNavigationRecoveryHref = null;
|
|
37
53
|
function isServerActionResult(value) {
|
|
38
54
|
return !!value && typeof value === "object" && "root" in value;
|
|
39
55
|
}
|
|
40
|
-
function getBrowserRouterStateSetter() {
|
|
41
|
-
if (!setBrowserRouterState) throw new Error("[vinext] Browser router state setter is not initialized");
|
|
42
|
-
return setBrowserRouterState;
|
|
43
|
-
}
|
|
44
56
|
function getBrowserRouterState() {
|
|
45
|
-
|
|
46
|
-
return browserRouterStateRef.current;
|
|
57
|
+
return browserNavigationController.getBrowserRouterState();
|
|
47
58
|
}
|
|
48
|
-
function
|
|
49
|
-
|
|
50
|
-
if (!browserRouterStateReadyPromise) browserRouterStateReadyPromise = new Promise((resolve) => {
|
|
51
|
-
resolveBrowserRouterStateReady = resolve;
|
|
52
|
-
});
|
|
53
|
-
return browserRouterStateReadyPromise;
|
|
59
|
+
function hasBrowserRouterState() {
|
|
60
|
+
return browserNavigationController.hasBrowserRouterState();
|
|
54
61
|
}
|
|
55
|
-
function
|
|
56
|
-
|
|
57
|
-
const resolveReady = resolveBrowserRouterStateReady;
|
|
58
|
-
resolveBrowserRouterStateReady = null;
|
|
59
|
-
browserRouterStateReadyPromise = null;
|
|
60
|
-
resolveReady?.();
|
|
62
|
+
function waitForBrowserRouterStateReady() {
|
|
63
|
+
return browserNavigationController.waitForBrowserRouterStateReady();
|
|
61
64
|
}
|
|
62
65
|
function beginPendingBrowserRouterState() {
|
|
63
|
-
|
|
64
|
-
if (activePendingBrowserRouterState && !activePendingBrowserRouterState.settled) {
|
|
65
|
-
activePendingBrowserRouterState.settled = true;
|
|
66
|
-
activePendingBrowserRouterState.resolve(getBrowserRouterState());
|
|
67
|
-
}
|
|
68
|
-
let resolve;
|
|
69
|
-
const promise = new Promise((resolvePromise) => {
|
|
70
|
-
resolve = resolvePromise;
|
|
71
|
-
});
|
|
72
|
-
const pending = {
|
|
73
|
-
promise,
|
|
74
|
-
resolve,
|
|
75
|
-
settled: false
|
|
76
|
-
};
|
|
77
|
-
activePendingBrowserRouterState = pending;
|
|
78
|
-
setter(promise);
|
|
79
|
-
return pending;
|
|
80
|
-
}
|
|
81
|
-
function settlePendingBrowserRouterState(pending) {
|
|
82
|
-
if (!pending || pending.settled) return;
|
|
83
|
-
pending.settled = true;
|
|
84
|
-
pending.resolve(getBrowserRouterState());
|
|
85
|
-
if (activePendingBrowserRouterState === pending) activePendingBrowserRouterState = null;
|
|
86
|
-
}
|
|
87
|
-
function resolvePendingBrowserRouterState(pending, action) {
|
|
88
|
-
if (!pending || pending.settled) return;
|
|
89
|
-
pending.settled = true;
|
|
90
|
-
pending.resolve(routerReducer(getBrowserRouterState(), action));
|
|
91
|
-
if (activePendingBrowserRouterState === pending) activePendingBrowserRouterState = null;
|
|
66
|
+
return browserNavigationController.beginPendingBrowserRouterState();
|
|
92
67
|
}
|
|
93
68
|
function applyClientParams(params) {
|
|
94
69
|
latestClientParams = params;
|
|
@@ -109,31 +84,10 @@ function clearClientNavigationCaches() {
|
|
|
109
84
|
clearVisitedResponseCache();
|
|
110
85
|
clearPrefetchState();
|
|
111
86
|
}
|
|
112
|
-
function
|
|
113
|
-
|
|
114
|
-
pendingNavigationPrePaintEffects.set(renderId, effect);
|
|
115
|
-
}
|
|
116
|
-
/**
|
|
117
|
-
* Run all queued pre-paint effects for renderIds up to and including the
|
|
118
|
-
* given renderId. When React supersedes a startTransition update (rapid
|
|
119
|
-
* clicks on same-route links), the superseded NavigationCommitSignal never
|
|
120
|
-
* mounts, so its pre-paint effect never fires. By draining all effects
|
|
121
|
-
* <= the committed renderId here, the winning transition cleans up after
|
|
122
|
-
* any superseded ones, keeping the counter balanced.
|
|
123
|
-
*
|
|
124
|
-
* Invariant: each superseded navigation gets a commitClientNavigationState()
|
|
125
|
-
* to balance the activateNavigationSnapshot() from its renderNavigationPayload call.
|
|
126
|
-
*/
|
|
127
|
-
function drainPrePaintEffects(upToRenderId) {
|
|
128
|
-
for (const [id, effect] of pendingNavigationPrePaintEffects) if (id <= upToRenderId) {
|
|
129
|
-
pendingNavigationPrePaintEffects.delete(id);
|
|
130
|
-
if (id === upToRenderId) effect();
|
|
131
|
-
else commitClientNavigationState(void 0, { releaseSnapshot: true });
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
function createNavigationCommitEffect(href, historyUpdateMode, navId, params, previousNextUrl) {
|
|
87
|
+
function createNavigationCommitEffect(options) {
|
|
88
|
+
const { href, historyUpdateMode, navId, params, previousNextUrl } = options;
|
|
135
89
|
return () => {
|
|
136
|
-
if (navId
|
|
90
|
+
if (!browserNavigationController.isCurrentNavigation(navId)) {
|
|
137
91
|
commitClientNavigationState(void 0, { releaseSnapshot: true });
|
|
138
92
|
return;
|
|
139
93
|
}
|
|
@@ -142,9 +96,38 @@ function createNavigationCommitEffect(href, historyUpdateMode, navId, params, pr
|
|
|
142
96
|
const historyState = createHistoryStateWithPreviousNextUrl(historyUpdateMode === "replace" ? window.history.state : null, previousNextUrl);
|
|
143
97
|
if (historyUpdateMode === "replace" && window.location.href !== targetHref) replaceHistoryStateWithoutNotify(historyState, "", href);
|
|
144
98
|
else if (historyUpdateMode === "push" && window.location.href !== targetHref) pushHistoryStateWithoutNotify(historyState, "", href);
|
|
99
|
+
pendingNavigationRecoveryHref = null;
|
|
145
100
|
commitClientNavigationState(navId);
|
|
146
101
|
};
|
|
147
102
|
}
|
|
103
|
+
async function renderNavigationPayload(payload, navigationSnapshot, targetHref, navId, historyUpdateMode, params, previousNextUrl, pendingRouterState, useTransition = true, actionType = "navigate", operationLane = "navigation") {
|
|
104
|
+
try {
|
|
105
|
+
return await browserNavigationController.renderNavigationPayload({
|
|
106
|
+
actionType,
|
|
107
|
+
createNavigationCommitEffect: (options) => {
|
|
108
|
+
pendingNavigationRecoveryHref = options.href;
|
|
109
|
+
return createNavigationCommitEffect(options);
|
|
110
|
+
},
|
|
111
|
+
historyUpdateMode,
|
|
112
|
+
navigationSnapshot,
|
|
113
|
+
nextElements: payload,
|
|
114
|
+
operationLane,
|
|
115
|
+
params,
|
|
116
|
+
pendingRouterState,
|
|
117
|
+
previousNextUrl,
|
|
118
|
+
targetHref,
|
|
119
|
+
navId,
|
|
120
|
+
useTransition
|
|
121
|
+
});
|
|
122
|
+
} catch (error) {
|
|
123
|
+
pendingNavigationRecoveryHref = null;
|
|
124
|
+
throw error;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
async function commitSameUrlNavigatePayload(nextElements, returnValue, actionInitiationState) {
|
|
128
|
+
const navigationSnapshot = createClientNavigationRenderSnapshot(window.location.href, latestClientParams);
|
|
129
|
+
return browserNavigationController.commitSameUrlNavigatePayload(nextElements, navigationSnapshot, returnValue, actionInitiationState);
|
|
130
|
+
}
|
|
148
131
|
function evictVisitedResponseCacheIfNeeded() {
|
|
149
132
|
while (visitedResponseCache.size >= MAX_VISITED_RESPONSE_CACHE_SIZE) {
|
|
150
133
|
const oldest = visitedResponseCache.keys().next().value;
|
|
@@ -153,7 +136,7 @@ function evictVisitedResponseCacheIfNeeded() {
|
|
|
153
136
|
}
|
|
154
137
|
}
|
|
155
138
|
function getVisitedResponse(rscUrl, interceptionContext, mountedSlotsHeader, navigationKind) {
|
|
156
|
-
const cacheKey =
|
|
139
|
+
const cacheKey = AppElementsWire.encodeCacheKey(rscUrl, interceptionContext);
|
|
157
140
|
const cached = visitedResponseCache.get(cacheKey);
|
|
158
141
|
if (!cached) return null;
|
|
159
142
|
if ((cached.response.mountedSlotsHeader ?? null) !== mountedSlotsHeader) {
|
|
@@ -180,7 +163,7 @@ function getVisitedResponse(rscUrl, interceptionContext, mountedSlotsHeader, nav
|
|
|
180
163
|
return null;
|
|
181
164
|
}
|
|
182
165
|
function storeVisitedResponseSnapshot(rscUrl, interceptionContext, snapshot, params) {
|
|
183
|
-
const cacheKey =
|
|
166
|
+
const cacheKey = AppElementsWire.encodeCacheKey(rscUrl, interceptionContext);
|
|
184
167
|
visitedResponseCache.delete(cacheKey);
|
|
185
168
|
evictVisitedResponseCacheIfNeeded();
|
|
186
169
|
const now = Date.now();
|
|
@@ -217,66 +200,17 @@ function getRequestState(navigationKind, previousNextUrlOverride) {
|
|
|
217
200
|
default: throw new Error("[vinext] Unknown navigation kind: " + String(navigationKind));
|
|
218
201
|
}
|
|
219
202
|
}
|
|
220
|
-
function
|
|
221
|
-
|
|
222
|
-
if (interceptionContext !== null) headers.set("X-Vinext-Interception-Context", interceptionContext);
|
|
223
|
-
return headers;
|
|
224
|
-
}
|
|
225
|
-
/**
|
|
226
|
-
* Resolve all pending navigation commits with renderId <= the committed renderId.
|
|
227
|
-
* Note: Map iteration handles concurrent deletion safely — entries are visited in
|
|
228
|
-
* insertion order and deletion doesn't affect the iterator's view of remaining entries.
|
|
229
|
-
* This pattern is also used in drainPrePaintEffects with the same semantics.
|
|
230
|
-
*/
|
|
231
|
-
function resolveCommittedNavigations(renderId) {
|
|
232
|
-
for (const [pendingId, resolve] of pendingNavigationCommits) if (pendingId <= renderId) {
|
|
233
|
-
pendingNavigationCommits.delete(pendingId);
|
|
234
|
-
resolve();
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
function NavigationCommitSignal({ renderId, children }) {
|
|
238
|
-
useLayoutEffect(() => {
|
|
239
|
-
drainPrePaintEffects(renderId);
|
|
240
|
-
const frame = requestAnimationFrame(() => {
|
|
241
|
-
resolveCommittedNavigations(renderId);
|
|
242
|
-
});
|
|
243
|
-
return () => {
|
|
244
|
-
cancelAnimationFrame(frame);
|
|
245
|
-
resolveCommittedNavigations(renderId);
|
|
246
|
-
};
|
|
247
|
-
}, [renderId]);
|
|
248
|
-
return children;
|
|
249
|
-
}
|
|
250
|
-
function normalizeAppElementsPromise(payload) {
|
|
251
|
-
return Promise.resolve(payload).then((elements) => normalizeAppElements(elements));
|
|
203
|
+
function handleDevRecoveryBoundaryCatch(resetKey) {
|
|
204
|
+
browserNavigationController.drainPrePaintEffects(resetKey);
|
|
252
205
|
}
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
const currentState = getBrowserRouterState();
|
|
256
|
-
const startedNavigationId = activeNavigationId;
|
|
257
|
-
const { disposition, pending } = await resolveAndClassifyNavigationCommit({
|
|
258
|
-
activeNavigationId,
|
|
259
|
-
currentState,
|
|
260
|
-
navigationSnapshot,
|
|
261
|
-
nextElements,
|
|
262
|
-
renderId: ++nextNavigationRenderId,
|
|
263
|
-
startedNavigationId,
|
|
264
|
-
type: "navigate"
|
|
265
|
-
});
|
|
266
|
-
if (disposition === "hard-navigate") {
|
|
267
|
-
window.location.assign(window.location.href);
|
|
268
|
-
return;
|
|
269
|
-
}
|
|
270
|
-
if (disposition === "dispatch") dispatchBrowserTree(pending.action.elements, navigationSnapshot, pending.action.renderId, "navigate", pending.interceptionContext, pending.action.layoutFlags, pending.previousNextUrl, pending.routeId, pending.rootLayoutTreePath, null, false);
|
|
271
|
-
if (returnValue) {
|
|
272
|
-
if (!returnValue.ok) throw returnValue.data;
|
|
273
|
-
return returnValue.data;
|
|
274
|
-
}
|
|
206
|
+
function decodeAppElementsPromise(payload) {
|
|
207
|
+
return Promise.resolve(payload).then((elements) => AppElementsWire.decode(elements));
|
|
275
208
|
}
|
|
276
209
|
function BrowserRoot({ initialElements, initialNavigationSnapshot }) {
|
|
277
210
|
const resolvedElements = use(initialElements);
|
|
278
|
-
const initialMetadata =
|
|
211
|
+
const initialMetadata = AppElementsWire.readMetadata(resolvedElements);
|
|
279
212
|
const [treeStateValue, setTreeStateValue] = useState({
|
|
213
|
+
activeOperation: null,
|
|
280
214
|
elements: resolvedElements,
|
|
281
215
|
interceptionContext: initialMetadata.interceptionContext,
|
|
282
216
|
layoutFlags: initialMetadata.layoutFlags,
|
|
@@ -284,21 +218,17 @@ function BrowserRoot({ initialElements, initialNavigationSnapshot }) {
|
|
|
284
218
|
previousNextUrl: null,
|
|
285
219
|
renderId: 0,
|
|
286
220
|
rootLayoutTreePath: initialMetadata.rootLayoutTreePath,
|
|
287
|
-
routeId: initialMetadata.routeId
|
|
221
|
+
routeId: initialMetadata.routeId,
|
|
222
|
+
visibleCommitVersion: 0
|
|
288
223
|
});
|
|
289
224
|
const treeState = isRouterStatePromise(treeStateValue) ? use(treeStateValue) : treeStateValue;
|
|
290
225
|
const stateRef = useRef(treeState);
|
|
291
226
|
stateRef.current = treeState;
|
|
292
227
|
useLayoutEffect(() => {
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
markBrowserRouterStateReady();
|
|
228
|
+
const detach = browserNavigationController.attachBrowserRouterState(setTreeStateValue, stateRef);
|
|
229
|
+
browserRouterStateHasEverCommitted = true;
|
|
296
230
|
return () => {
|
|
297
|
-
|
|
298
|
-
if (browserRouterStateRef === stateRef) {
|
|
299
|
-
browserRouterStateRef = null;
|
|
300
|
-
browserRouterStateHasCommitted = false;
|
|
301
|
-
}
|
|
231
|
+
detach();
|
|
302
232
|
setMountedSlotsHeader(null);
|
|
303
233
|
};
|
|
304
234
|
}, [setTreeStateValue]);
|
|
@@ -309,84 +239,15 @@ function BrowserRoot({ initialElements, initialNavigationSnapshot }) {
|
|
|
309
239
|
if (treeState.renderId !== 0) return;
|
|
310
240
|
replaceHistoryStateWithoutNotify(createHistoryStateWithPreviousNextUrl(window.history.state, treeState.previousNextUrl), "", window.location.href);
|
|
311
241
|
}, [treeState.previousNextUrl, treeState.renderId]);
|
|
312
|
-
const
|
|
242
|
+
const innerTree = createElement(NavigationCommitSignal, { renderId: treeState.renderId }, createElement(ElementsContext.Provider, { value: treeState.elements }, createElement(Slot, { id: treeState.routeId })));
|
|
243
|
+
const committedTree = import.meta.env.DEV ? createElement(DevRecoveryBoundary, {
|
|
244
|
+
resetKey: treeState.renderId,
|
|
245
|
+
onCatch: handleDevRecoveryBoundaryCatch
|
|
246
|
+
}, innerTree) : innerTree;
|
|
313
247
|
const ClientNavigationRenderContext = getClientNavigationRenderContext();
|
|
314
248
|
if (!ClientNavigationRenderContext) return committedTree;
|
|
315
249
|
return createElement(ClientNavigationRenderContext.Provider, { value: treeState.navigationSnapshot }, committedTree);
|
|
316
250
|
}
|
|
317
|
-
function dispatchBrowserTree(elements, navigationSnapshot, renderId, actionType, interceptionContext, layoutFlags, previousNextUrl, routeId, rootLayoutTreePath, pendingRouterState, useTransitionMode) {
|
|
318
|
-
const setter = getBrowserRouterStateSetter();
|
|
319
|
-
const action = {
|
|
320
|
-
elements,
|
|
321
|
-
interceptionContext,
|
|
322
|
-
layoutFlags,
|
|
323
|
-
navigationSnapshot,
|
|
324
|
-
previousNextUrl,
|
|
325
|
-
renderId,
|
|
326
|
-
rootLayoutTreePath,
|
|
327
|
-
routeId,
|
|
328
|
-
type: actionType
|
|
329
|
-
};
|
|
330
|
-
const applyAction = () => {
|
|
331
|
-
if (pendingRouterState) {
|
|
332
|
-
resolvePendingBrowserRouterState(pendingRouterState, action);
|
|
333
|
-
return;
|
|
334
|
-
}
|
|
335
|
-
setter(routerReducer(getBrowserRouterState(), action));
|
|
336
|
-
};
|
|
337
|
-
if (useTransitionMode) startTransition(applyAction);
|
|
338
|
-
else applyAction();
|
|
339
|
-
}
|
|
340
|
-
async function renderNavigationPayload(payload, navigationSnapshot, targetHref, navId, historyUpdateMode, params, previousNextUrl, pendingRouterState, useTransition = true, actionType = "navigate") {
|
|
341
|
-
const renderId = ++nextNavigationRenderId;
|
|
342
|
-
const committed = new Promise((resolve) => {
|
|
343
|
-
pendingNavigationCommits.set(renderId, resolve);
|
|
344
|
-
});
|
|
345
|
-
let snapshotActivated = false;
|
|
346
|
-
try {
|
|
347
|
-
const currentState = getBrowserRouterState();
|
|
348
|
-
const pending = await createPendingNavigationCommit({
|
|
349
|
-
currentState,
|
|
350
|
-
nextElements: payload,
|
|
351
|
-
navigationSnapshot,
|
|
352
|
-
previousNextUrl,
|
|
353
|
-
renderId,
|
|
354
|
-
type: actionType
|
|
355
|
-
});
|
|
356
|
-
const disposition = resolvePendingNavigationCommitDisposition({
|
|
357
|
-
activeNavigationId,
|
|
358
|
-
currentRootLayoutTreePath: currentState.rootLayoutTreePath,
|
|
359
|
-
nextRootLayoutTreePath: pending.rootLayoutTreePath,
|
|
360
|
-
startedNavigationId: navId
|
|
361
|
-
});
|
|
362
|
-
if (disposition === "skip") {
|
|
363
|
-
settlePendingBrowserRouterState(pendingRouterState);
|
|
364
|
-
const resolve = pendingNavigationCommits.get(renderId);
|
|
365
|
-
pendingNavigationCommits.delete(renderId);
|
|
366
|
-
resolve?.();
|
|
367
|
-
return;
|
|
368
|
-
}
|
|
369
|
-
if (disposition === "hard-navigate") {
|
|
370
|
-
settlePendingBrowserRouterState(pendingRouterState);
|
|
371
|
-
pendingNavigationCommits.delete(renderId);
|
|
372
|
-
window.location.assign(targetHref);
|
|
373
|
-
return;
|
|
374
|
-
}
|
|
375
|
-
queuePrePaintNavigationEffect(renderId, createNavigationCommitEffect(targetHref, historyUpdateMode, navId, params, pending.previousNextUrl));
|
|
376
|
-
activateNavigationSnapshot();
|
|
377
|
-
snapshotActivated = true;
|
|
378
|
-
dispatchBrowserTree(pending.action.elements, navigationSnapshot, renderId, actionType, pending.interceptionContext, pending.action.layoutFlags, pending.previousNextUrl, pending.routeId, pending.rootLayoutTreePath, pendingRouterState, useTransition);
|
|
379
|
-
} catch (error) {
|
|
380
|
-
pendingNavigationPrePaintEffects.delete(renderId);
|
|
381
|
-
const resolve = pendingNavigationCommits.get(renderId);
|
|
382
|
-
pendingNavigationCommits.delete(renderId);
|
|
383
|
-
if (snapshotActivated) commitClientNavigationState(navId);
|
|
384
|
-
settlePendingBrowserRouterState(pendingRouterState);
|
|
385
|
-
resolve?.();
|
|
386
|
-
throw error;
|
|
387
|
-
}
|
|
388
|
-
return committed;
|
|
389
|
-
}
|
|
390
251
|
function restoreHydrationNavigationContext(pathname, searchParams, params) {
|
|
391
252
|
setNavigationContext({
|
|
392
253
|
pathname,
|
|
@@ -479,17 +340,20 @@ async function readInitialRscStream() {
|
|
|
479
340
|
if (vinext.__VINEXT_RSC_NAV__) restoreHydrationNavigationContext(vinext.__VINEXT_RSC_NAV__.pathname, vinext.__VINEXT_RSC_NAV__.searchParams, params);
|
|
480
341
|
return createProgressiveRscStream();
|
|
481
342
|
}
|
|
482
|
-
const
|
|
343
|
+
const rscHeaders = createRscRequestHeaders();
|
|
344
|
+
const rscResponse = await fetch(await createRscRequestUrl(window.location.pathname + window.location.search, rscHeaders), {
|
|
345
|
+
credentials: "include",
|
|
346
|
+
headers: rscHeaders
|
|
347
|
+
});
|
|
483
348
|
if (!rscResponse.ok) return recoverFromBadInitialRscResponse(`returned ${rscResponse.status}`);
|
|
484
349
|
const contentType = rscResponse.headers.get("content-type") ?? "";
|
|
485
350
|
if (!contentType.startsWith("text/x-component")) return recoverFromBadInitialRscResponse(`returned non-RSC content-type "${contentType || "(missing)"}"`);
|
|
486
351
|
if (!rscResponse.body) return recoverFromBadInitialRscResponse("returned empty body");
|
|
487
352
|
clearReloadFlag();
|
|
488
|
-
|
|
489
|
-
const
|
|
490
|
-
if (
|
|
491
|
-
|
|
492
|
-
applyClientParams(params);
|
|
353
|
+
const parsedParams = parseEncodedJsonHeader(rscResponse.headers.get("X-Vinext-Params"));
|
|
354
|
+
const params = parsedParams ?? {};
|
|
355
|
+
if (parsedParams) try {
|
|
356
|
+
applyClientParams(parsedParams);
|
|
493
357
|
} catch {}
|
|
494
358
|
restoreHydrationNavigationContext(window.location.pathname, window.location.search, params);
|
|
495
359
|
return rscResponse.body;
|
|
@@ -505,7 +369,7 @@ function registerServerActionCallback() {
|
|
|
505
369
|
elements: currentState.elements,
|
|
506
370
|
previousNextUrl: currentState.previousNextUrl
|
|
507
371
|
});
|
|
508
|
-
const fetchResponse = await fetch(
|
|
372
|
+
const fetchResponse = await fetch(await createRscRequestUrl(window.location.pathname + window.location.search, headers), {
|
|
509
373
|
method: "POST",
|
|
510
374
|
headers,
|
|
511
375
|
body
|
|
@@ -529,8 +393,8 @@ function registerServerActionCallback() {
|
|
|
529
393
|
}
|
|
530
394
|
clearClientNavigationCaches();
|
|
531
395
|
const result = await createFromFetch(Promise.resolve(fetchResponse), { temporaryReferences });
|
|
532
|
-
if (isServerActionResult(result)) return commitSameUrlNavigatePayload(Promise.resolve(
|
|
533
|
-
return commitSameUrlNavigatePayload(Promise.resolve(
|
|
396
|
+
if (isServerActionResult(result)) return commitSameUrlNavigatePayload(Promise.resolve(AppElementsWire.decode(result.root)), result.returnValue, currentState);
|
|
397
|
+
return commitSameUrlNavigatePayload(Promise.resolve(AppElementsWire.decode(result)), void 0, currentState);
|
|
534
398
|
});
|
|
535
399
|
}
|
|
536
400
|
async function main() {
|
|
@@ -540,27 +404,31 @@ async function main() {
|
|
|
540
404
|
bootstrapHydration(rscStream);
|
|
541
405
|
}
|
|
542
406
|
function bootstrapHydration(rscStream) {
|
|
543
|
-
|
|
407
|
+
if (import.meta.env.DEV) installDevErrorOverlay();
|
|
408
|
+
const root = decodeAppElementsPromise(createFromReadableStream(rscStream));
|
|
544
409
|
const initialNavigationSnapshot = createClientNavigationRenderSnapshot(window.location.href, latestClientParams);
|
|
545
410
|
replaceHistoryStateWithoutNotify(createHistoryStateWithPreviousNextUrl(window.history.state, null), "", window.location.href);
|
|
411
|
+
const onUncaughtError = import.meta.env.DEV ? devOnUncaughtError : createOnUncaughtError(() => pendingNavigationRecoveryHref);
|
|
546
412
|
window.__VINEXT_RSC_ROOT__ = hydrateRoot(document, createElement(BrowserRoot, {
|
|
547
413
|
initialElements: root,
|
|
548
414
|
initialNavigationSnapshot
|
|
549
|
-
}), import.meta.env.DEV ? {
|
|
415
|
+
}), import.meta.env.DEV ? {
|
|
416
|
+
onCaughtError: devOnCaughtError,
|
|
417
|
+
onUncaughtError
|
|
418
|
+
} : { onUncaughtError });
|
|
550
419
|
window.__VINEXT_HYDRATED_AT = performance.now();
|
|
551
420
|
window.__VINEXT_RSC_NAVIGATE__ = async function navigateRsc(href, redirectDepth = 0, navigationKind = "navigate", historyUpdateMode, previousNextUrlOverride, programmaticTransition = false) {
|
|
552
|
-
let _snapshotPending = false;
|
|
553
421
|
let pendingRouterState = null;
|
|
554
|
-
const navId =
|
|
422
|
+
const navId = browserNavigationController.beginNavigation();
|
|
555
423
|
let currentHref = href;
|
|
556
424
|
let currentHistoryMode = historyUpdateMode;
|
|
557
425
|
let currentPrevNextUrl = previousNextUrlOverride;
|
|
558
426
|
let redirectCount = redirectDepth;
|
|
559
427
|
try {
|
|
560
|
-
if (programmaticTransition &&
|
|
428
|
+
if (programmaticTransition && hasBrowserRouterState()) pendingRouterState = beginPendingBrowserRouterState();
|
|
561
429
|
else {
|
|
562
430
|
await waitForBrowserRouterStateReady();
|
|
563
|
-
if (navId
|
|
431
|
+
if (!browserNavigationController.isCurrentNavigation(navId)) return;
|
|
564
432
|
if (programmaticTransition) pendingRouterState = beginPendingBrowserRouterState();
|
|
565
433
|
}
|
|
566
434
|
while (true) {
|
|
@@ -570,7 +438,6 @@ function bootstrapHydration(rscStream) {
|
|
|
570
438
|
return;
|
|
571
439
|
}
|
|
572
440
|
const url = new URL(currentHref, window.location.origin);
|
|
573
|
-
const rscUrl = toRscUrl(url.pathname + url.search);
|
|
574
441
|
const requestState = getRequestState(navigationKind, currentPrevNextUrl);
|
|
575
442
|
const requestInterceptionContext = requestState.interceptionContext;
|
|
576
443
|
const requestPreviousNextUrl = requestState.previousNextUrl;
|
|
@@ -580,19 +447,17 @@ function bootstrapHydration(rscStream) {
|
|
|
580
447
|
setPendingPathname(url.pathname, navId);
|
|
581
448
|
const elementsAtNavStart = getBrowserRouterState().elements;
|
|
582
449
|
const mountedSlotsHeader = getMountedSlotIdsHeader(elementsAtNavStart);
|
|
450
|
+
const requestHeaders = createRscRequestHeaders({ interceptionContext: requestInterceptionContext });
|
|
451
|
+
if (mountedSlotsHeader) requestHeaders.set(VINEXT_RSC_MOUNTED_SLOTS_HEADER, mountedSlotsHeader);
|
|
452
|
+
const rscUrl = await createRscRequestUrl(url.pathname + url.search, requestHeaders);
|
|
583
453
|
const cachedRoute = getVisitedResponse(rscUrl, requestInterceptionContext, mountedSlotsHeader, navigationKind);
|
|
584
454
|
if (cachedRoute) {
|
|
585
|
-
if (navId
|
|
455
|
+
if (!browserNavigationController.isCurrentNavigation(navId)) return;
|
|
586
456
|
const cachedParams = cachedRoute.params;
|
|
587
457
|
const cachedNavigationSnapshot = createClientNavigationRenderSnapshot(currentHref, cachedParams);
|
|
588
|
-
const cachedPayload =
|
|
589
|
-
if (navId
|
|
590
|
-
|
|
591
|
-
try {
|
|
592
|
-
await renderNavigationPayload(cachedPayload, cachedNavigationSnapshot, currentHref, navId, currentHistoryMode, cachedParams, requestPreviousNextUrl, pendingRouterState, isSameRoute, toActionType(navigationKind));
|
|
593
|
-
} finally {
|
|
594
|
-
_snapshotPending = false;
|
|
595
|
-
}
|
|
458
|
+
const cachedPayload = decodeAppElementsPromise(createFromFetch(Promise.resolve(restoreRscResponse(cachedRoute.response))));
|
|
459
|
+
if (!browserNavigationController.isCurrentNavigation(navId)) return;
|
|
460
|
+
await renderNavigationPayload(cachedPayload, cachedNavigationSnapshot, currentHref, navId, currentHistoryMode, cachedParams, requestPreviousNextUrl, pendingRouterState, isSameRoute, toActionType(navigationKind), toOperationLane(navigationKind));
|
|
596
461
|
return;
|
|
597
462
|
}
|
|
598
463
|
let navResponse;
|
|
@@ -604,23 +469,20 @@ function bootstrapHydration(rscStream) {
|
|
|
604
469
|
navResponseUrl = prefetchedResponse.url;
|
|
605
470
|
}
|
|
606
471
|
}
|
|
607
|
-
if (!navResponse) {
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
credentials: "include"
|
|
613
|
-
});
|
|
614
|
-
}
|
|
615
|
-
if (navId !== activeNavigationId) return;
|
|
472
|
+
if (!navResponse) navResponse = await fetch(rscUrl, {
|
|
473
|
+
headers: requestHeaders,
|
|
474
|
+
credentials: "include"
|
|
475
|
+
});
|
|
476
|
+
if (!browserNavigationController.isCurrentNavigation(navId)) return;
|
|
616
477
|
const isRscResponse = (navResponse.headers.get("content-type") ?? "").startsWith("text/x-component");
|
|
617
478
|
if (!navResponse.ok || !isRscResponse || !navResponse.body) {
|
|
618
479
|
const responseUrl = navResponseUrl ?? navResponse.url;
|
|
619
480
|
let hardNavTarget = currentHref;
|
|
620
481
|
if (responseUrl) {
|
|
621
482
|
const parsed = new URL(responseUrl, window.location.origin);
|
|
483
|
+
stripRscCacheBustingSearchParam(parsed);
|
|
622
484
|
const origUrl = new URL(currentHref, window.location.origin);
|
|
623
|
-
let pathname = parsed.pathname
|
|
485
|
+
let pathname = stripRscSuffix(parsed.pathname);
|
|
624
486
|
if (origUrl.pathname.length > 1 && origUrl.pathname.endsWith("/") && !pathname.endsWith("/")) pathname += "/";
|
|
625
487
|
hardNavTarget = pathname + parsed.search;
|
|
626
488
|
if (origUrl.hash) hardNavTarget += origUrl.hash;
|
|
@@ -629,9 +491,10 @@ function bootstrapHydration(rscStream) {
|
|
|
629
491
|
return;
|
|
630
492
|
}
|
|
631
493
|
const finalUrl = new URL(navResponseUrl ?? navResponse.url, window.location.origin);
|
|
494
|
+
stripRscCacheBustingSearchParam(finalUrl);
|
|
632
495
|
const requestedUrl = new URL(rscUrl, window.location.origin);
|
|
633
496
|
if (finalUrl.pathname !== requestedUrl.pathname) {
|
|
634
|
-
const destinationPath = finalUrl.pathname
|
|
497
|
+
const destinationPath = stripRscSuffix(finalUrl.pathname) + finalUrl.search;
|
|
635
498
|
replaceHistoryStateWithoutNotify(createHistoryStateWithPreviousNextUrl(null, requestPreviousNextUrl), "", destinationPath);
|
|
636
499
|
currentHref = destinationPath;
|
|
637
500
|
currentHistoryMode = void 0;
|
|
@@ -639,37 +502,24 @@ function bootstrapHydration(rscStream) {
|
|
|
639
502
|
redirectCount += 1;
|
|
640
503
|
continue;
|
|
641
504
|
}
|
|
642
|
-
|
|
643
|
-
const paramsHeader = navResponse.headers.get("X-Vinext-Params");
|
|
644
|
-
if (paramsHeader) try {
|
|
645
|
-
navParams = JSON.parse(decodeURIComponent(paramsHeader));
|
|
646
|
-
} catch {}
|
|
505
|
+
const navParams = parseEncodedJsonHeader(navResponse.headers.get("X-Vinext-Params")) ?? {};
|
|
647
506
|
const navigationSnapshot = createClientNavigationRenderSnapshot(currentHref, navParams);
|
|
648
507
|
const responseSnapshot = await snapshotRscResponse(navResponse);
|
|
649
|
-
if (navId
|
|
650
|
-
const rscPayload =
|
|
651
|
-
if (navId
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
_snapshotPending = false;
|
|
657
|
-
}
|
|
658
|
-
if (navId !== activeNavigationId) return;
|
|
659
|
-
storeVisitedResponseSnapshot(rscUrl, resolveVisitedResponseInterceptionContext(requestInterceptionContext, readAppElementsMetadata(await rscPayload).interceptionContext), responseSnapshot, navParams);
|
|
508
|
+
if (!browserNavigationController.isCurrentNavigation(navId)) return;
|
|
509
|
+
const rscPayload = decodeAppElementsPromise(createFromFetch(Promise.resolve(restoreRscResponse(responseSnapshot))));
|
|
510
|
+
if (!browserNavigationController.isCurrentNavigation(navId)) return;
|
|
511
|
+
if (await renderNavigationPayload(rscPayload, navigationSnapshot, currentHref, navId, currentHistoryMode, navParams, requestPreviousNextUrl, pendingRouterState, isSameRoute, toActionType(navigationKind), toOperationLane(navigationKind)) !== "committed") return;
|
|
512
|
+
if (!browserNavigationController.isCurrentNavigation(navId)) return;
|
|
513
|
+
const resolvedElements = await rscPayload;
|
|
514
|
+
storeVisitedResponseSnapshot(rscUrl, resolveVisitedResponseInterceptionContext(requestInterceptionContext, AppElementsWire.readMetadata(resolvedElements).interceptionContext), responseSnapshot, navParams);
|
|
660
515
|
return;
|
|
661
516
|
}
|
|
662
517
|
} catch (error) {
|
|
663
|
-
if (
|
|
664
|
-
_snapshotPending = false;
|
|
665
|
-
commitClientNavigationState(navId);
|
|
666
|
-
}
|
|
667
|
-
if (navId !== activeNavigationId) return;
|
|
518
|
+
if (!browserNavigationController.isCurrentNavigation(navId)) return;
|
|
668
519
|
if (!isPageUnloading) console.error("[vinext] RSC navigation error:", error);
|
|
669
520
|
window.location.href = currentHref;
|
|
670
521
|
} finally {
|
|
671
|
-
|
|
672
|
-
if (navId === activeNavigationId) clearPendingPathname(navId);
|
|
522
|
+
browserNavigationController.finalizeNavigation(navId, pendingRouterState);
|
|
673
523
|
}
|
|
674
524
|
};
|
|
675
525
|
if ("scrollRestoration" in history) history.scrollRestoration = "manual";
|
|
@@ -684,16 +534,17 @@ function bootstrapHydration(rscStream) {
|
|
|
684
534
|
});
|
|
685
535
|
if (import.meta.hot) import.meta.hot.on("rsc:update", async () => {
|
|
686
536
|
try {
|
|
537
|
+
if (browserRouterStateHasEverCommitted && !browserNavigationController.hasBrowserRouterState()) {
|
|
538
|
+
window.location.reload();
|
|
539
|
+
return;
|
|
540
|
+
}
|
|
541
|
+
await waitForBrowserRouterStateReady();
|
|
542
|
+
if (!browserNavigationController.hasBrowserRouterState()) return;
|
|
687
543
|
clearClientNavigationCaches();
|
|
688
544
|
const navigationSnapshot = createClientNavigationRenderSnapshot(window.location.href, latestClientParams);
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
navigationSnapshot,
|
|
693
|
-
renderId: ++nextNavigationRenderId,
|
|
694
|
-
type: "replace"
|
|
695
|
-
});
|
|
696
|
-
dispatchBrowserTree(pending.action.elements, navigationSnapshot, pending.action.renderId, "replace", pending.interceptionContext, pending.action.layoutFlags, pending.previousNextUrl, pending.routeId, pending.rootLayoutTreePath, null, false);
|
|
545
|
+
dismissOverlay();
|
|
546
|
+
const hmrHeaders = createRscRequestHeaders();
|
|
547
|
+
await browserNavigationController.hmrReplaceTree(decodeAppElementsPromise(createFromFetch(fetch(await createRscRequestUrl(window.location.pathname + window.location.search, hmrHeaders), { headers: hmrHeaders }))), navigationSnapshot);
|
|
697
548
|
} catch (error) {
|
|
698
549
|
console.error("[vinext] RSC HMR error:", error);
|
|
699
550
|
}
|