vinext 0.0.49 → 0.0.51
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/build/client-build-config.js.map +1 -1
- package/dist/build/google-fonts/build-url.js.map +1 -1
- package/dist/build/google-fonts/fallback-metrics-data.js +14031 -0
- package/dist/build/google-fonts/fallback-metrics-data.js.map +1 -0
- package/dist/build/google-fonts/fallback-metrics.d.ts +13 -0
- package/dist/build/google-fonts/fallback-metrics.js +46 -0
- package/dist/build/google-fonts/fallback-metrics.js.map +1 -0
- package/dist/build/google-fonts/get-axes.js.map +1 -1
- package/dist/build/google-fonts/sort-variants.js.map +1 -1
- package/dist/build/google-fonts/validate.js.map +1 -1
- package/dist/build/layout-classification.js.map +1 -1
- package/dist/build/nitro-route-rules.js.map +1 -1
- package/dist/build/precompress.d.ts +13 -2
- package/dist/build/precompress.js +12 -3
- package/dist/build/precompress.js.map +1 -1
- package/dist/build/prerender.d.ts +17 -1
- package/dist/build/prerender.js +114 -23
- package/dist/build/prerender.js.map +1 -1
- package/dist/build/report.d.ts +5 -4
- package/dist/build/report.js +196 -348
- package/dist/build/report.js.map +1 -1
- package/dist/build/route-classification-injector.js.map +1 -1
- package/dist/build/route-classification-manifest.js.map +1 -1
- package/dist/build/run-prerender.js.map +1 -1
- package/dist/build/server-manifest.js.map +1 -1
- package/dist/build/ssr-manifest.js.map +1 -1
- package/dist/build/standalone.js.map +1 -1
- package/dist/build/static-export.js.map +1 -1
- package/dist/check.js +2 -1
- package/dist/check.js.map +1 -1
- package/dist/cli-args.js.map +1 -1
- package/dist/cli.js +68 -7
- package/dist/cli.js.map +1 -1
- package/dist/client/instrumentation-client-state.js.map +1 -1
- package/dist/client/validate-module-path.js.map +1 -1
- package/dist/client/vinext-next-data.d.ts +5 -1
- package/dist/client/window-next.d.ts +151 -0
- package/dist/client/window-next.js +48 -0
- package/dist/client/window-next.js.map +1 -0
- package/dist/cloudflare/kv-cache-handler.js.map +1 -1
- package/dist/cloudflare/tpr.js +2 -1
- package/dist/cloudflare/tpr.js.map +1 -1
- package/dist/config/config-matchers.d.ts +3 -1
- package/dist/config/config-matchers.js +5 -4
- package/dist/config/config-matchers.js.map +1 -1
- package/dist/config/dotenv.d.ts +11 -1
- package/dist/config/dotenv.js.map +1 -1
- package/dist/config/next-config.d.ts +93 -6
- package/dist/config/next-config.js +233 -6
- package/dist/config/next-config.js.map +1 -1
- package/dist/config/tsconfig-paths.d.ts +13 -0
- package/dist/config/tsconfig-paths.js +117 -0
- package/dist/config/tsconfig-paths.js.map +1 -0
- package/dist/deploy.js +16 -7
- package/dist/deploy.js.map +1 -1
- package/dist/entries/app-browser-entry.d.ts +3 -1
- package/dist/entries/app-browser-entry.js +36 -2
- package/dist/entries/app-browser-entry.js.map +1 -1
- package/dist/entries/app-rsc-entry.d.ts +19 -1
- package/dist/entries/app-rsc-entry.js +49 -12
- package/dist/entries/app-rsc-entry.js.map +1 -1
- package/dist/entries/app-rsc-manifest.d.ts +9 -0
- package/dist/entries/app-rsc-manifest.js +8 -1
- package/dist/entries/app-rsc-manifest.js.map +1 -1
- package/dist/entries/app-ssr-entry.js.map +1 -1
- package/dist/entries/pages-client-entry.js +3 -5
- package/dist/entries/pages-client-entry.js.map +1 -1
- package/dist/entries/pages-entry-helpers.js.map +1 -1
- package/dist/entries/pages-server-entry.js +34 -1
- package/dist/entries/pages-server-entry.js.map +1 -1
- package/dist/entries/runtime-entry-module.js.map +1 -1
- package/dist/index.js +204 -53
- package/dist/index.js.map +1 -1
- package/dist/init.js.map +1 -1
- package/dist/plugins/async-hooks-stub.js.map +1 -1
- package/dist/plugins/client-reference-dedup.d.ts +15 -2
- package/dist/plugins/client-reference-dedup.js +138 -16
- package/dist/plugins/client-reference-dedup.js.map +1 -1
- package/dist/plugins/fonts.d.ts +2 -2
- package/dist/plugins/fonts.js +15 -6
- package/dist/plugins/fonts.js.map +1 -1
- package/dist/plugins/instrumentation-client.js.map +1 -1
- package/dist/plugins/og-assets.js.map +1 -1
- package/dist/plugins/optimize-imports.js.map +1 -1
- package/dist/plugins/postcss.js.map +1 -1
- package/dist/plugins/rsc-client-reference-loaders.d.ts +7 -0
- package/dist/plugins/rsc-client-reference-loaders.js +48 -0
- package/dist/plugins/rsc-client-reference-loaders.js.map +1 -0
- package/dist/plugins/rsc-client-shim-excludes.js.map +1 -1
- package/dist/plugins/sass.d.ts +34 -0
- package/dist/plugins/sass.js +22 -0
- package/dist/plugins/sass.js.map +1 -0
- package/dist/plugins/server-externals-manifest.js.map +1 -1
- package/dist/plugins/strip-server-exports.js.map +1 -1
- package/dist/routing/app-route-graph.d.ts +78 -6
- package/dist/routing/app-route-graph.js +241 -25
- package/dist/routing/app-route-graph.js.map +1 -1
- package/dist/routing/app-router.js.map +1 -1
- package/dist/routing/file-matcher.js.map +1 -1
- package/dist/routing/pages-router.js.map +1 -1
- package/dist/routing/route-matching.js.map +1 -1
- package/dist/routing/route-pattern.d.ts +56 -1
- package/dist/routing/route-pattern.js +60 -1
- package/dist/routing/route-pattern.js.map +1 -1
- package/dist/routing/route-trie.js.map +1 -1
- package/dist/routing/route-validation.js.map +1 -1
- package/dist/routing/utils.js.map +1 -1
- package/dist/server/api-handler.js.map +1 -1
- package/dist/server/app-browser-action-result.d.ts +44 -0
- package/dist/server/app-browser-action-result.js +79 -0
- package/dist/server/app-browser-action-result.js.map +1 -0
- package/dist/server/app-browser-entry.js +330 -133
- package/dist/server/app-browser-entry.js.map +1 -1
- package/dist/server/app-browser-error.js.map +1 -1
- package/dist/server/app-browser-hydration.d.ts +31 -0
- package/dist/server/app-browser-hydration.js +30 -0
- package/dist/server/app-browser-hydration.js.map +1 -0
- package/dist/server/app-browser-navigation-controller.d.ts +20 -4
- package/dist/server/app-browser-navigation-controller.js +90 -23
- package/dist/server/app-browser-navigation-controller.js.map +1 -1
- package/dist/server/app-browser-popstate.d.ts +16 -0
- package/dist/server/app-browser-popstate.js +17 -0
- package/dist/server/app-browser-popstate.js.map +1 -0
- package/dist/server/app-browser-rsc-redirect.d.ts +28 -0
- package/dist/server/app-browser-rsc-redirect.js +37 -0
- package/dist/server/app-browser-rsc-redirect.js.map +1 -0
- package/dist/server/app-browser-state.d.ts +27 -23
- package/dist/server/app-browser-state.js +158 -54
- package/dist/server/app-browser-state.js.map +1 -1
- package/dist/server/app-browser-stream.d.ts +9 -4
- package/dist/server/app-browser-stream.js +29 -8
- package/dist/server/app-browser-stream.js.map +1 -1
- package/dist/server/app-browser-visible-commit.d.ts +11 -1
- package/dist/server/app-browser-visible-commit.js +69 -21
- package/dist/server/app-browser-visible-commit.js.map +1 -1
- package/dist/server/app-client-reference-preloader.js.map +1 -1
- package/dist/server/app-elements-wire.d.ts +43 -6
- package/dist/server/app-elements-wire.js +121 -5
- package/dist/server/app-elements-wire.js.map +1 -1
- package/dist/server/app-elements.d.ts +2 -2
- package/dist/server/app-elements.js +2 -2
- package/dist/server/app-elements.js.map +1 -1
- package/dist/server/app-fallback-renderer.d.ts +10 -1
- package/dist/server/app-fallback-renderer.js +37 -1
- package/dist/server/app-fallback-renderer.js.map +1 -1
- package/dist/server/app-history-state.d.ts +26 -0
- package/dist/server/app-history-state.js +53 -0
- package/dist/server/app-history-state.js.map +1 -0
- package/dist/server/app-hook-warning-suppression.js.map +1 -1
- package/dist/server/app-middleware.d.ts +1 -1
- package/dist/server/app-middleware.js +4 -9
- package/dist/server/app-middleware.js.map +1 -1
- package/dist/server/app-mounted-slots-header.js.map +1 -1
- package/dist/server/app-page-boundary-render.d.ts +11 -1
- package/dist/server/app-page-boundary-render.js +27 -19
- package/dist/server/app-page-boundary-render.js.map +1 -1
- package/dist/server/app-page-boundary.d.ts +1 -0
- package/dist/server/app-page-boundary.js +10 -7
- package/dist/server/app-page-boundary.js.map +1 -1
- package/dist/server/app-page-cache.d.ts +23 -3
- package/dist/server/app-page-cache.js +63 -27
- package/dist/server/app-page-cache.js.map +1 -1
- package/dist/server/app-page-dispatch.d.ts +11 -1
- package/dist/server/app-page-dispatch.js +85 -14
- package/dist/server/app-page-dispatch.js.map +1 -1
- package/dist/server/app-page-element-builder.d.ts +10 -1
- package/dist/server/app-page-element-builder.js +38 -6
- package/dist/server/app-page-element-builder.js.map +1 -1
- package/dist/server/app-page-execution.js +2 -3
- package/dist/server/app-page-execution.js.map +1 -1
- package/dist/server/app-page-head.d.ts +7 -0
- package/dist/server/app-page-head.js +6 -1
- package/dist/server/app-page-head.js.map +1 -1
- package/dist/server/app-page-method.js.map +1 -1
- package/dist/server/app-page-params.js.map +1 -1
- package/dist/server/app-page-probe.d.ts +23 -1
- package/dist/server/app-page-probe.js +29 -1
- package/dist/server/app-page-probe.js.map +1 -1
- package/dist/server/app-page-render-observation.d.ts +35 -0
- package/dist/server/app-page-render-observation.js +68 -0
- package/dist/server/app-page-render-observation.js.map +1 -0
- package/dist/server/app-page-render.d.ts +12 -2
- package/dist/server/app-page-render.js +90 -7
- package/dist/server/app-page-render.js.map +1 -1
- package/dist/server/app-page-request.d.ts +1 -0
- package/dist/server/app-page-request.js +2 -1
- package/dist/server/app-page-request.js.map +1 -1
- package/dist/server/app-page-response.d.ts +2 -0
- package/dist/server/app-page-response.js +18 -7
- package/dist/server/app-page-response.js.map +1 -1
- package/dist/server/app-page-route-wiring.d.ts +9 -3
- package/dist/server/app-page-route-wiring.js +91 -62
- package/dist/server/app-page-route-wiring.js.map +1 -1
- package/dist/server/app-page-segment-state.d.ts +10 -0
- package/dist/server/app-page-segment-state.js +87 -0
- package/dist/server/app-page-segment-state.js.map +1 -0
- package/dist/server/app-page-stream.d.ts +9 -2
- package/dist/server/app-page-stream.js +4 -1
- package/dist/server/app-page-stream.js.map +1 -1
- package/dist/server/app-post-middleware-context.js.map +1 -1
- package/dist/server/app-prerender-endpoints.js.map +1 -1
- package/dist/server/app-prerender-static-params.js.map +1 -1
- package/dist/server/app-render-dependency.js.map +1 -1
- package/dist/server/app-request-context.js.map +1 -1
- package/dist/server/app-route-handler-cache.js.map +1 -1
- package/dist/server/app-route-handler-dispatch.js +3 -1
- package/dist/server/app-route-handler-dispatch.js.map +1 -1
- package/dist/server/app-route-handler-execution.js.map +1 -1
- package/dist/server/app-route-handler-policy.js +1 -0
- package/dist/server/app-route-handler-policy.js.map +1 -1
- package/dist/server/app-route-handler-response.js +4 -3
- package/dist/server/app-route-handler-response.js.map +1 -1
- package/dist/server/app-route-handler-runtime.js.map +1 -1
- package/dist/server/app-router-entry.js +7 -15
- package/dist/server/app-router-entry.js.map +1 -1
- package/dist/server/app-rsc-cache-busting.d.ts +23 -2
- package/dist/server/app-rsc-cache-busting.js +75 -19
- package/dist/server/app-rsc-cache-busting.js.map +1 -1
- package/dist/server/app-rsc-embedded-chunks.d.ts +9 -0
- package/dist/server/app-rsc-embedded-chunks.js +34 -0
- package/dist/server/app-rsc-embedded-chunks.js.map +1 -0
- package/dist/server/app-rsc-error-handler.js.map +1 -1
- package/dist/server/app-rsc-errors.d.ts +4 -1
- package/dist/server/app-rsc-errors.js +1 -1
- package/dist/server/app-rsc-errors.js.map +1 -1
- package/dist/server/app-rsc-handler.d.ts +18 -1
- package/dist/server/app-rsc-handler.js +55 -16
- package/dist/server/app-rsc-handler.js.map +1 -1
- package/dist/server/app-rsc-render-mode.d.ts +11 -0
- package/dist/server/app-rsc-render-mode.js +21 -0
- package/dist/server/app-rsc-render-mode.js.map +1 -0
- package/dist/server/app-rsc-request-normalization.d.ts +4 -1
- package/dist/server/app-rsc-request-normalization.js +7 -2
- package/dist/server/app-rsc-request-normalization.js.map +1 -1
- package/dist/server/app-rsc-response-finalizer.d.ts +2 -1
- package/dist/server/app-rsc-response-finalizer.js +6 -1
- package/dist/server/app-rsc-response-finalizer.js.map +1 -1
- package/dist/server/app-rsc-route-matching.d.ts +23 -0
- package/dist/server/app-rsc-route-matching.js +45 -23
- package/dist/server/app-rsc-route-matching.js.map +1 -1
- package/dist/server/app-segment-config.js.map +1 -1
- package/dist/server/app-server-action-execution.d.ts +51 -5
- package/dist/server/app-server-action-execution.js +161 -51
- package/dist/server/app-server-action-execution.js.map +1 -1
- package/dist/server/app-ssr-entry.d.ts +7 -0
- package/dist/server/app-ssr-entry.js +44 -14
- package/dist/server/app-ssr-entry.js.map +1 -1
- package/dist/server/app-ssr-error-meta.d.ts +14 -0
- package/dist/server/app-ssr-error-meta.js +50 -0
- package/dist/server/app-ssr-error-meta.js.map +1 -0
- package/dist/server/app-ssr-stream.d.ts +1 -1
- package/dist/server/app-ssr-stream.js +9 -12
- package/dist/server/app-ssr-stream.js.map +1 -1
- package/dist/server/app-static-generation.js.map +1 -1
- package/dist/server/artifact-compatibility.d.ts +12 -2
- package/dist/server/artifact-compatibility.js +12 -8
- package/dist/server/artifact-compatibility.js.map +1 -1
- package/dist/server/cache-control.js +1 -0
- package/dist/server/cache-control.js.map +1 -1
- package/dist/server/cache-proof.d.ts +124 -5
- package/dist/server/cache-proof.js +416 -18
- package/dist/server/cache-proof.js.map +1 -1
- package/dist/server/csp.js.map +1 -1
- package/dist/server/dev-error-overlay-store.js.map +1 -1
- package/dist/server/dev-error-overlay.js +5 -0
- package/dist/server/dev-error-overlay.js.map +1 -1
- package/dist/server/dev-lockfile.d.ts +110 -0
- package/dist/server/dev-lockfile.js +180 -0
- package/dist/server/dev-lockfile.js.map +1 -0
- package/dist/server/dev-module-runner.js.map +1 -1
- package/dist/server/dev-origin-check.js.map +1 -1
- package/dist/server/dev-route-files.js.map +1 -1
- package/dist/server/dev-server.js +23 -10
- package/dist/server/dev-server.js.map +1 -1
- package/dist/server/file-based-metadata.d.ts +13 -0
- package/dist/server/file-based-metadata.js +49 -2
- package/dist/server/file-based-metadata.js.map +1 -1
- package/dist/server/headers.d.ts +81 -0
- package/dist/server/headers.js +104 -0
- package/dist/server/headers.js.map +1 -0
- package/dist/server/html.js +1 -1
- package/dist/server/html.js.map +1 -1
- package/dist/server/http-error-responses.d.ts +10 -0
- package/dist/server/http-error-responses.js +11 -1
- package/dist/server/http-error-responses.js.map +1 -1
- package/dist/server/image-optimization.d.ts +11 -1
- package/dist/server/image-optimization.js.map +1 -1
- package/dist/server/implicit-tags.js +2 -1
- package/dist/server/implicit-tags.js.map +1 -1
- package/dist/server/instrumentation-runtime.js.map +1 -1
- package/dist/server/instrumentation.js.map +1 -1
- package/dist/server/isr-cache.d.ts +12 -2
- package/dist/server/isr-cache.js +16 -5
- package/dist/server/isr-cache.js.map +1 -1
- package/dist/server/metadata-route-build-data.js.map +1 -1
- package/dist/server/metadata-route-response.js +22 -5
- package/dist/server/metadata-route-response.js.map +1 -1
- package/dist/server/metadata-routes.js +27 -8
- package/dist/server/metadata-routes.js.map +1 -1
- package/dist/server/middleware-matcher.js.map +1 -1
- package/dist/server/middleware-request-headers.d.ts +4 -1
- package/dist/server/middleware-request-headers.js +15 -8
- package/dist/server/middleware-request-headers.js.map +1 -1
- package/dist/server/middleware-response-headers.d.ts +2 -1
- package/dist/server/middleware-response-headers.js +1 -1
- package/dist/server/middleware-response-headers.js.map +1 -1
- package/dist/server/middleware-runtime.d.ts +1 -0
- package/dist/server/middleware-runtime.js +7 -3
- package/dist/server/middleware-runtime.js.map +1 -1
- package/dist/server/middleware.d.ts +12 -0
- package/dist/server/middleware.js +12 -0
- package/dist/server/middleware.js.map +1 -1
- package/dist/server/navigation-planner.d.ts +133 -0
- package/dist/server/navigation-planner.js +432 -0
- package/dist/server/navigation-planner.js.map +1 -0
- package/dist/server/navigation-trace.d.ts +19 -2
- package/dist/server/navigation-trace.js +20 -1
- package/dist/server/navigation-trace.js.map +1 -1
- package/dist/server/next-error-digest.d.ts +3 -2
- package/dist/server/next-error-digest.js +4 -2
- package/dist/server/next-error-digest.js.map +1 -1
- package/dist/server/normalize-path.d.ts +2 -1
- package/dist/server/normalize-path.js +4 -1
- package/dist/server/normalize-path.js.map +1 -1
- package/dist/server/pages-api-route.js +1 -0
- package/dist/server/pages-api-route.js.map +1 -1
- package/dist/server/pages-i18n.js.map +1 -1
- package/dist/server/pages-media-type.js.map +1 -1
- package/dist/server/pages-node-compat.js.map +1 -1
- package/dist/server/pages-page-data.d.ts +3 -2
- package/dist/server/pages-page-data.js +27 -5
- package/dist/server/pages-page-data.js.map +1 -1
- package/dist/server/pages-page-response.js +2 -1
- package/dist/server/pages-page-response.js.map +1 -1
- package/dist/server/prerender-work-unit-setup.js +1 -1
- package/dist/server/prerender-work-unit-setup.js.map +1 -1
- package/dist/server/prod-server.d.ts +28 -1
- package/dist/server/prod-server.js +97 -22
- package/dist/server/prod-server.js.map +1 -1
- package/dist/server/request-log.js.map +1 -1
- package/dist/server/request-pipeline.d.ts +1 -13
- package/dist/server/request-pipeline.js +3 -25
- package/dist/server/request-pipeline.js.map +1 -1
- package/dist/server/rsc-stream-hints.js.map +1 -1
- package/dist/server/seed-cache.js.map +1 -1
- package/dist/server/server-action-not-found.d.ts +16 -3
- package/dist/server/server-action-not-found.js +22 -4
- package/dist/server/server-action-not-found.js.map +1 -1
- package/dist/server/server-globals.d.ts +5 -0
- package/dist/server/server-globals.js +37 -0
- package/dist/server/server-globals.js.map +1 -0
- package/dist/server/socket-error-backstop.js.map +1 -1
- package/dist/server/static-file-cache.js +1 -1
- package/dist/server/static-file-cache.js.map +1 -1
- package/dist/server/worker-utils.d.ts +0 -7
- package/dist/server/worker-utils.js +3 -2
- package/dist/server/worker-utils.js.map +1 -1
- package/dist/shims/amp.js.map +1 -1
- package/dist/shims/app.d.ts +37 -4
- package/dist/shims/app.js +50 -1
- package/dist/shims/app.js.map +1 -0
- package/dist/shims/cache-for-request.js.map +1 -1
- package/dist/shims/cache-runtime.d.ts +19 -2
- package/dist/shims/cache-runtime.js +87 -19
- package/dist/shims/cache-runtime.js.map +1 -1
- package/dist/shims/cache.d.ts +20 -21
- package/dist/shims/cache.js +101 -15
- package/dist/shims/cache.js.map +1 -1
- package/dist/shims/client-hook-error.js.map +1 -1
- package/dist/shims/compat-router.js.map +1 -1
- package/dist/shims/config.js.map +1 -1
- package/dist/shims/constants.js.map +1 -1
- package/dist/shims/document.js.map +1 -1
- package/dist/shims/dynamic.d.ts +18 -10
- package/dist/shims/dynamic.js +107 -51
- package/dist/shims/dynamic.js.map +1 -1
- package/dist/shims/error-boundary.d.ts +35 -6
- package/dist/shims/error-boundary.js +116 -33
- package/dist/shims/error-boundary.js.map +1 -1
- package/dist/shims/error.d.ts +18 -1
- package/dist/shims/error.js +56 -1
- package/dist/shims/error.js.map +1 -1
- package/dist/shims/fetch-cache.d.ts +25 -1
- package/dist/shims/fetch-cache.js +159 -13
- package/dist/shims/fetch-cache.js.map +1 -1
- package/dist/shims/font-google-base.d.ts +22 -8
- package/dist/shims/font-google-base.js +41 -71
- package/dist/shims/font-google-base.js.map +1 -1
- package/dist/shims/font-local.d.ts +3 -20
- package/dist/shims/font-local.js +23 -75
- package/dist/shims/font-local.js.map +1 -1
- package/dist/shims/font-utils.d.ts +51 -0
- package/dist/shims/font-utils.js +97 -0
- package/dist/shims/font-utils.js.map +1 -0
- package/dist/shims/form.js +3 -1
- package/dist/shims/form.js.map +1 -1
- package/dist/shims/hash-scroll.d.ts +7 -0
- package/dist/shims/hash-scroll.js +30 -0
- package/dist/shims/hash-scroll.js.map +1 -0
- package/dist/shims/head-state.js.map +1 -1
- package/dist/shims/head.d.ts +3 -1
- package/dist/shims/head.js +28 -16
- package/dist/shims/head.js.map +1 -1
- package/dist/shims/headers.d.ts +11 -12
- package/dist/shims/headers.js +45 -8
- package/dist/shims/headers.js.map +1 -1
- package/dist/shims/i18n-context.js.map +1 -1
- package/dist/shims/i18n-state.js.map +1 -1
- package/dist/shims/image-config.d.ts +14 -1
- package/dist/shims/image-config.js +24 -1
- package/dist/shims/image-config.js.map +1 -1
- package/dist/shims/image.d.ts +1 -0
- package/dist/shims/image.js +159 -80
- package/dist/shims/image.js.map +1 -1
- package/dist/shims/internal/als-registry.js.map +1 -1
- package/dist/shims/internal/app-router-context.d.ts +7 -6
- package/dist/shims/internal/app-router-context.js +17 -6
- package/dist/shims/internal/app-router-context.js.map +1 -1
- package/dist/shims/internal/cookie-serialize.js.map +1 -1
- package/dist/shims/internal/make-hanging-promise.d.ts +1 -1
- package/dist/shims/internal/make-hanging-promise.js +1 -1
- package/dist/shims/internal/make-hanging-promise.js.map +1 -1
- package/dist/shims/internal/parse-cookie-header.js.map +1 -1
- package/dist/shims/internal/utils.js.map +1 -1
- package/dist/shims/internal/work-unit-async-storage.js +2 -2
- package/dist/shims/internal/work-unit-async-storage.js.map +1 -1
- package/dist/shims/layout-segment-context.js.map +1 -1
- package/dist/shims/legacy-image.js.map +1 -1
- package/dist/shims/link-prefetch.d.ts +42 -0
- package/dist/shims/link-prefetch.js +45 -0
- package/dist/shims/link-prefetch.js.map +1 -0
- package/dist/shims/link.d.ts +37 -4
- package/dist/shims/link.js +156 -46
- package/dist/shims/link.js.map +1 -1
- package/dist/shims/metadata.d.ts +16 -30
- package/dist/shims/metadata.js +87 -28
- package/dist/shims/metadata.js.map +1 -1
- package/dist/shims/navigation-state.js.map +1 -1
- package/dist/shims/navigation.d.ts +172 -10
- package/dist/shims/navigation.js +335 -70
- package/dist/shims/navigation.js.map +1 -1
- package/dist/shims/navigation.react-server.d.ts +3 -2
- package/dist/shims/navigation.react-server.js +5 -2
- package/dist/shims/navigation.react-server.js.map +1 -1
- package/dist/shims/offline.js.map +1 -1
- package/dist/shims/pages-router-runtime.d.ts +7 -0
- package/dist/shims/pages-router-runtime.js +16 -0
- package/dist/shims/pages-router-runtime.js.map +1 -0
- package/dist/shims/readonly-url-search-params.js.map +1 -1
- package/dist/shims/request-context.js.map +1 -1
- package/dist/shims/root-params.js.map +1 -1
- package/dist/shims/router-state.js.map +1 -1
- package/dist/shims/router.d.ts +69 -7
- package/dist/shims/router.js +232 -249
- package/dist/shims/router.js.map +1 -1
- package/dist/shims/script-nonce-context.js.map +1 -1
- package/dist/shims/script.js +110 -32
- package/dist/shims/script.js.map +1 -1
- package/dist/shims/server.js +12 -15
- package/dist/shims/server.js.map +1 -1
- package/dist/shims/slot.d.ts +7 -1
- package/dist/shims/slot.js +60 -7
- package/dist/shims/slot.js.map +1 -1
- package/dist/shims/thenable-params.js.map +1 -1
- package/dist/shims/unified-request-context.js +5 -0
- package/dist/shims/unified-request-context.js.map +1 -1
- package/dist/shims/unrecognized-action-error.d.ts +35 -0
- package/dist/shims/unrecognized-action-error.js +41 -0
- package/dist/shims/unrecognized-action-error.js.map +1 -0
- package/dist/shims/url-safety.js.map +1 -1
- package/dist/shims/url-utils.d.ts +22 -1
- package/dist/shims/url-utils.js +76 -3
- package/dist/shims/url-utils.js.map +1 -1
- package/dist/shims/use-merged-ref.js.map +1 -1
- package/dist/shims/web-vitals.d.ts +4 -21
- package/dist/shims/web-vitals.js +19 -6
- package/dist/shims/web-vitals.js.map +1 -1
- package/dist/utils/asset-prefix.d.ts +69 -0
- package/dist/utils/asset-prefix.js +91 -0
- package/dist/utils/asset-prefix.js.map +1 -0
- package/dist/utils/base-path.d.ts +7 -1
- package/dist/utils/base-path.js +10 -1
- package/dist/utils/base-path.js.map +1 -1
- package/dist/utils/cache-control-metadata.js.map +1 -1
- package/dist/utils/domain-locale.js.map +1 -1
- package/dist/utils/encode-cache-tag.d.ts +31 -0
- package/dist/utils/encode-cache-tag.js +38 -0
- package/dist/utils/encode-cache-tag.js.map +1 -0
- package/dist/utils/error-cause.js.map +1 -1
- package/dist/utils/hash.js.map +1 -1
- package/dist/utils/lazy-chunks.js.map +1 -1
- package/dist/utils/manifest-paths.js.map +1 -1
- package/dist/utils/mdx-scan.js.map +1 -1
- package/dist/utils/navigation-signal.d.ts +5 -0
- package/dist/utils/navigation-signal.js +14 -0
- package/dist/utils/navigation-signal.js.map +1 -0
- package/dist/utils/project.js.map +1 -1
- package/dist/utils/public-routes.js.map +1 -1
- package/dist/utils/query.js.map +1 -1
- package/dist/utils/safe-json-file.js.map +1 -1
- package/dist/utils/sorted-array.d.ts +9 -0
- package/dist/utils/sorted-array.js +22 -0
- package/dist/utils/sorted-array.js.map +1 -0
- package/dist/utils/text-stream.js.map +1 -1
- package/dist/utils/vinext-root.js.map +1 -1
- package/package.json +8 -6
|
@@ -1,26 +1,14 @@
|
|
|
1
|
+
import { normalizePathnameForRouteMatch } from "../routing/utils.js";
|
|
1
2
|
import { stripBasePath } from "../utils/base-path.js";
|
|
3
|
+
import { RSC_ACTION_HEADER, VINEXT_INTERCEPTION_CONTEXT_HEADER, VINEXT_MOUNTED_SLOTS_HEADER } from "./headers.js";
|
|
4
|
+
import { normalizePath } from "./normalize-path.js";
|
|
2
5
|
import { AppElementsWire } from "./app-elements-wire.js";
|
|
3
|
-
import { getMountedSlotIdsHeader } from "./app-elements.js";
|
|
6
|
+
import { getMountedSlotIds, getMountedSlotIdsHeader } from "./app-elements.js";
|
|
7
|
+
import { createHistoryStateWithNavigationMetadata, createHistoryStateWithPreviousNextUrl, readHistoryStatePreviousNextUrl, readHistoryStateTraversalIndex, resolveHistoryTraversalIntent } from "./app-history-state.js";
|
|
4
8
|
import { createRscRequestHeaders } from "./app-rsc-cache-busting.js";
|
|
5
|
-
import { NavigationTraceReasonCodes, createNavigationTrace } from "./navigation-trace.js";
|
|
9
|
+
import { NavigationTraceReasonCodes, createNavigationLifecycleTraceFields, createNavigationTrace } from "./navigation-trace.js";
|
|
10
|
+
import { navigationPlanner } from "./navigation-planner.js";
|
|
6
11
|
//#region src/server/app-browser-state.ts
|
|
7
|
-
const VINEXT_PREVIOUS_NEXT_URL_HISTORY_STATE_KEY = "__vinext_previousNextUrl";
|
|
8
|
-
function cloneHistoryState(state) {
|
|
9
|
-
if (!state || typeof state !== "object") return {};
|
|
10
|
-
const nextState = {};
|
|
11
|
-
for (const [key, value] of Object.entries(state)) nextState[key] = value;
|
|
12
|
-
return nextState;
|
|
13
|
-
}
|
|
14
|
-
function createHistoryStateWithPreviousNextUrl(state, previousNextUrl) {
|
|
15
|
-
const nextState = cloneHistoryState(state);
|
|
16
|
-
if (previousNextUrl === null) delete nextState[VINEXT_PREVIOUS_NEXT_URL_HISTORY_STATE_KEY];
|
|
17
|
-
else nextState[VINEXT_PREVIOUS_NEXT_URL_HISTORY_STATE_KEY] = previousNextUrl;
|
|
18
|
-
return Object.keys(nextState).length > 0 ? nextState : null;
|
|
19
|
-
}
|
|
20
|
-
function readHistoryStatePreviousNextUrl(state) {
|
|
21
|
-
const value = cloneHistoryState(state)[VINEXT_PREVIOUS_NEXT_URL_HISTORY_STATE_KEY];
|
|
22
|
-
return typeof value === "string" ? value : null;
|
|
23
|
-
}
|
|
24
12
|
function createOperationRecord(options) {
|
|
25
13
|
return {
|
|
26
14
|
id: options.id,
|
|
@@ -29,6 +17,15 @@ function createOperationRecord(options) {
|
|
|
29
17
|
state: "pending"
|
|
30
18
|
};
|
|
31
19
|
}
|
|
20
|
+
function normalizeNavigationSnapshotMatchedUrl(pathname) {
|
|
21
|
+
return normalizePath(normalizePathnameForRouteMatch(pathname));
|
|
22
|
+
}
|
|
23
|
+
function createRouteSnapshotRouteId(options) {
|
|
24
|
+
if (options.interception !== null) return options.routeId;
|
|
25
|
+
const parsed = AppElementsWire.parseElementKey(options.routeId);
|
|
26
|
+
if (parsed?.kind !== "route" || parsed.interceptionContext === null) return options.routeId;
|
|
27
|
+
return AppElementsWire.encodeRouteId(parsed.path, null);
|
|
28
|
+
}
|
|
32
29
|
function resolveInterceptionContextFromPreviousNextUrl(previousNextUrl, basePath = "") {
|
|
33
30
|
if (previousNextUrl === null) return null;
|
|
34
31
|
return stripBasePath(new URL(previousNextUrl, "http://localhost").pathname, basePath);
|
|
@@ -46,61 +43,167 @@ function resolveInterceptionContextFromPreviousNextUrl(previousNextUrl, basePath
|
|
|
46
43
|
*/
|
|
47
44
|
function resolveServerActionRequestState(options) {
|
|
48
45
|
const headers = createRscRequestHeaders();
|
|
49
|
-
headers.set(
|
|
46
|
+
headers.set(RSC_ACTION_HEADER, options.actionId);
|
|
50
47
|
const interceptionContext = resolveInterceptionContextFromPreviousNextUrl(options.previousNextUrl, options.basePath);
|
|
51
|
-
if (interceptionContext !== null) headers.set(
|
|
48
|
+
if (interceptionContext !== null) headers.set(VINEXT_INTERCEPTION_CONTEXT_HEADER, interceptionContext);
|
|
52
49
|
const mountedSlotsHeader = getMountedSlotIdsHeader(options.elements);
|
|
53
|
-
if (mountedSlotsHeader !== null) headers.set(
|
|
50
|
+
if (mountedSlotsHeader !== null) headers.set(VINEXT_MOUNTED_SLOTS_HEADER, mountedSlotsHeader);
|
|
54
51
|
return { headers };
|
|
55
52
|
}
|
|
56
|
-
function
|
|
57
|
-
|
|
53
|
+
function resolvePendingNavigationCommitDispositionDecision(options) {
|
|
54
|
+
const traceFields = createPendingNavigationTraceFields(options);
|
|
55
|
+
if (options.startedNavigationId !== options.activeNavigationId || options.pending.action.operation.startedVisibleCommitVersion !== options.currentState.visibleCommitVersion) return {
|
|
56
|
+
disposition: "skip",
|
|
57
|
+
preserveElementIds: [],
|
|
58
|
+
trace: createNavigationTrace(NavigationTraceReasonCodes.staleOperation, traceFields)
|
|
59
|
+
};
|
|
60
|
+
return mapNavigationDecisionToPendingDisposition(planPendingRootBoundaryFlightResponse({
|
|
61
|
+
currentState: options.currentState,
|
|
62
|
+
pending: options.pending,
|
|
63
|
+
routeManifest: options.routeManifest ?? null,
|
|
64
|
+
targetHref: options.targetHref,
|
|
65
|
+
traceFields
|
|
66
|
+
}));
|
|
67
|
+
}
|
|
68
|
+
function createPendingNavigationTraceFields(options) {
|
|
69
|
+
return {
|
|
70
|
+
...createNavigationLifecycleTraceFields({
|
|
71
|
+
activeNavigationId: options.activeNavigationId,
|
|
72
|
+
currentRootLayoutTreePath: options.currentState.rootLayoutTreePath,
|
|
73
|
+
currentVisibleCommitVersion: options.currentState.visibleCommitVersion,
|
|
74
|
+
nextRootLayoutTreePath: options.pending.rootLayoutTreePath,
|
|
75
|
+
startedNavigationId: options.startedNavigationId,
|
|
76
|
+
startedVisibleCommitVersion: options.pending.action.operation.startedVisibleCommitVersion
|
|
77
|
+
}),
|
|
78
|
+
...options.targetHref !== void 0 ? { targetHref: options.targetHref } : {}
|
|
79
|
+
};
|
|
58
80
|
}
|
|
59
|
-
function
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
if (shouldHardNavigate(options.currentRootLayoutTreePath, options.nextRootLayoutTreePath)) return "hard-navigate";
|
|
63
|
-
return "dispatch";
|
|
81
|
+
function createNavigationSnapshotUrl(snapshot) {
|
|
82
|
+
const query = snapshot.searchParams.toString();
|
|
83
|
+
return query === "" ? snapshot.pathname : `${snapshot.pathname}?${query}`;
|
|
64
84
|
}
|
|
65
|
-
function
|
|
66
|
-
const
|
|
67
|
-
const
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
85
|
+
function createMountedParallelSlotSnapshots(elements) {
|
|
86
|
+
const snapshots = [];
|
|
87
|
+
for (const slotId of getMountedSlotIds(elements)) {
|
|
88
|
+
const parsed = AppElementsWire.parseElementKey(slotId);
|
|
89
|
+
if (parsed?.kind !== "slot") continue;
|
|
90
|
+
snapshots.push({
|
|
91
|
+
ownerLayoutId: AppElementsWire.encodeLayoutId(parsed.treePath),
|
|
92
|
+
slotId
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
return snapshots;
|
|
96
|
+
}
|
|
97
|
+
function createVisibleRouteSnapshot(state) {
|
|
98
|
+
const displayUrl = createNavigationSnapshotUrl(state.navigationSnapshot);
|
|
99
|
+
const matchedUrl = normalizeNavigationSnapshotMatchedUrl(state.navigationSnapshot.pathname);
|
|
100
|
+
return {
|
|
101
|
+
displayUrl,
|
|
102
|
+
interception: state.interception,
|
|
103
|
+
interceptionContext: state.interceptionContext,
|
|
104
|
+
layoutIds: state.layoutIds,
|
|
105
|
+
matchedUrl,
|
|
106
|
+
mountedParallelSlots: createMountedParallelSlotSnapshots(state.elements),
|
|
107
|
+
rootBoundaryId: state.rootLayoutTreePath,
|
|
108
|
+
routeId: createRouteSnapshotRouteId({
|
|
109
|
+
interception: state.interception,
|
|
110
|
+
routeId: state.routeId
|
|
111
|
+
}),
|
|
112
|
+
slotBindings: state.slotBindings
|
|
74
113
|
};
|
|
114
|
+
}
|
|
115
|
+
function createPendingRouteSnapshot(pending) {
|
|
116
|
+
const displayUrl = createNavigationSnapshotUrl(pending.action.navigationSnapshot);
|
|
117
|
+
const matchedUrl = normalizeNavigationSnapshotMatchedUrl(pending.action.navigationSnapshot.pathname);
|
|
75
118
|
return {
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
119
|
+
displayUrl,
|
|
120
|
+
interception: pending.action.interception,
|
|
121
|
+
interceptionContext: pending.action.interceptionContext,
|
|
122
|
+
layoutIds: pending.action.layoutIds,
|
|
123
|
+
matchedUrl,
|
|
124
|
+
mountedParallelSlots: createMountedParallelSlotSnapshots(pending.action.elements),
|
|
125
|
+
rootBoundaryId: pending.rootLayoutTreePath,
|
|
126
|
+
routeId: createRouteSnapshotRouteId({
|
|
127
|
+
interception: pending.action.interception,
|
|
128
|
+
routeId: pending.routeId
|
|
129
|
+
}),
|
|
130
|
+
slotBindings: pending.action.slotBindings
|
|
82
131
|
};
|
|
83
132
|
}
|
|
84
|
-
function
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
133
|
+
function createPendingNavigationOperationToken(options) {
|
|
134
|
+
return {
|
|
135
|
+
baseVisibleCommitVersion: options.pending.action.operation.startedVisibleCommitVersion,
|
|
136
|
+
deploymentVersion: null,
|
|
137
|
+
graphVersion: options.routeManifest?.graphVersion ?? null,
|
|
138
|
+
lane: options.pending.action.operation.lane,
|
|
139
|
+
operationId: options.pending.action.operation.id,
|
|
140
|
+
targetSnapshotFingerprint: createRootBoundarySnapshotFingerprint(options.targetSnapshot)
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
function createRootBoundarySnapshotFingerprint(snapshot) {
|
|
144
|
+
return `${snapshot.routeId}|root:${snapshot.rootBoundaryId ?? "unknown"}`;
|
|
145
|
+
}
|
|
146
|
+
function planPendingRootBoundaryFlightResponse(options) {
|
|
147
|
+
const targetSnapshot = createPendingRouteSnapshot(options.pending);
|
|
148
|
+
const token = createPendingNavigationOperationToken({
|
|
149
|
+
pending: options.pending,
|
|
150
|
+
routeManifest: options.routeManifest,
|
|
151
|
+
targetSnapshot
|
|
152
|
+
});
|
|
153
|
+
return navigationPlanner.plan({
|
|
154
|
+
routeManifest: options.routeManifest,
|
|
155
|
+
state: {
|
|
156
|
+
nextOperationToken: token,
|
|
157
|
+
traceFields: options.traceFields,
|
|
158
|
+
visibleCommitVersion: options.currentState.visibleCommitVersion,
|
|
159
|
+
visibleSnapshot: createVisibleRouteSnapshot(options.currentState)
|
|
160
|
+
},
|
|
161
|
+
event: {
|
|
162
|
+
kind: "flightResponseArrived",
|
|
163
|
+
result: {
|
|
164
|
+
href: options.targetHref ?? targetSnapshot.displayUrl,
|
|
165
|
+
targetSnapshot
|
|
166
|
+
},
|
|
167
|
+
token
|
|
92
168
|
}
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
function mapNavigationDecisionToPendingDisposition(decision) {
|
|
172
|
+
switch (decision.kind) {
|
|
173
|
+
case "proposeCommit": return {
|
|
174
|
+
disposition: "dispatch",
|
|
175
|
+
preserveAbsentSlots: decision.proposal.preserveAbsentSlots,
|
|
176
|
+
preserveElementIds: decision.proposal.preserveElementIds,
|
|
177
|
+
preservePreviousSlotIds: decision.proposal.preservePreviousSlotIds,
|
|
178
|
+
trace: decision.trace
|
|
179
|
+
};
|
|
180
|
+
case "hardNavigate": return {
|
|
181
|
+
disposition: "hard-navigate",
|
|
182
|
+
preserveElementIds: [],
|
|
183
|
+
trace: decision.trace
|
|
184
|
+
};
|
|
185
|
+
case "noCommit": return {
|
|
186
|
+
disposition: "skip",
|
|
187
|
+
preserveElementIds: [],
|
|
188
|
+
trace: decision.trace
|
|
189
|
+
};
|
|
190
|
+
case "requestWork": throw new Error(`[vinext] Root-boundary commit planning returned requestWork (${decision.work.kind}); flightResponseArrived should never request work`);
|
|
191
|
+
default: throw new Error("[vinext] Unknown navigation decision: " + String(decision));
|
|
93
192
|
}
|
|
94
193
|
}
|
|
95
194
|
async function createPendingNavigationCommit(options) {
|
|
96
195
|
const elements = await options.nextElements;
|
|
97
196
|
const metadata = AppElementsWire.readMetadata(elements);
|
|
98
|
-
const
|
|
197
|
+
const requestedPreviousNextUrl = options.previousNextUrl !== void 0 ? options.previousNextUrl : options.currentState.previousNextUrl;
|
|
198
|
+
const previousNextUrl = metadata.interception === null ? null : requestedPreviousNextUrl;
|
|
99
199
|
return {
|
|
100
200
|
action: {
|
|
101
201
|
elements,
|
|
202
|
+
interception: metadata.interception,
|
|
102
203
|
interceptionContext: metadata.interceptionContext,
|
|
204
|
+
layoutIds: metadata.layoutIds,
|
|
103
205
|
layoutFlags: metadata.layoutFlags,
|
|
206
|
+
slotBindings: metadata.slotBindings,
|
|
104
207
|
navigationSnapshot: options.navigationSnapshot,
|
|
105
208
|
operation: createOperationRecord({
|
|
106
209
|
id: options.renderId,
|
|
@@ -113,6 +216,7 @@ async function createPendingNavigationCommit(options) {
|
|
|
113
216
|
routeId: metadata.routeId,
|
|
114
217
|
type: options.type
|
|
115
218
|
},
|
|
219
|
+
interception: metadata.interception,
|
|
116
220
|
interceptionContext: metadata.interceptionContext,
|
|
117
221
|
previousNextUrl,
|
|
118
222
|
rootLayoutTreePath: metadata.rootLayoutTreePath,
|
|
@@ -120,6 +224,6 @@ async function createPendingNavigationCommit(options) {
|
|
|
120
224
|
};
|
|
121
225
|
}
|
|
122
226
|
//#endregion
|
|
123
|
-
export { createHistoryStateWithPreviousNextUrl, createPendingNavigationCommit, readHistoryStatePreviousNextUrl,
|
|
227
|
+
export { createHistoryStateWithNavigationMetadata, createHistoryStateWithPreviousNextUrl, createPendingNavigationCommit, readHistoryStatePreviousNextUrl, readHistoryStateTraversalIndex, resolveHistoryTraversalIntent, resolveInterceptionContextFromPreviousNextUrl, resolvePendingNavigationCommitDispositionDecision, resolveServerActionRequestState };
|
|
124
228
|
|
|
125
229
|
//# sourceMappingURL=app-browser-state.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-browser-state.js","names":[],"sources":["../../src/server/app-browser-state.ts"],"sourcesContent":["import { stripBasePath } from \"../utils/base-path.js\";\nimport {\n AppElementsWire,\n getMountedSlotIdsHeader,\n type AppElements,\n type LayoutFlags,\n} from \"./app-elements.js\";\nimport { createRscRequestHeaders } from \"./app-rsc-cache-busting.js\";\nimport {\n NavigationTraceReasonCodes,\n createNavigationTrace,\n type NavigationTrace,\n type NavigationTraceReasonCode,\n} from \"./navigation-trace.js\";\nimport type { ClientNavigationRenderSnapshot } from \"vinext/shims/navigation\";\n\nconst VINEXT_PREVIOUS_NEXT_URL_HISTORY_STATE_KEY = \"__vinext_previousNextUrl\";\n\ntype HistoryStateRecord = {\n [key: string]: unknown;\n};\n\nexport type OperationLane = \"navigation\" | \"refresh\" | \"traverse\" | \"server-action\" | \"hmr\";\n\ntype OperationRecordBase = {\n id: number;\n lane: OperationLane;\n startedVisibleCommitVersion: number;\n};\n\nexport type PendingOperationRecord = OperationRecordBase & {\n state: \"pending\";\n};\n\nexport type CommittedOperationRecord = OperationRecordBase & {\n state: \"committed\";\n visibleCommitVersion: number;\n};\n\nexport type OperationRecord = PendingOperationRecord | CommittedOperationRecord;\n\nexport type AppRouterState = {\n activeOperation: OperationRecord | null;\n elements: AppElements;\n interceptionContext: string | null;\n layoutFlags: LayoutFlags;\n previousNextUrl: string | null;\n renderId: number;\n navigationSnapshot: ClientNavigationRenderSnapshot;\n rootLayoutTreePath: string | null;\n routeId: string;\n visibleCommitVersion: number;\n};\n\nexport type AppRouterAction = {\n elements: AppElements;\n interceptionContext: string | null;\n layoutFlags: LayoutFlags;\n navigationSnapshot: ClientNavigationRenderSnapshot;\n operation: PendingOperationRecord;\n previousNextUrl: string | null;\n renderId: number;\n rootLayoutTreePath: string | null;\n routeId: string;\n type: \"navigate\" | \"replace\" | \"traverse\";\n};\n\nexport type PendingNavigationCommit = {\n action: AppRouterAction;\n interceptionContext: string | null;\n previousNextUrl: string | null;\n rootLayoutTreePath: string | null;\n routeId: string;\n};\n\ntype PendingNavigationCommitDisposition = \"dispatch\" | \"hard-navigate\" | \"skip\";\ntype PendingNavigationCommitDispositionDecision = {\n disposition: PendingNavigationCommitDisposition;\n trace: NavigationTrace;\n};\n\nfunction cloneHistoryState(state: unknown): HistoryStateRecord {\n if (!state || typeof state !== \"object\") {\n return {};\n }\n\n const nextState: HistoryStateRecord = {};\n for (const [key, value] of Object.entries(state)) {\n nextState[key] = value;\n }\n return nextState;\n}\n\nexport function createHistoryStateWithPreviousNextUrl(\n state: unknown,\n previousNextUrl: string | null,\n): HistoryStateRecord | null {\n const nextState = cloneHistoryState(state);\n\n if (previousNextUrl === null) {\n delete nextState[VINEXT_PREVIOUS_NEXT_URL_HISTORY_STATE_KEY];\n } else {\n nextState[VINEXT_PREVIOUS_NEXT_URL_HISTORY_STATE_KEY] = previousNextUrl;\n }\n\n return Object.keys(nextState).length > 0 ? nextState : null;\n}\n\nexport function readHistoryStatePreviousNextUrl(state: unknown): string | null {\n const value = cloneHistoryState(state)[VINEXT_PREVIOUS_NEXT_URL_HISTORY_STATE_KEY];\n return typeof value === \"string\" ? value : null;\n}\n\nfunction createOperationRecord(options: {\n id: number;\n lane: OperationLane;\n startedVisibleCommitVersion: number;\n}): PendingOperationRecord {\n return {\n id: options.id,\n lane: options.lane,\n startedVisibleCommitVersion: options.startedVisibleCommitVersion,\n state: \"pending\",\n };\n}\n\nexport function resolveInterceptionContextFromPreviousNextUrl(\n previousNextUrl: string | null,\n basePath: string = \"\",\n): string | null {\n if (previousNextUrl === null) {\n return null;\n }\n\n const parsedUrl = new URL(previousNextUrl, \"http://localhost\");\n return stripBasePath(parsedUrl.pathname, basePath);\n}\n\ntype ResolveServerActionRequestStateOptions = {\n actionId: string;\n basePath: string;\n elements: AppElements;\n previousNextUrl: string | null;\n};\n\ntype ResolveServerActionRequestStateResult = {\n headers: Headers;\n};\n\n/**\n * Pure: builds the fetch Headers for a server-action POST. Carries the same\n * interception-context and mounted-slots headers the refresh path already\n * sends, so the server-action re-render can rebuild the intercepted tree\n * instead of replacing it with the direct route.\n *\n * Next.js sends `Next-URL: state.previousNextUrl || state.nextUrl` on action\n * POSTs when `hasInterceptionRouteInCurrentTree(state.tree)`. Vinext's\n * X-Vinext-Interception-Context is the equivalent signal for the server-side\n * `findIntercept` lookup.\n */\nexport function resolveServerActionRequestState(\n options: ResolveServerActionRequestStateOptions,\n): ResolveServerActionRequestStateResult {\n const headers = createRscRequestHeaders();\n headers.set(\"x-rsc-action\", options.actionId);\n\n const interceptionContext = resolveInterceptionContextFromPreviousNextUrl(\n options.previousNextUrl,\n options.basePath,\n );\n if (interceptionContext !== null) {\n headers.set(\"X-Vinext-Interception-Context\", interceptionContext);\n }\n\n const mountedSlotsHeader = getMountedSlotIdsHeader(options.elements);\n if (mountedSlotsHeader !== null) {\n headers.set(\"X-Vinext-Mounted-Slots\", mountedSlotsHeader);\n }\n\n return { headers };\n}\n\nexport function shouldHardNavigate(\n currentRootLayoutTreePath: string | null,\n nextRootLayoutTreePath: string | null,\n): boolean {\n // `null` means the payload could not identify an enclosing root layout\n // boundary. Treat that as soft-navigation compatible so fallback payloads\n // do not force a hard reload purely because metadata is absent.\n return (\n currentRootLayoutTreePath !== null &&\n nextRootLayoutTreePath !== null &&\n currentRootLayoutTreePath !== nextRootLayoutTreePath\n );\n}\n\nexport function resolvePendingNavigationCommitDisposition(options: {\n activeNavigationId: number;\n currentVisibleCommitVersion: number;\n currentRootLayoutTreePath: string | null;\n nextRootLayoutTreePath: string | null;\n startedNavigationId: number;\n startedVisibleCommitVersion: number;\n}): PendingNavigationCommitDisposition {\n if (options.startedNavigationId !== options.activeNavigationId) {\n return \"skip\";\n }\n\n if (options.startedVisibleCommitVersion !== options.currentVisibleCommitVersion) {\n return \"skip\";\n }\n\n if (shouldHardNavigate(options.currentRootLayoutTreePath, options.nextRootLayoutTreePath)) {\n return \"hard-navigate\";\n }\n\n return \"dispatch\";\n}\n\nexport function resolvePendingNavigationCommitDispositionDecision(options: {\n activeNavigationId: number;\n currentVisibleCommitVersion: number;\n currentRootLayoutTreePath: string | null;\n nextRootLayoutTreePath: string | null;\n startedNavigationId: number;\n startedVisibleCommitVersion: number;\n}): PendingNavigationCommitDispositionDecision {\n const disposition = resolvePendingNavigationCommitDisposition(options);\n const traceFields = {\n activeNavigationId: options.activeNavigationId,\n currentRootLayoutTreePath: options.currentRootLayoutTreePath,\n currentVisibleCommitVersion: options.currentVisibleCommitVersion,\n nextRootLayoutTreePath: options.nextRootLayoutTreePath,\n startedNavigationId: options.startedNavigationId,\n startedVisibleCommitVersion: options.startedVisibleCommitVersion,\n };\n\n return {\n disposition,\n trace: createNavigationTrace(\n getPendingNavigationCommitDispositionTraceCode({\n currentRootLayoutTreePath: options.currentRootLayoutTreePath,\n disposition,\n nextRootLayoutTreePath: options.nextRootLayoutTreePath,\n }),\n traceFields,\n ),\n };\n}\n\nfunction getPendingNavigationCommitDispositionTraceCode(options: {\n currentRootLayoutTreePath: string | null;\n disposition: PendingNavigationCommitDisposition;\n nextRootLayoutTreePath: string | null;\n}): NavigationTraceReasonCode {\n switch (options.disposition) {\n case \"skip\":\n return NavigationTraceReasonCodes.staleOperation;\n case \"hard-navigate\":\n return NavigationTraceReasonCodes.rootBoundaryChanged;\n case \"dispatch\":\n return options.currentRootLayoutTreePath === null || options.nextRootLayoutTreePath === null\n ? NavigationTraceReasonCodes.rootBoundaryUnknown\n : NavigationTraceReasonCodes.commitCurrent;\n default: {\n const _exhaustive: never = options.disposition;\n throw new Error(\"[vinext] Unknown navigation commit disposition: \" + String(_exhaustive));\n }\n }\n}\n\nexport async function createPendingNavigationCommit(options: {\n currentState: AppRouterState;\n nextElements: Promise<AppElements>;\n navigationSnapshot: ClientNavigationRenderSnapshot;\n operationLane: OperationLane;\n previousNextUrl?: string | null;\n renderId: number;\n type: \"navigate\" | \"replace\" | \"traverse\";\n}): Promise<PendingNavigationCommit> {\n const elements = await options.nextElements;\n const metadata = AppElementsWire.readMetadata(elements);\n const previousNextUrl =\n options.previousNextUrl !== undefined\n ? options.previousNextUrl\n : options.currentState.previousNextUrl;\n\n return {\n action: {\n elements,\n interceptionContext: metadata.interceptionContext,\n layoutFlags: metadata.layoutFlags,\n navigationSnapshot: options.navigationSnapshot,\n operation: createOperationRecord({\n id: options.renderId,\n lane: options.operationLane,\n startedVisibleCommitVersion: options.currentState.visibleCommitVersion,\n }),\n previousNextUrl,\n renderId: options.renderId,\n rootLayoutTreePath: metadata.rootLayoutTreePath,\n routeId: metadata.routeId,\n type: options.type,\n },\n // Convenience aliases — always equal action.interceptionContext / action.rootLayoutTreePath / action.routeId.\n interceptionContext: metadata.interceptionContext,\n previousNextUrl,\n rootLayoutTreePath: metadata.rootLayoutTreePath,\n routeId: metadata.routeId,\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"app-browser-state.js","names":["_exhaustive"],"sources":["../../src/server/app-browser-state.ts"],"sourcesContent":["import { stripBasePath } from \"../utils/base-path.js\";\nimport type { RouteManifest } from \"../routing/app-route-graph.js\";\nimport {\n AppElementsWire,\n getMountedSlotIds,\n getMountedSlotIdsHeader,\n type AppElements,\n type AppElementsInterception,\n type AppElementsSlotBinding,\n type LayoutFlags,\n} from \"./app-elements.js\";\nimport { createRscRequestHeaders } from \"./app-rsc-cache-busting.js\";\nimport {\n RSC_ACTION_HEADER,\n VINEXT_INTERCEPTION_CONTEXT_HEADER,\n VINEXT_MOUNTED_SLOTS_HEADER,\n} from \"./headers.js\";\nimport {\n NavigationTraceReasonCodes,\n createNavigationLifecycleTraceFields,\n createNavigationTrace,\n type NavigationTrace,\n type NavigationTraceFields,\n} from \"./navigation-trace.js\";\nimport {\n navigationPlanner,\n type MountedParallelSlotSnapshotV0,\n type NavigationDecisionV0,\n type OperationLane,\n type OperationToken,\n type RouteSnapshotV0,\n} from \"./navigation-planner.js\";\nimport type { ClientNavigationRenderSnapshot } from \"vinext/shims/navigation\";\nimport { normalizePathnameForRouteMatch } from \"../routing/utils.js\";\nimport { normalizePath } from \"./normalize-path.js\";\nexport {\n createHistoryStateWithNavigationMetadata,\n createHistoryStateWithPreviousNextUrl,\n readHistoryStatePreviousNextUrl,\n readHistoryStateTraversalIndex,\n resolveHistoryTraversalIntent,\n type HistoryTraversalIntent,\n} from \"./app-history-state.js\";\n\nexport type { OperationLane } from \"./navigation-planner.js\";\n\ntype OperationRecordBase = {\n id: number;\n lane: OperationLane;\n startedVisibleCommitVersion: number;\n};\n\nexport type PendingOperationRecord = OperationRecordBase & {\n state: \"pending\";\n};\n\nexport type CommittedOperationRecord = OperationRecordBase & {\n state: \"committed\";\n visibleCommitVersion: number;\n};\n\nexport type OperationRecord = PendingOperationRecord | CommittedOperationRecord;\n\nexport type AppRouterState = {\n activeOperation: OperationRecord | null;\n elements: AppElements;\n interception: AppElementsInterception | null;\n interceptionContext: string | null;\n layoutFlags: LayoutFlags;\n layoutIds: readonly string[];\n previousNextUrl: string | null;\n renderId: number;\n navigationSnapshot: ClientNavigationRenderSnapshot;\n rootLayoutTreePath: string | null;\n routeId: string;\n slotBindings: readonly AppElementsSlotBinding[];\n visibleCommitVersion: number;\n};\n\nexport type AppRouterAction = {\n elements: AppElements;\n interception: AppElementsInterception | null;\n interceptionContext: string | null;\n layoutFlags: LayoutFlags;\n layoutIds: readonly string[];\n navigationSnapshot: ClientNavigationRenderSnapshot;\n operation: PendingOperationRecord;\n previousNextUrl: string | null;\n renderId: number;\n rootLayoutTreePath: string | null;\n routeId: string;\n slotBindings: readonly AppElementsSlotBinding[];\n type: \"navigate\" | \"replace\" | \"traverse\";\n};\n\nexport type PendingNavigationCommit = {\n action: AppRouterAction;\n interception: AppElementsInterception | null;\n interceptionContext: string | null;\n previousNextUrl: string | null;\n rootLayoutTreePath: string | null;\n routeId: string;\n};\n\ntype PendingNavigationCommitDisposition = \"dispatch\" | \"hard-navigate\" | \"skip\";\ntype DispatchPendingNavigationCommitDispositionDecision = {\n disposition: \"dispatch\";\n preserveAbsentSlots: boolean;\n preserveElementIds: readonly string[];\n preservePreviousSlotIds: readonly string[];\n trace: NavigationTrace;\n};\ntype NonDispatchPendingNavigationCommitDispositionDecision = {\n disposition: Exclude<PendingNavigationCommitDisposition, \"dispatch\">;\n preserveElementIds: readonly [];\n trace: NavigationTrace;\n};\ntype PendingNavigationCommitDispositionDecision =\n | DispatchPendingNavigationCommitDispositionDecision\n | NonDispatchPendingNavigationCommitDispositionDecision;\nfunction createOperationRecord(options: {\n id: number;\n lane: OperationLane;\n startedVisibleCommitVersion: number;\n}): PendingOperationRecord {\n return {\n id: options.id,\n lane: options.lane,\n startedVisibleCommitVersion: options.startedVisibleCommitVersion,\n state: \"pending\",\n };\n}\n\nfunction normalizeNavigationSnapshotMatchedUrl(pathname: string): string {\n return normalizePath(normalizePathnameForRouteMatch(pathname));\n}\n\nfunction createRouteSnapshotRouteId(options: {\n interception: AppElementsInterception | null;\n routeId: string;\n}): string {\n if (options.interception !== null) return options.routeId;\n\n const parsed = AppElementsWire.parseElementKey(options.routeId);\n if (parsed?.kind !== \"route\" || parsed.interceptionContext === null) {\n return options.routeId;\n }\n\n // A context suffix keeps AppElements render keys partitioned, but without\n // explicit interception proof it is not semantic route authority.\n return AppElementsWire.encodeRouteId(parsed.path, null);\n}\n\nexport function resolveInterceptionContextFromPreviousNextUrl(\n previousNextUrl: string | null,\n basePath: string = \"\",\n): string | null {\n if (previousNextUrl === null) {\n return null;\n }\n\n const parsedUrl = new URL(previousNextUrl, \"http://localhost\");\n return stripBasePath(parsedUrl.pathname, basePath);\n}\n\ntype ResolveServerActionRequestStateOptions = {\n actionId: string;\n basePath: string;\n elements: AppElements;\n previousNextUrl: string | null;\n};\n\ntype ResolveServerActionRequestStateResult = {\n headers: Headers;\n};\n\n/**\n * Pure: builds the fetch Headers for a server-action POST. Carries the same\n * interception-context and mounted-slots headers the refresh path already\n * sends, so the server-action re-render can rebuild the intercepted tree\n * instead of replacing it with the direct route.\n *\n * Next.js sends `Next-URL: state.previousNextUrl || state.nextUrl` on action\n * POSTs when `hasInterceptionRouteInCurrentTree(state.tree)`. Vinext's\n * X-Vinext-Interception-Context is the equivalent signal for the server-side\n * `findIntercept` lookup.\n */\nexport function resolveServerActionRequestState(\n options: ResolveServerActionRequestStateOptions,\n): ResolveServerActionRequestStateResult {\n const headers = createRscRequestHeaders();\n headers.set(RSC_ACTION_HEADER, options.actionId);\n\n const interceptionContext = resolveInterceptionContextFromPreviousNextUrl(\n options.previousNextUrl,\n options.basePath,\n );\n if (interceptionContext !== null) {\n headers.set(VINEXT_INTERCEPTION_CONTEXT_HEADER, interceptionContext);\n }\n\n const mountedSlotsHeader = getMountedSlotIdsHeader(options.elements);\n if (mountedSlotsHeader !== null) {\n headers.set(VINEXT_MOUNTED_SLOTS_HEADER, mountedSlotsHeader);\n }\n\n return { headers };\n}\n\nexport function resolvePendingNavigationCommitDispositionDecision(options: {\n activeNavigationId: number;\n currentState: AppRouterState;\n pending: PendingNavigationCommit;\n routeManifest?: RouteManifest | null;\n startedNavigationId: number;\n targetHref?: string;\n}): PendingNavigationCommitDispositionDecision {\n const traceFields = createPendingNavigationTraceFields(options);\n\n if (\n options.startedNavigationId !== options.activeNavigationId ||\n options.pending.action.operation.startedVisibleCommitVersion !==\n options.currentState.visibleCommitVersion\n ) {\n return {\n disposition: \"skip\",\n preserveElementIds: [],\n trace: createNavigationTrace(NavigationTraceReasonCodes.staleOperation, traceFields),\n };\n }\n\n return mapNavigationDecisionToPendingDisposition(\n planPendingRootBoundaryFlightResponse({\n currentState: options.currentState,\n pending: options.pending,\n routeManifest: options.routeManifest ?? null,\n targetHref: options.targetHref,\n traceFields,\n }),\n );\n}\n\nfunction createPendingNavigationTraceFields(options: {\n activeNavigationId: number;\n currentState: AppRouterState;\n pending: PendingNavigationCommit;\n startedNavigationId: number;\n targetHref?: string;\n}): NavigationTraceFields {\n return {\n ...createNavigationLifecycleTraceFields({\n activeNavigationId: options.activeNavigationId,\n currentRootLayoutTreePath: options.currentState.rootLayoutTreePath,\n currentVisibleCommitVersion: options.currentState.visibleCommitVersion,\n nextRootLayoutTreePath: options.pending.rootLayoutTreePath,\n startedNavigationId: options.startedNavigationId,\n startedVisibleCommitVersion: options.pending.action.operation.startedVisibleCommitVersion,\n }),\n ...(options.targetHref !== undefined ? { targetHref: options.targetHref } : {}),\n };\n}\n\nfunction createNavigationSnapshotUrl(snapshot: ClientNavigationRenderSnapshot): string {\n const query = snapshot.searchParams.toString();\n return query === \"\" ? snapshot.pathname : `${snapshot.pathname}?${query}`;\n}\n\nfunction createMountedParallelSlotSnapshots(\n elements: AppElements,\n): readonly MountedParallelSlotSnapshotV0[] {\n const snapshots: MountedParallelSlotSnapshotV0[] = [];\n for (const slotId of getMountedSlotIds(elements)) {\n const parsed = AppElementsWire.parseElementKey(slotId);\n if (parsed?.kind !== \"slot\") continue;\n snapshots.push({\n ownerLayoutId: AppElementsWire.encodeLayoutId(parsed.treePath),\n slotId,\n });\n }\n return snapshots;\n}\n\nfunction createVisibleRouteSnapshot(state: AppRouterState): RouteSnapshotV0 {\n const displayUrl = createNavigationSnapshotUrl(state.navigationSnapshot);\n const matchedUrl = normalizeNavigationSnapshotMatchedUrl(state.navigationSnapshot.pathname);\n return {\n displayUrl,\n interception: state.interception,\n interceptionContext: state.interceptionContext,\n layoutIds: state.layoutIds,\n // `displayUrl` preserves the browser-visible URL for decisions and traces.\n // `matchedUrl` uses the route-state canonical pathname, matching the\n // server's segment-decoded representation without changing user-facing\n // navigation state such as usePathname().\n matchedUrl,\n mountedParallelSlots: createMountedParallelSlotSnapshots(state.elements),\n rootBoundaryId: state.rootLayoutTreePath,\n routeId: createRouteSnapshotRouteId({\n interception: state.interception,\n routeId: state.routeId,\n }),\n slotBindings: state.slotBindings,\n };\n}\n\nfunction createPendingRouteSnapshot(pending: PendingNavigationCommit): RouteSnapshotV0 {\n const displayUrl = createNavigationSnapshotUrl(pending.action.navigationSnapshot);\n const matchedUrl = normalizeNavigationSnapshotMatchedUrl(\n pending.action.navigationSnapshot.pathname,\n );\n return {\n displayUrl,\n interception: pending.action.interception,\n interceptionContext: pending.action.interceptionContext,\n layoutIds: pending.action.layoutIds,\n // See createVisibleRouteSnapshot: matchedUrl intentionally models the route\n // identity, not the address bar URL.\n matchedUrl,\n mountedParallelSlots: createMountedParallelSlotSnapshots(pending.action.elements),\n rootBoundaryId: pending.rootLayoutTreePath,\n routeId: createRouteSnapshotRouteId({\n interception: pending.action.interception,\n routeId: pending.routeId,\n }),\n slotBindings: pending.action.slotBindings,\n };\n}\n\nfunction createPendingNavigationOperationToken(options: {\n pending: PendingNavigationCommit;\n routeManifest: RouteManifest | null;\n targetSnapshot: RouteSnapshotV0;\n}): OperationToken {\n return {\n baseVisibleCommitVersion: options.pending.action.operation.startedVisibleCommitVersion,\n deploymentVersion: null,\n graphVersion: options.routeManifest?.graphVersion ?? null,\n lane: options.pending.action.operation.lane,\n operationId: options.pending.action.operation.id,\n targetSnapshotFingerprint: createRootBoundarySnapshotFingerprint(options.targetSnapshot),\n };\n}\n\nfunction createRootBoundarySnapshotFingerprint(snapshot: RouteSnapshotV0): string {\n return `${snapshot.routeId}|root:${snapshot.rootBoundaryId ?? \"unknown\"}`;\n}\n\nfunction planPendingRootBoundaryFlightResponse(options: {\n currentState: AppRouterState;\n pending: PendingNavigationCommit;\n routeManifest: RouteManifest | null;\n targetHref?: string;\n traceFields: NavigationTraceFields;\n}): NavigationDecisionV0 {\n const targetSnapshot = createPendingRouteSnapshot(options.pending);\n const token = createPendingNavigationOperationToken({\n pending: options.pending,\n routeManifest: options.routeManifest,\n targetSnapshot,\n });\n\n // #726-CORE-07/08 keeps the browser state layer as the lifecycle gate and\n // only translates committed AppElements metadata into planner snapshots.\n // RouteManifest now supplies graph-owned route topology while snapshots\n // continue to carry runtime state such as visible slot content.\n return navigationPlanner.plan({\n routeManifest: options.routeManifest,\n state: {\n nextOperationToken: token,\n traceFields: options.traceFields,\n visibleCommitVersion: options.currentState.visibleCommitVersion,\n visibleSnapshot: createVisibleRouteSnapshot(options.currentState),\n },\n event: {\n kind: \"flightResponseArrived\",\n result: {\n // Approval call sites must pass the executor's targetHref so the\n // planner trace and future hard-nav executor agree with the browser\n // URL. The fallback remains for lower-level tests and direct disposition\n // callers that exercise only snapshot-derived planner semantics.\n href: options.targetHref ?? targetSnapshot.displayUrl,\n targetSnapshot,\n },\n token,\n },\n });\n}\n\nfunction mapNavigationDecisionToPendingDisposition(\n decision: NavigationDecisionV0,\n): PendingNavigationCommitDispositionDecision {\n switch (decision.kind) {\n case \"proposeCommit\":\n return {\n disposition: \"dispatch\",\n preserveAbsentSlots: decision.proposal.preserveAbsentSlots,\n preserveElementIds: decision.proposal.preserveElementIds,\n preservePreviousSlotIds: decision.proposal.preservePreviousSlotIds,\n trace: decision.trace,\n };\n case \"hardNavigate\":\n return { disposition: \"hard-navigate\", preserveElementIds: [], trace: decision.trace };\n case \"noCommit\":\n return { disposition: \"skip\", preserveElementIds: [], trace: decision.trace };\n case \"requestWork\":\n throw new Error(\n `[vinext] Root-boundary commit planning returned requestWork (${decision.work.kind}); flightResponseArrived should never request work`,\n );\n default: {\n const _exhaustive: never = decision;\n throw new Error(\"[vinext] Unknown navigation decision: \" + String(_exhaustive));\n }\n }\n}\n\nexport async function createPendingNavigationCommit(options: {\n currentState: AppRouterState;\n nextElements: Promise<AppElements>;\n navigationSnapshot: ClientNavigationRenderSnapshot;\n operationLane: OperationLane;\n // Advisory: non-intercepted responses clear this even when callers pass the\n // current visible previousNextUrl.\n previousNextUrl?: string | null;\n renderId: number;\n type: \"navigate\" | \"replace\" | \"traverse\";\n}): Promise<PendingNavigationCommit> {\n const elements = await options.nextElements;\n const metadata = AppElementsWire.readMetadata(elements);\n const requestedPreviousNextUrl =\n options.previousNextUrl !== undefined\n ? options.previousNextUrl\n : options.currentState.previousNextUrl;\n const previousNextUrl = metadata.interception === null ? null : requestedPreviousNextUrl;\n\n return {\n action: {\n elements,\n interception: metadata.interception,\n interceptionContext: metadata.interceptionContext,\n layoutIds: metadata.layoutIds,\n layoutFlags: metadata.layoutFlags,\n slotBindings: metadata.slotBindings,\n navigationSnapshot: options.navigationSnapshot,\n operation: createOperationRecord({\n id: options.renderId,\n lane: options.operationLane,\n startedVisibleCommitVersion: options.currentState.visibleCommitVersion,\n }),\n previousNextUrl,\n renderId: options.renderId,\n rootLayoutTreePath: metadata.rootLayoutTreePath,\n routeId: metadata.routeId,\n type: options.type,\n },\n // Convenience aliases — always equal action.interceptionContext / action.rootLayoutTreePath / action.routeId.\n interception: metadata.interception,\n interceptionContext: metadata.interceptionContext,\n previousNextUrl,\n rootLayoutTreePath: metadata.rootLayoutTreePath,\n routeId: metadata.routeId,\n };\n}\n"],"mappings":"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"}
|
|
@@ -1,25 +1,30 @@
|
|
|
1
|
+
import { RSC_FORM_STATE_GLOBAL } from "./app-browser-hydration.js";
|
|
2
|
+
import { RscEmbeddedChunk } from "./app-rsc-embedded-chunks.js";
|
|
3
|
+
import { ReactFormState } from "react-dom/client";
|
|
4
|
+
|
|
1
5
|
//#region src/server/app-browser-stream.d.ts
|
|
2
6
|
type NavigationSnapshot = {
|
|
3
7
|
pathname: string;
|
|
4
8
|
searchParams: [string, string][];
|
|
5
9
|
};
|
|
6
10
|
type LegacyRscEmbedData = {
|
|
7
|
-
rsc:
|
|
11
|
+
rsc: RscEmbeddedChunk[];
|
|
8
12
|
params?: Record<string, string | string[]>;
|
|
9
13
|
nav?: NavigationSnapshot;
|
|
10
14
|
};
|
|
11
15
|
type VinextBrowserGlobals = {
|
|
12
16
|
__VINEXT_RSC__?: LegacyRscEmbedData;
|
|
13
|
-
__VINEXT_RSC_CHUNKS__?:
|
|
17
|
+
__VINEXT_RSC_CHUNKS__?: RscEmbeddedChunk[];
|
|
14
18
|
__VINEXT_RSC_DONE__?: boolean;
|
|
19
|
+
[RSC_FORM_STATE_GLOBAL]?: ReactFormState;
|
|
15
20
|
__VINEXT_RSC_PARAMS__?: Record<string, string | string[]>;
|
|
16
21
|
__VINEXT_RSC_NAV__?: NavigationSnapshot;
|
|
17
22
|
};
|
|
18
23
|
declare function getVinextBrowserGlobal(): typeof globalThis & VinextBrowserGlobals;
|
|
19
24
|
/**
|
|
20
|
-
* Convert embedded
|
|
25
|
+
* Convert embedded chunks back to a ReadableStream of Uint8Array chunks.
|
|
21
26
|
*/
|
|
22
|
-
declare function chunksToReadableStream(chunks: readonly
|
|
27
|
+
declare function chunksToReadableStream(chunks: readonly RscEmbeddedChunk[]): ReadableStream<Uint8Array>;
|
|
23
28
|
/**
|
|
24
29
|
* Create a ReadableStream from progressively-embedded RSC chunks.
|
|
25
30
|
*
|
|
@@ -1,14 +1,17 @@
|
|
|
1
|
+
import { decodeRscEmbeddedChunk } from "./app-rsc-embedded-chunks.js";
|
|
1
2
|
//#region src/server/app-browser-stream.ts
|
|
2
3
|
function getVinextBrowserGlobal() {
|
|
3
4
|
return globalThis;
|
|
4
5
|
}
|
|
6
|
+
function createUnexpectedRscStreamCloseError() {
|
|
7
|
+
return /* @__PURE__ */ new Error("The connection to the page was unexpectedly closed, possibly due to the stop button being clicked, loss of Wi-Fi, or an unstable internet connection.");
|
|
8
|
+
}
|
|
5
9
|
/**
|
|
6
|
-
* Convert embedded
|
|
10
|
+
* Convert embedded chunks back to a ReadableStream of Uint8Array chunks.
|
|
7
11
|
*/
|
|
8
12
|
function chunksToReadableStream(chunks) {
|
|
9
|
-
const encoder = new TextEncoder();
|
|
10
13
|
return new ReadableStream({ start(controller) {
|
|
11
|
-
for (const chunk of chunks) controller.enqueue(
|
|
14
|
+
for (const chunk of chunks) controller.enqueue(decodeRscEmbeddedChunk(chunk));
|
|
12
15
|
controller.close();
|
|
13
16
|
} });
|
|
14
17
|
}
|
|
@@ -20,32 +23,50 @@ function chunksToReadableStream(chunks) {
|
|
|
20
23
|
* instead of polling with setTimeout.
|
|
21
24
|
*/
|
|
22
25
|
function createProgressiveRscStream() {
|
|
23
|
-
const encoder = new TextEncoder();
|
|
24
26
|
return new ReadableStream({ start(controller) {
|
|
25
27
|
const vinext = getVinextBrowserGlobal();
|
|
26
28
|
const initialChunks = vinext.__VINEXT_RSC_CHUNKS__ ?? [];
|
|
27
|
-
for (const chunk of initialChunks) controller.enqueue(
|
|
29
|
+
for (const chunk of initialChunks) controller.enqueue(decodeRscEmbeddedChunk(chunk));
|
|
28
30
|
if (vinext.__VINEXT_RSC_DONE__) {
|
|
29
31
|
controller.close();
|
|
30
32
|
return;
|
|
31
33
|
}
|
|
32
34
|
let closed = false;
|
|
35
|
+
let cancelDocumentCompletionCheck;
|
|
36
|
+
const cancelPendingDocumentCompletionCheck = () => {
|
|
37
|
+
const cancel = cancelDocumentCompletionCheck;
|
|
38
|
+
cancelDocumentCompletionCheck = void 0;
|
|
39
|
+
cancel?.();
|
|
40
|
+
};
|
|
33
41
|
const closeOnce = () => {
|
|
34
42
|
if (!closed) {
|
|
35
43
|
closed = true;
|
|
44
|
+
cancelPendingDocumentCompletionCheck();
|
|
36
45
|
controller.close();
|
|
37
46
|
}
|
|
38
47
|
};
|
|
48
|
+
const errorOnce = () => {
|
|
49
|
+
if (!closed) {
|
|
50
|
+
closed = true;
|
|
51
|
+
cancelPendingDocumentCompletionCheck();
|
|
52
|
+
controller.error(createUnexpectedRscStreamCloseError());
|
|
53
|
+
}
|
|
54
|
+
};
|
|
39
55
|
const arr = vinext.__VINEXT_RSC_CHUNKS__ ??= [];
|
|
40
56
|
arr.push = function(...chunks) {
|
|
41
57
|
const length = Array.prototype.push.apply(this, chunks);
|
|
42
58
|
if (closed) return length;
|
|
43
|
-
for (const chunk of chunks) controller.enqueue(
|
|
59
|
+
for (const chunk of chunks) controller.enqueue(decodeRscEmbeddedChunk(chunk));
|
|
44
60
|
if (vinext.__VINEXT_RSC_DONE__) closeOnce();
|
|
45
61
|
return length;
|
|
46
62
|
};
|
|
47
|
-
if (typeof document !== "undefined") if (document.readyState === "loading")
|
|
48
|
-
|
|
63
|
+
if (typeof document !== "undefined") if (document.readyState === "loading") {
|
|
64
|
+
document.addEventListener("DOMContentLoaded", errorOnce);
|
|
65
|
+
cancelDocumentCompletionCheck = () => document.removeEventListener("DOMContentLoaded", errorOnce);
|
|
66
|
+
} else {
|
|
67
|
+
const timeoutId = setTimeout(errorOnce);
|
|
68
|
+
cancelDocumentCompletionCheck = () => clearTimeout(timeoutId);
|
|
69
|
+
}
|
|
49
70
|
} });
|
|
50
71
|
}
|
|
51
72
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-browser-stream.js","names":[],"sources":["../../src/server/app-browser-stream.ts"],"sourcesContent":["type NavigationSnapshot = {\n pathname: string;\n searchParams: [string, string][];\n};\n\ntype LegacyRscEmbedData = {\n rsc:
|
|
1
|
+
{"version":3,"file":"app-browser-stream.js","names":[],"sources":["../../src/server/app-browser-stream.ts"],"sourcesContent":["import type { ReactFormState } from \"react-dom/client\";\nimport { RSC_FORM_STATE_GLOBAL } from \"./app-browser-hydration.js\";\nimport { decodeRscEmbeddedChunk, type RscEmbeddedChunk } from \"./app-rsc-embedded-chunks.js\";\n\ntype NavigationSnapshot = {\n pathname: string;\n searchParams: [string, string][];\n};\n\ntype LegacyRscEmbedData = {\n rsc: RscEmbeddedChunk[];\n params?: Record<string, string | string[]>;\n nav?: NavigationSnapshot;\n};\n\ntype VinextBrowserGlobals = {\n __VINEXT_RSC__?: LegacyRscEmbedData;\n __VINEXT_RSC_CHUNKS__?: RscEmbeddedChunk[];\n __VINEXT_RSC_DONE__?: boolean;\n [RSC_FORM_STATE_GLOBAL]?: ReactFormState;\n __VINEXT_RSC_PARAMS__?: Record<string, string | string[]>;\n __VINEXT_RSC_NAV__?: NavigationSnapshot;\n};\n\nexport function getVinextBrowserGlobal(): typeof globalThis & VinextBrowserGlobals {\n return globalThis as typeof globalThis & VinextBrowserGlobals;\n}\n\nfunction createUnexpectedRscStreamCloseError(): Error {\n return new Error(\n \"The connection to the page was unexpectedly closed, possibly due to the stop button being clicked, loss of Wi-Fi, or an unstable internet connection.\",\n );\n}\n\n/**\n * Convert embedded chunks back to a ReadableStream of Uint8Array chunks.\n */\nexport function chunksToReadableStream(\n chunks: readonly RscEmbeddedChunk[],\n): ReadableStream<Uint8Array> {\n return new ReadableStream<Uint8Array>({\n start(controller) {\n for (const chunk of chunks) {\n controller.enqueue(decodeRscEmbeddedChunk(chunk));\n }\n controller.close();\n },\n });\n}\n\n/**\n * Create a ReadableStream from progressively-embedded RSC chunks.\n *\n * The server pushes chunks into `__VINEXT_RSC_CHUNKS__` via inline <script>\n * tags. We monkey-patch `push()` so new chunks stream to React immediately\n * instead of polling with setTimeout.\n */\nexport function createProgressiveRscStream(): ReadableStream<Uint8Array> {\n return new ReadableStream<Uint8Array>({\n start(controller) {\n const vinext = getVinextBrowserGlobal();\n const initialChunks = vinext.__VINEXT_RSC_CHUNKS__ ?? [];\n\n for (const chunk of initialChunks) {\n controller.enqueue(decodeRscEmbeddedChunk(chunk));\n }\n\n if (vinext.__VINEXT_RSC_DONE__) {\n controller.close();\n return;\n }\n\n let closed = false;\n let cancelDocumentCompletionCheck: (() => void) | undefined;\n const cancelPendingDocumentCompletionCheck = () => {\n const cancel = cancelDocumentCompletionCheck;\n cancelDocumentCompletionCheck = undefined;\n cancel?.();\n };\n const closeOnce = () => {\n if (!closed) {\n closed = true;\n cancelPendingDocumentCompletionCheck();\n controller.close();\n }\n };\n const errorOnce = () => {\n if (!closed) {\n closed = true;\n cancelPendingDocumentCompletionCheck();\n controller.error(createUnexpectedRscStreamCloseError());\n }\n };\n\n const arr = (vinext.__VINEXT_RSC_CHUNKS__ ??= []);\n arr.push = function (...chunks: RscEmbeddedChunk[]): number {\n const length = Array.prototype.push.apply(this, chunks);\n\n if (closed) return length;\n\n for (const chunk of chunks) {\n controller.enqueue(decodeRscEmbeddedChunk(chunk));\n }\n\n if (vinext.__VINEXT_RSC_DONE__) {\n closeOnce();\n }\n\n return length;\n };\n\n if (typeof document !== \"undefined\") {\n if (document.readyState === \"loading\") {\n document.addEventListener(\"DOMContentLoaded\", errorOnce);\n cancelDocumentCompletionCheck = () =>\n document.removeEventListener(\"DOMContentLoaded\", errorOnce);\n } else {\n const timeoutId = setTimeout(errorOnce);\n cancelDocumentCompletionCheck = () => clearTimeout(timeoutId);\n }\n }\n },\n });\n}\n"],"mappings":";;AAwBA,SAAgB,yBAAmE;CACjF,OAAO;;AAGT,SAAS,sCAA6C;CACpD,uBAAO,IAAI,MACT,wJACD;;;;;AAMH,SAAgB,uBACd,QAC4B;CAC5B,OAAO,IAAI,eAA2B,EACpC,MAAM,YAAY;EAChB,KAAK,MAAM,SAAS,QAClB,WAAW,QAAQ,uBAAuB,MAAM,CAAC;EAEnD,WAAW,OAAO;IAErB,CAAC;;;;;;;;;AAUJ,SAAgB,6BAAyD;CACvE,OAAO,IAAI,eAA2B,EACpC,MAAM,YAAY;EAChB,MAAM,SAAS,wBAAwB;EACvC,MAAM,gBAAgB,OAAO,yBAAyB,EAAE;EAExD,KAAK,MAAM,SAAS,eAClB,WAAW,QAAQ,uBAAuB,MAAM,CAAC;EAGnD,IAAI,OAAO,qBAAqB;GAC9B,WAAW,OAAO;GAClB;;EAGF,IAAI,SAAS;EACb,IAAI;EACJ,MAAM,6CAA6C;GACjD,MAAM,SAAS;GACf,gCAAgC,KAAA;GAChC,UAAU;;EAEZ,MAAM,kBAAkB;GACtB,IAAI,CAAC,QAAQ;IACX,SAAS;IACT,sCAAsC;IACtC,WAAW,OAAO;;;EAGtB,MAAM,kBAAkB;GACtB,IAAI,CAAC,QAAQ;IACX,SAAS;IACT,sCAAsC;IACtC,WAAW,MAAM,qCAAqC,CAAC;;;EAI3D,MAAM,MAAO,OAAO,0BAA0B,EAAE;EAChD,IAAI,OAAO,SAAU,GAAG,QAAoC;GAC1D,MAAM,SAAS,MAAM,UAAU,KAAK,MAAM,MAAM,OAAO;GAEvD,IAAI,QAAQ,OAAO;GAEnB,KAAK,MAAM,SAAS,QAClB,WAAW,QAAQ,uBAAuB,MAAM,CAAC;GAGnD,IAAI,OAAO,qBACT,WAAW;GAGb,OAAO;;EAGT,IAAI,OAAO,aAAa,aACtB,IAAI,SAAS,eAAe,WAAW;GACrC,SAAS,iBAAiB,oBAAoB,UAAU;GACxD,sCACE,SAAS,oBAAoB,oBAAoB,UAAU;SACxD;GACL,MAAM,YAAY,WAAW,UAAU;GACvC,sCAAsC,aAAa,UAAU;;IAIpE,CAAC"}
|
|
@@ -1,11 +1,16 @@
|
|
|
1
|
+
import { RouteManifest } from "../routing/app-route-graph.js";
|
|
1
2
|
import { ClientNavigationRenderSnapshot } from "../shims/navigation.js";
|
|
2
3
|
import { AppElements } from "./app-elements-wire.js";
|
|
3
4
|
import { NavigationTrace } from "./navigation-trace.js";
|
|
4
|
-
import {
|
|
5
|
+
import { OperationLane } from "./navigation-planner.js";
|
|
6
|
+
import { AppRouterAction, AppRouterState, PendingNavigationCommit } from "./app-browser-state.js";
|
|
5
7
|
|
|
6
8
|
//#region src/server/app-browser-visible-commit.d.ts
|
|
7
9
|
type VisibleCommitDecision = {
|
|
8
10
|
disposition: "commit";
|
|
11
|
+
preserveAbsentSlots: boolean;
|
|
12
|
+
preserveElementIds: readonly string[];
|
|
13
|
+
preservePreviousSlotIds: readonly string[];
|
|
9
14
|
trace: NavigationTrace;
|
|
10
15
|
};
|
|
11
16
|
type HardNavigateCommitDecision = {
|
|
@@ -22,6 +27,7 @@ type ApprovedVisibleCommit = {
|
|
|
22
27
|
readonly [approvedVisibleCommitBrand]: true;
|
|
23
28
|
readonly action: AppRouterAction;
|
|
24
29
|
readonly decision: VisibleCommitDecision;
|
|
30
|
+
readonly interception: AppRouterAction["interception"];
|
|
25
31
|
readonly interceptionContext: string | null;
|
|
26
32
|
readonly previousNextUrl: string | null;
|
|
27
33
|
readonly rootLayoutTreePath: string | null;
|
|
@@ -48,7 +54,9 @@ declare function approvePendingNavigationCommit(options: {
|
|
|
48
54
|
activeNavigationId: number;
|
|
49
55
|
currentState: AppRouterState;
|
|
50
56
|
pending: PendingNavigationCommit;
|
|
57
|
+
routeManifest?: RouteManifest | null;
|
|
51
58
|
startedNavigationId: number;
|
|
59
|
+
targetHref: string;
|
|
52
60
|
}): CommitApproval;
|
|
53
61
|
declare function resolveAndClassifyNavigationCommit(options: {
|
|
54
62
|
activeNavigationId: number;
|
|
@@ -60,7 +68,9 @@ declare function resolveAndClassifyNavigationCommit(options: {
|
|
|
60
68
|
operationLane: OperationLane;
|
|
61
69
|
previousNextUrl?: string | null;
|
|
62
70
|
renderId: number;
|
|
71
|
+
routeManifest?: RouteManifest | null;
|
|
63
72
|
startedNavigationId: number;
|
|
73
|
+
targetHref: string;
|
|
64
74
|
type: "navigate" | "replace" | "traverse";
|
|
65
75
|
}): Promise<ClassifiedPendingNavigationCommit>;
|
|
66
76
|
//#endregion
|