vinext 0.0.55 → 0.1.1
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 +51 -15
- package/dist/build/assets-ignore.d.ts +32 -0
- package/dist/build/assets-ignore.js +48 -0
- 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 +42 -3
- package/dist/build/client-build-config.js +86 -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 +306 -24
- package/dist/cli-args.d.ts +1 -2
- package/dist/cli-args.js +0 -2
- package/dist/cli.js +9 -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 +9 -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 +3 -3
- 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 +20 -2
- package/dist/config/config-matchers.js +35 -3
- package/dist/config/dotenv.d.ts +1 -2
- package/dist/config/dotenv.js +0 -2
- package/dist/config/next-config.d.ts +32 -5
- package/dist/config/next-config.js +53 -6
- package/dist/config/tsconfig-paths.d.ts +1 -2
- package/dist/config/tsconfig-paths.js +3 -7
- package/dist/deploy.d.ts +48 -3
- package/dist/deploy.js +180 -415
- 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 +12 -6
- package/dist/entries/app-rsc-entry.js +101 -62
- package/dist/entries/app-rsc-manifest.d.ts +1 -2
- package/dist/entries/app-rsc-manifest.js +40 -9
- 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 +98 -703
- 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 +376 -316
- 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 +2 -2
- package/dist/plugins/import-meta-url.js +187 -33
- 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 +18 -16
- package/dist/plugins/remove-console.d.ts +1 -2
- package/dist/plugins/remove-console.js +0 -2
- package/dist/plugins/require-context.d.ts +6 -0
- package/dist/plugins/require-context.js +184 -0
- 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 +14 -10
- package/dist/routing/app-route-graph.js +146 -35
- 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 +2 -2
- package/dist/routing/route-pattern.js +16 -3
- 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 +4 -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 +1 -2
- package/dist/server/app-browser-action-result.js +0 -2
- 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 +244 -88
- 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 +2 -2
- package/dist/server/app-browser-interception-context.js +15 -4
- package/dist/server/app-browser-mpa-navigation.d.ts +2 -2
- package/dist/server/app-browser-mpa-navigation.js +9 -3
- package/dist/server/app-browser-navigation-controller.d.ts +15 -4
- package/dist/server/app-browser-navigation-controller.js +80 -4
- package/dist/server/app-browser-popstate.d.ts +12 -4
- package/dist/server/app-browser-popstate.js +19 -6
- 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 +31 -4
- package/dist/server/app-browser-state.js +196 -10
- 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 +30 -21
- 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 +62 -2
- package/dist/server/app-history-state.js +176 -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 +15 -2
- package/dist/server/app-layout-param-observation.js +46 -8
- 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 +59 -28
- 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 +25 -5
- package/dist/server/app-page-dispatch.js +122 -25
- package/dist/server/app-page-element-builder.d.ts +4 -2
- package/dist/server/app-page-element-builder.js +31 -21
- 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 +1 -2
- package/dist/server/app-page-params.js +0 -2
- package/dist/server/app-page-probe.d.ts +79 -2
- package/dist/server/app-page-probe.js +89 -9
- 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 +15 -3
- package/dist/server/app-page-render.js +171 -12
- package/dist/server/app-page-request.d.ts +12 -9
- package/dist/server/app-page-request.js +12 -11
- package/dist/server/app-page-response.d.ts +4 -4
- package/dist/server/app-page-response.js +6 -4
- package/dist/server/app-page-route-wiring.d.ts +14 -3
- package/dist/server/app-page-route-wiring.js +65 -12
- 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 +54 -9
- package/dist/server/app-page-stream.js +61 -10
- package/dist/server/app-pages-bridge.d.ts +41 -0
- package/dist/server/app-pages-bridge.js +54 -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 +2 -2
- package/dist/server/app-route-handler-cache.js +1 -2
- package/dist/server/app-route-handler-dispatch.d.ts +2 -2
- package/dist/server/app-route-handler-dispatch.js +2 -2
- package/dist/server/app-route-handler-execution.d.ts +2 -2
- package/dist/server/app-route-handler-execution.js +3 -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 +7 -6
- package/dist/server/app-route-handler-runtime.d.ts +2 -2
- package/dist/server/app-route-handler-runtime.js +3 -4
- 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 +10 -2
- package/dist/server/app-rsc-cache-busting.js +13 -4
- 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 +17 -2
- package/dist/server/app-rsc-handler.js +24 -15
- 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 +20 -2
- package/dist/server/app-rsc-route-matching.js +29 -6
- package/dist/server/app-segment-config.d.ts +4 -2
- package/dist/server/app-segment-config.js +8 -2
- package/dist/server/app-server-action-execution.d.ts +18 -3
- package/dist/server/app-server-action-execution.js +75 -18
- package/dist/server/app-ssr-entry.d.ts +11 -4
- package/dist/server/app-ssr-entry.js +47 -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 +1 -2
- package/dist/server/artifact-compatibility.js +2 -6
- 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 +3 -3
- package/dist/server/client-reuse-manifest.js +6 -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 +3 -4
- package/dist/server/dev-server.js +129 -49
- 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 +1 -2
- package/dist/server/document-initial-head.js +0 -2
- 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 +46 -3
- package/dist/server/isr-cache.js +93 -24
- 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 +6 -6
- 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 +1 -2
- package/dist/server/pages-document-initial-props.js +0 -2
- 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 +11 -2
- package/dist/server/pages-node-compat.js +38 -3
- package/dist/server/pages-page-data.d.ts +17 -10
- package/dist/server/pages-page-data.js +79 -35
- package/dist/server/pages-page-handler.d.ts +97 -0
- package/dist/server/pages-page-handler.js +348 -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 +11 -3
- package/dist/server/pages-page-response.js +16 -5
- package/dist/server/pages-readiness.d.ts +36 -0
- package/dist/server/pages-readiness.js +21 -0
- package/dist/server/pages-request-pipeline.d.ts +99 -0
- package/dist/server/pages-request-pipeline.js +209 -0
- package/dist/server/pages-revalidate.d.ts +15 -0
- package/dist/server/pages-revalidate.js +19 -0
- 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 +8 -6
- package/dist/server/prod-server.js +101 -219
- 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 +1 -2
- package/dist/server/skip-cache-proof.js +0 -2
- package/dist/server/socket-error-backstop.d.ts +19 -2
- package/dist/server/socket-error-backstop.js +77 -6
- 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 +1 -2
- package/dist/server/static-layout-client-reuse-proof.js +0 -2
- 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 +22 -6
- 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 +66 -31
- package/dist/shims/cache.d.ts +48 -7
- package/dist/shims/cache.js +79 -20
- 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 +5 -7
- package/dist/shims/document.js +0 -2
- package/dist/shims/dynamic.d.ts +1 -2
- package/dist/shims/dynamic.js +0 -2
- package/dist/shims/error-boundary.d.ts +32 -18
- package/dist/shims/error-boundary.js +43 -3
- package/dist/shims/error.d.ts +1 -2
- package/dist/shims/error.js +0 -2
- package/dist/shims/fetch-cache.d.ts +14 -2
- package/dist/shims/fetch-cache.js +20 -5
- 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 +2 -2
- package/dist/shims/hash-scroll.js +3 -3
- package/dist/shims/head-state.d.ts +1 -2
- package/dist/shims/head-state.js +0 -2
- package/dist/shims/head.d.ts +1 -2
- package/dist/shims/head.js +0 -2
- 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/link-status-registry.d.ts +43 -0
- package/dist/shims/internal/link-status-registry.js +42 -0
- 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 +1 -2
- package/dist/shims/internal/pages-data-fetch-dedup.js +0 -2
- 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/route-pattern-for-warning.d.ts +27 -0
- package/dist/shims/internal/route-pattern-for-warning.js +40 -0
- 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 +2 -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 +40 -20
- 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 +25 -9
- package/dist/shims/navigation.js +251 -46
- 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 +2 -2
- package/dist/shims/router-state.js +2 -2
- package/dist/shims/router.d.ts +6 -4
- package/dist/shims/router.js +262 -40
- 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 +2 -2
- package/dist/shims/thenable-params.js +107 -12
- package/dist/shims/unified-request-context.d.ts +1 -2
- package/dist/shims/unified-request-context.js +0 -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 +8 -2
- package/dist/utils/client-build-manifest.js +30 -7
- package/dist/utils/client-entry-manifest.d.ts +11 -0
- package/dist/utils/client-entry-manifest.js +29 -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 +0 -2
- 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 +1 -2
- package/dist/utils/vite-version.js +0 -2
- package/package.json +23 -6
- 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/import-meta-url.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-mpa-navigation.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-layout-param-observation.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/document-initial-head.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/static-layout-client-reuse-proof.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-fetch-dedup.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/client-build-manifest.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
- package/dist/utils/vite-version.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"app-page-dispatch.js","names":[],"sources":["../../src/server/app-page-dispatch.ts"],"sourcesContent":["import React, { type ReactNode } from \"react\";\nimport type { ReactFormState } from \"react-dom/client\";\nimport type { ClassificationReason } from \"../build/layout-classification-types.js\";\nimport {\n _consumeRequestScopedCacheLife,\n _peekRequestScopedCacheLife,\n type CachedAppPageValue,\n} from \"vinext/shims/cache\";\nimport type { RootParams } from \"vinext/shims/root-params\";\nimport {\n consumeDynamicUsage,\n consumeInvalidDynamicUsageError,\n consumeRenderRequestApiUsage,\n getAndClearPendingCookies,\n getDraftModeCookieHeader,\n isDraftModeRequest,\n markDynamicUsage,\n peekRenderRequestApiUsage,\n setHeadersContext,\n} from \"vinext/shims/headers\";\nimport { getRequestExecutionContext } from \"vinext/shims/request-context\";\nimport { createRequestContext, runWithRequestContext } from \"vinext/shims/unified-request-context\";\nimport {\n ensureFetchPatch,\n consumeDynamicFetchObservations,\n type FetchCacheMode,\n getCollectedFetchTags,\n peekDynamicFetchObservations,\n runWithFetchDedupe,\n setCurrentFetchCacheMode,\n setCurrentFetchSoftTags,\n} from \"vinext/shims/fetch-cache\";\nimport { AppElementsWire, type AppOutgoingElements } from \"./app-elements.js\";\nimport { readAppPageCacheResponse } from \"./app-page-cache.js\";\nimport {\n resolveAppPageParentHttpAccessBoundary,\n resolveAppPageParentHttpAccessBoundaryModule,\n} from \"./app-page-boundary.js\";\nimport { readStreamAsText } from \"../utils/text-stream.js\";\nimport {\n buildAppPageSpecialErrorResponse,\n resolveAppPageSpecialError,\n teeAppPageRscStreamForCapture,\n type AppPageFontPreload,\n type AppPageSpecialError,\n type LayoutClassificationOptions,\n} from \"./app-page-execution.js\";\nimport { resolveAppPageMethodResponse } from \"./app-page-method.js\";\nimport {\n buildAppPageElement,\n resolveAppPageInterceptionRerenderTarget,\n resolveAppPageIntercept,\n validateAppPageDynamicParams,\n type ValidateAppPageDynamicParamsOptions,\n} from \"./app-page-request.js\";\nimport { renderAppPageLifecycle } from \"./app-page-render.js\";\nimport {\n createAppPageHtmlOutputScope,\n createAppPageRenderObservation,\n createAppPageRscOutputScope,\n} from \"./app-page-render-observation.js\";\nimport {\n mergeMiddlewareResponseHeaders,\n type AppPageMiddlewareContext,\n} from \"./app-page-response.js\";\nimport {\n VINEXT_RSC_CONTENT_TYPE,\n VINEXT_RSC_VARY_HEADER,\n applyRscCompatibilityIdHeader,\n} from \"./app-rsc-cache-busting.js\";\nimport {\n APP_RSC_RENDER_MODE_NAVIGATION,\n shouldSuppressLoadingBoundaries,\n type AppRscRenderMode,\n} from \"./app-rsc-render-mode.js\";\nimport { createAppPageTreePath } from \"./app-page-route-wiring.js\";\nimport type { AppPageSsrHandler } from \"./app-page-stream.js\";\nimport { createStaticGenerationHeadersContext } from \"./app-static-generation.js\";\nimport { buildPageCacheTags } from \"./implicit-tags.js\";\nimport type { ISRCacheEntry } from \"./isr-cache.js\";\n\ntype AppPageParams = Record<string, string | string[]>;\ntype AppPageElement = ReactNode | Readonly<Record<string, ReactNode>>;\ntype AppPageRenderableElement = ReactNode | AppOutgoingElements;\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>;\ntype AppPageCacheGetter = (key: string) => Promise<ISRCacheEntry | null>;\ntype AppPageBackgroundRegenerationErrorContext = {\n routerKind: \"App Router\";\n routePath: string;\n routeType: \"render\";\n};\ntype AppPageBackgroundRegenerator = (\n key: string,\n renderFn: () => Promise<void>,\n errorContext?: AppPageBackgroundRegenerationErrorContext,\n) => void;\n\ntype AppPageDispatchIntercept<TPage = unknown> = {\n interceptLayouts?: readonly AppPageModule[] | null;\n matchedParams: AppPageParams;\n page: TPage;\n slotId?: string | null;\n slotKey: string;\n sourceRouteIndex: number;\n};\n\ntype AppPageDispatchInterceptOptions<TPage = unknown> = {\n interceptionContext: string | null;\n interceptLayouts?: readonly AppPageModule[] | null;\n interceptPage: TPage;\n interceptParams: AppPageParams;\n interceptSlotId?: string | null;\n interceptSlotKey: string;\n interceptSourceMatchedUrl?: string | null;\n};\n\ntype AppPageModule = {\n default?: unknown;\n};\n\ntype AppPageDispatchRoute = {\n __buildTimeClassifications?: LayoutClassificationOptions[\"buildTimeClassifications\"];\n __buildTimeReasons?: LayoutClassificationOptions[\"buildTimeReasons\"];\n error?: AppPageModule | null;\n errors?: readonly (AppPageModule | null | undefined)[];\n forbidden?: AppPageModule | null;\n forbiddens?: readonly (AppPageModule | null | undefined)[];\n isDynamic: boolean;\n layouts: readonly AppPageModule[];\n layoutTreePositions?: readonly number[];\n loading?: AppPageModule | null;\n notFound?: AppPageModule | null;\n notFounds?: readonly (AppPageModule | null | undefined)[];\n params: readonly string[];\n pattern: string;\n routeSegments: readonly string[];\n unauthorized?: AppPageModule | null;\n unauthorizeds?: readonly (AppPageModule | null | undefined)[];\n};\n\nfunction resolveAppPageRouteBoundaryModule(\n route: AppPageDispatchRoute,\n statusCode: number,\n): AppPageModule | null {\n if (statusCode === 403) return route.forbidden ?? null;\n if (statusCode === 401) return route.unauthorized ?? null;\n if (statusCode === 404) return route.notFound ?? null;\n return null;\n}\n\ntype DispatchAppPageOptions<TRoute extends AppPageDispatchRoute> = {\n /** Configured basePath (e.g. \"/blog\"). Used to prefix redirect Locations. */\n basePath?: string;\n /**\n * Allow-list of OpenTelemetry propagation keys (from\n * `experimental.clientTraceMetadata`) to surface as `<meta>` tags in the\n * SSR head. Undefined or empty disables emission entirely.\n */\n clientTraceMetadata?: readonly string[];\n buildPageElement: (\n route: TRoute,\n params: AppPageParams,\n opts: AppPageDispatchInterceptOptions | undefined,\n searchParams: URLSearchParams,\n ) => Promise<AppPageElement>;\n cleanPathname: string;\n clearRequestContext: () => void;\n createRscOnErrorHandler: (pathname: string, routePath: string) => AppPageBoundaryOnError;\n debugClassification?: (layoutId: string, reason: ClassificationReason) => void;\n draftModeSecret: string;\n dynamicConfig?: string;\n dynamicParamsConfig?: boolean;\n fetchCache?: FetchCacheMode | null;\n findIntercept: (pathname: string) => AppPageDispatchIntercept | null;\n formState?: ReactFormState | null;\n actionError?: unknown;\n actionFailed?: boolean;\n generateStaticParams?: ValidateAppPageDynamicParamsOptions[\"generateStaticParams\"];\n getFontLinks: () => string[];\n getFontPreloads: () => AppPageFontPreload[];\n getFontStyles: () => string[];\n getNavigationContext: () => unknown;\n getSourceRoute: (sourceRouteIndex: number) => TRoute | undefined;\n hasGenerateStaticParams: boolean;\n hasPageDefaultExport: boolean;\n hasPageModule: boolean;\n handlerStart: number;\n interceptionContext: string | null;\n isEdgeRuntime?: boolean;\n isProgressiveActionRender?: boolean;\n isProduction: boolean;\n isRscRequest: boolean;\n isrDebug?: AppPageDebugLogger;\n isrGet: AppPageCacheGetter;\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 loadSsrHandler: () => Promise<AppPageSsrHandler>;\n middlewareContext: AppPageMiddlewareContext;\n mountedSlotsHeader?: string | null;\n params: AppPageParams;\n staticParamsValidationParams?: AppPageParams;\n rootParams?: RootParams;\n probeLayoutAt: (layoutIndex: number) => unknown;\n probePage: () => unknown;\n expireSeconds?: number;\n renderErrorBoundaryPage: (error: unknown) => Promise<Response | null>;\n renderHttpAccessFallbackPage: (\n statusCode: number,\n opts: {\n boundaryComponent?: unknown;\n layouts?: readonly AppPageModule[];\n matchedParams: AppPageParams;\n },\n middlewareContext: AppPageMiddlewareContext | null,\n ) => Promise<Response | null>;\n renderToReadableStream: (\n element: AppPageRenderableElement,\n options: { onError: AppPageBoundaryOnError },\n ) => ReadableStream<Uint8Array>;\n request: Request;\n revalidateSeconds: number | null;\n resolveRouteFetchCacheMode?: (route: TRoute) => FetchCacheMode | null;\n rootForbiddenModule?: AppPageModule | null;\n rootNotFoundModule?: AppPageModule | null;\n rootUnauthorizedModule?: AppPageModule | null;\n route: TRoute;\n runWithSuppressedHookWarning<T>(probe: () => Promise<T>): Promise<T>;\n scheduleBackgroundRegeneration: AppPageBackgroundRegenerator;\n scriptNonce?: string;\n searchParams: URLSearchParams;\n setNavigationContext: (context: {\n params: AppPageParams;\n pathname: string;\n searchParams: URLSearchParams;\n }) => void;\n renderMode?: AppRscRenderMode;\n};\n\nfunction shouldReadAppPageCache(options: {\n isProgressiveActionRender: boolean;\n isDraftMode: boolean;\n isForceDynamic: boolean;\n isProduction: boolean;\n isRscRequest: boolean;\n revalidateSeconds: number | null;\n scriptNonce?: string;\n}): boolean {\n return (\n options.isProduction &&\n !options.isProgressiveActionRender &&\n !options.isDraftMode &&\n !options.isForceDynamic &&\n (options.isRscRequest || !options.scriptNonce) &&\n (options.revalidateSeconds === null || options.revalidateSeconds > 0)\n );\n}\n\nfunction buildAppPageTags(\n cleanPathname: string,\n extraTags: string[],\n routeSegments: readonly string[],\n): string[] {\n return buildPageCacheTags(cleanPathname, extraTags, [...routeSegments], \"page\");\n}\n\nasync function runAppPageRevalidationContext<\n TResult extends {\n html: string;\n rscData: ArrayBuffer;\n tags: string[];\n },\n>(\n options: {\n cleanPathname: string;\n currentFetchCacheMode?: FetchCacheMode | null;\n draftModeSecret: string;\n dynamicConfig?: string;\n params: AppPageParams;\n routePattern: string;\n routeSegments: readonly string[];\n setNavigationContext: DispatchAppPageOptions<AppPageDispatchRoute>[\"setNavigationContext\"];\n },\n renderFn: () => Promise<TResult>,\n): Promise<TResult> {\n const headersContext = createStaticGenerationHeadersContext({\n draftModeSecret: options.draftModeSecret,\n dynamicConfig: options.dynamicConfig,\n routeKind: \"page\",\n routePattern: options.routePattern,\n });\n const requestContext = createRequestContext({\n headersContext,\n currentFetchCacheMode: options.currentFetchCacheMode ?? null,\n executionContext: getRequestExecutionContext(),\n unstableCacheRevalidation: \"foreground\",\n });\n\n return runWithRequestContext(requestContext, async () => {\n ensureFetchPatch();\n setCurrentFetchSoftTags(buildAppPageTags(options.cleanPathname, [], options.routeSegments));\n options.setNavigationContext({\n pathname: options.cleanPathname,\n searchParams: new URLSearchParams(),\n params: options.params,\n });\n return await runWithFetchDedupe(renderFn);\n });\n}\n\nfunction getCapturedRscDataPromise(\n capturedRscDataPromise: Promise<ArrayBuffer> | null,\n): Promise<ArrayBuffer> {\n if (!capturedRscDataPromise) {\n throw new Error(\n \"[vinext] Expected captured RSC data while regenerating an app page cache entry\",\n );\n }\n\n return capturedRscDataPromise;\n}\n\nfunction toInterceptOptions(\n interceptionContext: string | null,\n intercept: AppPageDispatchIntercept,\n): AppPageDispatchInterceptOptions {\n return {\n interceptionContext,\n interceptLayouts: intercept.interceptLayouts,\n interceptPage: intercept.page,\n interceptParams: intercept.matchedParams,\n interceptSlotId: intercept.slotId ?? null,\n interceptSlotKey: intercept.slotKey,\n interceptSourceMatchedUrl: interceptionContext,\n };\n}\n\nexport async function dispatchAppPage<TRoute extends AppPageDispatchRoute>(\n options: DispatchAppPageOptions<TRoute>,\n): Promise<Response> {\n return await runWithFetchDedupe(() => dispatchAppPageInner(options));\n}\n\nasync function dispatchAppPageInner<TRoute extends AppPageDispatchRoute>(\n options: DispatchAppPageOptions<TRoute>,\n): Promise<Response> {\n const route = options.route;\n const dynamicConfig = options.dynamicConfig;\n const currentRevalidateSeconds = options.revalidateSeconds;\n const isForceStatic = dynamicConfig === \"force-static\";\n const isDynamicError = dynamicConfig === \"error\";\n const isForceDynamic = dynamicConfig === \"force-dynamic\";\n const isDraftMode = isDraftModeRequest(options.request, options.draftModeSecret);\n\n setCurrentFetchSoftTags(buildAppPageTags(options.cleanPathname, [], route.routeSegments));\n setCurrentFetchCacheMode(options.fetchCache ?? null);\n\n if (options.hasPageModule && !options.hasPageDefaultExport) {\n options.clearRequestContext();\n return new Response(\"Page has no default export\", { status: 500 });\n }\n\n const methodResponse = resolveAppPageMethodResponse({\n dynamicConfig,\n hasGenerateStaticParams: options.hasGenerateStaticParams,\n isDynamicRoute: route.isDynamic,\n middlewareHeaders: options.middlewareContext.headers,\n request: options.request,\n revalidateSeconds: currentRevalidateSeconds,\n });\n if (methodResponse) {\n options.clearRequestContext();\n return methodResponse;\n }\n\n if ((isForceStatic || isDynamicError) && !isDraftMode) {\n setHeadersContext(\n createStaticGenerationHeadersContext({\n draftModeSecret: options.draftModeSecret,\n dynamicConfig,\n routeKind: \"page\",\n routePattern: route.pattern,\n }),\n );\n options.setNavigationContext({\n pathname: options.cleanPathname,\n searchParams: new URLSearchParams(),\n params: options.params,\n });\n }\n\n if (\n shouldReadAppPageCache({\n isDraftMode,\n isForceDynamic,\n isProgressiveActionRender: options.isProgressiveActionRender === true,\n isProduction: options.isProduction,\n isRscRequest: options.isRscRequest,\n revalidateSeconds: currentRevalidateSeconds,\n scriptNonce: options.scriptNonce,\n })\n ) {\n const cachedPageResponse = await readAppPageCacheResponse({\n cleanPathname: options.cleanPathname,\n clearRequestContext: options.clearRequestContext,\n isEdgeRuntime: options.isEdgeRuntime,\n isRscRequest: options.isRscRequest,\n isrDebug: options.isrDebug,\n isrGet: options.isrGet,\n isrHtmlKey: options.isrHtmlKey,\n isrRscKey: options.isrRscKey,\n isrSet: options.isrSet,\n interceptionContext: options.interceptionContext,\n middlewareHeaders: options.middlewareContext.headers,\n middlewareStatus: options.middlewareContext.status,\n mountedSlotsHeader: options.mountedSlotsHeader,\n renderMode: options.renderMode,\n expireSeconds: options.expireSeconds,\n // cacheLife-only routes discover their actual revalidate during the\n // fresh render; this seed only gets them into the cache read path.\n revalidateSeconds: currentRevalidateSeconds ?? 0,\n renderFreshPageForCache: async () => {\n const revalidationTarget = resolveAppPageInterceptionRerenderTarget({\n cleanPathname: options.cleanPathname,\n currentParams: options.params,\n currentRoute: route,\n findIntercept: options.findIntercept,\n getRouteParamNames(sourceRoute) {\n return sourceRoute.params;\n },\n getSourceRoute(sourceRouteIndex) {\n return options.getSourceRoute(sourceRouteIndex);\n },\n isRscRequest: options.isRscRequest,\n toInterceptOpts(intercept) {\n return toInterceptOptions(options.interceptionContext, intercept);\n },\n });\n\n return runAppPageRevalidationContext(\n {\n cleanPathname: options.cleanPathname,\n currentFetchCacheMode:\n options.resolveRouteFetchCacheMode?.(revalidationTarget.route) ??\n (revalidationTarget.route === route ? (options.fetchCache ?? null) : null),\n draftModeSecret: options.draftModeSecret,\n dynamicConfig,\n params: revalidationTarget.navigationParams,\n routePattern: revalidationTarget.route.pattern,\n routeSegments: revalidationTarget.route.routeSegments,\n setNavigationContext: options.setNavigationContext,\n },\n async () => {\n const revalidatedElement = await options.buildPageElement(\n revalidationTarget.route,\n revalidationTarget.params,\n revalidationTarget.interceptOpts,\n new URLSearchParams(),\n );\n const revalidatedOnError = options.createRscOnErrorHandler(\n options.cleanPathname,\n revalidationTarget.route.pattern,\n );\n // No inner runWithFetchDedupe here: this renderFn is already\n // wrapped in runWithFetchDedupe by runAppPageRevalidationContext.\n const revalidatedRscStream = options.renderToReadableStream(revalidatedElement, {\n onError: revalidatedOnError,\n });\n const revalidatedRscCapture = teeAppPageRscStreamForCapture(revalidatedRscStream, true);\n const revalidatedSsrEntry = await options.loadSsrHandler();\n const revalidatedCapturedRscRef: { value: Promise<ArrayBuffer> | null } = {\n value: null,\n };\n const revalidatedHtmlStream = await revalidatedSsrEntry.handleSsr(\n revalidatedRscCapture.ssrStream,\n options.getNavigationContext(),\n {\n links: options.getFontLinks(),\n styles: options.getFontStyles(),\n preloads: options.getFontPreloads(),\n },\n {\n basePath: options.basePath,\n clientTraceMetadata: options.clientTraceMetadata,\n rootParams: options.rootParams,\n ...(revalidatedRscCapture.sideStream\n ? {\n sideStream: revalidatedRscCapture.sideStream,\n capturedRscDataRef: revalidatedCapturedRscRef,\n }\n : {}),\n },\n );\n const html = await readStreamAsText(revalidatedHtmlStream);\n const rscData = await getCapturedRscDataPromise(revalidatedCapturedRscRef.value);\n const cacheLife = _consumeRequestScopedCacheLife();\n options.clearRequestContext();\n const tags = buildAppPageTags(\n options.cleanPathname,\n getCollectedFetchTags(),\n revalidationTarget.route.routeSegments,\n );\n // Consume once: HTML and RSC artifacts are produced by the same\n // regeneration render and should carry the same observation set.\n const observationState = {\n dynamicFetches: consumeDynamicFetchObservations(),\n requestApis: consumeRenderRequestApiUsage(),\n };\n return {\n html,\n htmlRenderObservation: createAppPageRenderObservation({\n boundaryOutcome: { kind: \"success\" },\n cacheability: \"public\",\n cacheTags: tags,\n cleanPathname: options.cleanPathname,\n completeness: \"complete\",\n output: createAppPageHtmlOutputScope({\n element: revalidatedElement,\n renderEpoch: null,\n rootBoundaryId: null,\n routePattern: revalidationTarget.route.pattern,\n }),\n params: revalidationTarget.navigationParams,\n state: observationState,\n }),\n rscData,\n rscRenderObservation: createAppPageRenderObservation({\n boundaryOutcome: { kind: \"success\" },\n cacheability: \"public\",\n cacheTags: tags,\n cleanPathname: options.cleanPathname,\n completeness: \"complete\",\n output: createAppPageRscOutputScope({\n element: revalidatedElement,\n mountedSlotsHeader: options.mountedSlotsHeader,\n renderEpoch: null,\n rootBoundaryId: null,\n routePattern: revalidationTarget.route.pattern,\n }),\n params: revalidationTarget.navigationParams,\n state: observationState,\n }),\n tags,\n cacheControl:\n typeof cacheLife?.revalidate === \"number\"\n ? { revalidate: cacheLife.revalidate, expire: cacheLife.expire }\n : undefined,\n };\n },\n );\n },\n scheduleBackgroundRegeneration(key, renderFn) {\n options.scheduleBackgroundRegeneration(key, renderFn, {\n routerKind: \"App Router\",\n routePath: route.pattern,\n routeType: \"render\",\n });\n },\n });\n if (cachedPageResponse) {\n return cachedPageResponse;\n }\n }\n\n const dynamicParamsResponse = await validateAppPageDynamicParams({\n clearRequestContext: options.clearRequestContext,\n enforceStaticParamsOnly: options.dynamicParamsConfig === false,\n generateStaticParams: options.generateStaticParams,\n isDynamicRoute: route.isDynamic,\n params: options.staticParamsValidationParams ?? options.params,\n });\n if (dynamicParamsResponse) {\n return dynamicParamsResponse;\n }\n\n const interceptResult = await resolveAppPageIntercept<\n TRoute,\n unknown,\n AppPageDispatchInterceptOptions,\n AppPageElement\n >({\n buildPageElement(interceptRoute, interceptParams, interceptOpts, interceptSearchParams) {\n setCurrentFetchCacheMode(options.resolveRouteFetchCacheMode?.(interceptRoute) ?? null);\n return options.buildPageElement(\n interceptRoute,\n interceptParams,\n interceptOpts,\n interceptSearchParams,\n );\n },\n cleanPathname: options.cleanPathname,\n currentRoute: route,\n findIntercept(pathname) {\n return options.findIntercept(pathname);\n },\n getRouteParamNames(sourceRoute) {\n return sourceRoute.params;\n },\n getSourceRoute(sourceRouteIndex) {\n return options.getSourceRoute(sourceRouteIndex);\n },\n isRscRequest: options.isRscRequest,\n renderInterceptResponse(sourceRoute, interceptElement) {\n const interceptOnError = options.createRscOnErrorHandler(\n options.cleanPathname,\n sourceRoute.pattern,\n );\n // No inner runWithFetchDedupe here: dispatchAppPage already activated\n // dedupe at line 294, and this callback runs inside dispatchAppPageInner.\n const interceptStream = options.renderToReadableStream(interceptElement, {\n onError: interceptOnError,\n });\n const interceptHeaders = new Headers({\n \"Content-Type\": VINEXT_RSC_CONTENT_TYPE,\n Vary: VINEXT_RSC_VARY_HEADER,\n });\n mergeMiddlewareResponseHeaders(interceptHeaders, options.middlewareContext.headers);\n applyRscCompatibilityIdHeader(interceptHeaders);\n return new Response(interceptStream, {\n status: options.middlewareContext.status ?? 200,\n headers: interceptHeaders,\n });\n },\n searchParams: options.searchParams,\n setNavigationContext: options.setNavigationContext,\n toInterceptOpts(intercept) {\n return toInterceptOptions(options.interceptionContext, intercept);\n },\n });\n if (interceptResult.response) {\n return interceptResult.response;\n }\n\n const pageBuildResult = await buildAppPageElement({\n buildPageElement() {\n if (options.actionFailed) {\n throw options.actionError;\n }\n return options.buildPageElement(\n route,\n options.params,\n interceptResult.interceptOpts,\n options.searchParams,\n );\n },\n renderErrorBoundaryPage(buildError) {\n return options.renderErrorBoundaryPage(buildError);\n },\n renderSpecialError(specialError) {\n return renderPageSpecialError(options, specialError);\n },\n resolveSpecialError: resolveAppPageSpecialError,\n });\n if (pageBuildResult.response) {\n return pageBuildResult.response;\n }\n\n return renderAppPageLifecycle({\n basePath: options.basePath,\n clientTraceMetadata: options.clientTraceMetadata,\n cleanPathname: options.cleanPathname,\n clearRequestContext: options.clearRequestContext,\n consumeDynamicUsage,\n consumeInvalidDynamicUsageError,\n consumeRenderObservationState() {\n return {\n dynamicFetches: consumeDynamicFetchObservations(),\n requestApis: consumeRenderRequestApiUsage(),\n };\n },\n createRscOnErrorHandler(pathname, routePath) {\n return options.createRscOnErrorHandler(pathname, routePath);\n },\n element: pageBuildResult.element,\n getDraftModeCookieHeader,\n getFontLinks: options.getFontLinks,\n getFontPreloads: options.getFontPreloads,\n getFontStyles: options.getFontStyles,\n getNavigationContext: options.getNavigationContext,\n getPageTags() {\n return buildAppPageTags(options.cleanPathname, getCollectedFetchTags(), route.routeSegments);\n },\n getRequestCacheLife() {\n return _consumeRequestScopedCacheLife();\n },\n peekRequestCacheLife() {\n return _peekRequestScopedCacheLife();\n },\n handlerStart: options.handlerStart,\n hasLoadingBoundary: shouldSuppressLoadingBoundaries(\n options.renderMode ?? APP_RSC_RENDER_MODE_NAVIGATION,\n )\n ? false\n : Boolean(route.loading?.default),\n formState: options.formState ?? null,\n isProgressiveActionRender: options.isProgressiveActionRender === true,\n isDynamicError,\n isDraftMode,\n isForceDynamic,\n isForceStatic,\n isEdgeRuntime: options.isEdgeRuntime === true,\n isPrerender: process.env.VINEXT_PRERENDER === \"1\",\n isProduction: options.isProduction,\n isRscRequest: options.isRscRequest,\n isrDebug: options.isrDebug,\n isrHtmlKey: options.isrHtmlKey,\n isrRscKey: options.isrRscKey,\n isrSet: options.isrSet,\n interceptionContext: options.interceptionContext,\n expireSeconds: options.expireSeconds,\n layoutCount: route.layouts.length,\n loadSsrHandler: options.loadSsrHandler,\n middlewareContext: options.middlewareContext,\n params: options.params,\n rootParams: options.rootParams,\n peekRenderObservationState() {\n return {\n dynamicFetches: peekDynamicFetchObservations(),\n requestApis: peekRenderRequestApiUsage(),\n };\n },\n probeLayoutAt(layoutIndex) {\n return options.probeLayoutAt(layoutIndex);\n },\n probePage() {\n return options.probePage();\n },\n classification: {\n getLayoutId(index) {\n const treePosition = route.layoutTreePositions?.[index] ?? 0;\n return AppElementsWire.encodeLayoutId(\n createAppPageTreePath([...route.routeSegments], treePosition),\n );\n },\n buildTimeClassifications: route.__buildTimeClassifications,\n buildTimeReasons: route.__buildTimeReasons,\n debugClassification: options.debugClassification,\n async runWithIsolatedDynamicScope(fn) {\n const priorDynamic = consumeDynamicUsage();\n try {\n const result = await fn();\n const dynamicDetected = consumeDynamicUsage();\n return { result, dynamicDetected };\n } finally {\n consumeDynamicUsage();\n if (priorDynamic) markDynamicUsage();\n }\n },\n },\n revalidateSeconds: currentRevalidateSeconds,\n mountedSlotsHeader: options.mountedSlotsHeader,\n renderMode: options.renderMode ?? APP_RSC_RENDER_MODE_NAVIGATION,\n renderErrorBoundaryResponse(renderError) {\n return options.renderErrorBoundaryPage(renderError);\n },\n renderLayoutSpecialError(specialError, layoutIndex) {\n return renderLayoutSpecialError(options, specialError, layoutIndex);\n },\n renderPageSpecialError(specialError) {\n return renderPageSpecialError(options, specialError);\n },\n renderToReadableStream: options.renderToReadableStream,\n routeHasLocalBoundary: Boolean(\n route.error?.default || route.errors?.some((errorModule) => errorModule?.default),\n ),\n routePattern: route.pattern,\n runWithSuppressedHookWarning(probe) {\n return options.runWithSuppressedHookWarning(probe);\n },\n scriptNonce: options.scriptNonce,\n waitUntil(cachePromise) {\n getRequestExecutionContext()?.waitUntil(cachePromise);\n },\n });\n}\n\n/**\n * Builds an RSC flight payload that encodes a redirect as a React error chunk.\n * We render a tiny element that immediately throws an `Error` whose `digest`\n * is the canonical `NEXT_REDIRECT;...` string. `renderToReadableStream`'s\n * `onError` returns that digest, react-server-dom-webpack serializes the\n * error into the stream, and the client's `RedirectErrorBoundary` decodes it\n * via `getURLFromRedirectError` / `getRedirectTypeFromError`.\n *\n * The thrown error's digest matches Next.js's well-known router error format,\n * so neither vinext's RSC error handler nor Next.js's reporter logs it as a\n * \"real\" server error. Mirrors `app-render.tsx generateDynamicFlightRenderResult`\n * where a redirect thrown during RSC rendering propagates through\n * `renderToFlightStream`'s `onError` callback into the flight payload.\n */\nfunction buildRscRedirectFlightStream<TRoute extends AppPageDispatchRoute>(\n options: DispatchAppPageOptions<TRoute>,\n digest: string,\n): ReadableStream<Uint8Array> {\n const throwingElement = React.createElement(function NextRedirectFlightThrower() {\n const err = new Error(\"NEXT_REDIRECT\") as Error & { digest: string };\n err.digest = digest;\n throw err;\n });\n\n return options.renderToReadableStream(throwingElement, {\n onError: () => digest,\n });\n}\n\nasync function renderLayoutSpecialError<TRoute extends AppPageDispatchRoute>(\n options: DispatchAppPageOptions<TRoute>,\n specialError: AppPageSpecialError,\n layoutIndex: number,\n): Promise<Response> {\n return buildAppPageSpecialErrorResponse({\n basePath: options.basePath,\n buildRscRedirectFlightStream: (rscOptions) =>\n buildRscRedirectFlightStream(options, rscOptions.digest),\n clearRequestContext: options.clearRequestContext,\n getAndClearPendingCookies,\n isEdgeRuntime: options.isEdgeRuntime,\n isRscRequest: options.isRscRequest,\n middlewareContext: options.middlewareContext,\n renderFallbackPage(statusCode) {\n const parentBoundary = resolveAppPageParentHttpAccessBoundaryModule({\n layoutIndex,\n rootForbiddenModule: options.rootForbiddenModule,\n rootNotFoundModule: options.rootNotFoundModule,\n rootUnauthorizedModule: options.rootUnauthorizedModule,\n routeForbiddenModules: options.route.forbiddens,\n routeNotFoundModules: options.route.notFounds,\n routeUnauthorizedModules: options.route.unauthorizeds,\n statusCode,\n })?.default;\n return options.renderHttpAccessFallbackPage(\n statusCode,\n {\n boundaryComponent: parentBoundary,\n layouts: options.route.layouts.slice(0, layoutIndex),\n matchedParams: options.params,\n },\n null,\n );\n },\n request: options.request,\n specialError,\n });\n}\n\nasync function renderPageSpecialError<TRoute extends AppPageDispatchRoute>(\n options: DispatchAppPageOptions<TRoute>,\n specialError: AppPageSpecialError,\n): Promise<Response> {\n return buildAppPageSpecialErrorResponse({\n basePath: options.basePath,\n buildRscRedirectFlightStream: (rscOptions) =>\n buildRscRedirectFlightStream(options, rscOptions.digest),\n clearRequestContext: options.clearRequestContext,\n getAndClearPendingCookies,\n isEdgeRuntime: options.isEdgeRuntime,\n isRscRequest: options.isRscRequest,\n middlewareContext: options.middlewareContext,\n renderFallbackPage(statusCode) {\n // `forbidden()` / `unauthorized()` / `notFound()` should be caught by the\n // nearest ancestor boundary. When the page (the deepest segment) calls\n // one of these and an intermediate layout has no matching boundary file,\n // resolve to the closest ancestor layout's boundary and slice off any\n // layouts beneath it so their UI does not render alongside the fallback.\n // Mirrors Next.js's per-segment boundary nesting in\n // `create-component-tree.tsx` (issue #1547).\n //\n // We only narrow layouts when the resolved boundary file lives at a\n // layout's own directory. A `forbidden.tsx` sibling to the route's\n // `page.tsx` (no layout there) wraps just the page subtree in Next.js,\n // so all of the route's layouts must still render.\n const routeBoundaryModule = resolveAppPageRouteBoundaryModule(options.route, statusCode);\n const layoutCount = options.route.layouts.length;\n const { module: parentBoundaryModule, layoutIndex: boundaryLayoutIndex } =\n resolveAppPageParentHttpAccessBoundary({\n layoutIndex: layoutCount,\n rootForbiddenModule: options.rootForbiddenModule,\n rootNotFoundModule: options.rootNotFoundModule,\n rootUnauthorizedModule: options.rootUnauthorizedModule,\n routeForbiddenModules: options.route.forbiddens,\n routeNotFoundModules: options.route.notFounds,\n routeUnauthorizedModules: options.route.unauthorizeds,\n statusCode,\n });\n // If the route-level boundary (closest walking up from page-dir) differs\n // from the per-layout resolution, a non-layout-aligned boundary sits\n // below the deepest layout — keep all layouts and let the existing route\n // boundary handling render it.\n const useLayoutAlignedBoundary =\n boundaryLayoutIndex !== null &&\n (routeBoundaryModule === null || routeBoundaryModule === parentBoundaryModule);\n const boundaryComponent = useLayoutAlignedBoundary\n ? ((parentBoundaryModule as { default?: unknown } | null)?.default ?? undefined)\n : undefined;\n const layoutsForBoundary =\n useLayoutAlignedBoundary && boundaryLayoutIndex !== null\n ? options.route.layouts.slice(0, boundaryLayoutIndex + 1)\n : undefined;\n return options.renderHttpAccessFallbackPage(\n statusCode,\n {\n boundaryComponent,\n layouts: layoutsForBoundary,\n matchedParams: options.params,\n },\n null,\n );\n },\n request: options.request,\n specialError,\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAwJA,SAAS,kCACP,OACA,YACsB;CACtB,IAAI,eAAe,KAAK,OAAO,MAAM,aAAa;CAClD,IAAI,eAAe,KAAK,OAAO,MAAM,gBAAgB;CACrD,IAAI,eAAe,KAAK,OAAO,MAAM,YAAY;CACjD,OAAO;;AAiGT,SAAS,uBAAuB,SAQpB;CACV,OACE,QAAQ,gBACR,CAAC,QAAQ,6BACT,CAAC,QAAQ,eACT,CAAC,QAAQ,mBACR,QAAQ,gBAAgB,CAAC,QAAQ,iBACjC,QAAQ,sBAAsB,QAAQ,QAAQ,oBAAoB;;AAIvE,SAAS,iBACP,eACA,WACA,eACU;CACV,OAAO,mBAAmB,eAAe,WAAW,CAAC,GAAG,cAAc,EAAE,OAAO;;AAGjF,eAAe,8BAOb,SAUA,UACkB;CAclB,OAAO,sBAPgB,qBAAqB;EAC1C,gBAPqB,qCAAqC;GAC1D,iBAAiB,QAAQ;GACzB,eAAe,QAAQ;GACvB,WAAW;GACX,cAAc,QAAQ;GACvB,CAEe;EACd,uBAAuB,QAAQ,yBAAyB;EACxD,kBAAkB,4BAA4B;EAC9C,2BAA2B;EAC5B,CAE0C,EAAE,YAAY;EACvD,kBAAkB;EAClB,wBAAwB,iBAAiB,QAAQ,eAAe,EAAE,EAAE,QAAQ,cAAc,CAAC;EAC3F,QAAQ,qBAAqB;GAC3B,UAAU,QAAQ;GAClB,cAAc,IAAI,iBAAiB;GACnC,QAAQ,QAAQ;GACjB,CAAC;EACF,OAAO,MAAM,mBAAmB,SAAS;GACzC;;AAGJ,SAAS,0BACP,wBACsB;CACtB,IAAI,CAAC,wBACH,MAAM,IAAI,MACR,iFACD;CAGH,OAAO;;AAGT,SAAS,mBACP,qBACA,WACiC;CACjC,OAAO;EACL;EACA,kBAAkB,UAAU;EAC5B,eAAe,UAAU;EACzB,iBAAiB,UAAU;EAC3B,iBAAiB,UAAU,UAAU;EACrC,kBAAkB,UAAU;EAC5B,2BAA2B;EAC5B;;AAGH,eAAsB,gBACpB,SACmB;CACnB,OAAO,MAAM,yBAAyB,qBAAqB,QAAQ,CAAC;;AAGtE,eAAe,qBACb,SACmB;CACnB,MAAM,QAAQ,QAAQ;CACtB,MAAM,gBAAgB,QAAQ;CAC9B,MAAM,2BAA2B,QAAQ;CACzC,MAAM,gBAAgB,kBAAkB;CACxC,MAAM,iBAAiB,kBAAkB;CACzC,MAAM,iBAAiB,kBAAkB;CACzC,MAAM,cAAc,mBAAmB,QAAQ,SAAS,QAAQ,gBAAgB;CAEhF,wBAAwB,iBAAiB,QAAQ,eAAe,EAAE,EAAE,MAAM,cAAc,CAAC;CACzF,yBAAyB,QAAQ,cAAc,KAAK;CAEpD,IAAI,QAAQ,iBAAiB,CAAC,QAAQ,sBAAsB;EAC1D,QAAQ,qBAAqB;EAC7B,OAAO,IAAI,SAAS,8BAA8B,EAAE,QAAQ,KAAK,CAAC;;CAGpE,MAAM,iBAAiB,6BAA6B;EAClD;EACA,yBAAyB,QAAQ;EACjC,gBAAgB,MAAM;EACtB,mBAAmB,QAAQ,kBAAkB;EAC7C,SAAS,QAAQ;EACjB,mBAAmB;EACpB,CAAC;CACF,IAAI,gBAAgB;EAClB,QAAQ,qBAAqB;EAC7B,OAAO;;CAGT,KAAK,iBAAiB,mBAAmB,CAAC,aAAa;EACrD,kBACE,qCAAqC;GACnC,iBAAiB,QAAQ;GACzB;GACA,WAAW;GACX,cAAc,MAAM;GACrB,CAAC,CACH;EACD,QAAQ,qBAAqB;GAC3B,UAAU,QAAQ;GAClB,cAAc,IAAI,iBAAiB;GACnC,QAAQ,QAAQ;GACjB,CAAC;;CAGJ,IACE,uBAAuB;EACrB;EACA;EACA,2BAA2B,QAAQ,8BAA8B;EACjE,cAAc,QAAQ;EACtB,cAAc,QAAQ;EACtB,mBAAmB;EACnB,aAAa,QAAQ;EACtB,CAAC,EACF;EACA,MAAM,qBAAqB,MAAM,yBAAyB;GACxD,eAAe,QAAQ;GACvB,qBAAqB,QAAQ;GAC7B,eAAe,QAAQ;GACvB,cAAc,QAAQ;GACtB,UAAU,QAAQ;GAClB,QAAQ,QAAQ;GAChB,YAAY,QAAQ;GACpB,WAAW,QAAQ;GACnB,QAAQ,QAAQ;GAChB,qBAAqB,QAAQ;GAC7B,mBAAmB,QAAQ,kBAAkB;GAC7C,kBAAkB,QAAQ,kBAAkB;GAC5C,oBAAoB,QAAQ;GAC5B,YAAY,QAAQ;GACpB,eAAe,QAAQ;GAGvB,mBAAmB,4BAA4B;GAC/C,yBAAyB,YAAY;IACnC,MAAM,qBAAqB,yCAAyC;KAClE,eAAe,QAAQ;KACvB,eAAe,QAAQ;KACvB,cAAc;KACd,eAAe,QAAQ;KACvB,mBAAmB,aAAa;MAC9B,OAAO,YAAY;;KAErB,eAAe,kBAAkB;MAC/B,OAAO,QAAQ,eAAe,iBAAiB;;KAEjD,cAAc,QAAQ;KACtB,gBAAgB,WAAW;MACzB,OAAO,mBAAmB,QAAQ,qBAAqB,UAAU;;KAEpE,CAAC;IAEF,OAAO,8BACL;KACE,eAAe,QAAQ;KACvB,uBACE,QAAQ,6BAA6B,mBAAmB,MAAM,KAC7D,mBAAmB,UAAU,QAAS,QAAQ,cAAc,OAAQ;KACvE,iBAAiB,QAAQ;KACzB;KACA,QAAQ,mBAAmB;KAC3B,cAAc,mBAAmB,MAAM;KACvC,eAAe,mBAAmB,MAAM;KACxC,sBAAsB,QAAQ;KAC/B,EACD,YAAY;KACV,MAAM,qBAAqB,MAAM,QAAQ,iBACvC,mBAAmB,OACnB,mBAAmB,QACnB,mBAAmB,eACnB,IAAI,iBAAiB,CACtB;KACD,MAAM,qBAAqB,QAAQ,wBACjC,QAAQ,eACR,mBAAmB,MAAM,QAC1B;KAMD,MAAM,wBAAwB,8BAHD,QAAQ,uBAAuB,oBAAoB,EAC9E,SAAS,oBACV,CAC+E,EAAE,KAAK;KACvF,MAAM,sBAAsB,MAAM,QAAQ,gBAAgB;KAC1D,MAAM,4BAAoE,EACxE,OAAO,MACR;KAqBD,MAAM,OAAO,MAAM,iBAAiB,MApBA,oBAAoB,UACtD,sBAAsB,WACtB,QAAQ,sBAAsB,EAC9B;MACE,OAAO,QAAQ,cAAc;MAC7B,QAAQ,QAAQ,eAAe;MAC/B,UAAU,QAAQ,iBAAiB;MACpC,EACD;MACE,UAAU,QAAQ;MAClB,qBAAqB,QAAQ;MAC7B,YAAY,QAAQ;MACpB,GAAI,sBAAsB,aACtB;OACE,YAAY,sBAAsB;OAClC,oBAAoB;OACrB,GACD,EAAE;MACP,CACF,CACyD;KAC1D,MAAM,UAAU,MAAM,0BAA0B,0BAA0B,MAAM;KAChF,MAAM,YAAY,gCAAgC;KAClD,QAAQ,qBAAqB;KAC7B,MAAM,OAAO,iBACX,QAAQ,eACR,uBAAuB,EACvB,mBAAmB,MAAM,cAC1B;KAGD,MAAM,mBAAmB;MACvB,gBAAgB,iCAAiC;MACjD,aAAa,8BAA8B;MAC5C;KACD,OAAO;MACL;MACA,uBAAuB,+BAA+B;OACpD,iBAAiB,EAAE,MAAM,WAAW;OACpC,cAAc;OACd,WAAW;OACX,eAAe,QAAQ;OACvB,cAAc;OACd,QAAQ,6BAA6B;QACnC,SAAS;QACT,aAAa;QACb,gBAAgB;QAChB,cAAc,mBAAmB,MAAM;QACxC,CAAC;OACF,QAAQ,mBAAmB;OAC3B,OAAO;OACR,CAAC;MACF;MACA,sBAAsB,+BAA+B;OACnD,iBAAiB,EAAE,MAAM,WAAW;OACpC,cAAc;OACd,WAAW;OACX,eAAe,QAAQ;OACvB,cAAc;OACd,QAAQ,4BAA4B;QAClC,SAAS;QACT,oBAAoB,QAAQ;QAC5B,aAAa;QACb,gBAAgB;QAChB,cAAc,mBAAmB,MAAM;QACxC,CAAC;OACF,QAAQ,mBAAmB;OAC3B,OAAO;OACR,CAAC;MACF;MACA,cACE,OAAO,WAAW,eAAe,WAC7B;OAAE,YAAY,UAAU;OAAY,QAAQ,UAAU;OAAQ,GAC9D,KAAA;MACP;MAEJ;;GAEH,+BAA+B,KAAK,UAAU;IAC5C,QAAQ,+BAA+B,KAAK,UAAU;KACpD,YAAY;KACZ,WAAW,MAAM;KACjB,WAAW;KACZ,CAAC;;GAEL,CAAC;EACF,IAAI,oBACF,OAAO;;CAIX,MAAM,wBAAwB,MAAM,6BAA6B;EAC/D,qBAAqB,QAAQ;EAC7B,yBAAyB,QAAQ,wBAAwB;EACzD,sBAAsB,QAAQ;EAC9B,gBAAgB,MAAM;EACtB,QAAQ,QAAQ,gCAAgC,QAAQ;EACzD,CAAC;CACF,IAAI,uBACF,OAAO;CAGT,MAAM,kBAAkB,MAAM,wBAK5B;EACA,iBAAiB,gBAAgB,iBAAiB,eAAe,uBAAuB;GACtF,yBAAyB,QAAQ,6BAA6B,eAAe,IAAI,KAAK;GACtF,OAAO,QAAQ,iBACb,gBACA,iBACA,eACA,sBACD;;EAEH,eAAe,QAAQ;EACvB,cAAc;EACd,cAAc,UAAU;GACtB,OAAO,QAAQ,cAAc,SAAS;;EAExC,mBAAmB,aAAa;GAC9B,OAAO,YAAY;;EAErB,eAAe,kBAAkB;GAC/B,OAAO,QAAQ,eAAe,iBAAiB;;EAEjD,cAAc,QAAQ;EACtB,wBAAwB,aAAa,kBAAkB;GACrD,MAAM,mBAAmB,QAAQ,wBAC/B,QAAQ,eACR,YAAY,QACb;GAGD,MAAM,kBAAkB,QAAQ,uBAAuB,kBAAkB,EACvE,SAAS,kBACV,CAAC;GACF,MAAM,mBAAmB,IAAI,QAAQ;IACnC,gBAAgB;IAChB,MAAM;IACP,CAAC;GACF,+BAA+B,kBAAkB,QAAQ,kBAAkB,QAAQ;GACnF,8BAA8B,iBAAiB;GAC/C,OAAO,IAAI,SAAS,iBAAiB;IACnC,QAAQ,QAAQ,kBAAkB,UAAU;IAC5C,SAAS;IACV,CAAC;;EAEJ,cAAc,QAAQ;EACtB,sBAAsB,QAAQ;EAC9B,gBAAgB,WAAW;GACzB,OAAO,mBAAmB,QAAQ,qBAAqB,UAAU;;EAEpE,CAAC;CACF,IAAI,gBAAgB,UAClB,OAAO,gBAAgB;CAGzB,MAAM,kBAAkB,MAAM,oBAAoB;EAChD,mBAAmB;GACjB,IAAI,QAAQ,cACV,MAAM,QAAQ;GAEhB,OAAO,QAAQ,iBACb,OACA,QAAQ,QACR,gBAAgB,eAChB,QAAQ,aACT;;EAEH,wBAAwB,YAAY;GAClC,OAAO,QAAQ,wBAAwB,WAAW;;EAEpD,mBAAmB,cAAc;GAC/B,OAAO,uBAAuB,SAAS,aAAa;;EAEtD,qBAAqB;EACtB,CAAC;CACF,IAAI,gBAAgB,UAClB,OAAO,gBAAgB;CAGzB,OAAO,uBAAuB;EAC5B,UAAU,QAAQ;EAClB,qBAAqB,QAAQ;EAC7B,eAAe,QAAQ;EACvB,qBAAqB,QAAQ;EAC7B;EACA;EACA,gCAAgC;GAC9B,OAAO;IACL,gBAAgB,iCAAiC;IACjD,aAAa,8BAA8B;IAC5C;;EAEH,wBAAwB,UAAU,WAAW;GAC3C,OAAO,QAAQ,wBAAwB,UAAU,UAAU;;EAE7D,SAAS,gBAAgB;EACzB;EACA,cAAc,QAAQ;EACtB,iBAAiB,QAAQ;EACzB,eAAe,QAAQ;EACvB,sBAAsB,QAAQ;EAC9B,cAAc;GACZ,OAAO,iBAAiB,QAAQ,eAAe,uBAAuB,EAAE,MAAM,cAAc;;EAE9F,sBAAsB;GACpB,OAAO,gCAAgC;;EAEzC,uBAAuB;GACrB,OAAO,6BAA6B;;EAEtC,cAAc,QAAQ;EACtB,oBAAoB,gCAClB,QAAQ,cAAA,aACT,GACG,QACA,QAAQ,MAAM,SAAS,QAAQ;EACnC,WAAW,QAAQ,aAAa;EAChC,2BAA2B,QAAQ,8BAA8B;EACjE;EACA;EACA;EACA;EACA,eAAe,QAAQ,kBAAkB;EACzC,aAAa,QAAQ,IAAI,qBAAqB;EAC9C,cAAc,QAAQ;EACtB,cAAc,QAAQ;EACtB,UAAU,QAAQ;EAClB,YAAY,QAAQ;EACpB,WAAW,QAAQ;EACnB,QAAQ,QAAQ;EAChB,qBAAqB,QAAQ;EAC7B,eAAe,QAAQ;EACvB,aAAa,MAAM,QAAQ;EAC3B,gBAAgB,QAAQ;EACxB,mBAAmB,QAAQ;EAC3B,QAAQ,QAAQ;EAChB,YAAY,QAAQ;EACpB,6BAA6B;GAC3B,OAAO;IACL,gBAAgB,8BAA8B;IAC9C,aAAa,2BAA2B;IACzC;;EAEH,cAAc,aAAa;GACzB,OAAO,QAAQ,cAAc,YAAY;;EAE3C,YAAY;GACV,OAAO,QAAQ,WAAW;;EAE5B,gBAAgB;GACd,YAAY,OAAO;IACjB,MAAM,eAAe,MAAM,sBAAsB,UAAU;IAC3D,OAAO,gBAAgB,eACrB,sBAAsB,CAAC,GAAG,MAAM,cAAc,EAAE,aAAa,CAC9D;;GAEH,0BAA0B,MAAM;GAChC,kBAAkB,MAAM;GACxB,qBAAqB,QAAQ;GAC7B,MAAM,4BAA4B,IAAI;IACpC,MAAM,eAAe,qBAAqB;IAC1C,IAAI;KAGF,OAAO;MAAE,QAAA,MAFY,IAAI;MAER,iBADO,qBACQ;MAAE;cAC1B;KACR,qBAAqB;KACrB,IAAI,cAAc,kBAAkB;;;GAGzC;EACD,mBAAmB;EACnB,oBAAoB,QAAQ;EAC5B,YAAY,QAAQ,cAAA;EACpB,4BAA4B,aAAa;GACvC,OAAO,QAAQ,wBAAwB,YAAY;;EAErD,yBAAyB,cAAc,aAAa;GAClD,OAAO,yBAAyB,SAAS,cAAc,YAAY;;EAErE,uBAAuB,cAAc;GACnC,OAAO,uBAAuB,SAAS,aAAa;;EAEtD,wBAAwB,QAAQ;EAChC,uBAAuB,QACrB,MAAM,OAAO,WAAW,MAAM,QAAQ,MAAM,gBAAgB,aAAa,QAAQ,CAClF;EACD,cAAc,MAAM;EACpB,6BAA6B,OAAO;GAClC,OAAO,QAAQ,6BAA6B,MAAM;;EAEpD,aAAa,QAAQ;EACrB,UAAU,cAAc;GACtB,4BAA4B,EAAE,UAAU,aAAa;;EAExD,CAAC;;;;;;;;;;;;;;;;AAiBJ,SAAS,6BACP,SACA,QAC4B;CAC5B,MAAM,kBAAkB,MAAM,cAAc,SAAS,4BAA4B;EAC/E,MAAM,sBAAM,IAAI,MAAM,gBAAgB;EACtC,IAAI,SAAS;EACb,MAAM;GACN;CAEF,OAAO,QAAQ,uBAAuB,iBAAiB,EACrD,eAAe,QAChB,CAAC;;AAGJ,eAAe,yBACb,SACA,cACA,aACmB;CACnB,OAAO,iCAAiC;EACtC,UAAU,QAAQ;EAClB,+BAA+B,eAC7B,6BAA6B,SAAS,WAAW,OAAO;EAC1D,qBAAqB,QAAQ;EAC7B;EACA,eAAe,QAAQ;EACvB,cAAc,QAAQ;EACtB,mBAAmB,QAAQ;EAC3B,mBAAmB,YAAY;GAC7B,MAAM,iBAAiB,6CAA6C;IAClE;IACA,qBAAqB,QAAQ;IAC7B,oBAAoB,QAAQ;IAC5B,wBAAwB,QAAQ;IAChC,uBAAuB,QAAQ,MAAM;IACrC,sBAAsB,QAAQ,MAAM;IACpC,0BAA0B,QAAQ,MAAM;IACxC;IACD,CAAC,EAAE;GACJ,OAAO,QAAQ,6BACb,YACA;IACE,mBAAmB;IACnB,SAAS,QAAQ,MAAM,QAAQ,MAAM,GAAG,YAAY;IACpD,eAAe,QAAQ;IACxB,EACD,KACD;;EAEH,SAAS,QAAQ;EACjB;EACD,CAAC;;AAGJ,eAAe,uBACb,SACA,cACmB;CACnB,OAAO,iCAAiC;EACtC,UAAU,QAAQ;EAClB,+BAA+B,eAC7B,6BAA6B,SAAS,WAAW,OAAO;EAC1D,qBAAqB,QAAQ;EAC7B;EACA,eAAe,QAAQ;EACvB,cAAc,QAAQ;EACtB,mBAAmB,QAAQ;EAC3B,mBAAmB,YAAY;GAa7B,MAAM,sBAAsB,kCAAkC,QAAQ,OAAO,WAAW;GACxF,MAAM,cAAc,QAAQ,MAAM,QAAQ;GAC1C,MAAM,EAAE,QAAQ,sBAAsB,aAAa,wBACjD,uCAAuC;IACrC,aAAa;IACb,qBAAqB,QAAQ;IAC7B,oBAAoB,QAAQ;IAC5B,wBAAwB,QAAQ;IAChC,uBAAuB,QAAQ,MAAM;IACrC,sBAAsB,QAAQ,MAAM;IACpC,0BAA0B,QAAQ,MAAM;IACxC;IACD,CAAC;GAKJ,MAAM,2BACJ,wBAAwB,SACvB,wBAAwB,QAAQ,wBAAwB;GAC3D,MAAM,oBAAoB,2BACpB,sBAAuD,WAAW,KAAA,IACpE,KAAA;GACJ,MAAM,qBACJ,4BAA4B,wBAAwB,OAChD,QAAQ,MAAM,QAAQ,MAAM,GAAG,sBAAsB,EAAE,GACvD,KAAA;GACN,OAAO,QAAQ,6BACb,YACA;IACE;IACA,SAAS;IACT,eAAe,QAAQ;IACxB,EACD,KACD;;EAEH,SAAS,QAAQ;EACjB;EACD,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"app-page-element-builder.js","names":[],"sources":["../../src/server/app-page-element-builder.ts"],"sourcesContent":["import { createElement } from \"react\";\nimport { markDynamicUsage, markRenderRequestApiUsage } from \"vinext/shims/headers\";\nimport { makeThenableParams } from \"vinext/shims/thenable-params\";\nimport { resolveActiveParallelRouteHeadInputs, resolveAppPageHead } from \"./app-page-head.js\";\nimport {\n buildAppPageElements,\n createAppPageTreePath,\n type AppPageErrorModule,\n type AppPageModule,\n type AppPageRouteWiringRoute,\n type AppPageSlotOverride,\n} from \"./app-page-route-wiring.js\";\nimport { AppElementsWire, type AppElements } from \"./app-elements.js\";\nimport type { AppPageParams } from \"./app-page-boundary.js\";\nimport { DEFAULT_GLOBAL_ERROR_MODULE } from \"./default-global-error-module.js\";\nimport { matchRoutePattern } from \"../routing/route-pattern.js\";\nimport type { MetadataFileRoute } from \"./metadata-routes.js\";\nimport { APP_RSC_RENDER_MODE_NAVIGATION, type AppRscRenderMode } from \"./app-rsc-render-mode.js\";\nimport { createAppPageRenderIdentity } from \"./app-page-render-identity.js\";\nimport { shouldServeStreamingMetadata } from \"./streaming-metadata.js\";\n\nexport type { AppPageErrorModule, AppPageRouteWiringRoute } from \"./app-page-route-wiring.js\";\n\n/**\n * Route shape passed from the generated entry. Extends the wiring route with\n * the page module reference (used to extract the default export for the page\n * element) and the URL pattern (used as the route path in head resolution).\n */\nexport type AppPageBuildRoute<\n TModule extends AppPageModule = AppPageModule,\n TErrorModule extends AppPageErrorModule = AppPageErrorModule,\n> = AppPageRouteWiringRoute<TModule, TErrorModule> & {\n page?: TModule | null;\n pattern: string;\n /** Param names captured by the route's URL pattern, in order. */\n params?: readonly string[] | null;\n};\n\nexport type AppPageInterceptOptions<TModule extends AppPageModule = AppPageModule> = {\n interceptionContext?: string | null;\n interceptLayouts?: readonly (TModule | null | undefined)[] | null;\n interceptPage?: TModule | null;\n interceptParams?: AppPageParams | null;\n interceptSlotId?: string | null;\n interceptSlotKey?: string | null;\n interceptSourceMatchedUrl?: string | null;\n};\n\nexport type AppPagePageRequest<TModule extends AppPageModule = AppPageModule> = {\n /** Interception context from current-route navigation (null for direct visits). */\n opts?: AppPageInterceptOptions<TModule> | null;\n /** URL search params from the incoming request (null when unavailable). */\n searchParams?: URLSearchParams | null;\n /** Whether the incoming request is an RSC (client-side navigation) request. */\n isRscRequest: boolean;\n /** The incoming HTTP request (available but unused by this module). */\n request: Request;\n /** Normalized x-vinext-mounted-slots header value. */\n mountedSlotsHeader: string | null;\n /** Semantic RSC payload mode for this page render. */\n renderMode?: AppRscRenderMode;\n};\n\nexport type BuildPageElementsOptions<\n TModule extends AppPageModule = AppPageModule,\n TErrorModule extends AppPageErrorModule = AppPageErrorModule,\n> = {\n route: AppPageBuildRoute<TModule, TErrorModule>;\n params: AppPageParams;\n routePath: string;\n pageRequest: AppPagePageRequest<TModule>;\n /** Root-level global-error.tsx module. Present when the app defines this file. */\n globalErrorModule?: TErrorModule | null;\n /** Root-level not-found.tsx module. Present when the app defines this file. */\n rootNotFoundModule?: TModule | null;\n /** Root-level forbidden.tsx module. Present when the app defines this file. */\n rootForbiddenModule?: TModule | null;\n /** Root-level unauthorized.tsx module. Present when the app defines this file. */\n rootUnauthorizedModule?: TModule | null;\n /** File-based metadata routes (favicon, manifest, sitemap, etc.). */\n metadataRoutes: readonly MetadataFileRoute[];\n /**\n * Configured next.config `basePath`. Threaded through `resolveAppPageHead`\n * so file-based metadata route URLs emitted in <head> are prefixed.\n */\n basePath?: string;\n /** Serialized next.config `htmlLimitedBots` regexp source. */\n htmlLimitedBots?: string;\n};\n\n/**\n * Build the App Router element tree for a matched route.\n *\n * This is the central element-construction path for the App Router RSC\n * handler. It resolves page head metadata (including parallel route metadata),\n * creates the page React element, and wires it into the nested layout +\n * boundary tree via {@link buildAppPageElements}.\n *\n * The function is extracted from the generated RSC entry template so it can\n * be unit-tested independently of the code-generation machinery.\n *\n * Next.js equivalent: the component tree construction in\n * {@link https://github.com/vercel/next.js/blob/canary/packages/next/src/server/app-render/create-component-tree.tsx|create-component-tree.tsx}\n * and the page head resolution in\n * {@link https://github.com/vercel/next.js/blob/canary/packages/next/src/server/app-render/create-metadata.tsx|create-metadata.tsx}.\n */\nexport async function buildPageElements<\n TModule extends AppPageModule = AppPageModule,\n TErrorModule extends AppPageErrorModule = AppPageErrorModule,\n>(options: BuildPageElementsOptions<TModule, TErrorModule>): Promise<AppElements> {\n const {\n route,\n params,\n routePath,\n pageRequest,\n globalErrorModule,\n rootNotFoundModule,\n rootForbiddenModule,\n rootUnauthorizedModule,\n metadataRoutes,\n } = options;\n const {\n opts,\n searchParams,\n isRscRequest,\n mountedSlotsHeader,\n renderMode = APP_RSC_RENDER_MODE_NAVIGATION,\n } = pageRequest;\n\n const pageModule: AppPageModule | null | undefined = route.page;\n const PageComponent = pageModule?.default;\n const hasPageModule = !!pageModule;\n const renderIdentity = createAppPageRenderIdentity({\n displayPathname: routePath,\n interceptionContext: opts?.interceptionContext ?? null,\n interceptSourceMatchedUrl: opts?.interceptSourceMatchedUrl ?? null,\n interceptSlotId: opts?.interceptSlotId ?? null,\n });\n\n if (hasPageModule && !PageComponent) {\n let noExportRootLayout: string | null = null;\n const noExportLayoutIds =\n route.ids?.layouts ??\n route.layouts.map((_, index) =>\n AppElementsWire.encodeLayoutId(\n createAppPageTreePath(route.routeSegments, route.layoutTreePositions?.[index] ?? 0),\n ),\n );\n if (route.layouts?.length > 0) {\n const treePosition = route.layoutTreePositions?.[0] ?? 0;\n noExportRootLayout = createAppPageTreePath(route.routeSegments, treePosition);\n }\n return {\n ...AppElementsWire.createMetadataEntries({\n interception: renderIdentity.interception,\n interceptionContext: renderIdentity.interceptionContext,\n layoutIds: noExportLayoutIds,\n rootLayoutTreePath: noExportRootLayout,\n routeId: renderIdentity.routeId,\n }),\n [renderIdentity.routeId]: createElement(\"div\", null, \"Page has no default export\"),\n };\n }\n\n const {\n hasSearchParams,\n hasDynamicMetadata,\n metadata: resolvedMetadata,\n pageSearchParams,\n viewport: resolvedViewport,\n } = await resolveAppPageHead({\n basePath: options.basePath ?? \"\",\n layoutModules: route.layouts,\n layoutTreePositions: route.layoutTreePositions,\n metadataRoutes,\n pageModule: route.page ?? null,\n parallelRoutes: resolveActiveParallelRouteHeadInputs({\n interceptLayouts: opts?.interceptLayouts ?? null,\n interceptPage: opts?.interceptPage ?? null,\n interceptParams: opts?.interceptParams ?? null,\n interceptSlotKey: opts?.interceptSlotKey ?? null,\n params,\n routeSegments: route.routeSegments ?? [],\n slots: route.slots ?? null,\n }),\n params,\n routePath: route.pattern,\n routeSegments: route.routeSegments ?? null,\n searchParams,\n });\n\n const pageProps: Record<string, unknown> = { params: makeThenableParams(params) };\n if (searchParams) {\n pageProps.searchParams = makeThenableParams(pageSearchParams);\n if (hasSearchParams) {\n markDynamicUsage();\n markRenderRequestApiUsage(\"searchParams\");\n }\n }\n\n const mountedSlotIds = mountedSlotsHeader ? new Set(mountedSlotsHeader.split(\" \")) : null;\n\n const slotOverrides = buildSlotOverrides(route, params, routePath, opts);\n const metadataPlacement =\n hasDynamicMetadata &&\n shouldServeStreamingMetadata(\n pageRequest.request.headers.get(\"user-agent\") ?? \"\",\n options.htmlLimitedBots,\n )\n ? \"body\"\n : \"head\";\n\n return buildAppPageElements({\n element: PageComponent ? createElement(PageComponent, pageProps) : null,\n // Fall back to vinext's built-in default global error module so that\n // uncaught client render errors are caught by the route-level\n // <ErrorBoundary> wrapper in app-page-route-wiring.tsx, mirroring\n // Next.js's behavior when the user has not defined app/global-error.tsx.\n globalErrorModule:\n globalErrorModule ?? (DEFAULT_GLOBAL_ERROR_MODULE as unknown as TErrorModule),\n isRscRequest,\n mountedSlotIds,\n makeThenableParams,\n matchedParams: params,\n metadataPlacement,\n resolvedMetadata,\n resolvedMetadataPathname: routePath,\n resolvedViewport,\n renderIdentity,\n routePath,\n rootNotFoundModule: rootNotFoundModule ?? null,\n rootForbiddenModule: rootForbiddenModule ?? null,\n rootUnauthorizedModule: rootUnauthorizedModule ?? null,\n route,\n slotOverrides,\n renderMode,\n });\n}\n\n/**\n * Build the per-request `slotOverrides` map. Combines:\n * - Interception overrides (existing behavior — swap in the intercepting page\n * and its layouts when the request is intercepted into this slot).\n * - Slot-specific param extraction for inherited slots whose URL pattern\n * has different param names than the route's. The runtime matches the\n * cleaned request path against `slot.slotPatternParts` to produce\n * slot-scoped params, which `app-page-route-wiring` then hands to the\n * slot page instead of the route's matched params.\n *\n * `routePath` is the already-normalized request pathname (basePath stripped,\n * RSC suffix removed). Re-parsing `request.url` here would re-introduce the\n * basePath and silently break the match for any app that configures one.\n */\nfunction buildSlotOverrides<TModule extends AppPageModule, TErrorModule extends AppPageErrorModule>(\n route: AppPageBuildRoute<TModule, TErrorModule>,\n routeParams: AppPageParams,\n routePath: string,\n opts?: AppPageInterceptOptions<TModule> | null,\n): Readonly<Record<string, AppPageSlotOverride<TModule>>> | null {\n const overrides: Record<string, AppPageSlotOverride<TModule>> = {};\n\n if (opts && opts.interceptSlotKey && opts.interceptPage) {\n overrides[opts.interceptSlotKey] = {\n layoutModules: opts.interceptLayouts || null,\n pageModule: opts.interceptPage,\n params: opts.interceptParams || routeParams,\n };\n }\n\n const slots = route.slots;\n if (slots) {\n let urlParts: string[] | null = null;\n const routeParamSet = collectParamNameSet(route.params);\n for (const [slotKey, slot] of Object.entries(slots)) {\n const patternParts = slot.slotPatternParts;\n const paramNames = slot.slotParamNames;\n if (!patternParts || patternParts.length === 0) continue;\n // Skip when every slot param is already a route param — the route's\n // matched params already carry the values the slot page expects.\n // Empty `paramNames` (slot pattern has no dynamic markers) also skips:\n // there's nothing to extract, so the route's matched params suffice.\n if (paramNames && paramNames.every((name) => routeParamSet.has(name))) continue;\n\n if (urlParts === null) {\n urlParts = routePath.split(\"/\").filter(Boolean);\n }\n const matched = matchRoutePattern(urlParts, patternParts);\n if (!matched) continue;\n\n const existing = overrides[slotKey];\n overrides[slotKey] = existing ? { ...existing, params: matched } : { params: matched };\n }\n }\n\n return Object.keys(overrides).length > 0 ? overrides : null;\n}\n\nfunction collectParamNameSet(params: readonly string[] | undefined | null): Set<string> {\n const set = new Set<string>();\n if (params) {\n for (const name of params) set.add(name);\n }\n return set;\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"app-page-execution.js","names":[],"sources":["../../src/server/app-page-execution.ts"],"sourcesContent":["import type { LayoutFlags } from \"./app-elements.js\";\nimport type { ClassificationReason } from \"../build/layout-classification-types.js\";\nimport {\n applyRscCompatibilityIdHeader,\n createRscRedirectLocation,\n VINEXT_RSC_CONTENT_TYPE,\n} from \"./app-rsc-cache-busting.js\";\nimport { VINEXT_RSC_REDIRECT_HEADER } from \"./headers.js\";\nimport { applyEdgeRuntimeHeader } from \"./app-page-response.js\";\nimport { mergeMiddlewareResponseHeaders } from \"./middleware-response-headers.js\";\nimport { parseNextHttpErrorDigest, parseNextRedirectDigest } from \"./next-error-digest.js\";\nimport { addBasePathToPathname } from \"../utils/base-path.js\";\n\n/**\n * Builds the canonical `NEXT_REDIRECT;<type>;<url>;<status>;` digest that\n * Next.js encodes on `redirect()` / `permanentRedirect()` throws. Used when\n * we synthesize a flight payload for an RSC navigation: the digest must\n * round-trip through the client's `RedirectErrorBoundary` so the same\n * `getURLFromRedirectError` / `getRedirectTypeFromError` helpers decode it.\n *\n * The URL is included verbatim, not encoded — Next.js's `getRedirectError`\n * sets `digest = ${CODE};${type};${url};${status};` with the raw URL, and the\n * client decodes via `error.digest.split(';').slice(2, -2).join(';')`. We\n * default `type=replace` because `redirect()` is replace-style outside of\n * server actions, matching Next.js's `getRedirectError` default.\n *\n * Reference:\n * `.nextjs-ref/packages/next/src/client/components/redirect.ts:20-23`\n * `.nextjs-ref/packages/next/src/client/components/redirect-error.ts`\n */\nfunction formatNextRedirectDigest(options: { url: string; statusCode: number }): string {\n return `NEXT_REDIRECT;replace;${options.url};${options.statusCode};`;\n}\n\nexport type { LayoutFlags };\nexport type { ClassificationReason };\n\n/**\n * Marker we tag onto a thrown redirect/notFound error when it originates from\n * `generateMetadata()` (vs. a server component itself). Metadata resolution is\n * suspended/streamed in Next.js, so a redirect from metadata never becomes an\n * HTTP-level 307 — it rides inside the flight payload with a 200 status,\n * regardless of whether the request is RSC or a full document SSR. Page-level\n * redirect()s, by contrast, still produce a 307 for SSR document requests.\n *\n * See Next.js test:\n * test/e2e/app-dir/metadata-navigation/metadata-navigation.test.ts\n * (\"should support redirect in generateMetadata\")\n */\nconst APP_PAGE_METADATA_ERROR_MARKER = Symbol.for(\"vinext.appPage.metadataError\");\n\nexport function tagAppPageMetadataError<T>(error: T): T {\n if (error && typeof error === \"object\") {\n try {\n Object.defineProperty(error, APP_PAGE_METADATA_ERROR_MARKER, {\n value: true,\n enumerable: false,\n configurable: true,\n writable: false,\n });\n } catch {\n // The error object may be frozen (rare). The marker is best-effort —\n // callers fall back to the page-level 307 path when missing, which\n // matches the historical behavior.\n }\n }\n return error;\n}\n\nexport type AppPageSpecialError =\n | { kind: \"redirect\"; location: string; statusCode: number; fromMetadata?: boolean }\n | { kind: \"http-access-fallback\"; statusCode: number; fromMetadata?: boolean };\n\nexport type AppPageFontPreload = {\n href: string;\n type: string;\n};\n\ntype AppPageRscStreamCapture = {\n /** Stream for createFromReadableStream (SSR). Always set. */\n ssrStream: ReadableStream<Uint8Array>;\n /** When capturing, the combined embed+capture stream. handleSsr consumes this. */\n sideStream?: ReadableStream<Uint8Array>;\n};\n\n/**\n * Builds an RSC flight payload that encodes a `redirect()` as a React error\n * with the canonical `NEXT_REDIRECT;<type>;<url>;<status>;` digest. Mirrors\n * Next.js's behavior in `app-render.tsx generateDynamicFlightRenderResult`\n * where a redirect thrown during RSC rendering propagates through\n * `renderToFlightStream`'s `onError` handler and is serialized into the\n * stream — the HTTP response stays 200 because the redirect rides in the\n * flight body, not the status line.\n *\n * Returns a stream that the caller wraps in a 200 response with the standard\n * `text/x-component` content type. The client's `RedirectErrorBoundary`\n * decodes the digest and performs the navigation.\n */\ntype BuildRscRedirectFlightStream = (options: { digest: string }) => ReadableStream<Uint8Array>;\n\ntype BuildAppPageSpecialErrorResponseOptions = {\n /**\n * Optional configured basePath (e.g. \"/blog\"). When set, redirect Locations\n * pointing at app-internal paths get prefixed so callers see e.g.\n * `Location: /blog/about` for `redirect(\"/about\")`. Mirrors Next.js's\n * `addPathPrefix(getURLFromRedirectError(err), basePath)` in app-render.tsx.\n * External URLs (those that resolve to a different origin than the request)\n * are left untouched.\n */\n basePath?: string;\n /**\n * Builds the RSC flight payload used when a redirect must be encoded inside\n * the response body instead of the status line — required for RSC navigations\n * and for `generateMetadata()` redirects (always 200, never 307). When\n * omitted, redirect responses fall back to the 307 + Location path; callers\n * that handle RSC requests must supply this.\n */\n buildRscRedirectFlightStream?: BuildRscRedirectFlightStream;\n clearRequestContext: () => void;\n /**\n * Drains and returns Set-Cookie header values that were accumulated during\n * this render via cookies().set() / cookies().delete(). Appended to redirect\n * responses so an auth flow that does `cookies().set(\"session\", \"...\");\n * redirect(\"/\")` preserves the cookie on the 307. Mirrors Next.js's\n * `appendMutableCookies(headers, requestStore.mutableCookies)` in\n * app-render.tsx. Only applied to redirect responses to match Next.js;\n * the http-access-fallback path leaves cookies to the rendered boundary.\n */\n getAndClearPendingCookies?: () => string[];\n isEdgeRuntime?: boolean;\n isRscRequest: boolean;\n middlewareContext?: { headers: Headers | null };\n renderFallbackPage?: (statusCode: number) => Promise<Response | null>;\n request: Request;\n specialError: AppPageSpecialError;\n};\n\ntype ProbeAppPageLayoutsResult = {\n response: Response | null;\n layoutFlags: LayoutFlags;\n};\n\nexport type LayoutClassificationOptions = {\n /** Build-time classifications from segment config or module graph, keyed by layout index. */\n buildTimeClassifications?: ReadonlyMap<number, \"static\" | \"dynamic\"> | null;\n /**\n * Per-layout classification reasons keyed by layout index. Requires\n * `VINEXT_DEBUG_CLASSIFICATION` at BOTH lifecycle points: at build time so\n * the plugin patches the `__VINEXT_CLASS_REASONS` dispatch stub, and at\n * runtime so the route object actually calls it. Setting the flag only at\n * runtime leaves the stub returning `null`, and every build-time classified\n * layout will fall through to `{ layer: \"no-classifier\" }` in the debug\n * channel. The hot path never reads this and the wire payload is unchanged.\n */\n buildTimeReasons?: ReadonlyMap<number, ClassificationReason> | null;\n /**\n * Emits one log line per layout with the classification reason, keyed by\n * layout ID. Set by the generator when `VINEXT_DEBUG_CLASSIFICATION` is\n * active. When undefined, the probe loop skips debug emission entirely.\n */\n debugClassification?: (layoutId: string, reason: ClassificationReason) => void;\n /** Maps layout index to its layout ID (e.g. \"layout:/blog\"). */\n getLayoutId: (layoutIndex: number) => string;\n /** Runs a function with isolated dynamic usage tracking per layout. */\n runWithIsolatedDynamicScope: <T>(fn: () => T) => Promise<{ result: T; dynamicDetected: boolean }>;\n};\n\ntype ProbeAppPageLayoutsOptions = {\n layoutCount: number;\n onLayoutError: (error: unknown, layoutIndex: number) => Promise<Response | null>;\n probeLayoutAt: (layoutIndex: number) => unknown;\n runWithSuppressedHookWarning<T>(probe: () => Promise<T>): Promise<T>;\n /** When provided, enables per-layout static/dynamic classification. */\n classification?: LayoutClassificationOptions | null;\n};\n\ntype ProbeAppPageComponentOptions = {\n awaitAsyncResult: boolean;\n onError: (error: unknown) => Promise<Response | null>;\n probePage: () => unknown;\n runWithSuppressedHookWarning<T>(probe: () => Promise<T>): Promise<T>;\n};\n\nfunction isPromiseLike(value: unknown): value is PromiseLike<unknown> {\n return Boolean(\n value &&\n (typeof value === \"object\" || typeof value === \"function\") &&\n \"then\" in value &&\n typeof value.then === \"function\",\n );\n}\n\nfunction getAppPageStatusText(statusCode: number): string {\n return statusCode === 403 ? \"Forbidden\" : statusCode === 401 ? \"Unauthorized\" : \"Not Found\";\n}\n\nfunction mergeAppPageSpecialErrorHeaders(\n response: Response,\n middlewareContext: { headers: Headers | null } | undefined,\n): Response {\n const headers = new Headers(response.headers);\n mergeMiddlewareResponseHeaders(headers, middlewareContext?.headers ?? null);\n\n return new Response(response.body, {\n headers,\n status: response.status,\n statusText: response.statusText,\n });\n}\n\nexport function resolveAppPageSpecialError(error: unknown): AppPageSpecialError | null {\n if (!(error && typeof error === \"object\" && \"digest\" in error)) {\n return null;\n }\n\n const digest = String(error.digest);\n const fromMetadata = (error as Record<symbol, unknown>)[APP_PAGE_METADATA_ERROR_MARKER] === true;\n\n const redirect = parseNextRedirectDigest(digest);\n if (redirect) {\n return {\n kind: \"redirect\",\n location: redirect.url,\n statusCode: redirect.status,\n ...(fromMetadata ? { fromMetadata: true } : {}),\n };\n }\n\n const httpError = parseNextHttpErrorDigest(digest);\n if (httpError) {\n return {\n kind: \"http-access-fallback\",\n statusCode: httpError.status,\n ...(fromMetadata ? { fromMetadata: true } : {}),\n };\n }\n\n return null;\n}\n\n/**\n * Resolves a redirect() target against the request URL and prepends the\n * configured basePath when the target is an app-internal absolute path.\n *\n * Mirrors Next.js's `addPathPrefix(getURLFromRedirectError(err), basePath)`\n * in `app-render.tsx`: a `redirect(\"/about\")` call from a page mounted at\n * `/blog` (basePath) produces `Location: /blog/about`.\n *\n * Skips prefixing when:\n * - basePath is unset / empty\n * - the target is a full URL pointing at a different origin (external redirect)\n * - the target already starts with the basePath (caller did the work themselves)\n */\nfunction applyAppPageRedirectBasePath(\n location: string,\n requestUrl: string,\n basePath: string | undefined,\n): string {\n const resolved = new URL(location, requestUrl);\n const requestOrigin = new URL(requestUrl).origin;\n if (!basePath || resolved.origin !== requestOrigin) {\n return resolved.toString();\n }\n resolved.pathname = addBasePathToPathname(resolved.pathname, basePath);\n return resolved.toString();\n}\n\n/**\n * Returns a path-relative form (`/foo?bar`) of an absolute URL when it shares\n * the request's origin; otherwise returns the URL verbatim. Used so the digest\n * we embed in the flight payload matches Next.js's convention — the digest\n * stores the path the developer passed to `redirect(\"/about\")`, not a\n * fully-qualified URL like `https://example.com/about`.\n */\nfunction sameOriginPathOrAbsolute(location: string, requestUrl: string): string {\n try {\n const resolved = new URL(location, requestUrl);\n const requestOrigin = new URL(requestUrl).origin;\n if (resolved.origin !== requestOrigin) {\n return resolved.toString();\n }\n return `${resolved.pathname}${resolved.search}${resolved.hash}`;\n } catch {\n return location;\n }\n}\n\nexport async function buildAppPageSpecialErrorResponse(\n options: BuildAppPageSpecialErrorResponseOptions,\n): Promise<Response> {\n if (options.specialError.kind === \"redirect\") {\n options.clearRequestContext();\n // Apply configured basePath first so app-internal targets land at\n // /<basePath>/<target> before the RSC cache-busting transform sees them.\n const prefixedLocation = applyAppPageRedirectBasePath(\n options.specialError.location,\n options.request.url,\n options.basePath,\n );\n\n // Two cases need a 200 + flight-payload encoding instead of an HTTP 307:\n // 1. RSC navigation requests (`Rsc: 1` header) — the client router\n // decodes the redirect digest from the flight stream. A raw 307\n // bypasses that path and breaks cache-busting validation.\n // 2. `generateMetadata()` redirects — metadata is suspended in Next.js,\n // so the redirect rides inside the streamed flight payload even for\n // full document SSR. The status line stays 200.\n // Mirrors Next.js's `generateDynamicFlightRenderResult` path in\n // `app-render.tsx`, where the redirect error propagates through\n // `renderToFlightStream` and is serialized with its digest.\n const shouldEmbedRedirectInFlight =\n Boolean(options.buildRscRedirectFlightStream) &&\n (options.isRscRequest || options.specialError.fromMetadata === true);\n\n if (shouldEmbedRedirectInFlight && options.buildRscRedirectFlightStream) {\n // Reduce the resolved (absolute) URL back to a path-only form for\n // same-origin redirects. Next.js's digest stores the raw URL passed to\n // `redirect()` (typically a path like \"/about\"), and the client router's\n // `router.push(url)` happily accepts paths. Cross-origin targets keep\n // their absolute form, matching Next.js's external-redirect handling.\n const digestUrl = sameOriginPathOrAbsolute(prefixedLocation, options.request.url);\n const digest = formatNextRedirectDigest({\n url: digestUrl,\n statusCode: options.specialError.statusCode,\n });\n const stream = options.buildRscRedirectFlightStream({ digest });\n\n const headers = new Headers({\n \"Content-Type\": VINEXT_RSC_CONTENT_TYPE,\n // Side-channel signal so vinext's client loop can detect the redirect\n // without having to decode the flight body first. See\n // `VINEXT_RSC_REDIRECT_HEADER` in server/headers.ts for the rationale.\n [VINEXT_RSC_REDIRECT_HEADER]: digestUrl,\n });\n applyEdgeRuntimeHeader(headers, options.isEdgeRuntime);\n // Mirror the regular RSC response by stamping the build-time compatibility\n // ID. Without it, the client treats the response as cross-build and hard-\n // navigates instead of following the redirect through the soft-nav loop.\n applyRscCompatibilityIdHeader(headers);\n // Preserve middleware response headers (Set-Cookie, custom headers, etc.)\n // exactly like the 307 path does — the client will still see them.\n mergeMiddlewareResponseHeaders(headers, options.middlewareContext?.headers ?? null);\n const pendingCookies = options.getAndClearPendingCookies?.() ?? [];\n for (const cookie of pendingCookies) {\n headers.append(\"Set-Cookie\", cookie);\n }\n\n return new Response(stream, {\n headers,\n status: 200,\n });\n }\n\n const location = options.isRscRequest\n ? await createRscRedirectLocation(prefixedLocation, options.request)\n : prefixedLocation;\n const headers = new Headers({\n Location: location,\n });\n // Middleware may contribute response headers here, but redirect() owns the\n // status. Do not apply middlewareContext.status on special-error responses.\n mergeMiddlewareResponseHeaders(headers, options.middlewareContext?.headers ?? null);\n // Preserve cookies set via cookies().set() / cookies().delete() during the\n // page render — auth flows commonly set a session cookie and immediately\n // redirect, and those Set-Cookie values must ride on the 307.\n const pendingCookies = options.getAndClearPendingCookies?.() ?? [];\n for (const cookie of pendingCookies) {\n headers.append(\"Set-Cookie\", cookie);\n }\n\n return new Response(null, {\n headers,\n status: options.specialError.statusCode,\n });\n }\n\n if (options.renderFallbackPage) {\n const fallbackResponse = await options.renderFallbackPage(options.specialError.statusCode);\n if (fallbackResponse) {\n return mergeAppPageSpecialErrorHeaders(fallbackResponse, options.middlewareContext);\n }\n }\n\n options.clearRequestContext();\n return mergeAppPageSpecialErrorHeaders(\n new Response(getAppPageStatusText(options.specialError.statusCode), {\n status: options.specialError.statusCode,\n }),\n options.middlewareContext,\n );\n}\n\n/** See `LayoutFlags` type docblock in app-elements.ts for lifecycle. */\nexport async function probeAppPageLayouts(\n options: ProbeAppPageLayoutsOptions,\n): Promise<ProbeAppPageLayoutsResult> {\n const layoutFlags: Record<string, \"s\" | \"d\"> = {};\n const cls = options.classification ?? null;\n\n const response = await options.runWithSuppressedHookWarning(async () => {\n for (let layoutIndex = options.layoutCount - 1; layoutIndex >= 0; layoutIndex--) {\n const buildTimeResult = cls?.buildTimeClassifications?.get(layoutIndex);\n\n if (cls && buildTimeResult) {\n // Build-time classified (Layer 1 or Layer 2): skip dynamic isolation,\n // but still probe for special errors (redirects, not-found).\n layoutFlags[cls.getLayoutId(layoutIndex)] = buildTimeResult === \"static\" ? \"s\" : \"d\";\n if (cls.debugClassification) {\n // `no-classifier` is the documented fallback for a layout that was\n // build-time classified but whose reason payload is absent — either\n // because the build was run without `VINEXT_DEBUG_CLASSIFICATION` or\n // because no Layer 1/2 classifier attached a reason. This is the sole\n // producer of the variant; see `layout-classification-types.ts`.\n cls.debugClassification(\n cls.getLayoutId(layoutIndex),\n cls.buildTimeReasons?.get(layoutIndex) ?? { layer: \"no-classifier\" },\n );\n }\n const errorResponse = await probeLayoutForErrors(options, layoutIndex);\n if (errorResponse) return errorResponse;\n continue;\n }\n\n if (cls) {\n // Layer 3: probe with isolated dynamic scope to detect per-layout\n // dynamic API usage (headers(), cookies(), connection(), etc.)\n try {\n const { dynamicDetected } = await cls.runWithIsolatedDynamicScope(() =>\n options.probeLayoutAt(layoutIndex),\n );\n layoutFlags[cls.getLayoutId(layoutIndex)] = dynamicDetected ? \"d\" : \"s\";\n if (cls.debugClassification) {\n cls.debugClassification(cls.getLayoutId(layoutIndex), {\n layer: \"runtime-probe\",\n outcome: dynamicDetected ? \"dynamic\" : \"static\",\n });\n }\n } catch (error) {\n // Probe failed — conservatively treat as dynamic.\n layoutFlags[cls.getLayoutId(layoutIndex)] = \"d\";\n if (cls.debugClassification) {\n cls.debugClassification(cls.getLayoutId(layoutIndex), {\n layer: \"runtime-probe\",\n outcome: \"dynamic\",\n error: error instanceof Error ? error.message : String(error),\n });\n }\n const errorResponse = await options.onLayoutError(error, layoutIndex);\n if (errorResponse) return errorResponse;\n }\n continue;\n }\n\n // No classification options — original behavior\n const errorResponse = await probeLayoutForErrors(options, layoutIndex);\n if (errorResponse) return errorResponse;\n }\n\n return null;\n });\n\n return { response, layoutFlags };\n}\n\nasync function probeLayoutForErrors(\n options: ProbeAppPageLayoutsOptions,\n layoutIndex: number,\n): Promise<Response | null> {\n try {\n const layoutResult = options.probeLayoutAt(layoutIndex);\n if (isPromiseLike(layoutResult)) {\n await layoutResult;\n }\n } catch (error) {\n return options.onLayoutError(error, layoutIndex);\n }\n return null;\n}\n\nexport async function probeAppPageComponent(\n options: ProbeAppPageComponentOptions,\n): Promise<Response | null> {\n return options.runWithSuppressedHookWarning(async () => {\n try {\n const pageResult = options.probePage();\n if (isPromiseLike(pageResult)) {\n if (options.awaitAsyncResult) {\n await pageResult;\n } else {\n void Promise.resolve(pageResult).catch(() => {});\n }\n }\n } catch (error) {\n return options.onError(error);\n }\n\n return null;\n });\n}\n\nexport async function readAppPageBinaryStream(\n stream: ReadableStream<Uint8Array>,\n): Promise<ArrayBuffer> {\n const reader = stream.getReader();\n const chunks: Uint8Array[] = [];\n let totalLength = 0;\n\n for (;;) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n chunks.push(value);\n totalLength += value.byteLength;\n }\n\n const buffer = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of chunks) {\n buffer.set(chunk, offset);\n offset += chunk.byteLength;\n }\n\n return buffer.buffer;\n}\n\nexport function teeAppPageRscStreamForCapture(\n stream: ReadableStream<Uint8Array>,\n shouldCapture: boolean,\n): AppPageRscStreamCapture {\n if (!shouldCapture) {\n return {\n ssrStream: stream,\n };\n }\n\n const [ssrStream, sideStream] = stream.tee();\n return {\n ssrStream,\n sideStream,\n };\n}\n\nexport function buildAppPageFontLinkHeader(\n preloads: readonly AppPageFontPreload[] | null | undefined,\n): string {\n if (!preloads || preloads.length === 0) {\n return \"\";\n }\n\n return preloads\n .map((preload) => `<${preload.href}>; rel=preload; as=font; type=${preload.type}; crossorigin`)\n .join(\", \");\n}\n"],"mappings":"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"}
|
|
@@ -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 resolveAppPageSegmentParamScopeKeys(\n routeSegments: readonly string[] | null | undefined,\n treePosition: number,\n): readonly string[] {\n const paramNames: string[] = [];\n const seen = new Set<string>();\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 paramName = getAppPageSegmentParamName(segments[index]);\n if (!paramName || seen.has(paramName)) {\n continue;\n }\n\n seen.add(paramName);\n paramNames.push(paramName);\n }\n\n return paramNames;\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,oCACd,eACA,cACmB;CACnB,MAAM,aAAuB,EAAE;CAC/B,MAAM,uBAAO,IAAI,KAAa;CAC9B,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,YAAY,2BAA2B,SAAS,OAAO;EAC7D,IAAI,CAAC,aAAa,KAAK,IAAI,UAAU,EACnC;EAGF,KAAK,IAAI,UAAU;EACnB,WAAW,KAAK,UAAU;;CAG5B,OAAO;;AAGT,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 { Fragment, isValidElement, type ReactElement, type ReactNode } from \"react\";\nimport { 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\nconst DEFAULT_SUBTREE_PROBE_MAX_DEPTH = 32;\nconst DEFAULT_SUBTREE_PROBE_MAX_NODES = 1000;\nconst REACT_FORWARD_REF_TYPE = Symbol.for(\"react.forward_ref\");\nconst REACT_LAZY_TYPE = Symbol.for(\"react.lazy\");\nconst REACT_MEMO_TYPE = Symbol.for(\"react.memo\");\n\ntype ProbeReactServerSubtreeOptions = Readonly<{\n maxDepth?: number;\n maxNodes?: number;\n}>;\n\ntype ProbeReactElementProps = Readonly<{\n children?: ReactNode;\n}>;\n\ntype UnknownFunction = (...args: unknown[]) => unknown;\n\ntype ReactMemoType = Readonly<{\n innerType: unknown;\n}>;\n\ntype ReactLazyType = Readonly<{\n init: UnknownFunction;\n payload: unknown;\n}>;\n\nclass AppPageSubtreeProbeLimitError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"AppPageSubtreeProbeLimitError\";\n }\n}\n\nclass AppPageSubtreeProbeUnsupportedIterableError extends Error {\n constructor() {\n super(\"App page layout subtree probe cannot safely inspect iterable children\");\n this.name = \"AppPageSubtreeProbeUnsupportedIterableError\";\n }\n}\n\nfunction isPromiseLike(value: unknown): value is PromiseLike<unknown> {\n return Boolean(\n value &&\n (typeof value === \"object\" || typeof value === \"function\") &&\n \"then\" in value &&\n typeof value.then === \"function\",\n );\n}\n\nfunction isIterable(value: unknown): value is Iterable<unknown> {\n return Boolean(\n value &&\n typeof value !== \"string\" &&\n typeof value === \"object\" &&\n Symbol.iterator in value &&\n typeof value[Symbol.iterator] === \"function\",\n );\n}\n\nfunction isProbeReactElement(value: unknown): value is ReactElement<ProbeReactElementProps> {\n return isValidElement<ProbeReactElementProps>(value);\n}\n\nfunction isObjectLike(value: unknown): value is object {\n return (typeof value === \"object\" || typeof value === \"function\") && value !== null;\n}\n\nfunction isUnknownFunction(value: unknown): value is UnknownFunction {\n return typeof value === \"function\";\n}\n\nfunction readReactMemoType(value: unknown): ReactMemoType | null {\n if (!isObjectLike(value) || Reflect.get(value, \"$$typeof\") !== REACT_MEMO_TYPE) {\n return null;\n }\n return { innerType: Reflect.get(value, \"type\") };\n}\n\nfunction readReactLazyType(value: unknown): ReactLazyType | null {\n if (!isObjectLike(value) || Reflect.get(value, \"$$typeof\") !== REACT_LAZY_TYPE) {\n return null;\n }\n const init = Reflect.get(value, \"_init\");\n if (!isUnknownFunction(init)) {\n return null;\n }\n return { init, payload: Reflect.get(value, \"_payload\") };\n}\n\nfunction readReactForwardRefRender(value: unknown): UnknownFunction | null {\n if (!isObjectLike(value) || Reflect.get(value, \"$$typeof\") !== REACT_FORWARD_REF_TYPE) {\n return null;\n }\n const render = Reflect.get(value, \"render\");\n return isUnknownFunction(render) ? render : null;\n}\n\nasync function resolveReactLazyType(lazyType: ReactLazyType): Promise<unknown> {\n try {\n return lazyType.init(lazyType.payload);\n } catch (error) {\n if (!isPromiseLike(error)) {\n throw error;\n }\n await error;\n return lazyType.init(lazyType.payload);\n }\n}\n\n/**\n * Invokes server-component children returned by a layout probe so per-layout\n * skip eligibility observes data dependencies created below the layout's\n * immediate function body. The real RSC render remains authoritative; probe\n * failures only make static-layout skip fall back to render-and-send.\n */\nexport async function probeReactServerSubtree(\n node: unknown,\n options: ProbeReactServerSubtreeOptions = {},\n): Promise<void> {\n const maxDepth = options.maxDepth ?? DEFAULT_SUBTREE_PROBE_MAX_DEPTH;\n const maxNodes = options.maxNodes ?? DEFAULT_SUBTREE_PROBE_MAX_NODES;\n let visitedNodes = 0;\n\n const enterProbeNode = (depth: number): void => {\n if (depth > maxDepth) {\n throw new AppPageSubtreeProbeLimitError(\"App page layout subtree probe exceeded max depth\");\n }\n visitedNodes += 1;\n if (visitedNodes > maxNodes) {\n throw new AppPageSubtreeProbeLimitError(\"App page layout subtree probe exceeded max nodes\");\n }\n };\n\n const renderElementType = async (\n type: unknown,\n props: ProbeReactElementProps,\n depth: number,\n wrapperDepth = 0,\n ): Promise<boolean> => {\n if (wrapperDepth > maxDepth) {\n throw new AppPageSubtreeProbeLimitError(\"App page layout subtree probe exceeded max depth\");\n }\n\n if (isUnknownFunction(type)) {\n await visit(type(props), depth + 1);\n return true;\n }\n\n const memoType = readReactMemoType(type);\n if (memoType) {\n return renderElementType(memoType.innerType, props, depth, wrapperDepth + 1);\n }\n\n const lazyType = readReactLazyType(type);\n if (lazyType) {\n return renderElementType(\n await resolveReactLazyType(lazyType),\n props,\n depth,\n wrapperDepth + 1,\n );\n }\n\n const forwardRefRender = readReactForwardRefRender(type);\n if (forwardRefRender) {\n await visit(forwardRefRender(props, null), depth + 1);\n return true;\n }\n\n return false;\n };\n\n const visit = async (value: unknown, depth: number): Promise<void> => {\n enterProbeNode(depth);\n if (value == null || typeof value === \"boolean\" || typeof value === \"number\") return;\n if (typeof value === \"string\" || typeof value === \"bigint\") return;\n if (isPromiseLike(value)) {\n await visit(await value, depth);\n return;\n }\n if (Array.isArray(value)) {\n for (const child of value) {\n await visit(child, depth + 1);\n }\n return;\n }\n if (isIterable(value) && !isProbeReactElement(value)) {\n throw new AppPageSubtreeProbeUnsupportedIterableError();\n }\n if (!isProbeReactElement(value)) return;\n\n if (value.type === Fragment || typeof value.type === \"string\") {\n await visit(value.props.children, depth + 1);\n return;\n }\n\n if (await renderElementType(value.type, value.props, depth)) {\n return;\n }\n\n await visit(value.props.children, depth + 1);\n };\n\n await visit(node, 0);\n}\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":"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"}
|
|
@@ -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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"}
|