vinext 0.0.54 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +52 -15
- package/dist/build/clean-output.d.ts +1 -2
- package/dist/build/clean-output.js +0 -2
- package/dist/build/client-build-config.d.ts +16 -3
- package/dist/build/client-build-config.js +29 -4
- package/dist/build/css-url-assets.d.ts +29 -0
- package/dist/build/css-url-assets.js +211 -0
- package/dist/build/google-fonts/build-url.d.ts +1 -2
- package/dist/build/google-fonts/build-url.js +0 -2
- package/dist/build/google-fonts/fallback-metrics-data.js +0 -2
- package/dist/build/google-fonts/fallback-metrics.d.ts +1 -2
- package/dist/build/google-fonts/fallback-metrics.js +0 -2
- package/dist/build/google-fonts/font-data.js +0 -2
- package/dist/build/google-fonts/font-metadata.d.ts +1 -2
- package/dist/build/google-fonts/font-metadata.js +0 -2
- package/dist/build/google-fonts/get-axes.d.ts +1 -2
- package/dist/build/google-fonts/get-axes.js +0 -2
- package/dist/build/google-fonts/sort-variants.d.ts +1 -2
- package/dist/build/google-fonts/sort-variants.js +0 -2
- package/dist/build/google-fonts/validate.d.ts +1 -2
- package/dist/build/google-fonts/validate.js +0 -2
- package/dist/build/inline-css.d.ts +1 -2
- package/dist/build/inline-css.js +0 -2
- package/dist/build/layout-classification-types.d.ts +1 -2
- package/dist/build/layout-classification.d.ts +2 -3
- package/dist/build/layout-classification.js +1 -3
- package/dist/build/next-client-runtime-manifests.d.ts +14 -0
- package/dist/build/next-client-runtime-manifests.js +39 -0
- package/dist/build/nitro-route-rules.d.ts +1 -2
- package/dist/build/nitro-route-rules.js +0 -2
- package/dist/build/precompress.d.ts +1 -2
- package/dist/build/precompress.js +0 -2
- package/dist/build/prerender.d.ts +2 -3
- package/dist/build/prerender.js +14 -2
- package/dist/build/report.d.ts +1 -2
- package/dist/build/report.js +0 -2
- package/dist/build/route-classification-injector.d.ts +1 -2
- package/dist/build/route-classification-injector.js +4 -6
- package/dist/build/route-classification-manifest.d.ts +5 -6
- package/dist/build/route-classification-manifest.js +5 -7
- package/dist/build/run-prerender.d.ts +1 -2
- package/dist/build/run-prerender.js +15 -7
- package/dist/build/server-manifest.d.ts +1 -2
- package/dist/build/server-manifest.js +0 -2
- package/dist/build/ssr-manifest.d.ts +1 -2
- package/dist/build/ssr-manifest.js +2 -4
- package/dist/build/standalone.d.ts +1 -2
- package/dist/build/standalone.js +0 -2
- package/dist/build/static-export.d.ts +2 -3
- package/dist/build/static-export.js +0 -2
- package/dist/cache/cache-adapters-virtual.d.ts +50 -0
- package/dist/cache/cache-adapters-virtual.js +45 -0
- package/dist/check.d.ts +33 -2
- package/dist/check.js +321 -27
- package/dist/cli-args.d.ts +1 -2
- package/dist/cli-args.js +0 -2
- package/dist/cli.js +7 -13
- package/dist/client/instrumentation-client-inject.d.ts +1 -2
- package/dist/client/instrumentation-client-inject.js +0 -2
- package/dist/client/instrumentation-client-state.d.ts +1 -2
- package/dist/client/instrumentation-client-state.js +0 -2
- package/dist/client/instrumentation-client.d.ts +1 -2
- package/dist/client/instrumentation-client.js +0 -2
- package/dist/client/navigation-runtime.d.ts +2 -2
- package/dist/client/navigation-runtime.js +1 -3
- package/dist/client/pages-router-link-navigation.d.ts +1 -2
- package/dist/client/pages-router-link-navigation.js +0 -2
- package/dist/client/validate-module-path.d.ts +1 -2
- package/dist/client/validate-module-path.js +0 -2
- package/dist/client/vinext-next-data.d.ts +1 -2
- package/dist/client/vinext-next-data.js +0 -2
- package/dist/client/window-next.d.ts +1 -2
- package/dist/client/window-next.js +0 -2
- package/dist/cloudflare/index.d.ts +1 -1
- package/dist/cloudflare/index.js +1 -1
- package/dist/cloudflare/src/cache/cdn-adapter.runtime.js +97 -0
- package/dist/cloudflare/{kv-cache-handler.d.ts → src/cache/kv-data-adapter.runtime.d.ts} +25 -6
- package/dist/cloudflare/{kv-cache-handler.js → src/cache/kv-data-adapter.runtime.js} +36 -28
- package/dist/cloudflare/src/utils/cache-control-metadata.js +20 -0
- package/dist/cloudflare/tpr.d.ts +2 -3
- package/dist/cloudflare/tpr.js +8 -8
- package/dist/config/config-matchers.d.ts +1 -2
- package/dist/config/config-matchers.js +0 -2
- package/dist/config/dotenv.d.ts +1 -2
- package/dist/config/dotenv.js +0 -2
- package/dist/config/next-config.d.ts +30 -3
- package/dist/config/next-config.js +47 -8
- package/dist/config/tsconfig-paths.d.ts +12 -4
- package/dist/config/tsconfig-paths.js +58 -31
- package/dist/deploy.d.ts +48 -3
- package/dist/deploy.js +141 -112
- package/dist/entries/app-browser-entry.d.ts +1 -2
- package/dist/entries/app-browser-entry.js +0 -2
- package/dist/entries/app-rsc-entry.d.ts +6 -5
- package/dist/entries/app-rsc-entry.js +62 -61
- package/dist/entries/app-rsc-manifest.d.ts +1 -2
- package/dist/entries/app-rsc-manifest.js +42 -12
- package/dist/entries/app-ssr-entry.d.ts +1 -2
- package/dist/entries/app-ssr-entry.js +0 -2
- package/dist/entries/pages-client-entry.d.ts +3 -3
- package/dist/entries/pages-client-entry.js +16 -5
- package/dist/entries/pages-entry-helpers.d.ts +2 -11
- package/dist/entries/pages-entry-helpers.js +1 -20
- package/dist/entries/pages-server-entry.d.ts +2 -3
- package/dist/entries/pages-server-entry.js +94 -670
- package/dist/entries/runtime-entry-module.d.ts +1 -2
- package/dist/entries/runtime-entry-module.js +0 -2
- package/dist/index.d.ts +22 -2
- package/dist/index.js +297 -140
- package/dist/init.d.ts +1 -2
- package/dist/init.js +1 -3
- package/dist/plugins/ast-utils.d.ts +20 -0
- package/dist/plugins/ast-utils.js +78 -0
- package/dist/plugins/async-hooks-stub.d.ts +1 -2
- package/dist/plugins/async-hooks-stub.js +0 -2
- package/dist/plugins/client-reference-dedup.d.ts +1 -2
- package/dist/plugins/client-reference-dedup.js +4 -8
- package/dist/plugins/css-data-url.d.ts +1 -2
- package/dist/plugins/css-data-url.js +0 -2
- package/dist/plugins/fonts.d.ts +13 -3
- package/dist/plugins/fonts.js +19 -13
- package/dist/plugins/import-meta-url.d.ts +16 -0
- package/dist/plugins/import-meta-url.js +347 -0
- package/dist/plugins/instrumentation-client.d.ts +1 -2
- package/dist/plugins/instrumentation-client.js +0 -2
- package/dist/plugins/middleware-server-only.d.ts +1 -2
- package/dist/plugins/middleware-server-only.js +0 -2
- package/dist/plugins/og-assets.d.ts +32 -8
- package/dist/plugins/og-assets.js +126 -34
- package/dist/plugins/optimize-imports.d.ts +1 -2
- package/dist/plugins/optimize-imports.js +9 -17
- package/dist/plugins/postcss.d.ts +1 -2
- package/dist/plugins/postcss.js +0 -2
- package/dist/plugins/remove-console.d.ts +1 -2
- package/dist/plugins/remove-console.js +0 -2
- package/dist/plugins/rsc-client-reference-loaders.d.ts +1 -2
- package/dist/plugins/rsc-client-reference-loaders.js +0 -2
- package/dist/plugins/rsc-client-shim-excludes.d.ts +1 -2
- package/dist/plugins/rsc-client-shim-excludes.js +0 -2
- package/dist/plugins/sass.d.ts +1 -2
- package/dist/plugins/sass.js +0 -2
- package/dist/plugins/server-externals-manifest.d.ts +1 -2
- package/dist/plugins/server-externals-manifest.js +0 -2
- package/dist/plugins/strip-server-exports.d.ts +1 -2
- package/dist/plugins/strip-server-exports.js +0 -2
- package/dist/routing/app-route-graph.d.ts +2 -9
- package/dist/routing/app-route-graph.js +9 -30
- package/dist/routing/app-router.d.ts +1 -2
- package/dist/routing/app-router.js +0 -2
- package/dist/routing/file-matcher.d.ts +6 -2
- package/dist/routing/file-matcher.js +15 -7
- package/dist/routing/pages-router.d.ts +1 -2
- package/dist/routing/pages-router.js +0 -2
- package/dist/routing/route-matching.d.ts +1 -2
- package/dist/routing/route-matching.js +0 -2
- package/dist/routing/route-pattern.d.ts +1 -2
- package/dist/routing/route-pattern.js +0 -2
- package/dist/routing/route-trie.d.ts +1 -2
- package/dist/routing/route-trie.js +0 -2
- package/dist/routing/route-validation.d.ts +1 -2
- package/dist/routing/route-validation.js +0 -2
- package/dist/routing/utils.d.ts +44 -2
- package/dist/routing/utils.js +62 -3
- package/dist/server/api-handler.d.ts +1 -2
- package/dist/server/api-handler.js +0 -2
- package/dist/server/app-bfcache-id.d.ts +5 -0
- package/dist/server/app-bfcache-id.js +5 -0
- package/dist/server/app-browser-action-result.d.ts +9 -17
- package/dist/server/app-browser-action-result.js +25 -16
- package/dist/server/app-browser-client-reuse-manifest.d.ts +12 -0
- package/dist/server/app-browser-client-reuse-manifest.js +101 -0
- package/dist/server/app-browser-entry.js +352 -115
- package/dist/server/app-browser-error.d.ts +1 -2
- package/dist/server/app-browser-error.js +0 -2
- package/dist/server/app-browser-hydration.d.ts +1 -2
- package/dist/server/app-browser-hydration.js +0 -2
- package/dist/server/app-browser-interception-context.d.ts +1 -2
- package/dist/server/app-browser-interception-context.js +0 -2
- package/dist/server/app-browser-mpa-navigation.d.ts +16 -0
- package/dist/server/app-browser-mpa-navigation.js +42 -0
- package/dist/server/app-browser-navigation-controller.d.ts +5 -4
- package/dist/server/app-browser-navigation-controller.js +3 -3
- package/dist/server/app-browser-popstate.d.ts +4 -3
- package/dist/server/app-browser-popstate.js +15 -3
- package/dist/server/app-browser-rsc-redirect.d.ts +1 -2
- package/dist/server/app-browser-rsc-redirect.js +0 -2
- package/dist/server/app-browser-state.d.ts +28 -4
- package/dist/server/app-browser-state.js +195 -11
- package/dist/server/app-browser-stream.d.ts +1 -2
- package/dist/server/app-browser-stream.js +0 -2
- package/dist/server/app-browser-visible-commit.d.ts +2 -3
- package/dist/server/app-browser-visible-commit.js +24 -17
- package/dist/server/app-client-reference-preloader.d.ts +1 -2
- package/dist/server/app-client-reference-preloader.js +0 -2
- package/dist/server/app-elements-wire.d.ts +14 -8
- package/dist/server/app-elements-wire.js +45 -24
- package/dist/server/app-elements.d.ts +2 -3
- package/dist/server/app-elements.js +2 -4
- package/dist/server/app-fallback-renderer.d.ts +5 -5
- package/dist/server/app-fallback-renderer.js +4 -3
- package/dist/server/app-history-state.d.ts +18 -2
- package/dist/server/app-history-state.js +68 -10
- package/dist/server/app-hook-warning-suppression.d.ts +1 -2
- package/dist/server/app-hook-warning-suppression.js +0 -2
- package/dist/server/app-inline-css-client.d.ts +1 -2
- package/dist/server/app-inline-css-client.js +0 -2
- package/dist/server/app-interception-context-header.d.ts +1 -2
- package/dist/server/app-interception-context-header.js +0 -2
- package/dist/server/app-layout-param-observation.d.ts +43 -0
- package/dist/server/app-layout-param-observation.js +168 -0
- package/dist/server/app-middleware.d.ts +1 -2
- package/dist/server/app-middleware.js +0 -2
- package/dist/server/app-mounted-slots-header.d.ts +1 -2
- package/dist/server/app-mounted-slots-header.js +0 -2
- package/dist/server/app-optimistic-routing.d.ts +1 -2
- package/dist/server/app-optimistic-routing.js +0 -2
- package/dist/server/app-page-boundary-render.d.ts +4 -3
- package/dist/server/app-page-boundary-render.js +20 -11
- package/dist/server/app-page-boundary.d.ts +11 -2
- package/dist/server/app-page-boundary.js +13 -4
- package/dist/server/app-page-cache.d.ts +3 -3
- package/dist/server/app-page-cache.js +36 -11
- package/dist/server/app-page-dispatch.d.ts +19 -5
- package/dist/server/app-page-dispatch.js +119 -24
- package/dist/server/app-page-element-builder.d.ts +3 -2
- package/dist/server/app-page-element-builder.js +9 -11
- package/dist/server/app-page-execution.d.ts +8 -3
- package/dist/server/app-page-execution.js +55 -24
- package/dist/server/app-page-head.d.ts +1 -2
- package/dist/server/app-page-head.js +6 -6
- package/dist/server/app-page-method.d.ts +1 -2
- package/dist/server/app-page-method.js +0 -2
- package/dist/server/app-page-params.d.ts +2 -2
- package/dist/server/app-page-params.js +14 -3
- package/dist/server/app-page-probe.d.ts +90 -2
- package/dist/server/app-page-probe.js +201 -6
- package/dist/server/app-page-render-identity.d.ts +1 -2
- package/dist/server/app-page-render-identity.js +0 -2
- package/dist/server/app-page-render-observation.d.ts +1 -2
- package/dist/server/app-page-render-observation.js +0 -2
- package/dist/server/app-page-render.d.ts +9 -3
- package/dist/server/app-page-render.js +167 -10
- package/dist/server/app-page-request.d.ts +4 -3
- package/dist/server/app-page-request.js +1 -3
- package/dist/server/app-page-response.d.ts +2 -2
- package/dist/server/app-page-response.js +5 -3
- package/dist/server/app-page-route-wiring.d.ts +14 -3
- package/dist/server/app-page-route-wiring.js +63 -11
- package/dist/server/app-page-search-params-observation.d.ts +10 -0
- package/dist/server/app-page-search-params-observation.js +20 -0
- package/dist/server/app-page-segment-state.d.ts +1 -2
- package/dist/server/app-page-segment-state.js +1 -8
- package/dist/server/app-page-stream.d.ts +19 -9
- package/dist/server/app-page-stream.js +28 -10
- package/dist/server/app-pages-bridge.d.ts +25 -0
- package/dist/server/app-pages-bridge.js +34 -0
- package/dist/server/app-post-middleware-context.d.ts +1 -2
- package/dist/server/app-post-middleware-context.js +0 -2
- package/dist/server/app-ppr-fallback-shell.d.ts +21 -0
- package/dist/server/app-ppr-fallback-shell.js +82 -0
- package/dist/server/app-prerender-endpoints.d.ts +1 -2
- package/dist/server/app-prerender-endpoints.js +0 -2
- package/dist/server/app-prerender-static-params.d.ts +15 -2
- package/dist/server/app-prerender-static-params.js +44 -13
- package/dist/server/app-render-dependency.d.ts +3 -2
- package/dist/server/app-render-dependency.js +9 -3
- package/dist/server/app-request-context.d.ts +1 -2
- package/dist/server/app-request-context.js +0 -2
- package/dist/server/app-route-handler-cache.d.ts +1 -2
- package/dist/server/app-route-handler-cache.js +0 -2
- package/dist/server/app-route-handler-dispatch.d.ts +1 -2
- package/dist/server/app-route-handler-dispatch.js +0 -2
- package/dist/server/app-route-handler-execution.d.ts +1 -2
- package/dist/server/app-route-handler-execution.js +2 -4
- package/dist/server/app-route-handler-policy.d.ts +1 -2
- package/dist/server/app-route-handler-policy.js +0 -2
- package/dist/server/app-route-handler-response.d.ts +2 -3
- package/dist/server/app-route-handler-response.js +8 -7
- package/dist/server/app-route-handler-runtime.d.ts +1 -2
- package/dist/server/app-route-handler-runtime.js +0 -2
- package/dist/server/app-route-module-loader.d.ts +43 -0
- package/dist/server/app-route-module-loader.js +32 -0
- package/dist/server/app-router-entry.d.ts +1 -2
- package/dist/server/app-router-entry.js +2 -2
- package/dist/server/app-rsc-cache-busting.d.ts +12 -3
- package/dist/server/app-rsc-cache-busting.js +21 -10
- package/dist/server/app-rsc-embedded-chunks.d.ts +1 -2
- package/dist/server/app-rsc-embedded-chunks.js +0 -2
- package/dist/server/app-rsc-error-handler.d.ts +1 -2
- package/dist/server/app-rsc-error-handler.js +0 -2
- package/dist/server/app-rsc-errors.d.ts +1 -2
- package/dist/server/app-rsc-errors.js +0 -2
- package/dist/server/app-rsc-handler.d.ts +16 -2
- package/dist/server/app-rsc-handler.js +32 -14
- package/dist/server/app-rsc-render-mode.d.ts +1 -2
- package/dist/server/app-rsc-render-mode.js +0 -2
- package/dist/server/app-rsc-request-normalization.d.ts +4 -5
- package/dist/server/app-rsc-request-normalization.js +2 -4
- package/dist/server/app-rsc-response-finalizer.d.ts +1 -2
- package/dist/server/app-rsc-response-finalizer.js +2 -2
- package/dist/server/app-rsc-route-matching.d.ts +1 -2
- package/dist/server/app-rsc-route-matching.js +0 -2
- package/dist/server/app-segment-config.d.ts +5 -3
- package/dist/server/app-segment-config.js +12 -3
- package/dist/server/app-server-action-execution.d.ts +12 -2
- package/dist/server/app-server-action-execution.js +200 -25
- package/dist/server/app-ssr-entry.d.ts +5 -4
- package/dist/server/app-ssr-entry.js +31 -15
- package/dist/server/app-ssr-error-meta.d.ts +1 -2
- package/dist/server/app-ssr-error-meta.js +0 -2
- package/dist/server/app-ssr-stream.d.ts +1 -2
- package/dist/server/app-ssr-stream.js +31 -3
- package/dist/server/app-static-generation.d.ts +1 -2
- package/dist/server/app-static-generation.js +0 -2
- package/dist/server/app-visited-response-cache.d.ts +23 -0
- package/dist/server/app-visited-response-cache.js +19 -0
- package/dist/server/artifact-compatibility.d.ts +2 -2
- package/dist/server/artifact-compatibility.js +12 -7
- package/dist/server/cache-control.d.ts +15 -2
- package/dist/server/cache-control.js +21 -3
- package/dist/server/cache-headers.d.ts +1 -2
- package/dist/server/cache-headers.js +0 -2
- package/dist/server/cache-proof.d.ts +1 -2
- package/dist/server/cache-proof.js +0 -2
- package/dist/server/client-reuse-manifest.d.ts +10 -5
- package/dist/server/client-reuse-manifest.js +7 -10
- package/dist/server/client-trace-metadata.d.ts +1 -2
- package/dist/server/client-trace-metadata.js +0 -2
- package/dist/server/cookie-utils.d.ts +1 -2
- package/dist/server/cookie-utils.js +0 -2
- package/dist/server/csp.d.ts +1 -2
- package/dist/server/csp.js +0 -2
- package/dist/server/default-global-error-module.d.ts +1 -2
- package/dist/server/default-global-error-module.js +0 -2
- package/dist/server/default-not-found-module.d.ts +1 -2
- package/dist/server/default-not-found-module.js +0 -2
- package/dist/server/dev-error-overlay-store.d.ts +20 -4
- package/dist/server/dev-error-overlay-store.js +23 -4
- package/dist/server/dev-error-overlay.d.ts +39 -3
- package/dist/server/dev-error-overlay.js +952 -164
- package/dist/server/dev-initial-server-error.d.ts +9 -0
- package/dist/server/dev-initial-server-error.js +26 -0
- package/dist/server/dev-lockfile.d.ts +1 -2
- package/dist/server/dev-lockfile.js +0 -2
- package/dist/server/dev-module-runner.d.ts +1 -2
- package/dist/server/dev-module-runner.js +0 -2
- package/dist/server/dev-origin-check.d.ts +1 -2
- package/dist/server/dev-origin-check.js +0 -2
- package/dist/server/dev-route-files.d.ts +1 -2
- package/dist/server/dev-route-files.js +0 -2
- package/dist/server/dev-server.d.ts +2 -3
- package/dist/server/dev-server.js +127 -28
- package/dist/server/dev-stack-sourcemap-endpoint.d.ts +4 -0
- package/dist/server/dev-stack-sourcemap-endpoint.js +4 -0
- package/dist/server/dev-stack-sourcemap.d.ts +43 -0
- package/dist/server/dev-stack-sourcemap.js +443 -0
- package/dist/server/document-initial-head.d.ts +6 -0
- package/dist/server/document-initial-head.js +33 -0
- package/dist/server/edge-api-runtime.d.ts +1 -2
- package/dist/server/edge-api-runtime.js +0 -2
- package/dist/server/file-based-metadata.d.ts +1 -2
- package/dist/server/file-based-metadata.js +0 -2
- package/dist/server/headers.d.ts +3 -2
- package/dist/server/headers.js +3 -3
- package/dist/server/html.d.ts +1 -2
- package/dist/server/html.js +0 -2
- package/dist/server/http-error-responses.d.ts +1 -2
- package/dist/server/http-error-responses.js +0 -2
- package/dist/server/image-optimization.d.ts +1 -2
- package/dist/server/image-optimization.js +0 -2
- package/dist/server/implicit-tags.d.ts +1 -2
- package/dist/server/implicit-tags.js +0 -2
- package/dist/server/instrumentation-runtime.d.ts +1 -2
- package/dist/server/instrumentation-runtime.js +0 -2
- package/dist/server/instrumentation.d.ts +1 -2
- package/dist/server/instrumentation.js +0 -2
- package/dist/server/isr-cache.d.ts +10 -3
- package/dist/server/isr-cache.js +13 -28
- package/dist/server/metadata-route-build-data.d.ts +1 -2
- package/dist/server/metadata-route-build-data.js +0 -2
- package/dist/server/metadata-route-response.d.ts +1 -2
- package/dist/server/metadata-route-response.js +0 -2
- package/dist/server/metadata-routes.d.ts +1 -2
- package/dist/server/metadata-routes.js +0 -2
- package/dist/server/middleware-matcher.d.ts +1 -2
- package/dist/server/middleware-matcher.js +0 -2
- package/dist/server/middleware-request-headers.d.ts +1 -2
- package/dist/server/middleware-request-headers.js +0 -2
- package/dist/server/middleware-response-headers.d.ts +1 -2
- package/dist/server/middleware-response-headers.js +0 -2
- package/dist/server/middleware-runtime.d.ts +1 -2
- package/dist/server/middleware-runtime.js +14 -5
- package/dist/server/middleware.d.ts +2 -3
- package/dist/server/middleware.js +0 -2
- package/dist/server/navigation-planner.d.ts +16 -2
- package/dist/server/navigation-planner.js +1 -3
- package/dist/server/navigation-trace.d.ts +1 -2
- package/dist/server/navigation-trace.js +0 -2
- package/dist/server/next-error-digest.d.ts +1 -2
- package/dist/server/next-error-digest.js +0 -2
- package/dist/server/normalize-path.d.ts +1 -2
- package/dist/server/normalize-path.js +0 -2
- package/dist/server/pages-api-route.d.ts +1 -2
- package/dist/server/pages-api-route.js +1 -3
- package/dist/server/pages-asset-tags.d.ts +66 -0
- package/dist/server/pages-asset-tags.js +116 -0
- package/dist/server/pages-body-parser-config.d.ts +1 -2
- package/dist/server/pages-body-parser-config.js +0 -2
- package/dist/server/pages-data-route.d.ts +39 -2
- package/dist/server/pages-data-route.js +46 -3
- package/dist/server/pages-default-404.d.ts +1 -2
- package/dist/server/pages-default-404.js +0 -2
- package/dist/server/pages-document-initial-props.d.ts +84 -3
- package/dist/server/pages-document-initial-props.js +127 -3
- package/dist/server/pages-get-initial-props.d.ts +17 -0
- package/dist/server/pages-get-initial-props.js +50 -0
- package/dist/server/pages-i18n.d.ts +1 -2
- package/dist/server/pages-i18n.js +0 -2
- package/dist/server/pages-media-type.d.ts +1 -2
- package/dist/server/pages-media-type.js +1 -2
- package/dist/server/pages-node-compat.d.ts +9 -2
- package/dist/server/pages-node-compat.js +35 -4
- package/dist/server/pages-page-data.d.ts +7 -3
- package/dist/server/pages-page-data.js +75 -33
- package/dist/server/pages-page-handler.d.ts +90 -0
- package/dist/server/pages-page-handler.js +335 -0
- package/dist/server/pages-page-method.d.ts +1 -2
- package/dist/server/pages-page-method.js +0 -2
- package/dist/server/pages-page-response.d.ts +15 -2
- package/dist/server/pages-page-response.js +39 -12
- package/dist/server/pages-serializable-props.d.ts +1 -2
- package/dist/server/pages-serializable-props.js +0 -2
- package/dist/server/pregenerated-concrete-paths.d.ts +32 -0
- package/dist/server/pregenerated-concrete-paths.js +78 -0
- package/dist/server/prerender-route-params.d.ts +13 -3
- package/dist/server/prerender-route-params.js +30 -11
- package/dist/server/prerender-work-unit-setup.d.ts +1 -2
- package/dist/server/prerender-work-unit-setup.js +0 -2
- package/dist/server/prod-server.d.ts +2 -4
- package/dist/server/prod-server.js +13 -8
- package/dist/server/proxy-trust.d.ts +1 -2
- package/dist/server/proxy-trust.js +0 -2
- package/dist/server/request-log.d.ts +1 -2
- package/dist/server/request-log.js +0 -2
- package/dist/server/request-pipeline.d.ts +14 -2
- package/dist/server/request-pipeline.js +42 -3
- package/dist/server/rsc-stream-hints.d.ts +1 -2
- package/dist/server/rsc-stream-hints.js +0 -2
- package/dist/server/seed-cache.d.ts +6 -2
- package/dist/server/seed-cache.js +10 -8
- package/dist/server/server-action-not-found.d.ts +1 -2
- package/dist/server/server-action-not-found.js +0 -2
- package/dist/server/server-globals.d.ts +1 -2
- package/dist/server/server-globals.js +0 -2
- package/dist/server/skip-cache-proof.d.ts +23 -3
- package/dist/server/skip-cache-proof.js +81 -14
- package/dist/server/socket-error-backstop.d.ts +1 -2
- package/dist/server/socket-error-backstop.js +0 -2
- package/dist/server/static-file-cache.d.ts +1 -2
- package/dist/server/static-file-cache.js +0 -2
- package/dist/server/static-layout-client-reuse-proof.d.ts +15 -0
- package/dist/server/static-layout-client-reuse-proof.js +33 -0
- package/dist/server/streaming-metadata.d.ts +1 -2
- package/dist/server/streaming-metadata.js +0 -2
- package/dist/server/worker-utils.d.ts +1 -2
- package/dist/server/worker-utils.js +3 -6
- package/dist/shims/amp.d.ts +1 -2
- package/dist/shims/amp.js +0 -2
- package/dist/shims/app-router-scroll-state.d.ts +1 -2
- package/dist/shims/app-router-scroll-state.js +0 -2
- package/dist/shims/app-router-scroll.d.ts +3 -5
- package/dist/shims/app-router-scroll.js +0 -2
- package/dist/shims/app.d.ts +1 -2
- package/dist/shims/app.js +0 -2
- package/dist/shims/before-interactive-context.d.ts +1 -2
- package/dist/shims/before-interactive-context.js +0 -2
- package/dist/shims/cache-for-request.d.ts +1 -2
- package/dist/shims/cache-for-request.js +0 -2
- package/dist/shims/cache-runtime.d.ts +20 -5
- package/dist/shims/cache-runtime.js +35 -30
- package/dist/shims/cache.d.ts +68 -7
- package/dist/shims/cache.js +179 -25
- package/dist/shims/cdn-cache.d.ts +125 -0
- package/dist/shims/cdn-cache.js +100 -0
- package/dist/shims/client-hook-error.d.ts +1 -2
- package/dist/shims/client-hook-error.js +0 -2
- package/dist/shims/client-locale.d.ts +1 -2
- package/dist/shims/client-locale.js +1 -3
- package/dist/shims/compat-router.d.ts +1 -2
- package/dist/shims/compat-router.js +0 -2
- package/dist/shims/config.d.ts +1 -2
- package/dist/shims/config.js +0 -2
- package/dist/shims/constants.d.ts +1 -2
- package/dist/shims/constants.js +0 -2
- package/dist/shims/default-global-error.d.ts +3 -4
- package/dist/shims/default-global-error.js +0 -2
- package/dist/shims/default-not-found.d.ts +1 -2
- package/dist/shims/default-not-found.js +0 -2
- package/dist/shims/document.d.ts +11 -7
- package/dist/shims/document.js +7 -10
- package/dist/shims/dynamic.d.ts +1 -2
- package/dist/shims/dynamic.js +0 -2
- package/dist/shims/error-boundary.d.ts +16 -12
- package/dist/shims/error-boundary.js +60 -28
- package/dist/shims/error.d.ts +1 -2
- package/dist/shims/error.js +0 -2
- package/dist/shims/fetch-cache.d.ts +3 -2
- package/dist/shims/fetch-cache.js +18 -9
- package/dist/shims/font-google-base.d.ts +1 -2
- package/dist/shims/font-google-base.js +1 -13
- package/dist/shims/font-local.d.ts +1 -2
- package/dist/shims/font-local.js +1 -15
- package/dist/shims/font-utils.d.ts +7 -2
- package/dist/shims/font-utils.js +13 -3
- package/dist/shims/form.d.ts +12 -5
- package/dist/shims/form.js +98 -21
- package/dist/shims/hash-scroll.d.ts +4 -2
- package/dist/shims/hash-scroll.js +13 -3
- package/dist/shims/head-state.d.ts +2 -2
- package/dist/shims/head-state.js +18 -5
- package/dist/shims/head.d.ts +35 -2
- package/dist/shims/head.js +113 -16
- package/dist/shims/headers.d.ts +9 -2
- package/dist/shims/headers.js +13 -3
- package/dist/shims/i18n-context.d.ts +1 -2
- package/dist/shims/i18n-context.js +0 -2
- package/dist/shims/i18n-state.d.ts +1 -2
- package/dist/shims/i18n-state.js +0 -2
- package/dist/shims/image-config.d.ts +1 -2
- package/dist/shims/image-config.js +0 -2
- package/dist/shims/image.d.ts +1 -2
- package/dist/shims/image.js +1 -3
- package/dist/shims/internal/als-registry.d.ts +1 -2
- package/dist/shims/internal/als-registry.js +0 -2
- package/dist/shims/internal/api-utils.d.ts +1 -2
- package/dist/shims/internal/app-route-detection.d.ts +1 -2
- package/dist/shims/internal/app-route-detection.js +0 -2
- package/dist/shims/internal/app-router-context.d.ts +1 -2
- package/dist/shims/internal/app-router-context.js +0 -2
- package/dist/shims/internal/cookie-serialize.d.ts +1 -2
- package/dist/shims/internal/cookie-serialize.js +0 -2
- package/dist/shims/internal/make-hanging-promise.d.ts +1 -2
- package/dist/shims/internal/make-hanging-promise.js +0 -2
- package/dist/shims/internal/pages-data-fetch-dedup.d.ts +55 -0
- package/dist/shims/internal/pages-data-fetch-dedup.js +68 -0
- package/dist/shims/internal/pages-data-target.d.ts +1 -2
- package/dist/shims/internal/pages-data-target.js +0 -2
- package/dist/shims/internal/pages-data-url.d.ts +1 -2
- package/dist/shims/internal/pages-data-url.js +0 -2
- package/dist/shims/internal/parse-cookie-header.d.ts +1 -2
- package/dist/shims/internal/parse-cookie-header.js +0 -2
- package/dist/shims/internal/router-context.d.ts +2 -4
- package/dist/shims/internal/router-context.js +0 -2
- package/dist/shims/internal/utils.d.ts +1 -2
- package/dist/shims/internal/utils.js +0 -2
- package/dist/shims/internal/work-unit-async-storage.d.ts +1 -2
- package/dist/shims/internal/work-unit-async-storage.js +0 -2
- package/dist/shims/layout-segment-context.d.ts +2 -4
- package/dist/shims/layout-segment-context.js +0 -2
- package/dist/shims/legacy-image.d.ts +1 -2
- package/dist/shims/legacy-image.js +0 -2
- package/dist/shims/link-prefetch.d.ts +1 -2
- package/dist/shims/link-prefetch.js +0 -2
- package/dist/shims/link.d.ts +2 -2
- package/dist/shims/link.js +47 -15
- package/dist/shims/metadata.d.ts +4 -5
- package/dist/shims/metadata.js +1 -3
- package/dist/shims/navigation-state.d.ts +1 -2
- package/dist/shims/navigation-state.js +0 -2
- package/dist/shims/navigation.d.ts +61 -7
- package/dist/shims/navigation.js +244 -47
- package/dist/shims/navigation.react-server.d.ts +1 -2
- package/dist/shims/navigation.react-server.js +0 -2
- package/dist/shims/offline.d.ts +1 -2
- package/dist/shims/offline.js +0 -2
- package/dist/shims/og.d.ts +1 -2
- package/dist/shims/og.js +2 -4
- package/dist/shims/pages-router-runtime.d.ts +7 -2
- package/dist/shims/pages-router-runtime.js +11 -3
- package/dist/shims/ppr-fallback-shell.d.ts +29 -0
- package/dist/shims/ppr-fallback-shell.js +149 -0
- package/dist/shims/readonly-url-search-params.d.ts +1 -2
- package/dist/shims/readonly-url-search-params.js +0 -2
- package/dist/shims/request-context.d.ts +9 -5
- package/dist/shims/request-context.js +0 -2
- package/dist/shims/request-state-types.d.ts +1 -1
- package/dist/shims/root-params.d.ts +1 -2
- package/dist/shims/root-params.js +0 -2
- package/dist/shims/router-state.d.ts +1 -2
- package/dist/shims/router-state.js +0 -2
- package/dist/shims/router.d.ts +1 -2
- package/dist/shims/router.js +172 -37
- package/dist/shims/script-nonce-context.d.ts +1 -2
- package/dist/shims/script-nonce-context.js +0 -2
- package/dist/shims/script.d.ts +1 -2
- package/dist/shims/script.js +0 -2
- package/dist/shims/server.d.ts +1 -2
- package/dist/shims/server.js +0 -2
- package/dist/shims/slot.d.ts +11 -4
- package/dist/shims/slot.js +121 -9
- package/dist/shims/thenable-params.d.ts +6 -3
- package/dist/shims/thenable-params.js +131 -12
- package/dist/shims/unified-request-context.d.ts +1 -2
- package/dist/shims/unified-request-context.js +3 -2
- package/dist/shims/unrecognized-action-error.d.ts +1 -2
- package/dist/shims/unrecognized-action-error.js +0 -2
- package/dist/shims/url-safety.d.ts +1 -2
- package/dist/shims/url-safety.js +0 -2
- package/dist/shims/url-utils.d.ts +1 -2
- package/dist/shims/url-utils.js +0 -2
- package/dist/shims/use-merged-ref.d.ts +1 -2
- package/dist/shims/use-merged-ref.js +0 -2
- package/dist/shims/web-vitals.d.ts +1 -2
- package/dist/shims/web-vitals.js +0 -2
- package/dist/typegen.d.ts +1 -2
- package/dist/typegen.js +2 -9
- package/dist/utils/asset-prefix.d.ts +1 -2
- package/dist/utils/asset-prefix.js +0 -2
- package/dist/utils/base-path.d.ts +1 -2
- package/dist/utils/base-path.js +0 -2
- package/dist/utils/cache-control-metadata.d.ts +1 -4
- package/dist/utils/cache-control-metadata.js +1 -3
- package/dist/utils/client-build-manifest.d.ts +14 -0
- package/dist/utils/client-build-manifest.js +52 -0
- package/dist/utils/compare.d.ts +4 -0
- package/dist/utils/compare.js +8 -0
- package/dist/utils/dev-error-recovery-event.d.ts +4 -0
- package/dist/utils/dev-error-recovery-event.js +4 -0
- package/dist/utils/domain-locale.d.ts +1 -2
- package/dist/utils/domain-locale.js +2 -4
- package/dist/utils/encode-cache-tag.d.ts +1 -2
- package/dist/utils/encode-cache-tag.js +0 -2
- package/dist/utils/error-cause.d.ts +1 -2
- package/dist/utils/error-cause.js +0 -2
- package/dist/utils/hash.d.ts +1 -2
- package/dist/utils/hash.js +1 -3
- package/dist/utils/html-limited-bots.d.ts +1 -2
- package/dist/utils/html-limited-bots.js +0 -2
- package/dist/utils/lazy-chunks.d.ts +1 -2
- package/dist/utils/lazy-chunks.js +0 -2
- package/dist/utils/manifest-paths.d.ts +8 -3
- package/dist/utils/manifest-paths.js +15 -3
- package/dist/utils/mdx-scan.d.ts +1 -2
- package/dist/utils/mdx-scan.js +0 -2
- package/dist/utils/navigation-signal.d.ts +1 -2
- package/dist/utils/navigation-signal.js +0 -2
- package/dist/utils/number.d.ts +4 -0
- package/dist/utils/number.js +6 -0
- package/dist/utils/path.d.ts +4 -2
- package/dist/utils/path.js +5 -3
- package/dist/utils/prerender-output-paths.d.ts +1 -2
- package/dist/utils/prerender-output-paths.js +0 -2
- package/dist/utils/project.d.ts +1 -2
- package/dist/utils/project.js +0 -2
- package/dist/utils/promise.d.ts +4 -0
- package/dist/utils/promise.js +6 -0
- package/dist/utils/public-routes.d.ts +1 -2
- package/dist/utils/public-routes.js +0 -2
- package/dist/utils/query.d.ts +1 -2
- package/dist/utils/query.js +0 -2
- package/dist/utils/record.d.ts +1 -2
- package/dist/utils/record.js +0 -2
- package/dist/utils/regex.d.ts +4 -0
- package/dist/utils/regex.js +6 -0
- package/dist/utils/safe-json-file.d.ts +1 -2
- package/dist/utils/safe-json-file.js +0 -2
- package/dist/utils/sorted-array.d.ts +1 -2
- package/dist/utils/sorted-array.js +0 -2
- package/dist/utils/text-stream.d.ts +1 -2
- package/dist/utils/text-stream.js +0 -2
- package/dist/utils/vinext-root.d.ts +1 -2
- package/dist/utils/vinext-root.js +0 -2
- package/dist/utils/vite-version.d.ts +10 -0
- package/dist/utils/vite-version.js +34 -0
- package/package.json +20 -7
- package/dist/build/clean-output.js.map +0 -1
- package/dist/build/client-build-config.js.map +0 -1
- package/dist/build/google-fonts/build-url.js.map +0 -1
- package/dist/build/google-fonts/fallback-metrics-data.js.map +0 -1
- package/dist/build/google-fonts/fallback-metrics.js.map +0 -1
- package/dist/build/google-fonts/font-data.js.map +0 -1
- package/dist/build/google-fonts/font-metadata.js.map +0 -1
- package/dist/build/google-fonts/get-axes.js.map +0 -1
- package/dist/build/google-fonts/sort-variants.js.map +0 -1
- package/dist/build/google-fonts/validate.js.map +0 -1
- package/dist/build/inline-css.js.map +0 -1
- package/dist/build/layout-classification.js.map +0 -1
- package/dist/build/nitro-route-rules.js.map +0 -1
- package/dist/build/precompress.js.map +0 -1
- package/dist/build/prerender.js.map +0 -1
- package/dist/build/report.js.map +0 -1
- package/dist/build/route-classification-injector.js.map +0 -1
- package/dist/build/route-classification-manifest.js.map +0 -1
- package/dist/build/run-prerender.js.map +0 -1
- package/dist/build/server-manifest.js.map +0 -1
- package/dist/build/ssr-manifest.js.map +0 -1
- package/dist/build/standalone.js.map +0 -1
- package/dist/build/static-export.js.map +0 -1
- package/dist/check.js.map +0 -1
- package/dist/cli-args.js.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/client/instrumentation-client-inject.js.map +0 -1
- package/dist/client/instrumentation-client-state.js.map +0 -1
- package/dist/client/instrumentation-client.js.map +0 -1
- package/dist/client/navigation-runtime.js.map +0 -1
- package/dist/client/pages-router-link-navigation.js.map +0 -1
- package/dist/client/validate-module-path.js.map +0 -1
- package/dist/client/vinext-next-data.js.map +0 -1
- package/dist/client/window-next.js.map +0 -1
- package/dist/cloudflare/kv-cache-handler.js.map +0 -1
- package/dist/cloudflare/tpr.js.map +0 -1
- package/dist/config/config-matchers.js.map +0 -1
- package/dist/config/dotenv.js.map +0 -1
- package/dist/config/next-config.js.map +0 -1
- package/dist/config/tsconfig-paths.js.map +0 -1
- package/dist/deploy.js.map +0 -1
- package/dist/entries/app-browser-entry.js.map +0 -1
- package/dist/entries/app-rsc-entry.js.map +0 -1
- package/dist/entries/app-rsc-manifest.js.map +0 -1
- package/dist/entries/app-ssr-entry.js.map +0 -1
- package/dist/entries/pages-client-entry.js.map +0 -1
- package/dist/entries/pages-entry-helpers.js.map +0 -1
- package/dist/entries/pages-server-entry.js.map +0 -1
- package/dist/entries/runtime-entry-module.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/init.js.map +0 -1
- package/dist/plugins/async-hooks-stub.js.map +0 -1
- package/dist/plugins/client-reference-dedup.js.map +0 -1
- package/dist/plugins/css-data-url.js.map +0 -1
- package/dist/plugins/fonts.js.map +0 -1
- package/dist/plugins/instrumentation-client.js.map +0 -1
- package/dist/plugins/middleware-server-only.js.map +0 -1
- package/dist/plugins/og-assets.js.map +0 -1
- package/dist/plugins/optimize-imports.js.map +0 -1
- package/dist/plugins/postcss.js.map +0 -1
- package/dist/plugins/remove-console.js.map +0 -1
- package/dist/plugins/rsc-client-reference-loaders.js.map +0 -1
- package/dist/plugins/rsc-client-shim-excludes.js.map +0 -1
- package/dist/plugins/sass.js.map +0 -1
- package/dist/plugins/server-externals-manifest.js.map +0 -1
- package/dist/plugins/strip-server-exports.js.map +0 -1
- package/dist/routing/app-route-graph.js.map +0 -1
- package/dist/routing/app-router.js.map +0 -1
- package/dist/routing/file-matcher.js.map +0 -1
- package/dist/routing/pages-router.js.map +0 -1
- package/dist/routing/route-matching.js.map +0 -1
- package/dist/routing/route-pattern.js.map +0 -1
- package/dist/routing/route-trie.js.map +0 -1
- package/dist/routing/route-validation.js.map +0 -1
- package/dist/routing/utils.js.map +0 -1
- package/dist/server/api-handler.js.map +0 -1
- package/dist/server/app-browser-action-result.js.map +0 -1
- package/dist/server/app-browser-entry.js.map +0 -1
- package/dist/server/app-browser-error.js.map +0 -1
- package/dist/server/app-browser-hydration.js.map +0 -1
- package/dist/server/app-browser-interception-context.js.map +0 -1
- package/dist/server/app-browser-navigation-controller.js.map +0 -1
- package/dist/server/app-browser-popstate.js.map +0 -1
- package/dist/server/app-browser-rsc-redirect.js.map +0 -1
- package/dist/server/app-browser-state.js.map +0 -1
- package/dist/server/app-browser-stream.js.map +0 -1
- package/dist/server/app-browser-visible-commit.js.map +0 -1
- package/dist/server/app-client-reference-preloader.js.map +0 -1
- package/dist/server/app-elements-wire.js.map +0 -1
- package/dist/server/app-elements.js.map +0 -1
- package/dist/server/app-fallback-renderer.js.map +0 -1
- package/dist/server/app-history-state.js.map +0 -1
- package/dist/server/app-hook-warning-suppression.js.map +0 -1
- package/dist/server/app-inline-css-client.js.map +0 -1
- package/dist/server/app-interception-context-header.js.map +0 -1
- package/dist/server/app-middleware.js.map +0 -1
- package/dist/server/app-mounted-slots-header.js.map +0 -1
- package/dist/server/app-optimistic-routing.js.map +0 -1
- package/dist/server/app-page-boundary-render.js.map +0 -1
- package/dist/server/app-page-boundary.js.map +0 -1
- package/dist/server/app-page-cache.js.map +0 -1
- package/dist/server/app-page-dispatch.js.map +0 -1
- package/dist/server/app-page-element-builder.js.map +0 -1
- package/dist/server/app-page-execution.js.map +0 -1
- package/dist/server/app-page-head.js.map +0 -1
- package/dist/server/app-page-method.js.map +0 -1
- package/dist/server/app-page-params.js.map +0 -1
- package/dist/server/app-page-probe.js.map +0 -1
- package/dist/server/app-page-render-identity.js.map +0 -1
- package/dist/server/app-page-render-observation.js.map +0 -1
- package/dist/server/app-page-render.js.map +0 -1
- package/dist/server/app-page-request.js.map +0 -1
- package/dist/server/app-page-response.js.map +0 -1
- package/dist/server/app-page-route-wiring.js.map +0 -1
- package/dist/server/app-page-segment-state.js.map +0 -1
- package/dist/server/app-page-stream.js.map +0 -1
- package/dist/server/app-post-middleware-context.js.map +0 -1
- package/dist/server/app-prerender-endpoints.js.map +0 -1
- package/dist/server/app-prerender-static-params.js.map +0 -1
- package/dist/server/app-render-dependency.js.map +0 -1
- package/dist/server/app-request-context.js.map +0 -1
- package/dist/server/app-route-handler-cache.js.map +0 -1
- package/dist/server/app-route-handler-dispatch.js.map +0 -1
- package/dist/server/app-route-handler-execution.js.map +0 -1
- package/dist/server/app-route-handler-policy.js.map +0 -1
- package/dist/server/app-route-handler-response.js.map +0 -1
- package/dist/server/app-route-handler-runtime.js.map +0 -1
- package/dist/server/app-router-entry.js.map +0 -1
- package/dist/server/app-rsc-cache-busting.js.map +0 -1
- package/dist/server/app-rsc-embedded-chunks.js.map +0 -1
- package/dist/server/app-rsc-error-handler.js.map +0 -1
- package/dist/server/app-rsc-errors.js.map +0 -1
- package/dist/server/app-rsc-handler.js.map +0 -1
- package/dist/server/app-rsc-render-mode.js.map +0 -1
- package/dist/server/app-rsc-request-normalization.js.map +0 -1
- package/dist/server/app-rsc-response-finalizer.js.map +0 -1
- package/dist/server/app-rsc-route-matching.js.map +0 -1
- package/dist/server/app-segment-config.js.map +0 -1
- package/dist/server/app-server-action-execution.js.map +0 -1
- package/dist/server/app-ssr-entry.js.map +0 -1
- package/dist/server/app-ssr-error-meta.js.map +0 -1
- package/dist/server/app-ssr-stream.js.map +0 -1
- package/dist/server/app-static-generation.js.map +0 -1
- package/dist/server/artifact-compatibility.js.map +0 -1
- package/dist/server/cache-control.js.map +0 -1
- package/dist/server/cache-headers.js.map +0 -1
- package/dist/server/cache-proof.js.map +0 -1
- package/dist/server/client-reuse-manifest.js.map +0 -1
- package/dist/server/client-trace-metadata.js.map +0 -1
- package/dist/server/cookie-utils.js.map +0 -1
- package/dist/server/csp.js.map +0 -1
- package/dist/server/default-global-error-module.js.map +0 -1
- package/dist/server/default-not-found-module.js.map +0 -1
- package/dist/server/dev-error-overlay-store.js.map +0 -1
- package/dist/server/dev-error-overlay.js.map +0 -1
- package/dist/server/dev-lockfile.js.map +0 -1
- package/dist/server/dev-module-runner.js.map +0 -1
- package/dist/server/dev-origin-check.js.map +0 -1
- package/dist/server/dev-route-files.js.map +0 -1
- package/dist/server/dev-server.js.map +0 -1
- package/dist/server/edge-api-runtime.js.map +0 -1
- package/dist/server/file-based-metadata.js.map +0 -1
- package/dist/server/headers.js.map +0 -1
- package/dist/server/html.js.map +0 -1
- package/dist/server/http-error-responses.js.map +0 -1
- package/dist/server/image-optimization.js.map +0 -1
- package/dist/server/implicit-tags.js.map +0 -1
- package/dist/server/instrumentation-runtime.js.map +0 -1
- package/dist/server/instrumentation.js.map +0 -1
- package/dist/server/isr-cache.js.map +0 -1
- package/dist/server/metadata-route-build-data.js.map +0 -1
- package/dist/server/metadata-route-response.js.map +0 -1
- package/dist/server/metadata-routes.js.map +0 -1
- package/dist/server/middleware-matcher.js.map +0 -1
- package/dist/server/middleware-request-headers.js.map +0 -1
- package/dist/server/middleware-response-headers.js.map +0 -1
- package/dist/server/middleware-runtime.js.map +0 -1
- package/dist/server/middleware.js.map +0 -1
- package/dist/server/navigation-planner.js.map +0 -1
- package/dist/server/navigation-trace.js.map +0 -1
- package/dist/server/next-error-digest.js.map +0 -1
- package/dist/server/normalize-path.js.map +0 -1
- package/dist/server/pages-api-route.js.map +0 -1
- package/dist/server/pages-body-parser-config.js.map +0 -1
- package/dist/server/pages-data-route.js.map +0 -1
- package/dist/server/pages-default-404.js.map +0 -1
- package/dist/server/pages-document-initial-props.js.map +0 -1
- package/dist/server/pages-i18n.js.map +0 -1
- package/dist/server/pages-media-type.js.map +0 -1
- package/dist/server/pages-node-compat.js.map +0 -1
- package/dist/server/pages-page-data.js.map +0 -1
- package/dist/server/pages-page-method.js.map +0 -1
- package/dist/server/pages-page-response.js.map +0 -1
- package/dist/server/pages-serializable-props.js.map +0 -1
- package/dist/server/prerender-route-params.js.map +0 -1
- package/dist/server/prerender-work-unit-setup.js.map +0 -1
- package/dist/server/prod-server.js.map +0 -1
- package/dist/server/proxy-trust.js.map +0 -1
- package/dist/server/request-log.js.map +0 -1
- package/dist/server/request-pipeline.js.map +0 -1
- package/dist/server/rsc-stream-hints.js.map +0 -1
- package/dist/server/seed-cache.js.map +0 -1
- package/dist/server/server-action-not-found.js.map +0 -1
- package/dist/server/server-globals.js.map +0 -1
- package/dist/server/skip-cache-proof.js.map +0 -1
- package/dist/server/socket-error-backstop.js.map +0 -1
- package/dist/server/static-file-cache.js.map +0 -1
- package/dist/server/streaming-metadata.js.map +0 -1
- package/dist/server/worker-utils.js.map +0 -1
- package/dist/shims/amp.js.map +0 -1
- package/dist/shims/app-router-scroll-state.js.map +0 -1
- package/dist/shims/app-router-scroll.js.map +0 -1
- package/dist/shims/app.js.map +0 -1
- package/dist/shims/before-interactive-context.js.map +0 -1
- package/dist/shims/cache-for-request.js.map +0 -1
- package/dist/shims/cache-runtime.js.map +0 -1
- package/dist/shims/cache.js.map +0 -1
- package/dist/shims/client-hook-error.js.map +0 -1
- package/dist/shims/client-locale.js.map +0 -1
- package/dist/shims/compat-router.js.map +0 -1
- package/dist/shims/config.js.map +0 -1
- package/dist/shims/constants.js.map +0 -1
- package/dist/shims/default-global-error.js.map +0 -1
- package/dist/shims/default-not-found.js.map +0 -1
- package/dist/shims/document.js.map +0 -1
- package/dist/shims/dynamic.js.map +0 -1
- package/dist/shims/error-boundary.js.map +0 -1
- package/dist/shims/error.js.map +0 -1
- package/dist/shims/fetch-cache.js.map +0 -1
- package/dist/shims/font-google-base.js.map +0 -1
- package/dist/shims/font-local.js.map +0 -1
- package/dist/shims/font-utils.js.map +0 -1
- package/dist/shims/form.js.map +0 -1
- package/dist/shims/hash-scroll.js.map +0 -1
- package/dist/shims/head-state.js.map +0 -1
- package/dist/shims/head.js.map +0 -1
- package/dist/shims/headers.js.map +0 -1
- package/dist/shims/i18n-context.js.map +0 -1
- package/dist/shims/i18n-state.js.map +0 -1
- package/dist/shims/image-config.js.map +0 -1
- package/dist/shims/image.js.map +0 -1
- package/dist/shims/internal/als-registry.js.map +0 -1
- package/dist/shims/internal/app-route-detection.js.map +0 -1
- package/dist/shims/internal/app-router-context.js.map +0 -1
- package/dist/shims/internal/cookie-serialize.js.map +0 -1
- package/dist/shims/internal/make-hanging-promise.js.map +0 -1
- package/dist/shims/internal/pages-data-target.js.map +0 -1
- package/dist/shims/internal/pages-data-url.js.map +0 -1
- package/dist/shims/internal/parse-cookie-header.js.map +0 -1
- package/dist/shims/internal/router-context.js.map +0 -1
- package/dist/shims/internal/utils.js.map +0 -1
- package/dist/shims/internal/work-unit-async-storage.js.map +0 -1
- package/dist/shims/layout-segment-context.js.map +0 -1
- package/dist/shims/legacy-image.js.map +0 -1
- package/dist/shims/link-prefetch.js.map +0 -1
- package/dist/shims/link.js.map +0 -1
- package/dist/shims/metadata.js.map +0 -1
- package/dist/shims/navigation-state.js.map +0 -1
- package/dist/shims/navigation.js.map +0 -1
- package/dist/shims/navigation.react-server.js.map +0 -1
- package/dist/shims/offline.js.map +0 -1
- package/dist/shims/og.js.map +0 -1
- package/dist/shims/pages-router-runtime.js.map +0 -1
- package/dist/shims/readonly-url-search-params.js.map +0 -1
- package/dist/shims/request-context.js.map +0 -1
- package/dist/shims/root-params.js.map +0 -1
- package/dist/shims/router-state.js.map +0 -1
- package/dist/shims/router.js.map +0 -1
- package/dist/shims/script-nonce-context.js.map +0 -1
- package/dist/shims/script.js.map +0 -1
- package/dist/shims/server.js.map +0 -1
- package/dist/shims/slot.js.map +0 -1
- package/dist/shims/thenable-params.js.map +0 -1
- package/dist/shims/unified-request-context.js.map +0 -1
- package/dist/shims/unrecognized-action-error.js.map +0 -1
- package/dist/shims/url-safety.js.map +0 -1
- package/dist/shims/url-utils.js.map +0 -1
- package/dist/shims/use-merged-ref.js.map +0 -1
- package/dist/shims/web-vitals.js.map +0 -1
- package/dist/typegen.js.map +0 -1
- package/dist/utils/asset-prefix.js.map +0 -1
- package/dist/utils/base-path.js.map +0 -1
- package/dist/utils/cache-control-metadata.js.map +0 -1
- package/dist/utils/domain-locale.js.map +0 -1
- package/dist/utils/encode-cache-tag.js.map +0 -1
- package/dist/utils/error-cause.js.map +0 -1
- package/dist/utils/hash.js.map +0 -1
- package/dist/utils/html-limited-bots.js.map +0 -1
- package/dist/utils/lazy-chunks.js.map +0 -1
- package/dist/utils/manifest-paths.js.map +0 -1
- package/dist/utils/mdx-scan.js.map +0 -1
- package/dist/utils/navigation-signal.js.map +0 -1
- package/dist/utils/path.js.map +0 -1
- package/dist/utils/prerender-output-paths.js.map +0 -1
- package/dist/utils/project.js.map +0 -1
- package/dist/utils/public-routes.js.map +0 -1
- package/dist/utils/query.js.map +0 -1
- package/dist/utils/record.js.map +0 -1
- package/dist/utils/safe-json-file.js.map +0 -1
- package/dist/utils/sorted-array.js.map +0 -1
- package/dist/utils/text-stream.js.map +0 -1
- package/dist/utils/vinext-root.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"app-page-head.js","names":["_resolveModuleMetadata","parentForLayout"],"sources":["../../src/server/app-page-head.ts"],"sourcesContent":["import {\n mergeMetadataEntries,\n mergeViewport,\n postProcessMetadata,\n resolveModuleMetadata as _resolveModuleMetadata,\n resolveModuleViewport,\n type Metadata,\n type MetadataMergeEntry,\n type Viewport,\n} from \"vinext/shims/metadata\";\nimport { runWithFetchDedupe } from \"vinext/shims/fetch-cache\";\nimport { applyFileBasedMetadata } from \"./file-based-metadata.js\";\nimport type { AppPageParams } from \"./app-page-boundary.js\";\nimport { tagAppPageMetadataError } from \"./app-page-execution.js\";\nimport { resolveAppPageSegmentParams } from \"./app-page-params.js\";\nimport type { MetadataFileRoute } from \"./metadata-routes.js\";\n\n/**\n * Wrapped {@link _resolveModuleMetadata} that tags any thrown error with the\n * `APP_PAGE_METADATA_ERROR_MARKER` symbol. The marker lets downstream special-\n * error handling distinguish a `generateMetadata()` redirect/notFound from a\n * page-component redirect/notFound, which matters because metadata is\n * suspended/streamed in Next.js: its redirects ride inside the flight payload\n * with a 200 status code even for document SSR, whereas page redirects still\n * emit a 307 for SSR. See https://github.com/cloudflare/vinext/issues/1347\n * and Next.js test/e2e/app-dir/metadata-navigation.\n */\nasync function resolveModuleMetadata(\n ...args: Parameters<typeof _resolveModuleMetadata>\n): Promise<Metadata | null> {\n try {\n return await _resolveModuleMetadata(...args);\n } catch (error) {\n throw tagAppPageMetadataError(error);\n }\n}\n\ntype AppPageSearchParams = Record<string, string | string[]>;\n\ntype AppPageHeadModule = Record<string, unknown>;\n\ntype AppPageHeadSource = {\n metadata: Metadata | null;\n routeSegments: readonly string[];\n};\n\ntype AppPageHeadLayout<TModule extends AppPageHeadModule> = {\n module: TModule;\n treePosition: number;\n};\n\ntype AppPageHeadParallelRoute<TModule extends AppPageHeadModule = AppPageHeadModule> = {\n layoutModule?: TModule | null;\n layoutModules?: readonly (TModule | null | undefined)[] | null;\n pageModule?: TModule | null;\n params?: AppPageParams | null;\n routeSegments?: readonly string[] | null;\n};\n\ntype AppPageHeadSlot<TModule extends AppPageHeadModule = AppPageHeadModule> = {\n layout?: TModule | null;\n page?: TModule | null;\n};\n\ntype ResolveActiveParallelRouteHeadInputsOptions<\n TModule extends AppPageHeadModule = AppPageHeadModule,\n> = {\n interceptLayouts?: readonly (TModule | null | undefined)[] | null;\n interceptPage?: TModule | null;\n interceptParams?: AppPageParams | null;\n interceptSlotKey?: string | null;\n params: AppPageParams;\n routeSegments: readonly string[];\n slots?: Record<string, AppPageHeadSlot<TModule>> | null;\n};\n\ntype ResolveAppPageHeadOptions<TModule extends AppPageHeadModule = AppPageHeadModule> = {\n /**\n * Configured next.config `basePath`. Threaded into `applyFileBasedMetadata`\n * so file-based metadata route URLs (icon, opengraph-image, manifest, ...)\n * emitted in <head> are prefixed with the basePath. Empty string when no\n * basePath is configured.\n */\n basePath?: string;\n fallbackOnFileMetadataError?: boolean;\n layoutModules: readonly (TModule | null | undefined)[];\n layoutTreePositions?: readonly number[] | null;\n metadataRoutes: readonly MetadataFileRoute[];\n pageModule?: TModule | null;\n parallelRoutes?: readonly AppPageHeadParallelRoute<TModule>[] | null;\n params: AppPageParams;\n routePath: string;\n routeSegments?: readonly string[] | null;\n searchParams?: URLSearchParams | null;\n};\n\ntype ResolveAppPageHeadResult = {\n hasDynamicMetadata: boolean;\n hasSearchParams: boolean;\n metadata: Metadata | null;\n pageSearchParams: AppPageSearchParams;\n viewport: Viewport;\n};\n\ntype AppPageSearchParamsCollection = {\n hasSearchParams: boolean;\n pageSearchParams: AppPageSearchParams;\n};\n\ntype ResolvedParallelRouteHead = {\n hasDynamicMetadata: boolean;\n metadataResults: (Metadata | null)[];\n metadataSources: AppPageHeadSource[];\n viewportResults: (Viewport | null)[];\n};\n\nexport function resolveActiveParallelRouteHeadInputs<TModule extends AppPageHeadModule>(\n options: ResolveActiveParallelRouteHeadInputsOptions<TModule>,\n): AppPageHeadParallelRoute<TModule>[] {\n return Object.entries(options.slots ?? {}).map(([slotKey, slot]) => {\n if (options.interceptSlotKey === slotKey && options.interceptPage) {\n return {\n layoutModules: options.interceptLayouts ?? [],\n pageModule: options.interceptPage,\n params: options.interceptParams ?? options.params,\n routeSegments: options.routeSegments,\n };\n }\n\n return {\n layoutModules: slot.layout ? [slot.layout] : [],\n pageModule: slot.page,\n params: options.params,\n routeSegments: options.routeSegments,\n };\n });\n}\n\nfunction isPresent<T>(value: T | null | undefined): value is T {\n return value !== null && value !== undefined;\n}\n\nfunction hasGenerateMetadata(module: AppPageHeadModule | null | undefined): boolean {\n return typeof module?.generateMetadata === \"function\";\n}\n\nexport function collectAppPageSearchParams(\n searchParams: URLSearchParams | null | undefined,\n): AppPageSearchParamsCollection {\n const pageSearchParams: AppPageSearchParams = Object.create(null);\n let hasSearchParams = false;\n\n searchParams?.forEach((value, key) => {\n hasSearchParams = true;\n const currentValue = pageSearchParams[key];\n if (Array.isArray(currentValue)) {\n pageSearchParams[key] = [...currentValue, value];\n return;\n }\n if (currentValue !== undefined) {\n pageSearchParams[key] = [currentValue, value];\n return;\n }\n pageSearchParams[key] = value;\n });\n\n return { hasSearchParams, pageSearchParams };\n}\n\nfunction createMetadataSources(\n metadataResults: readonly (Metadata | null)[],\n routeSegments: readonly string[],\n layoutTreePositions: readonly number[],\n pageMetadata: Metadata | null,\n includePageSource: boolean,\n): AppPageHeadSource[] {\n const metadataSources: AppPageHeadSource[] = metadataResults.map((metadata, index) => ({\n routeSegments: routeSegments.slice(0, layoutTreePositions[index] ?? 0),\n metadata,\n }));\n\n if (includePageSource) {\n metadataSources.push({\n routeSegments,\n metadata: pageMetadata,\n });\n }\n\n return metadataSources;\n}\n\nfunction createLayoutInputs<TModule extends AppPageHeadModule>(\n layoutModules: readonly (TModule | null | undefined)[],\n layoutTreePositions: readonly number[],\n): AppPageHeadLayout<TModule>[] {\n const layoutInputs: AppPageHeadLayout<TModule>[] = [];\n\n for (let index = 0; index < layoutModules.length; index++) {\n const layoutModule = layoutModules[index];\n if (!isPresent(layoutModule)) {\n continue;\n }\n layoutInputs.push({\n module: layoutModule,\n treePosition: layoutTreePositions[index] ?? 0,\n });\n }\n\n return layoutInputs;\n}\n\nasync function resolveLayoutMetadata<TModule extends AppPageHeadModule>(\n layoutInputs: readonly AppPageHeadLayout<TModule>[],\n params: AppPageParams,\n routeSegments: readonly string[],\n): Promise<(Metadata | null)[]> {\n const layoutMetadataPromises: Promise<Metadata | null>[] = [];\n let accumulatedMetadata = Promise.resolve<Metadata>({});\n\n for (const layoutInput of layoutInputs) {\n const parentForLayout = accumulatedMetadata;\n const layoutParams = resolveAppPageSegmentParams(\n routeSegments,\n layoutInput.treePosition,\n params,\n );\n const metadataPromise = resolveModuleMetadata(\n layoutInput.module,\n layoutParams,\n undefined,\n parentForLayout,\n );\n layoutMetadataPromises.push(metadataPromise);\n void metadataPromise.catch(() => null);\n\n accumulatedMetadata = metadataPromise.then(async (metadataResult) => {\n if (metadataResult) {\n return mergeMetadataEntries([\n { metadata: await parentForLayout },\n { metadata: metadataResult },\n ]);\n }\n return parentForLayout;\n });\n void accumulatedMetadata.catch(() => null);\n }\n\n return Promise.all(layoutMetadataPromises);\n}\n\nasync function resolveLayoutViewport<TModule extends AppPageHeadModule>(\n layoutInputs: readonly AppPageHeadLayout<TModule>[],\n params: AppPageParams,\n routeSegments: readonly string[],\n): Promise<(Viewport | null)[]> {\n return Promise.all(\n layoutInputs.map((layoutInput) => {\n const layoutParams = resolveAppPageSegmentParams(\n routeSegments,\n layoutInput.treePosition,\n params,\n );\n return resolveModuleViewport(layoutInput.module, layoutParams);\n }),\n );\n}\n\nasync function resolveParallelRouteHead<TModule extends AppPageHeadModule>(\n parallelRoute: AppPageHeadParallelRoute<TModule>,\n fallbackParams: AppPageParams,\n fallbackRouteSegments: readonly string[],\n pageSearchParams: AppPageSearchParams,\n parent: Promise<Metadata>,\n): Promise<ResolvedParallelRouteHead> {\n const params = parallelRoute.params ?? fallbackParams;\n const routeSegments = parallelRoute.routeSegments ?? fallbackRouteSegments;\n const metadataResults: (Metadata | null)[] = [];\n const viewportResults: (Viewport | null)[] = [];\n const metadataSources: AppPageHeadSource[] = [];\n let accumulatedMetadata = parent;\n const layoutModules = [...(parallelRoute.layoutModules ?? []), parallelRoute.layoutModule].filter(\n isPresent,\n );\n const hasDynamicMetadata =\n layoutModules.some(hasGenerateMetadata) || hasGenerateMetadata(parallelRoute.pageModule);\n const layoutViewportPromises = layoutModules.map((layoutModule) =>\n resolveModuleViewport(layoutModule, params),\n );\n const pageViewportPromise = parallelRoute.pageModule\n ? resolveModuleViewport(parallelRoute.pageModule, params)\n : Promise.resolve(null);\n for (const layoutViewportPromise of layoutViewportPromises) {\n void layoutViewportPromise.catch(() => null);\n }\n void pageViewportPromise.catch(() => null);\n\n for (const layoutModule of layoutModules) {\n const layoutMetadata = await resolveModuleMetadata(\n layoutModule,\n params,\n undefined,\n accumulatedMetadata,\n );\n metadataResults.push(layoutMetadata);\n // Parallel route metadata sources are scoped to the active slot branch because\n // the route tree input does not carry per-layout segment positions inside that branch.\n metadataSources.push({ metadata: layoutMetadata, routeSegments });\n if (layoutMetadata) {\n const parentForLayout = accumulatedMetadata;\n accumulatedMetadata = parentForLayout.then(async (parentMetadata) =>\n mergeMetadataEntries([{ metadata: parentMetadata }, { metadata: layoutMetadata }]),\n );\n void accumulatedMetadata.catch(() => null);\n }\n }\n\n if (parallelRoute.pageModule) {\n const pageMetadata = await resolveModuleMetadata(\n parallelRoute.pageModule,\n params,\n pageSearchParams,\n accumulatedMetadata,\n );\n metadataResults.push(pageMetadata);\n // Keep the page source scoped to the same active slot branch as its layouts.\n metadataSources.push({ metadata: pageMetadata, routeSegments });\n }\n\n viewportResults.push(...(await Promise.all(layoutViewportPromises)));\n const pageViewport = await pageViewportPromise;\n if (parallelRoute.pageModule) {\n viewportResults.push(pageViewport);\n }\n\n return { hasDynamicMetadata, metadataResults, metadataSources, viewportResults };\n}\n\nexport async function resolveAppPageHead<TModule extends AppPageHeadModule>(\n options: ResolveAppPageHeadOptions<TModule>,\n): Promise<ResolveAppPageHeadResult> {\n return await runWithFetchDedupe(() => resolveAppPageHeadInner(options));\n}\n\nasync function resolveAppPageHeadInner<TModule extends AppPageHeadModule>(\n options: ResolveAppPageHeadOptions<TModule>,\n): Promise<ResolveAppPageHeadResult> {\n const routeSegments = options.routeSegments ?? [];\n const layoutTreePositions = options.layoutTreePositions ?? [];\n const layoutInputs = createLayoutInputs(options.layoutModules, layoutTreePositions);\n const layoutSourcePositions = layoutInputs.map((input) => input.treePosition);\n const primaryHasDynamicMetadata =\n layoutInputs.some((input) => hasGenerateMetadata(input.module)) ||\n hasGenerateMetadata(options.pageModule);\n const { hasSearchParams, pageSearchParams } = collectAppPageSearchParams(options.searchParams);\n const layoutMetadataPromise = resolveLayoutMetadata(layoutInputs, options.params, routeSegments);\n const layoutViewportPromise = resolveLayoutViewport(layoutInputs, options.params, routeSegments);\n\n const layoutMetadataResultsForParent = layoutMetadataPromise.then((metadataResults) =>\n metadataResults.filter(isPresent),\n );\n void layoutMetadataResultsForParent.catch(() => null);\n const pageParentPromise = layoutMetadataResultsForParent.then((metadataResults) =>\n metadataResults.length > 0\n ? mergeMetadataEntries(metadataResults.map((metadata) => ({ metadata })))\n : {},\n );\n void pageParentPromise.catch(() => null);\n const pageMetadataPromise = options.pageModule\n ? resolveModuleMetadata(options.pageModule, options.params, pageSearchParams, pageParentPromise)\n : Promise.resolve(null);\n const pageViewportPromise = options.pageModule\n ? resolveModuleViewport(options.pageModule, options.params)\n : Promise.resolve(null);\n const parallelRouteHeadPromise = Promise.all(\n (options.parallelRoutes ?? []).map((parallelRoute) =>\n resolveParallelRouteHead(\n parallelRoute,\n options.params,\n routeSegments,\n pageSearchParams,\n pageParentPromise,\n ),\n ),\n );\n\n const [\n layoutMetadataResults,\n layoutViewportResults,\n pageMetadata,\n pageViewport,\n parallelRouteHeads,\n ] = await Promise.all([\n layoutMetadataPromise,\n layoutViewportPromise,\n pageMetadataPromise,\n pageViewportPromise,\n parallelRouteHeadPromise,\n ]);\n const parallelMetadataResults = parallelRouteHeads.flatMap((head) => head.metadataResults);\n const parallelViewportResults = parallelRouteHeads.flatMap((head) => head.viewportResults);\n const parallelMetadataSources = parallelRouteHeads.flatMap((head) => head.metadataSources);\n const hasDynamicMetadata =\n primaryHasDynamicMetadata || parallelRouteHeads.some((head) => head.hasDynamicMetadata);\n\n // Active parallel slot metadata is suppressed from contributing the primary\n // <title> when the matched page already provides one. This preserves Next.js\n // behavior where slot pages (typically modals/sidebars rendered alongside the\n // main page) don't clobber the page title. When the route has no children\n // page providing a title (e.g. a parallel layout that doesn't render\n // `{children}`, or a parent that only has `default.tsx`), the slot page's\n // title is the most specific signal and is allowed to contribute — matching\n // Next.js's loader-tree walk which appends slot metadata items in tree order\n // with no title suppression.\n // Reference: https://github.com/vercel/next.js/blob/canary/packages/next/src/lib/metadata/resolve-metadata.ts\n const primaryPageHasTitle = pageMetadata != null && pageMetadata.title !== undefined;\n const metadataEntries: MetadataMergeEntry[] = [\n ...layoutMetadataResults.filter(isPresent).map((metadata) => ({ metadata })),\n ...(pageMetadata ? [{ isPage: true, metadata: pageMetadata }] : []),\n ...parallelMetadataResults\n .filter(isPresent)\n .map((metadata) => ({ contributesTitle: !primaryPageHasTitle, metadata })),\n ];\n const viewportList = [\n ...layoutViewportResults.filter(isPresent),\n ...(pageViewport ? [pageViewport] : []),\n ...parallelViewportResults.filter(isPresent),\n ];\n\n const resolvedMetadataBase =\n metadataEntries.length > 0 ? mergeMetadataEntries(metadataEntries) : null;\n const metadataSources = createMetadataSources(\n layoutMetadataResults,\n routeSegments,\n layoutSourcePositions,\n pageMetadata,\n Boolean(options.pageModule),\n );\n metadataSources.push(...parallelMetadataSources);\n let metadata = resolvedMetadataBase;\n\n try {\n metadata = await applyFileBasedMetadata(\n resolvedMetadataBase,\n options.routePath,\n options.params,\n options.metadataRoutes,\n {\n routeSegments,\n metadataSources,\n basePath: options.basePath ?? \"\",\n },\n );\n } catch (error) {\n if (!options.fallbackOnFileMetadataError) {\n throw error;\n }\n console.error(\n `[vinext] File-based metadata resolution failed while rendering error boundary for ${options.routePath}:`,\n error,\n );\n }\n\n if (metadata) {\n metadata = postProcessMetadata(metadata);\n }\n\n return {\n hasDynamicMetadata,\n hasSearchParams,\n metadata,\n pageSearchParams,\n viewport: mergeViewport(viewportList),\n };\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"app-page-method.js","names":[],"sources":["../../src/server/app-page-method.ts"],"sourcesContent":["import { isPossibleAppRouteActionRequest } from \"./app-route-handler-policy.js\";\nimport { mergeMiddlewareResponseHeaders } from \"./middleware-response-headers.js\";\nimport { methodNotAllowedResponse } from \"./http-error-responses.js\";\n\ntype AppPageMethodPolicyOptions = {\n dynamicConfig?: string;\n hasGenerateStaticParams: boolean;\n isDynamicRoute: boolean;\n revalidateSeconds: number | null;\n};\n\ntype ResolveAppPageMethodResponseOptions = {\n middlewareHeaders?: Headers | null;\n request: Pick<Request, \"headers\" | \"method\">;\n} & AppPageMethodPolicyOptions;\n\nfunction isNonGetOrHead(method: string): boolean {\n const normalizedMethod = method.toUpperCase();\n return normalizedMethod !== \"GET\" && normalizedMethod !== \"HEAD\";\n}\n\nexport function isStaticOrSsgAppPageCandidate(options: AppPageMethodPolicyOptions): boolean {\n if (options.dynamicConfig === \"force-dynamic\" || options.revalidateSeconds === 0) {\n return false;\n }\n\n if (options.dynamicConfig === \"force-static\" || options.dynamicConfig === \"error\") {\n return true;\n }\n\n if (options.revalidateSeconds !== null && options.revalidateSeconds > 0) {\n return true;\n }\n\n if (options.hasGenerateStaticParams) {\n return true;\n }\n\n return !options.isDynamicRoute;\n}\n\nexport function resolveAppPageMethodResponse(\n options: ResolveAppPageMethodResponseOptions,\n): Response | null {\n if (!isNonGetOrHead(options.request.method)) {\n return null;\n }\n\n if (isPossibleAppRouteActionRequest(options.request)) {\n return null;\n }\n\n if (!isStaticOrSsgAppPageCandidate(options)) {\n return null;\n }\n\n const headers = new Headers();\n mergeMiddlewareResponseHeaders(headers, options.middlewareHeaders ?? null);\n\n return methodNotAllowedResponse(\"GET, HEAD\", { headers });\n}\n"],"mappings":";;;;AAgBA,SAAS,eAAe,QAAyB;CAC/C,MAAM,mBAAmB,OAAO,aAAa;CAC7C,OAAO,qBAAqB,SAAS,qBAAqB;;AAG5D,SAAgB,8BAA8B,SAA8C;CAC1F,IAAI,QAAQ,kBAAkB,mBAAmB,QAAQ,sBAAsB,GAC7E,OAAO;CAGT,IAAI,QAAQ,kBAAkB,kBAAkB,QAAQ,kBAAkB,SACxE,OAAO;CAGT,IAAI,QAAQ,sBAAsB,QAAQ,QAAQ,oBAAoB,GACpE,OAAO;CAGT,IAAI,QAAQ,yBACV,OAAO;CAGT,OAAO,CAAC,QAAQ;;AAGlB,SAAgB,6BACd,SACiB;CACjB,IAAI,CAAC,eAAe,QAAQ,QAAQ,OAAO,EACzC,OAAO;CAGT,IAAI,gCAAgC,QAAQ,QAAQ,EAClD,OAAO;CAGT,IAAI,CAAC,8BAA8B,QAAQ,EACzC,OAAO;CAGT,MAAM,UAAU,IAAI,SAAS;CAC7B,+BAA+B,SAAS,QAAQ,qBAAqB,KAAK;CAE1E,OAAO,yBAAyB,aAAa,EAAE,SAAS,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"app-page-params.js","names":[],"sources":["../../src/server/app-page-params.ts"],"sourcesContent":["import type { AppPageParams } from \"./app-page-boundary.js\";\n\nexport function getAppPageSegmentParamName(segment: string): string | null {\n if (segment.startsWith(\"[[...\") && segment.endsWith(\"]]\") && segment.length > 7) {\n return segment.slice(5, -2);\n }\n\n if (segment.startsWith(\"[...\") && segment.endsWith(\"]\") && segment.length > 5) {\n return segment.slice(4, -1);\n }\n\n if (\n segment.startsWith(\"[\") &&\n segment.endsWith(\"]\") &&\n !segment.includes(\".\") &&\n segment.length > 2\n ) {\n return segment.slice(1, -1);\n }\n\n return null;\n}\n\nfunction isEmptyOptionalCatchAll(segment: string, paramValue: string | string[]): boolean {\n return segment.startsWith(\"[[...\") && Array.isArray(paramValue) && paramValue.length === 0;\n}\n\nexport function resolveAppPageSegmentParams(\n routeSegments: readonly string[] | null | undefined,\n treePosition: number,\n matchedParams: AppPageParams,\n): AppPageParams {\n const segmentParams: AppPageParams = {};\n const segments = routeSegments ?? [];\n const end = Math.min(Math.max(treePosition, 0), segments.length);\n\n for (let index = 0; index < end; index++) {\n const segment = segments[index];\n const paramName = getAppPageSegmentParamName(segment);\n if (!paramName) {\n continue;\n }\n\n const paramValue = matchedParams[paramName];\n if (paramValue === undefined || isEmptyOptionalCatchAll(segment, paramValue)) {\n continue;\n }\n\n segmentParams[paramName] = paramValue;\n }\n\n return segmentParams;\n}\n"],"mappings":";AAEA,SAAgB,2BAA2B,SAAgC;CACzE,IAAI,QAAQ,WAAW,QAAQ,IAAI,QAAQ,SAAS,KAAK,IAAI,QAAQ,SAAS,GAC5E,OAAO,QAAQ,MAAM,GAAG,GAAG;CAG7B,IAAI,QAAQ,WAAW,OAAO,IAAI,QAAQ,SAAS,IAAI,IAAI,QAAQ,SAAS,GAC1E,OAAO,QAAQ,MAAM,GAAG,GAAG;CAG7B,IACE,QAAQ,WAAW,IAAI,IACvB,QAAQ,SAAS,IAAI,IACrB,CAAC,QAAQ,SAAS,IAAI,IACtB,QAAQ,SAAS,GAEjB,OAAO,QAAQ,MAAM,GAAG,GAAG;CAG7B,OAAO;;AAGT,SAAS,wBAAwB,SAAiB,YAAwC;CACxF,OAAO,QAAQ,WAAW,QAAQ,IAAI,MAAM,QAAQ,WAAW,IAAI,WAAW,WAAW;;AAG3F,SAAgB,4BACd,eACA,cACA,eACe;CACf,MAAM,gBAA+B,EAAE;CACvC,MAAM,WAAW,iBAAiB,EAAE;CACpC,MAAM,MAAM,KAAK,IAAI,KAAK,IAAI,cAAc,EAAE,EAAE,SAAS,OAAO;CAEhE,KAAK,IAAI,QAAQ,GAAG,QAAQ,KAAK,SAAS;EACxC,MAAM,UAAU,SAAS;EACzB,MAAM,YAAY,2BAA2B,QAAQ;EACrD,IAAI,CAAC,WACH;EAGF,MAAM,aAAa,cAAc;EACjC,IAAI,eAAe,KAAA,KAAa,wBAAwB,SAAS,WAAW,EAC1E;EAGF,cAAc,aAAa;;CAG7B,OAAO"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"app-page-probe.js","names":[],"sources":["../../src/server/app-page-probe.ts"],"sourcesContent":["import { makeThenableParams } from \"vinext/shims/thenable-params\";\nimport { collectAppPageSearchParams } from \"./app-page-head.js\";\nimport {\n probeAppPageComponent,\n probeAppPageLayouts,\n type AppPageSpecialError,\n type LayoutClassificationOptions,\n type LayoutFlags,\n} from \"./app-page-execution.js\";\n\n/**\n * Build a probePage() invocation for the App Router request lifecycle.\n *\n * The generated RSC entry calls this once per request after route matching to\n * eagerly invoke the page component. Surfacing redirect()/notFound() throws\n * here lets the probe lifecycle turn them into proper HTTP responses before\n * RSC streaming begins (see `probeAppPageBeforeRender`).\n *\n * The helper exists to keep the generated entry thin (a single delegation\n * call) and to make the search-params wiring directly unit-testable. A bug\n * here previously slipped through because the entry hand-rolled the call and\n * read a non-existent key off `collectAppPageSearchParams`'s return value\n * (see https://github.com/cloudflare/vinext/issues/1235).\n *\n * Returns `null` when the route has no page component (eg. interception-only\n * routes), matching the caller contract on `probePage`.\n */\nexport function probeAppPage(options: {\n pageComponent: unknown;\n asyncRouteParams: unknown;\n searchParams: URLSearchParams | null | undefined;\n}): unknown {\n const { pageComponent, asyncRouteParams, searchParams } = options;\n if (typeof pageComponent !== \"function\") {\n return null;\n }\n const { pageSearchParams } = collectAppPageSearchParams(searchParams);\n const asyncSearchParams = makeThenableParams(pageSearchParams);\n return (pageComponent as (props: Record<string, unknown>) => unknown)({\n params: asyncRouteParams,\n searchParams: asyncSearchParams,\n });\n}\n\ntype ProbeAppPageBeforeRenderResult = {\n response: Response | null;\n layoutFlags: LayoutFlags;\n};\n\ntype ProbeAppPageBeforeRenderOptions = {\n hasLoadingBoundary: boolean;\n layoutCount: number;\n probeLayoutAt: (layoutIndex: number) => unknown;\n probePage: () => unknown;\n renderLayoutSpecialError: (\n specialError: AppPageSpecialError,\n layoutIndex: number,\n ) => Promise<Response>;\n renderPageSpecialError: (specialError: AppPageSpecialError) => Promise<Response>;\n resolveSpecialError: (error: unknown) => AppPageSpecialError | null;\n runWithSuppressedHookWarning<T>(probe: () => Promise<T>): Promise<T>;\n /** When provided, enables per-layout static/dynamic classification. */\n classification?: LayoutClassificationOptions | null;\n};\n\nexport async function probeAppPageBeforeRender(\n options: ProbeAppPageBeforeRenderOptions,\n): Promise<ProbeAppPageBeforeRenderResult> {\n let layoutFlags: LayoutFlags = {};\n\n // Layouts render before their children in Next.js, so layout-level special\n // errors must be handled before probing the page component itself.\n if (options.layoutCount > 0) {\n const layoutProbeResult = await probeAppPageLayouts({\n layoutCount: options.layoutCount,\n async onLayoutError(layoutError, layoutIndex) {\n const specialError = options.resolveSpecialError(layoutError);\n if (!specialError) {\n return null;\n }\n\n return options.renderLayoutSpecialError(specialError, layoutIndex);\n },\n probeLayoutAt: options.probeLayoutAt,\n runWithSuppressedHookWarning(probe) {\n return options.runWithSuppressedHookWarning(probe);\n },\n classification: options.classification,\n });\n\n layoutFlags = layoutProbeResult.layoutFlags;\n\n if (layoutProbeResult.response) {\n return { response: layoutProbeResult.response, layoutFlags };\n }\n }\n\n // When a route-level loading.tsx is present, the page renders inside a\n // route-level Suspense boundary, so a thrown redirect()/notFound() during\n // page render becomes an error inside that boundary. We can't catch it\n // here without serializing on the page promise — which would defeat the\n // streaming benefit of loading.tsx for slow non-redirecting pages.\n //\n // Recovery for the redirect/notFound case happens later in\n // renderAppPageLifecycle: rscErrorTracker captures the digest from React's\n // onError callback, and a short race window after shell-ready lets the\n // lifecycle swap the response to a 307/404 before bytes are flushed.\n // This mirrors Next.js's \"until-first-byte-is-flushed\" swap behavior.\n if (options.hasLoadingBoundary) {\n return { response: null, layoutFlags };\n }\n\n // Server Components are functions, so we can probe the page ahead of stream\n // creation and only turn special throws into immediate responses.\n const pageResponse = await probeAppPageComponent({\n awaitAsyncResult: true,\n async onError(pageError) {\n const specialError = options.resolveSpecialError(pageError);\n if (specialError) {\n return options.renderPageSpecialError(specialError);\n }\n\n // Non-special probe failures (for example use() outside React's render\n // cycle or client references executing on the server) are expected here.\n // The real RSC/SSR render path will surface those properly below.\n return null;\n },\n probePage: options.probePage,\n runWithSuppressedHookWarning(probe) {\n return options.runWithSuppressedHookWarning(probe);\n },\n });\n\n return { response: pageResponse, layoutFlags };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AA2BA,SAAgB,aAAa,SAIjB;CACV,MAAM,EAAE,eAAe,kBAAkB,iBAAiB;CAC1D,IAAI,OAAO,kBAAkB,YAC3B,OAAO;CAET,MAAM,EAAE,qBAAqB,2BAA2B,aAAa;CAErE,OAAQ,cAA8D;EACpE,QAAQ;EACR,cAHwB,mBAAmB,iBAGZ;EAChC,CAAC;;AAwBJ,eAAsB,yBACpB,SACyC;CACzC,IAAI,cAA2B,EAAE;CAIjC,IAAI,QAAQ,cAAc,GAAG;EAC3B,MAAM,oBAAoB,MAAM,oBAAoB;GAClD,aAAa,QAAQ;GACrB,MAAM,cAAc,aAAa,aAAa;IAC5C,MAAM,eAAe,QAAQ,oBAAoB,YAAY;IAC7D,IAAI,CAAC,cACH,OAAO;IAGT,OAAO,QAAQ,yBAAyB,cAAc,YAAY;;GAEpE,eAAe,QAAQ;GACvB,6BAA6B,OAAO;IAClC,OAAO,QAAQ,6BAA6B,MAAM;;GAEpD,gBAAgB,QAAQ;GACzB,CAAC;EAEF,cAAc,kBAAkB;EAEhC,IAAI,kBAAkB,UACpB,OAAO;GAAE,UAAU,kBAAkB;GAAU;GAAa;;CAehE,IAAI,QAAQ,oBACV,OAAO;EAAE,UAAU;EAAM;EAAa;CAwBxC,OAAO;EAAE,UAAU,MAnBQ,sBAAsB;GAC/C,kBAAkB;GAClB,MAAM,QAAQ,WAAW;IACvB,MAAM,eAAe,QAAQ,oBAAoB,UAAU;IAC3D,IAAI,cACF,OAAO,QAAQ,uBAAuB,aAAa;IAMrD,OAAO;;GAET,WAAW,QAAQ;GACnB,6BAA6B,OAAO;IAClC,OAAO,QAAQ,6BAA6B,MAAM;;GAErD,CAAC;EAE+B;EAAa"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"app-page-render-identity.js","names":[],"sources":["../../src/server/app-page-render-identity.ts"],"sourcesContent":["import { normalizePathnameForRouteMatch } from \"../routing/utils.js\";\nimport { AppElementsWire, type AppElementsInterception } from \"./app-elements.js\";\nimport { isInterceptionMatchedUrlPath, normalizePath } from \"./normalize-path.js\";\n\ntype AppPageRenderIdentityInput = {\n displayPathname: string;\n interceptionContext?: string | null;\n interceptSourceMatchedUrl?: string | null;\n interceptSlotId?: string | null;\n};\n\nexport type AppPageRenderIdentity = {\n displayPathname: string;\n interception: AppElementsInterception | null;\n interceptionContext: string | null;\n matchedRoutePathname: string;\n pageId: string;\n routeId: string;\n targetMatchedPathname: string;\n};\n\nfunction normalizeAppPageRenderMatchedPathname(pathname: string): string {\n if (!pathname.startsWith(\"/\")) {\n throw new Error(`[vinext] App Router render pathname must be absolute: ${pathname}`);\n }\n return normalizePath(normalizePathnameForRouteMatch(pathname));\n}\n\nexport function normalizeAppPageInterceptionProofPathname(pathname: string | null): string | null {\n if (pathname === null || !isInterceptionMatchedUrlPath(pathname)) return null;\n return normalizeAppPageRenderMatchedPathname(pathname);\n}\n\nexport function createAppPageRenderIdentity(\n input: AppPageRenderIdentityInput,\n): AppPageRenderIdentity {\n const interceptionContext = input.interceptionContext ?? null;\n const targetMatchedPathname = normalizeAppPageRenderMatchedPathname(input.displayPathname);\n const sourceMatchedPathname = normalizeAppPageInterceptionProofPathname(\n input.interceptSourceMatchedUrl ?? null,\n );\n const slotId = input.interceptSlotId ?? null;\n const matchedRoutePathname = sourceMatchedPathname ?? targetMatchedPathname;\n const routeId = AppElementsWire.encodeRouteId(matchedRoutePathname, null);\n const pageId = AppElementsWire.encodePageId(matchedRoutePathname, null);\n const interception =\n sourceMatchedPathname === null || slotId === null\n ? null\n : {\n sourceMatchedUrl: sourceMatchedPathname,\n sourceRouteId: AppElementsWire.encodeRouteId(sourceMatchedPathname, null),\n slotId,\n targetMatchedUrl: targetMatchedPathname,\n targetRouteId: AppElementsWire.encodeRouteId(targetMatchedPathname, null),\n };\n\n return {\n displayPathname: input.displayPathname,\n interception,\n interceptionContext,\n matchedRoutePathname,\n pageId,\n routeId,\n targetMatchedPathname,\n };\n}\n"],"mappings":";;;;;AAqBA,SAAS,sCAAsC,UAA0B;CACvE,IAAI,CAAC,SAAS,WAAW,IAAI,EAC3B,MAAM,IAAI,MAAM,yDAAyD,WAAW;CAEtF,OAAO,cAAc,+BAA+B,SAAS,CAAC;;AAGhE,SAAgB,0CAA0C,UAAwC;CAChG,IAAI,aAAa,QAAQ,CAAC,6BAA6B,SAAS,EAAE,OAAO;CACzE,OAAO,sCAAsC,SAAS;;AAGxD,SAAgB,4BACd,OACuB;CACvB,MAAM,sBAAsB,MAAM,uBAAuB;CACzD,MAAM,wBAAwB,sCAAsC,MAAM,gBAAgB;CAC1F,MAAM,wBAAwB,0CAC5B,MAAM,6BAA6B,KACpC;CACD,MAAM,SAAS,MAAM,mBAAmB;CACxC,MAAM,uBAAuB,yBAAyB;CACtD,MAAM,UAAU,gBAAgB,cAAc,sBAAsB,KAAK;CACzE,MAAM,SAAS,gBAAgB,aAAa,sBAAsB,KAAK;CACvE,MAAM,eACJ,0BAA0B,QAAQ,WAAW,OACzC,OACA;EACE,kBAAkB;EAClB,eAAe,gBAAgB,cAAc,uBAAuB,KAAK;EACzE;EACA,kBAAkB;EAClB,eAAe,gBAAgB,cAAc,uBAAuB,KAAK;EAC1E;CAEP,OAAO;EACL,iBAAiB,MAAM;EACvB;EACA;EACA;EACA;EACA;EACA;EACD"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"app-page-render-observation.js","names":[],"sources":["../../src/server/app-page-render-observation.ts"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { fnv1a64 } from \"../utils/hash.js\";\nimport { AppElementsWire, isAppElementsRecord } from \"./app-elements.js\";\nimport { normalizeMountedSlotsHeader } from \"./app-mounted-slots-header.js\";\nimport {\n buildRenderObservation,\n buildRenderRequestApiObservations,\n type BoundaryOutcome,\n type CacheProofOutputScope,\n type RenderCacheability,\n type RenderObservation,\n type RenderObservationCompleteness,\n type RenderRequestApiKind,\n} from \"./cache-proof.js\";\n\nexport type AppPageRenderObservationState = Readonly<{\n dynamicFetches: readonly string[];\n requestApis: readonly RenderRequestApiKind[];\n}>;\n\nfunction readRootBoundaryId(element: Readonly<Record<string, unknown>>): string | null {\n const rootLayoutTreePath = element[AppElementsWire.keys.rootLayout];\n return typeof rootLayoutTreePath === \"string\" ? rootLayoutTreePath : null;\n}\n\nfunction readRouteId(\n element: ReactNode | Readonly<Record<string, ReactNode>>,\n routePattern: string,\n): string {\n if (isAppElementsRecord(element)) {\n const routeId = element[AppElementsWire.keys.route];\n if (typeof routeId === \"string\") {\n return routeId;\n }\n }\n\n return AppElementsWire.encodeRouteId(routePattern, null);\n}\n\nfunction createMountedSlotsFingerprint(\n mountedSlotsHeader: string | null | undefined,\n): string | null {\n const normalized = normalizeMountedSlotsHeader(mountedSlotsHeader);\n return normalized ? `slots:${fnv1a64(normalized)}` : null;\n}\n\nfunction mergeObservedRequestApis(\n observed: readonly RenderRequestApiKind[],\n params: Record<string, unknown>,\n): RenderRequestApiKind[] {\n const merged = new Set<RenderRequestApiKind>(observed);\n // Conservative: route params are marked observed when the route supplies\n // values, since this slice does not add property-access proxying.\n if (Object.keys(params).length > 0) {\n merged.add(\"params\");\n }\n return [...merged].sort();\n}\n\nexport function createEmptyAppPageRenderObservationState(): AppPageRenderObservationState {\n return {\n dynamicFetches: [],\n requestApis: [],\n };\n}\n\nexport function createAppPageRenderObservation(options: {\n boundaryOutcome: BoundaryOutcome;\n cacheTags: readonly string[];\n cacheability: RenderCacheability;\n cleanPathname: string;\n completeness: RenderObservationCompleteness;\n output: CacheProofOutputScope;\n params: Record<string, unknown>;\n state: AppPageRenderObservationState;\n}): RenderObservation {\n return buildRenderObservation({\n boundaryOutcome: options.boundaryOutcome,\n cacheability: options.cacheability,\n cacheTags: options.cacheTags,\n completeness: options.completeness,\n dynamicFetches: options.state.dynamicFetches,\n output: options.output,\n pathTags: [options.cleanPathname],\n requestApis: buildRenderRequestApiObservations({\n completeness: options.completeness,\n observed: mergeObservedRequestApis(options.state.requestApis, options.params),\n }),\n });\n}\n\nexport function createAppPageRscOutputScope(options: {\n element: ReactNode | Readonly<Record<string, ReactNode>>;\n mountedSlotsHeader?: string | null;\n renderEpoch: string | null;\n rootBoundaryId: string | null;\n routePattern: string;\n}): CacheProofOutputScope {\n return {\n kind: \"app-rsc\",\n mountedSlotsFingerprint: createMountedSlotsFingerprint(options.mountedSlotsHeader),\n renderEpoch: options.renderEpoch,\n rootBoundaryId:\n options.rootBoundaryId ??\n (isAppElementsRecord(options.element) ? readRootBoundaryId(options.element) : null),\n routeId: readRouteId(options.element, options.routePattern),\n };\n}\n\n// HTML output is derived from the resolved RSC render and does not vary by the\n// set of mounted parallel-route slots; only RSC payload artifacts include that\n// slot fingerprint in their output scope.\nexport function createAppPageHtmlOutputScope(options: {\n element: ReactNode | Readonly<Record<string, ReactNode>>;\n renderEpoch: string | null;\n rootBoundaryId: string | null;\n routePattern: string;\n}): CacheProofOutputScope {\n return {\n kind: \"app-html\",\n renderEpoch: options.renderEpoch,\n rootBoundaryId:\n options.rootBoundaryId ??\n (isAppElementsRecord(options.element) ? readRootBoundaryId(options.element) : null),\n routeId: readRouteId(options.element, options.routePattern),\n };\n}\n"],"mappings":";;;;;;AAoBA,SAAS,mBAAmB,SAA2D;CACrF,MAAM,qBAAqB,QAAQ,gBAAgB,KAAK;CACxD,OAAO,OAAO,uBAAuB,WAAW,qBAAqB;;AAGvE,SAAS,YACP,SACA,cACQ;CACR,IAAI,oBAAoB,QAAQ,EAAE;EAChC,MAAM,UAAU,QAAQ,gBAAgB,KAAK;EAC7C,IAAI,OAAO,YAAY,UACrB,OAAO;;CAIX,OAAO,gBAAgB,cAAc,cAAc,KAAK;;AAG1D,SAAS,8BACP,oBACe;CACf,MAAM,aAAa,4BAA4B,mBAAmB;CAClE,OAAO,aAAa,SAAS,QAAQ,WAAW,KAAK;;AAGvD,SAAS,yBACP,UACA,QACwB;CACxB,MAAM,SAAS,IAAI,IAA0B,SAAS;CAGtD,IAAI,OAAO,KAAK,OAAO,CAAC,SAAS,GAC/B,OAAO,IAAI,SAAS;CAEtB,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM;;AAG3B,SAAgB,2CAA0E;CACxF,OAAO;EACL,gBAAgB,EAAE;EAClB,aAAa,EAAE;EAChB;;AAGH,SAAgB,+BAA+B,SASzB;CACpB,OAAO,uBAAuB;EAC5B,iBAAiB,QAAQ;EACzB,cAAc,QAAQ;EACtB,WAAW,QAAQ;EACnB,cAAc,QAAQ;EACtB,gBAAgB,QAAQ,MAAM;EAC9B,QAAQ,QAAQ;EAChB,UAAU,CAAC,QAAQ,cAAc;EACjC,aAAa,kCAAkC;GAC7C,cAAc,QAAQ;GACtB,UAAU,yBAAyB,QAAQ,MAAM,aAAa,QAAQ,OAAO;GAC9E,CAAC;EACH,CAAC;;AAGJ,SAAgB,4BAA4B,SAMlB;CACxB,OAAO;EACL,MAAM;EACN,yBAAyB,8BAA8B,QAAQ,mBAAmB;EAClF,aAAa,QAAQ;EACrB,gBACE,QAAQ,mBACP,oBAAoB,QAAQ,QAAQ,GAAG,mBAAmB,QAAQ,QAAQ,GAAG;EAChF,SAAS,YAAY,QAAQ,SAAS,QAAQ,aAAa;EAC5D;;AAMH,SAAgB,6BAA6B,SAKnB;CACxB,OAAO;EACL,MAAM;EACN,aAAa,QAAQ;EACrB,gBACE,QAAQ,mBACP,oBAAoB,QAAQ,QAAQ,GAAG,mBAAmB,QAAQ,QAAQ,GAAG;EAChF,SAAS,YAAY,QAAQ,SAAS,QAAQ,aAAa;EAC5D"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"app-page-render.js","names":[],"sources":["../../src/server/app-page-render.ts"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport type { ReactFormState } from \"react-dom/client\";\nimport type { CachedAppPageValue } from \"vinext/shims/cache\";\nimport type { RootParams } from \"vinext/shims/root-params\";\nimport { runWithFetchDedupe } from \"vinext/shims/fetch-cache\";\nimport { AppElementsWire, isAppElementsRecord, type AppOutgoingElements } from \"./app-elements.js\";\nimport { hasDigest } from \"./app-rsc-errors.js\";\nimport {\n finalizeAppPageHtmlCacheResponse,\n finalizeAppPageRscCacheResponse,\n} from \"./app-page-cache.js\";\nimport {\n buildAppPageFontLinkHeader,\n readAppPageBinaryStream,\n resolveAppPageSpecialError,\n teeAppPageRscStreamForCapture,\n type AppPageFontPreload,\n type AppPageSpecialError,\n type LayoutClassificationOptions,\n} from \"./app-page-execution.js\";\nimport { probeAppPageBeforeRender } from \"./app-page-probe.js\";\nimport {\n buildAppPageHtmlResponse,\n buildAppPageRscResponse,\n resolveAppPageHtmlResponsePolicy,\n resolveAppPageRscResponsePolicy,\n type AppPageMiddlewareContext,\n type AppPageResponseTiming,\n} from \"./app-page-response.js\";\nimport {\n createAppPageFontData,\n createAppPageRscErrorTracker,\n deferUntilStreamConsumed,\n renderAppPageHtmlStream,\n renderAppPageHtmlStreamWithRecovery,\n shouldRerenderAppPageWithGlobalError,\n type AppPageSsrHandler,\n} from \"./app-page-stream.js\";\nimport type { AppRscRenderMode } from \"./app-rsc-render-mode.js\";\nimport {\n createArtifactCompatibilityEnvelope,\n createArtifactCompatibilityGraphVersion,\n type ArtifactCompatibilityEnvelope,\n} from \"./artifact-compatibility.js\";\nimport {\n createAppPageHtmlOutputScope,\n createAppPageRenderObservation,\n createAppPageRscOutputScope,\n createEmptyAppPageRenderObservationState,\n type AppPageRenderObservationState,\n} from \"./app-page-render-observation.js\";\n\ntype AppPageBoundaryOnError = (\n error: unknown,\n requestInfo: unknown,\n errorContext: unknown,\n) => unknown;\ntype AppPageDebugLogger = (event: string, detail: string) => void;\ntype AppPageCacheSetter = (\n key: string,\n data: CachedAppPageValue,\n revalidateSeconds: number,\n tags: string[],\n expireSeconds?: number,\n) => Promise<void>;\n\ntype AppPageRequestCacheLife = {\n revalidate?: number;\n expire?: number;\n};\n\ntype RenderAppPageLifecycleOptions = {\n basePath?: string;\n /**\n * Allow-list of OpenTelemetry propagation keys to emit as `<meta>` tags in\n * the SSR head. From `experimental.clientTraceMetadata` in `next.config`.\n * Undefined or empty disables emission.\n */\n clientTraceMetadata?: readonly string[];\n cleanPathname: string;\n clearRequestContext: () => void;\n consumeDynamicUsage: () => boolean;\n consumeRenderObservationState?: () => AppPageRenderObservationState;\n /** Read and clear any invalid dynamic usage error recorded during render (dev-only). */\n consumeInvalidDynamicUsageError?: () => unknown;\n createRscOnErrorHandler: (pathname: string, routePath: string) => AppPageBoundaryOnError;\n getFontLinks: () => string[];\n getFontPreloads: () => AppPageFontPreload[];\n getFontStyles: () => string[];\n getNavigationContext: () => unknown;\n getPageTags: () => string[];\n getRequestCacheLife: () => AppPageRequestCacheLife | null;\n peekRequestCacheLife?: () => AppPageRequestCacheLife | null;\n getDraftModeCookieHeader: () => string | null | undefined;\n handlerStart: number;\n hasLoadingBoundary: boolean;\n isDynamicError: boolean;\n isDraftMode: boolean;\n isEdgeRuntime?: boolean;\n isForceDynamic: boolean;\n isForceStatic: boolean;\n isProgressiveActionRender?: boolean;\n isPrerender?: boolean;\n isProduction: boolean;\n isRscRequest: boolean;\n isrDebug?: AppPageDebugLogger;\n isrHtmlKey: (pathname: string) => string;\n isrRscKey: (\n pathname: string,\n mountedSlotsHeader?: string | null,\n renderMode?: AppRscRenderMode,\n interceptionContext?: string | null,\n ) => string;\n isrSet: AppPageCacheSetter;\n interceptionContext?: string | null;\n layoutCount: number;\n loadSsrHandler: () => Promise<AppPageSsrHandler>;\n middlewareContext: AppPageMiddlewareContext;\n params: Record<string, unknown>;\n rootParams?: RootParams;\n peekRenderObservationState?: () => AppPageRenderObservationState;\n probeLayoutAt: (layoutIndex: number) => unknown;\n probePage: () => unknown;\n expireSeconds?: number;\n formState?: ReactFormState | null;\n revalidateSeconds: number | null;\n renderErrorBoundaryResponse: (error: unknown) => Promise<Response | null>;\n renderLayoutSpecialError: (\n specialError: AppPageSpecialError,\n layoutIndex: number,\n ) => Promise<Response>;\n renderPageSpecialError: (specialError: AppPageSpecialError) => Promise<Response>;\n renderToReadableStream: (\n element: ReactNode | AppOutgoingElements,\n options: { onError: AppPageBoundaryOnError },\n ) => ReadableStream<Uint8Array>;\n routeHasLocalBoundary: boolean;\n routePattern: string;\n runWithSuppressedHookWarning<T>(probe: () => Promise<T>): Promise<T>;\n scriptNonce?: string;\n mountedSlotsHeader?: string | null;\n renderMode?: AppRscRenderMode;\n waitUntil?: (promise: Promise<void>) => void;\n element: ReactNode | Readonly<Record<string, ReactNode>>;\n classification?: LayoutClassificationOptions | null;\n};\n\nfunction buildResponseTiming(\n options: Pick<RenderAppPageLifecycleOptions, \"handlerStart\" | \"isProduction\"> & {\n compileEnd?: number;\n renderEnd?: number;\n responseKind: AppPageResponseTiming[\"responseKind\"];\n },\n): AppPageResponseTiming | undefined {\n if (options.isProduction) {\n return undefined;\n }\n\n return {\n compileEnd: options.compileEnd,\n handlerStart: options.handlerStart,\n renderEnd: options.renderEnd,\n responseKind: options.responseKind,\n };\n}\n\nfunction readRequestCacheLifeForPrerender(\n options: Pick<RenderAppPageLifecycleOptions, \"getRequestCacheLife\" | \"peekRequestCacheLife\">,\n): AppPageRequestCacheLife | null {\n // Prefer the non-destructive reader so prerender.ts can consume metadata\n // after the handler returns. The consume fallback supports older entry glue\n // and is only safe because this path reads at most once per prerender.\n return options.peekRequestCacheLife?.() ?? options.getRequestCacheLife();\n}\n\nfunction applyRequestCacheLife(options: {\n expireSeconds?: number;\n requestCacheLife: AppPageRequestCacheLife | null;\n revalidateSeconds: number | null;\n}): { expireSeconds?: number; revalidateSeconds: number | null } {\n let revalidateSeconds = options.revalidateSeconds;\n let expireSeconds = options.expireSeconds;\n const requestCacheLife = options.requestCacheLife;\n\n if (requestCacheLife?.revalidate !== undefined) {\n revalidateSeconds =\n revalidateSeconds === null\n ? requestCacheLife.revalidate\n : Math.min(revalidateSeconds, requestCacheLife.revalidate);\n }\n if (requestCacheLife?.expire !== undefined) {\n // cacheLife() supplies the effective hard-expire ceiling for this render,\n // so it replaces the config fallback instead of min-merging with it.\n expireSeconds = requestCacheLife.expire;\n }\n\n return { expireSeconds, revalidateSeconds };\n}\n\nfunction readRootBoundaryId(element: Readonly<Record<string, unknown>>): string | null {\n const rootLayoutTreePath = element[AppElementsWire.keys.rootLayout];\n return typeof rootLayoutTreePath === \"string\" ? rootLayoutTreePath : null;\n}\n\nfunction createAppPageArtifactCompatibility(\n element: ReactNode | Readonly<Record<string, ReactNode>>,\n routePattern: string,\n): ArtifactCompatibilityEnvelope | undefined {\n if (!isAppElementsRecord(element)) {\n return undefined;\n }\n\n const rootBoundaryId = readRootBoundaryId(element);\n return createArtifactCompatibilityEnvelope({\n graphVersion: createArtifactCompatibilityGraphVersion({\n routePattern,\n rootBoundaryId,\n }),\n deploymentVersion: process.env.__VINEXT_BUILD_ID ?? null,\n rootBoundaryId,\n });\n}\n\n/**\n * Wraps an RSC response body to report invalid dynamic usage errors after the\n * stream is fully consumed. In dev mode, errors from cookies()/headers() inside\n * \"use cache\" may be caught by user try/catch and silently swallowed — this\n * wrapper waits for the stream to drain and surfaces any recorded error to the\n * terminal (and, via HMR, the browser dev overlay).\n *\n * Dedups against React's Flight error chunk: if the recorded error already\n * carries a `digest`, React's serverComponentsErrorHandler has already stamped\n * it and emitted it into the RSC stream. Skipping `console.error` prevents\n * double-logging. Caught cases (no digest) still surface here.\n *\n * Ported from Next.js:\n * https://github.com/vercel/next.js/commit/f5e54c06726b571a042fce67417e40a29f6b8689\n * https://github.com/vercel/next.js/pull/93706\n */\nfunction wrapRscResponseForDevErrorReporting(\n response: Response,\n consumeInvalidDynamicUsageError: () => unknown,\n): Response {\n const originalBody = response.body;\n if (!originalBody) return response;\n\n let consumed = false;\n const onConsumed = () => {\n if (consumed) return;\n consumed = true;\n const error = consumeInvalidDynamicUsageError();\n if (!error) return;\n // Dedup: React already emitted this error as a Flight error chunk.\n if (!hasDigest(error)) {\n console.error(\"[vinext] Invalid dynamic usage:\", error);\n }\n };\n\n const cleanup = new TransformStream<Uint8Array, Uint8Array>({\n flush() {\n onConsumed();\n },\n });\n\n const piped = originalBody.pipeThrough(cleanup);\n const reader = piped.getReader();\n const wrappedStream = new ReadableStream<Uint8Array>({\n pull(controller) {\n return reader.read().then(\n ({ done, value }) => {\n if (done) {\n controller.close();\n } else {\n controller.enqueue(value);\n }\n },\n (streamError) => {\n onConsumed();\n controller.error(streamError);\n },\n );\n },\n cancel(reason) {\n onConsumed();\n return reader.cancel(reason);\n },\n });\n\n return new Response(wrappedStream, {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n });\n}\n\nexport async function renderAppPageLifecycle(\n options: RenderAppPageLifecycleOptions,\n): Promise<Response> {\n const preRenderResult = await probeAppPageBeforeRender({\n hasLoadingBoundary: options.hasLoadingBoundary,\n layoutCount: options.layoutCount,\n probeLayoutAt(layoutIndex) {\n return options.probeLayoutAt(layoutIndex);\n },\n probePage() {\n return options.probePage();\n },\n renderLayoutSpecialError(specialError, layoutIndex) {\n return options.renderLayoutSpecialError(specialError, layoutIndex);\n },\n renderPageSpecialError(specialError) {\n return options.renderPageSpecialError(specialError);\n },\n resolveSpecialError: resolveAppPageSpecialError,\n runWithSuppressedHookWarning(probe) {\n return options.runWithSuppressedHookWarning(probe);\n },\n classification: options.classification,\n });\n if (preRenderResult.response) {\n return preRenderResult.response;\n }\n\n const layoutFlags = preRenderResult.layoutFlags;\n\n // Render the CANONICAL element. The outgoing payload carries per-layout\n // static/dynamic flags under `__layoutFlags` so the client can later tell\n // which layouts are safe to skip on subsequent navigations.\n const artifactCompatibility = createAppPageArtifactCompatibility(\n options.element,\n options.routePattern,\n );\n const rootBoundaryId = artifactCompatibility?.rootBoundaryId ?? null;\n const renderEpoch = artifactCompatibility?.renderEpoch ?? null;\n const rscOutputScope = createAppPageRscOutputScope({\n element: options.element,\n mountedSlotsHeader: options.mountedSlotsHeader,\n renderEpoch,\n rootBoundaryId,\n routePattern: options.routePattern,\n });\n const htmlOutputScope = createAppPageHtmlOutputScope({\n element: options.element,\n renderEpoch,\n rootBoundaryId,\n routePattern: options.routePattern,\n });\n // Partial payload metadata is a pre-stream snapshot. Fetch tags may still\n // accumulate while the RSC/HTML streams are consumed; complete cache artifact\n // observations below rebuild this field after the stream drains.\n const payloadRenderObservation = createAppPageRenderObservation({\n boundaryOutcome: { kind: \"unknown\" },\n cacheability: \"unknown\",\n cacheTags: options.getPageTags(),\n cleanPathname: options.cleanPathname,\n completeness: \"partial\",\n output: rscOutputScope,\n params: options.params,\n state: options.peekRenderObservationState?.() ?? createEmptyAppPageRenderObservationState(),\n });\n const outgoingElement = AppElementsWire.encodeOutgoingPayload({\n element: options.element,\n layoutFlags,\n ...(artifactCompatibility ? { artifactCompatibility } : {}),\n renderObservation: payloadRenderObservation,\n });\n\n const compileEnd = options.isProduction ? undefined : performance.now();\n const baseOnError = options.createRscOnErrorHandler(options.cleanPathname, options.routePattern);\n const rscErrorTracker = createAppPageRscErrorTracker(baseOnError);\n // Defensive wrap for standalone callers. In the normal dispatch path this is\n // a no-op since dispatchAppPage already activated dedupe. Note that\n // renderToReadableStream returns synchronously — the actual fetch calls\n // happen later during async stream consumption — so the dedupe map a\n // standalone call would establish here is only effective if the caller has\n // an outer runWithRequestContext / runWithFetchDedupe scope keeping the ALS\n // store alive across that consumption.\n const rscStream = runWithFetchDedupe(() =>\n options.renderToReadableStream(outgoingElement, {\n onError: rscErrorTracker.onRenderError,\n }),\n );\n\n let revalidateSeconds = options.revalidateSeconds;\n let expireSeconds = options.expireSeconds;\n const shouldCaptureRscForCacheMetadata =\n options.isProgressiveActionRender !== true &&\n (options.isProduction || options.isPrerender === true) &&\n (revalidateSeconds === null || (revalidateSeconds > 0 && revalidateSeconds !== Infinity)) &&\n !options.isDraftMode &&\n !options.isForceDynamic;\n const rscCapture = teeAppPageRscStreamForCapture(rscStream, shouldCaptureRscForCacheMetadata);\n const rscForResponse = rscCapture.ssrStream;\n\n // When the fused tee (#981) is active, the sideStream carries both the embed\n // transform AND the raw RSC byte accumulation. For RSC requests, we consume\n // the sideStream directly. For HTML requests, handleSsr creates an embed\n // transform from it and fills capturedRscDataRef. The ref object is threaded\n // through so .value is read lazily after handleSsr completes.\n const capturedRscDataRef: { value: Promise<ArrayBuffer> | null } = { value: null };\n if (rscCapture.sideStream && options.isRscRequest) {\n capturedRscDataRef.value = readAppPageBinaryStream(rscCapture.sideStream);\n }\n\n if (options.isRscRequest) {\n if (options.isPrerender === true) {\n await settleCapturedRscRenderForCacheMetadata(capturedRscDataRef.value);\n ({ expireSeconds, revalidateSeconds } = applyRequestCacheLife({\n expireSeconds,\n requestCacheLife: readRequestCacheLifeForPrerender(options),\n revalidateSeconds,\n }));\n }\n\n const dynamicUsedDuringBuild = options.consumeDynamicUsage();\n const rscResponsePolicy = resolveAppPageRscResponsePolicy({\n dynamicUsedDuringBuild,\n isDraftMode: options.isDraftMode,\n isDynamicError: options.isDynamicError,\n isForceDynamic: options.isForceDynamic,\n isForceStatic: options.isForceStatic,\n isProduction: options.isProduction,\n expireSeconds,\n revalidateSeconds,\n });\n const rscResponse = buildAppPageRscResponse(rscForResponse, {\n isEdgeRuntime: options.isEdgeRuntime,\n middlewareContext: options.middlewareContext,\n mountedSlotsHeader: options.mountedSlotsHeader,\n params: options.params,\n policy: rscResponsePolicy,\n timing: buildResponseTiming({\n compileEnd,\n handlerStart: options.handlerStart,\n isProduction: options.isProduction,\n responseKind: \"rsc\",\n }),\n });\n\n // In dev mode, wrap the RSC response body to forward invalid dynamic usage\n // errors after the stream is consumed. This mirrors Next.js behavior where\n // workStore.invalidDynamicUsageError is checked after the accumulated chunks\n // promise resolves (app-render.tsx generateDynamicFlightRenderResultWithStagesInDev).\n // Ported from Next.js: https://github.com/vercel/next.js/commit/f5e54c06726b571a042fce67417e40a29f6b8689\n //\n // Note: This only covers RSC responses (client-side navigations). The HTML path\n // (initial page loads) intentionally defers this coverage — the error is still\n // thrown through the RSC pipeline and captured by rscErrorTracker.onRenderError\n // if uncaught by user code. Full parity with Next.js would require checking\n // invalidDynamicUsageError after SSR rendering, which is deferred as out of scope\n // for this PR focused on client-side navigations.\n const devRscResponse =\n !options.isProduction && rscResponse.body && options.consumeInvalidDynamicUsageError\n ? wrapRscResponseForDevErrorReporting(rscResponse, options.consumeInvalidDynamicUsageError)\n : rscResponse;\n\n return finalizeAppPageRscCacheResponse(devRscResponse, {\n capturedRscDataPromise:\n options.isProduction && shouldCaptureRscForCacheMetadata ? capturedRscDataRef.value : null,\n cleanPathname: options.cleanPathname,\n consumeDynamicUsage: options.consumeDynamicUsage,\n consumeRenderObservationState: options.consumeRenderObservationState,\n createRscRenderObservation(input) {\n return createAppPageRenderObservation({\n boundaryOutcome: { kind: \"success\" },\n cacheability: \"public\",\n cacheTags: input.cacheTags,\n cleanPathname: options.cleanPathname,\n completeness: \"complete\",\n output: rscOutputScope,\n params: options.params,\n state: input.state,\n });\n },\n dynamicUsedDuringBuild,\n getPageTags() {\n return options.getPageTags();\n },\n getRequestCacheLife() {\n return options.getRequestCacheLife();\n },\n isrDebug: options.isrDebug,\n isrRscKey: options.isrRscKey,\n isrSet: options.isrSet,\n interceptionContext: options.interceptionContext,\n mountedSlotsHeader: options.mountedSlotsHeader,\n renderMode: options.renderMode,\n preserveClientResponseHeaders: rscResponsePolicy.cacheState !== \"MISS\",\n expireSeconds,\n revalidateSeconds,\n waitUntil(promise) {\n options.waitUntil?.(promise);\n },\n });\n }\n\n const fontData = createAppPageFontData({\n getLinks: options.getFontLinks,\n getPreloads: options.getFontPreloads,\n getStyles: options.getFontStyles,\n });\n const fontLinkHeader = buildAppPageFontLinkHeader(fontData.preloads);\n let renderEnd: number | undefined;\n\n const htmlRender = await renderAppPageHtmlStreamWithRecovery({\n onShellRendered() {\n if (!options.isProduction) {\n renderEnd = performance.now();\n }\n },\n renderErrorBoundaryResponse(error) {\n return options.renderErrorBoundaryResponse(error);\n },\n async renderHtmlStream() {\n const ssrHandler = await options.loadSsrHandler();\n return renderAppPageHtmlStream({\n capturedRscDataRef,\n fontData,\n navigationContext: options.getNavigationContext(),\n basePath: options.basePath,\n clientTraceMetadata: options.clientTraceMetadata,\n rootParams: options.rootParams,\n formState: options.formState ?? null,\n rscStream: rscForResponse,\n scriptNonce: options.scriptNonce,\n sideStream: rscCapture.sideStream,\n ssrHandler,\n waitForAllReady: options.isPrerender,\n });\n },\n renderSpecialErrorResponse(specialError) {\n return options.renderPageSpecialError(specialError);\n },\n resolveSpecialError: resolveAppPageSpecialError,\n });\n if (htmlRender.response) {\n return htmlRender.response;\n }\n const htmlStream = htmlRender.htmlStream;\n if (!htmlStream) {\n throw new Error(\"[vinext] Expected an HTML stream when no fallback response was returned\");\n }\n\n // Routes with a route-level Suspense boundary (loading.tsx) skip the page\n // probe — the page render happens once, inside the RSC stream. Mirror\n // Next.js's `app-render.tsx:4293` catch shape: by the time the SSR shell\n // promise has resolved, any redirect()/notFound() throw whose async work\n // settles in microtasks during shell rendering has already fired through\n // React's onError and been captured by the tracker. Convert that to a\n // 307/404 before any bytes are flushed.\n //\n // Late rejections — ones that settle after macrotask boundaries (real\n // I/O, setTimeout, etc.) — fall through to the streamed body, exactly\n // as Next.js does. The digest survives in the Flight payload for the\n // client router to consume.\n if (options.hasLoadingBoundary) {\n const captured = rscErrorTracker.getCapturedSpecialError();\n if (captured) {\n const specialError = resolveAppPageSpecialError(captured);\n if (specialError) {\n void htmlStream.cancel().catch(() => {});\n return options.renderPageSpecialError(specialError);\n }\n }\n }\n\n if (\n shouldRerenderAppPageWithGlobalError({\n capturedError: rscErrorTracker.getCapturedError(),\n hasLocalBoundary: options.routeHasLocalBoundary,\n })\n ) {\n const cleanResponse = await options.renderErrorBoundaryResponse(\n rscErrorTracker.getCapturedError(),\n );\n if (cleanResponse) {\n return cleanResponse;\n }\n }\n\n // Eagerly read values that must be captured before the stream is consumed.\n if (options.isPrerender === true) {\n await settleCapturedRscRenderForCacheMetadata(capturedRscDataRef.value);\n ({ expireSeconds, revalidateSeconds } = applyRequestCacheLife({\n expireSeconds,\n requestCacheLife: readRequestCacheLifeForPrerender(options),\n revalidateSeconds,\n }));\n }\n const draftCookie = options.getDraftModeCookieHeader();\n const dynamicUsedDuringRender = options.consumeDynamicUsage();\n let dynamicUsedBeforeContextCleanup = dynamicUsedDuringRender;\n\n // Defer clearRequestContext() until the HTML stream is fully consumed by the\n // HTTP layer. The RSC/SSR pipeline is lazy — Server Components execute while\n // the response body is being pulled, not when the stream handle is returned.\n // Clearing the context synchronously here would race those executions, causing\n // headers()/cookies() to see a null context on warm (module-cached) requests.\n // See: https://github.com/cloudflare/vinext/issues/660\n const safeHtmlStream = deferUntilStreamConsumed(htmlStream, () => {\n dynamicUsedBeforeContextCleanup =\n dynamicUsedBeforeContextCleanup || options.consumeDynamicUsage();\n options.clearRequestContext();\n });\n\n const htmlResponsePolicy = resolveAppPageHtmlResponsePolicy({\n dynamicUsedDuringRender,\n isProgressiveActionRender: options.isProgressiveActionRender === true,\n hasScriptNonce: Boolean(options.scriptNonce),\n isDraftMode: options.isDraftMode,\n isDynamicError: options.isDynamicError,\n isForceDynamic: options.isForceDynamic,\n isForceStatic: options.isForceStatic,\n isProduction: options.isProduction,\n expireSeconds,\n revalidateSeconds,\n });\n const htmlResponseTiming = buildResponseTiming({\n compileEnd,\n handlerStart: options.handlerStart,\n isProduction: options.isProduction,\n renderEnd,\n responseKind: \"html\",\n });\n\n const shouldSpeculativelyWriteCache =\n options.isProduction &&\n shouldCaptureRscForCacheMetadata &&\n revalidateSeconds === null &&\n !options.isDynamicError &&\n !options.isForceStatic &&\n !options.scriptNonce &&\n options.isProgressiveActionRender !== true &&\n !dynamicUsedDuringRender;\n\n if (htmlResponsePolicy.shouldWriteToCache || shouldSpeculativelyWriteCache) {\n const isrResponse = buildAppPageHtmlResponse(safeHtmlStream, {\n draftCookie,\n fontLinkHeader,\n isEdgeRuntime: options.isEdgeRuntime,\n middlewareContext: options.middlewareContext,\n policy: htmlResponsePolicy,\n timing: htmlResponseTiming,\n });\n\n if (options.isPrerender === true) {\n return isrResponse;\n }\n\n return finalizeAppPageHtmlCacheResponse(isrResponse, {\n capturedDynamicUsageBeforeContextCleanup() {\n return dynamicUsedBeforeContextCleanup;\n },\n capturedRscDataPromise: capturedRscDataRef.value,\n cleanPathname: options.cleanPathname,\n consumeDynamicUsage: options.consumeDynamicUsage,\n consumeRenderObservationState: options.consumeRenderObservationState,\n createHtmlRenderObservation(input) {\n return createAppPageRenderObservation({\n boundaryOutcome: { kind: \"success\" },\n cacheability: \"public\",\n cacheTags: input.cacheTags,\n cleanPathname: options.cleanPathname,\n completeness: \"complete\",\n output: htmlOutputScope,\n params: options.params,\n state: input.state,\n });\n },\n createRscRenderObservation(input) {\n return createAppPageRenderObservation({\n boundaryOutcome: { kind: \"success\" },\n cacheability: \"public\",\n cacheTags: input.cacheTags,\n cleanPathname: options.cleanPathname,\n completeness: \"complete\",\n output: rscOutputScope,\n params: options.params,\n state: input.state,\n });\n },\n getPageTags() {\n return options.getPageTags();\n },\n getRequestCacheLife() {\n return options.getRequestCacheLife();\n },\n isrDebug: options.isrDebug,\n isrHtmlKey: options.isrHtmlKey,\n isrRscKey: options.isrRscKey,\n isrSet: options.isrSet,\n interceptionContext: options.interceptionContext,\n preserveClientResponseHeaders: !htmlResponsePolicy.shouldWriteToCache,\n expireSeconds,\n revalidateSeconds,\n waitUntil(cachePromise) {\n options.waitUntil?.(cachePromise);\n },\n });\n }\n\n return buildAppPageHtmlResponse(safeHtmlStream, {\n draftCookie,\n fontLinkHeader,\n isEdgeRuntime: options.isEdgeRuntime,\n middlewareContext: options.middlewareContext,\n policy: htmlResponsePolicy,\n timing: htmlResponseTiming,\n });\n}\n\nasync function settleCapturedRscRenderForCacheMetadata(\n capturedRscDataPromise: Promise<ArrayBuffer> | null,\n): Promise<void> {\n if (!capturedRscDataPromise) {\n return;\n }\n\n try {\n await capturedRscDataPromise;\n } catch {\n // The response stream and cache-write path own render error propagation.\n // This pre-read only makes \"use cache\" metadata available before headers\n // and ISR seed metadata are finalized.\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"app-page-request.js","names":[],"sources":["../../src/server/app-page-request.ts"],"sourcesContent":["import type { AppPageSpecialError } from \"./app-page-execution.js\";\nimport { runWithFetchDedupe } from \"vinext/shims/fetch-cache\";\nimport { getAppPageSegmentParamName } from \"./app-page-params.js\";\nimport { notFoundResponse } from \"./http-error-responses.js\";\n\ntype AppPageParams = Record<string, string | string[]>;\ntype GenerateStaticParams = (args: { params: AppPageParams }) => unknown;\n\ntype GenerateStaticParamsModule = {\n generateStaticParams?: GenerateStaticParams | null;\n};\n\ntype GenerateStaticParamsSource = {\n generateStaticParams: GenerateStaticParams;\n parentParamNames: readonly string[];\n};\n\nexport type ValidateAppPageDynamicParamsOptions = {\n clearRequestContext: () => void;\n enforceStaticParamsOnly: boolean;\n generateStaticParams?:\n | GenerateStaticParams\n | GenerateStaticParamsSource\n | readonly (GenerateStaticParams | GenerateStaticParamsSource | null | undefined)[]\n | null;\n isDynamicRoute: boolean;\n params: AppPageParams;\n};\n\ntype ResolveAppPageGenerateStaticParamsSourcesOptions = {\n layouts?: readonly (GenerateStaticParamsModule | null | undefined)[];\n layoutTreePositions?: readonly number[];\n page?: GenerateStaticParamsModule | null;\n routeSegments: readonly string[];\n};\n\ntype BuildAppPageElementOptions<TElement> = {\n buildPageElement: () => Promise<TElement>;\n renderErrorBoundaryPage: (error: unknown) => Promise<Response | null>;\n renderSpecialError: (specialError: AppPageSpecialError) => Promise<Response>;\n resolveSpecialError: (error: unknown) => AppPageSpecialError | null;\n};\n\ntype BuildAppPageElementResult<TElement> = {\n element: TElement | null;\n response: Response | null;\n};\n\ntype AppPageInterceptMatch<TPage = unknown> = {\n matchedParams: AppPageParams;\n page: TPage;\n slotId?: string | null;\n slotKey: string;\n sourceRouteIndex: number;\n};\n\ntype ResolveAppPageInterceptMatchOptions<TRoute, TPage, TInterceptOpts> = {\n cleanPathname: string;\n currentRoute: TRoute;\n findIntercept: (pathname: string) => AppPageInterceptMatch<TPage> | null;\n getRouteParamNames: (route: TRoute) => readonly string[];\n getSourceRoute: (sourceRouteIndex: number) => TRoute | undefined;\n isRscRequest: boolean;\n toInterceptOpts: (intercept: AppPageInterceptMatch<TPage>) => TInterceptOpts;\n};\n\ntype ResolveAppPageInterceptMatchResult<TRoute, TInterceptOpts> = {\n interceptOpts: TInterceptOpts;\n matchedParams: AppPageParams;\n sourceParams: AppPageParams;\n sourceRoute: TRoute;\n};\n\ntype AppPageInterceptState<TRoute, TPage> =\n | { kind: \"none\" }\n | { kind: \"current-route\"; intercept: AppPageInterceptMatch<TPage> }\n | { kind: \"source-route\"; intercept: AppPageInterceptMatch<TPage>; sourceRoute: TRoute };\n\ntype ResolveAppPageInterceptionRerenderTargetOptions<TRoute, TPage, TInterceptOpts> = {\n cleanPathname: string;\n currentParams: AppPageParams;\n currentRoute: TRoute;\n findIntercept: (pathname: string) => AppPageInterceptMatch<TPage> | null;\n getRouteParamNames: (route: TRoute) => readonly string[];\n getSourceRoute: (sourceRouteIndex: number) => TRoute | undefined;\n isRscRequest: boolean;\n toInterceptOpts: (intercept: AppPageInterceptMatch<TPage>) => TInterceptOpts;\n};\n\ntype ResolveAppPageInterceptionRerenderTargetResult<TRoute, TInterceptOpts> = {\n interceptOpts: TInterceptOpts | undefined;\n navigationParams: AppPageParams;\n params: AppPageParams;\n route: TRoute;\n};\n\ntype ResolveAppPageActionRerenderTargetOptions<TRoute, TPage, TInterceptOpts> =\n ResolveAppPageInterceptionRerenderTargetOptions<TRoute, TPage, TInterceptOpts>;\n\ntype ResolveAppPageActionRerenderTargetResult<TRoute, TInterceptOpts> =\n ResolveAppPageInterceptionRerenderTargetResult<TRoute, TInterceptOpts>;\n\ntype ResolveAppPageInterceptOptions<TRoute, TPage, TInterceptOpts, TElement> = {\n buildPageElement: (\n route: TRoute,\n params: AppPageParams,\n interceptOpts: TInterceptOpts | undefined,\n searchParams: URLSearchParams,\n ) => Promise<TElement>;\n cleanPathname: string;\n currentRoute: TRoute;\n findIntercept: (pathname: string) => AppPageInterceptMatch<TPage> | null;\n getRouteParamNames: (route: TRoute) => readonly string[];\n getSourceRoute: (sourceRouteIndex: number) => TRoute | undefined;\n isRscRequest: boolean;\n renderInterceptResponse: (route: TRoute, element: TElement) => Promise<Response> | Response;\n searchParams: URLSearchParams;\n setNavigationContext: (context: {\n params: AppPageParams;\n pathname: string;\n searchParams: URLSearchParams;\n }) => void;\n toInterceptOpts: (intercept: AppPageInterceptMatch<TPage>) => TInterceptOpts;\n};\n\ntype ResolveAppPageInterceptResult<TInterceptOpts> = {\n interceptOpts: TInterceptOpts | undefined;\n response: Response | null;\n};\n\nfunction pickRouteParams(\n matchedParams: AppPageParams,\n routeParamNames: readonly string[],\n): AppPageParams {\n const params: AppPageParams = {};\n\n for (const paramName of routeParamNames) {\n const value = matchedParams[paramName];\n if (value !== undefined) {\n params[paramName] = value;\n }\n }\n\n return params;\n}\n\nfunction collectParentParamNames(\n routeSegments: readonly string[],\n boundaryPosition: number,\n): string[] {\n const limit = Math.max(0, Math.min(boundaryPosition, routeSegments.length));\n const names: string[] = [];\n\n for (const segment of routeSegments.slice(0, limit)) {\n const name = getAppPageSegmentParamName(segment);\n if (name && !names.includes(name)) {\n names.push(name);\n }\n }\n\n return names;\n}\n\nfunction getLayoutGenerateStaticParamsBoundary(layoutTreePosition: number | undefined): number {\n // A layout at app/[id]/layout.tsx has tree position 1, but its\n // generateStaticParams belongs to the [id] segment and receives only parent\n // params from segments before [id].\n return (layoutTreePosition ?? 0) - 1;\n}\n\nexport function resolveAppPageGenerateStaticParamsSources(\n options: ResolveAppPageGenerateStaticParamsSourcesOptions,\n): GenerateStaticParamsSource[] {\n const sources: GenerateStaticParamsSource[] = [];\n\n options.layouts?.forEach((layout, index) => {\n if (typeof layout?.generateStaticParams !== \"function\") return;\n\n sources.push({\n generateStaticParams: layout.generateStaticParams,\n parentParamNames: collectParentParamNames(\n options.routeSegments,\n getLayoutGenerateStaticParamsBoundary(options.layoutTreePositions?.[index]),\n ),\n });\n });\n\n if (typeof options.page?.generateStaticParams === \"function\") {\n sources.push({\n generateStaticParams: options.page.generateStaticParams,\n parentParamNames: collectParentParamNames(\n options.routeSegments,\n Math.max(0, options.routeSegments.length - 1),\n ),\n });\n }\n\n return sources;\n}\n\nfunction areStaticParamsAllowed(\n params: AppPageParams,\n staticParams: readonly Record<string, unknown>[],\n): boolean {\n const paramKeys = Object.keys(params);\n\n return staticParams.some((staticParamSet) =>\n paramKeys.every((key) => {\n const value = params[key];\n const staticValue = staticParamSet[key];\n\n // Parent params may not appear in the leaf route's returned set because\n // Next.js passes them top-down through nested generateStaticParams calls.\n if (staticValue === undefined) {\n return true;\n }\n\n if (Array.isArray(value)) {\n return JSON.stringify(value) === JSON.stringify(staticValue);\n }\n\n if (\n typeof staticValue === \"string\" ||\n typeof staticValue === \"number\" ||\n typeof staticValue === \"boolean\"\n ) {\n return String(value) === String(staticValue);\n }\n\n return JSON.stringify(value) === JSON.stringify(staticValue);\n }),\n );\n}\n\nfunction normalizeGenerateStaticParams(\n generateStaticParams: ValidateAppPageDynamicParamsOptions[\"generateStaticParams\"],\n): GenerateStaticParamsSource[] {\n const sources = Array.isArray(generateStaticParams)\n ? generateStaticParams\n : [generateStaticParams];\n\n return sources.flatMap((source) => {\n if (typeof source === \"function\") {\n return [{ generateStaticParams: source, parentParamNames: [] }];\n }\n\n if (typeof source?.generateStaticParams === \"function\") {\n return [source];\n }\n\n return [];\n });\n}\n\nexport async function validateAppPageDynamicParams(\n options: ValidateAppPageDynamicParamsOptions,\n): Promise<Response | null> {\n if (!options.enforceStaticParamsOnly || !options.isDynamicRoute) {\n return null;\n }\n\n const generateStaticParamsSources = normalizeGenerateStaticParams(options.generateStaticParams);\n if (generateStaticParamsSources.length === 0) {\n options.clearRequestContext();\n return notFoundResponse();\n }\n\n for (const source of generateStaticParamsSources) {\n const staticParams = await runWithFetchDedupe(() =>\n source.generateStaticParams({\n params: pickRouteParams(options.params, source.parentParamNames),\n }),\n );\n if (Array.isArray(staticParams) && !areStaticParamsAllowed(options.params, staticParams)) {\n options.clearRequestContext();\n return notFoundResponse();\n }\n }\n\n return null;\n}\n\n/**\n * Pure: decides whether the incoming request should re-render an intercepted\n * source-route tree, and if so returns the source route, the source-route's\n * param slice, the full matched param set (the URL params the client sees),\n * and an opaque `interceptOpts` bag for the caller's render pipeline.\n *\n * Returns `null` in three decision-fallthrough cases:\n * - non-RSC requests (server rendering the direct page for a full HTML load)\n * - no intercepting route matches the path\n * - the match's source route IS the current route (the same branch today\n * returns `interceptOpts` for the direct render)\n *\n * Shared by both the GET path (resolveAppPageIntercept, which layers on\n * `setNavigationContext` + element build + Response wrap) and the server-action\n * POST path (entries/app-rsc-entry.ts), which runs its own response pipeline.\n */\nexport function resolveAppPageInterceptMatch<TRoute, TPage, TInterceptOpts>(\n options: ResolveAppPageInterceptMatchOptions<TRoute, TPage, TInterceptOpts>,\n): ResolveAppPageInterceptMatchResult<TRoute, TInterceptOpts> | null {\n const interceptState = resolveAppPageInterceptState(options);\n if (interceptState.kind !== \"source-route\") {\n return null;\n }\n\n return {\n interceptOpts: options.toInterceptOpts(interceptState.intercept),\n matchedParams: interceptState.intercept.matchedParams,\n sourceParams: pickRouteParams(\n interceptState.intercept.matchedParams,\n options.getRouteParamNames(interceptState.sourceRoute),\n ),\n sourceRoute: interceptState.sourceRoute,\n };\n}\n\nfunction resolveAppPageInterceptState<TRoute, TPage, TInterceptOpts>(\n options: ResolveAppPageInterceptMatchOptions<TRoute, TPage, TInterceptOpts>,\n): AppPageInterceptState<TRoute, TPage> {\n if (!options.isRscRequest) {\n return { kind: \"none\" };\n }\n\n const intercept = options.findIntercept(options.cleanPathname);\n if (!intercept) {\n return { kind: \"none\" };\n }\n\n const sourceRoute = options.getSourceRoute(intercept.sourceRouteIndex);\n if (!sourceRoute) {\n return { kind: \"none\" };\n }\n\n if (sourceRoute === options.currentRoute) {\n return { kind: \"current-route\", intercept };\n }\n\n return { kind: \"source-route\", intercept, sourceRoute };\n}\n\nexport function resolveAppPageInterceptionRerenderTarget<TRoute, TPage, TInterceptOpts>(\n options: ResolveAppPageInterceptionRerenderTargetOptions<TRoute, TPage, TInterceptOpts>,\n): ResolveAppPageInterceptionRerenderTargetResult<TRoute, TInterceptOpts> {\n const interceptState = resolveAppPageInterceptState({\n cleanPathname: options.cleanPathname,\n currentRoute: options.currentRoute,\n findIntercept: options.findIntercept,\n getRouteParamNames: options.getRouteParamNames,\n getSourceRoute: options.getSourceRoute,\n isRscRequest: options.isRscRequest,\n toInterceptOpts: options.toInterceptOpts,\n });\n\n if (interceptState.kind === \"source-route\") {\n return {\n interceptOpts: options.toInterceptOpts(interceptState.intercept),\n navigationParams: interceptState.intercept.matchedParams,\n params: pickRouteParams(\n interceptState.intercept.matchedParams,\n options.getRouteParamNames(interceptState.sourceRoute),\n ),\n route: interceptState.sourceRoute,\n };\n }\n\n return {\n interceptOpts:\n interceptState.kind === \"current-route\"\n ? options.toInterceptOpts(interceptState.intercept)\n : undefined,\n navigationParams: options.currentParams,\n params: options.currentParams,\n route: options.currentRoute,\n };\n}\n\nexport function resolveAppPageActionRerenderTarget<TRoute, TPage, TInterceptOpts>(\n options: ResolveAppPageActionRerenderTargetOptions<TRoute, TPage, TInterceptOpts>,\n): ResolveAppPageActionRerenderTargetResult<TRoute, TInterceptOpts> {\n return resolveAppPageInterceptionRerenderTarget(options);\n}\n\nexport async function resolveAppPageIntercept<TRoute, TPage, TInterceptOpts, TElement>(\n options: ResolveAppPageInterceptOptions<TRoute, TPage, TInterceptOpts, TElement>,\n): Promise<ResolveAppPageInterceptResult<TInterceptOpts>> {\n const interceptState = resolveAppPageInterceptState({\n cleanPathname: options.cleanPathname,\n currentRoute: options.currentRoute,\n findIntercept: options.findIntercept,\n getRouteParamNames: options.getRouteParamNames,\n getSourceRoute: options.getSourceRoute,\n isRscRequest: options.isRscRequest,\n toInterceptOpts: options.toInterceptOpts,\n });\n\n if (interceptState.kind === \"source-route\") {\n options.setNavigationContext({\n params: interceptState.intercept.matchedParams,\n pathname: options.cleanPathname,\n searchParams: options.searchParams,\n });\n const interceptElement = await options.buildPageElement(\n interceptState.sourceRoute,\n pickRouteParams(\n interceptState.intercept.matchedParams,\n options.getRouteParamNames(interceptState.sourceRoute),\n ),\n options.toInterceptOpts(interceptState.intercept),\n options.searchParams,\n );\n\n return {\n interceptOpts: undefined,\n response: await options.renderInterceptResponse(interceptState.sourceRoute, interceptElement),\n };\n }\n\n // Reproduce the current-route-is-source branch where we still need the opts\n // bag even though we did not render a separate intercepted response.\n return {\n interceptOpts:\n interceptState.kind === \"current-route\"\n ? options.toInterceptOpts(interceptState.intercept)\n : undefined,\n response: null,\n };\n}\n\nexport async function buildAppPageElement<TElement>(\n options: BuildAppPageElementOptions<TElement>,\n): Promise<BuildAppPageElementResult<TElement>> {\n try {\n return {\n element: await options.buildPageElement(),\n response: null,\n };\n } catch (error) {\n const specialError = options.resolveSpecialError(error);\n if (specialError) {\n return {\n element: null,\n response: await options.renderSpecialError(specialError),\n };\n }\n\n const errorBoundaryResponse = await options.renderErrorBoundaryPage(error);\n if (errorBoundaryResponse) {\n return {\n element: null,\n response: errorBoundaryResponse,\n };\n }\n\n throw error;\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"app-page-response.js","names":[],"sources":["../../src/server/app-page-response.ts"],"sourcesContent":["import {\n buildRevalidateCacheControl,\n NO_STORE_CACHE_CONTROL,\n STATIC_CACHE_CONTROL,\n} from \"./cache-control.js\";\nimport {\n VINEXT_MOUNTED_SLOTS_HEADER,\n VINEXT_PARAMS_HEADER,\n VINEXT_TIMING_HEADER,\n} from \"./headers.js\";\nimport { setCacheStateHeaders } from \"./cache-headers.js\";\nimport { mergeMiddlewareResponseHeaders } from \"./middleware-response-headers.js\";\nimport {\n VINEXT_RSC_CONTENT_TYPE,\n VINEXT_RSC_VARY_HEADER,\n applyRscCompatibilityIdHeader,\n} from \"./app-rsc-cache-busting.js\";\n\nexport type AppPageMiddlewareContext = {\n headers: Headers | null;\n status: number | null;\n};\n\nexport type AppPageResponseTiming = {\n compileEnd?: number;\n handlerStart: number;\n renderEnd?: number;\n responseKind: \"html\" | \"rsc\";\n};\n\ntype AppPageResponsePolicy = {\n cacheControl?: string;\n cacheState?: \"MISS\" | \"STATIC\";\n};\n\ntype ResolveAppPageResponsePolicyBaseOptions = {\n isDraftMode: boolean;\n isDynamicError: boolean;\n isForceDynamic: boolean;\n isForceStatic: boolean;\n isProduction: boolean;\n expireSeconds?: number;\n revalidateSeconds: number | null;\n};\n\ntype ResolveAppPageRscResponsePolicyOptions = {\n dynamicUsedDuringBuild: boolean;\n} & ResolveAppPageResponsePolicyBaseOptions;\n\ntype ResolveAppPageHtmlResponsePolicyOptions = {\n dynamicUsedDuringRender: boolean;\n isProgressiveActionRender?: boolean;\n hasScriptNonce: boolean;\n} & ResolveAppPageResponsePolicyBaseOptions;\n\ntype AppPageHtmlResponsePolicy = {\n shouldWriteToCache: boolean;\n} & AppPageResponsePolicy;\n\ntype BuildAppPageRscResponseOptions = {\n isEdgeRuntime?: boolean;\n middlewareContext: AppPageMiddlewareContext;\n mountedSlotsHeader?: string | null;\n params?: Record<string, unknown>;\n policy: AppPageResponsePolicy;\n timing?: AppPageResponseTiming;\n};\n\ntype BuildAppPageHtmlResponseOptions = {\n draftCookie?: string | null;\n fontLinkHeader?: string;\n isEdgeRuntime?: boolean;\n middlewareContext: AppPageMiddlewareContext;\n policy: AppPageResponsePolicy;\n timing?: AppPageResponseTiming;\n};\n\nfunction applyTimingHeader(headers: Headers, timing?: AppPageResponseTiming): void {\n if (!timing) {\n return;\n }\n\n const handlerStart = Math.round(timing.handlerStart);\n const compileMs =\n timing.compileEnd !== undefined ? Math.round(timing.compileEnd - timing.handlerStart) : -1;\n const renderMs =\n timing.responseKind === \"html\" &&\n timing.renderEnd !== undefined &&\n timing.compileEnd !== undefined\n ? Math.round(timing.renderEnd - timing.compileEnd)\n : -1;\n\n headers.set(VINEXT_TIMING_HEADER, `${handlerStart},${compileMs},${renderMs}`);\n}\n\nexport function resolveAppPageRscResponsePolicy(\n options: ResolveAppPageRscResponsePolicyOptions,\n): AppPageResponsePolicy {\n if (options.isDraftMode) {\n return { cacheControl: NO_STORE_CACHE_CONTROL };\n }\n\n if (options.isForceDynamic || options.dynamicUsedDuringBuild) {\n return { cacheControl: NO_STORE_CACHE_CONTROL };\n }\n\n // revalidate = 0 means \"always dynamic, never cache\" — equivalent to\n // force-dynamic for caching purposes. Must be checked before the\n // isForceStatic/isDynamicError branch below, which uses !revalidateSeconds\n // and would incorrectly catch 0 as a falsy value.\n if (options.revalidateSeconds === 0) {\n return { cacheControl: NO_STORE_CACHE_CONTROL };\n }\n\n if (\n ((options.isForceStatic || options.isDynamicError) && !options.revalidateSeconds) ||\n options.revalidateSeconds === Infinity\n ) {\n return {\n cacheControl: STATIC_CACHE_CONTROL,\n cacheState: \"STATIC\",\n };\n }\n\n if (options.revalidateSeconds) {\n return {\n cacheControl: buildRevalidateCacheControl(options.revalidateSeconds, options.expireSeconds),\n // Emit MISS as part of the initial RSC response shape rather than bolting\n // it on later in the cache-write block so response construction stays\n // centralized in this helper. This matches the eventual write path: the\n // first ISR-eligible production response is a cache miss.\n cacheState: options.isProduction ? \"MISS\" : undefined,\n };\n }\n\n return {};\n}\n\nexport function resolveAppPageHtmlResponsePolicy(\n options: ResolveAppPageHtmlResponsePolicyOptions,\n): AppPageHtmlResponsePolicy {\n if (options.isDraftMode) {\n return {\n cacheControl: NO_STORE_CACHE_CONTROL,\n shouldWriteToCache: false,\n };\n }\n\n if (options.isForceDynamic) {\n return {\n cacheControl: NO_STORE_CACHE_CONTROL,\n shouldWriteToCache: false,\n };\n }\n\n if (options.hasScriptNonce) {\n return {\n cacheControl: NO_STORE_CACHE_CONTROL,\n shouldWriteToCache: false,\n };\n }\n\n if (options.isProgressiveActionRender) {\n return {\n cacheControl: NO_STORE_CACHE_CONTROL,\n shouldWriteToCache: false,\n };\n }\n\n // revalidate = 0 means \"always dynamic, never cache\" — equivalent to\n // force-dynamic for caching purposes. Must be checked before the\n // isForceStatic/isDynamicError branch below, which matches revalidateSeconds\n // === 0 and would incorrectly return a static Cache-Control.\n if (options.revalidateSeconds === 0) {\n return {\n cacheControl: NO_STORE_CACHE_CONTROL,\n shouldWriteToCache: false,\n };\n }\n\n if ((options.isForceStatic || options.isDynamicError) && options.revalidateSeconds === null) {\n return {\n cacheControl: STATIC_CACHE_CONTROL,\n cacheState: \"STATIC\",\n shouldWriteToCache: false,\n };\n }\n\n if (options.dynamicUsedDuringRender) {\n return {\n cacheControl: NO_STORE_CACHE_CONTROL,\n shouldWriteToCache: false,\n };\n }\n\n if (\n options.revalidateSeconds !== null &&\n options.revalidateSeconds > 0 &&\n options.revalidateSeconds !== Infinity\n ) {\n return {\n cacheControl: buildRevalidateCacheControl(options.revalidateSeconds, options.expireSeconds),\n cacheState: options.isProduction ? \"MISS\" : undefined,\n shouldWriteToCache: options.isProduction,\n };\n }\n\n if (options.revalidateSeconds === Infinity) {\n // `revalidate = false` / `revalidate = Infinity` ask for indefinite caching.\n // The downstream Cache-Control header remains STATIC (1y s-maxage), but we\n // also write to the ISR cache so repeated requests inside the same vinext\n // process return identical bytes instead of re-rendering on every hit.\n // This matches Next.js: indefinite-revalidate pages cache their rendered\n // output and only re-render when their tags are explicitly invalidated.\n return {\n cacheControl: STATIC_CACHE_CONTROL,\n cacheState: options.isProduction ? \"MISS\" : \"STATIC\",\n shouldWriteToCache: options.isProduction,\n };\n }\n\n return { shouldWriteToCache: false };\n}\n\nexport { mergeMiddlewareResponseHeaders };\n\n/**\n * Mirror Next.js' edge-runtime marker (set in edge-ssr-app.ts). Only routes\n * whose resolved segment config is `runtime = \"edge\"` should advertise it —\n * nodejs-runtime routes must not, otherwise downstream consumers can't tell\n * the configured runtime from the response. Centralized so every response\n * construction site can opt in without re-deriving the header name.\n */\nexport function applyEdgeRuntimeHeader(headers: Headers, isEdgeRuntime: boolean | undefined): void {\n if (isEdgeRuntime) {\n headers.set(\"x-edge-runtime\", \"1\");\n }\n}\n\nexport function buildAppPageRscResponse(\n body: ReadableStream,\n options: BuildAppPageRscResponseOptions,\n): Response {\n const headers = new Headers({\n \"Content-Type\": VINEXT_RSC_CONTENT_TYPE,\n Vary: VINEXT_RSC_VARY_HEADER,\n });\n\n applyEdgeRuntimeHeader(headers, options.isEdgeRuntime);\n\n if (options.params && Object.keys(options.params).length > 0) {\n // encodeURIComponent so non-ASCII params (e.g. Korean slugs) survive the\n // HTTP ByteString constraint — Headers.set() rejects chars above U+00FF.\n headers.set(VINEXT_PARAMS_HEADER, encodeURIComponent(JSON.stringify(options.params)));\n }\n if (options.mountedSlotsHeader) {\n headers.set(VINEXT_MOUNTED_SLOTS_HEADER, options.mountedSlotsHeader);\n }\n if (options.policy.cacheControl) {\n headers.set(\"Cache-Control\", options.policy.cacheControl);\n }\n if (options.policy.cacheState) {\n setCacheStateHeaders(headers, options.policy.cacheState);\n }\n mergeMiddlewareResponseHeaders(headers, options.middlewareContext.headers);\n applyRscCompatibilityIdHeader(headers);\n\n applyTimingHeader(headers, options.timing);\n\n return new Response(body, {\n status: options.middlewareContext.status ?? 200,\n headers,\n });\n}\n\nexport function buildAppPageHtmlResponse(\n body: ReadableStream,\n options: BuildAppPageHtmlResponseOptions,\n): Response {\n const headers = new Headers({\n \"Content-Type\": \"text/html; charset=utf-8\",\n Vary: VINEXT_RSC_VARY_HEADER,\n });\n\n applyEdgeRuntimeHeader(headers, options.isEdgeRuntime);\n\n if (options.policy.cacheControl) {\n headers.set(\"Cache-Control\", options.policy.cacheControl);\n }\n if (options.policy.cacheState) {\n setCacheStateHeaders(headers, options.policy.cacheState);\n }\n if (options.draftCookie) {\n headers.append(\"Set-Cookie\", options.draftCookie);\n }\n if (options.fontLinkHeader) {\n headers.set(\"Link\", options.fontLinkHeader);\n }\n\n mergeMiddlewareResponseHeaders(headers, options.middlewareContext.headers);\n\n applyTimingHeader(headers, options.timing);\n\n return new Response(body, {\n status: options.middlewareContext.status ?? 200,\n headers,\n });\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"app-page-route-wiring.js","names":["Children","SlotComponent","InterceptLayoutComponent","SlotLayoutComponent","SlotLoadingComponent","RouteLoadingComponent","NotFoundComponent","ForbiddenComponent","UnauthorizedComponent","LayoutNotFoundComponent","LayoutForbiddenComponent","LayoutUnauthorizedComponent"],"sources":["../../src/server/app-page-route-wiring.tsx"],"sourcesContent":["import { Suspense, type ComponentType, type ReactNode } from \"react\";\nimport {\n AppElementsWire,\n APP_PREFETCH_LOADING_SHELL_MARKER_KEY,\n APP_STATIC_SIBLINGS_KEY,\n normalizeAppElementsSlotBindings,\n type AppElements,\n type AppElementsInterception,\n type AppElementsSlotBinding,\n} from \"./app-elements.js\";\nimport {\n ErrorBoundary,\n ForbiddenBoundary,\n NotFoundBoundary,\n RedirectBoundary,\n UnauthorizedBoundary,\n} from \"vinext/shims/error-boundary\";\nimport { AppRouterScrollTarget } from \"vinext/shims/app-router-scroll\";\nimport type { AppRouteSemanticIds } from \"../routing/app-route-graph.js\";\nimport { LayoutSegmentProvider } from \"vinext/shims/layout-segment-context\";\nimport {\n MetadataHead,\n ViewportHead,\n renderMetadataToHtml,\n type Metadata,\n type Viewport,\n} from \"vinext/shims/metadata\";\nimport { Children, ParallelSlot, Slot } from \"vinext/shims/slot\";\nimport type { AppPageParams } from \"./app-page-boundary.js\";\nimport {\n createAppRenderDependency,\n renderAfterAppDependencies,\n renderWithAppDependencyBarrier,\n type AppRenderDependency,\n} from \"./app-render-dependency.js\";\nimport { resolveAppPageSegmentParams } from \"./app-page-params.js\";\nimport {\n APP_RSC_RENDER_MODE_NAVIGATION,\n APP_RSC_RENDER_MODE_PREFETCH_LOADING_SHELL,\n shouldSuppressLoadingBoundaries,\n type AppRscRenderMode,\n} from \"./app-rsc-render-mode.js\";\nimport {\n resolveAppPageChildSegments,\n resolveAppPageRouteStateKey,\n resolveAppPageSegmentStateKey,\n} from \"./app-page-segment-state.js\";\nimport type { AppPageRenderIdentity } from \"./app-page-render-identity.js\";\n\nexport { resolveAppPageChildSegments } from \"./app-page-segment-state.js\";\n\ntype AppPageComponentProps = {\n children?: ReactNode;\n error?: unknown;\n params?: unknown;\n reset?: () => void;\n} & Record<string, unknown>;\n\ntype AppPageComponent = ComponentType<AppPageComponentProps>;\ntype AppPageErrorComponent = ComponentType<{ error: unknown; reset: () => void }>;\n\nexport type AppPageModule = Record<string, unknown> & {\n default?: AppPageComponent | null | undefined;\n};\n\nexport type AppPageErrorModule = Record<string, unknown> & {\n default?: AppPageErrorComponent | null | undefined;\n};\n\ntype AppPageRouteWiringSlot<\n TModule extends AppPageModule = AppPageModule,\n TErrorModule extends AppPageErrorModule = AppPageErrorModule,\n> = {\n /** Graph-owned semantic slot identity. */\n id?: string | null;\n /** Slot prop name passed to the owning layout (e.g. \"modal\" from @modal). */\n name: string;\n default?: TModule | null;\n error?: TErrorModule | null;\n layout?: TModule | null;\n layoutIndex: number;\n loading?: TModule | null;\n page?: TModule | null;\n routeSegments?: readonly string[] | null;\n /**\n * Full URL pattern parts for the slot's mirrored sub-page. Set when the\n * slot's params may differ from the route's (e.g. inherited slot whose\n * dynamic markers have different names than the route's). The runtime\n * matches the request URL against these parts to extract slot params.\n */\n slotPatternParts?: readonly string[] | null;\n /** Param names captured by `slotPatternParts`, in order. */\n slotParamNames?: readonly string[] | null;\n};\n\nexport type AppPageRouteWiringRoute<\n TModule extends AppPageModule = AppPageModule,\n TErrorModule extends AppPageErrorModule = AppPageErrorModule,\n> = {\n ids?: AppRouteSemanticIds | null;\n error?: TErrorModule | null;\n errorPaths?: readonly TErrorModule[] | null;\n errors?: readonly (TErrorModule | null | undefined)[] | null;\n errorTreePositions?: readonly number[] | null;\n layoutTreePositions?: readonly number[] | null;\n layouts: readonly (TModule | null | undefined)[];\n loading?: TModule | null;\n notFound?: TModule | null;\n notFounds?: readonly (TModule | null | undefined)[] | null;\n forbidden?: TModule | null;\n forbiddens?: readonly (TModule | null | undefined)[] | null;\n unauthorized?: TModule | null;\n unauthorizeds?: readonly (TModule | null | undefined)[] | null;\n routeSegments?: readonly string[];\n /**\n * Keyed by stable slot id (name + owner path), not necessarily the slot prop name.\n */\n slots?: Readonly<Record<string, AppPageRouteWiringSlot<TModule, TErrorModule>>> | null;\n /**\n * Static sibling segment names at each dynamic URL level for this route. Used\n * by the client router to determine if a cached prefetch of the dynamic\n * route can be reused when navigating to a static sibling URL.\n *\n * Mirrors Next.js's `staticSiblings` tuple element on the loader-tree\n * dynamic segments — see `.nextjs-ref/packages/next/src/shared/lib/app-router-types.ts`\n * (DynamicSegmentTuple) and the loader emit in\n * `packages/next/src/build/webpack/loaders/next-app-loader/index.ts`.\n *\n * Issue: https://github.com/cloudflare/vinext/issues/1525\n */\n staticSiblings?: readonly string[] | null;\n templateTreePositions?: readonly number[] | null;\n templates?: readonly (TModule | null | undefined)[] | null;\n};\n\nexport type AppPageSlotOverride<TModule extends AppPageModule = AppPageModule> = {\n layoutModules?: readonly (TModule | null | undefined)[] | null;\n /**\n * The page module to render for this slot. Optional — when omitted, the\n * slot's existing `page` is used (e.g. when the override only changes the\n * slot's `params` for an inherited mirror with distinct param names).\n */\n pageModule?: TModule | null;\n params?: AppPageParams;\n props?: Readonly<Record<string, unknown>>;\n};\n\ntype AppPageLayoutEntry<\n TModule extends AppPageModule = AppPageModule,\n TErrorModule extends AppPageErrorModule = AppPageErrorModule,\n> = {\n errorModule?: TErrorModule | null | undefined;\n forbiddenModule?: TModule | null | undefined;\n id: string;\n layoutModule?: TModule | null | undefined;\n notFoundModule?: TModule | null | undefined;\n unauthorizedModule?: TModule | null | undefined;\n treePath: string;\n treePosition: number;\n};\n\ntype BuildAppPageRouteElementOptions<\n TModule extends AppPageModule = AppPageModule,\n TErrorModule extends AppPageErrorModule = AppPageErrorModule,\n> = {\n element: ReactNode;\n globalErrorModule?: TErrorModule | null;\n makeThenableParams: (params: AppPageParams) => unknown;\n matchedParams: AppPageParams;\n metadataPlacement?: \"body\" | \"head\";\n resolvedMetadata: Metadata | null;\n resolvedMetadataPathname?: string;\n resolvedViewport: Viewport;\n rootForbiddenModule?: TModule | null;\n rootNotFoundModule?: TModule | null;\n rootUnauthorizedModule?: TModule | null;\n route: AppPageRouteWiringRoute<TModule, TErrorModule>;\n slotOverrides?: Readonly<Record<string, AppPageSlotOverride<TModule>>> | null;\n};\n\ntype BuildAppPageElementsOptions<\n TModule extends AppPageModule = AppPageModule,\n TErrorModule extends AppPageErrorModule = AppPageErrorModule,\n> = BuildAppPageRouteElementOptions<TModule, TErrorModule> & {\n interception?: AppElementsInterception | null;\n interceptionContext?: string | null;\n isRscRequest?: boolean;\n mountedSlotIds?: ReadonlySet<string> | null;\n renderIdentity?: AppPageRenderIdentity;\n renderMode?: AppRscRenderMode;\n routePath: string;\n};\n\ntype AppPageTemplateEntry<TModule extends AppPageModule = AppPageModule> = {\n id: string;\n templateModule?: TModule | null | undefined;\n treePath: string;\n treePosition: number;\n};\n\ntype AppPageErrorEntry<TErrorModule extends AppPageErrorModule = AppPageErrorModule> = {\n errorModule?: TErrorModule | null | undefined;\n treePosition: number;\n};\n\nfunction getDefaultExport<TModule extends AppPageModule>(\n module: TModule | null | undefined,\n): AppPageComponent | null {\n return module?.default ?? null;\n}\n\nfunction getErrorBoundaryExport<TModule extends AppPageErrorModule>(\n module: TModule | null | undefined,\n): AppPageErrorComponent | null {\n return module?.default ?? null;\n}\n\nexport function createAppPageTreePath(\n routeSegments: readonly string[] | null | undefined,\n treePosition: number,\n): string {\n const treePathSegments = routeSegments?.slice(0, treePosition) ?? [];\n if (treePathSegments.length === 0) {\n return \"/\";\n }\n return `/${treePathSegments.join(\"/\")}`;\n}\n\nexport function createAppPageLayoutEntries<\n TModule extends AppPageModule,\n TErrorModule extends AppPageErrorModule,\n>(\n route: Pick<\n AppPageRouteWiringRoute<TModule, TErrorModule>,\n | \"errors\"\n | \"errorTreePositions\"\n | \"layoutTreePositions\"\n | \"layouts\"\n | \"notFounds\"\n | \"routeSegments\"\n > & {\n forbiddens?: readonly (TModule | null | undefined)[] | null;\n unauthorizeds?: readonly (TModule | null | undefined)[] | null;\n },\n): AppPageLayoutEntry<TModule, TErrorModule>[] {\n return route.layouts.map((layoutModule, index) => {\n const treePosition = route.layoutTreePositions?.[index] ?? 0;\n const treePath = createAppPageTreePath(route.routeSegments, treePosition);\n return {\n errorModule: route.errorTreePositions ? null : (route.errors?.[index] ?? null),\n forbiddenModule: route.forbiddens?.[index] ?? null,\n id: AppElementsWire.encodeLayoutId(treePath),\n layoutModule,\n notFoundModule: route.notFounds?.[index] ?? null,\n unauthorizedModule: route.unauthorizeds?.[index] ?? null,\n treePath,\n treePosition,\n };\n });\n}\n\nfunction createAppPageTemplateEntries<TModule extends AppPageModule>(\n route: Pick<\n AppPageRouteWiringRoute<TModule>,\n \"routeSegments\" | \"templateTreePositions\" | \"templates\"\n >,\n): AppPageTemplateEntry<TModule>[] {\n return (route.templates ?? []).map((templateModule, index) => {\n const treePosition = route.templateTreePositions?.[index] ?? 0;\n const treePath = createAppPageTreePath(route.routeSegments, treePosition);\n return {\n id: AppElementsWire.encodeTemplateId(treePath),\n templateModule,\n treePath,\n treePosition,\n };\n });\n}\n\nfunction createAppPageErrorEntries<TErrorModule extends AppPageErrorModule>(\n route: Pick<\n AppPageRouteWiringRoute<AppPageModule, TErrorModule>,\n \"errorPaths\" | \"errors\" | \"errorTreePositions\"\n >,\n): AppPageErrorEntry<TErrorModule>[] {\n return (route.errorPaths ?? route.errors ?? []).flatMap((errorModule, index) => {\n if (!errorModule) return [];\n const treePosition = route.errorTreePositions?.[index];\n if (treePosition === undefined) return [];\n return [{ errorModule, treePosition }];\n });\n}\n\nfunction createAppPageParallelSlotEntries<\n TModule extends AppPageModule,\n TErrorModule extends AppPageErrorModule,\n>(\n layoutIndex: number,\n layoutEntries: readonly AppPageLayoutEntry<TModule, TErrorModule>[],\n route: AppPageRouteWiringRoute<TModule, TErrorModule>,\n getEffectiveSlotParams: (slotKey: string, slotName: string) => AppPageParams,\n): Readonly<Record<string, ReactNode>> | undefined {\n const parallelSlots: Record<string, ReactNode> = {};\n\n for (const [slotKey, slot] of Object.entries(route.slots ?? {})) {\n const slotName = slot.name;\n const targetIndex = slot.layoutIndex >= 0 ? slot.layoutIndex : layoutEntries.length - 1;\n if (targetIndex !== layoutIndex) {\n continue;\n }\n\n const layoutEntry = layoutEntries[targetIndex];\n const treePath = layoutEntry?.treePath ?? \"/\";\n const slotId = resolveAppPageSlotId(slot, treePath);\n const slotParams = getEffectiveSlotParams(slotKey, slotName);\n const slotSegments = slot.routeSegments\n ? resolveAppPageChildSegments(slot.routeSegments, 0, slotParams)\n : [];\n parallelSlots[slotName] = (\n <LayoutSegmentProvider segmentMap={{ children: slotSegments }}>\n <Slot id={slotId} />\n </LayoutSegmentProvider>\n );\n }\n\n return Object.keys(parallelSlots).length > 0 ? parallelSlots : undefined;\n}\n\nfunction resolveAppPageSlotId(slot: AppPageRouteWiringSlot, treePath: string): string {\n const slotId = AppElementsWire.encodeSlotId(slot.name, treePath);\n if (slot.id && slot.id !== slotId) {\n throw new Error(\n `[vinext] App Router slot id mismatch for @${slot.name}: graph id ${slot.id} does not match wire id ${slotId}`,\n );\n }\n return slotId;\n}\n\nfunction resolveAppPageSlotBindingState(\n slot: AppPageRouteWiringSlot,\n override: AppPageSlotOverride | undefined,\n): AppElementsSlotBinding[\"state\"] {\n const pageComponent = getDefaultExport(override?.pageModule) ?? getDefaultExport(slot.page);\n if (pageComponent) return \"active\";\n if (getDefaultExport(slot.default)) return \"default\";\n return \"unmatched\";\n}\n\nfunction createAppPageSlotBindings<\n TModule extends AppPageModule,\n TErrorModule extends AppPageErrorModule,\n>(\n route: AppPageRouteWiringRoute<TModule, TErrorModule>,\n layoutEntries: readonly AppPageLayoutEntry<TModule, TErrorModule>[],\n resolveSlotOverride: (\n slotKey: string,\n slotName: string,\n ) => AppPageSlotOverride<TModule> | undefined,\n): readonly AppElementsSlotBinding[] {\n const bindings: AppElementsSlotBinding[] = [];\n for (const [slotKey, slot] of Object.entries(route.slots ?? {})) {\n const targetIndex = slot.layoutIndex >= 0 ? slot.layoutIndex : layoutEntries.length - 1;\n const layoutEntry = layoutEntries[targetIndex] ?? null;\n const ownerLayoutId = layoutEntry?.id ?? null;\n const override = resolveSlotOverride(slotKey, slot.name);\n bindings.push({\n ownerLayoutId,\n slotId: resolveAppPageSlotId(slot, layoutEntry?.treePath ?? \"/\"),\n state: resolveAppPageSlotBindingState(slot, override),\n });\n }\n return normalizeAppElementsSlotBindings(bindings, {\n layoutIds: layoutEntries.map((entry) => entry.id),\n });\n}\n\nfunction createAppPageRouteHead(\n metadata: Metadata | null,\n viewport: Viewport,\n pathname: string,\n metadataPlacement: \"body\" | \"head\",\n): ReactNode {\n return (\n <>\n <meta charSet=\"utf-8\" />\n {metadata && metadataPlacement === \"head\" ? (\n <MetadataHead metadata={metadata} pathname={pathname} />\n ) : null}\n <ViewportHead viewport={viewport} />\n </>\n );\n}\n\nfunction createAppPageRouteBodyMetadata(\n metadata: Metadata | null,\n pathname: string,\n metadataPlacement: \"body\" | \"head\",\n): ReactNode {\n if (!metadata || metadataPlacement !== \"body\") return null;\n return (\n <div hidden dangerouslySetInnerHTML={{ __html: renderMetadataToHtml(metadata, pathname) }} />\n );\n}\n\nexport function buildAppPageElements<\n TModule extends AppPageModule,\n TErrorModule extends AppPageErrorModule,\n>(options: BuildAppPageElementsOptions<TModule, TErrorModule>): AppElements {\n const renderIdentity = options.renderIdentity;\n const interceptionContext =\n renderIdentity?.interceptionContext ?? options.interceptionContext ?? null;\n const renderMode = options.renderMode ?? APP_RSC_RENDER_MODE_NAVIGATION;\n const routeSegments = options.route.routeSegments ?? [];\n const routeResetKey = resolveAppPageRouteStateKey(routeSegments, options.matchedParams);\n const routeId =\n renderIdentity?.routeId ??\n AppElementsWire.encodeRouteId(options.routePath, interceptionContext);\n const pageId =\n renderIdentity?.pageId ?? AppElementsWire.encodePageId(options.routePath, interceptionContext);\n const layoutEntries = createAppPageLayoutEntries(options.route);\n const templateEntries = createAppPageTemplateEntries(options.route);\n const errorEntries = createAppPageErrorEntries(options.route);\n const metadataPlacement = options.metadataPlacement ?? \"head\";\n const layoutEntriesByTreePosition = new Map<number, AppPageLayoutEntry<TModule, TErrorModule>>();\n const templateEntriesByTreePosition = new Map<number, AppPageTemplateEntry<TModule>>();\n const errorEntriesByTreePosition = new Map<number, AppPageErrorEntry<TErrorModule>>();\n for (const layoutEntry of layoutEntries) {\n layoutEntriesByTreePosition.set(layoutEntry.treePosition, layoutEntry);\n }\n for (const templateEntry of templateEntries) {\n templateEntriesByTreePosition.set(templateEntry.treePosition, templateEntry);\n }\n for (const errorEntry of errorEntries) {\n errorEntriesByTreePosition.set(errorEntry.treePosition, errorEntry);\n }\n const layoutIndicesByTreePosition = new Map<number, number>();\n for (let index = 0; index < layoutEntries.length; index++) {\n layoutIndicesByTreePosition.set(layoutEntries[index].treePosition, index);\n }\n const layoutDependenciesByIndex = new Map<number, AppRenderDependency>();\n const layoutDependenciesBefore: AppRenderDependency[][] = [];\n const slotDependenciesByLayoutIndex: AppRenderDependency[][] = [];\n const templateDependenciesById = new Map<string, AppRenderDependency>();\n const templateDependenciesBeforeById = new Map<string, AppRenderDependency[]>();\n const pageDependencies: AppRenderDependency[] = [];\n const rootLayoutTreePath = layoutEntries[0]?.treePath ?? null;\n const slotNameCounts = new Map<string, number>();\n for (const slot of Object.values(options.route.slots ?? {})) {\n const slotName = slot.name;\n slotNameCounts.set(slotName, (slotNameCounts.get(slotName) ?? 0) + 1);\n }\n const orderedTreePositions = Array.from(\n new Set<number>([\n ...layoutEntries.map((entry) => entry.treePosition),\n ...templateEntries.map((entry) => entry.treePosition),\n ...errorEntries.map((entry) => entry.treePosition),\n ]),\n ).sort((left, right) => left - right);\n const resolveSlotOverride = (slotKey: string, slotName: string) => {\n const overrideByKey = options.slotOverrides?.[slotKey];\n if (overrideByKey) {\n return overrideByKey;\n }\n\n // Legacy callers may still provide overrides by slot prop name.\n // Only allow that fallback when it is unambiguous.\n if (slotKey === slotName || (slotNameCounts.get(slotName) ?? 0) === 1) {\n return options.slotOverrides?.[slotName];\n }\n\n return undefined;\n };\n const elements: Record<\n string,\n | ReactNode\n | string\n | null\n | AppElementsInterception\n | readonly AppElementsSlotBinding[]\n | readonly string[]\n > = {\n ...AppElementsWire.createMetadataEntries({\n interception: renderIdentity?.interception ?? options.interception ?? null,\n interceptionContext,\n layoutIds: options.route.ids?.layouts ?? layoutEntries.map((entry) => entry.id),\n rootLayoutTreePath,\n routeId,\n slotBindings: createAppPageSlotBindings(options.route, layoutEntries, resolveSlotOverride),\n }),\n };\n // Surface static-sibling info on the wire so the client router can decide\n // whether a cached dynamic-route prefetch can be reused when navigating to a\n // static sibling URL. Mirrors Next.js's loader-tree `staticSiblings` tuple\n // element (issue cloudflare/vinext#1525). Only included when the route has\n // dynamic segments with static siblings — keeps the payload lean for\n // fully-static routes.\n if (options.route.staticSiblings && options.route.staticSiblings.length > 0) {\n elements[APP_STATIC_SIBLINGS_KEY] = options.route.staticSiblings;\n }\n const getEffectiveSlotParams = (slotKey: string, slotName: string): AppPageParams =>\n resolveSlotOverride(slotKey, slotName)?.params ?? options.matchedParams;\n\n for (const treePosition of orderedTreePositions) {\n const layoutIndex = layoutIndicesByTreePosition.get(treePosition);\n if (layoutIndex !== undefined) {\n const layoutEntry = layoutEntries[layoutIndex];\n layoutDependenciesBefore[layoutIndex] = [...pageDependencies];\n if (getDefaultExport(layoutEntry.layoutModule)) {\n const layoutDependency = createAppRenderDependency();\n layoutDependenciesByIndex.set(layoutIndex, layoutDependency);\n pageDependencies.push(layoutDependency);\n }\n slotDependenciesByLayoutIndex[layoutIndex] = [...pageDependencies];\n }\n\n const templateEntry = templateEntriesByTreePosition.get(treePosition);\n if (!templateEntry || !getDefaultExport(templateEntry.templateModule)) {\n continue;\n }\n\n const templateDependency = createAppRenderDependency();\n templateDependenciesById.set(templateEntry.id, templateDependency);\n templateDependenciesBeforeById.set(templateEntry.id, [...pageDependencies]);\n pageDependencies.push(templateDependency);\n }\n\n const routeLoadingComponent = getDefaultExport(options.route.loading);\n const isPrefetchLoadingShell = renderMode === APP_RSC_RENDER_MODE_PREFETCH_LOADING_SHELL;\n const shouldRenderPrefetchLoadingShell = isPrefetchLoadingShell && routeLoadingComponent !== null;\n if (shouldRenderPrefetchLoadingShell) {\n // Client loading components serialize as module references in Flight. Keep\n // a durable marker in the shell payload so external router tests and\n // diagnostics can recognize this as a loading-boundary response without\n // requiring source text to appear in client component references.\n elements[APP_PREFETCH_LOADING_SHELL_MARKER_KEY] = \"LoadingBoundary\";\n }\n\n elements[pageId] = isPrefetchLoadingShell\n ? null\n : renderAfterAppDependencies(options.element, pageDependencies);\n\n for (const templateEntry of templateEntries) {\n const templateComponent = getDefaultExport(templateEntry.templateModule);\n if (!templateComponent) {\n continue;\n }\n const TemplateComponent = templateComponent;\n const templateDependency = templateDependenciesById.get(templateEntry.id);\n const templateElement = templateDependency ? (\n renderWithAppDependencyBarrier(\n <TemplateComponent params={options.matchedParams}>\n <Children />\n </TemplateComponent>,\n templateDependency,\n )\n ) : (\n <TemplateComponent params={options.matchedParams}>\n <Children />\n </TemplateComponent>\n );\n elements[templateEntry.id] = renderAfterAppDependencies(\n templateElement,\n templateDependenciesBeforeById.get(templateEntry.id) ?? [],\n );\n }\n\n for (let index = 0; index < layoutEntries.length; index++) {\n const layoutEntry = layoutEntries[index];\n const layoutComponent = getDefaultExport(layoutEntry.layoutModule);\n if (!layoutComponent) {\n continue;\n }\n\n const layoutProps: Record<string, unknown> = {\n params: options.makeThenableParams(\n resolveAppPageSegmentParams(\n options.route.routeSegments,\n layoutEntry.treePosition,\n options.matchedParams,\n ),\n ),\n };\n\n for (const slot of Object.values(options.route.slots ?? {})) {\n const slotName = slot.name;\n const targetIndex = slot.layoutIndex >= 0 ? slot.layoutIndex : layoutEntries.length - 1;\n if (targetIndex !== index) {\n continue;\n }\n layoutProps[slotName] = <ParallelSlot name={slotName} />;\n }\n\n const LayoutComponent = layoutComponent;\n const layoutDependency = layoutDependenciesByIndex.get(index);\n const layoutElement = layoutDependency ? (\n renderWithAppDependencyBarrier(\n <LayoutComponent {...layoutProps}>\n <Children />\n </LayoutComponent>,\n layoutDependency,\n )\n ) : (\n <LayoutComponent {...layoutProps}>\n <Children />\n </LayoutComponent>\n );\n elements[layoutEntry.id] = renderAfterAppDependencies(\n layoutElement,\n layoutDependenciesBefore[index] ?? [],\n );\n }\n\n for (const [slotKey, slot] of Object.entries(options.route.slots ?? {})) {\n const slotName = slot.name;\n const targetIndex = slot.layoutIndex >= 0 ? slot.layoutIndex : layoutEntries.length - 1;\n const treePath = layoutEntries[targetIndex]?.treePath ?? \"/\";\n const slotId = resolveAppPageSlotId(slot, treePath);\n const slotOverride = resolveSlotOverride(slotKey, slotName);\n const slotParams = getEffectiveSlotParams(slotKey, slotName);\n const slotRouteSegments = slot.routeSegments ?? [];\n const slotResetKey = resolveAppPageRouteStateKey(slotRouteSegments, slotParams);\n const overrideOrPageComponent =\n getDefaultExport(slotOverride?.pageModule) ?? getDefaultExport(slot.page);\n const defaultComponent = getDefaultExport(slot.default);\n\n // On soft nav (RSC): omit key when only default.tsx exists and the slot is\n // already mounted on the client. Absent key means the browser retains prior\n // slot content rather than replacing it. When the slot is not yet mounted\n // (first entry into this layout), include the key so default.tsx renders.\n if (\n !overrideOrPageComponent &&\n defaultComponent &&\n options.isRscRequest &&\n options.mountedSlotIds?.has(slotId)\n ) {\n continue;\n }\n\n const slotComponent = overrideOrPageComponent ?? defaultComponent;\n\n if (!slotComponent) {\n elements[slotId] = AppElementsWire.unmatchedSlotValue;\n continue;\n }\n\n const slotThenableParams = options.makeThenableParams(slotParams);\n const slotProps: Record<string, unknown> = {\n params: slotThenableParams,\n };\n if (slotOverride?.props) {\n Object.assign(slotProps, slotOverride.props);\n }\n\n const SlotComponent = slotComponent;\n let slotElement: ReactNode = <SlotComponent {...slotProps} />;\n const interceptLayouts = slotOverride?.layoutModules ?? [];\n\n for (let layoutIndex = interceptLayouts.length - 1; layoutIndex >= 0; layoutIndex--) {\n const interceptLayoutComponent = getDefaultExport(interceptLayouts[layoutIndex]);\n if (!interceptLayoutComponent) {\n continue;\n }\n const InterceptLayoutComponent = interceptLayoutComponent;\n slotElement = (\n <InterceptLayoutComponent params={slotThenableParams}>\n {slotElement}\n </InterceptLayoutComponent>\n );\n }\n\n const slotLayoutComponent = getDefaultExport(slot.layout);\n if (slotLayoutComponent) {\n const SlotLayoutComponent = slotLayoutComponent;\n slotElement = (\n <SlotLayoutComponent params={slotThenableParams}>{slotElement}</SlotLayoutComponent>\n );\n }\n\n const slotLoadingComponent = getDefaultExport(slot.loading);\n if (slotLoadingComponent && !shouldSuppressLoadingBoundaries(renderMode)) {\n const SlotLoadingComponent = slotLoadingComponent;\n slotElement = (\n <Suspense key={slotResetKey} fallback={<SlotLoadingComponent />}>\n {slotElement}\n </Suspense>\n );\n }\n\n const slotErrorComponent = getErrorBoundaryExport(slot.error);\n if (slotErrorComponent) {\n slotElement = (\n <ErrorBoundary resetKey={slotResetKey} fallback={slotErrorComponent}>\n {slotElement}\n </ErrorBoundary>\n );\n }\n\n elements[slotId] = renderAfterAppDependencies(\n slotElement,\n targetIndex >= 0 ? (slotDependenciesByLayoutIndex[targetIndex] ?? []) : [],\n );\n }\n\n let routeChildren: ReactNode = (\n <LayoutSegmentProvider segmentMap={{ children: [] }}>\n <AppRouterScrollTarget>\n <Slot id={pageId} />\n </AppRouterScrollTarget>\n </LayoutSegmentProvider>\n );\n\n if (isPrefetchLoadingShell) {\n if (routeLoadingComponent === null) {\n routeChildren = null;\n } else {\n const RouteLoadingComponent = routeLoadingComponent;\n routeChildren = <RouteLoadingComponent />;\n }\n } else {\n // Wrap the page slot in a per-segment RedirectBoundary so that a\n // redirect() thrown from a server component (or a client component\n // within the page subtree) is caught here — below the route's layouts —\n // rather than at the top-level boundary in app-browser-entry. Catching\n // at the top level unmounts the entire route tree including layouts,\n // which destroys client-side state in layout-hosted components\n // (counters, theme toggles, form drafts). Here, only the page subtree\n // is unmounted; the surrounding layouts stay mounted across the\n // boundary's null-render → router.replace transition, and segment\n // reuse keeps their React state intact.\n //\n // Placed inside the Suspense (loading) boundary to match Next.js nesting\n // for the redirect boundary specifically:\n // Error > AccessFallback > Loading (Suspense) > Redirect > content\n // (Note: Next.js places AccessFallback inside Loading, not outside — that\n // is a pre-existing nesting divergence tracked separately.)\n // This keeps the loading fallback visible during redirect-driven\n // transitions rather than unmounting it.\n routeChildren = <RedirectBoundary>{routeChildren}</RedirectBoundary>;\n\n if (routeLoadingComponent && !shouldSuppressLoadingBoundaries(renderMode)) {\n const RouteLoadingComponent = routeLoadingComponent;\n // Route-level wrappers cover the full page branch in vinext's flat element\n // transport, so their reset key includes the visible segment-state path.\n // Dynamic param changes reset the pending boundary, while search-only changes\n // preserve it.\n routeChildren = (\n <Suspense key={routeResetKey} fallback={<RouteLoadingComponent />}>\n {routeChildren}\n </Suspense>\n );\n }\n }\n\n const lastLayoutErrorModule =\n errorEntries.length > 0 ? errorEntries[errorEntries.length - 1].errorModule : null;\n // Next.js nesting (outer to inner): Error > Unauthorized > Forbidden > NotFound > children.\n // Building bottom-up means NotFoundBoundary must wrap first, then Forbidden, Unauthorized, Error.\n const notFoundComponent =\n getDefaultExport(options.route.notFound) ?? getDefaultExport(options.rootNotFoundModule);\n if (notFoundComponent) {\n const NotFoundComponent = notFoundComponent;\n routeChildren = (\n <NotFoundBoundary resetKey={routeResetKey} fallback={<NotFoundComponent />}>\n {routeChildren}\n </NotFoundBoundary>\n );\n }\n\n const forbiddenComponent =\n getDefaultExport(options.route.forbidden) ?? getDefaultExport(options.rootForbiddenModule);\n if (forbiddenComponent) {\n const ForbiddenComponent = forbiddenComponent;\n routeChildren = (\n <ForbiddenBoundary resetKey={routeResetKey} fallback={<ForbiddenComponent />}>\n {routeChildren}\n </ForbiddenBoundary>\n );\n }\n\n const unauthorizedComponent =\n getDefaultExport(options.route.unauthorized) ??\n getDefaultExport(options.rootUnauthorizedModule);\n if (unauthorizedComponent) {\n const UnauthorizedComponent = unauthorizedComponent;\n routeChildren = (\n <UnauthorizedBoundary resetKey={routeResetKey} fallback={<UnauthorizedComponent />}>\n {routeChildren}\n </UnauthorizedBoundary>\n );\n }\n\n const pageErrorComponent = getErrorBoundaryExport(options.route.error);\n if (pageErrorComponent && options.route.error !== lastLayoutErrorModule) {\n routeChildren = (\n <ErrorBoundary resetKey={routeResetKey} fallback={pageErrorComponent}>\n {routeChildren}\n </ErrorBoundary>\n );\n }\n\n for (let index = orderedTreePositions.length - 1; index >= 0; index--) {\n const treePosition = orderedTreePositions[index];\n const segmentResetKey = resolveAppPageSegmentStateKey(\n routeSegments,\n treePosition,\n options.matchedParams,\n );\n let segmentChildren: ReactNode = routeChildren;\n const layoutEntry = layoutEntriesByTreePosition.get(treePosition);\n const templateEntry = templateEntriesByTreePosition.get(treePosition);\n const errorEntry = errorEntriesByTreePosition.get(treePosition);\n\n // Next.js nesting per segment (outer to inner): Layout > Template > Error > Unauthorized > Forbidden > NotFound > children.\n // Building bottom-up means NotFoundBoundary must wrap the leaf subtree first,\n // then ErrorBoundary, then Template, with the Layout slot outermost.\n if (layoutEntry) {\n const layoutNotFoundComponent = getDefaultExport(layoutEntry.notFoundModule);\n if (layoutNotFoundComponent) {\n const LayoutNotFoundComponent = layoutNotFoundComponent;\n segmentChildren = (\n <NotFoundBoundary resetKey={segmentResetKey} fallback={<LayoutNotFoundComponent />}>\n {segmentChildren}\n </NotFoundBoundary>\n );\n }\n\n const layoutForbiddenComponent = getDefaultExport(layoutEntry.forbiddenModule);\n if (layoutForbiddenComponent) {\n const LayoutForbiddenComponent = layoutForbiddenComponent;\n segmentChildren = (\n <ForbiddenBoundary resetKey={segmentResetKey} fallback={<LayoutForbiddenComponent />}>\n {segmentChildren}\n </ForbiddenBoundary>\n );\n }\n\n const layoutUnauthorizedComponent = getDefaultExport(layoutEntry.unauthorizedModule);\n if (layoutUnauthorizedComponent) {\n const LayoutUnauthorizedComponent = layoutUnauthorizedComponent;\n segmentChildren = (\n <UnauthorizedBoundary\n resetKey={segmentResetKey}\n fallback={<LayoutUnauthorizedComponent />}\n >\n {segmentChildren}\n </UnauthorizedBoundary>\n );\n }\n }\n\n const segmentErrorComponent = getErrorBoundaryExport(\n errorEntry?.errorModule ?? layoutEntry?.errorModule,\n );\n if (segmentErrorComponent) {\n segmentChildren = (\n <ErrorBoundary resetKey={segmentResetKey} fallback={segmentErrorComponent}>\n {segmentChildren}\n </ErrorBoundary>\n );\n }\n\n if (templateEntry && getDefaultExport(templateEntry.templateModule)) {\n segmentChildren = (\n <Slot id={templateEntry.id} key={segmentResetKey}>\n {segmentChildren}\n </Slot>\n );\n }\n\n if (!layoutEntry) {\n routeChildren = segmentChildren;\n continue;\n }\n const layoutHasElement = getDefaultExport(layoutEntry.layoutModule) !== null;\n const layoutIndex = layoutIndicesByTreePosition.get(treePosition) ?? -1;\n const segmentMap: { children: string[] } & Record<string, string[]> = {\n children: resolveAppPageChildSegments(\n routeSegments,\n layoutEntry.treePosition,\n options.matchedParams,\n ),\n };\n for (const [slotKey, slot] of Object.entries(options.route.slots ?? {})) {\n const slotName = slot.name;\n const targetIndex = slot.layoutIndex >= 0 ? slot.layoutIndex : layoutEntries.length - 1;\n if (targetIndex !== layoutIndex) {\n continue;\n }\n const slotParams = getEffectiveSlotParams(slotKey, slotName);\n segmentMap[slotName] = slot.routeSegments\n ? resolveAppPageChildSegments(slot.routeSegments, 0, slotParams)\n : [];\n }\n\n routeChildren = (\n <LayoutSegmentProvider segmentMap={segmentMap}>\n {layoutHasElement ? (\n <Slot\n id={layoutEntry.id}\n parallelSlots={createAppPageParallelSlotEntries(\n layoutIndex,\n layoutEntries,\n options.route,\n getEffectiveSlotParams,\n )}\n >\n {segmentChildren}\n </Slot>\n ) : (\n segmentChildren\n )}\n </LayoutSegmentProvider>\n );\n }\n\n const globalErrorComponent = getErrorBoundaryExport(options.globalErrorModule);\n if (globalErrorComponent) {\n routeChildren = <ErrorBoundary fallback={globalErrorComponent}>{routeChildren}</ErrorBoundary>;\n }\n\n elements[routeId] = (\n <>\n {createAppPageRouteHead(\n options.resolvedMetadata,\n options.resolvedViewport,\n options.resolvedMetadataPathname ?? options.routePath,\n metadataPlacement,\n )}\n {routeChildren}\n {createAppPageRouteBodyMetadata(\n options.resolvedMetadata,\n options.resolvedMetadataPathname ?? options.routePath,\n metadataPlacement,\n )}\n </>\n );\n\n return elements;\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"app-page-segment-state.js","names":[],"sources":["../../src/server/app-page-segment-state.ts"],"sourcesContent":["import type { AppPageParams } from \"./app-page-boundary.js\";\n\nfunction isOptionalCatchAllSegment(segment: string): boolean {\n return segment.startsWith(\"[[...\") && segment.endsWith(\"]]\") && segment.length > 7;\n}\n\nfunction isCatchAllSegment(segment: string): boolean {\n return segment.startsWith(\"[...\") && segment.endsWith(\"]\") && segment.length > 5;\n}\n\nfunction isDynamicSegment(segment: string): boolean {\n return segment.startsWith(\"[\") && segment.endsWith(\"]\") && !segment.includes(\".\");\n}\n\nfunction isRouteGroupSegment(segment: string): boolean {\n return segment.startsWith(\"(\") && segment.endsWith(\")\");\n}\n\ntype AppPageSegmentParamType = \"d\" | \"c\" | \"oc\";\n\ntype AppPageSegmentParam = {\n name: string;\n type: AppPageSegmentParamType;\n};\n\nfunction formatParamSegmentValue(value: string | string[] | undefined): string | undefined {\n if (Array.isArray(value)) {\n return value.join(\"/\");\n }\n return value;\n}\n\nfunction readSegmentParam(segment: string): AppPageSegmentParam | null {\n if (isOptionalCatchAllSegment(segment)) {\n return {\n name: segment.slice(5, -2),\n type: \"oc\",\n };\n }\n\n if (isCatchAllSegment(segment)) {\n return {\n name: segment.slice(4, -1),\n type: \"c\",\n };\n }\n\n if (isDynamicSegment(segment)) {\n return {\n name: segment.slice(1, -1),\n type: \"d\",\n };\n }\n\n return null;\n}\n\nfunction formatSegmentStateParamValue(\n param: AppPageSegmentParam,\n params: AppPageParams,\n fallbackSegment: string,\n): string {\n const value = params[param.name];\n\n if (\n param.type === \"oc\" &&\n (value === undefined || (Array.isArray(value) && value.length === 0))\n ) {\n return \"\";\n }\n\n return formatParamSegmentValue(value) ?? fallbackSegment;\n}\n\nfunction resolveSingleSegmentStateKey(segment: string, params: AppPageParams): string {\n const param = readSegmentParam(segment);\n if (!param) {\n return segment;\n }\n\n return `${param.name}|${formatSegmentStateParamValue(param, params, segment)}|${param.type}`;\n}\n\nexport function resolveAppPageChildSegments(\n routeSegments: readonly string[],\n treePosition: number,\n params: AppPageParams,\n): string[] {\n const rawSegments = routeSegments.slice(treePosition);\n const resolvedSegments: string[] = [];\n\n for (const segment of rawSegments) {\n if (isOptionalCatchAllSegment(segment)) {\n const paramName = segment.slice(5, -2);\n const paramValue = params[paramName];\n if (Array.isArray(paramValue) && paramValue.length === 0) {\n continue;\n }\n const resolvedValue = formatParamSegmentValue(paramValue);\n if (resolvedValue !== undefined) {\n resolvedSegments.push(resolvedValue);\n }\n continue;\n }\n\n if (isCatchAllSegment(segment)) {\n const paramName = segment.slice(4, -1);\n resolvedSegments.push(formatParamSegmentValue(params[paramName]) ?? segment);\n continue;\n }\n\n if (isDynamicSegment(segment)) {\n const paramName = segment.slice(1, -1);\n resolvedSegments.push(formatParamSegmentValue(params[paramName]) ?? segment);\n continue;\n }\n\n resolvedSegments.push(segment);\n }\n\n return resolvedSegments;\n}\n\nexport function resolveAppPageSegmentStateKey(\n routeSegments: readonly string[],\n treePosition: number,\n params: AppPageParams,\n): string {\n for (const segment of routeSegments.slice(treePosition)) {\n if (!isRouteGroupSegment(segment)) {\n return resolveSingleSegmentStateKey(segment, params);\n }\n }\n return \"\";\n}\n\nexport function resolveAppPageRouteStateKey(\n routeSegments: readonly string[],\n params: AppPageParams,\n): string {\n const statePath: string[] = [];\n\n for (const segment of routeSegments) {\n if (!isRouteGroupSegment(segment)) {\n statePath.push(resolveSingleSegmentStateKey(segment, params));\n }\n }\n\n return statePath.length > 0 ? JSON.stringify(statePath) : \"\";\n}\n\nexport function resolveAppPageLeafSegmentStateKey(\n routeSegments: readonly string[],\n params: AppPageParams,\n): string {\n for (let treePosition = routeSegments.length - 1; treePosition >= 0; treePosition--) {\n const segmentStateKey = resolveAppPageSegmentStateKey(routeSegments, treePosition, params);\n if (segmentStateKey) {\n return segmentStateKey;\n }\n }\n return \"\";\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"app-page-stream.js","names":[],"sources":["../../src/server/app-page-stream.ts"],"sourcesContent":["import type { AppPageFontPreload } from \"./app-page-execution.js\";\nimport type { ReactFormState } from \"react-dom/client\";\nimport { VINEXT_RSC_VARY_HEADER } from \"./app-rsc-cache-busting.js\";\nimport { applyEdgeRuntimeHeader } from \"./app-page-response.js\";\nimport { mergeMiddlewareResponseHeaders } from \"./middleware-response-headers.js\";\nimport type { RootParams } from \"vinext/shims/root-params\";\n\nexport type AppPageFontData = {\n links: string[];\n preloads: readonly AppPageFontPreload[];\n styles: string[];\n};\n\ntype CreateAppPageFontDataOptions = {\n getLinks: () => string[];\n getPreloads: () => AppPageFontPreload[];\n getStyles: () => string[];\n};\n\nexport type AppPageSsrHandler = {\n handleSsr: (\n rscStream: ReadableStream<Uint8Array>,\n navigationContext: unknown,\n fontData: AppPageFontData,\n options?: {\n formState?: ReactFormState | null;\n scriptNonce?: string;\n basePath?: string;\n /**\n * Allow-list of OpenTelemetry propagation keys to emit as `<meta>` tags\n * in the SSR head. Sourced from `experimental.clientTraceMetadata`.\n */\n clientTraceMetadata?: readonly string[];\n rootParams?: RootParams;\n sideStream?: ReadableStream<Uint8Array>;\n capturedRscDataRef?: { value: Promise<ArrayBuffer> | null };\n /** When true, wait for the full React tree before emitting bytes. */\n waitForAllReady?: boolean;\n },\n ) => Promise<ReadableStream<Uint8Array>>;\n};\n\ntype RenderAppPageHtmlStreamOptions = {\n fontData: AppPageFontData;\n formState?: ReactFormState | null;\n navigationContext: unknown;\n rscStream: ReadableStream<Uint8Array>;\n scriptNonce?: string;\n basePath?: string;\n /**\n * Allow-list of OpenTelemetry propagation keys (from\n * `experimental.clientTraceMetadata`) to surface as `<meta>` tags in\n * the SSR head. Undefined or empty disables emission.\n */\n clientTraceMetadata?: readonly string[];\n rootParams?: RootParams;\n ssrHandler: AppPageSsrHandler;\n /** Pre-split side stream for fused embed+capture (#981). When set,\n * handleSsr skips its internal tee and accumulates raw RSC bytes. */\n sideStream?: ReadableStream<Uint8Array>;\n /** Out-parameter filled with accumulated raw RSC bytes after stream consumption. */\n capturedRscDataRef?: { value: Promise<ArrayBuffer> | null };\n /** When true, wait for the full React tree before emitting bytes. */\n waitForAllReady?: boolean;\n};\n\ntype RenderAppPageHtmlResponseOptions = {\n clearRequestContext: () => void;\n fontLinkHeader?: string;\n isEdgeRuntime?: boolean;\n middlewareHeaders?: Headers | null;\n status: number;\n} & RenderAppPageHtmlStreamOptions;\n\ntype AppPageHtmlStreamRecoveryResult = {\n htmlStream: ReadableStream<Uint8Array> | null;\n response: Response | null;\n};\n\ntype RenderAppPageHtmlStreamWithRecoveryOptions<TSpecialError> = {\n onShellRendered?: () => void;\n renderErrorBoundaryResponse: (error: unknown) => Promise<Response | null>;\n renderHtmlStream: () => Promise<ReadableStream<Uint8Array>>;\n renderSpecialErrorResponse: (specialError: TSpecialError) => Promise<Response>;\n resolveSpecialError: (error: unknown) => TSpecialError | null;\n};\n\ntype AppPageRscErrorTracker = {\n getCapturedError: () => unknown;\n /**\n * Returns a NEXT_REDIRECT or NEXT_HTTP_ERROR_FALLBACK error captured during\n * the RSC render. Read after the SSR shell promise resolves to swap a\n * 307/404 in place of the streamed body when redirect()/notFound() throws\n * synchronously inside a route-level Suspense boundary (loading.tsx).\n */\n getCapturedSpecialError: () => unknown;\n onRenderError: (error: unknown, requestInfo: unknown, errorContext: unknown) => unknown;\n};\n\ntype ShouldRerenderAppPageWithGlobalErrorOptions = {\n capturedError: unknown;\n hasLocalBoundary: boolean;\n};\n\nexport function createAppPageFontData(options: CreateAppPageFontDataOptions): AppPageFontData {\n return {\n links: options.getLinks(),\n preloads: options.getPreloads(),\n styles: options.getStyles(),\n };\n}\n\nexport async function renderAppPageHtmlStream(\n options: RenderAppPageHtmlStreamOptions,\n): Promise<ReadableStream<Uint8Array>> {\n const ssrOptions = {\n formState: options.formState ?? null,\n scriptNonce: options.scriptNonce,\n basePath: options.basePath,\n clientTraceMetadata: options.clientTraceMetadata,\n rootParams: options.rootParams,\n sideStream: options.sideStream,\n capturedRscDataRef: options.capturedRscDataRef,\n waitForAllReady: options.waitForAllReady,\n };\n\n return options.ssrHandler.handleSsr(\n options.rscStream,\n options.navigationContext,\n options.fontData,\n ssrOptions,\n );\n}\n\n/**\n * Wraps a stream so that `onFlush` is called when the last byte has been read\n * by the downstream consumer (i.e. when the HTTP layer finishes draining the\n * response body). This is the correct place to clear per-request context,\n * because the RSC/SSR pipeline is lazy — components execute while the stream\n * is being consumed, not when the stream handle is first obtained.\n */\nexport function deferUntilStreamConsumed(\n stream: ReadableStream<Uint8Array>,\n onFlush: () => void,\n): ReadableStream<Uint8Array> {\n let called = false;\n const once = () => {\n if (!called) {\n called = true;\n onFlush();\n }\n };\n\n const cleanup = new TransformStream<Uint8Array, Uint8Array>({\n flush() {\n once();\n },\n });\n\n const piped = stream.pipeThrough(cleanup);\n\n // Wrap with a ReadableStream so we can intercept cancel() — the TransformStream\n // Transformer interface does not expose a cancel hook in the Web Streams spec.\n const reader = piped.getReader();\n return new ReadableStream<Uint8Array>({\n pull(controller) {\n return reader.read().then(\n ({ done, value }) => {\n if (done) {\n controller.close();\n } else {\n controller.enqueue(value);\n }\n },\n (error) => {\n once();\n controller.error(error);\n },\n );\n },\n cancel(reason) {\n // Stream cancelled before fully consumed (e.g. client disconnected).\n // Still clear per-request context to avoid leaks.\n once();\n return reader.cancel(reason);\n },\n });\n}\n\nexport async function renderAppPageHtmlResponse(\n options: RenderAppPageHtmlResponseOptions,\n): Promise<Response> {\n const htmlStream = await renderAppPageHtmlStream(options);\n\n // Defer clearRequestContext() until the stream is fully consumed by the HTTP\n // layer. Calling it synchronously here would race the lazy RSC/SSR pipeline:\n // components execute while the stream is being pulled, not when the handle\n // is first returned. See: https://github.com/cloudflare/vinext/issues/660\n const safeStream = deferUntilStreamConsumed(htmlStream, () => {\n options.clearRequestContext();\n });\n\n const headers = new Headers({\n \"Content-Type\": \"text/html; charset=utf-8\",\n Vary: VINEXT_RSC_VARY_HEADER,\n });\n\n applyEdgeRuntimeHeader(headers, options.isEdgeRuntime);\n\n if (options.fontLinkHeader) {\n headers.set(\"Link\", options.fontLinkHeader);\n }\n\n mergeMiddlewareResponseHeaders(headers, options.middlewareHeaders ?? null);\n\n return new Response(safeStream, {\n status: options.status,\n headers,\n });\n}\n\nexport async function renderAppPageHtmlStreamWithRecovery<TSpecialError>(\n options: RenderAppPageHtmlStreamWithRecoveryOptions<TSpecialError>,\n): Promise<AppPageHtmlStreamRecoveryResult> {\n try {\n const htmlStream = await options.renderHtmlStream();\n options.onShellRendered?.();\n return {\n htmlStream,\n response: null,\n };\n } catch (error) {\n const specialError = options.resolveSpecialError(error);\n if (specialError) {\n return {\n htmlStream: null,\n response: await options.renderSpecialErrorResponse(specialError),\n };\n }\n\n const boundaryResponse = await options.renderErrorBoundaryResponse(error);\n if (boundaryResponse) {\n return {\n htmlStream: null,\n response: boundaryResponse,\n };\n }\n\n throw error;\n }\n}\n\nexport function createAppPageRscErrorTracker(\n baseOnError: (error: unknown, requestInfo: unknown, errorContext: unknown) => unknown,\n): AppPageRscErrorTracker {\n let capturedError: unknown = null;\n let capturedSpecialError: unknown = null;\n\n return {\n getCapturedError() {\n return capturedError;\n },\n getCapturedSpecialError() {\n return capturedSpecialError;\n },\n onRenderError(error, requestInfo, errorContext) {\n if (error && typeof error === \"object\" && \"digest\" in error) {\n // Errors with a digest are signal throws (NEXT_REDIRECT,\n // NEXT_NOT_FOUND, NEXT_HTTP_ERROR_FALLBACK). They're not real\n // failures — keep the first one so the lifecycle can swap a\n // 307/404 in place of a streamed \"Switched to client rendering\"\n // body for routes with a route-level Suspense boundary.\n if (capturedSpecialError === null) {\n capturedSpecialError = error;\n }\n } else {\n capturedError = error;\n }\n return baseOnError(error, requestInfo, errorContext);\n },\n };\n}\n\nexport function shouldRerenderAppPageWithGlobalError(\n options: ShouldRerenderAppPageWithGlobalErrorOptions,\n): boolean {\n return Boolean(options.capturedError) && !options.hasLocalBoundary;\n}\n"],"mappings":";;;;AAwGA,SAAgB,sBAAsB,SAAwD;CAC5F,OAAO;EACL,OAAO,QAAQ,UAAU;EACzB,UAAU,QAAQ,aAAa;EAC/B,QAAQ,QAAQ,WAAW;EAC5B;;AAGH,eAAsB,wBACpB,SACqC;CACrC,MAAM,aAAa;EACjB,WAAW,QAAQ,aAAa;EAChC,aAAa,QAAQ;EACrB,UAAU,QAAQ;EAClB,qBAAqB,QAAQ;EAC7B,YAAY,QAAQ;EACpB,YAAY,QAAQ;EACpB,oBAAoB,QAAQ;EAC5B,iBAAiB,QAAQ;EAC1B;CAED,OAAO,QAAQ,WAAW,UACxB,QAAQ,WACR,QAAQ,mBACR,QAAQ,UACR,WACD;;;;;;;;;AAUH,SAAgB,yBACd,QACA,SAC4B;CAC5B,IAAI,SAAS;CACb,MAAM,aAAa;EACjB,IAAI,CAAC,QAAQ;GACX,SAAS;GACT,SAAS;;;CAIb,MAAM,UAAU,IAAI,gBAAwC,EAC1D,QAAQ;EACN,MAAM;IAET,CAAC;CAMF,MAAM,SAJQ,OAAO,YAAY,QAIb,CAAC,WAAW;CAChC,OAAO,IAAI,eAA2B;EACpC,KAAK,YAAY;GACf,OAAO,OAAO,MAAM,CAAC,MAClB,EAAE,MAAM,YAAY;IACnB,IAAI,MACF,WAAW,OAAO;SAElB,WAAW,QAAQ,MAAM;OAG5B,UAAU;IACT,MAAM;IACN,WAAW,MAAM,MAAM;KAE1B;;EAEH,OAAO,QAAQ;GAGb,MAAM;GACN,OAAO,OAAO,OAAO,OAAO;;EAE/B,CAAC;;AAGJ,eAAsB,0BACpB,SACmB;CAOnB,MAAM,aAAa,yBAAyB,MANnB,wBAAwB,QAAQ,QAMK;EAC5D,QAAQ,qBAAqB;GAC7B;CAEF,MAAM,UAAU,IAAI,QAAQ;EAC1B,gBAAgB;EAChB,MAAM;EACP,CAAC;CAEF,uBAAuB,SAAS,QAAQ,cAAc;CAEtD,IAAI,QAAQ,gBACV,QAAQ,IAAI,QAAQ,QAAQ,eAAe;CAG7C,+BAA+B,SAAS,QAAQ,qBAAqB,KAAK;CAE1E,OAAO,IAAI,SAAS,YAAY;EAC9B,QAAQ,QAAQ;EAChB;EACD,CAAC;;AAGJ,eAAsB,oCACpB,SAC0C;CAC1C,IAAI;EACF,MAAM,aAAa,MAAM,QAAQ,kBAAkB;EACnD,QAAQ,mBAAmB;EAC3B,OAAO;GACL;GACA,UAAU;GACX;UACM,OAAO;EACd,MAAM,eAAe,QAAQ,oBAAoB,MAAM;EACvD,IAAI,cACF,OAAO;GACL,YAAY;GACZ,UAAU,MAAM,QAAQ,2BAA2B,aAAa;GACjE;EAGH,MAAM,mBAAmB,MAAM,QAAQ,4BAA4B,MAAM;EACzE,IAAI,kBACF,OAAO;GACL,YAAY;GACZ,UAAU;GACX;EAGH,MAAM;;;AAIV,SAAgB,6BACd,aACwB;CACxB,IAAI,gBAAyB;CAC7B,IAAI,uBAAgC;CAEpC,OAAO;EACL,mBAAmB;GACjB,OAAO;;EAET,0BAA0B;GACxB,OAAO;;EAET,cAAc,OAAO,aAAa,cAAc;GAC9C,IAAI,SAAS,OAAO,UAAU,YAAY,YAAY;QAMhD,yBAAyB,MAC3B,uBAAuB;UAGzB,gBAAgB;GAElB,OAAO,YAAY,OAAO,aAAa,aAAa;;EAEvD;;AAGH,SAAgB,qCACd,SACS;CACT,OAAO,QAAQ,QAAQ,cAAc,IAAI,CAAC,QAAQ"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"app-post-middleware-context.js","names":[],"sources":["../../src/server/app-post-middleware-context.ts"],"sourcesContent":["import { getHeadersContext } from \"vinext/shims/headers\";\nimport { normalizeHost, requestContextFromRequest } from \"../config/config-matchers.js\";\nimport type { RequestContext } from \"../config/config-matchers.js\";\n\n/**\n * Build a request context from the live ALS HeadersContext, which reflects\n * any x-middleware-request-* header mutations applied by middleware.\n * Used for afterFiles and fallback rewrite has/missing evaluation — these\n * run after middleware in the App Router execution order.\n *\n * Falls back to `requestContextFromRequest(request)` when no HeadersContext\n * is set (no middleware ran, or middleware didn't set request headers).\n */\nexport function buildPostMwRequestContext(request: Request): RequestContext {\n const url = new URL(request.url);\n const ctx = getHeadersContext();\n if (!ctx) return requestContextFromRequest(request);\n const cookiesRecord: Record<string, string> = Object.fromEntries(ctx.cookies);\n return {\n headers: ctx.headers,\n cookies: cookiesRecord,\n query: url.searchParams,\n host: normalizeHost(ctx.headers.get(\"host\"), url.hostname),\n };\n}\n"],"mappings":";;;;;;;;;;;;AAaA,SAAgB,0BAA0B,SAAkC;CAC1E,MAAM,MAAM,IAAI,IAAI,QAAQ,IAAI;CAChC,MAAM,MAAM,mBAAmB;CAC/B,IAAI,CAAC,KAAK,OAAO,0BAA0B,QAAQ;CACnD,MAAM,gBAAwC,OAAO,YAAY,IAAI,QAAQ;CAC7E,OAAO;EACL,SAAS,IAAI;EACb,SAAS;EACT,OAAO,IAAI;EACX,MAAM,cAAc,IAAI,QAAQ,IAAI,OAAO,EAAE,IAAI,SAAS;EAC3D"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"app-prerender-endpoints.js","names":[],"sources":["../../src/server/app-prerender-endpoints.ts"],"sourcesContent":["import { callAppPrerenderStaticParams } from \"./app-prerender-static-params.js\";\nimport { notFoundResponse } from \"./http-error-responses.js\";\nimport type { RootParams } from \"vinext/shims/root-params\";\n\ntype GenerateStaticParams = (args: { params: RootParams }) => unknown;\n\ntype AppPrerenderStaticParamsMap = Record<string, GenerateStaticParams | null | undefined>;\ntype RootParamNamesMap = Record<string, readonly string[] | undefined>;\n\ntype AppPrerenderPageRoute = {\n pattern: string;\n module?: {\n getStaticPaths?: (opts: { locales: string[]; defaultLocale: string }) => unknown;\n };\n};\n\ntype HandleAppPrerenderEndpointOptions = {\n isPrerenderEnabled?: () => boolean;\n loadPagesRoutes?: () => Promise<unknown>;\n pathname: string;\n rootParamNamesByPattern?: RootParamNamesMap;\n staticParamsMap: AppPrerenderStaticParamsMap;\n};\n\nconst STATIC_PARAMS_ENDPOINT = \"/__vinext/prerender/static-params\";\nconst PAGES_STATIC_PATHS_ENDPOINT = \"/__vinext/prerender/pages-static-paths\";\nconst JSON_HEADERS = { \"content-type\": \"application/json\" };\n\nexport async function handleAppPrerenderEndpoint(\n request: Request,\n options: HandleAppPrerenderEndpointOptions,\n): Promise<Response | null> {\n if (options.pathname === STATIC_PARAMS_ENDPOINT) {\n return handleStaticParamsEndpoint(request, options);\n }\n\n if (options.pathname === PAGES_STATIC_PATHS_ENDPOINT) {\n if (!options.loadPagesRoutes) return null;\n return handlePagesStaticPathsEndpoint(request, options);\n }\n\n return null;\n}\n\nasync function handleStaticParamsEndpoint(\n request: Request,\n options: HandleAppPrerenderEndpointOptions,\n): Promise<Response> {\n if (!isEnabled(options)) {\n return notFoundResponse();\n }\n\n const url = new URL(request.url);\n const pattern = url.searchParams.get(\"pattern\");\n if (!pattern) return new Response(\"missing pattern\", { status: 400 });\n\n const generateStaticParams = options.staticParamsMap[pattern];\n if (typeof generateStaticParams !== \"function\") {\n return jsonNullResponse();\n }\n\n try {\n const params = parseParentParams(url.searchParams.get(\"parentParams\"));\n const result = await callAppPrerenderStaticParams({\n fn: generateStaticParams,\n params,\n pattern,\n rootParamNamesByPattern: options.rootParamNamesByPattern ?? {},\n });\n return jsonResponse(result);\n } catch (error) {\n return jsonResponse({ error: String(error) }, 500);\n }\n}\n\nasync function handlePagesStaticPathsEndpoint(\n request: Request,\n options: HandleAppPrerenderEndpointOptions,\n): Promise<Response> {\n if (!isEnabled(options)) {\n return notFoundResponse();\n }\n\n const url = new URL(request.url);\n const pattern = url.searchParams.get(\"pattern\");\n if (!pattern) return new Response(\"missing pattern\", { status: 400 });\n\n try {\n const pageRoutes = await options.loadPagesRoutes?.();\n const route = findPageRoute(pageRoutes, pattern);\n const getStaticPaths = route?.module?.getStaticPaths;\n if (typeof getStaticPaths !== \"function\") {\n return jsonNullResponse();\n }\n\n const locales = parseLocales(url.searchParams.get(\"locales\"));\n const defaultLocale = url.searchParams.get(\"defaultLocale\") ?? \"\";\n const result = await getStaticPaths({ locales, defaultLocale });\n return jsonResponse(result);\n } catch (error) {\n return jsonResponse({ error: String(error) }, 500);\n }\n}\n\nfunction isEnabled(options: HandleAppPrerenderEndpointOptions): boolean {\n return options.isPrerenderEnabled?.() ?? false;\n}\n\nfunction jsonResponse(body: unknown, status = 200): Response {\n return new Response(JSON.stringify(body), {\n headers: JSON_HEADERS,\n status,\n });\n}\n\nfunction jsonNullResponse(): Response {\n return new Response(\"null\", {\n headers: JSON_HEADERS,\n status: 200,\n });\n}\n\nfunction parseParentParams(raw: string | null): RootParams {\n if (!raw) return {};\n\n const value = JSON.parse(raw);\n if (!isPlainObject(value)) return {};\n\n const params: RootParams = {};\n for (const [key, paramValue] of Object.entries(value)) {\n if (typeof paramValue === \"string\" || paramValue === undefined || isStringArray(paramValue)) {\n params[key] = paramValue;\n }\n }\n return params;\n}\n\nfunction parseLocales(raw: string | null): string[] {\n if (!raw) return [];\n\n const value = JSON.parse(raw);\n if (!Array.isArray(value)) return [];\n\n return value.filter((locale) => typeof locale === \"string\");\n}\n\nfunction findPageRoute(value: unknown, pattern: string): AppPrerenderPageRoute | undefined {\n if (!Array.isArray(value)) return undefined;\n\n for (const route of value) {\n if (isPageRoute(route) && route.pattern === pattern) {\n return route;\n }\n }\n\n return undefined;\n}\n\nfunction isPageRoute(value: unknown): value is AppPrerenderPageRoute {\n if (!isPlainObject(value) || typeof value.pattern !== \"string\") return false;\n if (value.module === undefined) return true;\n if (!isPlainObject(value.module)) return false;\n\n return (\n value.module.getStaticPaths === undefined || typeof value.module.getStaticPaths === \"function\"\n );\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isStringArray(value: unknown): value is string[] {\n return Array.isArray(value) && value.every((item) => typeof item === \"string\");\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"app-prerender-static-params.js","names":[],"sources":["../../src/server/app-prerender-static-params.ts"],"sourcesContent":["import { pickRootParams, runWithRootParamsScope, type RootParams } from \"vinext/shims/root-params\";\n\ntype GenerateStaticParamsFunction = (input: { params: RootParams }) => unknown;\n\nfunction isGenerateStaticParamsFunction(value: unknown): value is GenerateStaticParamsFunction {\n return typeof value === \"function\";\n}\n\nfunction isRootParams(value: unknown): value is RootParams {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nexport function createAppPrerenderStaticParamsResolver(\n sources: readonly unknown[],\n rootParamNames?: readonly string[],\n): GenerateStaticParamsFunction | null {\n const generateStaticParamsFns = sources.filter(isGenerateStaticParamsFunction);\n if (generateStaticParamsFns.length === 0) return null;\n\n const filterRootParams = (params: RootParams): RootParams =>\n pickRootParams(params, rootParamNames ?? []);\n\n if (generateStaticParamsFns.length === 1) {\n const single = generateStaticParamsFns[0];\n // Wrap the single source in the same non-array/non-object guards as the\n // multi-source composition path so the contract is uniform regardless of\n // how many sources were composed.\n return async (input) => {\n const picked = filterRootParams(input.params);\n return runWithRootParamsScope(picked, async () => {\n const result = await single(input);\n if (!Array.isArray(result)) return [];\n for (const item of result) {\n if (!isRootParams(item)) return [];\n }\n return result;\n });\n };\n }\n\n return async ({ params }) => {\n let paramSets: RootParams[] = [params];\n\n for (const generateStaticParams of generateStaticParamsFns) {\n const nextParamSets: RootParams[] = [];\n\n for (const parentParams of paramSets) {\n const rootScope = filterRootParams(parentParams);\n\n const result = await runWithRootParamsScope(rootScope, async () =>\n generateStaticParams({ params: parentParams }),\n );\n\n if (!Array.isArray(result)) return [];\n\n for (const item of result) {\n if (!isRootParams(item)) return [];\n nextParamSets.push({ ...parentParams, ...item });\n }\n }\n\n paramSets = nextParamSets;\n }\n\n return paramSets;\n };\n}\n\ntype CallAppPrerenderStaticParamsOptions = {\n fn: GenerateStaticParamsFunction;\n params: RootParams;\n pattern: string;\n rootParamNamesByPattern: Record<string, readonly string[] | undefined>;\n};\n\nexport async function callAppPrerenderStaticParams(\n options: CallAppPrerenderStaticParamsOptions,\n): Promise<unknown> {\n const picked = pickRootParams(options.params, options.rootParamNamesByPattern[options.pattern]);\n return runWithRootParamsScope(picked, () => options.fn({ params: options.params }));\n}\n"],"mappings":";;AAIA,SAAS,+BAA+B,OAAuD;CAC7F,OAAO,OAAO,UAAU;;AAG1B,SAAS,aAAa,OAAqC;CACzD,OAAO,UAAU,QAAQ,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,MAAM;;AAG7E,SAAgB,uCACd,SACA,gBACqC;CACrC,MAAM,0BAA0B,QAAQ,OAAO,+BAA+B;CAC9E,IAAI,wBAAwB,WAAW,GAAG,OAAO;CAEjD,MAAM,oBAAoB,WACxB,eAAe,QAAQ,kBAAkB,EAAE,CAAC;CAE9C,IAAI,wBAAwB,WAAW,GAAG;EACxC,MAAM,SAAS,wBAAwB;EAIvC,OAAO,OAAO,UAAU;GAEtB,OAAO,uBADQ,iBAAiB,MAAM,OACF,EAAE,YAAY;IAChD,MAAM,SAAS,MAAM,OAAO,MAAM;IAClC,IAAI,CAAC,MAAM,QAAQ,OAAO,EAAE,OAAO,EAAE;IACrC,KAAK,MAAM,QAAQ,QACjB,IAAI,CAAC,aAAa,KAAK,EAAE,OAAO,EAAE;IAEpC,OAAO;KACP;;;CAIN,OAAO,OAAO,EAAE,aAAa;EAC3B,IAAI,YAA0B,CAAC,OAAO;EAEtC,KAAK,MAAM,wBAAwB,yBAAyB;GAC1D,MAAM,gBAA8B,EAAE;GAEtC,KAAK,MAAM,gBAAgB,WAAW;IAGpC,MAAM,SAAS,MAAM,uBAFH,iBAAiB,aAEkB,EAAE,YACrD,qBAAqB,EAAE,QAAQ,cAAc,CAAC,CAC/C;IAED,IAAI,CAAC,MAAM,QAAQ,OAAO,EAAE,OAAO,EAAE;IAErC,KAAK,MAAM,QAAQ,QAAQ;KACzB,IAAI,CAAC,aAAa,KAAK,EAAE,OAAO,EAAE;KAClC,cAAc,KAAK;MAAE,GAAG;MAAc,GAAG;MAAM,CAAC;;;GAIpD,YAAY;;EAGd,OAAO;;;AAWX,eAAsB,6BACpB,SACkB;CAElB,OAAO,uBADQ,eAAe,QAAQ,QAAQ,QAAQ,wBAAwB,QAAQ,SAClD,QAAQ,QAAQ,GAAG,EAAE,QAAQ,QAAQ,QAAQ,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"app-render-dependency.js","names":[],"sources":["../../src/server/app-render-dependency.tsx"],"sourcesContent":["import { type ReactNode } from \"react\";\n\nexport type AppRenderDependency = {\n promise: Promise<void>;\n release: () => void;\n};\n\nexport function createAppRenderDependency(): AppRenderDependency {\n let released = false;\n let resolve!: () => void;\n\n const promise = new Promise<void>((promiseResolve) => {\n resolve = promiseResolve;\n });\n\n return {\n promise,\n release() {\n if (released) {\n return;\n }\n released = true;\n resolve();\n },\n };\n}\n\nexport function renderAfterAppDependencies(\n children: ReactNode,\n dependencies: readonly AppRenderDependency[],\n): ReactNode {\n if (dependencies.length === 0) {\n return children;\n }\n\n async function AwaitAppRenderDependencies() {\n await Promise.all(dependencies.map((dependency) => dependency.promise));\n return children;\n }\n\n return <AwaitAppRenderDependencies />;\n}\n\nexport function renderWithAppDependencyBarrier(\n children: ReactNode,\n dependency: AppRenderDependency,\n): ReactNode {\n function ReleaseAppRenderDependency() {\n // This render-time release is intentional. The dependency barrier is only\n // used inside the RSC render graph, where producing this leaf means the\n // owning entry has reached the serialization point that downstream entries\n // are allowed to observe. If Phase 2 adds AbortSignal-based render\n // timeouts, this dependency will also need an abort/reject path so stuck\n // async layouts do not suspend downstream entries forever.\n dependency.release();\n return null;\n }\n\n return (\n <>\n {children}\n <ReleaseAppRenderDependency />\n </>\n );\n}\n"],"mappings":";;AAOA,SAAgB,4BAAiD;CAC/D,IAAI,WAAW;CACf,IAAI;CAMJ,OAAO;EACL,SAAA,IALkB,SAAe,mBAAmB;GACpD,UAAU;IAIH;EACP,UAAU;GACR,IAAI,UACF;GAEF,WAAW;GACX,SAAS;;EAEZ;;AAGH,SAAgB,2BACd,UACA,cACW;CACX,IAAI,aAAa,WAAW,GAC1B,OAAO;CAGT,eAAe,6BAA6B;EAC1C,MAAM,QAAQ,IAAI,aAAa,KAAK,eAAe,WAAW,QAAQ,CAAC;EACvE,OAAO;;CAGT,OAAO,oBAAC,4BAAD,EAA8B,CAAA;;AAGvC,SAAgB,+BACd,UACA,YACW;CACX,SAAS,6BAA6B;EAOpC,WAAW,SAAS;EACpB,OAAO;;CAGT,OACE,qBAAA,UAAA,EAAA,UAAA,CACG,UACD,oBAAC,4BAAD,EAA8B,CAAA,CAC7B,EAAA,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"app-request-context.js","names":[],"sources":["../../src/server/app-request-context.ts"],"sourcesContent":["import { setHeadersContext } from \"vinext/shims/headers\";\nimport {\n setNavigationContext as setNavigationContextOrig,\n type NavigationContext,\n} from \"vinext/shims/navigation\";\nimport { setRootParams } from \"vinext/shims/root-params\";\n\n/**\n * Set navigation context in the ALS-backed store. \"use client\" components\n * rendered during SSR need the pathname/searchParams/params but the SSR\n * environment has a separate module instance of next/navigation.\n *\n * Clearing nav context (ctx === null) also clears root params.\n */\nexport function setAppNavigationContext(ctx: NavigationContext | null): void {\n setNavigationContextOrig(ctx);\n if (ctx === null) setRootParams(null);\n}\n\n/**\n * Clear all per-request ALS state owned by the App Router handler.\n * Must be called before returning a non-page response (redirect, public\n * file proxy, etc.) to prevent state leaking between requests on Workers.\n *\n * Clears: headers, navigation context, root params.\n */\nexport function clearAppRequestContext(): void {\n setHeadersContext(null);\n setAppNavigationContext(null);\n}\n"],"mappings":";;;;;;;;;;;AAcA,SAAgB,wBAAwB,KAAqC;CAC3E,qBAAyB,IAAI;CAC7B,IAAI,QAAQ,MAAM,cAAc,KAAK;;;;;;;;;AAUvC,SAAgB,yBAA+B;CAC7C,kBAAkB,KAAK;CACvB,wBAAwB,KAAK"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"app-route-handler-cache.js","names":[],"sources":["../../src/server/app-route-handler-cache.ts"],"sourcesContent":["import type { NextI18nConfig } from \"../config/next-config.js\";\nimport type { HeadersAccessPhase } from \"vinext/shims/headers\";\nimport type { ISRCacheEntry } from \"./isr-cache.js\";\nimport type { RouteHandlerMiddlewareContext } from \"./app-route-handler-response.js\";\nimport {\n applyRouteHandlerMiddlewareContext,\n assertSupportedAppRouteHandlerResponse,\n buildAppRouteCacheValue,\n buildRouteHandlerCachedResponse,\n} from \"./app-route-handler-response.js\";\nimport { markKnownDynamicAppRoute } from \"./app-route-handler-runtime.js\";\nimport { makeThenableParams } from \"vinext/shims/thenable-params\";\nimport {\n runAppRouteHandler,\n type AppRouteDebugLogger,\n type AppRouteDynamicUsageFn,\n type AppRouteHandlerFunction,\n type AppRouteParams,\n type MarkAppRouteDynamicUsageFn,\n type RouteHandlerCacheSetter,\n} from \"./app-route-handler-execution.js\";\n\ntype RouteHandlerCacheGetter = (key: string) => Promise<ISRCacheEntry | null>;\ntype RouteHandlerBackgroundRegenerator = (key: string, renderFn: () => Promise<void>) => void;\ntype RouteHandlerRevalidationContextRunner = (renderFn: () => Promise<void>) => Promise<void>;\n\ntype ReadAppRouteHandlerCacheOptions = {\n basePath?: string;\n buildPageCacheTags: (pathname: string, extraTags: string[]) => string[];\n cleanPathname: string;\n clearRequestContext: () => void;\n consumeDynamicUsage: AppRouteDynamicUsageFn;\n dynamicConfig?: string;\n getCollectedFetchTags: () => string[];\n handlerFn: AppRouteHandlerFunction;\n i18n?: NextI18nConfig | null;\n isAutoHead: boolean;\n isrDebug?: AppRouteDebugLogger;\n isrGet: RouteHandlerCacheGetter;\n isrRouteKey: (pathname: string) => string;\n isrSet: RouteHandlerCacheSetter;\n markDynamicUsage: MarkAppRouteDynamicUsageFn;\n middlewareContext: RouteHandlerMiddlewareContext;\n /** `null` for non-dynamic routes. See `AppRouteHandlerFunction` for details. */\n params: AppRouteParams | null;\n requestUrl: string;\n revalidateSearchParams: URLSearchParams;\n expireSeconds?: number;\n revalidateSeconds: number;\n routePattern: string;\n runInRevalidationContext: RouteHandlerRevalidationContextRunner;\n scheduleBackgroundRegeneration: RouteHandlerBackgroundRegenerator;\n setHeadersAccessPhase: (phase: HeadersAccessPhase) => HeadersAccessPhase;\n setNavigationContext: (\n context: {\n pathname: string;\n searchParams: URLSearchParams;\n params: AppRouteParams;\n } | null,\n ) => void;\n};\n\n// Navigation context expects a plain object (used for `useParams()` etc),\n// not `null`. For non-dynamic routes there are no params to expose, so we\n// pass an empty object — only the user-visible handler context surfaces\n// `null` for non-dynamic routes.\nconst EMPTY_PARAMS: AppRouteParams = Object.freeze({}) as AppRouteParams;\n\nfunction getCachedAppRouteValue(entry: ISRCacheEntry | null) {\n return entry?.value.value && entry.value.value.kind === \"APP_ROUTE\" ? entry.value.value : null;\n}\n\nexport async function readAppRouteHandlerCacheResponse(\n options: ReadAppRouteHandlerCacheOptions,\n): Promise<Response | null> {\n const routeKey = options.isrRouteKey(options.cleanPathname);\n\n try {\n const cached = await options.isrGet(routeKey);\n const cachedValue = getCachedAppRouteValue(cached);\n\n if (cachedValue && !cached?.isStale) {\n options.isrDebug?.(\"HIT (route)\", options.cleanPathname);\n options.clearRequestContext();\n return applyRouteHandlerMiddlewareContext(\n buildRouteHandlerCachedResponse(cachedValue, {\n cacheState: \"HIT\",\n cacheControl: cached?.value.cacheControl,\n expireSeconds: options.expireSeconds,\n isHead: options.isAutoHead,\n revalidateSeconds: options.revalidateSeconds,\n }),\n options.middlewareContext,\n );\n }\n\n if (cached?.isStale && cachedValue) {\n const staleValue = cachedValue;\n const revalidateSearchParams = new URLSearchParams(options.revalidateSearchParams);\n\n options.scheduleBackgroundRegeneration(routeKey, async () => {\n await options.runInRevalidationContext(async () => {\n options.setNavigationContext({\n pathname: options.cleanPathname,\n searchParams: revalidateSearchParams,\n params: options.params ?? EMPTY_PARAMS,\n });\n\n const { dynamicUsedInHandler, response } = await runAppRouteHandler({\n basePath: options.basePath,\n consumeDynamicUsage: options.consumeDynamicUsage,\n dynamicConfig: options.dynamicConfig,\n handlerFn: options.handlerFn,\n i18n: options.i18n,\n markDynamicUsage: options.markDynamicUsage,\n params: options.params === null ? null : makeThenableParams(options.params),\n request: new Request(options.requestUrl, { method: \"GET\" }),\n routePattern: options.routePattern,\n setHeadersAccessPhase: options.setHeadersAccessPhase,\n });\n\n options.setNavigationContext(null);\n assertSupportedAppRouteHandlerResponse(response);\n\n if (dynamicUsedInHandler) {\n markKnownDynamicAppRoute(options.routePattern);\n options.isrDebug?.(\"route regen skipped (dynamic usage)\", options.cleanPathname);\n return;\n }\n\n const routeTags = options.buildPageCacheTags(\n options.cleanPathname,\n options.getCollectedFetchTags(),\n );\n const routeCacheValue = await buildAppRouteCacheValue(response);\n await options.isrSet(\n routeKey,\n routeCacheValue,\n options.revalidateSeconds,\n routeTags,\n options.expireSeconds,\n );\n options.isrDebug?.(\"route regen complete\", routeKey);\n });\n });\n\n options.isrDebug?.(\"STALE (route)\", options.cleanPathname);\n options.clearRequestContext();\n return applyRouteHandlerMiddlewareContext(\n buildRouteHandlerCachedResponse(staleValue, {\n cacheState: \"STALE\",\n cacheControl: cached.value.cacheControl,\n expireSeconds: options.expireSeconds,\n isHead: options.isAutoHead,\n revalidateSeconds: options.revalidateSeconds,\n }),\n options.middlewareContext,\n );\n }\n } catch (routeCacheError) {\n console.error(\"[vinext] ISR route cache read error:\", routeCacheError);\n }\n\n return null;\n}\n"],"mappings":";;;;;AAkEA,MAAM,eAA+B,OAAO,OAAO,EAAE,CAAC;AAEtD,SAAS,uBAAuB,OAA6B;CAC3D,OAAO,OAAO,MAAM,SAAS,MAAM,MAAM,MAAM,SAAS,cAAc,MAAM,MAAM,QAAQ;;AAG5F,eAAsB,iCACpB,SAC0B;CAC1B,MAAM,WAAW,QAAQ,YAAY,QAAQ,cAAc;CAE3D,IAAI;EACF,MAAM,SAAS,MAAM,QAAQ,OAAO,SAAS;EAC7C,MAAM,cAAc,uBAAuB,OAAO;EAElD,IAAI,eAAe,CAAC,QAAQ,SAAS;GACnC,QAAQ,WAAW,eAAe,QAAQ,cAAc;GACxD,QAAQ,qBAAqB;GAC7B,OAAO,mCACL,gCAAgC,aAAa;IAC3C,YAAY;IACZ,cAAc,QAAQ,MAAM;IAC5B,eAAe,QAAQ;IACvB,QAAQ,QAAQ;IAChB,mBAAmB,QAAQ;IAC5B,CAAC,EACF,QAAQ,kBACT;;EAGH,IAAI,QAAQ,WAAW,aAAa;GAClC,MAAM,aAAa;GACnB,MAAM,yBAAyB,IAAI,gBAAgB,QAAQ,uBAAuB;GAElF,QAAQ,+BAA+B,UAAU,YAAY;IAC3D,MAAM,QAAQ,yBAAyB,YAAY;KACjD,QAAQ,qBAAqB;MAC3B,UAAU,QAAQ;MAClB,cAAc;MACd,QAAQ,QAAQ,UAAU;MAC3B,CAAC;KAEF,MAAM,EAAE,sBAAsB,aAAa,MAAM,mBAAmB;MAClE,UAAU,QAAQ;MAClB,qBAAqB,QAAQ;MAC7B,eAAe,QAAQ;MACvB,WAAW,QAAQ;MACnB,MAAM,QAAQ;MACd,kBAAkB,QAAQ;MAC1B,QAAQ,QAAQ,WAAW,OAAO,OAAO,mBAAmB,QAAQ,OAAO;MAC3E,SAAS,IAAI,QAAQ,QAAQ,YAAY,EAAE,QAAQ,OAAO,CAAC;MAC3D,cAAc,QAAQ;MACtB,uBAAuB,QAAQ;MAChC,CAAC;KAEF,QAAQ,qBAAqB,KAAK;KAClC,uCAAuC,SAAS;KAEhD,IAAI,sBAAsB;MACxB,yBAAyB,QAAQ,aAAa;MAC9C,QAAQ,WAAW,uCAAuC,QAAQ,cAAc;MAChF;;KAGF,MAAM,YAAY,QAAQ,mBACxB,QAAQ,eACR,QAAQ,uBAAuB,CAChC;KACD,MAAM,kBAAkB,MAAM,wBAAwB,SAAS;KAC/D,MAAM,QAAQ,OACZ,UACA,iBACA,QAAQ,mBACR,WACA,QAAQ,cACT;KACD,QAAQ,WAAW,wBAAwB,SAAS;MACpD;KACF;GAEF,QAAQ,WAAW,iBAAiB,QAAQ,cAAc;GAC1D,QAAQ,qBAAqB;GAC7B,OAAO,mCACL,gCAAgC,YAAY;IAC1C,YAAY;IACZ,cAAc,OAAO,MAAM;IAC3B,eAAe,QAAQ;IACvB,QAAQ,QAAQ;IAChB,mBAAmB,QAAQ;IAC5B,CAAC,EACF,QAAQ,kBACT;;UAEI,iBAAiB;EACxB,QAAQ,MAAM,wCAAwC,gBAAgB;;CAGxE,OAAO"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"app-route-handler-dispatch.js","names":[],"sources":["../../src/server/app-route-handler-dispatch.ts"],"sourcesContent":["import type { NextI18nConfig } from \"../config/next-config.js\";\nimport {\n getCollectedFetchTags,\n ensureFetchPatch,\n setCurrentFetchSoftTags,\n} from \"vinext/shims/fetch-cache\";\nimport {\n consumeDynamicUsage,\n getAndClearPendingCookies,\n getDraftModeCookieHeader,\n markDynamicUsage,\n setHeadersAccessPhase,\n} from \"vinext/shims/headers\";\nimport { setNavigationContext } from \"vinext/shims/navigation\";\nimport { getRequestExecutionContext } from \"vinext/shims/request-context\";\nimport { createRequestContext, runWithRequestContext } from \"vinext/shims/unified-request-context\";\nimport type { ISRCacheEntry } from \"./isr-cache.js\";\nimport {\n getAppRouteHandlerRevalidateSeconds,\n hasAppRouteHandlerDefaultExport,\n resolveAppRouteHandlerMethod,\n shouldReadAppRouteHandlerCache,\n type AppRouteHandlerModule,\n} from \"./app-route-handler-policy.js\";\nimport { readAppRouteHandlerCacheResponse } from \"./app-route-handler-cache.js\";\nimport {\n executeAppRouteHandler,\n type AppRouteDebugLogger,\n type AppRouteHandlerFunction,\n type AppRouteParams,\n type RouteHandlerCacheSetter,\n} from \"./app-route-handler-execution.js\";\nimport { isKnownDynamicAppRoute, isValidHTTPMethod } from \"./app-route-handler-runtime.js\";\nimport {\n applyRouteHandlerMiddlewareContext,\n type RouteHandlerMiddlewareContext,\n} from \"./app-route-handler-response.js\";\nimport { createStaticGenerationHeadersContext } from \"./app-static-generation.js\";\nimport { buildPageCacheTags } from \"./implicit-tags.js\";\nimport { makeThenableParams } from \"vinext/shims/thenable-params\";\nimport { reportRequestError } from \"./instrumentation.js\";\n\ntype AppRouteHandlerDispatchRoute = {\n pattern: string;\n routeHandler: AppRouteHandlerModule;\n routeSegments: string[];\n};\n\ntype RouteHandlerCacheGetter = (key: string) => Promise<ISRCacheEntry | null>;\ntype RouteHandlerBackgroundRegenerationErrorContext = {\n routerKind: \"App Router\";\n routePath: string;\n routeType: \"route\";\n};\ntype RouteHandlerBackgroundRegenerator = (\n key: string,\n renderFn: () => Promise<void>,\n errorContext?: RouteHandlerBackgroundRegenerationErrorContext,\n) => void;\n\ntype DispatchAppRouteHandlerOptions = {\n basePath?: string;\n cleanPathname: string;\n clearRequestContext: () => void;\n draftModeSecret: string;\n expireSeconds?: number;\n i18n?: NextI18nConfig | null;\n isDevelopment?: boolean;\n isProduction?: boolean;\n isrDebug?: AppRouteDebugLogger;\n isrGet: RouteHandlerCacheGetter;\n isrRouteKey: (pathname: string) => string;\n isrSet: RouteHandlerCacheSetter;\n middlewareContext: RouteHandlerMiddlewareContext;\n middlewareRequestHeaders?: Headers | null;\n /**\n * `null` for non-dynamic routes, matching Next.js semantics. The dispatch\n * layer threads this through to the handler context unchanged so user code\n * (`params ? await params : null`) resolves to `null`.\n */\n params: AppRouteParams | null;\n request: Request;\n route: AppRouteHandlerDispatchRoute;\n scheduleBackgroundRegeneration: RouteHandlerBackgroundRegenerator;\n searchParams: URLSearchParams;\n};\n\nfunction isAppRouteHandlerFunction(value: unknown): value is AppRouteHandlerFunction {\n return typeof value === \"function\";\n}\n\nfunction buildRouteHandlerPageCacheTags(\n pathname: string,\n extraTags: string[],\n routeSegments: string[],\n): string[] {\n return buildPageCacheTags(pathname, extraTags, routeSegments, \"route\");\n}\n\nasync function runInRouteHandlerRevalidationContext(\n options: {\n cleanPathname: string;\n draftModeSecret: string;\n dynamicConfig?: string;\n routePattern: string;\n routeSegments: string[];\n },\n renderFn: () => Promise<void>,\n): Promise<void> {\n const headersContext = createStaticGenerationHeadersContext({\n draftModeSecret: options.draftModeSecret,\n dynamicConfig: options.dynamicConfig,\n routeKind: \"route\",\n routePattern: options.routePattern,\n });\n const requestContext = createRequestContext({\n headersContext,\n executionContext: getRequestExecutionContext(),\n unstableCacheRevalidation: \"foreground\",\n });\n\n await runWithRequestContext(requestContext, async () => {\n ensureFetchPatch();\n setCurrentFetchSoftTags(\n buildRouteHandlerPageCacheTags(options.cleanPathname, [], options.routeSegments),\n );\n await renderFn();\n });\n}\n\nexport async function dispatchAppRouteHandler(\n options: DispatchAppRouteHandlerOptions,\n): Promise<Response> {\n const { route } = options;\n const handler = route.routeHandler;\n const method = options.request.method.toUpperCase();\n const revalidateSeconds = getAppRouteHandlerRevalidateSeconds(handler);\n const isDevelopment = options.isDevelopment ?? process.env.NODE_ENV === \"development\";\n const isProduction = options.isProduction ?? process.env.NODE_ENV === \"production\";\n\n if (hasAppRouteHandlerDefaultExport(handler) && isDevelopment) {\n console.error(\n \"[vinext] Detected default export in route handler \" +\n route.pattern +\n \". Export a named export for each HTTP method instead.\",\n );\n }\n\n // Reject non-standard HTTP methods before any auto-OPTIONS/405 logic.\n // Next.js returns 400 for invalid methods; vinext mirrors that behavior.\n // https://github.com/vercel/next.js/blob/canary/packages/next/src/server/route-modules/app-route/module.ts#L390-L392\n if (!isValidHTTPMethod(method)) {\n options.clearRequestContext();\n return applyRouteHandlerMiddlewareContext(\n new Response(null, { status: 400 }),\n options.middlewareContext,\n );\n }\n\n const { allowHeaderForOptions, handlerFn, isAutoHead, shouldAutoRespondToOptions } =\n resolveAppRouteHandlerMethod(handler, method);\n\n if (shouldAutoRespondToOptions) {\n options.clearRequestContext();\n return applyRouteHandlerMiddlewareContext(\n new Response(null, {\n status: 204,\n headers: { Allow: allowHeaderForOptions },\n }),\n options.middlewareContext,\n );\n }\n\n const resolvedHandlerFn = isAppRouteHandlerFunction(handlerFn) ? handlerFn : undefined;\n\n if (\n revalidateSeconds !== null &&\n shouldReadAppRouteHandlerCache({\n dynamicConfig: handler.dynamic,\n handlerFn: resolvedHandlerFn,\n isAutoHead,\n isKnownDynamic: isKnownDynamicAppRoute(route.pattern),\n isProduction,\n method,\n revalidateSeconds,\n }) &&\n resolvedHandlerFn\n ) {\n const cachedRouteResponse = await readAppRouteHandlerCacheResponse({\n basePath: options.basePath,\n buildPageCacheTags(pathname, extraTags) {\n return buildRouteHandlerPageCacheTags(pathname, extraTags, route.routeSegments);\n },\n cleanPathname: options.cleanPathname,\n clearRequestContext: options.clearRequestContext,\n consumeDynamicUsage,\n dynamicConfig: handler.dynamic,\n getCollectedFetchTags,\n handlerFn: resolvedHandlerFn,\n i18n: options.i18n,\n isAutoHead,\n isrDebug: options.isrDebug,\n isrGet: options.isrGet,\n isrRouteKey: options.isrRouteKey,\n isrSet: options.isrSet,\n markDynamicUsage,\n middlewareContext: options.middlewareContext,\n params: options.params,\n requestUrl: options.request.url,\n revalidateSearchParams: options.searchParams,\n expireSeconds: options.expireSeconds,\n revalidateSeconds,\n routePattern: route.pattern,\n runInRevalidationContext(renderFn) {\n return runInRouteHandlerRevalidationContext(\n {\n cleanPathname: options.cleanPathname,\n draftModeSecret: options.draftModeSecret,\n dynamicConfig: handler.dynamic,\n routePattern: route.pattern,\n routeSegments: route.routeSegments,\n },\n renderFn,\n );\n },\n scheduleBackgroundRegeneration(key, renderFn) {\n options.scheduleBackgroundRegeneration(key, renderFn, {\n routerKind: \"App Router\",\n routePath: route.pattern,\n routeType: \"route\",\n });\n },\n setHeadersAccessPhase,\n setNavigationContext,\n });\n if (cachedRouteResponse) {\n return cachedRouteResponse;\n }\n }\n\n if (resolvedHandlerFn) {\n return executeAppRouteHandler({\n basePath: options.basePath,\n buildPageCacheTags(pathname, extraTags) {\n return buildRouteHandlerPageCacheTags(pathname, extraTags, route.routeSegments);\n },\n cleanPathname: options.cleanPathname,\n clearRequestContext: options.clearRequestContext,\n consumeDynamicUsage,\n draftModeSecret: options.draftModeSecret,\n executionContext: getRequestExecutionContext(),\n getAndClearPendingCookies,\n getCollectedFetchTags,\n getDraftModeCookieHeader,\n handler,\n handlerFn: resolvedHandlerFn,\n i18n: options.i18n,\n isAutoHead,\n isProduction,\n isrDebug: options.isrDebug,\n isrRouteKey: options.isrRouteKey,\n isrSet: options.isrSet,\n markDynamicUsage,\n method,\n middlewareContext: options.middlewareContext,\n middlewareRequestHeaders: options.middlewareRequestHeaders,\n params: options.params === null ? null : makeThenableParams(options.params),\n reportRequestError(error, request, context) {\n void reportRequestError(error, request, context);\n },\n request: options.request,\n expireSeconds: options.expireSeconds,\n revalidateSeconds,\n routePattern: route.pattern,\n setHeadersAccessPhase,\n });\n }\n\n options.clearRequestContext();\n return applyRouteHandlerMiddlewareContext(\n new Response(null, {\n status: 405,\n }),\n options.middlewareContext,\n );\n}\n"],"mappings":"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"}
|