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,3 +1,5 @@
|
|
|
1
|
+
import { normalizeAppElementsSlotBindings } from "./app-elements-wire.js";
|
|
2
|
+
import "./app-elements.js";
|
|
1
3
|
import { mergeElements } from "../shims/slot.js";
|
|
2
4
|
import { NavigationTraceReasonCodes, NavigationTraceTransactionCodes, createNavigationTrace, prependNavigationTraceEntry } from "./navigation-trace.js";
|
|
3
5
|
import { createPendingNavigationCommit, resolvePendingNavigationCommitDispositionDecision } from "./app-browser-state.js";
|
|
@@ -5,7 +7,7 @@ import { createPendingNavigationCommit, resolvePendingNavigationCommitDispositio
|
|
|
5
7
|
const approvedVisibleCommitBrand = Symbol("ApprovedVisibleCommit");
|
|
6
8
|
function applyApprovedVisibleCommit(state, commit) {
|
|
7
9
|
assertApprovedVisibleCommit(commit);
|
|
8
|
-
return reduceApprovedVisibleCommitState(state, commit
|
|
10
|
+
return reduceApprovedVisibleCommitState(state, commit);
|
|
9
11
|
}
|
|
10
12
|
function assertApprovedVisibleCommit(commit) {
|
|
11
13
|
if (commit[approvedVisibleCommitBrand] !== true) throw new Error("[vinext] Visible router state mutation requires ApprovedVisibleCommit");
|
|
@@ -27,31 +29,62 @@ function commitVisibleRouterState(state, nextState, operation) {
|
|
|
27
29
|
visibleCommitVersion
|
|
28
30
|
};
|
|
29
31
|
}
|
|
30
|
-
function
|
|
32
|
+
function mergeSlotBindings(previousBindings, nextBindings, layoutIds, preservePreviousSlotIds) {
|
|
33
|
+
if (preservePreviousSlotIds.length === 0) return nextBindings;
|
|
34
|
+
const preservedSlotIds = new Set(preservePreviousSlotIds);
|
|
35
|
+
const previousBindingsBySlotId = /* @__PURE__ */ new Map();
|
|
36
|
+
for (const binding of previousBindings) {
|
|
37
|
+
if (!preservedSlotIds.has(binding.slotId)) continue;
|
|
38
|
+
previousBindingsBySlotId.set(binding.slotId, binding);
|
|
39
|
+
}
|
|
40
|
+
const mergedBindings = [];
|
|
41
|
+
const seenSlotIds = /* @__PURE__ */ new Set();
|
|
42
|
+
for (const binding of nextBindings) {
|
|
43
|
+
const previousBinding = previousBindingsBySlotId.get(binding.slotId);
|
|
44
|
+
mergedBindings.push(previousBinding ?? binding);
|
|
45
|
+
seenSlotIds.add(binding.slotId);
|
|
46
|
+
}
|
|
47
|
+
for (const slotId of preservePreviousSlotIds) {
|
|
48
|
+
if (seenSlotIds.has(slotId)) continue;
|
|
49
|
+
const previousBinding = previousBindingsBySlotId.get(slotId);
|
|
50
|
+
if (previousBinding) mergedBindings.push(previousBinding);
|
|
51
|
+
}
|
|
52
|
+
return normalizeAppElementsSlotBindings(mergedBindings, { layoutIds });
|
|
53
|
+
}
|
|
54
|
+
function reduceApprovedVisibleCommitState(state, commit) {
|
|
55
|
+
const { action } = commit;
|
|
31
56
|
switch (action.type) {
|
|
32
57
|
case "traverse":
|
|
33
58
|
case "navigate": return commitVisibleRouterState(state, {
|
|
34
|
-
elements: mergeElements(state.elements, action.elements,
|
|
59
|
+
elements: mergeElements(state.elements, action.elements, {
|
|
60
|
+
clearAbsentSlots: action.type === "traverse",
|
|
61
|
+
preserveAbsentSlots: commit.decision.preserveAbsentSlots,
|
|
62
|
+
preserveElementIds: commit.decision.preserveElementIds,
|
|
63
|
+
preservePreviousSlotIds: commit.decision.preservePreviousSlotIds
|
|
64
|
+
}),
|
|
65
|
+
interception: action.interception,
|
|
35
66
|
interceptionContext: action.interceptionContext,
|
|
36
|
-
layoutFlags:
|
|
37
|
-
|
|
38
|
-
...action.layoutFlags
|
|
39
|
-
},
|
|
67
|
+
layoutFlags: mergeLayoutFlags(state.layoutFlags, action.layoutFlags, commit.decision.preserveElementIds),
|
|
68
|
+
layoutIds: action.layoutIds,
|
|
40
69
|
navigationSnapshot: action.navigationSnapshot,
|
|
41
70
|
previousNextUrl: action.previousNextUrl,
|
|
42
71
|
renderId: action.renderId,
|
|
43
72
|
rootLayoutTreePath: action.rootLayoutTreePath,
|
|
44
|
-
routeId: action.routeId
|
|
73
|
+
routeId: action.routeId,
|
|
74
|
+
slotBindings: mergeSlotBindings(state.slotBindings, action.slotBindings, action.layoutIds, commit.decision.preservePreviousSlotIds)
|
|
45
75
|
}, action.operation);
|
|
46
76
|
case "replace": return commitVisibleRouterState(state, {
|
|
47
77
|
elements: action.elements,
|
|
78
|
+
interception: action.interception,
|
|
48
79
|
interceptionContext: action.interceptionContext,
|
|
49
80
|
layoutFlags: action.layoutFlags,
|
|
81
|
+
layoutIds: action.layoutIds,
|
|
50
82
|
navigationSnapshot: action.navigationSnapshot,
|
|
51
83
|
previousNextUrl: action.previousNextUrl,
|
|
52
84
|
renderId: action.renderId,
|
|
53
85
|
rootLayoutTreePath: action.rootLayoutTreePath,
|
|
54
|
-
routeId: action.routeId
|
|
86
|
+
routeId: action.routeId,
|
|
87
|
+
slotBindings: action.slotBindings
|
|
55
88
|
}, action.operation);
|
|
56
89
|
default: {
|
|
57
90
|
const _exhaustive = action.type;
|
|
@@ -60,31 +93,44 @@ function reduceApprovedVisibleCommitState(state, action) {
|
|
|
60
93
|
}
|
|
61
94
|
}
|
|
62
95
|
function resolvePendingNavigationCommitDecision(options) {
|
|
63
|
-
const
|
|
64
|
-
switch (disposition) {
|
|
96
|
+
const decision = resolvePendingNavigationCommitDispositionDecision(options);
|
|
97
|
+
switch (decision.disposition) {
|
|
65
98
|
case "skip": return {
|
|
66
99
|
disposition: "no-commit",
|
|
67
|
-
trace
|
|
100
|
+
trace: decision.trace
|
|
68
101
|
};
|
|
69
102
|
case "hard-navigate": return {
|
|
70
103
|
disposition: "hard-navigate",
|
|
71
|
-
trace
|
|
104
|
+
trace: decision.trace
|
|
72
105
|
};
|
|
73
|
-
case "dispatch": return createVisibleCommitDecision(trace);
|
|
74
|
-
default: throw new Error("[vinext] Unknown navigation commit disposition: " + String(
|
|
106
|
+
case "dispatch": return createVisibleCommitDecision(decision.trace, decision.preserveElementIds, decision.preserveAbsentSlots, decision.preservePreviousSlotIds);
|
|
107
|
+
default: throw new Error("[vinext] Unknown navigation commit disposition: " + String(decision));
|
|
75
108
|
}
|
|
76
109
|
}
|
|
77
|
-
function createVisibleCommitDecision(trace = createNavigationTrace(NavigationTraceReasonCodes.commitCurrent)) {
|
|
110
|
+
function createVisibleCommitDecision(trace = createNavigationTrace(NavigationTraceReasonCodes.commitCurrent), preserveElementIds = [], preserveAbsentSlots = false, preservePreviousSlotIds = []) {
|
|
78
111
|
return {
|
|
79
112
|
disposition: "commit",
|
|
113
|
+
preserveAbsentSlots,
|
|
114
|
+
preserveElementIds: [...preserveElementIds],
|
|
115
|
+
preservePreviousSlotIds: [...preservePreviousSlotIds],
|
|
80
116
|
trace
|
|
81
117
|
};
|
|
82
118
|
}
|
|
119
|
+
function mergeLayoutFlags(previousFlags, nextFlags, preserveElementIds) {
|
|
120
|
+
const merged = { ...nextFlags };
|
|
121
|
+
for (const id of preserveElementIds) {
|
|
122
|
+
if (Object.hasOwn(merged, id)) continue;
|
|
123
|
+
const value = previousFlags[id];
|
|
124
|
+
if (value) merged[id] = value;
|
|
125
|
+
}
|
|
126
|
+
return merged;
|
|
127
|
+
}
|
|
83
128
|
function createApprovedVisibleCommit(options) {
|
|
84
129
|
return {
|
|
85
130
|
[approvedVisibleCommitBrand]: true,
|
|
86
131
|
action: options.pending.action,
|
|
87
132
|
decision: options.decision,
|
|
133
|
+
interception: options.pending.interception,
|
|
88
134
|
interceptionContext: options.pending.interceptionContext,
|
|
89
135
|
previousNextUrl: options.pending.previousNextUrl,
|
|
90
136
|
rootLayoutTreePath: options.pending.rootLayoutTreePath,
|
|
@@ -130,11 +176,11 @@ function approveHmrVisibleCommit(pending) {
|
|
|
130
176
|
function approvePendingNavigationCommit(options) {
|
|
131
177
|
const decision = addCommitTransactionTrace(resolvePendingNavigationCommitDecision({
|
|
132
178
|
activeNavigationId: options.activeNavigationId,
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
179
|
+
currentState: options.currentState,
|
|
180
|
+
pending: options.pending,
|
|
181
|
+
routeManifest: options.routeManifest ?? null,
|
|
136
182
|
startedNavigationId: options.startedNavigationId,
|
|
137
|
-
|
|
183
|
+
targetHref: options.targetHref
|
|
138
184
|
}), options.pending);
|
|
139
185
|
switch (decision.disposition) {
|
|
140
186
|
case "commit": return {
|
|
@@ -167,7 +213,9 @@ async function resolveAndClassifyNavigationCommit(options) {
|
|
|
167
213
|
activeNavigationId: options.getActiveNavigationId?.() ?? options.activeNavigationId,
|
|
168
214
|
currentState: approvalState,
|
|
169
215
|
pending,
|
|
170
|
-
|
|
216
|
+
routeManifest: options.routeManifest ?? null,
|
|
217
|
+
startedNavigationId: options.startedNavigationId,
|
|
218
|
+
targetHref: options.targetHref
|
|
171
219
|
});
|
|
172
220
|
return {
|
|
173
221
|
approvedCommit: approval.approvedCommit,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-browser-visible-commit.js","names":[],"sources":["../../src/server/app-browser-visible-commit.ts"],"sourcesContent":["import type { ClientNavigationRenderSnapshot } from \"vinext/shims/navigation\";\nimport { mergeElements } from \"vinext/shims/slot\";\nimport type { AppElements } from \"./app-elements.js\";\nimport {\n createPendingNavigationCommit,\n resolvePendingNavigationCommitDispositionDecision,\n type AppRouterAction,\n type AppRouterState,\n type CommittedOperationRecord,\n type OperationLane,\n type PendingNavigationCommit,\n type PendingOperationRecord,\n} from \"./app-browser-state.js\";\nimport {\n NavigationTraceReasonCodes,\n NavigationTraceTransactionCodes,\n createNavigationTrace,\n prependNavigationTraceEntry,\n type NavigationTrace,\n type NavigationTraceFields,\n type NavigationTraceTransactionCode,\n} from \"./navigation-trace.js\";\n\ntype VisibleCommitDecision = {\n disposition: \"commit\";\n trace: NavigationTrace;\n};\ntype HardNavigateCommitDecision = {\n disposition: \"hard-navigate\";\n trace: NavigationTrace;\n};\ntype NoCommitDecision = {\n disposition: \"no-commit\";\n trace: NavigationTrace;\n};\ntype CommitDecision = VisibleCommitDecision | HardNavigateCommitDecision | NoCommitDecision;\nconst approvedVisibleCommitBrand: unique symbol = Symbol(\"ApprovedVisibleCommit\");\nexport type ApprovedVisibleCommit = {\n readonly [approvedVisibleCommitBrand]: true;\n readonly action: AppRouterAction;\n readonly decision: VisibleCommitDecision;\n readonly interceptionContext: string | null;\n readonly previousNextUrl: string | null;\n readonly rootLayoutTreePath: string | null;\n readonly routeId: string;\n};\ntype VisibleCommitApproval = {\n approvedCommit: ApprovedVisibleCommit;\n decision: VisibleCommitDecision;\n};\ntype NonVisibleCommitApproval = {\n approvedCommit: null;\n decision: HardNavigateCommitDecision | NoCommitDecision;\n};\ntype CommitApproval = VisibleCommitApproval | NonVisibleCommitApproval;\ntype ClassifiedPendingNavigationCommit = {\n approvedCommit: ApprovedVisibleCommit | null;\n decision: CommitDecision;\n pending: PendingNavigationCommit;\n trace: NavigationTrace;\n};\n\nexport function applyApprovedVisibleCommit(\n state: AppRouterState,\n commit: ApprovedVisibleCommit,\n): AppRouterState {\n assertApprovedVisibleCommit(commit);\n return reduceApprovedVisibleCommitState(state, commit.action);\n}\n\nfunction assertApprovedVisibleCommit(commit: ApprovedVisibleCommit): void {\n if (commit[approvedVisibleCommitBrand] !== true) {\n throw new Error(\"[vinext] Visible router state mutation requires ApprovedVisibleCommit\");\n }\n}\n\nfunction commitOperationRecord(\n operation: PendingOperationRecord,\n visibleCommitVersion: number,\n): CommittedOperationRecord {\n return {\n id: operation.id,\n lane: operation.lane,\n startedVisibleCommitVersion: operation.startedVisibleCommitVersion,\n state: \"committed\",\n visibleCommitVersion,\n };\n}\n\nfunction commitVisibleRouterState(\n state: AppRouterState,\n nextState: Omit<AppRouterState, \"activeOperation\" | \"visibleCommitVersion\">,\n operation: PendingOperationRecord,\n): AppRouterState {\n // Single owner for visibleCommitVersion: only an ApprovedVisibleCommit may\n // advance it, and every accepted visible mutation advances it exactly once.\n const visibleCommitVersion = state.visibleCommitVersion + 1;\n return {\n ...nextState,\n activeOperation: commitOperationRecord(operation, visibleCommitVersion),\n visibleCommitVersion,\n };\n}\n\nfunction reduceApprovedVisibleCommitState(\n state: AppRouterState,\n action: AppRouterAction,\n): AppRouterState {\n switch (action.type) {\n case \"traverse\":\n case \"navigate\":\n return commitVisibleRouterState(\n state,\n {\n elements: mergeElements(state.elements, action.elements, action.type === \"traverse\"),\n interceptionContext: action.interceptionContext,\n layoutFlags: { ...state.layoutFlags, ...action.layoutFlags },\n navigationSnapshot: action.navigationSnapshot,\n previousNextUrl: action.previousNextUrl,\n renderId: action.renderId,\n rootLayoutTreePath: action.rootLayoutTreePath,\n routeId: action.routeId,\n },\n action.operation,\n );\n case \"replace\":\n return commitVisibleRouterState(\n state,\n {\n elements: action.elements,\n interceptionContext: action.interceptionContext,\n layoutFlags: action.layoutFlags,\n navigationSnapshot: action.navigationSnapshot,\n previousNextUrl: action.previousNextUrl,\n renderId: action.renderId,\n rootLayoutTreePath: action.rootLayoutTreePath,\n routeId: action.routeId,\n },\n action.operation,\n );\n default: {\n const _exhaustive: never = action.type;\n throw new Error(\"[vinext] Unknown router action: \" + String(_exhaustive));\n }\n }\n}\n\nfunction resolvePendingNavigationCommitDecision(options: {\n activeNavigationId: number;\n currentVisibleCommitVersion: number;\n currentRootLayoutTreePath: string | null;\n nextRootLayoutTreePath: string | null;\n startedNavigationId: number;\n startedVisibleCommitVersion: number;\n}): CommitDecision {\n const { disposition, trace } = resolvePendingNavigationCommitDispositionDecision(options);\n\n switch (disposition) {\n case \"skip\":\n return { disposition: \"no-commit\", trace };\n case \"hard-navigate\":\n return { disposition: \"hard-navigate\", trace };\n case \"dispatch\":\n return createVisibleCommitDecision(trace);\n default: {\n const _exhaustive: never = disposition;\n throw new Error(\"[vinext] Unknown navigation commit disposition: \" + String(_exhaustive));\n }\n }\n}\n\nfunction createVisibleCommitDecision(\n trace: NavigationTrace = createNavigationTrace(NavigationTraceReasonCodes.commitCurrent),\n): VisibleCommitDecision {\n return { disposition: \"commit\", trace };\n}\n\nfunction createApprovedVisibleCommit(options: {\n decision: VisibleCommitDecision;\n pending: PendingNavigationCommit;\n}): ApprovedVisibleCommit {\n return {\n [approvedVisibleCommitBrand]: true,\n action: options.pending.action,\n decision: options.decision,\n interceptionContext: options.pending.interceptionContext,\n previousNextUrl: options.pending.previousNextUrl,\n rootLayoutTreePath: options.pending.rootLayoutTreePath,\n routeId: options.pending.routeId,\n };\n}\n\nfunction createCommitTransactionFields(pending: PendingNavigationCommit): NavigationTraceFields {\n return {\n operationLane: pending.action.operation.lane,\n pendingOperationId: pending.action.operation.id,\n startedVisibleCommitVersion: pending.action.operation.startedVisibleCommitVersion,\n };\n}\n\nfunction prependCommitTransactionTrace(\n trace: NavigationTrace,\n code: NavigationTraceTransactionCode,\n pending: PendingNavigationCommit,\n): NavigationTrace {\n return prependNavigationTraceEntry(trace, code, createCommitTransactionFields(pending));\n}\n\nfunction addCommitTransactionTrace(\n decision: CommitDecision,\n pending: PendingNavigationCommit,\n): CommitDecision {\n switch (decision.disposition) {\n case \"commit\":\n return {\n ...decision,\n trace: prependCommitTransactionTrace(\n decision.trace,\n NavigationTraceTransactionCodes.visibleCommit,\n pending,\n ),\n };\n case \"hard-navigate\":\n return {\n ...decision,\n trace: prependCommitTransactionTrace(\n decision.trace,\n NavigationTraceTransactionCodes.hardNavigate,\n pending,\n ),\n };\n case \"no-commit\":\n return {\n ...decision,\n trace: prependCommitTransactionTrace(\n decision.trace,\n NavigationTraceTransactionCodes.noCommit,\n pending,\n ),\n };\n default: {\n const _exhaustive: never = decision;\n throw new Error(\"[vinext] Unknown commit decision: \" + String(_exhaustive));\n }\n }\n}\n\nexport function approveHmrVisibleCommit(pending: PendingNavigationCommit): ApprovedVisibleCommit {\n if (pending.action.operation.lane !== \"hmr\") {\n throw new Error(\"[vinext] HMR visible commit approval requires an HMR pending operation\");\n }\n\n const decision = addCommitTransactionTrace(createVisibleCommitDecision(), pending);\n // This guard is a type narrowing assertion: createVisibleCommitDecision()\n // structurally produces a commit decision, and addCommitTransactionTrace()\n // must preserve that disposition while adding operator trace context.\n if (decision.disposition !== \"commit\") {\n throw new Error(\"[vinext] HMR visible commit approval did not produce a commit decision\");\n }\n\n return createApprovedVisibleCommit({\n decision,\n pending,\n });\n}\n\nexport function approvePendingNavigationCommit(options: {\n activeNavigationId: number;\n currentState: AppRouterState;\n pending: PendingNavigationCommit;\n startedNavigationId: number;\n}): CommitApproval {\n const decision = addCommitTransactionTrace(\n resolvePendingNavigationCommitDecision({\n activeNavigationId: options.activeNavigationId,\n currentVisibleCommitVersion: options.currentState.visibleCommitVersion,\n currentRootLayoutTreePath: options.currentState.rootLayoutTreePath,\n nextRootLayoutTreePath: options.pending.rootLayoutTreePath,\n startedNavigationId: options.startedNavigationId,\n startedVisibleCommitVersion: options.pending.action.operation.startedVisibleCommitVersion,\n }),\n options.pending,\n );\n\n switch (decision.disposition) {\n case \"commit\":\n return {\n approvedCommit: createApprovedVisibleCommit({\n decision,\n pending: options.pending,\n }),\n decision,\n };\n case \"hard-navigate\":\n case \"no-commit\":\n return {\n approvedCommit: null,\n decision,\n };\n default: {\n const _exhaustive: never = decision;\n throw new Error(\"[vinext] Unknown commit decision: \" + String(_exhaustive));\n }\n }\n}\n\nexport async function resolveAndClassifyNavigationCommit(options: {\n activeNavigationId: number;\n currentState: AppRouterState;\n // When provided, these getters are called after awaiting nextElements so\n // approval uses the latest lifecycle authority instead of the call snapshot.\n getActiveNavigationId?: () => number;\n getCurrentStateForApproval?: () => AppRouterState;\n navigationSnapshot: ClientNavigationRenderSnapshot;\n nextElements: Promise<AppElements>;\n operationLane: OperationLane;\n previousNextUrl?: string | null;\n renderId: number;\n startedNavigationId: number;\n type: \"navigate\" | \"replace\" | \"traverse\";\n}): Promise<ClassifiedPendingNavigationCommit> {\n const pending = await createPendingNavigationCommit({\n currentState: options.currentState,\n nextElements: options.nextElements,\n navigationSnapshot: options.navigationSnapshot,\n operationLane: options.operationLane,\n previousNextUrl: options.previousNextUrl,\n renderId: options.renderId,\n type: options.type,\n });\n\n const approvalState = options.getCurrentStateForApproval?.() ?? options.currentState;\n const approval = approvePendingNavigationCommit({\n activeNavigationId: options.getActiveNavigationId?.() ?? options.activeNavigationId,\n currentState: approvalState,\n pending,\n startedNavigationId: options.startedNavigationId,\n });\n\n return {\n approvedCommit: approval.approvedCommit,\n decision: approval.decision,\n pending,\n trace: approval.decision.trace,\n };\n}\n"],"mappings":";;;;AAoCA,MAAM,6BAA4C,OAAO,wBAAwB;AA0BjF,SAAgB,2BACd,OACA,QACgB;AAChB,6BAA4B,OAAO;AACnC,QAAO,iCAAiC,OAAO,OAAO,OAAO;;AAG/D,SAAS,4BAA4B,QAAqC;AACxE,KAAI,OAAO,gCAAgC,KACzC,OAAM,IAAI,MAAM,wEAAwE;;AAI5F,SAAS,sBACP,WACA,sBAC0B;AAC1B,QAAO;EACL,IAAI,UAAU;EACd,MAAM,UAAU;EAChB,6BAA6B,UAAU;EACvC,OAAO;EACP;EACD;;AAGH,SAAS,yBACP,OACA,WACA,WACgB;CAGhB,MAAM,uBAAuB,MAAM,uBAAuB;AAC1D,QAAO;EACL,GAAG;EACH,iBAAiB,sBAAsB,WAAW,qBAAqB;EACvE;EACD;;AAGH,SAAS,iCACP,OACA,QACgB;AAChB,SAAQ,OAAO,MAAf;EACE,KAAK;EACL,KAAK,WACH,QAAO,yBACL,OACA;GACE,UAAU,cAAc,MAAM,UAAU,OAAO,UAAU,OAAO,SAAS,WAAW;GACpF,qBAAqB,OAAO;GAC5B,aAAa;IAAE,GAAG,MAAM;IAAa,GAAG,OAAO;IAAa;GAC5D,oBAAoB,OAAO;GAC3B,iBAAiB,OAAO;GACxB,UAAU,OAAO;GACjB,oBAAoB,OAAO;GAC3B,SAAS,OAAO;GACjB,EACD,OAAO,UACR;EACH,KAAK,UACH,QAAO,yBACL,OACA;GACE,UAAU,OAAO;GACjB,qBAAqB,OAAO;GAC5B,aAAa,OAAO;GACpB,oBAAoB,OAAO;GAC3B,iBAAiB,OAAO;GACxB,UAAU,OAAO;GACjB,oBAAoB,OAAO;GAC3B,SAAS,OAAO;GACjB,EACD,OAAO,UACR;EACH,SAAS;GACP,MAAM,cAAqB,OAAO;AAClC,SAAM,IAAI,MAAM,qCAAqC,OAAO,YAAY,CAAC;;;;AAK/E,SAAS,uCAAuC,SAO7B;CACjB,MAAM,EAAE,aAAa,UAAU,kDAAkD,QAAQ;AAEzF,SAAQ,aAAR;EACE,KAAK,OACH,QAAO;GAAE,aAAa;GAAa;GAAO;EAC5C,KAAK,gBACH,QAAO;GAAE,aAAa;GAAiB;GAAO;EAChD,KAAK,WACH,QAAO,4BAA4B,MAAM;EAC3C,QAEE,OAAM,IAAI,MAAM,qDAAqD,OAD1C,YAC6D,CAAC;;;AAK/F,SAAS,4BACP,QAAyB,sBAAsB,2BAA2B,cAAc,EACjE;AACvB,QAAO;EAAE,aAAa;EAAU;EAAO;;AAGzC,SAAS,4BAA4B,SAGX;AACxB,QAAO;GACJ,6BAA6B;EAC9B,QAAQ,QAAQ,QAAQ;EACxB,UAAU,QAAQ;EAClB,qBAAqB,QAAQ,QAAQ;EACrC,iBAAiB,QAAQ,QAAQ;EACjC,oBAAoB,QAAQ,QAAQ;EACpC,SAAS,QAAQ,QAAQ;EAC1B;;AAGH,SAAS,8BAA8B,SAAyD;AAC9F,QAAO;EACL,eAAe,QAAQ,OAAO,UAAU;EACxC,oBAAoB,QAAQ,OAAO,UAAU;EAC7C,6BAA6B,QAAQ,OAAO,UAAU;EACvD;;AAGH,SAAS,8BACP,OACA,MACA,SACiB;AACjB,QAAO,4BAA4B,OAAO,MAAM,8BAA8B,QAAQ,CAAC;;AAGzF,SAAS,0BACP,UACA,SACgB;AAChB,SAAQ,SAAS,aAAjB;EACE,KAAK,SACH,QAAO;GACL,GAAG;GACH,OAAO,8BACL,SAAS,OACT,gCAAgC,eAChC,QACD;GACF;EACH,KAAK,gBACH,QAAO;GACL,GAAG;GACH,OAAO,8BACL,SAAS,OACT,gCAAgC,cAChC,QACD;GACF;EACH,KAAK,YACH,QAAO;GACL,GAAG;GACH,OAAO,8BACL,SAAS,OACT,gCAAgC,UAChC,QACD;GACF;EACH,QAEE,OAAM,IAAI,MAAM,uCAAuC,OAD5B,SAC+C,CAAC;;;AAKjF,SAAgB,wBAAwB,SAAyD;AAC/F,KAAI,QAAQ,OAAO,UAAU,SAAS,MACpC,OAAM,IAAI,MAAM,yEAAyE;CAG3F,MAAM,WAAW,0BAA0B,6BAA6B,EAAE,QAAQ;AAIlF,KAAI,SAAS,gBAAgB,SAC3B,OAAM,IAAI,MAAM,yEAAyE;AAG3F,QAAO,4BAA4B;EACjC;EACA;EACD,CAAC;;AAGJ,SAAgB,+BAA+B,SAK5B;CACjB,MAAM,WAAW,0BACf,uCAAuC;EACrC,oBAAoB,QAAQ;EAC5B,6BAA6B,QAAQ,aAAa;EAClD,2BAA2B,QAAQ,aAAa;EAChD,wBAAwB,QAAQ,QAAQ;EACxC,qBAAqB,QAAQ;EAC7B,6BAA6B,QAAQ,QAAQ,OAAO,UAAU;EAC/D,CAAC,EACF,QAAQ,QACT;AAED,SAAQ,SAAS,aAAjB;EACE,KAAK,SACH,QAAO;GACL,gBAAgB,4BAA4B;IAC1C;IACA,SAAS,QAAQ;IAClB,CAAC;GACF;GACD;EACH,KAAK;EACL,KAAK,YACH,QAAO;GACL,gBAAgB;GAChB;GACD;EACH,QAEE,OAAM,IAAI,MAAM,uCAAuC,OAD5B,SAC+C,CAAC;;;AAKjF,eAAsB,mCAAmC,SAcV;CAC7C,MAAM,UAAU,MAAM,8BAA8B;EAClD,cAAc,QAAQ;EACtB,cAAc,QAAQ;EACtB,oBAAoB,QAAQ;EAC5B,eAAe,QAAQ;EACvB,iBAAiB,QAAQ;EACzB,UAAU,QAAQ;EAClB,MAAM,QAAQ;EACf,CAAC;CAEF,MAAM,gBAAgB,QAAQ,8BAA8B,IAAI,QAAQ;CACxE,MAAM,WAAW,+BAA+B;EAC9C,oBAAoB,QAAQ,yBAAyB,IAAI,QAAQ;EACjE,cAAc;EACd;EACA,qBAAqB,QAAQ;EAC9B,CAAC;AAEF,QAAO;EACL,gBAAgB,SAAS;EACzB,UAAU,SAAS;EACnB;EACA,OAAO,SAAS,SAAS;EAC1B"}
|
|
1
|
+
{"version":3,"file":"app-browser-visible-commit.js","names":["_exhaustive"],"sources":["../../src/server/app-browser-visible-commit.ts"],"sourcesContent":["import type { ClientNavigationRenderSnapshot } from \"vinext/shims/navigation\";\nimport type { RouteManifest } from \"../routing/app-route-graph.js\";\nimport { mergeElements } from \"vinext/shims/slot\";\nimport {\n normalizeAppElementsSlotBindings,\n type AppElements,\n type AppElementsSlotBinding,\n} from \"./app-elements.js\";\nimport {\n createPendingNavigationCommit,\n resolvePendingNavigationCommitDispositionDecision,\n type AppRouterAction,\n type AppRouterState,\n type CommittedOperationRecord,\n type OperationLane,\n type PendingNavigationCommit,\n type PendingOperationRecord,\n} from \"./app-browser-state.js\";\nimport {\n NavigationTraceReasonCodes,\n NavigationTraceTransactionCodes,\n createNavigationTrace,\n prependNavigationTraceEntry,\n type NavigationTrace,\n type NavigationTraceFields,\n type NavigationTraceTransactionCode,\n} from \"./navigation-trace.js\";\n\ntype VisibleCommitDecision = {\n disposition: \"commit\";\n preserveAbsentSlots: boolean;\n preserveElementIds: readonly string[];\n preservePreviousSlotIds: readonly string[];\n trace: NavigationTrace;\n};\ntype HardNavigateCommitDecision = {\n disposition: \"hard-navigate\";\n trace: NavigationTrace;\n};\ntype NoCommitDecision = {\n disposition: \"no-commit\";\n trace: NavigationTrace;\n};\ntype CommitDecision = VisibleCommitDecision | HardNavigateCommitDecision | NoCommitDecision;\nconst approvedVisibleCommitBrand: unique symbol = Symbol(\"ApprovedVisibleCommit\");\nexport type ApprovedVisibleCommit = {\n readonly [approvedVisibleCommitBrand]: true;\n readonly action: AppRouterAction;\n readonly decision: VisibleCommitDecision;\n readonly interception: AppRouterAction[\"interception\"];\n readonly interceptionContext: string | null;\n readonly previousNextUrl: string | null;\n readonly rootLayoutTreePath: string | null;\n readonly routeId: string;\n};\ntype VisibleCommitApproval = {\n approvedCommit: ApprovedVisibleCommit;\n decision: VisibleCommitDecision;\n};\ntype NonVisibleCommitApproval = {\n approvedCommit: null;\n decision: HardNavigateCommitDecision | NoCommitDecision;\n};\ntype CommitApproval = VisibleCommitApproval | NonVisibleCommitApproval;\ntype ClassifiedPendingNavigationCommit = {\n approvedCommit: ApprovedVisibleCommit | null;\n decision: CommitDecision;\n pending: PendingNavigationCommit;\n trace: NavigationTrace;\n};\n\nexport function applyApprovedVisibleCommit(\n state: AppRouterState,\n commit: ApprovedVisibleCommit,\n): AppRouterState {\n assertApprovedVisibleCommit(commit);\n return reduceApprovedVisibleCommitState(state, commit);\n}\n\nfunction assertApprovedVisibleCommit(commit: ApprovedVisibleCommit): void {\n if (commit[approvedVisibleCommitBrand] !== true) {\n throw new Error(\"[vinext] Visible router state mutation requires ApprovedVisibleCommit\");\n }\n}\n\nfunction commitOperationRecord(\n operation: PendingOperationRecord,\n visibleCommitVersion: number,\n): CommittedOperationRecord {\n return {\n id: operation.id,\n lane: operation.lane,\n startedVisibleCommitVersion: operation.startedVisibleCommitVersion,\n state: \"committed\",\n visibleCommitVersion,\n };\n}\n\nfunction commitVisibleRouterState(\n state: AppRouterState,\n nextState: Omit<AppRouterState, \"activeOperation\" | \"visibleCommitVersion\">,\n operation: PendingOperationRecord,\n): AppRouterState {\n // Single owner for visibleCommitVersion: only an ApprovedVisibleCommit may\n // advance it, and every accepted visible mutation advances it exactly once.\n const visibleCommitVersion = state.visibleCommitVersion + 1;\n return {\n ...nextState,\n activeOperation: commitOperationRecord(operation, visibleCommitVersion),\n visibleCommitVersion,\n };\n}\n\nfunction mergeSlotBindings(\n previousBindings: readonly AppElementsSlotBinding[],\n nextBindings: readonly AppElementsSlotBinding[],\n layoutIds: readonly string[],\n preservePreviousSlotIds: readonly string[],\n): readonly AppElementsSlotBinding[] {\n if (preservePreviousSlotIds.length === 0) return nextBindings;\n\n const preservedSlotIds = new Set(preservePreviousSlotIds);\n const previousBindingsBySlotId = new Map<string, AppElementsSlotBinding>();\n for (const binding of previousBindings) {\n if (!preservedSlotIds.has(binding.slotId)) continue;\n previousBindingsBySlotId.set(binding.slotId, binding);\n }\n\n const mergedBindings: AppElementsSlotBinding[] = [];\n const seenSlotIds = new Set<string>();\n for (const binding of nextBindings) {\n const previousBinding = previousBindingsBySlotId.get(binding.slotId);\n mergedBindings.push(previousBinding ?? binding);\n seenSlotIds.add(binding.slotId);\n }\n for (const slotId of preservePreviousSlotIds) {\n if (seenSlotIds.has(slotId)) continue;\n const previousBinding = previousBindingsBySlotId.get(slotId);\n if (previousBinding) mergedBindings.push(previousBinding);\n }\n return normalizeAppElementsSlotBindings(mergedBindings, { layoutIds });\n}\n\nfunction reduceApprovedVisibleCommitState(\n state: AppRouterState,\n commit: ApprovedVisibleCommit,\n): AppRouterState {\n const { action } = commit;\n switch (action.type) {\n case \"traverse\":\n case \"navigate\":\n return commitVisibleRouterState(\n state,\n {\n elements: mergeElements(state.elements, action.elements, {\n clearAbsentSlots: action.type === \"traverse\",\n preserveAbsentSlots: commit.decision.preserveAbsentSlots,\n preserveElementIds: commit.decision.preserveElementIds,\n preservePreviousSlotIds: commit.decision.preservePreviousSlotIds,\n }),\n interception: action.interception,\n interceptionContext: action.interceptionContext,\n layoutFlags: mergeLayoutFlags(\n state.layoutFlags,\n action.layoutFlags,\n commit.decision.preserveElementIds,\n ),\n layoutIds: action.layoutIds,\n navigationSnapshot: action.navigationSnapshot,\n previousNextUrl: action.previousNextUrl,\n renderId: action.renderId,\n rootLayoutTreePath: action.rootLayoutTreePath,\n routeId: action.routeId,\n slotBindings: mergeSlotBindings(\n state.slotBindings,\n action.slotBindings,\n action.layoutIds,\n commit.decision.preservePreviousSlotIds,\n ),\n },\n action.operation,\n );\n case \"replace\":\n return commitVisibleRouterState(\n state,\n {\n elements: action.elements,\n interception: action.interception,\n interceptionContext: action.interceptionContext,\n layoutFlags: action.layoutFlags,\n layoutIds: action.layoutIds,\n navigationSnapshot: action.navigationSnapshot,\n previousNextUrl: action.previousNextUrl,\n renderId: action.renderId,\n rootLayoutTreePath: action.rootLayoutTreePath,\n routeId: action.routeId,\n slotBindings: action.slotBindings,\n },\n action.operation,\n );\n default: {\n const _exhaustive: never = action.type;\n throw new Error(\"[vinext] Unknown router action: \" + String(_exhaustive));\n }\n }\n}\n\nfunction resolvePendingNavigationCommitDecision(options: {\n activeNavigationId: number;\n currentState: AppRouterState;\n pending: PendingNavigationCommit;\n routeManifest?: RouteManifest | null;\n startedNavigationId: number;\n targetHref: string;\n}): CommitDecision {\n const decision = resolvePendingNavigationCommitDispositionDecision(options);\n\n switch (decision.disposition) {\n case \"skip\":\n return { disposition: \"no-commit\", trace: decision.trace };\n case \"hard-navigate\":\n return { disposition: \"hard-navigate\", trace: decision.trace };\n case \"dispatch\":\n return createVisibleCommitDecision(\n decision.trace,\n decision.preserveElementIds,\n decision.preserveAbsentSlots,\n decision.preservePreviousSlotIds,\n );\n default: {\n const _exhaustive: never = decision;\n throw new Error(\"[vinext] Unknown navigation commit disposition: \" + String(_exhaustive));\n }\n }\n}\n\nfunction createVisibleCommitDecision(\n trace: NavigationTrace = createNavigationTrace(NavigationTraceReasonCodes.commitCurrent),\n preserveElementIds: readonly string[] = [],\n preserveAbsentSlots: boolean = false,\n preservePreviousSlotIds: readonly string[] = [],\n): VisibleCommitDecision {\n return {\n disposition: \"commit\",\n preserveAbsentSlots,\n preserveElementIds: [...preserveElementIds],\n preservePreviousSlotIds: [...preservePreviousSlotIds],\n trace,\n };\n}\n\nfunction mergeLayoutFlags(\n previousFlags: AppRouterState[\"layoutFlags\"],\n nextFlags: AppRouterState[\"layoutFlags\"],\n preserveElementIds: readonly string[],\n): AppRouterState[\"layoutFlags\"] {\n const merged: Record<string, \"s\" | \"d\"> = { ...nextFlags };\n for (const id of preserveElementIds) {\n if (Object.hasOwn(merged, id)) continue;\n const value = previousFlags[id];\n if (value) merged[id] = value;\n }\n return merged;\n}\n\nfunction createApprovedVisibleCommit(options: {\n decision: VisibleCommitDecision;\n pending: PendingNavigationCommit;\n}): ApprovedVisibleCommit {\n return {\n [approvedVisibleCommitBrand]: true,\n action: options.pending.action,\n decision: options.decision,\n interception: options.pending.interception,\n interceptionContext: options.pending.interceptionContext,\n previousNextUrl: options.pending.previousNextUrl,\n rootLayoutTreePath: options.pending.rootLayoutTreePath,\n routeId: options.pending.routeId,\n };\n}\n\nfunction createCommitTransactionFields(pending: PendingNavigationCommit): NavigationTraceFields {\n return {\n operationLane: pending.action.operation.lane,\n pendingOperationId: pending.action.operation.id,\n startedVisibleCommitVersion: pending.action.operation.startedVisibleCommitVersion,\n };\n}\n\nfunction prependCommitTransactionTrace(\n trace: NavigationTrace,\n code: NavigationTraceTransactionCode,\n pending: PendingNavigationCommit,\n): NavigationTrace {\n return prependNavigationTraceEntry(trace, code, createCommitTransactionFields(pending));\n}\n\nfunction addCommitTransactionTrace(\n decision: CommitDecision,\n pending: PendingNavigationCommit,\n): CommitDecision {\n switch (decision.disposition) {\n case \"commit\":\n return {\n ...decision,\n trace: prependCommitTransactionTrace(\n decision.trace,\n NavigationTraceTransactionCodes.visibleCommit,\n pending,\n ),\n };\n case \"hard-navigate\":\n return {\n ...decision,\n trace: prependCommitTransactionTrace(\n decision.trace,\n NavigationTraceTransactionCodes.hardNavigate,\n pending,\n ),\n };\n case \"no-commit\":\n return {\n ...decision,\n trace: prependCommitTransactionTrace(\n decision.trace,\n NavigationTraceTransactionCodes.noCommit,\n pending,\n ),\n };\n default: {\n const _exhaustive: never = decision;\n throw new Error(\"[vinext] Unknown commit decision: \" + String(_exhaustive));\n }\n }\n}\n\nexport function approveHmrVisibleCommit(pending: PendingNavigationCommit): ApprovedVisibleCommit {\n if (pending.action.operation.lane !== \"hmr\") {\n throw new Error(\"[vinext] HMR visible commit approval requires an HMR pending operation\");\n }\n\n const decision = addCommitTransactionTrace(createVisibleCommitDecision(), pending);\n // This guard is a type narrowing assertion: createVisibleCommitDecision()\n // structurally produces a commit decision, and addCommitTransactionTrace()\n // must preserve that disposition while adding operator trace context.\n if (decision.disposition !== \"commit\") {\n throw new Error(\"[vinext] HMR visible commit approval did not produce a commit decision\");\n }\n\n return createApprovedVisibleCommit({\n decision,\n pending,\n });\n}\n\nexport function approvePendingNavigationCommit(options: {\n activeNavigationId: number;\n currentState: AppRouterState;\n pending: PendingNavigationCommit;\n routeManifest?: RouteManifest | null;\n startedNavigationId: number;\n targetHref: string;\n}): CommitApproval {\n const decision = addCommitTransactionTrace(\n resolvePendingNavigationCommitDecision({\n activeNavigationId: options.activeNavigationId,\n currentState: options.currentState,\n pending: options.pending,\n routeManifest: options.routeManifest ?? null,\n startedNavigationId: options.startedNavigationId,\n targetHref: options.targetHref,\n }),\n options.pending,\n );\n\n switch (decision.disposition) {\n case \"commit\":\n return {\n approvedCommit: createApprovedVisibleCommit({\n decision,\n pending: options.pending,\n }),\n decision,\n };\n case \"hard-navigate\":\n case \"no-commit\":\n return {\n approvedCommit: null,\n decision,\n };\n default: {\n const _exhaustive: never = decision;\n throw new Error(\"[vinext] Unknown commit decision: \" + String(_exhaustive));\n }\n }\n}\n\nexport async function resolveAndClassifyNavigationCommit(options: {\n activeNavigationId: number;\n currentState: AppRouterState;\n // When provided, these getters are called after awaiting nextElements so\n // approval uses the latest lifecycle authority instead of the call snapshot.\n getActiveNavigationId?: () => number;\n getCurrentStateForApproval?: () => AppRouterState;\n navigationSnapshot: ClientNavigationRenderSnapshot;\n nextElements: Promise<AppElements>;\n operationLane: OperationLane;\n previousNextUrl?: string | null;\n renderId: number;\n routeManifest?: RouteManifest | null;\n startedNavigationId: number;\n targetHref: string;\n type: \"navigate\" | \"replace\" | \"traverse\";\n}): Promise<ClassifiedPendingNavigationCommit> {\n const pending = await createPendingNavigationCommit({\n currentState: options.currentState,\n nextElements: options.nextElements,\n navigationSnapshot: options.navigationSnapshot,\n operationLane: options.operationLane,\n previousNextUrl: options.previousNextUrl,\n renderId: options.renderId,\n type: options.type,\n });\n\n const approvalState = options.getCurrentStateForApproval?.() ?? options.currentState;\n const approval = approvePendingNavigationCommit({\n activeNavigationId: options.getActiveNavigationId?.() ?? options.activeNavigationId,\n currentState: approvalState,\n pending,\n routeManifest: options.routeManifest ?? null,\n startedNavigationId: options.startedNavigationId,\n targetHref: options.targetHref,\n });\n\n return {\n approvedCommit: approval.approvedCommit,\n decision: approval.decision,\n pending,\n trace: approval.decision.trace,\n };\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-client-reference-preloader.js","names":[],"sources":["../../src/server/app-client-reference-preloader.ts"],"sourcesContent":["type ClientReferenceRequire = (id: string) => Promise<unknown>;\n\ntype ClientReferenceMap = Readonly<Record<string, unknown>>;\n\ntype ClientReferencePreloaderOptions = {\n getReferences: () => ClientReferenceMap | undefined;\n getClientRequire: () => ClientReferenceRequire | undefined;\n onPreloadError?: (id: string, error: unknown) => void;\n};\n\ntype ClientReferencePreloader = {\n preload: (referenceIds?: Iterable<string>) => Promise<void>;\n};\n\nconst resolvedPreload = Promise.resolve();\n\nexport function createClientReferencePreloader(\n options: ClientReferencePreloaderOptions,\n): ClientReferencePreloader {\n let allReferencesPreloaded = false;\n let allReferencesPreloadPromise: Promise<void> | null = null;\n const preloadedReferences = new Set<string>();\n const referencePreloadPromises = new Map<string, Promise<void>>();\n\n function preloadReference(id: string, clientRequire: ClientReferenceRequire): Promise<void> {\n if (preloadedReferences.has(id)) {\n return resolvedPreload;\n }\n\n const existing = referencePreloadPromises.get(id);\n if (existing) {\n return existing;\n }\n\n const preloadPromise = clientRequire(id)\n .catch((error) => {\n options.onPreloadError?.(id, error);\n })\n .then(() => {\n preloadedReferences.add(id);\n })\n .finally(() => {\n referencePreloadPromises.delete(id);\n });\n\n referencePreloadPromises.set(id, preloadPromise);\n return preloadPromise;\n }\n\n function preloadReferenceSet(\n referenceIds: Iterable<string>,\n refs: ClientReferenceMap,\n clientRequire: ClientReferenceRequire,\n ): Promise<void> {\n const pending: Promise<void>[] = [];\n\n for (const id of referenceIds) {\n if (Object.hasOwn(refs, id)) {\n pending.push(preloadReference(id, clientRequire));\n }\n }\n\n if (pending.length === 0) {\n return resolvedPreload;\n }\n\n return Promise.all(pending).then(() => {});\n }\n\n return {\n preload(referenceIds) {\n const refs = options.getReferences();\n const clientRequire = options.getClientRequire();\n if (!refs || !clientRequire) {\n return resolvedPreload;\n }\n\n if (referenceIds) {\n return preloadReferenceSet(referenceIds, refs, clientRequire);\n }\n\n if (allReferencesPreloaded) {\n return resolvedPreload;\n }\n if (allReferencesPreloadPromise) {\n return allReferencesPreloadPromise;\n }\n\n allReferencesPreloadPromise = preloadReferenceSet(Object.keys(refs), refs, clientRequire)\n .then(() => {\n allReferencesPreloaded = true;\n })\n .finally(() => {\n allReferencesPreloadPromise = null;\n });\n\n return allReferencesPreloadPromise;\n },\n };\n}\n"],"mappings":";AAcA,MAAM,kBAAkB,QAAQ,SAAS;AAEzC,SAAgB,+BACd,SAC0B;CAC1B,IAAI,yBAAyB;CAC7B,IAAI,8BAAoD;CACxD,MAAM,sCAAsB,IAAI,KAAa;CAC7C,MAAM,2CAA2B,IAAI,KAA4B;CAEjE,SAAS,iBAAiB,IAAY,eAAsD;
|
|
1
|
+
{"version":3,"file":"app-client-reference-preloader.js","names":[],"sources":["../../src/server/app-client-reference-preloader.ts"],"sourcesContent":["type ClientReferenceRequire = (id: string) => Promise<unknown>;\n\ntype ClientReferenceMap = Readonly<Record<string, unknown>>;\n\ntype ClientReferencePreloaderOptions = {\n getReferences: () => ClientReferenceMap | undefined;\n getClientRequire: () => ClientReferenceRequire | undefined;\n onPreloadError?: (id: string, error: unknown) => void;\n};\n\ntype ClientReferencePreloader = {\n preload: (referenceIds?: Iterable<string>) => Promise<void>;\n};\n\nconst resolvedPreload = Promise.resolve();\n\nexport function createClientReferencePreloader(\n options: ClientReferencePreloaderOptions,\n): ClientReferencePreloader {\n let allReferencesPreloaded = false;\n let allReferencesPreloadPromise: Promise<void> | null = null;\n const preloadedReferences = new Set<string>();\n const referencePreloadPromises = new Map<string, Promise<void>>();\n\n function preloadReference(id: string, clientRequire: ClientReferenceRequire): Promise<void> {\n if (preloadedReferences.has(id)) {\n return resolvedPreload;\n }\n\n const existing = referencePreloadPromises.get(id);\n if (existing) {\n return existing;\n }\n\n const preloadPromise = clientRequire(id)\n .catch((error) => {\n options.onPreloadError?.(id, error);\n })\n .then(() => {\n preloadedReferences.add(id);\n })\n .finally(() => {\n referencePreloadPromises.delete(id);\n });\n\n referencePreloadPromises.set(id, preloadPromise);\n return preloadPromise;\n }\n\n function preloadReferenceSet(\n referenceIds: Iterable<string>,\n refs: ClientReferenceMap,\n clientRequire: ClientReferenceRequire,\n ): Promise<void> {\n const pending: Promise<void>[] = [];\n\n for (const id of referenceIds) {\n if (Object.hasOwn(refs, id)) {\n pending.push(preloadReference(id, clientRequire));\n }\n }\n\n if (pending.length === 0) {\n return resolvedPreload;\n }\n\n return Promise.all(pending).then(() => {});\n }\n\n return {\n preload(referenceIds) {\n const refs = options.getReferences();\n const clientRequire = options.getClientRequire();\n if (!refs || !clientRequire) {\n return resolvedPreload;\n }\n\n if (referenceIds) {\n return preloadReferenceSet(referenceIds, refs, clientRequire);\n }\n\n if (allReferencesPreloaded) {\n return resolvedPreload;\n }\n if (allReferencesPreloadPromise) {\n return allReferencesPreloadPromise;\n }\n\n allReferencesPreloadPromise = preloadReferenceSet(Object.keys(refs), refs, clientRequire)\n .then(() => {\n allReferencesPreloaded = true;\n })\n .finally(() => {\n allReferencesPreloadPromise = null;\n });\n\n return allReferencesPreloadPromise;\n },\n };\n}\n"],"mappings":";AAcA,MAAM,kBAAkB,QAAQ,SAAS;AAEzC,SAAgB,+BACd,SAC0B;CAC1B,IAAI,yBAAyB;CAC7B,IAAI,8BAAoD;CACxD,MAAM,sCAAsB,IAAI,KAAa;CAC7C,MAAM,2CAA2B,IAAI,KAA4B;CAEjE,SAAS,iBAAiB,IAAY,eAAsD;EAC1F,IAAI,oBAAoB,IAAI,GAAG,EAC7B,OAAO;EAGT,MAAM,WAAW,yBAAyB,IAAI,GAAG;EACjD,IAAI,UACF,OAAO;EAGT,MAAM,iBAAiB,cAAc,GAAG,CACrC,OAAO,UAAU;GAChB,QAAQ,iBAAiB,IAAI,MAAM;IACnC,CACD,WAAW;GACV,oBAAoB,IAAI,GAAG;IAC3B,CACD,cAAc;GACb,yBAAyB,OAAO,GAAG;IACnC;EAEJ,yBAAyB,IAAI,IAAI,eAAe;EAChD,OAAO;;CAGT,SAAS,oBACP,cACA,MACA,eACe;EACf,MAAM,UAA2B,EAAE;EAEnC,KAAK,MAAM,MAAM,cACf,IAAI,OAAO,OAAO,MAAM,GAAG,EACzB,QAAQ,KAAK,iBAAiB,IAAI,cAAc,CAAC;EAIrD,IAAI,QAAQ,WAAW,GACrB,OAAO;EAGT,OAAO,QAAQ,IAAI,QAAQ,CAAC,WAAW,GAAG;;CAG5C,OAAO,EACL,QAAQ,cAAc;EACpB,MAAM,OAAO,QAAQ,eAAe;EACpC,MAAM,gBAAgB,QAAQ,kBAAkB;EAChD,IAAI,CAAC,QAAQ,CAAC,eACZ,OAAO;EAGT,IAAI,cACF,OAAO,oBAAoB,cAAc,MAAM,cAAc;EAG/D,IAAI,wBACF,OAAO;EAET,IAAI,6BACF,OAAO;EAGT,8BAA8B,oBAAoB,OAAO,KAAK,KAAK,EAAE,MAAM,cAAc,CACtF,WAAW;GACV,yBAAyB;IACzB,CACD,cAAc;GACb,8BAA8B;IAC9B;EAEJ,OAAO;IAEV"}
|
|
@@ -1,16 +1,38 @@
|
|
|
1
|
+
import { RenderObservation } from "./cache-proof.js";
|
|
1
2
|
import { ArtifactCompatibilityEnvelope } from "./artifact-compatibility.js";
|
|
2
3
|
import { ReactNode } from "react";
|
|
3
4
|
|
|
4
5
|
//#region src/server/app-elements-wire.d.ts
|
|
5
6
|
declare const APP_ARTIFACT_COMPATIBILITY_KEY = "__artifactCompatibility";
|
|
7
|
+
declare const APP_INTERCEPTION_KEY = "__interception";
|
|
6
8
|
declare const APP_INTERCEPTION_CONTEXT_KEY = "__interceptionContext";
|
|
9
|
+
declare const APP_LAYOUT_IDS_KEY = "__layoutIds";
|
|
7
10
|
declare const APP_LAYOUT_FLAGS_KEY = "__layoutFlags";
|
|
11
|
+
declare const APP_RENDER_OBSERVATION_KEY = "__renderObservation";
|
|
8
12
|
declare const APP_ROUTE_KEY = "__route";
|
|
9
13
|
declare const APP_ROOT_LAYOUT_KEY = "__rootLayout";
|
|
14
|
+
declare const APP_SLOT_BINDINGS_KEY = "__slotBindings";
|
|
10
15
|
declare const APP_UNMATCHED_SLOT_WIRE_VALUE = "__VINEXT_UNMATCHED_SLOT__";
|
|
11
16
|
declare const UNMATCHED_SLOT: unique symbol;
|
|
12
|
-
type
|
|
13
|
-
type
|
|
17
|
+
type AppElementsSlotBindingState = "active" | "default" | "unmatched";
|
|
18
|
+
type AppElementsSlotBinding = Readonly<{
|
|
19
|
+
ownerLayoutId: string | null;
|
|
20
|
+
slotId: string;
|
|
21
|
+
state: AppElementsSlotBindingState;
|
|
22
|
+
}>;
|
|
23
|
+
type AppElementsInterception = Readonly<{
|
|
24
|
+
sourceMatchedUrl: string;
|
|
25
|
+
sourceRouteId: string;
|
|
26
|
+
slotId: string;
|
|
27
|
+
targetMatchedUrl: string;
|
|
28
|
+
targetRouteId: string;
|
|
29
|
+
}>;
|
|
30
|
+
declare function compareAppElementsSlotIds(left: string, right: string): number;
|
|
31
|
+
declare function normalizeAppElementsSlotBindings(slotBindings: readonly AppElementsSlotBinding[], options?: {
|
|
32
|
+
layoutIds?: readonly string[];
|
|
33
|
+
}): readonly AppElementsSlotBinding[];
|
|
34
|
+
type AppElementValue = ReactNode | typeof UNMATCHED_SLOT | string | null | LayoutFlags | ArtifactCompatibilityEnvelope | AppElementsInterception | readonly AppElementsSlotBinding[];
|
|
35
|
+
type AppWireElementValue = ReactNode | string | null | LayoutFlags | ArtifactCompatibilityEnvelope | AppElementsInterception | readonly AppElementsSlotBinding[];
|
|
14
36
|
type AppElements = Readonly<Record<string, AppElementValue>>;
|
|
15
37
|
type AppWireElements = Readonly<Record<string, AppWireElementValue>>;
|
|
16
38
|
/**
|
|
@@ -33,10 +55,13 @@ type AppWireElements = Readonly<Record<string, AppWireElementValue>>;
|
|
|
33
55
|
type LayoutFlags = Readonly<Record<string, "s" | "d">>;
|
|
34
56
|
type AppElementsMetadata = {
|
|
35
57
|
artifactCompatibility: ArtifactCompatibilityEnvelope;
|
|
58
|
+
interception: AppElementsInterception | null;
|
|
36
59
|
interceptionContext: string | null;
|
|
60
|
+
layoutIds: readonly string[];
|
|
37
61
|
layoutFlags: LayoutFlags;
|
|
38
62
|
routeId: string;
|
|
39
63
|
rootLayoutTreePath: string | null;
|
|
64
|
+
slotBindings: readonly AppElementsSlotBinding[];
|
|
40
65
|
};
|
|
41
66
|
type AppElementsWireElementKey = {
|
|
42
67
|
kind: "layout";
|
|
@@ -58,14 +83,20 @@ type AppElementsWireElementKey = {
|
|
|
58
83
|
treePath: string;
|
|
59
84
|
};
|
|
60
85
|
type AppElementsWireMetadataInput = {
|
|
86
|
+
interception?: AppElementsInterception | null;
|
|
61
87
|
interceptionContext: string | null;
|
|
88
|
+
layoutIds?: readonly string[];
|
|
62
89
|
routeId: string;
|
|
63
90
|
rootLayoutTreePath: string | null;
|
|
91
|
+
slotBindings?: readonly AppElementsSlotBinding[];
|
|
64
92
|
};
|
|
65
93
|
type AppElementsWireMetadataEntries = Readonly<{
|
|
66
94
|
[APP_ROUTE_KEY]: string;
|
|
95
|
+
[APP_INTERCEPTION_KEY]?: AppElementsInterception;
|
|
67
96
|
[APP_INTERCEPTION_CONTEXT_KEY]: string | null;
|
|
97
|
+
[APP_LAYOUT_IDS_KEY]: readonly string[];
|
|
68
98
|
[APP_ROOT_LAYOUT_KEY]: string | null;
|
|
99
|
+
[APP_SLOT_BINDINGS_KEY]?: readonly AppElementsSlotBinding[];
|
|
69
100
|
}>;
|
|
70
101
|
/**
|
|
71
102
|
* The outgoing wire payload shape. Includes ReactNode values for the
|
|
@@ -73,13 +104,17 @@ type AppElementsWireMetadataEntries = Readonly<{
|
|
|
73
104
|
* known keys (e.g. __layoutFlags). Distinct from AppElements / AppWireElements
|
|
74
105
|
* which only carry render-time values.
|
|
75
106
|
*/
|
|
76
|
-
type AppOutgoingElements = Readonly<Record<string, ReactNode | LayoutFlags | ArtifactCompatibilityEnvelope>>;
|
|
107
|
+
type AppOutgoingElements = Readonly<Record<string, ReactNode | LayoutFlags | ArtifactCompatibilityEnvelope | AppElementsInterception | RenderObservation | readonly AppElementsSlotBinding[]>>;
|
|
77
108
|
type AppElementsWireKeys = {
|
|
78
109
|
readonly artifactCompatibility: typeof APP_ARTIFACT_COMPATIBILITY_KEY;
|
|
110
|
+
readonly interception: typeof APP_INTERCEPTION_KEY;
|
|
79
111
|
readonly interceptionContext: typeof APP_INTERCEPTION_CONTEXT_KEY;
|
|
112
|
+
readonly layoutIds: typeof APP_LAYOUT_IDS_KEY;
|
|
80
113
|
readonly layoutFlags: typeof APP_LAYOUT_FLAGS_KEY;
|
|
114
|
+
readonly renderObservation: typeof APP_RENDER_OBSERVATION_KEY;
|
|
81
115
|
readonly rootLayout: typeof APP_ROOT_LAYOUT_KEY;
|
|
82
116
|
readonly route: typeof APP_ROUTE_KEY;
|
|
117
|
+
readonly slotBindings: typeof APP_SLOT_BINDINGS_KEY;
|
|
83
118
|
};
|
|
84
119
|
type AppElementsWireCodec = {
|
|
85
120
|
readonly keys: AppElementsWireKeys;
|
|
@@ -89,9 +124,10 @@ type AppElementsWireCodec = {
|
|
|
89
124
|
encodeCacheKey(rscUrl: string, interceptionContext: string | null): string;
|
|
90
125
|
encodeLayoutId(treePath: string): string;
|
|
91
126
|
encodeOutgoingPayload(input: {
|
|
92
|
-
element: ReactNode | Readonly<Record<string, ReactNode>>;
|
|
127
|
+
element: ReactNode | Readonly<Record<string, ReactNode | AppElementsInterception | readonly AppElementsSlotBinding[]>>;
|
|
93
128
|
artifactCompatibility?: ArtifactCompatibilityEnvelope;
|
|
94
129
|
layoutFlags: LayoutFlags;
|
|
130
|
+
renderObservation?: RenderObservation;
|
|
95
131
|
}): ReactNode | AppOutgoingElements;
|
|
96
132
|
encodePageId(routePath: string, interceptionContext: string | null): string;
|
|
97
133
|
encodeRouteId(routePath: string, interceptionContext: string | null): string;
|
|
@@ -119,12 +155,13 @@ declare function withLayoutFlags<T extends Record<string, unknown>>(elements: T,
|
|
|
119
155
|
[APP_LAYOUT_FLAGS_KEY]: LayoutFlags;
|
|
120
156
|
};
|
|
121
157
|
declare function buildOutgoingAppPayload(input: {
|
|
122
|
-
element: ReactNode | Readonly<Record<string, ReactNode>>;
|
|
158
|
+
element: ReactNode | Readonly<Record<string, ReactNode | AppElementsInterception | readonly AppElementsSlotBinding[]>>;
|
|
123
159
|
artifactCompatibility?: ArtifactCompatibilityEnvelope;
|
|
124
160
|
layoutFlags: LayoutFlags;
|
|
161
|
+
renderObservation?: RenderObservation;
|
|
125
162
|
}): ReactNode | AppOutgoingElements;
|
|
126
163
|
declare function readAppElementsMetadata(elements: Readonly<Record<string, unknown>>): AppElementsMetadata;
|
|
127
164
|
declare const AppElementsWire: AppElementsWireCodec;
|
|
128
165
|
//#endregion
|
|
129
|
-
export { APP_ARTIFACT_COMPATIBILITY_KEY, APP_INTERCEPTION_CONTEXT_KEY, APP_LAYOUT_FLAGS_KEY, APP_ROOT_LAYOUT_KEY, APP_ROUTE_KEY, APP_UNMATCHED_SLOT_WIRE_VALUE, AppElementValue, AppElements, AppElementsWire, AppOutgoingElements, AppWireElements, LayoutFlags, UNMATCHED_SLOT, buildOutgoingAppPayload, isAppElementsRecord, normalizeAppElements, readAppElementsMetadata, withLayoutFlags };
|
|
166
|
+
export { APP_ARTIFACT_COMPATIBILITY_KEY, APP_INTERCEPTION_CONTEXT_KEY, APP_INTERCEPTION_KEY, APP_LAYOUT_FLAGS_KEY, APP_LAYOUT_IDS_KEY, APP_RENDER_OBSERVATION_KEY, APP_ROOT_LAYOUT_KEY, APP_ROUTE_KEY, APP_SLOT_BINDINGS_KEY, APP_UNMATCHED_SLOT_WIRE_VALUE, AppElementValue, AppElements, AppElementsInterception, AppElementsSlotBinding, AppElementsSlotBindingState, AppElementsWire, AppOutgoingElements, AppWireElements, LayoutFlags, UNMATCHED_SLOT, buildOutgoingAppPayload, compareAppElementsSlotIds, isAppElementsRecord, normalizeAppElements, normalizeAppElementsSlotBindings, readAppElementsMetadata, withLayoutFlags };
|
|
130
167
|
//# sourceMappingURL=app-elements-wire.d.ts.map
|
|
@@ -1,14 +1,39 @@
|
|
|
1
|
+
import { isInterceptionMatchedUrlPath } from "./normalize-path.js";
|
|
1
2
|
import { createArtifactCompatibilityEnvelope, parseArtifactCompatibilityEnvelope } from "./artifact-compatibility.js";
|
|
2
3
|
import { isValidElement } from "react";
|
|
3
4
|
//#region src/server/app-elements-wire.ts
|
|
4
5
|
const APP_INTERCEPTION_SEPARATOR = "\0";
|
|
5
6
|
const APP_ARTIFACT_COMPATIBILITY_KEY = "__artifactCompatibility";
|
|
7
|
+
const APP_INTERCEPTION_KEY = "__interception";
|
|
6
8
|
const APP_INTERCEPTION_CONTEXT_KEY = "__interceptionContext";
|
|
9
|
+
const APP_LAYOUT_IDS_KEY = "__layoutIds";
|
|
7
10
|
const APP_LAYOUT_FLAGS_KEY = "__layoutFlags";
|
|
11
|
+
const APP_RENDER_OBSERVATION_KEY = "__renderObservation";
|
|
8
12
|
const APP_ROUTE_KEY = "__route";
|
|
9
13
|
const APP_ROOT_LAYOUT_KEY = "__rootLayout";
|
|
14
|
+
const APP_SLOT_BINDINGS_KEY = "__slotBindings";
|
|
10
15
|
const APP_UNMATCHED_SLOT_WIRE_VALUE = "__VINEXT_UNMATCHED_SLOT__";
|
|
11
16
|
const UNMATCHED_SLOT = Symbol.for("vinext.unmatchedSlot");
|
|
17
|
+
function compareAppElementsSlotIds(left, right) {
|
|
18
|
+
if (left < right) return -1;
|
|
19
|
+
if (left > right) return 1;
|
|
20
|
+
return 0;
|
|
21
|
+
}
|
|
22
|
+
function compareAppElementsSlotBindingsBySlotId(left, right) {
|
|
23
|
+
return compareAppElementsSlotIds(left.slotId, right.slotId);
|
|
24
|
+
}
|
|
25
|
+
function normalizeAppElementsSlotBindings(slotBindings, options = {}) {
|
|
26
|
+
const ownerLayoutIds = options.layoutIds ? new Set(options.layoutIds) : null;
|
|
27
|
+
const seenSlotIds = /* @__PURE__ */ new Set();
|
|
28
|
+
const normalized = [];
|
|
29
|
+
for (const binding of slotBindings) {
|
|
30
|
+
if (seenSlotIds.has(binding.slotId)) throw new Error("[vinext] Invalid __slotBindings in App Router payload: duplicate slot id");
|
|
31
|
+
seenSlotIds.add(binding.slotId);
|
|
32
|
+
if (ownerLayoutIds && binding.ownerLayoutId !== null && !ownerLayoutIds.has(binding.ownerLayoutId)) throw new Error("[vinext] Invalid __slotBindings in App Router payload: owner layout id missing from __layoutIds");
|
|
33
|
+
normalized.push({ ...binding });
|
|
34
|
+
}
|
|
35
|
+
return normalized.sort(compareAppElementsSlotBindingsBySlotId);
|
|
36
|
+
}
|
|
12
37
|
function appendInterceptionContext(identity, interceptionContext) {
|
|
13
38
|
return interceptionContext === null ? identity : `${identity}${APP_INTERCEPTION_SEPARATOR}${interceptionContext}`;
|
|
14
39
|
}
|
|
@@ -100,11 +125,22 @@ function isAppElementsWireSlotId(key) {
|
|
|
100
125
|
return separatorIndex > 0 && body.charCodeAt(separatorIndex + 1) === 47;
|
|
101
126
|
}
|
|
102
127
|
function createAppElementsWireMetadataEntries(input) {
|
|
103
|
-
|
|
128
|
+
const layoutIds = [...input.layoutIds ?? []];
|
|
129
|
+
const entries = {
|
|
104
130
|
[APP_ROUTE_KEY]: input.routeId,
|
|
105
131
|
[APP_INTERCEPTION_CONTEXT_KEY]: input.interceptionContext,
|
|
132
|
+
[APP_LAYOUT_IDS_KEY]: layoutIds,
|
|
106
133
|
[APP_ROOT_LAYOUT_KEY]: input.rootLayoutTreePath
|
|
107
134
|
};
|
|
135
|
+
const entriesWithInterception = input.interception ? {
|
|
136
|
+
...entries,
|
|
137
|
+
[APP_INTERCEPTION_KEY]: input.interception
|
|
138
|
+
} : entries;
|
|
139
|
+
if (input.slotBindings && input.slotBindings.length > 0) return {
|
|
140
|
+
...entriesWithInterception,
|
|
141
|
+
[APP_SLOT_BINDINGS_KEY]: normalizeAppElementsSlotBindings(input.slotBindings, { layoutIds })
|
|
142
|
+
};
|
|
143
|
+
return entriesWithInterception;
|
|
108
144
|
}
|
|
109
145
|
function normalizeAppElements(elements) {
|
|
110
146
|
let needsNormalization = false;
|
|
@@ -122,10 +158,78 @@ function isLayoutFlagsRecord(value) {
|
|
|
122
158
|
for (const v of Object.values(value)) if (v !== "s" && v !== "d") return false;
|
|
123
159
|
return true;
|
|
124
160
|
}
|
|
161
|
+
function isRecord(value) {
|
|
162
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
163
|
+
}
|
|
125
164
|
function parseLayoutFlags(value) {
|
|
126
165
|
if (isLayoutFlagsRecord(value)) return value;
|
|
127
166
|
return {};
|
|
128
167
|
}
|
|
168
|
+
function parseLayoutIds(value) {
|
|
169
|
+
if (value === void 0) return [];
|
|
170
|
+
if (!Array.isArray(value)) throw new Error("[vinext] Invalid __layoutIds in App Router payload: expected layout id string[]");
|
|
171
|
+
const layoutIds = [];
|
|
172
|
+
for (const entry of value) {
|
|
173
|
+
if (typeof entry !== "string") throw new Error("[vinext] Invalid __layoutIds in App Router payload: expected layout id string[]");
|
|
174
|
+
if (parseAppElementsWireElementKey(entry)?.kind !== "layout") throw new Error("[vinext] Invalid __layoutIds in App Router payload: expected layout ids");
|
|
175
|
+
layoutIds.push(entry);
|
|
176
|
+
}
|
|
177
|
+
return layoutIds;
|
|
178
|
+
}
|
|
179
|
+
function isSlotBindingState(value) {
|
|
180
|
+
return value === "active" || value === "default" || value === "unmatched";
|
|
181
|
+
}
|
|
182
|
+
function parseSlotBindings(value, options = {}) {
|
|
183
|
+
if (value === void 0) return [];
|
|
184
|
+
if (!Array.isArray(value)) throw new Error("[vinext] Invalid __slotBindings in App Router payload: expected array");
|
|
185
|
+
const slotBindings = [];
|
|
186
|
+
for (const entry of value) {
|
|
187
|
+
if (!isRecord(entry)) throw new Error("[vinext] Invalid __slotBindings in App Router payload: expected objects");
|
|
188
|
+
const slotId = entry.slotId;
|
|
189
|
+
if (typeof slotId !== "string" || parseAppElementsWireElementKey(slotId)?.kind !== "slot") throw new Error("[vinext] Invalid __slotBindings in App Router payload: expected slot ids");
|
|
190
|
+
const ownerLayoutId = entry.ownerLayoutId;
|
|
191
|
+
if (ownerLayoutId !== null && (typeof ownerLayoutId !== "string" || parseAppElementsWireElementKey(ownerLayoutId)?.kind !== "layout")) throw new Error("[vinext] Invalid __slotBindings in App Router payload: expected owner layout ids");
|
|
192
|
+
const state = entry.state;
|
|
193
|
+
if (!isSlotBindingState(state)) throw new Error("[vinext] Invalid __slotBindings in App Router payload: expected state");
|
|
194
|
+
slotBindings.push({
|
|
195
|
+
ownerLayoutId,
|
|
196
|
+
slotId,
|
|
197
|
+
state
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
return normalizeAppElementsSlotBindings(slotBindings, options);
|
|
201
|
+
}
|
|
202
|
+
function readRequiredInterceptionString(entry, fieldName) {
|
|
203
|
+
const value = entry[fieldName];
|
|
204
|
+
if (typeof value !== "string") throw new Error("[vinext] Invalid __interception in App Router payload: expected strings");
|
|
205
|
+
return value;
|
|
206
|
+
}
|
|
207
|
+
function parseInterceptionMatchedUrl(value) {
|
|
208
|
+
if (!isInterceptionMatchedUrlPath(value)) throw new Error("[vinext] Invalid __interception in App Router payload: expected path URLs");
|
|
209
|
+
return value;
|
|
210
|
+
}
|
|
211
|
+
function parseInterceptionRouteId(value, matchedUrl) {
|
|
212
|
+
const parsed = parseAppElementsWireElementKey(value);
|
|
213
|
+
if (parsed?.kind !== "route" || parsed.path !== matchedUrl || parsed.interceptionContext !== null) throw new Error("[vinext] Invalid __interception in App Router payload: expected route ids");
|
|
214
|
+
return value;
|
|
215
|
+
}
|
|
216
|
+
function parseInterceptionSlotId(value) {
|
|
217
|
+
if (parseAppElementsWireElementKey(value)?.kind !== "slot") throw new Error("[vinext] Invalid __interception in App Router payload: expected slot id");
|
|
218
|
+
return value;
|
|
219
|
+
}
|
|
220
|
+
function parseInterceptionMetadata(value) {
|
|
221
|
+
if (value === void 0 || value === null) return null;
|
|
222
|
+
if (!isRecord(value)) throw new Error("[vinext] Invalid __interception in App Router payload: expected object");
|
|
223
|
+
const sourceMatchedUrl = parseInterceptionMatchedUrl(readRequiredInterceptionString(value, "sourceMatchedUrl"));
|
|
224
|
+
const targetMatchedUrl = parseInterceptionMatchedUrl(readRequiredInterceptionString(value, "targetMatchedUrl"));
|
|
225
|
+
return {
|
|
226
|
+
sourceMatchedUrl,
|
|
227
|
+
sourceRouteId: parseInterceptionRouteId(readRequiredInterceptionString(value, "sourceRouteId"), sourceMatchedUrl),
|
|
228
|
+
slotId: parseInterceptionSlotId(readRequiredInterceptionString(value, "slotId")),
|
|
229
|
+
targetMatchedUrl,
|
|
230
|
+
targetRouteId: parseInterceptionRouteId(readRequiredInterceptionString(value, "targetRouteId"), targetMatchedUrl)
|
|
231
|
+
};
|
|
232
|
+
}
|
|
129
233
|
/**
|
|
130
234
|
* Type predicate for a plain (non-null, non-array) record of app payload values.
|
|
131
235
|
* Used to distinguish the App Router payload object from bare React elements at
|
|
@@ -149,11 +253,13 @@ function withLayoutFlags(elements, layoutFlags) {
|
|
|
149
253
|
}
|
|
150
254
|
function buildOutgoingAppPayload(input) {
|
|
151
255
|
if (!isAppElementsRecord(input.element)) return input.element;
|
|
152
|
-
|
|
256
|
+
const payload = {
|
|
153
257
|
...input.element,
|
|
154
258
|
[APP_LAYOUT_FLAGS_KEY]: input.layoutFlags,
|
|
155
259
|
[APP_ARTIFACT_COMPATIBILITY_KEY]: input.artifactCompatibility ?? createArtifactCompatibilityEnvelope()
|
|
156
260
|
};
|
|
261
|
+
if (input.renderObservation) payload[APP_RENDER_OBSERVATION_KEY] = input.renderObservation;
|
|
262
|
+
return payload;
|
|
157
263
|
}
|
|
158
264
|
function readArtifactCompatibilityMetadata(value) {
|
|
159
265
|
if (value === void 0) return createArtifactCompatibilityEnvelope();
|
|
@@ -168,21 +274,31 @@ function readAppElementsMetadata(elements) {
|
|
|
168
274
|
if (rootLayoutTreePath === void 0) throw new Error("[vinext] Missing __rootLayout key in App Router payload");
|
|
169
275
|
if (rootLayoutTreePath !== null && typeof rootLayoutTreePath !== "string") throw new Error("[vinext] Invalid __rootLayout in App Router payload: expected string or null");
|
|
170
276
|
const layoutFlags = parseLayoutFlags(elements[APP_LAYOUT_FLAGS_KEY]);
|
|
277
|
+
const layoutIds = parseLayoutIds(elements[APP_LAYOUT_IDS_KEY]);
|
|
278
|
+
const slotBindings = parseSlotBindings(elements[APP_SLOT_BINDINGS_KEY], { layoutIds });
|
|
279
|
+
const interception = parseInterceptionMetadata(elements[APP_INTERCEPTION_KEY]);
|
|
171
280
|
return {
|
|
172
281
|
artifactCompatibility: readArtifactCompatibilityMetadata(elements[APP_ARTIFACT_COMPATIBILITY_KEY]),
|
|
282
|
+
interception,
|
|
173
283
|
interceptionContext: interceptionContext ?? null,
|
|
284
|
+
layoutIds,
|
|
174
285
|
layoutFlags,
|
|
175
286
|
routeId,
|
|
176
|
-
rootLayoutTreePath
|
|
287
|
+
rootLayoutTreePath,
|
|
288
|
+
slotBindings
|
|
177
289
|
};
|
|
178
290
|
}
|
|
179
291
|
const AppElementsWire = {
|
|
180
292
|
keys: {
|
|
181
293
|
artifactCompatibility: APP_ARTIFACT_COMPATIBILITY_KEY,
|
|
294
|
+
interception: APP_INTERCEPTION_KEY,
|
|
182
295
|
interceptionContext: APP_INTERCEPTION_CONTEXT_KEY,
|
|
296
|
+
layoutIds: APP_LAYOUT_IDS_KEY,
|
|
183
297
|
layoutFlags: APP_LAYOUT_FLAGS_KEY,
|
|
298
|
+
renderObservation: APP_RENDER_OBSERVATION_KEY,
|
|
184
299
|
rootLayout: APP_ROOT_LAYOUT_KEY,
|
|
185
|
-
route: APP_ROUTE_KEY
|
|
300
|
+
route: APP_ROUTE_KEY,
|
|
301
|
+
slotBindings: APP_SLOT_BINDINGS_KEY
|
|
186
302
|
},
|
|
187
303
|
unmatchedSlotValue: APP_UNMATCHED_SLOT_WIRE_VALUE,
|
|
188
304
|
createMetadataEntries: createAppElementsWireMetadataEntries,
|
|
@@ -200,6 +316,6 @@ const AppElementsWire = {
|
|
|
200
316
|
withLayoutFlags
|
|
201
317
|
};
|
|
202
318
|
//#endregion
|
|
203
|
-
export { APP_ARTIFACT_COMPATIBILITY_KEY, APP_INTERCEPTION_CONTEXT_KEY, APP_LAYOUT_FLAGS_KEY, APP_ROOT_LAYOUT_KEY, APP_ROUTE_KEY, APP_UNMATCHED_SLOT_WIRE_VALUE, AppElementsWire, UNMATCHED_SLOT, buildOutgoingAppPayload, isAppElementsRecord, normalizeAppElements, readAppElementsMetadata, withLayoutFlags };
|
|
319
|
+
export { APP_ARTIFACT_COMPATIBILITY_KEY, APP_INTERCEPTION_CONTEXT_KEY, APP_INTERCEPTION_KEY, APP_LAYOUT_FLAGS_KEY, APP_LAYOUT_IDS_KEY, APP_RENDER_OBSERVATION_KEY, APP_ROOT_LAYOUT_KEY, APP_ROUTE_KEY, APP_SLOT_BINDINGS_KEY, APP_UNMATCHED_SLOT_WIRE_VALUE, AppElementsWire, UNMATCHED_SLOT, buildOutgoingAppPayload, compareAppElementsSlotIds, isAppElementsRecord, normalizeAppElements, normalizeAppElementsSlotBindings, readAppElementsMetadata, withLayoutFlags };
|
|
204
320
|
|
|
205
321
|
//# sourceMappingURL=app-elements-wire.js.map
|