vinext 1.2.1 → 1.3.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 +12 -9
- package/dist/_virtual/_rolldown/runtime.js +1 -1
- package/dist/build/action-owner-manifest.d.ts +3 -2
- package/dist/build/action-owner-manifest.js +18 -2
- package/dist/build/app-page-static-eligibility.d.ts +17 -1
- package/dist/build/app-page-static-eligibility.js +80 -13
- package/dist/build/clean-output.d.ts +2 -1
- package/dist/build/client-build-config.d.ts +77 -6
- package/dist/build/client-build-config.js +176 -12
- package/dist/build/client-reference-async.d.ts +48 -0
- package/dist/build/client-reference-async.js +123 -0
- package/dist/build/client-reference-chunks.d.ts +32 -0
- package/dist/build/client-reference-chunks.js +111 -0
- package/dist/build/client-reference-groups.d.ts +171 -0
- package/dist/build/client-reference-groups.js +572 -0
- package/dist/build/css-url-assets.d.ts +2 -1
- package/dist/build/google-fonts/fallback-metrics.d.ts +2 -1
- package/dist/build/google-fonts/find-font-files-in-css.d.ts +1 -0
- package/dist/build/google-fonts/find-font-files-in-css.js +17 -4
- package/dist/build/google-fonts/font-metadata.d.ts +2 -1
- package/dist/build/google-fonts/validate.d.ts +2 -1
- package/dist/build/inline-css.d.ts +2 -1
- package/dist/build/layout-classification.d.ts +2 -1
- package/dist/build/module-dependency-cache.d.ts +33 -1
- package/dist/build/module-dependency-cache.js +51 -1
- package/dist/build/next-client-runtime-manifests.d.ts +12 -2
- package/dist/build/next-client-runtime-manifests.js +19 -4
- package/dist/build/nitro-public-files.d.ts +24 -0
- package/dist/build/nitro-public-files.js +60 -0
- package/dist/build/pages-client-assets-module.js +1 -1
- package/dist/build/precompress.d.ts +2 -1
- package/dist/build/precompress.js +1 -1
- package/dist/build/prerender-paths.d.ts +2 -1
- package/dist/build/prerender-paths.js +5 -2
- package/dist/build/prerender-phase.d.ts +2 -1
- package/dist/build/prerender-server-pool.js +1 -1
- package/dist/build/prerender.d.ts +3 -2
- package/dist/build/prerender.js +5 -4
- package/dist/build/report.d.ts +2 -1
- package/dist/build/route-classification-injector.d.ts +2 -1
- package/dist/build/route-classification-manifest.d.ts +2 -1
- package/dist/build/run-prerender.d.ts +2 -1
- package/dist/build/server-actions-encryption-key.d.ts +24 -0
- package/dist/build/server-actions-encryption-key.js +101 -0
- package/dist/build/ssr-manifest.d.ts +3 -0
- package/dist/build/ssr-manifest.js +34 -2
- package/dist/build/standalone.d.ts +2 -1
- package/dist/cache/cache-adapters-virtual.d.ts +2 -1
- package/dist/cache.js +1 -2
- package/dist/check.d.ts +2 -1
- package/dist/check.js +4 -0
- package/dist/cli-args.d.ts +2 -1
- package/dist/cli.js +2 -0
- package/dist/client/client-redirect-matcher.js +2 -1
- package/dist/client/client-redirects.d.ts +4 -3
- package/dist/client/client-redirects.js +2 -1
- package/dist/client/client-rewrite-params.d.ts +9 -0
- package/dist/client/client-rewrite-params.js +20 -0
- package/dist/client/client-rewrites.d.ts +2 -1
- package/dist/client/dev-error-overlay-store.d.ts +2 -1
- package/dist/client/dev-error-overlay.js +2 -1
- package/dist/client/index.js +1 -2
- package/dist/client/instrumentation-client-state.js +5 -5
- package/dist/client/navigation-runtime.d.ts +28 -3
- package/dist/client/navigation-runtime.js +42 -11
- package/dist/client/pages-router-link-navigation.d.ts +2 -1
- package/dist/client/vinext-next-data.d.ts +25 -2
- package/dist/client/window-next.d.ts +2 -1
- package/dist/config/config-matchers.d.ts +27 -41
- package/dist/config/config-matchers.js +293 -270
- package/dist/config/config-source.d.ts +34 -0
- package/dist/config/config-source.js +141 -0
- package/dist/config/dotenv.d.ts +2 -1
- package/dist/config/header-params.d.ts +29 -0
- package/dist/config/header-params.js +106 -0
- package/dist/config/next-config.d.ts +20 -6
- package/dist/config/next-config.js +149 -11
- package/dist/config/tsconfig-paths.d.ts +2 -1
- package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/detector.js +23 -0
- package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/index.js +2 -0
- package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/lookup.js +25 -0
- package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/bmp.js +11 -0
- package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/cur.js +15 -0
- package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/dds.js +11 -0
- package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/gif.js +12 -0
- package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/heif.js +55 -0
- package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/icns.js +76 -0
- package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/ico.js +39 -0
- package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/index.js +46 -0
- package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/j2c.js +11 -0
- package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/jp2.js +21 -0
- package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/jpg.js +71 -0
- package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/jxl-stream.js +42 -0
- package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/jxl.js +46 -0
- package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/ktx.js +19 -0
- package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/png.js +28 -0
- package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/pnm.js +54 -0
- package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/psd.js +11 -0
- package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/svg.js +79 -0
- package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/tga.js +15 -0
- package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/tiff.js +96 -0
- package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/utils.js +53 -0
- package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/webp.js +45 -0
- package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/utils/bit-reader.js +38 -0
- package/dist/deps/.pnpm/ua-parser-js@1.0.35/deps/ua-parser-js/src/ua-parser.js +2 -2
- package/dist/entries/app-browser-entry.d.ts +34 -6
- package/dist/entries/app-browser-entry.js +103 -40
- package/dist/entries/app-rsc-entry.d.ts +4 -1
- package/dist/entries/app-rsc-entry.js +131 -66
- package/dist/entries/app-rsc-manifest.d.ts +12 -1
- package/dist/entries/app-rsc-manifest.js +73 -1
- package/dist/entries/app-ssr-entry.d.ts +4 -1
- package/dist/entries/app-ssr-entry.js +9 -2
- package/dist/entries/pages-client-entry.d.ts +1 -0
- package/dist/entries/pages-client-entry.js +6 -6
- package/dist/entries/pages-entry-helpers.js +1 -2
- package/dist/entries/pages-server-entry.d.ts +2 -1
- package/dist/entries/pages-server-entry.js +18 -15
- package/dist/entries/runtime-entry-module.d.ts +1 -0
- package/dist/entries/runtime-entry-module.js +4 -1
- package/dist/image/image-adapters-virtual.d.ts +2 -1
- package/dist/index.d.ts +11 -0
- package/dist/index.js +340 -116
- package/dist/init.js +17 -0
- package/dist/plugins/client-compile-hints.d.ts +30 -0
- package/dist/plugins/client-compile-hints.js +88 -0
- package/dist/plugins/client-reference-dedup.d.ts +2 -1
- package/dist/plugins/cloudflare-dev-module-urls.d.ts +2 -1
- package/dist/plugins/dynamic-preload-metadata.d.ts +3 -1
- package/dist/plugins/dynamic-preload-metadata.js +1 -1
- package/dist/plugins/environment.d.ts +2 -1
- package/dist/plugins/fonts.js +9 -12
- package/dist/plugins/ignore-dynamic-requests.d.ts +2 -1
- package/dist/plugins/import-meta-url.d.ts +2 -1
- package/dist/plugins/og-assets.d.ts +2 -1
- package/dist/plugins/og-assets.js +2 -3
- package/dist/plugins/optimize-imports.d.ts +27 -3
- package/dist/plugins/optimize-imports.js +106 -20
- package/dist/plugins/pages-node-externals.d.ts +2 -1
- package/dist/plugins/remove-console.d.ts +2 -1
- package/dist/plugins/require-condition-resolution.d.ts +2 -1
- package/dist/plugins/rsc-client-reference-loaders.d.ts +53 -1
- package/dist/plugins/rsc-client-reference-loaders.js +447 -27
- package/dist/plugins/rsc-client-shim-excludes.js +2 -0
- package/dist/plugins/sass.d.ts +2 -1
- package/dist/plugins/strip-server-exports.d.ts +2 -1
- package/dist/plugins/styled-jsx.d.ts +2 -1
- package/dist/plugins/transform-result.d.ts +2 -1
- package/dist/plugins/typeof-window.d.ts +2 -1
- package/dist/plugins/use-cache-callable.d.ts +5 -0
- package/dist/plugins/use-cache-callable.js +30 -8
- package/dist/plugins/worker-image-imports.d.ts +1 -0
- package/dist/plugins/worker-image-imports.js +2 -2
- package/dist/plugins/worker-use-server.d.ts +2 -1
- package/dist/routing/app-route-graph.d.ts +41 -1
- package/dist/routing/app-route-graph.js +122 -50
- package/dist/routing/browser-route-manifest.d.ts +44 -0
- package/dist/routing/browser-route-manifest.js +195 -0
- package/dist/routing/hashed-route-patterns.d.ts +4 -0
- package/dist/routing/hashed-route-patterns.js +22 -0
- package/dist/routing/optimistic-route-trie.d.ts +28 -0
- package/dist/routing/optimistic-route-trie.js +102 -0
- package/dist/routing/route-matching.d.ts +2 -1
- package/dist/routing/route-pattern.d.ts +2 -1
- package/dist/routing/route-validation.d.ts +6 -1
- package/dist/routing/route-validation.js +26 -10
- package/dist/server/accept-encoding.d.ts +2 -1
- package/dist/server/app-action-forwarding.d.ts +10 -1
- package/dist/server/app-action-forwarding.js +15 -1
- package/dist/server/app-bfcache-identity.d.ts +2 -1
- package/dist/server/app-browser-action-result.d.ts +2 -1
- package/dist/server/app-browser-client-reuse-manifest.d.ts +2 -1
- package/dist/server/app-browser-entry.js +175 -64
- package/dist/server/app-browser-error.d.ts +5 -2
- package/dist/server/app-browser-error.js +7 -2
- package/dist/server/app-browser-history-controller.d.ts +2 -1
- package/dist/server/app-browser-hydration.d.ts +2 -1
- package/dist/server/app-browser-interception-context.d.ts +4 -3
- package/dist/server/app-browser-mpa-navigation.d.ts +1 -0
- package/dist/server/app-browser-mpa-navigation.js +6 -5
- package/dist/server/app-browser-navigation-controller.d.ts +17 -6
- package/dist/server/app-browser-navigation-controller.js +103 -36
- package/dist/server/app-browser-popstate.d.ts +2 -1
- package/dist/server/app-browser-rsc-redirect.d.ts +2 -1
- package/dist/server/app-browser-server-action-client.d.ts +2 -1
- package/dist/server/app-browser-state.d.ts +2 -2
- package/dist/server/app-browser-state.js +1 -1
- package/dist/server/app-browser-stream.d.ts +2 -1
- package/dist/server/app-browser-visible-commit.d.ts +6 -5
- package/dist/server/app-client-reference-manifest.d.ts +31 -0
- package/dist/server/app-client-reference-manifest.js +46 -0
- package/dist/server/app-client-reference-preloader.d.ts +45 -2
- package/dist/server/app-client-reference-preloader.js +48 -10
- package/dist/server/app-elements-wire.d.ts +2 -1
- package/dist/server/app-elements.d.ts +2 -0
- package/dist/server/app-elements.js +3 -1
- package/dist/server/app-fallback-renderer.d.ts +9 -2
- package/dist/server/app-fallback-renderer.js +6 -2
- package/dist/server/app-history-state.d.ts +2 -1
- package/dist/server/app-inline-css-client.d.ts +2 -1
- package/dist/server/app-layout-param-observation.d.ts +2 -1
- package/dist/server/app-metadata-tracing.d.ts +2 -1
- package/dist/server/app-middleware.d.ts +6 -0
- package/dist/server/app-middleware.js +8 -10
- package/dist/server/app-optimistic-routing.d.ts +26 -11
- package/dist/server/app-optimistic-routing.js +38 -96
- package/dist/server/app-page-boundary-render.d.ts +20 -2
- package/dist/server/app-page-boundary-render.js +229 -39
- package/dist/server/app-page-boundary.d.ts +34 -5
- package/dist/server/app-page-boundary.js +40 -7
- package/dist/server/app-page-cache-finalizer.d.ts +2 -1
- package/dist/server/app-page-cache-finalizer.js +1 -1
- package/dist/server/app-page-cache-render.d.ts +10 -2
- package/dist/server/app-page-cache-render.js +15 -2
- package/dist/server/app-page-cache.js +2 -2
- package/dist/server/app-page-dispatch.d.ts +34 -1
- package/dist/server/app-page-dispatch.js +165 -34
- package/dist/server/app-page-element-builder.d.ts +17 -1
- package/dist/server/app-page-element-builder.js +187 -66
- package/dist/server/app-page-execution.d.ts +28 -1
- package/dist/server/app-page-execution.js +114 -5
- package/dist/server/app-page-head.d.ts +95 -3
- package/dist/server/app-page-head.js +307 -152
- package/dist/server/app-page-http-access-fallback-metadata.d.ts +48 -2
- package/dist/server/app-page-http-access-fallback-metadata.js +76 -1
- package/dist/server/app-page-method.d.ts +2 -1
- package/dist/server/app-page-probe.d.ts +2 -1
- package/dist/server/app-page-render-identity.d.ts +2 -1
- package/dist/server/app-page-render.d.ts +7 -1
- package/dist/server/app-page-render.js +38 -11
- package/dist/server/app-page-request.d.ts +14 -1
- package/dist/server/app-page-request.js +1 -1
- package/dist/server/app-page-route-wiring.d.ts +52 -2
- package/dist/server/app-page-route-wiring.js +197 -47
- package/dist/server/app-page-rsc-render-status.d.ts +3 -1
- package/dist/server/app-page-rsc-render-status.js +1 -0
- package/dist/server/app-page-search-params-observation.d.ts +8 -6
- package/dist/server/app-page-search-params-observation.js +16 -11
- package/dist/server/app-page-segment-plan.d.ts +2 -1
- package/dist/server/app-page-stream.d.ts +38 -1
- package/dist/server/app-page-stream.js +24 -4
- package/dist/server/app-pages-bridge.d.ts +4 -2
- package/dist/server/app-pages-bridge.js +11 -7
- package/dist/server/app-ppr-fallback-shell-render.d.ts +2 -1
- package/dist/server/app-ppr-fallback-shell.d.ts +2 -1
- package/dist/server/app-prerender-endpoints.d.ts +2 -1
- package/dist/server/app-prerender-static-params.d.ts +2 -1
- package/dist/server/app-prerender-static-params.js +3 -2
- package/dist/server/app-render-dependency.d.ts +11 -1
- package/dist/server/app-render-dependency.js +65 -6
- package/dist/server/app-request-stage-independent-entry.d.ts +2 -1
- package/dist/server/app-request-stage-independent-entry.js +2 -2
- package/dist/server/app-response-stage-entry.d.ts +2 -1
- package/dist/server/app-response-stage-entry.js +3 -3
- package/dist/server/app-route-handler-cache.d.ts +2 -1
- package/dist/server/app-route-handler-dispatch.d.ts +2 -1
- package/dist/server/app-route-handler-dispatch.js +4 -2
- package/dist/server/app-route-handler-execution.d.ts +4 -1
- package/dist/server/app-route-handler-execution.js +9 -2
- package/dist/server/app-route-handler-middleware-context.d.ts +2 -1
- package/dist/server/app-route-handler-middleware-context.js +3 -3
- package/dist/server/app-route-handler-response.d.ts +4 -2
- package/dist/server/app-route-handler-response.js +2 -2
- package/dist/server/app-route-handler-runtime.d.ts +4 -1
- package/dist/server/app-route-handler-runtime.js +20 -3
- package/dist/server/app-route-module-loader.d.ts +18 -1
- package/dist/server/app-route-module-loader.js +15 -6
- package/dist/server/app-route-tree-prefetch.d.ts +2 -1
- package/dist/server/app-route-tree.d.ts +20 -0
- package/dist/server/app-route-tree.js +18 -0
- package/dist/server/app-router-entry.js +2 -2
- package/dist/server/app-rsc-combined-handler.js +8 -1
- package/dist/server/app-rsc-error-handler.d.ts +2 -1
- package/dist/server/app-rsc-errors.d.ts +9 -1
- package/dist/server/app-rsc-errors.js +9 -2
- package/dist/server/app-rsc-handler.d.ts +6 -2
- package/dist/server/app-rsc-handler.js +152 -140
- package/dist/server/app-rsc-response-finalizer.d.ts +7 -1
- package/dist/server/app-rsc-response-finalizer.js +4 -1
- package/dist/server/app-rsc-response-stage.js +3 -1
- package/dist/server/app-rsc-route-matching.d.ts +39 -1
- package/dist/server/app-rsc-route-matching.js +25 -1
- package/dist/server/app-segment-config.d.ts +2 -1
- package/dist/server/app-segment-config.js +1 -14
- package/dist/server/app-server-action-execution.d.ts +25 -7
- package/dist/server/app-server-action-execution.js +53 -59
- package/dist/server/app-ssr-entry.d.ts +12 -0
- package/dist/server/app-ssr-entry.js +104 -48
- package/dist/server/app-ssr-error-meta.d.ts +2 -1
- package/dist/server/app-ssr-search-params-gate.d.ts +2 -1
- package/dist/server/app-ssr-stream.d.ts +29 -10
- package/dist/server/app-ssr-stream.js +311 -67
- package/dist/server/app-static-generation.d.ts +2 -1
- package/dist/server/app-streamed-client-references.d.ts +39 -0
- package/dist/server/app-streamed-client-references.js +156 -0
- package/dist/server/app-visited-response-cache.d.ts +2 -1
- package/dist/server/app-worker-stages.d.ts +2 -1
- package/dist/server/artifact-compatibility.d.ts +2 -1
- package/dist/server/bfcache-identity.d.ts +2 -1
- package/dist/server/cache-headers.d.ts +2 -1
- package/dist/server/cacheability-request.d.ts +2 -1
- package/dist/server/client-reuse-manifest.d.ts +2 -1
- package/dist/server/config-headers.d.ts +2 -1
- package/dist/server/config-headers.js +12 -3
- package/dist/server/csp.d.ts +2 -1
- package/dist/server/default-global-not-found-module.d.ts +2 -1
- package/dist/server/default-http-access-fallback-modules.d.ts +33 -0
- package/dist/server/default-http-access-fallback-modules.js +31 -0
- package/dist/server/defer-until-stream-consumed.d.ts +34 -0
- package/dist/server/defer-until-stream-consumed.js +154 -21
- package/dist/server/dev-lockfile.d.ts +32 -2
- package/dist/server/dev-lockfile.js +46 -2
- package/dist/server/dev-module-runner.d.ts +2 -1
- package/dist/server/dev-server.js +10 -3
- package/dist/server/fetch-handler.js +1 -2
- package/dist/server/file-based-metadata.d.ts +2 -1
- package/dist/server/framework-tracer.d.ts +2 -1
- package/dist/server/html.d.ts +1 -0
- package/dist/server/html.js +19 -1
- package/dist/server/http-conditional.d.ts +2 -1
- package/dist/server/http-error-responses.d.ts +2 -1
- package/dist/server/implicit-tags.d.ts +2 -1
- package/dist/server/isolate-shared-promise.d.ts +10 -0
- package/dist/server/isolate-shared-promise.js +33 -0
- package/dist/server/isr-cache.js +3 -2
- package/dist/server/metadata-route-build-data.d.ts +2 -1
- package/dist/server/metadata-route-build-data.js +1 -1
- package/dist/server/metadata-route-response.d.ts +2 -1
- package/dist/server/metadata-route-response.js +1 -1
- package/dist/server/metadata-routes.d.ts +2 -1
- package/dist/server/middleware-matcher-pattern.d.ts +0 -1
- package/dist/server/middleware-matcher-pattern.js +11 -140
- package/dist/server/middleware-matcher.js +5 -6
- package/dist/server/middleware-response-headers.d.ts +31 -0
- package/dist/server/middleware-response-headers.js +57 -1
- package/dist/server/middleware-runtime.d.ts +2 -1
- package/dist/server/middleware-runtime.js +26 -13
- package/dist/server/navigation-planner.d.ts +2 -2
- package/dist/server/navigation-trace.d.ts +2 -1
- package/dist/server/next-error-digest.d.ts +2 -1
- package/dist/server/nitro-public-files-plugin.d.ts +39 -0
- package/dist/server/nitro-public-files-plugin.js +106 -0
- package/dist/server/nitro-public-files.d.ts +22 -0
- package/dist/server/nitro-public-files.js +39 -0
- package/dist/server/opentelemetry-api.d.ts +2 -1
- package/dist/server/operation-token.d.ts +2 -1
- package/dist/server/pages-api-route.d.ts +2 -1
- package/dist/server/pages-asset-tags.d.ts +7 -1
- package/dist/server/pages-asset-tags.js +9 -2
- package/dist/server/pages-body-parser-config.d.ts +2 -1
- package/dist/server/pages-client-assets.d.ts +8 -1
- package/dist/server/pages-data-route.d.ts +2 -1
- package/dist/server/pages-document-asset-props.d.ts +2 -1
- package/dist/server/pages-document-initial-props.d.ts +2 -1
- package/dist/server/pages-execution-tracing.d.ts +2 -1
- package/dist/server/pages-execution-tracing.js +1 -1
- package/dist/server/pages-get-initial-props.d.ts +2 -1
- package/dist/server/pages-i18n.d.ts +18 -0
- package/dist/server/pages-i18n.js +18 -2
- package/dist/server/pages-node-compat.d.ts +5 -3
- package/dist/server/pages-node-compat.js +35 -16
- package/dist/server/pages-page-data.d.ts +7 -1
- package/dist/server/pages-page-data.js +35 -12
- package/dist/server/pages-page-handler.d.ts +3 -2
- package/dist/server/pages-page-handler.js +16 -7
- package/dist/server/pages-page-method.d.ts +2 -1
- package/dist/server/pages-page-response.d.ts +2 -1
- package/dist/server/pages-preview.d.ts +2 -1
- package/dist/server/pages-readiness.d.ts +2 -1
- package/dist/server/pages-request-pipeline.d.ts +8 -2
- package/dist/server/pages-request-pipeline.js +35 -40
- package/dist/server/pages-request-stage-entry.d.ts +2 -1
- package/dist/server/pages-request-stage-entry.js +16 -6
- package/dist/server/pages-response-stage-entry.d.ts +2 -1
- package/dist/server/pages-response-stage-entry.js +1 -1
- package/dist/server/pages-revalidate.js +1 -0
- package/dist/server/pages-route-data-kind.d.ts +2 -1
- package/dist/server/pages-router-entry.js +1 -1
- package/dist/server/prerender-cache-life-header.d.ts +2 -1
- package/dist/server/prerender-route-params.d.ts +2 -1
- package/dist/server/prod-server.d.ts +2 -2
- package/dist/server/prod-server.js +80 -36
- package/dist/server/proxy-trust.d.ts +6 -0
- package/dist/server/proxy-trust.js +12 -6
- package/dist/server/request-log.d.ts +2 -1
- package/dist/server/request-pipeline.d.ts +5 -0
- package/dist/server/request-pipeline.js +12 -1
- package/dist/server/request-tracing.d.ts +2 -1
- package/dist/server/request-tracing.js +1 -1
- package/dist/server/response-start-tracing.js +7 -29
- package/dist/server/rsc-render-stream.d.ts +4 -0
- package/dist/server/rsc-render-stream.js +25 -0
- package/dist/server/seed-cache.d.ts +2 -1
- package/dist/server/seed-cache.js +1 -1
- package/dist/server/server-reference-loader.js +10 -1
- package/dist/server/static-file-cache.d.ts +2 -1
- package/dist/server/static-file-cache.js +16 -3
- package/dist/server/static-layout-client-reuse-proof.d.ts +2 -1
- package/dist/server/worker-revalidation-context.d.ts +2 -1
- package/dist/server/worker-stages.d.ts +2 -1
- package/dist/server/worker-utils.js +1 -1
- package/dist/shims/app.d.ts +2 -1
- package/dist/shims/cache-callable-runtime.d.ts +2 -1
- package/dist/shims/cache-handler.d.ts +8 -3
- package/dist/shims/cache-handler.js +32 -11
- package/dist/shims/cache-request-state.d.ts +40 -3
- package/dist/shims/cache-request-state.js +70 -5
- package/dist/shims/cache-runtime.js +47 -19
- package/dist/shims/cache.d.ts +2 -2
- package/dist/shims/cache.js +17 -8
- package/dist/shims/caught-not-found-boundaries.d.ts +15 -0
- package/dist/shims/caught-not-found-boundaries.js +48 -0
- package/dist/shims/cdn-purge-routes.d.ts +25 -0
- package/dist/shims/cdn-purge-routes.js +77 -0
- package/dist/shims/client-locale.js +2 -1
- package/dist/shims/client-page-root.d.ts +2 -1
- package/dist/shims/config.d.ts +2 -1
- package/dist/shims/default-forbidden.d.ts +4 -0
- package/dist/shims/default-forbidden.js +18 -0
- package/dist/shims/default-not-found.d.ts +0 -5
- package/dist/shims/default-not-found.js +5 -41
- package/dist/shims/default-unauthorized.d.ts +4 -0
- package/dist/shims/default-unauthorized.js +18 -0
- package/dist/shims/dynamic.js +17 -4
- package/dist/shims/error-boundary.d.ts +39 -3
- package/dist/shims/error-boundary.js +31 -16
- package/dist/shims/font-google.js +1 -2
- package/dist/shims/font-utils.d.ts +3 -2
- package/dist/shims/font-utils.js +5 -3
- package/dist/shims/form.js +9 -4
- package/dist/shims/http-access-error-fallback.d.ts +7 -0
- package/dist/shims/http-access-error-fallback.js +47 -0
- package/dist/shims/image-props.d.ts +93 -0
- package/dist/shims/image-props.js +323 -0
- package/dist/shims/image.d.ts +4 -39
- package/dist/shims/image.js +4 -319
- package/dist/shims/internal/app-prefetch-fetch-queue.d.ts +22 -2
- package/dist/shims/internal/app-prefetch-fetch-queue.js +71 -18
- package/dist/shims/internal/app-route-prefetch-policy.d.ts +14 -3
- package/dist/shims/internal/app-route-prefetch-policy.js +29 -4
- package/dist/shims/internal/cache-context-accessor.d.ts +2 -1
- package/dist/shims/internal/client-reference-loader.d.ts +7 -0
- package/dist/shims/internal/client-reference-loader.js +91 -0
- package/dist/shims/internal/cookie-serialize.d.ts +2 -1
- package/dist/shims/internal/cookies.js +1 -2
- package/dist/shims/internal/headers-state.d.ts +9 -0
- package/dist/shims/internal/headers-state.js +19 -2
- package/dist/shims/internal/hybrid-client-route-owner-direct.d.ts +6 -2
- package/dist/shims/internal/hybrid-client-route-owner-direct.js +31 -14
- package/dist/shims/internal/hybrid-client-route-owner.js +8 -8
- package/dist/shims/internal/interpolate-as.d.ts +2 -1
- package/dist/shims/internal/pages-data-target.d.ts +2 -1
- package/dist/shims/internal/pages-data-url.d.ts +2 -1
- package/dist/shims/internal/thenable-well-known-properties.d.ts +2 -1
- package/dist/shims/link.js +198 -53
- package/dist/shims/metadata.d.ts +32 -11
- package/dist/shims/metadata.js +88 -26
- package/dist/shims/navigation-errors.d.ts +2 -1
- package/dist/shims/navigation.d.ts +23 -3
- package/dist/shims/navigation.js +91 -25
- package/dist/shims/og.js +35 -10
- package/dist/shims/pages-router-runtime.d.ts +2 -1
- package/dist/shims/ppr-fallback-shell.d.ts +2 -1
- package/dist/shims/request-context.d.ts +13 -0
- package/dist/shims/router.js +33 -43
- package/dist/shims/server.d.ts +31 -4
- package/dist/shims/server.js +58 -10
- package/dist/shims/thenable-params.d.ts +6 -1
- package/dist/shims/thenable-params.js +11 -2
- package/dist/shims/unified-request-context.d.ts +5 -0
- package/dist/shims/unified-request-context.js +5 -3
- package/dist/typegen.d.ts +2 -1
- package/dist/utils/asset-prefix.d.ts +7 -0
- package/dist/utils/asset-prefix.js +10 -1
- package/dist/utils/client-build-manifest.d.ts +4 -1
- package/dist/utils/client-build-manifest.js +20 -6
- package/dist/utils/client-entry-manifest.d.ts +13 -0
- package/dist/utils/client-entry-manifest.js +20 -1
- package/dist/utils/client-reference-chunks.d.ts +45 -0
- package/dist/utils/client-reference-chunks.js +30 -0
- package/dist/utils/client-runtime-metadata.d.ts +10 -1
- package/dist/utils/client-runtime-metadata.js +53 -9
- package/dist/utils/compare.d.ts +9 -0
- package/dist/utils/compare.js +15 -1
- package/dist/utils/lazy-chunks.d.ts +18 -0
- package/dist/utils/lazy-chunks.js +27 -1
- package/dist/utils/manifest-paths.d.ts +14 -0
- package/dist/utils/manifest-paths.js +22 -1
- package/dist/utils/middleware-request-headers.d.ts +2 -1
- package/dist/utils/path-to-regexp.d.ts +21 -0
- package/dist/{server/middleware-path-to-regexp.js → utils/path-to-regexp.js} +14 -11
- package/dist/utils/plugin-react-version.d.ts +15 -0
- package/dist/utils/plugin-react-version.js +64 -0
- package/dist/utils/project.d.ts +2 -1
- package/dist/utils/project.js +9 -1
- package/dist/utils/public-routes.d.ts +2 -0
- package/dist/utils/public-routes.js +18 -7
- package/dist/utils/query.d.ts +2 -1
- package/dist/utils/sorted-array.d.ts +2 -1
- package/dist/utils/vite-cli-invocation.d.ts +2 -1
- package/package.json +5 -5
- package/dist/deps/.pnpm/image-size@2.0.2/deps/image-size/dist/index.js +0 -808
- package/dist/server/default-not-found-module.d.ts +0 -19
- package/dist/server/default-not-found-module.js +0 -18
- package/dist/server/middleware-path-to-regexp.d.ts +0 -13
- package/dist/server/rsc-stream-hints.d.ts +0 -21
- package/dist/server/rsc-stream-hints.js +0 -227
- package/dist/utils/regex-safety.d.ts +0 -17
- package/dist/utils/regex-safety.js +0 -789
|
@@ -4,25 +4,72 @@ import { matchRoutePattern } from "../routing/route-pattern.js";
|
|
|
4
4
|
import { createAppPageRenderDependency, invokeAppComponent, isAppClientReference, isAppRenderSuspension, isReactOwnedAppComponent, renderAfterAppDependencies } from "./app-render-dependency.js";
|
|
5
5
|
import { AppElementsWire } from "./app-elements-wire.js";
|
|
6
6
|
import "./app-elements.js";
|
|
7
|
+
import { ErrorBoundary, ForbiddenBoundary, NotFoundBoundary, UnauthorizedBoundary } from "../shims/error-boundary.js";
|
|
7
8
|
import { withUseCacheLayoutMarker, withUseCachePageMarker } from "../shims/internal/app-page-props-cache-key.js";
|
|
8
9
|
import { makeThenableParams } from "../shims/thenable-params.js";
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
10
|
+
import { tagAppPagePageError, tagAppPageSlotError } from "./app-page-execution.js";
|
|
11
|
+
import { resolveAppPageBranchParams } from "./app-page-params.js";
|
|
11
12
|
import { APP_PAGE_SEGMENT_KEY, isAppPageRouteGroupSegment, resolveAppPagePatternStateKey, resolveAppPageRouteStateKey } from "./app-page-segment-state.js";
|
|
12
13
|
import { sanitizeErrorForClient } from "./app-rsc-errors.js";
|
|
13
14
|
import { resolveAppPageModuleTraceSegment, traceCreateComponentTree, traceGetLayoutOrPageModule } from "./app-page-tracing.js";
|
|
14
15
|
import { buildAppPageElements, createAppPageSourcePage, createAppPageTreePath, resolveAppPageLoadingModuleAtOrAbove } from "./app-page-route-wiring.js";
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
16
|
+
import { createAppPageMetadataSearchParamsObserver, makeObservedAppPageSearchParamsThenable } from "./app-page-search-params-observation.js";
|
|
17
|
+
import { collectAppPageSearchParams, hasAppPageDynamicMetadata, prepareAppPageHead, resolveActiveParallelRouteHeadInputs, slotInterceptKeepsSourceHead } from "./app-page-head.js";
|
|
18
|
+
import { createRouteNotFoundHeadPlanOptions, recoverAppPageRouteHead } from "./app-page-http-access-fallback-metadata.js";
|
|
17
19
|
import { ClientPageRoot } from "../shims/client-page-root.js";
|
|
18
20
|
import "./app-rsc-route-matching.js";
|
|
19
|
-
import { resolveAppPageParentHttpAccessBoundary } from "./app-page-boundary.js";
|
|
20
21
|
import { DEFAULT_GLOBAL_ERROR_MODULE } from "./default-global-error-module.js";
|
|
21
22
|
import { createAppPageRenderIdentity } from "./app-page-render-identity.js";
|
|
22
|
-
import { createAppPageSearchParamsObserver, makeObservedAppPageSearchParamsThenable } from "./app-page-search-params-observation.js";
|
|
23
23
|
import { shouldServeStreamingMetadata } from "./streaming-metadata.js";
|
|
24
|
-
import { Suspense, cache, createElement } from "react";
|
|
24
|
+
import { Fragment, Suspense, cache, createElement } from "react";
|
|
25
25
|
//#region src/server/app-page-element-builder.ts
|
|
26
|
+
/**
|
|
27
|
+
* A sibling intercepting page that renders beside its intercepting layouts,
|
|
28
|
+
* as Next.js renders each segment. The source route's layouts wait for the
|
|
29
|
+
* page, so `Starter` invokes it ahead of the layouts, even when one of them
|
|
30
|
+
* never renders its children, and `Outlet` renders its result where the
|
|
31
|
+
* innermost layout renders its children.
|
|
32
|
+
*/
|
|
33
|
+
function createSiblingInterceptPageSlot(invokePage, releaseRenderDependency) {
|
|
34
|
+
let outcome = null;
|
|
35
|
+
function Starter() {
|
|
36
|
+
try {
|
|
37
|
+
const result = invokePage();
|
|
38
|
+
if (isPromiseLike(result)) Promise.resolve(result).catch(() => {});
|
|
39
|
+
outcome = { result };
|
|
40
|
+
} catch (error) {
|
|
41
|
+
if (!isAppRenderSuspension(error)) outcome = { error };
|
|
42
|
+
else {
|
|
43
|
+
Promise.resolve().then(releaseRenderDependency);
|
|
44
|
+
outcome = { suspended: true };
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
function readOutcome(current) {
|
|
50
|
+
if ("error" in current) throw current.error;
|
|
51
|
+
return "result" in current ? current.result : invokePage();
|
|
52
|
+
}
|
|
53
|
+
function Outlet() {
|
|
54
|
+
return outcome ? readOutcome(outcome) : invokePage();
|
|
55
|
+
}
|
|
56
|
+
return {
|
|
57
|
+
Outlet,
|
|
58
|
+
Starter
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
/** How many leading layouts two branches of one slot have in common. */
|
|
62
|
+
function countSharedLeadingLayouts(visibleLayouts, hiddenLayouts) {
|
|
63
|
+
const visible = visibleLayouts ?? [];
|
|
64
|
+
const hidden = hiddenLayouts ?? [];
|
|
65
|
+
let count = 0;
|
|
66
|
+
while (count < visible.length && count < hidden.length && visible[count] === hidden[count]) count++;
|
|
67
|
+
return count;
|
|
68
|
+
}
|
|
69
|
+
async function AppPageInterceptMetadataOutlet(props) {
|
|
70
|
+
return props.resolveHead().interceptOutlet;
|
|
71
|
+
}
|
|
72
|
+
AppPageInterceptMetadataOutlet.displayName = "Vinext.InterceptMetadataOutlet";
|
|
26
73
|
function resolveInterceptLayoutParams(branchSegments, layoutSegments, params) {
|
|
27
74
|
return resolveAppPageBranchParams(branchSegments, layoutSegments.length, params, layoutSegments);
|
|
28
75
|
}
|
|
@@ -60,7 +107,7 @@ function traceAppPageInterceptLayoutModules(modules, branchSegments, layoutSegme
|
|
|
60
107
|
async function buildPageElements(options) {
|
|
61
108
|
const { route, params, routePath, displayPathname = routePath, pageRequest, globalErrorModule, rootNotFoundModule, rootForbiddenModule, rootUnauthorizedModule, metadataRoutes } = options;
|
|
62
109
|
const slotParamOverrides = resolveSlotParamOverrides(route, routePath);
|
|
63
|
-
const { opts, searchParams, isRscRequest, mountedSlotsHeader, renderMode = APP_RSC_RENDER_MODE_NAVIGATION, observeMetadataSearchParamsAccess = false, observePageSearchParamsAccess = false, isForceStatic = false, serveStreamingMetadata, placeStreamedMetadataInHead = false, isProduction = process.env.NODE_ENV === "production" } = pageRequest;
|
|
110
|
+
const { opts, searchParams, isRscRequest, mountedSlotsHeader, renderMode = APP_RSC_RENDER_MODE_NAVIGATION, observeMetadataSearchParamsAccess = false, observePageSearchParamsAccess = false, isForceStatic = false, isUncacheableRender = false, serveStreamingMetadata, placeStreamedMetadataInHead = false, isProduction = process.env.NODE_ENV === "production", onHeadPrepared } = pageRequest;
|
|
64
111
|
const pageModule = route.page;
|
|
65
112
|
const isSiblingIntercept = opts?.interceptSlotKey === "__vinext_page_intercept" && !!opts?.interceptPage;
|
|
66
113
|
const effectivePageModule = isSiblingIntercept ? opts.interceptPage : pageModule;
|
|
@@ -138,14 +185,39 @@ async function buildPageElements(options) {
|
|
|
138
185
|
} : {},
|
|
139
186
|
ownerTreePosition: route.routeSegments?.length ?? 0
|
|
140
187
|
} : null;
|
|
141
|
-
const
|
|
142
|
-
const
|
|
188
|
+
const interceptSlotKey = opts?.interceptPage != null && !isSiblingIntercept ? opts?.interceptSlotKey ?? null : null;
|
|
189
|
+
const sourceParallelRouteInputs = interceptSlotKey ? resolveActiveParallelRouteHeadInputs({
|
|
190
|
+
layoutTreePositions: route.layoutTreePositions,
|
|
191
|
+
params,
|
|
192
|
+
routeSegments: route.routeSegments ?? [],
|
|
193
|
+
slotParams: slotParamOverrides,
|
|
194
|
+
slots: route.slots ?? null
|
|
195
|
+
}) : null;
|
|
196
|
+
const keepsSourceHead = interceptSlotKey !== null && sourceParallelRouteInputs !== null && slotInterceptKeepsSourceHead({
|
|
197
|
+
interceptSlotKey,
|
|
198
|
+
route,
|
|
199
|
+
sourceParallelRoutes: sourceParallelRouteInputs
|
|
200
|
+
});
|
|
201
|
+
const headParallelRouteInputs = keepsSourceHead && sourceParallelRouteInputs ? sourceParallelRouteInputs : activeParallelRouteHeadInputs;
|
|
202
|
+
const parallelRoutes = [...primaryParallelRouteHeadInput ? [primaryParallelRouteHeadInput.head] : [], ...headParallelRouteInputs.map((input) => input.head)];
|
|
203
|
+
const interceptHeadInput = keepsSourceHead && interceptSlotKey ? activeParallelRouteHeadInputs.find((input) => input.slotKey === interceptSlotKey) : void 0;
|
|
204
|
+
const interceptSlotIndex = interceptHeadInput ? headParallelRouteInputs.findIndex((input) => input.slotKey === interceptSlotKey) : -1;
|
|
205
|
+
const hiddenParallelRoutes = interceptHeadInput ? [{
|
|
206
|
+
parallelRouteIndex: interceptSlotIndex === -1 ? -1 : interceptSlotIndex + (primaryParallelRouteHeadInput ? 1 : 0),
|
|
207
|
+
route: interceptHeadInput.head,
|
|
208
|
+
sharedLayoutCount: interceptSlotIndex === -1 ? 0 : countSharedLeadingLayouts(headParallelRouteInputs[interceptSlotIndex].head.layoutModules, interceptHeadInput.head.layoutModules)
|
|
209
|
+
}] : null;
|
|
210
|
+
const outletSlotIndex = interceptSlotKey !== null && !keepsSourceHead ? headParallelRouteInputs.findIndex((input) => input.slotKey === interceptSlotKey) : -1;
|
|
211
|
+
const outletParallelRouteIndex = outletSlotIndex === -1 ? null : outletSlotIndex + (primaryParallelRouteHeadInput ? 1 : 0);
|
|
212
|
+
const metadataSearchParamsObserver = createAppPageMetadataSearchParamsObserver(observeMetadataSearchParamsAccess);
|
|
143
213
|
const headOptions = {
|
|
144
214
|
applyFileBasedMetadata: options.applyFileBasedMetadata,
|
|
145
215
|
basePath: options.basePath ?? "",
|
|
216
|
+
hiddenParallelRoutes,
|
|
146
217
|
layoutModules: route.layouts,
|
|
147
218
|
layoutTreePositions: route.layoutTreePositions,
|
|
148
219
|
metadataRoutes,
|
|
220
|
+
outletParallelRouteIndex,
|
|
149
221
|
pageModule: isSiblingIntercept ? null : effectivePageModule ?? null,
|
|
150
222
|
parallelRoutes,
|
|
151
223
|
params: effectiveParams,
|
|
@@ -158,54 +230,38 @@ async function buildPageElements(options) {
|
|
|
158
230
|
const { pageSearchParams } = collectAppPageSearchParams(searchParams);
|
|
159
231
|
const streamGeneratedHead = serveStreamingMetadata ?? shouldServeStreamingMetadata(pageRequest.request.headers.get("user-agent") ?? "", options.htmlLimitedBots);
|
|
160
232
|
const metadataPlacement = hasDynamicMetadata && streamGeneratedHead && !placeStreamedMetadataInHead ? "body" : "head";
|
|
161
|
-
const
|
|
162
|
-
|
|
163
|
-
const
|
|
164
|
-
|
|
165
|
-
rootForbiddenModule,
|
|
166
|
-
rootNotFoundModule,
|
|
167
|
-
rootUnauthorizedModule,
|
|
168
|
-
routeForbiddenModules: route.forbiddens,
|
|
169
|
-
routeNotFoundModules: route.notFounds,
|
|
170
|
-
routeUnauthorizedModules: route.unauthorizeds,
|
|
171
|
-
statusCode: 404
|
|
172
|
-
});
|
|
173
|
-
const boundaryModule = routeBoundaryModule ?? parentBoundary.module;
|
|
174
|
-
const boundaryTreePosition = routeBoundaryModule ? route.notFoundTreePosition : parentBoundary.layoutIndex === null ? null : route.layoutTreePositions?.[parentBoundary.layoutIndex];
|
|
175
|
-
return {
|
|
176
|
-
boundaryModule,
|
|
177
|
-
boundaryParams: boundaryModule && boundaryTreePosition != null ? resolveAppPageSegmentParams(route.routeSegments ?? [], boundaryTreePosition, effectiveParams) : {},
|
|
178
|
-
boundaryRouteSegments: (route.routeSegments ?? []).slice(0, boundaryTreePosition ?? 0),
|
|
179
|
-
errorConvention: "not-found",
|
|
180
|
-
layoutModules: route.layouts,
|
|
181
|
-
layoutTreePositions: route.layoutTreePositions,
|
|
182
|
-
parallelBranches: activeParallelRouteHeadInputs,
|
|
183
|
-
params: effectiveParams,
|
|
184
|
-
primaryParallelBranch: primaryParallelRouteHeadInput,
|
|
185
|
-
routeSegments: route.routeSegments ?? null
|
|
186
|
-
};
|
|
187
|
-
};
|
|
188
|
-
const resolveMetadataErrorTags = async (error) => {
|
|
189
|
-
if (resolveAppPageSpecialError(error)?.kind !== "http-access-fallback") return null;
|
|
190
|
-
return resolveHttpAccessFallbackMetadata({
|
|
233
|
+
const toClientError = (error) => isProduction ? sanitizeErrorForClient(error, "production") : error;
|
|
234
|
+
const resolveHead = cache(() => {
|
|
235
|
+
const preparedHead = prepareAppPageHead(headOptions);
|
|
236
|
+
const recoveredHead = recoverAppPageRouteHead(preparedHead, {
|
|
191
237
|
applyFileBasedMetadata: options.applyFileBasedMetadata,
|
|
192
238
|
basePath: options.basePath ?? "",
|
|
193
|
-
...resolveNotFoundFallbackPlanOptions(),
|
|
194
239
|
metadataRoutes,
|
|
240
|
+
resolvePlanOptions: () => createRouteNotFoundHeadPlanOptions({
|
|
241
|
+
parallelBranches: headParallelRouteInputs,
|
|
242
|
+
params: effectiveParams,
|
|
243
|
+
primaryParallelBranch: primaryParallelRouteHeadInput,
|
|
244
|
+
rootNotFoundModule,
|
|
245
|
+
route
|
|
246
|
+
}),
|
|
195
247
|
routePath: route.pattern
|
|
196
|
-
})
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
const outlet =
|
|
248
|
+
});
|
|
249
|
+
onHeadPrepared?.({
|
|
250
|
+
...recoveredHead,
|
|
251
|
+
metadataPlacement
|
|
252
|
+
});
|
|
253
|
+
const outlet = preparedHead.routeErrors.then(null, (error) => {
|
|
202
254
|
throw toClientError(error);
|
|
203
255
|
});
|
|
204
256
|
outlet.catch(() => null);
|
|
257
|
+
const interceptOutlet = preparedHead.hiddenErrors.then(null, (error) => {
|
|
258
|
+
throw toClientError(error);
|
|
259
|
+
});
|
|
260
|
+
interceptOutlet.catch(() => null);
|
|
205
261
|
return {
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
262
|
+
...recoveredHead,
|
|
263
|
+
interceptOutlet,
|
|
264
|
+
outlet
|
|
209
265
|
};
|
|
210
266
|
});
|
|
211
267
|
const pageProps = { params: makeThenableParams(effectiveParams) };
|
|
@@ -217,7 +273,7 @@ async function buildPageElements(options) {
|
|
|
217
273
|
}, pageTreePosition) !== null;
|
|
218
274
|
const hasEmptyClientPageSearchParams = isForceStatic || isProduction && process.env.__NEXT_CONFIG_OUTPUT === "export";
|
|
219
275
|
const pageRenderDependency = EffectivePageComponent && !isReactOwnedAppComponent(EffectivePageComponent) ? createAppPageRenderDependency() : null;
|
|
220
|
-
const createPageElement = (PageComponent, props, renderDependency) => {
|
|
276
|
+
const createPageElement = (PageComponent, props, renderDependency, tagError) => {
|
|
221
277
|
if (searchParams && isAppClientReference(PageComponent)) {
|
|
222
278
|
const { searchParams: _slotSearchParams, ...pageProps } = props;
|
|
223
279
|
return createElement(ClientPageRoot, {
|
|
@@ -231,14 +287,19 @@ async function buildPageElements(options) {
|
|
|
231
287
|
if (searchParams) invocationProps.searchParams = observePageSearchParamsAccess ? makeObservedAppPageSearchParamsThenable(pageSearchParams) : makeThenableParams(pageSearchParams);
|
|
232
288
|
return createElement(PageComponent, withUseCachePageMarker(PageComponent, invocationProps));
|
|
233
289
|
}
|
|
290
|
+
return createElement(createPageInvoker(PageComponent, props, renderDependency, tagError));
|
|
291
|
+
};
|
|
292
|
+
const createPageInvoker = (PageComponent, props, renderDependency, tagError) => {
|
|
234
293
|
const PageInvoker = () => {
|
|
235
294
|
const invocationProps = { ...props };
|
|
236
295
|
if (searchParams) invocationProps.searchParams = observePageSearchParamsAccess ? makeObservedAppPageSearchParamsThenable(pageSearchParams) : makeThenableParams(pageSearchParams);
|
|
237
296
|
try {
|
|
238
|
-
const result = invokeAppComponent(PageComponent, withUseCachePageMarker(PageComponent, invocationProps));
|
|
297
|
+
const result = invokeAppComponent(PageComponent, withUseCachePageMarker(PageComponent, invocationProps), tagError);
|
|
239
298
|
if (isPromiseLike(result)) {
|
|
240
299
|
if (renderDependency) Promise.resolve().then(() => renderDependency.release());
|
|
241
|
-
return Promise.resolve(result).then((resolvedResult) => renderDependency ? renderAfterAppDependencies(resolvedResult, renderDependency.resultDependencies) : resolvedResult)
|
|
300
|
+
return Promise.resolve(result).then((resolvedResult) => renderDependency ? renderAfterAppDependencies(resolvedResult, renderDependency.resultDependencies) : resolvedResult, tagError === void 0 ? void 0 : (error) => {
|
|
301
|
+
throw tagError(error);
|
|
302
|
+
});
|
|
242
303
|
}
|
|
243
304
|
renderDependency?.release();
|
|
244
305
|
return renderDependency ? renderAfterAppDependencies(result, renderDependency.resultDependencies) : result;
|
|
@@ -248,17 +309,21 @@ async function buildPageElements(options) {
|
|
|
248
309
|
throw error;
|
|
249
310
|
}
|
|
250
311
|
renderDependency?.release();
|
|
251
|
-
throw error;
|
|
312
|
+
throw tagError === void 0 ? error : tagError(error);
|
|
252
313
|
}
|
|
253
314
|
};
|
|
254
|
-
return
|
|
315
|
+
return PageInvoker;
|
|
255
316
|
};
|
|
256
317
|
const pageSearchParamsThenable = searchParams ? makeThenableParams(pageSearchParams) : void 0;
|
|
257
318
|
const mountedSlotIds = mountedSlotsHeader ? new Set(mountedSlotsHeader.split(" ")) : null;
|
|
258
|
-
const slotOverrides = buildSlotOverrides(route, params, routePath, opts)
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
319
|
+
const slotOverrides = buildSlotOverrides(route, params, routePath, opts, hiddenParallelRoutes || outletParallelRouteIndex !== null ? (() => {
|
|
320
|
+
const outlet = createElement(AppPageInterceptMetadataOutlet, { resolveHead });
|
|
321
|
+
return streamGeneratedHead ? createElement(Suspense, { fallback: null }, outlet) : outlet;
|
|
322
|
+
})() : null);
|
|
323
|
+
const createSiblingInterceptElement = (metadataOutlet) => {
|
|
324
|
+
if (!isSiblingIntercept || !EffectivePageComponent) return null;
|
|
325
|
+
const pageSlot = pageRenderDependency && opts?.interceptLayouts?.some((layoutModule) => layoutModule?.default) ? createSiblingInterceptPageSlot(createPageInvoker(EffectivePageComponent, pageProps, pageRenderDependency), pageRenderDependency.release) : null;
|
|
326
|
+
let element = createElement(Fragment, null, pageSlot ? createElement(pageSlot.Outlet) : createPageElement(EffectivePageComponent, pageProps, pageRenderDependency), metadataOutlet);
|
|
262
327
|
const layoutIndexesByTreePosition = /* @__PURE__ */ new Map();
|
|
263
328
|
for (const [index, layoutModule] of (opts?.interceptLayouts ?? []).entries()) {
|
|
264
329
|
if (!layoutModule) continue;
|
|
@@ -273,12 +338,56 @@ async function buildPageElements(options) {
|
|
|
273
338
|
const treePosition = opts?.interceptLoadingTreePositions?.[index];
|
|
274
339
|
if (treePosition !== void 0) loadingIndexesByTreePosition.set(treePosition, index);
|
|
275
340
|
}
|
|
276
|
-
const
|
|
341
|
+
const notFoundsByTreePosition = /* @__PURE__ */ new Map();
|
|
342
|
+
for (const [index, notFoundModule] of (opts?.interceptNotFounds ?? []).entries()) {
|
|
343
|
+
const treePosition = opts?.interceptNotFoundTreePositions?.[index];
|
|
344
|
+
if (notFoundModule?.default && treePosition !== void 0) notFoundsByTreePosition.set(treePosition, notFoundModule.default);
|
|
345
|
+
}
|
|
346
|
+
const accessBoundaries = [...(opts?.interceptForbiddens ?? []).map((module, index) => [
|
|
347
|
+
module,
|
|
348
|
+
opts?.interceptForbiddenTreePositions?.[index],
|
|
349
|
+
ForbiddenBoundary
|
|
350
|
+
]), ...(opts?.interceptUnauthorizeds ?? []).map((module, index) => [
|
|
351
|
+
module,
|
|
352
|
+
opts?.interceptUnauthorizedTreePositions?.[index],
|
|
353
|
+
UnauthorizedBoundary
|
|
354
|
+
])];
|
|
355
|
+
const accessBoundaryTreePositions = accessBoundaries.flatMap(([module, treePosition]) => module?.default && treePosition != null ? [treePosition] : []);
|
|
356
|
+
const errorsByTreePosition = /* @__PURE__ */ new Map();
|
|
357
|
+
for (const [index, errorModule] of (opts?.interceptErrors ?? []).entries()) {
|
|
358
|
+
const treePosition = opts?.interceptErrorTreePositions?.[index];
|
|
359
|
+
if (errorModule?.default && treePosition !== void 0) errorsByTreePosition.set(treePosition, errorModule.default);
|
|
360
|
+
}
|
|
361
|
+
const treePositions = Array.from(/* @__PURE__ */ new Set([
|
|
362
|
+
...layoutIndexesByTreePosition.keys(),
|
|
363
|
+
...loadingIndexesByTreePosition.keys(),
|
|
364
|
+
...accessBoundaryTreePositions,
|
|
365
|
+
...notFoundsByTreePosition.keys(),
|
|
366
|
+
...errorsByTreePosition.keys()
|
|
367
|
+
])).sort((left, right) => left - right);
|
|
277
368
|
for (let index = treePositions.length - 1; index >= 0; index--) {
|
|
278
369
|
const treePosition = treePositions[index];
|
|
279
370
|
const loadingIndex = loadingIndexesByTreePosition.get(treePosition);
|
|
280
371
|
const LoadingComponent = loadingIndex === void 0 ? null : opts?.interceptLoadings?.[loadingIndex]?.default;
|
|
281
372
|
if (LoadingComponent) element = createElement(Suspense, { fallback: createElement(LoadingComponent) }, element);
|
|
373
|
+
const NotFoundComponent = notFoundsByTreePosition.get(treePosition);
|
|
374
|
+
if (NotFoundComponent) element = createElement(NotFoundBoundary, {
|
|
375
|
+
fallback: createElement(NotFoundComponent),
|
|
376
|
+
children: element
|
|
377
|
+
});
|
|
378
|
+
for (const [module, boundaryTreePosition, AccessBoundary] of accessBoundaries) {
|
|
379
|
+
const FallbackComponent = module?.default;
|
|
380
|
+
if (!FallbackComponent || boundaryTreePosition !== treePosition) continue;
|
|
381
|
+
element = createElement(AccessBoundary, {
|
|
382
|
+
fallback: createElement(FallbackComponent),
|
|
383
|
+
children: element
|
|
384
|
+
});
|
|
385
|
+
}
|
|
386
|
+
const ErrorComponent = errorsByTreePosition.get(treePosition);
|
|
387
|
+
if (ErrorComponent) element = createElement(ErrorBoundary, {
|
|
388
|
+
fallback: ErrorComponent,
|
|
389
|
+
children: element
|
|
390
|
+
});
|
|
282
391
|
const layoutIndexes = layoutIndexesByTreePosition.get(treePosition) ?? [];
|
|
283
392
|
for (let layoutOffset = layoutIndexes.length - 1; layoutOffset >= 0; layoutOffset--) {
|
|
284
393
|
const layoutIndex = layoutIndexes[layoutOffset];
|
|
@@ -291,16 +400,19 @@ async function buildPageElements(options) {
|
|
|
291
400
|
element = createElement(LayoutComponent, withUseCacheLayoutMarker(LayoutComponent, { params: makeThenableParams(interceptLayoutParams) }), element);
|
|
292
401
|
}
|
|
293
402
|
}
|
|
294
|
-
return element;
|
|
403
|
+
return pageSlot ? createElement(Fragment, null, createElement(pageSlot.Starter), element) : element;
|
|
295
404
|
};
|
|
296
405
|
return traceCreateComponentTree(() => {
|
|
297
406
|
if (effectivePageModule) traceGetLayoutOrPageModule(APP_PAGE_SEGMENT_KEY, () => effectivePageModule);
|
|
298
|
-
const siblingInterceptElement = createSiblingInterceptElement();
|
|
299
407
|
return buildAppPageElements({
|
|
300
|
-
element: isSiblingIntercept
|
|
301
|
-
|
|
408
|
+
element: !isSiblingIntercept && EffectivePageComponent ? createPageElement(EffectivePageComponent, pageProps, pageRenderDependency, tagAppPagePageError) : null,
|
|
409
|
+
renderElementWithMetadataOutlet: isSiblingIntercept && EffectivePageComponent ? createSiblingInterceptElement : null,
|
|
410
|
+
createPageElement(component, props, slotLayoutIndex, slotNotFoundBoundary) {
|
|
411
|
+
return createPageElement(component, props, null, slotLayoutIndex === void 0 ? void 0 : (error) => tagAppPageSlotError(error, slotLayoutIndex, slotNotFoundBoundary));
|
|
412
|
+
},
|
|
302
413
|
globalErrorModule: globalErrorModule ?? DEFAULT_GLOBAL_ERROR_MODULE,
|
|
303
414
|
isRscRequest,
|
|
415
|
+
isUncacheableRender,
|
|
304
416
|
interceptionId: opts?.interceptionId ?? null,
|
|
305
417
|
layoutParamAccess: options.layoutParamAccess,
|
|
306
418
|
mountedSlotIds,
|
|
@@ -342,18 +454,27 @@ async function buildPageElements(options) {
|
|
|
342
454
|
* RSC suffix removed). Re-parsing `request.url` here would re-introduce the
|
|
343
455
|
* basePath and silently break the match for any app that configures one.
|
|
344
456
|
*/
|
|
345
|
-
function buildSlotOverrides(route, routeParams, routePath, opts) {
|
|
457
|
+
function buildSlotOverrides(route, routeParams, routePath, opts, interceptMetadataOutlet) {
|
|
346
458
|
const overrides = {};
|
|
347
459
|
if (opts && opts.interceptSlotKey && opts.interceptPage && opts.interceptSlotKey !== "__vinext_page_intercept") overrides[opts.interceptSlotKey] = {
|
|
348
460
|
branchSegments: opts.interceptBranchSegments ?? null,
|
|
349
461
|
identitySegments: resolveInterceptedSlotIdentitySegments(opts.interceptSourcePageSegments, opts.interceptSlotKey),
|
|
462
|
+
forbiddenModules: opts.interceptForbiddens ?? null,
|
|
463
|
+
forbiddenTreePositions: opts.interceptForbiddenTreePositions ?? null,
|
|
350
464
|
layoutModules: opts.interceptLayouts || null,
|
|
351
465
|
layoutSegments: opts.interceptLayoutSegments ?? null,
|
|
352
466
|
loadingModules: opts.interceptLoadings || null,
|
|
353
467
|
loadingTreePositions: opts.interceptLoadingTreePositions ?? null,
|
|
468
|
+
metadataOutlet: interceptMetadataOutlet ?? null,
|
|
469
|
+
notFoundModules: opts.interceptNotFounds ?? null,
|
|
470
|
+
notFoundTreePositions: opts.interceptNotFoundTreePositions ?? null,
|
|
354
471
|
pageModule: opts.interceptPage,
|
|
355
472
|
params: opts.interceptParams || routeParams,
|
|
356
|
-
routeSegments: resolveInterceptedSlotSegments(opts.interceptSourcePageSegments, opts.interceptSlotKey)
|
|
473
|
+
routeSegments: resolveInterceptedSlotSegments(opts.interceptSourcePageSegments, opts.interceptSlotKey),
|
|
474
|
+
unauthorizedModules: opts.interceptUnauthorizeds ?? null,
|
|
475
|
+
unauthorizedTreePositions: opts.interceptUnauthorizedTreePositions ?? null,
|
|
476
|
+
errorModules: opts.interceptErrors ?? null,
|
|
477
|
+
errorTreePositions: opts.interceptErrorTreePositions ?? null
|
|
357
478
|
};
|
|
358
479
|
const slotParamOverrides = resolveSlotParamOverrides(route, routePath);
|
|
359
480
|
for (const [slotKey, params] of Object.entries(slotParamOverrides ?? {})) {
|
|
@@ -3,6 +3,13 @@ import { LayoutFlags } from "./app-elements-wire.js";
|
|
|
3
3
|
import "./app-elements.js";
|
|
4
4
|
//#region src/server/app-page-execution.d.ts
|
|
5
5
|
export declare function tagAppPageMetadataError<T>(error: T): T;
|
|
6
|
+
export declare function tagAppPageSlotError<T>(error: T, layoutIndex: number, notFoundBoundary?: string): T;
|
|
7
|
+
export declare function tagAppPagePageError<T>(error: T): T;
|
|
8
|
+
/**
|
|
9
|
+
* The id of the not-found boundary that catches the route page's notFound():
|
|
10
|
+
* the page-level boundary, or the segment one it passes the signal up to.
|
|
11
|
+
*/
|
|
12
|
+
export declare const APP_PAGE_NOT_FOUND_BOUNDARY_ID = "page";
|
|
6
13
|
export type AppPageSpecialError = {
|
|
7
14
|
kind: "redirect";
|
|
8
15
|
location: string;
|
|
@@ -13,6 +20,8 @@ export type AppPageSpecialError = {
|
|
|
13
20
|
kind: "http-access-fallback";
|
|
14
21
|
statusCode: number;
|
|
15
22
|
fromMetadata?: boolean;
|
|
23
|
+
/** Set when a parallel slot threw it: the layout rendering the outermost such slot. */
|
|
24
|
+
slotLayoutIndex?: number;
|
|
16
25
|
};
|
|
17
26
|
export type AppPageFontPreload = {
|
|
18
27
|
href: string;
|
|
@@ -130,9 +139,27 @@ export declare function resolveAppPageSpecialError(error: unknown): AppPageSpeci
|
|
|
130
139
|
* generateMetadata() threw it comes from the errors the RSC render threw with
|
|
131
140
|
* that digest. When the page threw one too, the page's decides. An error a
|
|
132
141
|
* client component threw during SSR is the page's, since generateMetadata()
|
|
133
|
-
* runs only in the RSC render.
|
|
142
|
+
* runs only in the RSC render. A notFound() / forbidden() / unauthorized()
|
|
143
|
+
* a parallel slot's page threw is caught above the layout rendering it,
|
|
144
|
+
* unless the slot's own not-found catches its notFound() and every other copy
|
|
145
|
+
* is the page's or another slot's. A copy neither threw, such as a template's,
|
|
146
|
+
* keeps the fallback above that layout.
|
|
134
147
|
*/
|
|
135
148
|
export declare function resolveAppPageShellSpecialError(error: unknown, renderedSpecialErrors: readonly unknown[]): AppPageSpecialError | null;
|
|
149
|
+
/**
|
|
150
|
+
* The parallel slot not-found boundaries that catch the `notFound()` that
|
|
151
|
+
* rejected an SSR shell, or null when any copy the RSC render threw isn't
|
|
152
|
+
* caught inside its slot. On the client, each slot's own not-found boundary
|
|
153
|
+
* catches its signal while the rest of the route renders, as in Next.js,
|
|
154
|
+
* which sends an empty error shell and renders them in the browser. A copy
|
|
155
|
+
* no slot threw is caught by the page's boundary beside them when the page
|
|
156
|
+
* threw it, including from a component the page renders, which nothing tags.
|
|
157
|
+
* One a layout or a template threw renders outside the caught boundaries, so
|
|
158
|
+
* the document's render from the same payload throws it again and takes the
|
|
159
|
+
* fallback, which keeps it above the slot's layout (see
|
|
160
|
+
* `resolveAppPageShellSpecialError`). Without a slot's, that fallback renders.
|
|
161
|
+
*/
|
|
162
|
+
export declare function resolveAppPageCaughtNotFoundBoundaries(error: unknown, renderedSpecialErrors: readonly unknown[]): readonly string[] | null;
|
|
136
163
|
/**
|
|
137
164
|
* The response headers stored with a page's special-error entries: a
|
|
138
165
|
* redirect's own `location`, not the response's, which middleware may have
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { VINEXT_RSC_REDIRECT_HEADER, VINEXT_RSC_REDIRECT_TYPE_HEADER } from "./headers.js";
|
|
2
2
|
import { isPromiseLike } from "../utils/promise.js";
|
|
3
3
|
import { runWithConnectionProbe } from "../shims/headers.js";
|
|
4
|
-
import { isThrownNavigationError } from "../shims/navigation-errors.js";
|
|
4
|
+
import { isHTTPAccessFallbackError, isThrownNavigationError } from "../shims/navigation-errors.js";
|
|
5
5
|
import { VINEXT_RSC_CONTENT_TYPE, applyRscCompatibilityIdHeader, applyRscDeploymentIdHeader, createRscRedirectLocation } from "./app-rsc-cache-busting.js";
|
|
6
6
|
import { mergeMiddlewareResponseHeaders } from "./middleware-response-headers.js";
|
|
7
7
|
import { copyLinkHeaderProvenance, getFrameworkLinkHeader, markFrameworkLinkHeaders } from "./app-response-header-provenance.js";
|
|
@@ -40,6 +40,69 @@ function tagAppPageMetadataError(error) {
|
|
|
40
40
|
} catch {}
|
|
41
41
|
return error;
|
|
42
42
|
}
|
|
43
|
+
/**
|
|
44
|
+
* Marker we tag onto an error a parallel slot's page or default component
|
|
45
|
+
* threw, holding the index of the layout that renders the slot. Next.js
|
|
46
|
+
* attaches HTTP access fallback boundaries only to each segment's `children`,
|
|
47
|
+
* so a slot's `notFound()` is caught by the boundary above that layout, not
|
|
48
|
+
* by the route's deepest boundary as the page's is.
|
|
49
|
+
* https://github.com/vercel/next.js/blob/canary/packages/next/src/server/app-render/create-component-tree.tsx
|
|
50
|
+
*/
|
|
51
|
+
const APP_PAGE_SLOT_ERROR_LAYOUT_INDEX = Symbol.for("vinext.appPage.slotErrorLayoutIndex");
|
|
52
|
+
/**
|
|
53
|
+
* Marker holding the id of the slot's own not-found boundary that catches the
|
|
54
|
+
* slot's `notFound()` on the client, when one does. The document then renders
|
|
55
|
+
* that boundary caught (see `resolveAppPageCaughtNotFoundBoundaries`).
|
|
56
|
+
*/
|
|
57
|
+
const APP_PAGE_SLOT_ERROR_NOT_FOUND_BOUNDARY = Symbol.for("vinext.appPage.slotErrorNotFoundBoundary");
|
|
58
|
+
/**
|
|
59
|
+
* Marker we tag onto an error the route's page component threw, so that the
|
|
60
|
+
* document's fallback can tell it from one a layout or a template threw,
|
|
61
|
+
* which no slot tag marks either.
|
|
62
|
+
*/
|
|
63
|
+
const APP_PAGE_PAGE_ERROR = Symbol.for("vinext.appPage.pageError");
|
|
64
|
+
function tagAppPageHttpAccessFallbackError(error, tags) {
|
|
65
|
+
if (!isHTTPAccessFallbackError(error)) return error;
|
|
66
|
+
const source = error;
|
|
67
|
+
const tagged = Object.setPrototypeOf(new Error(String(Reflect.get(source, "message"))), Object.getPrototypeOf(source));
|
|
68
|
+
Object.defineProperties(tagged, {
|
|
69
|
+
...Object.getOwnPropertyDescriptors(source),
|
|
70
|
+
stack: {
|
|
71
|
+
value: Reflect.get(source, "stack"),
|
|
72
|
+
configurable: true,
|
|
73
|
+
writable: true
|
|
74
|
+
},
|
|
75
|
+
...tags
|
|
76
|
+
});
|
|
77
|
+
return tagged;
|
|
78
|
+
}
|
|
79
|
+
function tagAppPageSlotError(error, layoutIndex, notFoundBoundary) {
|
|
80
|
+
return tagAppPageHttpAccessFallbackError(error, {
|
|
81
|
+
[APP_PAGE_SLOT_ERROR_LAYOUT_INDEX]: { value: layoutIndex },
|
|
82
|
+
[APP_PAGE_SLOT_ERROR_NOT_FOUND_BOUNDARY]: { value: notFoundBoundary }
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
function tagAppPagePageError(error) {
|
|
86
|
+
return tagAppPageHttpAccessFallbackError(error, { [APP_PAGE_PAGE_ERROR]: { value: true } });
|
|
87
|
+
}
|
|
88
|
+
function isAppPagePageError(error) {
|
|
89
|
+
return !!error && typeof error === "object" && Reflect.get(error, APP_PAGE_PAGE_ERROR) === true;
|
|
90
|
+
}
|
|
91
|
+
function getAppPageSlotErrorLayoutIndex(error) {
|
|
92
|
+
if (!error || typeof error !== "object") return null;
|
|
93
|
+
const layoutIndex = Reflect.get(error, APP_PAGE_SLOT_ERROR_LAYOUT_INDEX);
|
|
94
|
+
return typeof layoutIndex === "number" ? layoutIndex : null;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* The id of the not-found boundary that catches the route page's notFound():
|
|
98
|
+
* the page-level boundary, or the segment one it passes the signal up to.
|
|
99
|
+
*/
|
|
100
|
+
const APP_PAGE_NOT_FOUND_BOUNDARY_ID = "page";
|
|
101
|
+
function getAppPageSlotErrorNotFoundBoundary(error) {
|
|
102
|
+
if (!error || typeof error !== "object") return null;
|
|
103
|
+
const boundary = Reflect.get(error, APP_PAGE_SLOT_ERROR_NOT_FOUND_BOUNDARY);
|
|
104
|
+
return typeof boundary === "string" ? boundary : null;
|
|
105
|
+
}
|
|
43
106
|
function getAppPageStatusText(statusCode) {
|
|
44
107
|
return statusCode === 403 ? "Forbidden" : statusCode === 401 ? "Unauthorized" : "Not Found";
|
|
45
108
|
}
|
|
@@ -83,16 +146,62 @@ function resolveAppPageSpecialError(error) {
|
|
|
83
146
|
* generateMetadata() threw it comes from the errors the RSC render threw with
|
|
84
147
|
* that digest. When the page threw one too, the page's decides. An error a
|
|
85
148
|
* client component threw during SSR is the page's, since generateMetadata()
|
|
86
|
-
* runs only in the RSC render.
|
|
149
|
+
* runs only in the RSC render. A notFound() / forbidden() / unauthorized()
|
|
150
|
+
* a parallel slot's page threw is caught above the layout rendering it,
|
|
151
|
+
* unless the slot's own not-found catches its notFound() and every other copy
|
|
152
|
+
* is the page's or another slot's. A copy neither threw, such as a template's,
|
|
153
|
+
* keeps the fallback above that layout.
|
|
87
154
|
*/
|
|
88
155
|
function resolveAppPageShellSpecialError(error, renderedSpecialErrors) {
|
|
89
156
|
const specialError = resolveAppPageSpecialError(error);
|
|
90
157
|
if (!specialError || specialError.fromMetadata === true) return specialError;
|
|
91
158
|
if (isThrownNavigationError(error)) return specialError;
|
|
92
|
-
|
|
159
|
+
if (renderedSpecialErrors.length > 0 && renderedSpecialErrors.every((rendered) => resolveAppPageSpecialError(rendered)?.fromMetadata === true)) return {
|
|
93
160
|
...specialError,
|
|
94
161
|
fromMetadata: true
|
|
95
|
-
}
|
|
162
|
+
};
|
|
163
|
+
if (specialError.kind !== "http-access-fallback") return specialError;
|
|
164
|
+
const skipsSlotCaughtNotFound = specialError.statusCode === 404 && renderedSpecialErrors.every((rendered) => isAppPagePageError(rendered) || getAppPageSlotErrorLayoutIndex(rendered) !== null);
|
|
165
|
+
let slotLayoutIndex = null;
|
|
166
|
+
for (const rendered of renderedSpecialErrors) {
|
|
167
|
+
if (skipsSlotCaughtNotFound && getAppPageSlotErrorNotFoundBoundary(rendered) !== null) continue;
|
|
168
|
+
const layoutIndex = getAppPageSlotErrorLayoutIndex(rendered);
|
|
169
|
+
if (layoutIndex !== null && (slotLayoutIndex === null || layoutIndex < slotLayoutIndex)) slotLayoutIndex = layoutIndex;
|
|
170
|
+
}
|
|
171
|
+
return slotLayoutIndex === null ? specialError : {
|
|
172
|
+
...specialError,
|
|
173
|
+
slotLayoutIndex
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* The parallel slot not-found boundaries that catch the `notFound()` that
|
|
178
|
+
* rejected an SSR shell, or null when any copy the RSC render threw isn't
|
|
179
|
+
* caught inside its slot. On the client, each slot's own not-found boundary
|
|
180
|
+
* catches its signal while the rest of the route renders, as in Next.js,
|
|
181
|
+
* which sends an empty error shell and renders them in the browser. A copy
|
|
182
|
+
* no slot threw is caught by the page's boundary beside them when the page
|
|
183
|
+
* threw it, including from a component the page renders, which nothing tags.
|
|
184
|
+
* One a layout or a template threw renders outside the caught boundaries, so
|
|
185
|
+
* the document's render from the same payload throws it again and takes the
|
|
186
|
+
* fallback, which keeps it above the slot's layout (see
|
|
187
|
+
* `resolveAppPageShellSpecialError`). Without a slot's, that fallback renders.
|
|
188
|
+
*/
|
|
189
|
+
function resolveAppPageCaughtNotFoundBoundaries(error, renderedSpecialErrors) {
|
|
190
|
+
const specialError = resolveAppPageSpecialError(error);
|
|
191
|
+
if (specialError?.kind !== "http-access-fallback" || specialError.statusCode !== 404) return null;
|
|
192
|
+
if (isThrownNavigationError(error) || renderedSpecialErrors.length === 0) return null;
|
|
193
|
+
const boundaries = /* @__PURE__ */ new Set();
|
|
194
|
+
let caughtInSlot = false;
|
|
195
|
+
for (const rendered of renderedSpecialErrors) {
|
|
196
|
+
if (resolveAppPageSpecialError(rendered)?.fromMetadata === true) return null;
|
|
197
|
+
const boundary = getAppPageSlotErrorNotFoundBoundary(rendered);
|
|
198
|
+
if (boundary !== null) {
|
|
199
|
+
caughtInSlot = true;
|
|
200
|
+
boundaries.add(boundary);
|
|
201
|
+
} else if (getAppPageSlotErrorLayoutIndex(rendered) === null) boundaries.add(APP_PAGE_NOT_FOUND_BOUNDARY_ID);
|
|
202
|
+
else return null;
|
|
203
|
+
}
|
|
204
|
+
return caughtInSlot ? Array.from(boundaries) : null;
|
|
96
205
|
}
|
|
97
206
|
/**
|
|
98
207
|
* Resolves a redirect() target against the request URL and prepends the
|
|
@@ -325,4 +434,4 @@ function buildAppPageFontLinkHeader(preloads) {
|
|
|
325
434
|
return preloads.map((preload) => `<${preload.href}>; rel=preload; as=font; type=${preload.type}; crossorigin`).join(", ");
|
|
326
435
|
}
|
|
327
436
|
//#endregion
|
|
328
|
-
export { bufferAppPageBinaryStream, buildAppPageFontLinkHeader, buildAppPageSpecialErrorResponse, probeAppPageLayouts, readAppPageBinaryStream, resolveAppPageShellSpecialError, resolveAppPageSpecialError, resolveAppPageSpecialErrorStoredHeaders, tagAppPageMetadataError, teeAppPageRscStreamForCapture };
|
|
437
|
+
export { APP_PAGE_NOT_FOUND_BOUNDARY_ID, bufferAppPageBinaryStream, buildAppPageFontLinkHeader, buildAppPageSpecialErrorResponse, probeAppPageLayouts, readAppPageBinaryStream, resolveAppPageCaughtNotFoundBoundaries, resolveAppPageShellSpecialError, resolveAppPageSpecialError, resolveAppPageSpecialErrorStoredHeaders, tagAppPageMetadataError, tagAppPagePageError, tagAppPageSlotError, teeAppPageRscStreamForCapture };
|