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,10 +1,58 @@
|
|
|
1
1
|
import { activateNavigationSnapshot, clearPendingPathname, commitClientNavigationState } from "../shims/navigation.js";
|
|
2
|
+
import { shouldScheduleRefreshForDiscardedServerAction } from "./app-browser-action-result.js";
|
|
2
3
|
import { createPendingNavigationCommit } from "./app-browser-state.js";
|
|
3
4
|
import { applyApprovedVisibleCommit, approveHmrVisibleCommit, approvePendingNavigationCommit, resolveAndClassifyNavigationCommit } from "./app-browser-visible-commit.js";
|
|
4
5
|
import { startTransition, useLayoutEffect } from "react";
|
|
5
6
|
//#region src/server/app-browser-navigation-controller.ts
|
|
7
|
+
const HARD_NAVIGATION_LOOP_GUARD_KEY = "__vinext_hard_navigation_target__";
|
|
8
|
+
function normalizeBrowserHref(href) {
|
|
9
|
+
try {
|
|
10
|
+
return new URL(href, window.location.href).href;
|
|
11
|
+
} catch {
|
|
12
|
+
return href;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
function readHardNavigationLoopGuard() {
|
|
16
|
+
try {
|
|
17
|
+
return window.sessionStorage.getItem(HARD_NAVIGATION_LOOP_GUARD_KEY);
|
|
18
|
+
} catch {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
function writeHardNavigationLoopGuard(targetHref) {
|
|
23
|
+
try {
|
|
24
|
+
window.sessionStorage.setItem(HARD_NAVIGATION_LOOP_GUARD_KEY, targetHref);
|
|
25
|
+
return window.sessionStorage.getItem(HARD_NAVIGATION_LOOP_GUARD_KEY) === targetHref;
|
|
26
|
+
} catch {
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function clearHardNavigationLoopGuard() {
|
|
31
|
+
try {
|
|
32
|
+
window.sessionStorage.removeItem(HARD_NAVIGATION_LOOP_GUARD_KEY);
|
|
33
|
+
} catch {}
|
|
34
|
+
}
|
|
35
|
+
function performHardNavigationWithLoopGuard(href, mode = "assign") {
|
|
36
|
+
const targetHref = normalizeBrowserHref(href);
|
|
37
|
+
const currentHref = normalizeBrowserHref(window.location.href);
|
|
38
|
+
if (readHardNavigationLoopGuard() === targetHref && currentHref === targetHref) {
|
|
39
|
+
clearHardNavigationLoopGuard();
|
|
40
|
+
console.error(`[vinext] Prevented repeated hard navigation to ${targetHref}; leaving the current document in place to avoid a reload loop.`);
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
if (!writeHardNavigationLoopGuard(targetHref) && currentHref === targetHref) {
|
|
44
|
+
console.error(`[vinext] Hard navigation to ${targetHref} requires a reload-loop guard, but sessionStorage is unavailable; leaving the current document in place.`);
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
if (mode === "replace") window.location.replace(href);
|
|
48
|
+
else window.location.assign(href);
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
6
51
|
function createAppBrowserNavigationController(deps = {}) {
|
|
7
52
|
const commitClientNavigationStateImpl = deps.commitClientNavigationState ?? commitClientNavigationState;
|
|
53
|
+
const performHardNavigation = deps.performHardNavigation ?? performHardNavigationWithLoopGuard;
|
|
54
|
+
const getRouteManifest = deps.getRouteManifest ?? (() => null);
|
|
55
|
+
const syncHistoryStatePreviousNextUrl = deps.syncHistoryStatePreviousNextUrl ?? (() => {});
|
|
8
56
|
let nextNavigationRenderId = 0;
|
|
9
57
|
let activeNavigationId = 0;
|
|
10
58
|
const pendingNavigationCommits = /* @__PURE__ */ new Map();
|
|
@@ -41,6 +89,9 @@ function createAppBrowserNavigationController(deps = {}) {
|
|
|
41
89
|
activeNavigationId += 1;
|
|
42
90
|
return activeNavigationId;
|
|
43
91
|
}
|
|
92
|
+
function getActiveNavigationId() {
|
|
93
|
+
return activeNavigationId;
|
|
94
|
+
}
|
|
44
95
|
function allocateRenderId() {
|
|
45
96
|
nextNavigationRenderId += 1;
|
|
46
97
|
return nextNavigationRenderId;
|
|
@@ -134,7 +185,7 @@ function createAppBrowserNavigationController(deps = {}) {
|
|
|
134
185
|
type: "replace"
|
|
135
186
|
});
|
|
136
187
|
if (!hasBrowserRouterState()) return;
|
|
137
|
-
|
|
188
|
+
dispatchSynchronousVisibleCommit(approveHmrVisibleCommit(pending));
|
|
138
189
|
}
|
|
139
190
|
function NavigationCommitSignal({ renderId, children }) {
|
|
140
191
|
useLayoutEffect(() => {
|
|
@@ -149,17 +200,22 @@ function createAppBrowserNavigationController(deps = {}) {
|
|
|
149
200
|
}, [renderId]);
|
|
150
201
|
return children;
|
|
151
202
|
}
|
|
152
|
-
function dispatchApprovedVisibleCommit(commit, pendingRouterState
|
|
203
|
+
function dispatchApprovedVisibleCommit(commit, pendingRouterState) {
|
|
153
204
|
const setter = getBrowserRouterStateSetter();
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
205
|
+
if (pendingRouterState) {
|
|
206
|
+
resolvePendingBrowserRouterState(pendingRouterState, commit);
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
startTransition(() => {
|
|
159
210
|
setter(applyApprovedVisibleCommit(getBrowserRouterState(), commit));
|
|
160
|
-
};
|
|
161
|
-
|
|
162
|
-
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
function dispatchSynchronousVisibleCommit(commit) {
|
|
214
|
+
getBrowserRouterStateSetter()(applyApprovedVisibleCommit(getBrowserRouterState(), commit));
|
|
215
|
+
}
|
|
216
|
+
function notifyDiscardedServerActionRevalidation(lifecycleOptions) {
|
|
217
|
+
if (!shouldScheduleRefreshForDiscardedServerAction(lifecycleOptions?.revalidation ?? "none")) return;
|
|
218
|
+
lifecycleOptions?.onDiscardedRevalidation?.();
|
|
163
219
|
}
|
|
164
220
|
async function renderNavigationPayload(options) {
|
|
165
221
|
const renderId = allocateRenderId();
|
|
@@ -183,7 +239,9 @@ function createAppBrowserNavigationController(deps = {}) {
|
|
|
183
239
|
activeNavigationId,
|
|
184
240
|
currentState: getBrowserRouterState(),
|
|
185
241
|
pending,
|
|
186
|
-
|
|
242
|
+
routeManifest: getRouteManifest(),
|
|
243
|
+
startedNavigationId: options.navId,
|
|
244
|
+
targetHref: options.targetHref
|
|
187
245
|
});
|
|
188
246
|
if (approval.decision.disposition === "no-commit") {
|
|
189
247
|
settlePendingBrowserRouterState(options.pendingRouterState);
|
|
@@ -194,8 +252,7 @@ function createAppBrowserNavigationController(deps = {}) {
|
|
|
194
252
|
if (approval.decision.disposition === "hard-navigate") {
|
|
195
253
|
settlePendingBrowserRouterState(options.pendingRouterState);
|
|
196
254
|
pendingNavigationCommits.delete(renderId);
|
|
197
|
-
|
|
198
|
-
return "hard-navigate";
|
|
255
|
+
return performHardNavigation(options.targetHref) ? "hard-navigate" : "no-commit";
|
|
199
256
|
}
|
|
200
257
|
const approvedCommit = approval.approvedCommit;
|
|
201
258
|
if (approvedCommit === null) throw new Error("[vinext] Commit decision did not approve a visible commit");
|
|
@@ -204,11 +261,12 @@ function createAppBrowserNavigationController(deps = {}) {
|
|
|
204
261
|
historyUpdateMode: options.historyUpdateMode,
|
|
205
262
|
navId: options.navId,
|
|
206
263
|
params: options.params,
|
|
207
|
-
previousNextUrl: approvedCommit.previousNextUrl
|
|
264
|
+
previousNextUrl: approvedCommit.previousNextUrl,
|
|
265
|
+
targetHistoryIndex: options.targetHistoryIndex
|
|
208
266
|
}));
|
|
209
267
|
activateNavigationSnapshot();
|
|
210
268
|
snapshotActivated = true;
|
|
211
|
-
dispatchApprovedVisibleCommit(approvedCommit, options.pendingRouterState
|
|
269
|
+
dispatchApprovedVisibleCommit(approvedCommit, options.pendingRouterState);
|
|
212
270
|
} catch (error) {
|
|
213
271
|
pendingNavigationPrePaintEffects.delete(renderId);
|
|
214
272
|
pendingNavigationCommits.delete(renderId);
|
|
@@ -219,9 +277,10 @@ function createAppBrowserNavigationController(deps = {}) {
|
|
|
219
277
|
}
|
|
220
278
|
return committed.then(() => "committed");
|
|
221
279
|
}
|
|
222
|
-
async function commitSameUrlNavigatePayload(nextElements, navigationSnapshot, returnValue, actionInitiationState) {
|
|
280
|
+
async function commitSameUrlNavigatePayload(nextElements, navigationSnapshot, returnValue, actionInitiationState, lifecycleOptions) {
|
|
223
281
|
const currentState = actionInitiationState ?? getBrowserRouterState();
|
|
224
|
-
const startedNavigationId = activeNavigationId;
|
|
282
|
+
const startedNavigationId = lifecycleOptions?.startedNavigationId ?? activeNavigationId;
|
|
283
|
+
const targetHref = lifecycleOptions?.targetHref ?? window.location.href;
|
|
225
284
|
const { approvedCommit, decision, pending, trace: _navigationTrace } = await resolveAndClassifyNavigationCommit({
|
|
226
285
|
activeNavigationId,
|
|
227
286
|
currentState,
|
|
@@ -232,10 +291,12 @@ function createAppBrowserNavigationController(deps = {}) {
|
|
|
232
291
|
renderId: allocateRenderId(),
|
|
233
292
|
operationLane: "server-action",
|
|
234
293
|
startedNavigationId,
|
|
294
|
+
routeManifest: getRouteManifest(),
|
|
295
|
+
targetHref,
|
|
235
296
|
type: "navigate"
|
|
236
297
|
});
|
|
237
298
|
if (decision.disposition === "hard-navigate") {
|
|
238
|
-
|
|
299
|
+
performHardNavigation(targetHref);
|
|
239
300
|
return;
|
|
240
301
|
}
|
|
241
302
|
if (approvedCommit) {
|
|
@@ -243,14 +304,19 @@ function createAppBrowserNavigationController(deps = {}) {
|
|
|
243
304
|
activeNavigationId,
|
|
244
305
|
currentState: getBrowserRouterState(),
|
|
245
306
|
pending,
|
|
246
|
-
|
|
307
|
+
routeManifest: getRouteManifest(),
|
|
308
|
+
startedNavigationId,
|
|
309
|
+
targetHref
|
|
247
310
|
});
|
|
248
311
|
if (latestApproval.decision.disposition === "hard-navigate") {
|
|
249
|
-
|
|
312
|
+
performHardNavigation(targetHref);
|
|
250
313
|
return;
|
|
251
314
|
}
|
|
252
|
-
if (latestApproval.approvedCommit)
|
|
253
|
-
|
|
315
|
+
if (latestApproval.approvedCommit) {
|
|
316
|
+
dispatchSynchronousVisibleCommit(latestApproval.approvedCommit);
|
|
317
|
+
syncHistoryStatePreviousNextUrl(latestApproval.approvedCommit.previousNextUrl);
|
|
318
|
+
} else notifyDiscardedServerActionRevalidation(lifecycleOptions);
|
|
319
|
+
} else if (decision.disposition === "no-commit") notifyDiscardedServerActionRevalidation(lifecycleOptions);
|
|
254
320
|
if (returnValue) {
|
|
255
321
|
if (!returnValue.ok) throw returnValue.data;
|
|
256
322
|
return returnValue.data;
|
|
@@ -270,6 +336,7 @@ function createAppBrowserNavigationController(deps = {}) {
|
|
|
270
336
|
}
|
|
271
337
|
return {
|
|
272
338
|
beginNavigation,
|
|
339
|
+
getActiveNavigationId,
|
|
273
340
|
hasBrowserRouterState,
|
|
274
341
|
getBrowserRouterState,
|
|
275
342
|
isCurrentNavigation,
|
|
@@ -285,6 +352,6 @@ function createAppBrowserNavigationController(deps = {}) {
|
|
|
285
352
|
};
|
|
286
353
|
}
|
|
287
354
|
//#endregion
|
|
288
|
-
export { createAppBrowserNavigationController };
|
|
355
|
+
export { clearHardNavigationLoopGuard, createAppBrowserNavigationController };
|
|
289
356
|
|
|
290
357
|
//# sourceMappingURL=app-browser-navigation-controller.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-browser-navigation-controller.js","names":[],"sources":["../../src/server/app-browser-navigation-controller.ts"],"sourcesContent":["import { startTransition, useLayoutEffect, type Dispatch, type ReactNode } from \"react\";\nimport {\n activateNavigationSnapshot,\n clearPendingPathname,\n commitClientNavigationState,\n} from \"vinext/shims/navigation\";\nimport type { ClientNavigationRenderSnapshot } from \"vinext/shims/navigation\";\nimport {\n createPendingNavigationCommit,\n type AppRouterState,\n type OperationLane,\n} from \"./app-browser-state.js\";\nimport {\n applyApprovedVisibleCommit,\n approveHmrVisibleCommit,\n approvePendingNavigationCommit,\n resolveAndClassifyNavigationCommit,\n type ApprovedVisibleCommit,\n} from \"./app-browser-visible-commit.js\";\nimport type { AppElements } from \"./app-elements.js\";\n\nexport type HistoryUpdateMode = \"push\" | \"replace\";\n\nexport type PendingBrowserRouterState = {\n promise: Promise<AppRouterState>;\n resolve: (state: AppRouterState) => void;\n settled: boolean;\n};\nexport type NavigationPayloadOutcome = \"committed\" | \"no-commit\" | \"hard-navigate\";\n\ntype BrowserNavigationCommitEffectFactory = (options: {\n href: string;\n historyUpdateMode: HistoryUpdateMode | undefined;\n navId: number;\n params: Record<string, string | string[]>;\n previousNextUrl: string | null;\n}) => () => void;\n\ntype BrowserRouterStateRef = {\n current: AppRouterState;\n};\n\ntype BrowserNavigationControllerDeps = {\n commitClientNavigationState?: typeof commitClientNavigationState;\n};\n\ntype BrowserNavigationController = {\n beginNavigation(): number;\n hasBrowserRouterState(): boolean;\n getBrowserRouterState(): AppRouterState;\n isCurrentNavigation(navId: number): boolean;\n waitForBrowserRouterStateReady(): Promise<void>;\n attachBrowserRouterState(\n setter: Dispatch<AppRouterState | Promise<AppRouterState>>,\n stateRef: BrowserRouterStateRef,\n ): () => void;\n beginPendingBrowserRouterState(): PendingBrowserRouterState;\n finalizeNavigation(navId: number, pending: PendingBrowserRouterState | null | undefined): void;\n renderNavigationPayload(options: {\n actionType: \"navigate\" | \"replace\" | \"traverse\";\n createNavigationCommitEffect: BrowserNavigationCommitEffectFactory;\n historyUpdateMode: HistoryUpdateMode | undefined;\n navigationSnapshot: ClientNavigationRenderSnapshot;\n nextElements: Promise<AppElements>;\n operationLane: OperationLane;\n params: Record<string, string | string[]>;\n pendingRouterState: PendingBrowserRouterState | null;\n previousNextUrl: string | null;\n targetHref: string;\n navId: number;\n useTransition?: boolean;\n }): Promise<NavigationPayloadOutcome>;\n commitSameUrlNavigatePayload(\n nextElements: Promise<AppElements>,\n navigationSnapshot: ClientNavigationRenderSnapshot,\n returnValue?: { ok: boolean; data: unknown },\n actionInitiationState?: AppRouterState,\n ): Promise<unknown>;\n hmrReplaceTree(\n nextElements: Promise<AppElements>,\n navigationSnapshot: ClientNavigationRenderSnapshot,\n ): Promise<void>;\n /**\n * Force-drain the queued pre-paint effect for the given renderId without\n * waiting for NavigationCommitSignal to commit. Used by the dev recovery\n * boundary in app-browser-entry.ts: when a render error replaces\n * NavigationCommitSignal with the boundary's null fallback, its\n * useLayoutEffect never fires, so the URL update for the in-flight\n * navigation would otherwise be lost.\n */\n drainPrePaintEffects(renderId: number): void;\n NavigationCommitSignal(\n this: void,\n {\n renderId,\n children,\n }: {\n renderId: number;\n children?: ReactNode;\n },\n ): ReactNode;\n};\n\nexport function createAppBrowserNavigationController(\n deps: BrowserNavigationControllerDeps = {},\n): BrowserNavigationController {\n const commitClientNavigationStateImpl =\n deps.commitClientNavigationState ?? commitClientNavigationState;\n\n // These are plain module-level variables (inside the controller closure),\n // unlike ClientNavigationState which uses Symbol.for to survive multiple\n // Vite module instances. The browser entry is loaded exactly once (via the\n // RSC plugin's generated bootstrap), so the controller running in a single\n // module instance is safe. If that assumption ever changes, these should be\n // migrated to a Symbol.for-backed global.\n //\n // The most severe consequence of multiple instances would be Map fragmentation:\n // pendingNavigationCommits and pendingNavigationPrePaintEffects would split\n // across instances, so drainPrePaintEffects in one instance could never drain\n // effects queued by the other, permanently leaking navigationSnapshotActiveCount\n // and causing hooks to prefer stale snapshot values indefinitely.\n let nextNavigationRenderId = 0;\n let activeNavigationId = 0;\n const pendingNavigationCommits = new Map<number, () => void>();\n const pendingNavigationPrePaintEffects = new Map<number, () => void>();\n\n let setBrowserRouterState: Dispatch<AppRouterState | Promise<AppRouterState>> | null = null;\n let browserRouterStateRef: BrowserRouterStateRef | null = null;\n let activePendingBrowserRouterState: PendingBrowserRouterState | null = null;\n let resolveBrowserRouterStateReady: (() => void) | null = null;\n let browserRouterStateReadyPromise: Promise<void> | null = null;\n let browserRouterStateHasCommitted = false;\n\n function getBrowserRouterStateSetter(): Dispatch<AppRouterState | Promise<AppRouterState>> {\n if (!setBrowserRouterState) {\n throw new Error(\"[vinext] Browser router state setter is not initialized\");\n }\n return setBrowserRouterState;\n }\n\n function getBrowserRouterState(): AppRouterState {\n if (!browserRouterStateRef) {\n throw new Error(\"[vinext] Browser router state is not initialized\");\n }\n return browserRouterStateRef.current;\n }\n\n function waitForBrowserRouterStateReady(): Promise<void> {\n if (browserRouterStateRef || browserRouterStateHasCommitted) {\n return Promise.resolve();\n }\n\n if (!browserRouterStateReadyPromise) {\n browserRouterStateReadyPromise = new Promise((resolve) => {\n resolveBrowserRouterStateReady = resolve;\n });\n }\n\n return browserRouterStateReadyPromise;\n }\n\n function markBrowserRouterStateReady(): void {\n browserRouterStateHasCommitted = true;\n const resolveReady = resolveBrowserRouterStateReady;\n resolveBrowserRouterStateReady = null;\n browserRouterStateReadyPromise = null;\n resolveReady?.();\n }\n\n function beginNavigation(): number {\n activeNavigationId += 1;\n return activeNavigationId;\n }\n\n function allocateRenderId(): number {\n nextNavigationRenderId += 1;\n return nextNavigationRenderId;\n }\n\n function hasBrowserRouterState(): boolean {\n return browserRouterStateRef !== null;\n }\n\n function isCurrentNavigation(navId: number): boolean {\n return navId === activeNavigationId;\n }\n\n function beginPendingBrowserRouterState(): PendingBrowserRouterState {\n const setter = getBrowserRouterStateSetter();\n\n if (activePendingBrowserRouterState && !activePendingBrowserRouterState.settled) {\n activePendingBrowserRouterState.settled = true;\n activePendingBrowserRouterState.resolve(getBrowserRouterState());\n }\n\n let resolvePending: ((state: AppRouterState) => void) | undefined;\n const promise = new Promise<AppRouterState>((resolve) => {\n resolvePending = resolve;\n });\n\n if (!resolvePending) {\n throw new Error(\"[vinext] Failed to initialize browser router promise\");\n }\n\n const pending: PendingBrowserRouterState = {\n promise,\n resolve: resolvePending,\n settled: false,\n };\n\n activePendingBrowserRouterState = pending;\n setter(promise);\n\n return pending;\n }\n\n function settlePendingBrowserRouterState(\n pending: PendingBrowserRouterState | null | undefined,\n ): void {\n if (!pending || pending.settled) return;\n\n pending.settled = true;\n pending.resolve(getBrowserRouterState());\n\n if (activePendingBrowserRouterState === pending) {\n activePendingBrowserRouterState = null;\n }\n }\n\n function finalizeNavigation(\n navId: number,\n pending: PendingBrowserRouterState | null | undefined,\n ): void {\n settlePendingBrowserRouterState(pending);\n\n if (isCurrentNavigation(navId)) {\n clearPendingPathname(navId);\n }\n }\n\n function resolvePendingBrowserRouterState(\n pending: PendingBrowserRouterState | null | undefined,\n commit: ApprovedVisibleCommit,\n ): void {\n if (!pending || pending.settled) return;\n\n pending.settled = true;\n pending.resolve(applyApprovedVisibleCommit(getBrowserRouterState(), commit));\n\n if (activePendingBrowserRouterState === pending) {\n activePendingBrowserRouterState = null;\n }\n }\n\n function queuePrePaintNavigationEffect(renderId: number, effect: (() => void) | null): void {\n if (!effect) {\n return;\n }\n pendingNavigationPrePaintEffects.set(renderId, effect);\n }\n\n /**\n * Run all queued pre-paint effects for renderIds up to and including the\n * given renderId. When React supersedes a startTransition update (rapid\n * clicks on same-route links), the superseded NavigationCommitSignal never\n * mounts, so its pre-paint effect never fires. By draining all effects\n * <= the committed renderId here, the winning transition cleans up after\n * any superseded ones, keeping the counter balanced.\n *\n * Invariant: each superseded navigation gets a commitClientNavigationState()\n * to balance the activateNavigationSnapshot() from its renderNavigationPayload call.\n */\n function drainPrePaintEffects(upToRenderId: number): void {\n for (const [id, effect] of pendingNavigationPrePaintEffects) {\n if (id > upToRenderId) {\n continue;\n }\n\n pendingNavigationPrePaintEffects.delete(id);\n if (id === upToRenderId) {\n effect();\n } else {\n // Superseded navigations still need to balance the snapshot counter.\n commitClientNavigationStateImpl(undefined, { releaseSnapshot: true });\n }\n }\n }\n\n /**\n * Resolve all pending navigation commits with renderId <= the committed renderId.\n * Note: Map iteration handles concurrent deletion safely — entries are visited in\n * insertion order and deletion doesn't affect the iterator's view of remaining entries.\n * This pattern is also used in drainPrePaintEffects with the same semantics.\n */\n function resolveCommittedNavigations(renderId: number): void {\n for (const [pendingId, resolve] of pendingNavigationCommits) {\n if (pendingId > renderId) {\n continue;\n }\n\n pendingNavigationCommits.delete(pendingId);\n resolve();\n }\n }\n\n async function hmrReplaceTree(\n nextElements: Promise<AppElements>,\n navigationSnapshot: ClientNavigationRenderSnapshot,\n ): Promise<void> {\n if (!hasBrowserRouterState()) return;\n\n const currentState = getBrowserRouterState();\n const renderId = allocateRenderId();\n const pending = await createPendingNavigationCommit({\n currentState,\n nextElements,\n navigationSnapshot,\n operationLane: \"hmr\",\n renderId,\n type: \"replace\",\n });\n\n // createPendingNavigationCommit awaits the new RSC payload. While\n // suspended, the prior broken render can unmount BrowserRoot. Re-check\n // before dispatching so a racing unmount doesn't surface as an\n // initialized-setter error.\n if (!hasBrowserRouterState()) return;\n\n dispatchApprovedVisibleCommit(approveHmrVisibleCommit(pending), null, false);\n }\n\n function NavigationCommitSignal(\n this: void,\n {\n renderId,\n children,\n }: {\n renderId: number;\n children?: ReactNode;\n },\n ): ReactNode {\n useLayoutEffect(() => {\n drainPrePaintEffects(renderId);\n\n const frame = requestAnimationFrame(() => {\n resolveCommittedNavigations(renderId);\n });\n\n return () => {\n cancelAnimationFrame(frame);\n // Resolve pending commits to prevent callers from hanging if React\n // unmounts this component without committing (e.g., error boundary).\n resolveCommittedNavigations(renderId);\n };\n }, [renderId]);\n\n return children;\n }\n\n function dispatchApprovedVisibleCommit(\n commit: ApprovedVisibleCommit,\n pendingRouterState: PendingBrowserRouterState | null,\n useTransitionMode: boolean,\n ): void {\n const setter = getBrowserRouterStateSetter();\n\n const applyAction = () => {\n if (pendingRouterState) {\n // The programmatic navigation is already running inside React.startTransition\n // (from router.push/replace/refresh), so resolving the deferred promise is\n // sufficient — no additional startTransition wrapper is needed below.\n resolvePendingBrowserRouterState(pendingRouterState, commit);\n return;\n }\n\n setter(applyApprovedVisibleCommit(getBrowserRouterState(), commit));\n };\n\n if (useTransitionMode) {\n startTransition(applyAction);\n } else {\n applyAction();\n }\n }\n\n async function renderNavigationPayload(options: {\n actionType: \"navigate\" | \"replace\" | \"traverse\";\n createNavigationCommitEffect: BrowserNavigationCommitEffectFactory;\n historyUpdateMode: HistoryUpdateMode | undefined;\n navigationSnapshot: ClientNavigationRenderSnapshot;\n nextElements: Promise<AppElements>;\n operationLane: OperationLane;\n params: Record<string, string | string[]>;\n pendingRouterState: PendingBrowserRouterState | null;\n previousNextUrl: string | null;\n targetHref: string;\n navId: number;\n useTransition?: boolean;\n }): Promise<NavigationPayloadOutcome> {\n const renderId = allocateRenderId();\n let resolveCommitted: (() => void) | undefined;\n const committed = new Promise<void>((resolve) => {\n resolveCommitted = resolve;\n pendingNavigationCommits.set(renderId, resolve);\n });\n\n let snapshotActivated = false;\n try {\n const startedState = getBrowserRouterState();\n const pending = await createPendingNavigationCommit({\n currentState: startedState,\n nextElements: options.nextElements,\n navigationSnapshot: options.navigationSnapshot,\n operationLane: options.operationLane,\n previousNextUrl: options.previousNextUrl,\n renderId,\n type: options.actionType,\n });\n\n const approval = approvePendingNavigationCommit({\n activeNavigationId,\n currentState: getBrowserRouterState(),\n pending,\n startedNavigationId: options.navId,\n });\n\n if (approval.decision.disposition === \"no-commit\") {\n settlePendingBrowserRouterState(options.pendingRouterState);\n pendingNavigationCommits.delete(renderId);\n resolveCommitted?.();\n return \"no-commit\";\n }\n\n if (approval.decision.disposition === \"hard-navigate\") {\n settlePendingBrowserRouterState(options.pendingRouterState);\n pendingNavigationCommits.delete(renderId);\n window.location.assign(options.targetHref);\n return \"hard-navigate\";\n }\n\n const approvedCommit = approval.approvedCommit;\n if (approvedCommit === null) {\n throw new Error(\"[vinext] Commit decision did not approve a visible commit\");\n }\n\n queuePrePaintNavigationEffect(\n renderId,\n options.createNavigationCommitEffect({\n href: options.targetHref,\n historyUpdateMode: options.historyUpdateMode,\n navId: options.navId,\n params: options.params,\n previousNextUrl: approvedCommit.previousNextUrl,\n }),\n );\n activateNavigationSnapshot();\n snapshotActivated = true;\n dispatchApprovedVisibleCommit(\n approvedCommit,\n options.pendingRouterState,\n options.useTransition ?? true,\n );\n } catch (error) {\n pendingNavigationPrePaintEffects.delete(renderId);\n pendingNavigationCommits.delete(renderId);\n if (snapshotActivated) {\n commitClientNavigationStateImpl(options.navId);\n }\n settlePendingBrowserRouterState(options.pendingRouterState);\n resolveCommitted?.();\n throw error;\n }\n\n return committed.then(() => \"committed\");\n }\n\n async function commitSameUrlNavigatePayload(\n nextElements: Promise<AppElements>,\n navigationSnapshot: ClientNavigationRenderSnapshot,\n returnValue?: { ok: boolean; data: unknown },\n actionInitiationState?: AppRouterState,\n ): Promise<unknown> {\n const currentState = actionInitiationState ?? getBrowserRouterState();\n const startedNavigationId = activeNavigationId;\n const {\n approvedCommit,\n decision,\n pending,\n // Intentionally retained as #726-OPS-01 trace-shell scaffolding. The\n // same-URL action path can consume this trace once later lifecycle gates\n // need an observable commit explanation.\n trace: _navigationTrace,\n } = await resolveAndClassifyNavigationCommit({\n activeNavigationId,\n currentState,\n getActiveNavigationId: () => activeNavigationId,\n getCurrentStateForApproval: getBrowserRouterState,\n navigationSnapshot,\n nextElements,\n renderId: allocateRenderId(),\n operationLane: \"server-action\",\n startedNavigationId,\n type: \"navigate\",\n });\n\n if (decision.disposition === \"hard-navigate\") {\n window.location.assign(window.location.href);\n return undefined;\n }\n\n if (approvedCommit) {\n // The helper approval and this continuation are separated by a microtask\n // boundary, so re-check lifecycle authority before mutating visible UI.\n const latestApproval = approvePendingNavigationCommit({\n activeNavigationId,\n currentState: getBrowserRouterState(),\n pending,\n startedNavigationId,\n });\n\n if (latestApproval.decision.disposition === \"hard-navigate\") {\n window.location.assign(window.location.href);\n return undefined;\n }\n\n if (latestApproval.approvedCommit) {\n dispatchApprovedVisibleCommit(latestApproval.approvedCommit, null, false);\n }\n }\n\n // Same-URL server actions still return their action value even if the UI\n // update was skipped due to a superseding navigation. That preserves the\n // existing caller contract; a future Phase 2 router state model could make\n // skipped UI updates observable to the caller without conflating them here.\n if (returnValue) {\n if (!returnValue.ok) {\n throw returnValue.data;\n }\n return returnValue.data;\n }\n\n return undefined;\n }\n\n function attachBrowserRouterState(\n setter: Dispatch<AppRouterState | Promise<AppRouterState>>,\n stateRef: BrowserRouterStateRef,\n ): () => void {\n setBrowserRouterState = setter;\n browserRouterStateRef = stateRef;\n markBrowserRouterStateReady();\n\n return () => {\n if (setBrowserRouterState === setter) {\n setBrowserRouterState = null;\n }\n if (browserRouterStateRef === stateRef) {\n browserRouterStateRef = null;\n browserRouterStateHasCommitted = false;\n }\n };\n }\n\n return {\n beginNavigation,\n hasBrowserRouterState,\n getBrowserRouterState,\n isCurrentNavigation,\n waitForBrowserRouterStateReady,\n attachBrowserRouterState,\n beginPendingBrowserRouterState,\n finalizeNavigation,\n renderNavigationPayload,\n commitSameUrlNavigatePayload,\n hmrReplaceTree,\n drainPrePaintEffects,\n NavigationCommitSignal,\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"app-browser-navigation-controller.js","names":[],"sources":["../../src/server/app-browser-navigation-controller.ts"],"sourcesContent":["import { startTransition, useLayoutEffect, type Dispatch, type ReactNode } from \"react\";\nimport {\n activateNavigationSnapshot,\n clearPendingPathname,\n commitClientNavigationState,\n} from \"vinext/shims/navigation\";\nimport type { ClientNavigationRenderSnapshot } from \"vinext/shims/navigation\";\nimport type { RouteManifest } from \"../routing/app-route-graph.js\";\nimport {\n createPendingNavigationCommit,\n type AppRouterState,\n type OperationLane,\n} from \"./app-browser-state.js\";\nimport {\n applyApprovedVisibleCommit,\n approveHmrVisibleCommit,\n approvePendingNavigationCommit,\n resolveAndClassifyNavigationCommit,\n type ApprovedVisibleCommit,\n} from \"./app-browser-visible-commit.js\";\nimport {\n shouldScheduleRefreshForDiscardedServerAction,\n type ServerActionRevalidationKind,\n} from \"./app-browser-action-result.js\";\nimport type { AppElements } from \"./app-elements.js\";\n\nexport type HistoryUpdateMode = \"push\" | \"replace\";\n\nexport type PendingBrowserRouterState = {\n promise: Promise<AppRouterState>;\n resolve: (state: AppRouterState) => void;\n settled: boolean;\n};\nexport type NavigationPayloadOutcome = \"committed\" | \"no-commit\" | \"hard-navigate\";\ntype HardNavigationMode = \"assign\" | \"replace\";\n\ntype BrowserNavigationCommitEffectFactory = (options: {\n href: string;\n historyUpdateMode: HistoryUpdateMode | undefined;\n navId: number;\n params: Record<string, string | string[]>;\n previousNextUrl: string | null;\n targetHistoryIndex?: number | null;\n}) => () => void;\n\ntype BrowserRouterStateRef = {\n current: AppRouterState;\n};\n\ntype SameUrlServerActionLifecycleOptions = {\n onDiscardedRevalidation?: () => void;\n revalidation?: ServerActionRevalidationKind;\n startedNavigationId?: number;\n targetHref?: string;\n};\n\ntype BrowserNavigationControllerDeps = {\n commitClientNavigationState?: typeof commitClientNavigationState;\n performHardNavigation?: (href: string, mode?: HardNavigationMode) => boolean;\n getRouteManifest?: () => RouteManifest | null;\n syncHistoryStatePreviousNextUrl?: (previousNextUrl: string | null) => void;\n};\n\ntype BrowserNavigationController = {\n beginNavigation(): number;\n getActiveNavigationId(): number;\n hasBrowserRouterState(): boolean;\n getBrowserRouterState(): AppRouterState;\n isCurrentNavigation(navId: number): boolean;\n waitForBrowserRouterStateReady(): Promise<void>;\n attachBrowserRouterState(\n setter: Dispatch<AppRouterState | Promise<AppRouterState>>,\n stateRef: BrowserRouterStateRef,\n ): () => void;\n beginPendingBrowserRouterState(): PendingBrowserRouterState;\n finalizeNavigation(navId: number, pending: PendingBrowserRouterState | null | undefined): void;\n renderNavigationPayload(options: {\n actionType: \"navigate\" | \"replace\" | \"traverse\";\n createNavigationCommitEffect: BrowserNavigationCommitEffectFactory;\n historyUpdateMode: HistoryUpdateMode | undefined;\n navigationSnapshot: ClientNavigationRenderSnapshot;\n nextElements: Promise<AppElements>;\n operationLane: OperationLane;\n params: Record<string, string | string[]>;\n pendingRouterState: PendingBrowserRouterState | null;\n previousNextUrl: string | null;\n targetHistoryIndex?: number | null;\n targetHref: string;\n navId: number;\n }): Promise<NavigationPayloadOutcome>;\n commitSameUrlNavigatePayload(\n nextElements: Promise<AppElements>,\n navigationSnapshot: ClientNavigationRenderSnapshot,\n returnValue?: { ok: boolean; data: unknown },\n actionInitiationState?: AppRouterState,\n lifecycleOptions?: SameUrlServerActionLifecycleOptions,\n ): Promise<unknown>;\n hmrReplaceTree(\n nextElements: Promise<AppElements>,\n navigationSnapshot: ClientNavigationRenderSnapshot,\n ): Promise<void>;\n /**\n * Force-drain the queued pre-paint effect for the given renderId without\n * waiting for NavigationCommitSignal to commit. Used by the dev recovery\n * boundary in app-browser-entry.ts: when a render error replaces\n * NavigationCommitSignal with the boundary's null fallback, its\n * useLayoutEffect never fires, so the URL update for the in-flight\n * navigation would otherwise be lost.\n */\n drainPrePaintEffects(renderId: number): void;\n NavigationCommitSignal(\n this: void,\n {\n renderId,\n children,\n }: {\n renderId: number;\n children?: ReactNode;\n },\n ): ReactNode;\n};\n\nconst HARD_NAVIGATION_LOOP_GUARD_KEY = \"__vinext_hard_navigation_target__\";\n\nfunction normalizeBrowserHref(href: string): string {\n try {\n return new URL(href, window.location.href).href;\n } catch {\n return href;\n }\n}\n\nfunction readHardNavigationLoopGuard(): string | null {\n try {\n return window.sessionStorage.getItem(HARD_NAVIGATION_LOOP_GUARD_KEY);\n } catch {\n return null;\n }\n}\n\nfunction writeHardNavigationLoopGuard(targetHref: string): boolean {\n try {\n window.sessionStorage.setItem(HARD_NAVIGATION_LOOP_GUARD_KEY, targetHref);\n return window.sessionStorage.getItem(HARD_NAVIGATION_LOOP_GUARD_KEY) === targetHref;\n } catch {\n return false;\n }\n}\n\nexport function clearHardNavigationLoopGuard(): void {\n try {\n window.sessionStorage.removeItem(HARD_NAVIGATION_LOOP_GUARD_KEY);\n } catch {}\n}\n\nfunction performHardNavigationWithLoopGuard(\n href: string,\n mode: HardNavigationMode = \"assign\",\n): boolean {\n const targetHref = normalizeBrowserHref(href);\n const currentHref = normalizeBrowserHref(window.location.href);\n\n if (readHardNavigationLoopGuard() === targetHref && currentHref === targetHref) {\n clearHardNavigationLoopGuard();\n console.error(\n `[vinext] Prevented repeated hard navigation to ${targetHref}; ` +\n \"leaving the current document in place to avoid a reload loop.\",\n );\n return false;\n }\n\n const guardPersisted = writeHardNavigationLoopGuard(targetHref);\n if (!guardPersisted && currentHref === targetHref) {\n console.error(\n `[vinext] Hard navigation to ${targetHref} requires a reload-loop guard, ` +\n \"but sessionStorage is unavailable; leaving the current document in place.\",\n );\n return false;\n }\n // If storage is unavailable but the target is a different URL, the browser\n // can still make forward progress. Only same-target reloads need a persisted\n // guard because they can re-enter this exact recovery path indefinitely.\n\n if (mode === \"replace\") {\n window.location.replace(href);\n } else {\n window.location.assign(href);\n }\n return true;\n}\n\nexport function createAppBrowserNavigationController(\n deps: BrowserNavigationControllerDeps = {},\n): BrowserNavigationController {\n const commitClientNavigationStateImpl =\n deps.commitClientNavigationState ?? commitClientNavigationState;\n const performHardNavigation = deps.performHardNavigation ?? performHardNavigationWithLoopGuard;\n const getRouteManifest = deps.getRouteManifest ?? (() => null);\n const syncHistoryStatePreviousNextUrl = deps.syncHistoryStatePreviousNextUrl ?? (() => {});\n\n // These are plain module-level variables (inside the controller closure),\n // unlike ClientNavigationState which uses Symbol.for to survive multiple\n // Vite module instances. The browser entry is loaded exactly once (via the\n // RSC plugin's generated bootstrap), so the controller running in a single\n // module instance is safe. If that assumption ever changes, these should be\n // migrated to a Symbol.for-backed global.\n //\n // The most severe consequence of multiple instances would be Map fragmentation:\n // pendingNavigationCommits and pendingNavigationPrePaintEffects would split\n // across instances, so drainPrePaintEffects in one instance could never drain\n // effects queued by the other, permanently leaking navigationSnapshotActiveCount\n // and causing hooks to prefer stale snapshot values indefinitely.\n let nextNavigationRenderId = 0;\n let activeNavigationId = 0;\n const pendingNavigationCommits = new Map<number, () => void>();\n const pendingNavigationPrePaintEffects = new Map<number, () => void>();\n\n let setBrowserRouterState: Dispatch<AppRouterState | Promise<AppRouterState>> | null = null;\n let browserRouterStateRef: BrowserRouterStateRef | null = null;\n let activePendingBrowserRouterState: PendingBrowserRouterState | null = null;\n let resolveBrowserRouterStateReady: (() => void) | null = null;\n let browserRouterStateReadyPromise: Promise<void> | null = null;\n let browserRouterStateHasCommitted = false;\n\n function getBrowserRouterStateSetter(): Dispatch<AppRouterState | Promise<AppRouterState>> {\n if (!setBrowserRouterState) {\n throw new Error(\"[vinext] Browser router state setter is not initialized\");\n }\n return setBrowserRouterState;\n }\n\n function getBrowserRouterState(): AppRouterState {\n if (!browserRouterStateRef) {\n throw new Error(\"[vinext] Browser router state is not initialized\");\n }\n return browserRouterStateRef.current;\n }\n\n function waitForBrowserRouterStateReady(): Promise<void> {\n if (browserRouterStateRef || browserRouterStateHasCommitted) {\n return Promise.resolve();\n }\n\n if (!browserRouterStateReadyPromise) {\n browserRouterStateReadyPromise = new Promise((resolve) => {\n resolveBrowserRouterStateReady = resolve;\n });\n }\n\n return browserRouterStateReadyPromise;\n }\n\n function markBrowserRouterStateReady(): void {\n browserRouterStateHasCommitted = true;\n const resolveReady = resolveBrowserRouterStateReady;\n resolveBrowserRouterStateReady = null;\n browserRouterStateReadyPromise = null;\n resolveReady?.();\n }\n\n function beginNavigation(): number {\n activeNavigationId += 1;\n return activeNavigationId;\n }\n\n function getActiveNavigationId(): number {\n return activeNavigationId;\n }\n\n function allocateRenderId(): number {\n nextNavigationRenderId += 1;\n return nextNavigationRenderId;\n }\n\n function hasBrowserRouterState(): boolean {\n return browserRouterStateRef !== null;\n }\n\n function isCurrentNavigation(navId: number): boolean {\n return navId === activeNavigationId;\n }\n\n function beginPendingBrowserRouterState(): PendingBrowserRouterState {\n const setter = getBrowserRouterStateSetter();\n\n if (activePendingBrowserRouterState && !activePendingBrowserRouterState.settled) {\n activePendingBrowserRouterState.settled = true;\n activePendingBrowserRouterState.resolve(getBrowserRouterState());\n }\n\n let resolvePending: ((state: AppRouterState) => void) | undefined;\n const promise = new Promise<AppRouterState>((resolve) => {\n resolvePending = resolve;\n });\n\n if (!resolvePending) {\n throw new Error(\"[vinext] Failed to initialize browser router promise\");\n }\n\n const pending: PendingBrowserRouterState = {\n promise,\n resolve: resolvePending,\n settled: false,\n };\n\n activePendingBrowserRouterState = pending;\n setter(promise);\n\n return pending;\n }\n\n function settlePendingBrowserRouterState(\n pending: PendingBrowserRouterState | null | undefined,\n ): void {\n if (!pending || pending.settled) return;\n\n pending.settled = true;\n pending.resolve(getBrowserRouterState());\n\n if (activePendingBrowserRouterState === pending) {\n activePendingBrowserRouterState = null;\n }\n }\n\n function finalizeNavigation(\n navId: number,\n pending: PendingBrowserRouterState | null | undefined,\n ): void {\n settlePendingBrowserRouterState(pending);\n\n if (isCurrentNavigation(navId)) {\n clearPendingPathname(navId);\n }\n }\n\n function resolvePendingBrowserRouterState(\n pending: PendingBrowserRouterState | null | undefined,\n commit: ApprovedVisibleCommit,\n ): void {\n if (!pending || pending.settled) return;\n\n pending.settled = true;\n pending.resolve(applyApprovedVisibleCommit(getBrowserRouterState(), commit));\n\n if (activePendingBrowserRouterState === pending) {\n activePendingBrowserRouterState = null;\n }\n }\n\n function queuePrePaintNavigationEffect(renderId: number, effect: (() => void) | null): void {\n if (!effect) {\n return;\n }\n pendingNavigationPrePaintEffects.set(renderId, effect);\n }\n\n /**\n * Run all queued pre-paint effects for renderIds up to and including the\n * given renderId. When React supersedes a startTransition update (rapid\n * clicks on same-route links), the superseded NavigationCommitSignal never\n * mounts, so its pre-paint effect never fires. By draining all effects\n * <= the committed renderId here, the winning transition cleans up after\n * any superseded ones, keeping the counter balanced.\n *\n * Invariant: each superseded navigation gets a commitClientNavigationState()\n * to balance the activateNavigationSnapshot() from its renderNavigationPayload call.\n */\n function drainPrePaintEffects(upToRenderId: number): void {\n for (const [id, effect] of pendingNavigationPrePaintEffects) {\n if (id > upToRenderId) {\n continue;\n }\n\n pendingNavigationPrePaintEffects.delete(id);\n if (id === upToRenderId) {\n effect();\n } else {\n // Superseded navigations still need to balance the snapshot counter.\n commitClientNavigationStateImpl(undefined, { releaseSnapshot: true });\n }\n }\n }\n\n /**\n * Resolve all pending navigation commits with renderId <= the committed renderId.\n * Note: Map iteration handles concurrent deletion safely — entries are visited in\n * insertion order and deletion doesn't affect the iterator's view of remaining entries.\n * This pattern is also used in drainPrePaintEffects with the same semantics.\n */\n function resolveCommittedNavigations(renderId: number): void {\n for (const [pendingId, resolve] of pendingNavigationCommits) {\n if (pendingId > renderId) {\n continue;\n }\n\n pendingNavigationCommits.delete(pendingId);\n resolve();\n }\n }\n\n async function hmrReplaceTree(\n nextElements: Promise<AppElements>,\n navigationSnapshot: ClientNavigationRenderSnapshot,\n ): Promise<void> {\n if (!hasBrowserRouterState()) return;\n\n const currentState = getBrowserRouterState();\n const renderId = allocateRenderId();\n const pending = await createPendingNavigationCommit({\n currentState,\n nextElements,\n navigationSnapshot,\n operationLane: \"hmr\",\n renderId,\n type: \"replace\",\n });\n\n // createPendingNavigationCommit awaits the new RSC payload. While\n // suspended, the prior broken render can unmount BrowserRoot. Re-check\n // before dispatching so a racing unmount doesn't surface as an\n // initialized-setter error.\n if (!hasBrowserRouterState()) return;\n\n dispatchSynchronousVisibleCommit(approveHmrVisibleCommit(pending));\n }\n\n function NavigationCommitSignal(\n this: void,\n {\n renderId,\n children,\n }: {\n renderId: number;\n children?: ReactNode;\n },\n ): ReactNode {\n useLayoutEffect(() => {\n drainPrePaintEffects(renderId);\n\n const frame = requestAnimationFrame(() => {\n resolveCommittedNavigations(renderId);\n });\n\n return () => {\n cancelAnimationFrame(frame);\n // Resolve pending commits to prevent callers from hanging if React\n // unmounts this component without committing (e.g., error boundary).\n resolveCommittedNavigations(renderId);\n };\n }, [renderId]);\n\n return children;\n }\n\n function dispatchApprovedVisibleCommit(\n commit: ApprovedVisibleCommit,\n pendingRouterState: PendingBrowserRouterState | null,\n ): void {\n const setter = getBrowserRouterStateSetter();\n\n if (pendingRouterState) {\n // The programmatic navigation is already running inside React.startTransition\n // (from router.push/replace/refresh/Link), so resolving the deferred promise\n // is sufficient.\n resolvePendingBrowserRouterState(pendingRouterState, commit);\n return;\n }\n\n startTransition(() => {\n setter(applyApprovedVisibleCommit(getBrowserRouterState(), commit));\n });\n }\n\n function dispatchSynchronousVisibleCommit(commit: ApprovedVisibleCommit): void {\n const setter = getBrowserRouterStateSetter();\n setter(applyApprovedVisibleCommit(getBrowserRouterState(), commit));\n }\n\n function notifyDiscardedServerActionRevalidation(\n lifecycleOptions: SameUrlServerActionLifecycleOptions | undefined,\n ): void {\n const revalidation = lifecycleOptions?.revalidation ?? \"none\";\n if (!shouldScheduleRefreshForDiscardedServerAction(revalidation)) return;\n\n lifecycleOptions?.onDiscardedRevalidation?.();\n }\n\n async function renderNavigationPayload(options: {\n actionType: \"navigate\" | \"replace\" | \"traverse\";\n createNavigationCommitEffect: BrowserNavigationCommitEffectFactory;\n historyUpdateMode: HistoryUpdateMode | undefined;\n navigationSnapshot: ClientNavigationRenderSnapshot;\n nextElements: Promise<AppElements>;\n operationLane: OperationLane;\n params: Record<string, string | string[]>;\n pendingRouterState: PendingBrowserRouterState | null;\n previousNextUrl: string | null;\n targetHistoryIndex?: number | null;\n targetHref: string;\n navId: number;\n }): Promise<NavigationPayloadOutcome> {\n const renderId = allocateRenderId();\n let resolveCommitted: (() => void) | undefined;\n const committed = new Promise<void>((resolve) => {\n resolveCommitted = resolve;\n pendingNavigationCommits.set(renderId, resolve);\n });\n\n let snapshotActivated = false;\n try {\n const startedState = getBrowserRouterState();\n const pending = await createPendingNavigationCommit({\n currentState: startedState,\n nextElements: options.nextElements,\n navigationSnapshot: options.navigationSnapshot,\n operationLane: options.operationLane,\n previousNextUrl: options.previousNextUrl,\n renderId,\n type: options.actionType,\n });\n\n const approval = approvePendingNavigationCommit({\n activeNavigationId,\n currentState: getBrowserRouterState(),\n pending,\n routeManifest: getRouteManifest(),\n startedNavigationId: options.navId,\n targetHref: options.targetHref,\n });\n\n if (approval.decision.disposition === \"no-commit\") {\n settlePendingBrowserRouterState(options.pendingRouterState);\n pendingNavigationCommits.delete(renderId);\n resolveCommitted?.();\n return \"no-commit\";\n }\n\n if (approval.decision.disposition === \"hard-navigate\") {\n settlePendingBrowserRouterState(options.pendingRouterState);\n pendingNavigationCommits.delete(renderId);\n return performHardNavigation(options.targetHref) ? \"hard-navigate\" : \"no-commit\";\n }\n\n const approvedCommit = approval.approvedCommit;\n if (approvedCommit === null) {\n throw new Error(\"[vinext] Commit decision did not approve a visible commit\");\n }\n\n queuePrePaintNavigationEffect(\n renderId,\n options.createNavigationCommitEffect({\n href: options.targetHref,\n historyUpdateMode: options.historyUpdateMode,\n navId: options.navId,\n params: options.params,\n previousNextUrl: approvedCommit.previousNextUrl,\n targetHistoryIndex: options.targetHistoryIndex,\n }),\n );\n activateNavigationSnapshot();\n snapshotActivated = true;\n dispatchApprovedVisibleCommit(approvedCommit, options.pendingRouterState);\n } catch (error) {\n pendingNavigationPrePaintEffects.delete(renderId);\n pendingNavigationCommits.delete(renderId);\n if (snapshotActivated) {\n commitClientNavigationStateImpl(options.navId);\n }\n settlePendingBrowserRouterState(options.pendingRouterState);\n resolveCommitted?.();\n throw error;\n }\n\n return committed.then(() => \"committed\");\n }\n\n async function commitSameUrlNavigatePayload(\n nextElements: Promise<AppElements>,\n navigationSnapshot: ClientNavigationRenderSnapshot,\n returnValue?: { ok: boolean; data: unknown },\n actionInitiationState?: AppRouterState,\n lifecycleOptions?: SameUrlServerActionLifecycleOptions,\n ): Promise<unknown> {\n const currentState = actionInitiationState ?? getBrowserRouterState();\n const startedNavigationId = lifecycleOptions?.startedNavigationId ?? activeNavigationId;\n const targetHref = lifecycleOptions?.targetHref ?? window.location.href;\n const {\n approvedCommit,\n decision,\n pending,\n // Intentionally retained as #726-OPS-01 trace-shell scaffolding. The\n // same-URL action path can consume this trace once later lifecycle gates\n // need an observable commit explanation.\n trace: _navigationTrace,\n } = await resolveAndClassifyNavigationCommit({\n activeNavigationId,\n currentState,\n getActiveNavigationId: () => activeNavigationId,\n getCurrentStateForApproval: getBrowserRouterState,\n navigationSnapshot,\n nextElements,\n renderId: allocateRenderId(),\n operationLane: \"server-action\",\n startedNavigationId,\n routeManifest: getRouteManifest(),\n targetHref,\n type: \"navigate\",\n });\n\n if (decision.disposition === \"hard-navigate\") {\n // Same-URL action hard navigations do not expose a navigation outcome to\n // callers. If the loop guard blocks, the degraded state is still the\n // existing return contract: no visible commit and no action value.\n performHardNavigation(targetHref);\n return undefined;\n }\n\n if (approvedCommit) {\n // The helper approval and this continuation are separated by a microtask\n // boundary, so re-check lifecycle authority before mutating visible UI.\n const latestApproval = approvePendingNavigationCommit({\n activeNavigationId,\n currentState: getBrowserRouterState(),\n pending,\n routeManifest: getRouteManifest(),\n startedNavigationId,\n targetHref,\n });\n\n if (latestApproval.decision.disposition === \"hard-navigate\") {\n // See the same-URL hard-navigation note above. The guard result is\n // deliberately not surfaced through the server-action return channel.\n performHardNavigation(targetHref);\n return undefined;\n }\n\n if (latestApproval.approvedCommit) {\n dispatchSynchronousVisibleCommit(latestApproval.approvedCommit);\n syncHistoryStatePreviousNextUrl(latestApproval.approvedCommit.previousNextUrl);\n } else {\n notifyDiscardedServerActionRevalidation(lifecycleOptions);\n }\n } else if (decision.disposition === \"no-commit\") {\n notifyDiscardedServerActionRevalidation(lifecycleOptions);\n }\n\n // Same-URL server actions still return their action value even if the UI\n // update was skipped due to a superseding navigation. That preserves the\n // existing caller contract; a future Phase 2 router state model could make\n // skipped UI updates observable to the caller without conflating them here.\n if (returnValue) {\n if (!returnValue.ok) {\n throw returnValue.data;\n }\n return returnValue.data;\n }\n\n return undefined;\n }\n\n function attachBrowserRouterState(\n setter: Dispatch<AppRouterState | Promise<AppRouterState>>,\n stateRef: BrowserRouterStateRef,\n ): () => void {\n setBrowserRouterState = setter;\n browserRouterStateRef = stateRef;\n markBrowserRouterStateReady();\n\n return () => {\n if (setBrowserRouterState === setter) {\n setBrowserRouterState = null;\n }\n if (browserRouterStateRef === stateRef) {\n browserRouterStateRef = null;\n browserRouterStateHasCommitted = false;\n }\n };\n }\n\n return {\n beginNavigation,\n getActiveNavigationId,\n hasBrowserRouterState,\n getBrowserRouterState,\n isCurrentNavigation,\n waitForBrowserRouterStateReady,\n attachBrowserRouterState,\n beginPendingBrowserRouterState,\n finalizeNavigation,\n renderNavigationPayload,\n commitSameUrlNavigatePayload,\n hmrReplaceTree,\n drainPrePaintEffects,\n NavigationCommitSignal,\n };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
//#region src/server/app-browser-popstate.d.ts
|
|
2
|
+
type RestoreScrollPosition = (state: unknown) => void;
|
|
3
|
+
type NavigateRsc = (href: string, redirectDepth?: number, navigationKind?: "navigate" | "traverse" | "refresh") => Promise<void>;
|
|
4
|
+
type BrowserPopstateRestoreDeps = {
|
|
5
|
+
getActiveNavigationId: () => number;
|
|
6
|
+
getPendingNavigation: () => Promise<void> | null | undefined;
|
|
7
|
+
getNavigate: () => NavigateRsc | undefined;
|
|
8
|
+
isCurrentNavigation: (navId: number) => boolean;
|
|
9
|
+
notifyAppRouterTransitionStart: (href: string) => void;
|
|
10
|
+
restorePopstateScrollPosition: RestoreScrollPosition;
|
|
11
|
+
setPendingNavigation: (pendingNavigation: Promise<void> | null) => void;
|
|
12
|
+
};
|
|
13
|
+
declare function createPopstateRestoreHandler(deps: BrowserPopstateRestoreDeps): (event: PopStateEvent) => void;
|
|
14
|
+
//#endregion
|
|
15
|
+
export { createPopstateRestoreHandler };
|
|
16
|
+
//# sourceMappingURL=app-browser-popstate.d.ts.map
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
//#region src/server/app-browser-popstate.ts
|
|
2
|
+
function createPopstateRestoreHandler(deps) {
|
|
3
|
+
return (event) => {
|
|
4
|
+
deps.notifyAppRouterTransitionStart(window.location.href);
|
|
5
|
+
const pendingNavigation = deps.getNavigate()?.(window.location.href, 0, "traverse") ?? Promise.resolve();
|
|
6
|
+
const popstateNavId = deps.getActiveNavigationId();
|
|
7
|
+
deps.setPendingNavigation(pendingNavigation);
|
|
8
|
+
pendingNavigation.finally(() => {
|
|
9
|
+
if (deps.isCurrentNavigation(popstateNavId)) deps.restorePopstateScrollPosition(event.state);
|
|
10
|
+
if (deps.getPendingNavigation() === pendingNavigation) deps.setPendingNavigation(null);
|
|
11
|
+
});
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
//#endregion
|
|
15
|
+
export { createPopstateRestoreHandler };
|
|
16
|
+
|
|
17
|
+
//# sourceMappingURL=app-browser-popstate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-browser-popstate.js","names":[],"sources":["../../src/server/app-browser-popstate.ts"],"sourcesContent":["type RestoreScrollPosition = (state: unknown) => void;\ntype NavigateRsc = (\n href: string,\n redirectDepth?: number,\n navigationKind?: \"navigate\" | \"traverse\" | \"refresh\",\n) => Promise<void>;\n\ntype BrowserPopstateRestoreDeps = {\n getActiveNavigationId: () => number;\n getPendingNavigation: () => Promise<void> | null | undefined;\n getNavigate: () => NavigateRsc | undefined;\n isCurrentNavigation: (navId: number) => boolean;\n notifyAppRouterTransitionStart: (href: string) => void;\n restorePopstateScrollPosition: RestoreScrollPosition;\n setPendingNavigation: (pendingNavigation: Promise<void> | null) => void;\n};\n\nexport function createPopstateRestoreHandler(\n deps: BrowserPopstateRestoreDeps,\n): (event: PopStateEvent) => void {\n return (event) => {\n deps.notifyAppRouterTransitionStart(window.location.href);\n const navigate = deps.getNavigate();\n const pendingNavigation = navigate?.(window.location.href, 0, \"traverse\") ?? Promise.resolve();\n const popstateNavId = deps.getActiveNavigationId();\n\n deps.setPendingNavigation(pendingNavigation);\n\n void pendingNavigation.finally(() => {\n if (deps.isCurrentNavigation(popstateNavId)) {\n deps.restorePopstateScrollPosition(event.state);\n }\n\n if (deps.getPendingNavigation() === pendingNavigation) {\n deps.setPendingNavigation(null);\n }\n });\n };\n}\n"],"mappings":";AAiBA,SAAgB,6BACd,MACgC;CAChC,QAAQ,UAAU;EAChB,KAAK,+BAA+B,OAAO,SAAS,KAAK;EAEzD,MAAM,oBADW,KAAK,aACY,GAAG,OAAO,SAAS,MAAM,GAAG,WAAW,IAAI,QAAQ,SAAS;EAC9F,MAAM,gBAAgB,KAAK,uBAAuB;EAElD,KAAK,qBAAqB,kBAAkB;EAE5C,kBAAuB,cAAc;GACnC,IAAI,KAAK,oBAAoB,cAAc,EACzC,KAAK,8BAA8B,MAAM,MAAM;GAGjD,IAAI,KAAK,sBAAsB,KAAK,mBAClC,KAAK,qBAAqB,KAAK;IAEjC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
//#region src/server/app-browser-rsc-redirect.d.ts
|
|
2
|
+
type RscRedirectHistoryUpdateMode = "push" | "replace" | undefined;
|
|
3
|
+
type RscRedirectLifecycleDecision = {
|
|
4
|
+
kind: "no-redirect";
|
|
5
|
+
} | {
|
|
6
|
+
href: string;
|
|
7
|
+
historyUpdateMode: RscRedirectHistoryUpdateMode;
|
|
8
|
+
kind: "follow";
|
|
9
|
+
previousNextUrl: string | null;
|
|
10
|
+
redirectDepth: number;
|
|
11
|
+
} | {
|
|
12
|
+
href: string;
|
|
13
|
+
kind: "terminal-hard-navigation";
|
|
14
|
+
reason: "externalRedirect" | "maxRedirectsExceeded";
|
|
15
|
+
redirectDepth: number;
|
|
16
|
+
};
|
|
17
|
+
declare function resolveRscRedirectLifecycleHop(options: {
|
|
18
|
+
currentHref: string;
|
|
19
|
+
historyUpdateMode: RscRedirectHistoryUpdateMode;
|
|
20
|
+
maxRedirectDepth?: number;
|
|
21
|
+
origin: string;
|
|
22
|
+
redirectDepth: number;
|
|
23
|
+
requestPreviousNextUrl: string | null;
|
|
24
|
+
responseUrl: string;
|
|
25
|
+
}): RscRedirectLifecycleDecision;
|
|
26
|
+
//#endregion
|
|
27
|
+
export { resolveRscRedirectLifecycleHop };
|
|
28
|
+
//# sourceMappingURL=app-browser-rsc-redirect.d.ts.map
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { resolveHardNavigationTargetFromRscResponse, stripRscCacheBustingSearchParam, stripRscSuffix } from "./app-rsc-cache-busting.js";
|
|
2
|
+
//#region src/server/app-browser-rsc-redirect.ts
|
|
3
|
+
const MAX_RSC_REDIRECT_DEPTH = 10;
|
|
4
|
+
function toVisibleAppHref(href, origin) {
|
|
5
|
+
const url = new URL(href, origin);
|
|
6
|
+
stripRscCacheBustingSearchParam(url);
|
|
7
|
+
return `${stripRscSuffix(url.pathname)}${url.search}${url.hash}`;
|
|
8
|
+
}
|
|
9
|
+
function resolveRscRedirectLifecycleHop(options) {
|
|
10
|
+
const responseUrl = new URL(options.responseUrl, options.origin);
|
|
11
|
+
if (responseUrl.origin !== options.origin) return {
|
|
12
|
+
href: responseUrl.href,
|
|
13
|
+
kind: "terminal-hard-navigation",
|
|
14
|
+
reason: "externalRedirect",
|
|
15
|
+
redirectDepth: options.redirectDepth
|
|
16
|
+
};
|
|
17
|
+
const redirectedHref = resolveHardNavigationTargetFromRscResponse(responseUrl.href, options.currentHref, options.origin);
|
|
18
|
+
if (redirectedHref === toVisibleAppHref(options.currentHref, options.origin)) return { kind: "no-redirect" };
|
|
19
|
+
const maxRedirectDepth = options.maxRedirectDepth ?? MAX_RSC_REDIRECT_DEPTH;
|
|
20
|
+
if (options.redirectDepth >= maxRedirectDepth) return {
|
|
21
|
+
href: redirectedHref,
|
|
22
|
+
kind: "terminal-hard-navigation",
|
|
23
|
+
reason: "maxRedirectsExceeded",
|
|
24
|
+
redirectDepth: options.redirectDepth
|
|
25
|
+
};
|
|
26
|
+
return {
|
|
27
|
+
href: redirectedHref,
|
|
28
|
+
historyUpdateMode: options.historyUpdateMode,
|
|
29
|
+
kind: "follow",
|
|
30
|
+
previousNextUrl: options.requestPreviousNextUrl,
|
|
31
|
+
redirectDepth: options.redirectDepth + 1
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
//#endregion
|
|
35
|
+
export { resolveRscRedirectLifecycleHop };
|
|
36
|
+
|
|
37
|
+
//# sourceMappingURL=app-browser-rsc-redirect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-browser-rsc-redirect.js","names":[],"sources":["../../src/server/app-browser-rsc-redirect.ts"],"sourcesContent":["import {\n resolveHardNavigationTargetFromRscResponse,\n stripRscCacheBustingSearchParam,\n stripRscSuffix,\n} from \"./app-rsc-cache-busting.js\";\n\nconst MAX_RSC_REDIRECT_DEPTH = 10;\n\ntype RscRedirectHistoryUpdateMode = \"push\" | \"replace\" | undefined;\n\ntype RscRedirectLifecycleDecision =\n | { kind: \"no-redirect\" }\n | {\n href: string;\n historyUpdateMode: RscRedirectHistoryUpdateMode;\n kind: \"follow\";\n previousNextUrl: string | null;\n redirectDepth: number;\n }\n | {\n href: string;\n kind: \"terminal-hard-navigation\";\n reason: \"externalRedirect\" | \"maxRedirectsExceeded\";\n redirectDepth: number;\n };\n\nfunction toVisibleAppHref(href: string, origin: string): string {\n const url = new URL(href, origin);\n stripRscCacheBustingSearchParam(url);\n return `${stripRscSuffix(url.pathname)}${url.search}${url.hash}`;\n}\n\nexport function resolveRscRedirectLifecycleHop(options: {\n currentHref: string;\n historyUpdateMode: RscRedirectHistoryUpdateMode;\n maxRedirectDepth?: number;\n origin: string;\n redirectDepth: number;\n requestPreviousNextUrl: string | null;\n responseUrl: string;\n}): RscRedirectLifecycleDecision {\n const responseUrl = new URL(options.responseUrl, options.origin);\n\n if (responseUrl.origin !== options.origin) {\n return {\n href: responseUrl.href,\n kind: \"terminal-hard-navigation\",\n reason: \"externalRedirect\",\n redirectDepth: options.redirectDepth,\n };\n }\n\n const redirectedHref = resolveHardNavigationTargetFromRscResponse(\n responseUrl.href,\n options.currentHref,\n options.origin,\n );\n if (redirectedHref === toVisibleAppHref(options.currentHref, options.origin)) {\n return { kind: \"no-redirect\" };\n }\n\n const maxRedirectDepth = options.maxRedirectDepth ?? MAX_RSC_REDIRECT_DEPTH;\n if (options.redirectDepth >= maxRedirectDepth) {\n return {\n href: redirectedHref,\n kind: \"terminal-hard-navigation\",\n reason: \"maxRedirectsExceeded\",\n redirectDepth: options.redirectDepth,\n };\n }\n\n return {\n href: redirectedHref,\n historyUpdateMode: options.historyUpdateMode,\n kind: \"follow\",\n previousNextUrl: options.requestPreviousNextUrl,\n redirectDepth: options.redirectDepth + 1,\n };\n}\n"],"mappings":";;AAMA,MAAM,yBAAyB;AAoB/B,SAAS,iBAAiB,MAAc,QAAwB;CAC9D,MAAM,MAAM,IAAI,IAAI,MAAM,OAAO;CACjC,gCAAgC,IAAI;CACpC,OAAO,GAAG,eAAe,IAAI,SAAS,GAAG,IAAI,SAAS,IAAI;;AAG5D,SAAgB,+BAA+B,SAQd;CAC/B,MAAM,cAAc,IAAI,IAAI,QAAQ,aAAa,QAAQ,OAAO;CAEhE,IAAI,YAAY,WAAW,QAAQ,QACjC,OAAO;EACL,MAAM,YAAY;EAClB,MAAM;EACN,QAAQ;EACR,eAAe,QAAQ;EACxB;CAGH,MAAM,iBAAiB,2CACrB,YAAY,MACZ,QAAQ,aACR,QAAQ,OACT;CACD,IAAI,mBAAmB,iBAAiB,QAAQ,aAAa,QAAQ,OAAO,EAC1E,OAAO,EAAE,MAAM,eAAe;CAGhC,MAAM,mBAAmB,QAAQ,oBAAoB;CACrD,IAAI,QAAQ,iBAAiB,kBAC3B,OAAO;EACL,MAAM;EACN,MAAM;EACN,QAAQ;EACR,eAAe,QAAQ;EACxB;CAGH,OAAO;EACL,MAAM;EACN,mBAAmB,QAAQ;EAC3B,MAAM;EACN,iBAAiB,QAAQ;EACzB,eAAe,QAAQ,gBAAgB;EACxC"}
|
|
@@ -1,12 +1,11 @@
|
|
|
1
|
+
import { RouteManifest } from "../routing/app-route-graph.js";
|
|
1
2
|
import { ClientNavigationRenderSnapshot } from "../shims/navigation.js";
|
|
2
|
-
import { AppElements, LayoutFlags } from "./app-elements-wire.js";
|
|
3
|
+
import { AppElements, AppElementsInterception, AppElementsSlotBinding, LayoutFlags } from "./app-elements-wire.js";
|
|
3
4
|
import { NavigationTrace } from "./navigation-trace.js";
|
|
5
|
+
import { OperationLane } from "./navigation-planner.js";
|
|
6
|
+
import { HistoryTraversalIntent, createHistoryStateWithNavigationMetadata, createHistoryStateWithPreviousNextUrl, readHistoryStatePreviousNextUrl, readHistoryStateTraversalIndex, resolveHistoryTraversalIntent } from "./app-history-state.js";
|
|
4
7
|
|
|
5
8
|
//#region src/server/app-browser-state.d.ts
|
|
6
|
-
type HistoryStateRecord = {
|
|
7
|
-
[key: string]: unknown;
|
|
8
|
-
};
|
|
9
|
-
type OperationLane = "navigation" | "refresh" | "traverse" | "server-action" | "hmr";
|
|
10
9
|
type OperationRecordBase = {
|
|
11
10
|
id: number;
|
|
12
11
|
lane: OperationLane;
|
|
@@ -23,41 +22,55 @@ type OperationRecord = PendingOperationRecord | CommittedOperationRecord;
|
|
|
23
22
|
type AppRouterState = {
|
|
24
23
|
activeOperation: OperationRecord | null;
|
|
25
24
|
elements: AppElements;
|
|
25
|
+
interception: AppElementsInterception | null;
|
|
26
26
|
interceptionContext: string | null;
|
|
27
27
|
layoutFlags: LayoutFlags;
|
|
28
|
+
layoutIds: readonly string[];
|
|
28
29
|
previousNextUrl: string | null;
|
|
29
30
|
renderId: number;
|
|
30
31
|
navigationSnapshot: ClientNavigationRenderSnapshot;
|
|
31
32
|
rootLayoutTreePath: string | null;
|
|
32
33
|
routeId: string;
|
|
34
|
+
slotBindings: readonly AppElementsSlotBinding[];
|
|
33
35
|
visibleCommitVersion: number;
|
|
34
36
|
};
|
|
35
37
|
type AppRouterAction = {
|
|
36
38
|
elements: AppElements;
|
|
39
|
+
interception: AppElementsInterception | null;
|
|
37
40
|
interceptionContext: string | null;
|
|
38
41
|
layoutFlags: LayoutFlags;
|
|
42
|
+
layoutIds: readonly string[];
|
|
39
43
|
navigationSnapshot: ClientNavigationRenderSnapshot;
|
|
40
44
|
operation: PendingOperationRecord;
|
|
41
45
|
previousNextUrl: string | null;
|
|
42
46
|
renderId: number;
|
|
43
47
|
rootLayoutTreePath: string | null;
|
|
44
48
|
routeId: string;
|
|
49
|
+
slotBindings: readonly AppElementsSlotBinding[];
|
|
45
50
|
type: "navigate" | "replace" | "traverse";
|
|
46
51
|
};
|
|
47
52
|
type PendingNavigationCommit = {
|
|
48
53
|
action: AppRouterAction;
|
|
54
|
+
interception: AppElementsInterception | null;
|
|
49
55
|
interceptionContext: string | null;
|
|
50
56
|
previousNextUrl: string | null;
|
|
51
57
|
rootLayoutTreePath: string | null;
|
|
52
58
|
routeId: string;
|
|
53
59
|
};
|
|
54
60
|
type PendingNavigationCommitDisposition = "dispatch" | "hard-navigate" | "skip";
|
|
55
|
-
type
|
|
56
|
-
disposition:
|
|
61
|
+
type DispatchPendingNavigationCommitDispositionDecision = {
|
|
62
|
+
disposition: "dispatch";
|
|
63
|
+
preserveAbsentSlots: boolean;
|
|
64
|
+
preserveElementIds: readonly string[];
|
|
65
|
+
preservePreviousSlotIds: readonly string[];
|
|
66
|
+
trace: NavigationTrace;
|
|
67
|
+
};
|
|
68
|
+
type NonDispatchPendingNavigationCommitDispositionDecision = {
|
|
69
|
+
disposition: Exclude<PendingNavigationCommitDisposition, "dispatch">;
|
|
70
|
+
preserveElementIds: readonly [];
|
|
57
71
|
trace: NavigationTrace;
|
|
58
72
|
};
|
|
59
|
-
|
|
60
|
-
declare function readHistoryStatePreviousNextUrl(state: unknown): string | null;
|
|
73
|
+
type PendingNavigationCommitDispositionDecision = DispatchPendingNavigationCommitDispositionDecision | NonDispatchPendingNavigationCommitDispositionDecision;
|
|
61
74
|
declare function resolveInterceptionContextFromPreviousNextUrl(previousNextUrl: string | null, basePath?: string): string | null;
|
|
62
75
|
type ResolveServerActionRequestStateOptions = {
|
|
63
76
|
actionId: string;
|
|
@@ -80,22 +93,13 @@ type ResolveServerActionRequestStateResult = {
|
|
|
80
93
|
* `findIntercept` lookup.
|
|
81
94
|
*/
|
|
82
95
|
declare function resolveServerActionRequestState(options: ResolveServerActionRequestStateOptions): ResolveServerActionRequestStateResult;
|
|
83
|
-
declare function shouldHardNavigate(currentRootLayoutTreePath: string | null, nextRootLayoutTreePath: string | null): boolean;
|
|
84
|
-
declare function resolvePendingNavigationCommitDisposition(options: {
|
|
85
|
-
activeNavigationId: number;
|
|
86
|
-
currentVisibleCommitVersion: number;
|
|
87
|
-
currentRootLayoutTreePath: string | null;
|
|
88
|
-
nextRootLayoutTreePath: string | null;
|
|
89
|
-
startedNavigationId: number;
|
|
90
|
-
startedVisibleCommitVersion: number;
|
|
91
|
-
}): PendingNavigationCommitDisposition;
|
|
92
96
|
declare function resolvePendingNavigationCommitDispositionDecision(options: {
|
|
93
97
|
activeNavigationId: number;
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
98
|
+
currentState: AppRouterState;
|
|
99
|
+
pending: PendingNavigationCommit;
|
|
100
|
+
routeManifest?: RouteManifest | null;
|
|
97
101
|
startedNavigationId: number;
|
|
98
|
-
|
|
102
|
+
targetHref?: string;
|
|
99
103
|
}): PendingNavigationCommitDispositionDecision;
|
|
100
104
|
declare function createPendingNavigationCommit(options: {
|
|
101
105
|
currentState: AppRouterState;
|
|
@@ -107,5 +111,5 @@ declare function createPendingNavigationCommit(options: {
|
|
|
107
111
|
type: "navigate" | "replace" | "traverse";
|
|
108
112
|
}): Promise<PendingNavigationCommit>;
|
|
109
113
|
//#endregion
|
|
110
|
-
export { AppRouterAction, AppRouterState, CommittedOperationRecord, OperationLane, OperationRecord, PendingNavigationCommit, PendingOperationRecord, createHistoryStateWithPreviousNextUrl, createPendingNavigationCommit, readHistoryStatePreviousNextUrl,
|
|
114
|
+
export { AppRouterAction, AppRouterState, CommittedOperationRecord, type HistoryTraversalIntent, type OperationLane, OperationRecord, PendingNavigationCommit, PendingOperationRecord, createHistoryStateWithNavigationMetadata, createHistoryStateWithPreviousNextUrl, createPendingNavigationCommit, readHistoryStatePreviousNextUrl, readHistoryStateTraversalIndex, resolveHistoryTraversalIntent, resolveInterceptionContextFromPreviousNextUrl, resolvePendingNavigationCommitDispositionDecision, resolveServerActionRequestState };
|
|
111
115
|
//# sourceMappingURL=app-browser-state.d.ts.map
|