vinext 1.0.0-beta.8 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +158 -84
- package/THIRD_PARTY_LICENSES.md +25 -0
- package/dist/_virtual/_rolldown/runtime.js +25 -0
- package/dist/build/action-owner-manifest.d.ts +8 -9
- package/dist/build/action-owner-manifest.js +23 -5
- package/dist/build/assets-ignore.d.ts +3 -4
- package/dist/build/clean-output.d.ts +2 -3
- package/dist/build/client-build-config.d.ts +40 -12
- package/dist/build/client-build-config.js +76 -6
- package/dist/build/css-url-assets.d.ts +4 -5
- package/dist/build/css-url-assets.js +5 -2
- package/dist/build/google-fonts/build-url.d.ts +3 -4
- package/dist/build/google-fonts/fallback-metrics.d.ts +3 -4
- package/dist/build/google-fonts/find-font-files-in-css.d.ts +2 -3
- package/dist/build/google-fonts/font-metadata.d.ts +2 -3
- package/dist/build/google-fonts/get-axes.d.ts +2 -3
- package/dist/build/google-fonts/sort-variants.d.ts +2 -3
- package/dist/build/google-fonts/validate.d.ts +2 -3
- package/dist/build/google-fonts/validate.js +8 -4
- package/dist/build/inject-pregenerated-paths.d.ts +2 -3
- package/dist/build/inject-pregenerated-paths.js +16 -14
- package/dist/build/inline-css.d.ts +3 -4
- package/dist/build/layout-classification-types.d.ts +4 -5
- package/dist/build/layout-classification.d.ts +7 -8
- package/dist/build/lifecycle.d.ts +42 -0
- package/dist/build/lifecycle.js +253 -0
- package/dist/build/module-dependency-cache.d.ts +2 -3
- package/dist/build/next-client-runtime-manifests.d.ts +4 -5
- package/dist/build/nitro-route-rules.d.ts +6 -7
- package/dist/build/nitro-route-rules.js +1 -1
- package/dist/build/pages-client-assets-module.d.ts +4 -8
- package/dist/build/pages-client-assets-module.js +1 -13
- package/dist/build/precompress.d.ts +2 -3
- package/dist/build/prerender-cloudflare-loader.d.ts +4 -0
- package/dist/build/prerender-cloudflare-loader.js +49 -0
- package/dist/build/prerender-paths.d.ts +82 -8
- package/dist/build/prerender-paths.js +814 -99
- package/dist/build/prerender-phase.d.ts +2 -3
- package/dist/build/prerender-server-entry.js +11 -3
- package/dist/build/prerender-server-pool.d.ts +9 -6
- package/dist/build/prerender-server-pool.js +8 -5
- package/dist/build/prerender.d.ts +67 -15
- package/dist/build/prerender.js +177 -64
- package/dist/build/preview-credentials.d.ts +5 -6
- package/dist/build/preview-credentials.js +2 -2
- package/dist/build/public-dir-conflict.d.ts +5 -6
- package/dist/build/public-dir-conflict.js +2 -1
- package/dist/build/report.d.ts +38 -19
- package/dist/build/report.js +73 -4
- package/dist/build/route-classification-injector.d.ts +2 -3
- package/dist/build/route-classification-manifest.d.ts +5 -6
- package/dist/build/run-prerender.d.ts +11 -9
- package/dist/build/run-prerender.js +25 -16
- package/dist/build/server-entry.d.ts +4 -0
- package/dist/build/server-entry.js +28 -0
- package/dist/build/server-manifest.d.ts +8 -3
- package/dist/build/server-manifest.js +14 -2
- package/dist/build/ssr-manifest.d.ts +5 -6
- package/dist/build/standalone.d.ts +2 -3
- package/dist/build/standalone.js +2 -2
- package/dist/build/static-export.d.ts +7 -8
- package/dist/cache/cache-adapters-virtual.d.ts +95 -9
- package/dist/cache/cache-adapters-virtual.js +58 -6
- package/dist/check.d.ts +11 -10
- package/dist/check.js +467 -176
- package/dist/cli-args.d.ts +7 -16
- package/dist/cli-args.js +2 -45
- package/dist/cli-dev-config.d.ts +10 -7
- package/dist/cli-dev-config.js +160 -3
- package/dist/cli.js +124 -435
- package/dist/client/app-nav-failure-handler.d.ts +6 -7
- package/dist/client/client-rewrite-matcher.d.ts +2 -3
- package/dist/client/client-rewrites.d.ts +4 -5
- package/dist/client/dev-error-overlay-store.d.ts +13 -14
- package/dist/client/dev-error-overlay.d.ts +15 -15
- package/dist/client/dev-error-overlay.js +8 -5
- package/dist/client/instrumentation-client-inject.d.ts +3 -4
- package/dist/client/instrumentation-client-state.d.ts +5 -6
- package/dist/client/instrumentation-client.d.ts +3 -4
- package/dist/client/navigation-runtime.d.ts +21 -17
- package/dist/client/navigation-runtime.js +2 -1
- package/dist/client/pages-router-link-navigation.d.ts +4 -5
- package/dist/client/react-instance.d.ts +2 -3
- package/dist/client/validate-module-path.d.ts +2 -3
- package/dist/client/vinext-next-data.d.ts +7 -8
- package/dist/client/window-next.d.ts +4 -5
- package/dist/config/config-matchers.d.ts +16 -16
- package/dist/config/config-matchers.js +10 -7
- package/dist/config/dotenv.d.ts +3 -4
- package/dist/config/dotenv.js +2 -1
- package/dist/config/next-config.d.ts +31 -27
- package/dist/config/next-config.js +163 -16
- package/dist/config/prerender.d.ts +20 -16
- package/dist/config/prerender.js +10 -4
- package/dist/config/request-context.d.ts +5 -6
- package/dist/config/server-external-packages.d.ts +14 -3
- package/dist/config/server-external-packages.js +37 -3
- package/dist/config/tsconfig-paths.d.ts +3 -4
- package/dist/deps/.pnpm/ignore@5.3.2/deps/ignore/index.js +189 -0
- package/dist/deps/.pnpm/ua-parser-js@1.0.35/deps/ua-parser-js/src/ua-parser.js +1057 -0
- package/dist/entries/app-browser-entry.d.ts +5 -6
- package/dist/entries/app-browser-entry.js +3 -2
- package/dist/entries/app-rsc-entry.d.ts +12 -3
- package/dist/entries/app-rsc-entry.js +530 -55
- package/dist/entries/app-rsc-manifest.d.ts +4 -3
- package/dist/entries/app-rsc-manifest.js +27 -8
- package/dist/entries/app-ssr-entry.d.ts +2 -3
- package/dist/entries/app-ssr-entry.js +8 -1
- package/dist/entries/pages-client-entry.d.ts +3 -3
- package/dist/entries/pages-client-entry.js +17 -2
- package/dist/entries/pages-server-entry.d.ts +13 -3
- package/dist/entries/pages-server-entry.js +237 -33
- package/dist/entries/runtime-entry-module.d.ts +4 -5
- package/dist/image/image-adapters-virtual.d.ts +4 -5
- package/dist/index.d.ts +10 -11
- package/dist/index.js +832 -199
- package/dist/init-cloudflare.d.ts +27 -16
- package/dist/init-cloudflare.js +754 -113
- package/dist/init-platform.d.ts +26 -22
- package/dist/init-platform.js +85 -29
- package/dist/init.d.ts +19 -13
- package/dist/init.js +123 -41
- package/dist/plugins/action-owner-manifest.d.ts +3 -4
- package/dist/plugins/action-owner-manifest.js +10 -3
- package/dist/plugins/ast-scope.d.ts +10 -11
- package/dist/plugins/ast-scope.js +10 -22
- package/dist/plugins/ast-utils.d.ts +16 -29
- package/dist/plugins/ast-utils.js +27 -71
- package/dist/plugins/async-hooks-stub.d.ts +2 -3
- package/dist/plugins/client-reference-dedup.d.ts +4 -5
- package/dist/plugins/css-data-url.d.ts +2 -3
- package/dist/plugins/css-module-imports.d.ts +3 -4
- package/dist/plugins/css-module-imports.js +1 -1
- package/dist/plugins/dynamic-preload-metadata.d.ts +3 -4
- package/dist/plugins/dynamic-preload-metadata.js +55 -154
- package/dist/plugins/environment.d.ts +2 -3
- package/dist/plugins/extensionless-dynamic-import.d.ts +2 -3
- package/dist/plugins/extensionless-dynamic-import.js +6 -10
- package/dist/plugins/fonts.d.ts +10 -11
- package/dist/plugins/fonts.js +4 -3
- package/dist/plugins/ignore-dynamic-requests.d.ts +3 -4
- package/dist/plugins/ignore-dynamic-requests.js +60 -89
- package/dist/plugins/import-meta-url.d.ts +6 -7
- package/dist/plugins/import-meta-url.js +31 -43
- package/dist/plugins/instrumentation-client.d.ts +3 -3
- package/dist/plugins/instrumentation-client.js +46 -10
- package/dist/plugins/middleware-export-validation.d.ts +3 -4
- package/dist/plugins/middleware-export-validation.js +3 -3
- package/dist/plugins/middleware-server-only.d.ts +2 -3
- package/dist/plugins/og-asset-ownership.d.ts +3 -4
- package/dist/plugins/og-assets.d.ts +4 -5
- package/dist/plugins/og-assets.js +32 -13
- package/dist/plugins/og-harfbuzz.d.ts +24 -0
- package/dist/plugins/og-harfbuzz.js +260 -0
- package/dist/plugins/optimize-imports.d.ts +7 -7
- package/dist/plugins/optimize-imports.js +32 -44
- package/dist/plugins/pages-node-externals.d.ts +2 -3
- package/dist/plugins/pages-node-externals.js +6 -11
- package/dist/plugins/postcss.d.ts +8 -4
- package/dist/plugins/postcss.js +1 -1
- package/dist/plugins/remove-console.d.ts +2 -3
- package/dist/plugins/remove-console.js +0 -1
- package/dist/plugins/require-condition-resolution.d.ts +3 -4
- package/dist/plugins/require-condition-resolution.js +17 -18
- package/dist/plugins/require-context.d.ts +2 -3
- package/dist/plugins/require-context.js +13 -21
- package/dist/plugins/rsc-client-reference-loaders.d.ts +2 -3
- package/dist/plugins/rsc-client-shim-excludes.d.ts +4 -5
- package/dist/plugins/rsc-client-shim-excludes.js +1 -0
- package/dist/plugins/rsc-reference-validation-normalizer.d.ts +2 -3
- package/dist/plugins/sass.d.ts +7 -8
- package/dist/plugins/sass.js +7 -4
- package/dist/plugins/server-externals-manifest.d.ts +2 -3
- package/dist/plugins/strip-server-exports.d.ts +5 -6
- package/dist/plugins/strip-server-exports.js +1 -1
- package/dist/plugins/styled-jsx.d.ts +2 -3
- package/dist/plugins/styled-jsx.js +7 -7
- package/dist/plugins/transform-cache.d.ts +2 -3
- package/dist/plugins/transform-result.d.ts +3 -4
- package/dist/plugins/transitive-externals.d.ts +2 -3
- package/dist/plugins/typeof-window.d.ts +6 -7
- package/dist/plugins/typeof-window.js +30 -31
- package/dist/plugins/use-cache-callable.d.ts +2 -5
- package/dist/plugins/use-cache-callable.js +43 -22
- package/dist/plugins/wasm-module-import.d.ts +2 -3
- package/dist/plugins/worker-image-imports.d.ts +2 -3
- package/dist/plugins/worker-image-imports.js +6 -8
- package/dist/routing/app-route-graph.d.ts +19 -19
- package/dist/routing/app-route-graph.js +3 -2
- package/dist/routing/app-router.d.ts +20 -5
- package/dist/routing/app-router.js +28 -2
- package/dist/routing/file-matcher.d.ts +9 -10
- package/dist/routing/pages-router.d.ts +6 -6
- package/dist/routing/pages-router.js +1 -1
- package/dist/routing/route-matching.d.ts +4 -5
- package/dist/routing/route-matching.js +4 -2
- package/dist/routing/route-pattern.d.ts +13 -14
- package/dist/routing/route-trie.d.ts +5 -6
- package/dist/routing/route-validation.d.ts +3 -4
- package/dist/routing/route-validation.js +12 -11
- package/dist/routing/utils.d.ts +13 -14
- package/dist/server/accept-encoding.d.ts +9 -10
- package/dist/server/api-handler.d.ts +2 -3
- package/dist/server/api-handler.js +9 -6
- package/dist/server/app-action-forwarding.d.ts +3 -4
- package/dist/server/app-action-forwarding.js +1 -1
- package/dist/server/app-action-request.d.ts +2 -3
- package/dist/server/app-bfcache-id.d.ts +3 -4
- package/dist/server/app-bfcache-identity.d.ts +8 -9
- package/dist/server/app-browser-action-result.d.ts +15 -16
- package/dist/server/app-browser-client-reuse-manifest.d.ts +2 -3
- package/dist/server/app-browser-entry.js +121 -40
- package/dist/server/app-browser-error.d.ts +5 -6
- package/dist/server/app-browser-error.js +9 -3
- package/dist/server/app-browser-history-controller.d.ts +4 -5
- package/dist/server/app-browser-hydration.d.ts +16 -6
- package/dist/server/app-browser-hydration.js +14 -1
- package/dist/server/app-browser-interception-context.d.ts +3 -4
- package/dist/server/app-browser-mpa-navigation.d.ts +4 -5
- package/dist/server/app-browser-navigation-abort.d.ts +3 -4
- package/dist/server/app-browser-navigation-controller.d.ts +8 -8
- package/dist/server/app-browser-navigation-controller.js +9 -5
- package/dist/server/app-browser-navigation-response.d.ts +2 -3
- package/dist/server/app-browser-popstate.d.ts +4 -5
- package/dist/server/app-browser-prefetch-response.d.ts +5 -6
- package/dist/server/app-browser-rsc-redirect.d.ts +4 -5
- package/dist/server/app-browser-server-action-client.d.ts +7 -6
- package/dist/server/app-browser-server-action-client.js +9 -5
- package/dist/server/app-browser-server-action-navigation.d.ts +2 -3
- package/dist/server/app-browser-state.d.ts +17 -17
- package/dist/server/app-browser-state.js +7 -3
- package/dist/server/app-browser-stream.d.ts +4 -5
- package/dist/server/app-browser-stream.js +8 -6
- package/dist/server/app-browser-supplemental-refresh.d.ts +11 -12
- package/dist/server/app-browser-visible-commit.d.ts +6 -7
- package/dist/server/app-browser-visible-commit.js +1 -1
- package/dist/server/app-client-reference-preloader.d.ts +2 -3
- package/dist/server/app-elements-wire-key.d.ts +25 -0
- package/dist/server/app-elements-wire-key.js +69 -0
- package/dist/server/app-elements-wire.d.ts +34 -53
- package/dist/server/app-elements-wire.js +4 -75
- package/dist/server/app-elements.d.ts +5 -5
- package/dist/server/app-elements.js +1 -1
- package/dist/server/app-fallback-renderer.d.ts +4 -4
- package/dist/server/app-fallback-renderer.js +6 -6
- package/dist/server/app-fetch-tracing.d.ts +15 -0
- package/dist/server/app-fetch-tracing.js +38 -0
- package/dist/server/app-history-state.d.ts +26 -27
- package/dist/server/app-history-state.js +19 -11
- package/dist/server/app-hook-warning-suppression.d.ts +2 -3
- package/dist/server/app-hydration-cache-publication.d.ts +3 -4
- package/dist/server/app-inline-css-client.d.ts +3 -4
- package/dist/server/app-interception-context-header.d.ts +2 -3
- package/dist/server/app-layout-param-observation.d.ts +7 -8
- package/dist/server/app-metadata-tracing.d.ts +12 -0
- package/dist/server/app-metadata-tracing.js +17 -0
- package/dist/server/app-middleware.d.ts +15 -7
- package/dist/server/app-middleware.js +30 -5
- package/dist/server/app-mounted-slots-header.d.ts +2 -3
- package/dist/server/app-mounted-slots-header.js +2 -2
- package/dist/server/app-optimistic-routing.d.ts +14 -10
- package/dist/server/app-optimistic-routing.js +16 -3
- package/dist/server/app-page-boundary-render.d.ts +6 -6
- package/dist/server/app-page-boundary-render.js +10 -4
- package/dist/server/app-page-boundary.d.ts +9 -10
- package/dist/server/app-page-boundary.js +2 -1
- package/dist/server/app-page-cache-finalizer.d.ts +32 -8
- package/dist/server/app-page-cache-finalizer.js +118 -14
- package/dist/server/app-page-cache-render.d.ts +8 -5
- package/dist/server/app-page-cache-render.js +22 -5
- package/dist/server/app-page-cache.d.ts +28 -9
- package/dist/server/app-page-cache.js +96 -25
- package/dist/server/app-page-dispatch.d.ts +36 -12
- package/dist/server/app-page-dispatch.js +188 -63
- package/dist/server/app-page-element-builder.d.ts +13 -11
- package/dist/server/app-page-element-builder.js +104 -61
- package/dist/server/app-page-execution.d.ts +14 -14
- package/dist/server/app-page-execution.js +12 -8
- package/dist/server/app-page-head.d.ts +19 -16
- package/dist/server/app-page-head.js +25 -25
- package/dist/server/app-page-http-access-fallback-metadata.d.ts +6 -5
- package/dist/server/app-page-http-access-fallback-metadata.js +9 -2
- package/dist/server/app-page-method.d.ts +5 -11
- package/dist/server/app-page-method.js +2 -9
- package/dist/server/app-page-params.d.ts +5 -6
- package/dist/server/app-page-ppr-runtime.d.ts +2 -2
- package/dist/server/app-page-probe.d.ts +5 -6
- package/dist/server/app-page-probe.js +5 -4
- package/dist/server/app-page-render-identity.d.ts +4 -5
- package/dist/server/app-page-render-observation.d.ts +8 -9
- package/dist/server/app-page-render-observation.js +1 -1
- package/dist/server/app-page-render.d.ts +42 -6
- package/dist/server/app-page-render.js +192 -28
- package/dist/server/app-page-request.d.ts +10 -9
- package/dist/server/app-page-request.js +16 -12
- package/dist/server/app-page-response.d.ts +20 -9
- package/dist/server/app-page-response.js +31 -13
- package/dist/server/app-page-route-wiring.d.ts +15 -15
- package/dist/server/app-page-route-wiring.js +31 -24
- package/dist/server/app-page-search-params-observation.d.ts +26 -5
- package/dist/server/app-page-search-params-observation.js +42 -6
- package/dist/server/app-page-segment-plan.d.ts +2 -3
- package/dist/server/app-page-segment-state.d.ts +11 -12
- package/dist/server/app-page-stream.d.ts +27 -11
- package/dist/server/app-page-stream.js +35 -6
- package/dist/server/app-page-tracing.d.ts +33 -0
- package/dist/server/app-page-tracing.js +49 -0
- package/dist/server/app-pages-bridge.d.ts +6 -6
- package/dist/server/app-pages-bridge.js +19 -4
- package/dist/server/app-post-middleware-context.d.ts +2 -3
- package/dist/server/app-ppr-fallback-shell-render.d.ts +3 -4
- package/dist/server/app-ppr-fallback-shell-render.js +3 -2
- package/dist/server/app-ppr-fallback-shell.d.ts +6 -7
- package/dist/server/app-prerender-endpoints.d.ts +5 -5
- package/dist/server/app-prerender-endpoints.js +26 -12
- package/dist/server/app-prerender-static-params.d.ts +15 -7
- package/dist/server/app-prerender-static-params.js +33 -11
- package/dist/server/app-render-dependency.d.ts +14 -13
- package/dist/server/app-render-dependency.js +5 -1
- package/dist/server/app-request-context.d.ts +3 -4
- package/dist/server/app-request-stage-context.d.ts +5 -0
- package/dist/server/app-request-stage-context.js +11 -0
- package/dist/server/app-request-stage-dispatch.d.ts +25 -0
- package/dist/server/app-request-stage-dispatch.js +54 -0
- package/dist/server/app-request-stage-independent-entry.d.ts +8 -0
- package/dist/server/app-request-stage-independent-entry.js +115 -0
- package/dist/server/app-response-header-provenance.d.ts +13 -7
- package/dist/server/app-response-header-provenance.js +34 -1
- package/dist/server/app-response-stage-entry.d.ts +9 -0
- package/dist/server/app-response-stage-entry.js +87 -0
- package/dist/server/app-route-handler-cache.d.ts +2 -3
- package/dist/server/app-route-handler-cache.js +46 -34
- package/dist/server/app-route-handler-dispatch.d.ts +3 -3
- package/dist/server/app-route-handler-dispatch.js +75 -57
- package/dist/server/app-route-handler-execution.d.ts +18 -13
- package/dist/server/app-route-handler-execution.js +189 -25
- package/dist/server/app-route-handler-middleware-context.d.ts +8 -0
- package/dist/server/app-route-handler-middleware-context.js +15 -0
- package/dist/server/app-route-handler-policy.d.ts +22 -10
- package/dist/server/app-route-handler-policy.js +19 -4
- package/dist/server/app-route-handler-response.d.ts +9 -10
- package/dist/server/app-route-handler-response.js +2 -0
- package/dist/server/app-route-handler-runtime.d.ts +9 -10
- package/dist/server/app-route-handler-runtime.js +20 -16
- package/dist/server/app-route-module-loader.d.ts +6 -7
- package/dist/server/app-route-request-built-ins.d.ts +3 -4
- package/dist/server/app-route-tree-prefetch.d.ts +6 -7
- package/dist/server/app-route-tree-prefetch.js +2 -1
- package/dist/server/app-router-entry.d.ts +2 -0
- package/dist/server/app-router-entry.js +76 -12
- package/dist/server/app-rsc-cache-busting.d.ts +47 -22
- package/dist/server/app-rsc-cache-busting.js +80 -18
- package/dist/server/app-rsc-combined-handler.d.ts +9 -0
- package/dist/server/app-rsc-combined-handler.js +11 -0
- package/dist/server/app-rsc-embedded-chunks.d.ts +6 -7
- package/dist/server/app-rsc-error-handler.d.ts +12 -6
- package/dist/server/app-rsc-error-handler.js +15 -6
- package/dist/server/app-rsc-errors.d.ts +12 -9
- package/dist/server/app-rsc-errors.js +15 -13
- package/dist/server/app-rsc-handler.d.ts +33 -6
- package/dist/server/app-rsc-handler.js +498 -83
- package/dist/server/app-rsc-redirect-flight.d.ts +4 -5
- package/dist/server/app-rsc-render-mode.d.ts +8 -9
- package/dist/server/app-rsc-request-normalization.d.ts +3 -3
- package/dist/server/app-rsc-request-normalization.js +2 -1
- package/dist/server/app-rsc-response-finalizer.d.ts +8 -5
- package/dist/server/app-rsc-response-finalizer.js +24 -7
- package/dist/server/app-rsc-response-stage.d.ts +6 -0
- package/dist/server/app-rsc-response-stage.js +251 -0
- package/dist/server/app-rsc-route-matching.d.ts +4 -4
- package/dist/server/app-rsc-route-matching.js +4 -2
- package/dist/server/app-rsc-state-fingerprint.d.ts +3 -4
- package/dist/server/app-rsc-vary.d.ts +16 -0
- package/dist/server/app-rsc-vary.js +31 -0
- package/dist/server/app-segment-config.d.ts +120 -6
- package/dist/server/app-segment-config.js +264 -12
- package/dist/server/app-server-action-execution.d.ts +16 -12
- package/dist/server/app-server-action-execution.js +88 -35
- package/dist/server/app-ssr-entry.d.ts +14 -4
- package/dist/server/app-ssr-entry.js +64 -17
- package/dist/server/app-ssr-error-meta.d.ts +3 -4
- package/dist/server/app-ssr-error-meta.js +2 -1
- package/dist/server/app-ssr-router-instance.d.ts +2 -3
- package/dist/server/app-ssr-search-params-gate.d.ts +20 -0
- package/dist/server/app-ssr-search-params-gate.js +54 -0
- package/dist/server/app-ssr-stream.d.ts +13 -9
- package/dist/server/app-ssr-stream.js +33 -7
- package/dist/server/app-static-generation.d.ts +4 -5
- package/dist/server/app-visited-response-cache.d.ts +11 -12
- package/dist/server/app-visited-response-cache.js +2 -2
- package/dist/server/app-worker-stages.d.ts +112 -0
- package/dist/server/app-worker-stages.js +105 -0
- package/dist/server/artifact-compatibility.d.ts +11 -12
- package/dist/server/before-interactive-head.d.ts +2 -3
- package/dist/server/bfcache-identity.d.ts +7 -8
- package/dist/server/cache-control.d.ts +39 -11
- package/dist/server/cache-control.js +104 -7
- package/dist/server/cache-headers.d.ts +3 -4
- package/dist/server/cache-proof.d.ts +75 -70
- package/dist/server/cache-proof.js +9 -1
- package/dist/server/cacheability-limits.d.ts +8 -0
- package/dist/server/cacheability-limits.js +9 -0
- package/dist/server/cacheability-manifest.d.ts +68 -0
- package/dist/server/cacheability-manifest.js +241 -0
- package/dist/server/cacheability-request.d.ts +49 -0
- package/dist/server/cacheability-request.js +559 -0
- package/dist/server/client-reuse-manifest.d.ts +17 -18
- package/dist/server/client-reuse-manifest.js +2 -2
- package/dist/server/client-trace-metadata.d.ts +9 -6
- package/dist/server/client-trace-metadata.js +27 -15
- package/dist/server/cloudflare-workers-tracing.d.ts +1 -0
- package/dist/server/cloudflare-workers-tracing.js +8 -0
- package/dist/server/config-headers.d.ts +19 -5
- package/dist/server/config-headers.js +39 -5
- package/dist/server/cookie-utils.d.ts +2 -3
- package/dist/server/csp.d.ts +5 -6
- package/dist/server/default-global-error-module.d.ts +2 -3
- package/dist/server/default-global-not-found-module.d.ts +2 -3
- package/dist/server/default-not-found-module.d.ts +2 -3
- package/dist/server/defer-until-stream-consumed.d.ts +2 -3
- package/dist/server/defer-until-stream-consumed.js +2 -1
- package/dist/server/dev-initial-server-error.d.ts +3 -4
- package/dist/server/dev-initial-server-error.js +2 -1
- package/dist/server/dev-lockfile.d.ts +7 -8
- package/dist/server/dev-lockfile.js +4 -1
- package/dist/server/dev-module-runner.d.ts +2 -3
- package/dist/server/dev-origin-check.d.ts +5 -6
- package/dist/server/dev-route-files.d.ts +2 -3
- package/dist/server/dev-server.d.ts +4 -5
- package/dist/server/dev-server.js +130 -61
- package/dist/server/dev-stack-sourcemap.d.ts +7 -7
- package/dist/server/dev-stack-sourcemap.js +1 -1
- package/dist/server/document-initial-head.d.ts +3 -4
- package/dist/server/edge-api-runtime.d.ts +4 -5
- package/dist/server/fetch-handler.d.ts +3 -2
- package/dist/server/fetch-handler.js +3 -18
- package/dist/server/file-based-metadata.d.ts +2 -3
- package/dist/server/framework-tracer.d.ts +46 -0
- package/dist/server/framework-tracer.js +125 -0
- package/dist/server/fully-buffered-response.d.ts +11 -0
- package/dist/server/fully-buffered-response.js +19 -0
- package/dist/server/headers.d.ts +62 -56
- package/dist/server/headers.js +33 -20
- package/dist/server/html.d.ts +6 -27
- package/dist/server/html.js +16 -1
- package/dist/server/http-conditional.d.ts +5 -6
- package/dist/server/http-date.d.ts +2 -3
- package/dist/server/http-error-responses.d.ts +9 -10
- package/dist/server/http-range.d.ts +4 -5
- package/dist/server/hybrid-route-priority.d.ts +4 -5
- package/dist/server/image-optimization.d.ts +20 -21
- package/dist/server/implicit-tags.d.ts +3 -4
- package/dist/server/instrumentation-runtime.d.ts +17 -21
- package/dist/server/instrumentation-runtime.js +26 -8
- package/dist/server/instrumentation.d.ts +26 -30
- package/dist/server/instrumentation.js +18 -23
- package/dist/server/isr-cache.d.ts +28 -27
- package/dist/server/isr-cache.js +18 -70
- package/dist/server/isr-decision.d.ts +4 -4
- package/dist/server/metadata-route-build-data.d.ts +4 -5
- package/dist/server/metadata-route-cache-policy.d.ts +2 -3
- package/dist/server/metadata-route-response.d.ts +7 -7
- package/dist/server/metadata-route-response.js +68 -2
- package/dist/server/metadata-routes.d.ts +18 -19
- package/dist/server/middleware-matcher-pattern.d.ts +6 -7
- package/dist/server/middleware-matcher.d.ts +13 -6
- package/dist/server/middleware-matcher.js +22 -1
- package/dist/server/middleware-path-to-regexp.d.ts +6 -7
- package/dist/server/middleware-path-to-regexp.js +11 -9
- package/dist/server/middleware-response-headers.d.ts +3 -4
- package/dist/server/middleware-runtime.d.ts +13 -8
- package/dist/server/middleware-runtime.js +54 -10
- package/dist/server/middleware.d.ts +5 -5
- package/dist/server/multi-stage.d.ts +141 -0
- package/dist/server/multi-stage.js +8 -0
- package/dist/server/navigation-planner.d.ts +26 -26
- package/dist/server/navigation-trace.d.ts +11 -12
- package/dist/server/next-error-digest.d.ts +4 -5
- package/dist/server/normalize-path.d.ts +5 -6
- package/dist/server/normalize-path.js +1 -1
- package/dist/server/open-redirect.d.ts +2 -3
- package/dist/server/opentelemetry-api.d.ts +59 -0
- package/dist/server/opentelemetry-api.js +53 -0
- package/dist/server/opentelemetry-tracing.d.ts +5 -0
- package/dist/server/opentelemetry-tracing.js +83 -0
- package/dist/server/operation-token.d.ts +11 -12
- package/dist/server/otel-tracer-extension.d.ts +7 -9
- package/dist/server/otel-tracer-extension.js +37 -36
- package/dist/server/pages-api-route.d.ts +5 -4
- package/dist/server/pages-api-route.js +21 -8
- package/dist/server/pages-asset-tags.d.ts +6 -6
- package/dist/server/pages-asset-tags.js +37 -2
- package/dist/server/pages-body-parser-config.d.ts +4 -5
- package/dist/server/pages-body-parser-config.js +4 -4
- package/dist/server/pages-client-assets.d.ts +11 -5
- package/dist/server/pages-data-route.d.ts +11 -12
- package/dist/server/pages-data-route.js +1 -1
- package/dist/server/pages-default-404.d.ts +3 -4
- package/dist/server/pages-dev-hydration.d.ts +9 -4
- package/dist/server/pages-dev-hydration.js +19 -7
- package/dist/server/pages-dev-module-url.d.ts +3 -4
- package/dist/server/pages-dev-stylesheets.d.ts +5 -6
- package/dist/server/pages-document-asset-props.d.ts +6 -7
- package/dist/server/pages-document-initial-props.d.ts +5 -5
- package/dist/server/pages-document-initial-props.js +4 -2
- package/dist/server/pages-execution-tracing.d.ts +40 -0
- package/dist/server/pages-execution-tracing.js +80 -0
- package/dist/server/pages-get-initial-props.d.ts +9 -10
- package/dist/server/pages-i18n.d.ts +8 -8
- package/dist/server/pages-i18n.js +3 -2
- package/dist/server/pages-media-type.d.ts +4 -5
- package/dist/server/pages-node-compat.d.ts +11 -10
- package/dist/server/pages-node-compat.js +12 -4
- package/dist/server/pages-page-data.d.ts +18 -19
- package/dist/server/pages-page-data.js +11 -10
- package/dist/server/pages-page-handler.d.ts +7 -6
- package/dist/server/pages-page-handler.js +98 -47
- package/dist/server/pages-page-method.d.ts +2 -3
- package/dist/server/pages-page-response.d.ts +14 -10
- package/dist/server/pages-page-response.js +49 -31
- package/dist/server/pages-preview.d.ts +10 -11
- package/dist/server/pages-readiness.d.ts +2 -3
- package/dist/server/pages-request-pipeline.d.ts +16 -12
- package/dist/server/pages-request-pipeline.js +69 -28
- package/dist/server/pages-request-stage-entry.d.ts +23 -0
- package/dist/server/pages-request-stage-entry.js +314 -0
- package/dist/server/pages-response-stage-entry.d.ts +11 -0
- package/dist/server/pages-response-stage-entry.js +106 -0
- package/dist/server/pages-response-stage.d.ts +31 -0
- package/dist/server/pages-response-stage.js +49 -0
- package/dist/server/pages-revalidate.d.ts +3 -4
- package/dist/server/pages-revalidate.js +9 -4
- package/dist/server/pages-route-data-kind.d.ts +18 -0
- package/dist/server/pages-route-data-kind.js +11 -0
- package/dist/server/pages-router-entry.d.ts +1 -25
- package/dist/server/pages-router-entry.js +48 -114
- package/dist/server/pages-serializable-props.d.ts +3 -4
- package/dist/server/pregenerated-concrete-paths.d.ts +9 -7
- package/dist/server/pregenerated-concrete-paths.js +12 -6
- package/dist/server/prerender-cache-life-header.d.ts +3 -4
- package/dist/server/prerender-manifest.d.ts +11 -11
- package/dist/server/prerender-manifest.js +6 -3
- package/dist/server/prerender-route-params.d.ts +16 -9
- package/dist/server/prerender-route-params.js +18 -2
- package/dist/server/prerender-work-unit-setup.d.ts +4 -4
- package/dist/server/prerender-work-unit-setup.js +37 -14
- package/dist/server/prod-server.d.ts +12 -9
- package/dist/server/prod-server.js +129 -36
- package/dist/server/proxy-trust.d.ts +5 -6
- package/dist/server/request-log.d.ts +3 -4
- package/dist/server/request-pipeline.d.ts +17 -21
- package/dist/server/request-pipeline.js +8 -10
- package/dist/server/request-stage.d.ts +5 -0
- package/dist/server/request-stage.js +7 -0
- package/dist/server/request-tracing.d.ts +22 -0
- package/dist/server/request-tracing.js +180 -0
- package/dist/server/response-stage-cacheability.d.ts +37 -0
- package/dist/server/response-stage-cacheability.js +55 -0
- package/dist/server/response-stage-policy.d.ts +23 -0
- package/dist/server/response-stage-policy.js +89 -0
- package/dist/server/response-stage.d.ts +5 -0
- package/dist/server/response-stage.js +7 -0
- package/dist/server/response-start-tracing.d.ts +14 -0
- package/dist/server/response-start-tracing.js +80 -0
- package/dist/server/revalidation-host.d.ts +2 -3
- package/dist/server/revalidation-host.js +2 -1
- package/dist/server/revalidation-request.d.ts +8 -0
- package/dist/server/revalidation-request.js +37 -0
- package/dist/server/rsc-completion-metadata.d.ts +6 -7
- package/dist/server/rsc-stream-hints.d.ts +18 -7
- package/dist/server/rsc-stream-hints.js +70 -35
- package/dist/server/seed-cache.d.ts +2 -3
- package/dist/server/seed-cache.js +8 -7
- package/dist/server/server-action-not-found.d.ts +5 -6
- package/dist/server/server-globals.d.ts +2 -3
- package/dist/server/server-globals.js +13 -0
- package/dist/server/skip-cache-proof.d.ts +4 -4
- package/dist/server/socket-error-backstop.d.ts +5 -6
- package/dist/server/socket-error-backstop.js +1 -1
- package/dist/server/static-file-cache.d.ts +5 -6
- package/dist/server/static-file-cache.js +9 -7
- package/dist/server/static-file-signal.d.ts +16 -0
- package/dist/server/static-file-signal.js +82 -0
- package/dist/server/static-layout-client-reuse-proof.d.ts +4 -5
- package/dist/server/streaming-metadata.d.ts +2 -3
- package/dist/server/tracer.d.ts +5 -0
- package/dist/server/tracer.js +13 -0
- package/dist/server/worker-prerender-discovery.d.ts +18 -0
- package/dist/server/worker-prerender-discovery.js +55 -0
- package/dist/server/worker-revalidation-context.d.ts +2 -3
- package/dist/server/worker-revalidation-context.js +5 -5
- package/dist/server/worker-stages.d.ts +43 -0
- package/dist/server/worker-stages.js +25 -0
- package/dist/server/worker-utils.d.ts +5 -6
- package/dist/server/worker-utils.js +4 -4
- package/dist/server/workers-tracing.d.ts +17 -0
- package/dist/server/workers-tracing.js +27 -0
- package/dist/shims/amp.d.ts +3 -4
- package/dist/shims/app-router-scroll-state.d.ts +9 -10
- package/dist/shims/app-router-scroll.d.ts +4 -5
- package/dist/shims/app-router-scroll.js +2 -1
- package/dist/shims/app.d.ts +5 -6
- package/dist/shims/before-interactive-context.d.ts +5 -6
- package/dist/shims/cache-callable-runtime.d.ts +44 -4
- package/dist/shims/cache-callable-runtime.js +168 -8
- package/dist/shims/cache-for-request.d.ts +2 -3
- package/dist/shims/cache-handler.d.ts +33 -20
- package/dist/shims/cache-handler.js +61 -2
- package/dist/shims/cache-request-state.d.ts +28 -29
- package/dist/shims/cache-runtime.d.ts +23 -21
- package/dist/shims/cache-runtime.js +239 -121
- package/dist/shims/cache.d.ts +15 -15
- package/dist/shims/cache.js +25 -13
- package/dist/shims/cacheability-classification.d.ts +106 -0
- package/dist/shims/cacheability-classification.js +161 -0
- package/dist/shims/cdn-cache-state.d.ts +13 -0
- package/dist/shims/cdn-cache-state.js +23 -0
- package/dist/shims/cdn-cache.d.ts +76 -18
- package/dist/shims/cdn-cache.js +40 -39
- package/dist/shims/client-hook-error.d.ts +3 -4
- package/dist/shims/client-locale.d.ts +2 -3
- package/dist/shims/client-page-root.d.ts +24 -0
- package/dist/shims/client-page-root.js +121 -0
- package/dist/shims/compat-router.d.ts +2 -3
- package/dist/shims/config.d.ts +3 -4
- package/dist/shims/constants.d.ts +73 -74
- package/dist/shims/constants.js +1 -1
- package/dist/shims/default-not-found.d.ts +2 -3
- package/dist/shims/document.d.ts +9 -9
- package/dist/shims/dynamic-preload-chunks.d.ts +2 -3
- package/dist/shims/dynamic-preload-chunks.js +17 -13
- package/dist/shims/dynamic.d.ts +3 -3
- package/dist/shims/error-boundary-navigation.d.ts +3 -4
- package/dist/shims/error-boundary.d.ts +17 -18
- package/dist/shims/error-boundary.js +17 -11
- package/dist/shims/error.d.ts +4 -4
- package/dist/shims/error.js +1 -1
- package/dist/shims/error.react-server.d.ts +3 -4
- package/dist/shims/fetch-cache.d.ts +22 -22
- package/dist/shims/fetch-cache.js +50 -20
- package/dist/shims/font-google-base.d.ts +9 -9
- package/dist/shims/font-google-base.js +2 -1
- package/dist/shims/font-local.d.ts +3 -3
- package/dist/shims/font-local.js +1 -1
- package/dist/shims/font-utils.d.ts +14 -15
- package/dist/shims/form.d.ts +2 -2
- package/dist/shims/form.js +10 -7
- package/dist/shims/hash-scroll.d.ts +5 -6
- package/dist/shims/head-state.d.ts +4 -5
- package/dist/shims/head.d.ts +16 -16
- package/dist/shims/head.js +5 -4
- package/dist/shims/headers.d.ts +68 -32
- package/dist/shims/headers.js +101 -10
- package/dist/shims/i18n-context.d.ts +5 -6
- package/dist/shims/i18n-state.d.ts +4 -5
- package/dist/shims/image-config.d.ts +5 -6
- package/dist/shims/image-config.js +2 -0
- package/dist/shims/image.d.ts +5 -5
- package/dist/shims/image.js +12 -8
- package/dist/shims/internal/als-registry.d.ts +4 -5
- package/dist/shims/internal/api-utils.d.ts +3 -4
- package/dist/shims/internal/app-page-props-cache-key.d.ts +32 -4
- package/dist/shims/internal/app-page-props-cache-key.js +53 -1
- package/dist/shims/internal/app-prefetch-fetch-queue.d.ts +5 -6
- package/dist/shims/internal/app-prefetch-rsc-request.d.ts +13 -0
- package/dist/shims/internal/app-prefetch-rsc-request.js +12 -0
- package/dist/shims/internal/app-route-detection.d.ts +2 -2
- package/dist/shims/internal/app-route-prefetch-policy.d.ts +5 -6
- package/dist/shims/internal/app-route-prefetch-policy.js +1 -0
- package/dist/shims/internal/app-router-context.d.ts +9 -10
- package/dist/shims/internal/cookie-serialize.d.ts +4 -5
- package/dist/shims/internal/format-url-object.d.ts +7 -0
- package/dist/shims/internal/format-url-object.js +53 -0
- package/dist/shims/internal/hybrid-client-route-owner-direct.d.ts +6 -7
- package/dist/shims/internal/hybrid-client-route-owner-direct.js +29 -11
- package/dist/shims/internal/hybrid-client-route-owner.d.ts +3 -3
- package/dist/shims/internal/hybrid-client-route-owner.js +5 -4
- package/dist/shims/internal/interpolate-as.d.ts +5 -6
- package/dist/shims/internal/interpolate-as.js +4 -2
- package/dist/shims/internal/link-status-registry.d.ts +5 -6
- package/dist/shims/internal/make-hanging-promise.d.ts +8 -3
- package/dist/shims/internal/make-hanging-promise.js +13 -2
- package/dist/shims/internal/navigation-untracked.d.ts +2 -3
- package/dist/shims/internal/normalize-router-href.d.ts +15 -0
- package/dist/shims/internal/normalize-router-href.js +41 -0
- package/dist/shims/internal/pages-data-fetch-dedup.d.ts +8 -9
- package/dist/shims/internal/pages-data-target.d.ts +8 -6
- package/dist/shims/internal/pages-data-target.js +32 -36
- package/dist/shims/internal/pages-data-url.d.ts +4 -5
- package/dist/shims/internal/pages-data-url.js +2 -1
- package/dist/shims/internal/pages-router-accessor.d.ts +3 -4
- package/dist/shims/internal/pages-router-components.d.ts +3 -4
- package/dist/shims/internal/route-pattern-for-warning.d.ts +5 -6
- package/dist/shims/internal/route-pattern-for-warning.js +3 -3
- package/dist/shims/internal/router-context.d.ts +2 -3
- package/dist/shims/internal/thenable-well-known-properties.d.ts +10 -0
- package/dist/shims/internal/thenable-well-known-properties.js +33 -0
- package/dist/shims/internal/utils.d.ts +7 -8
- package/dist/shims/internal/work-unit-async-storage.d.ts +12 -11
- package/dist/shims/layout-segment-context.d.ts +3 -4
- package/dist/shims/link-prefetch.d.ts +9 -10
- package/dist/shims/link.d.ts +4 -4
- package/dist/shims/link.js +67 -116
- package/dist/shims/metadata.d.ts +15 -16
- package/dist/shims/metadata.js +40 -36
- package/dist/shims/navigation-context-accessors.d.ts +9 -0
- package/dist/shims/navigation-context-accessors.js +19 -0
- package/dist/shims/navigation-context-state.d.ts +27 -18
- package/dist/shims/navigation-errors.d.ts +18 -19
- package/dist/shims/navigation-state.d.ts +6 -7
- package/dist/shims/navigation.d.ts +80 -68
- package/dist/shims/navigation.js +45 -17
- package/dist/shims/navigation.react-server.d.ts +9 -9
- package/dist/shims/navigation.react-server.js +1 -1
- package/dist/shims/offline.d.ts +2 -3
- package/dist/shims/og.d.ts +2 -2
- package/dist/shims/pages-router-runtime.d.ts +4 -5
- package/dist/shims/ppr-fallback-shell.d.ts +13 -14
- package/dist/shims/readonly-url-search-params.d.ts +2 -3
- package/dist/shims/request-context.d.ts +7 -6
- package/dist/shims/root-params.d.ts +14 -15
- package/dist/shims/router-state.d.ts +5 -6
- package/dist/shims/router-state.js +1 -1
- package/dist/shims/router.d.ts +22 -21
- package/dist/shims/router.js +339 -164
- package/dist/shims/script-nonce-context.d.ts +8 -6
- package/dist/shims/script-nonce-context.js +15 -6
- package/dist/shims/script.d.ts +4 -4
- package/dist/shims/script.js +9 -7
- package/dist/shims/search-params-gate.d.ts +35 -0
- package/dist/shims/search-params-gate.js +32 -0
- package/dist/shims/server.d.ts +19 -51
- package/dist/shims/server.js +14 -28
- package/dist/shims/slot.d.ts +33 -15
- package/dist/shims/slot.js +41 -9
- package/dist/shims/streamed-icons.d.ts +3 -4
- package/dist/shims/thenable-params.d.ts +5 -7
- package/dist/shims/thenable-params.js +3 -24
- package/dist/shims/unified-request-context.d.ts +34 -31
- package/dist/shims/unified-request-context.js +34 -24
- package/dist/shims/unrecognized-action-error.d.ts +3 -4
- package/dist/shims/url-safety.d.ts +5 -6
- package/dist/shims/url-utils.d.ts +18 -12
- package/dist/shims/url-utils.js +10 -1
- package/dist/shims/use-merged-ref.d.ts +2 -3
- package/dist/shims/user-agent.d.ts +31 -0
- package/dist/shims/user-agent.js +16 -0
- package/dist/shims/web-vitals.d.ts +2 -2
- package/dist/typegen.d.ts +3 -4
- package/dist/utils/asset-prefix.d.ts +7 -8
- package/dist/utils/base-path.d.ts +5 -6
- package/dist/utils/built-asset-url.d.ts +2 -3
- package/dist/utils/built-asset-url.js +1 -1
- package/dist/utils/cache-control-metadata.d.ts +4 -5
- package/dist/utils/client-build-manifest.d.ts +6 -7
- package/dist/utils/client-build-manifest.js +2 -1
- package/dist/utils/client-entry-manifest.d.ts +6 -7
- package/dist/utils/client-runtime-metadata.d.ts +8 -3
- package/dist/utils/client-runtime-metadata.js +18 -1
- package/dist/utils/commonjs-loader.d.ts +4 -5
- package/dist/utils/compare.d.ts +2 -3
- package/dist/utils/deployment-id.d.ts +6 -7
- package/dist/utils/dev-error-recovery-event.d.ts +2 -3
- package/dist/utils/dev-stack-sourcemap-endpoint.d.ts +2 -3
- package/dist/utils/domain-locale.d.ts +7 -8
- package/dist/utils/encode-cache-tag.d.ts +3 -4
- package/dist/utils/error-cause.d.ts +2 -3
- package/dist/utils/external-url.d.ts +2 -3
- package/dist/utils/has-trailing-comma.d.ts +3 -4
- package/dist/utils/hash.d.ts +3 -4
- package/dist/utils/html-limited-bots.d.ts +3 -4
- package/dist/utils/lazy-chunks.d.ts +8 -9
- package/dist/utils/lazy-chunks.js +4 -4
- package/dist/utils/manifest-paths.d.ts +5 -6
- package/dist/utils/mdx-scan.d.ts +11 -4
- package/dist/utils/mdx-scan.js +27 -1
- package/dist/utils/middleware-request-headers.d.ts +7 -6
- package/dist/utils/middleware-request-headers.js +6 -1
- package/dist/utils/navigation-signal.d.ts +3 -3
- package/dist/utils/navigation-signal.js +16 -1
- package/dist/utils/number.d.ts +2 -3
- package/dist/utils/package-name.d.ts +3 -4
- package/dist/utils/parse-cookie.d.ts +4 -5
- package/dist/utils/path.d.ts +8 -9
- package/dist/utils/plugin-options.d.ts +2 -3
- package/dist/utils/precompressed-variant.d.ts +3 -4
- package/dist/utils/prerender-output-paths.d.ts +9 -10
- package/dist/utils/prerender-output-paths.js +16 -9
- package/dist/utils/project.d.ts +19 -30
- package/dist/utils/project.js +20 -29
- package/dist/utils/promise.d.ts +2 -3
- package/dist/utils/protocol-headers.d.ts +14 -15
- package/dist/utils/public-file-path.d.ts +2 -3
- package/dist/utils/public-routes.d.ts +2 -3
- package/dist/utils/query.d.ts +14 -9
- package/dist/utils/query.js +22 -1
- package/dist/utils/react-compiler-support.d.ts +6 -7
- package/dist/utils/react-version.d.ts +4 -3
- package/dist/utils/react-version.js +19 -1
- package/dist/utils/record.d.ts +2 -3
- package/dist/utils/redirect-digest.d.ts +3 -4
- package/dist/utils/regex-safety.d.ts +4 -5
- package/dist/utils/regex.d.ts +2 -3
- package/dist/utils/safe-json-file.d.ts +2 -3
- package/dist/utils/sorted-array.d.ts +2 -3
- package/dist/utils/text-stream.d.ts +3 -4
- package/dist/utils/vinext-root.d.ts +2 -3
- package/dist/utils/virtual-module.d.ts +3 -4
- package/dist/utils/vite-cli-invocation.d.ts +21 -0
- package/dist/utils/vite-cli-invocation.js +144 -0
- package/dist/utils/vite-version.d.ts +5 -6
- package/next-package.json +4 -0
- package/package.json +55 -6
|
@@ -1,21 +1,45 @@
|
|
|
1
1
|
import path, { toSlash } from "../deps/.pnpm/pathslash@0.1.0/deps/pathslash/dist/index.js";
|
|
2
2
|
import { findDir } from "../utils/project.js";
|
|
3
|
-
import { apiRouter, pagesRouter } from "../routing/pages-router.js";
|
|
4
|
-
import { VINEXT_PRERENDER_SECRET_HEADER } from "../utils/protocol-headers.js";
|
|
5
|
-
import { classifyAppRoute, classifyPagesRoute, getAppRouteRenderEntryPath, hasNamedExport } from "./report.js";
|
|
6
|
-
import { appRouter } from "../routing/app-router.js";
|
|
7
|
-
import { normalizeStaticPathsEntry } from "../routing/route-pattern.js";
|
|
8
3
|
import { BLOCKED_PAGES, PHASE_PRODUCTION_BUILD } from "../shims/constants.js";
|
|
4
|
+
import { VINEXT_PRERENDER_SECRET_HEADER } from "../utils/protocol-headers.js";
|
|
5
|
+
import { isExternalUrl } from "../utils/external-url.js";
|
|
6
|
+
import { matchHeaders, matchesRewriteSource } from "../config/config-matchers.js";
|
|
9
7
|
import { loadNextConfig, resolveNextConfig } from "../config/next-config.js";
|
|
8
|
+
import { appRouteHasMainTreeLoadingBoundary, appRouter, matchAppRoute } from "../routing/app-router.js";
|
|
9
|
+
import { apiRouter, matchRoute, pagesRouter } from "../routing/pages-router.js";
|
|
10
|
+
import "../server/headers.js";
|
|
11
|
+
import { matchesMiddlewarePathname } from "../server/middleware-matcher.js";
|
|
12
|
+
import { extractLocaleFromUrl, normalizeDefaultLocalePathname } from "../server/pages-i18n.js";
|
|
13
|
+
import { classifyAppRoute, classifyAppRouteHandler, classifyPagesRoute, extractExportConstNumber, extractExportConstString, extractMiddlewareMatcherConfig, getAppRouteRenderEntryPath, hasRuntimeExportedName } from "./report.js";
|
|
14
|
+
import { normalizeStaticPathname, normalizeStaticPathsEntry } from "../routing/route-pattern.js";
|
|
15
|
+
import { buildPagesDataHref } from "../shims/internal/pages-data-url.js";
|
|
16
|
+
import { normalizePathTrailingSlash } from "../shims/url-utils.js";
|
|
17
|
+
import { pagesRouteHasPriorityOverAppRoute } from "../server/hybrid-route-priority.js";
|
|
10
18
|
import { readPrerenderSecret } from "./server-manifest.js";
|
|
19
|
+
import { loadMdxEsmReader } from "../utils/mdx-scan.js";
|
|
11
20
|
import { startProdServer } from "../server/prod-server.js";
|
|
12
21
|
import { enterPrerenderPhase } from "./prerender-phase.js";
|
|
13
|
-
import { buildUrlFromParams, resolveParentParams } from "./prerender.js";
|
|
22
|
+
import { buildUrlFromParams, layoutOnlyParamSets, resolveParentParams, routeStaticParamSets, validateDiscoveredParams } from "./prerender.js";
|
|
23
|
+
import { collectAppPageStaticGenerationRuntimes, hasAppPageGenerateStaticParamsAtLastDynamicSegment, isAppPageStaticEligible, isEdgeRuntime, resolveAppPageDynamicConfig, resolveAppPageSegmentConfig, resolveAppPageStaticGenerationRuntime } from "../server/app-segment-config.js";
|
|
24
|
+
import { resolveBuiltRscEntryPath } from "./server-entry.js";
|
|
14
25
|
import fs from "node:fs";
|
|
15
26
|
//#region src/build/prerender-paths.ts
|
|
16
27
|
const PRERENDER_PATH_DISCOVERY_ENV = "__VINEXT_PRERENDER_PATH_DISCOVERY";
|
|
17
28
|
const PRERENDER_PATHS_MANIFEST = "vinext-prerender-paths.json";
|
|
18
29
|
const PATH_DISCOVERY_FETCH_TIMEOUT_MS = 3e4;
|
|
30
|
+
const DEFAULT_REMOTE_PATH_DISCOVERY_RETRY_DELAY_MS = 1e3;
|
|
31
|
+
const DEFAULT_REMOTE_PATH_DISCOVERY_PHASE_TIMEOUT_MS = 12e4;
|
|
32
|
+
function readDiscoveryUserFailure(response, text) {
|
|
33
|
+
if (response.status !== 500 || !response.headers.get("content-type")?.includes("application/json")) return null;
|
|
34
|
+
try {
|
|
35
|
+
const value = JSON.parse(text);
|
|
36
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) return null;
|
|
37
|
+
const error = value.error;
|
|
38
|
+
return typeof error === "string" && error.length > 0 ? error : null;
|
|
39
|
+
} catch {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
19
43
|
function readBuiltBuildId(serverDir) {
|
|
20
44
|
try {
|
|
21
45
|
const buildId = fs.readFileSync(path.join(serverDir, "BUILD_ID"), "utf-8").trim();
|
|
@@ -25,40 +49,131 @@ function readBuiltBuildId(serverDir) {
|
|
|
25
49
|
throw error;
|
|
26
50
|
}
|
|
27
51
|
}
|
|
52
|
+
function readBuiltRscBuildId(serverDir) {
|
|
53
|
+
try {
|
|
54
|
+
const buildId = fs.readFileSync(path.join(serverDir, "RSC_BUILD_ID"), "utf-8").trim();
|
|
55
|
+
return buildId.length > 0 ? buildId : null;
|
|
56
|
+
} catch (error) {
|
|
57
|
+
if (error && typeof error === "object" && "code" in error && error.code === "ENOENT") return null;
|
|
58
|
+
throw error;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
28
61
|
function addPath(paths, seen, pathname) {
|
|
29
62
|
if (seen.has(pathname)) return;
|
|
30
63
|
seen.add(pathname);
|
|
31
64
|
paths.push(pathname);
|
|
32
65
|
}
|
|
33
|
-
function
|
|
66
|
+
function throwDiscoveryFailure(route, error) {
|
|
34
67
|
const message = error instanceof Error ? error.message : String(error);
|
|
35
|
-
|
|
68
|
+
if (/cloudflare:|ERR_UNSUPPORTED_ESM_URL_SCHEME/i.test(message)) throw new Error(`Failed to discover warmup path(s) for ${route}: Cloudflare runtime bindings cannot execute in the local Node prerender server. Use \`vinext-cloudflare deploy --warm-cache\` so path discovery runs against the staged Worker version.`, { cause: error });
|
|
69
|
+
throw new Error(`Failed to discover warmup path(s) for ${route}: ${message}`, { cause: error });
|
|
36
70
|
}
|
|
37
|
-
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
71
|
+
function validatePagesStaticPathsResult(value, route) {
|
|
72
|
+
const expected = "Expected { paths: [], fallback: boolean | 'blocking' }.";
|
|
73
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) throw new Error(`Invalid value returned from getStaticPaths for ${route}. ${expected}`);
|
|
74
|
+
const result = value;
|
|
75
|
+
const extraKeys = Object.keys(result).filter((key) => key !== "paths" && key !== "fallback");
|
|
76
|
+
if (extraKeys.length > 0) throw new Error(`Extra key(s) returned from getStaticPaths for ${route}: ${extraKeys.join(", ")}. ${expected}`);
|
|
77
|
+
if (typeof result.fallback !== "boolean" && result.fallback !== "blocking") throw new Error(`Invalid fallback returned from getStaticPaths for ${route}. ${expected}`);
|
|
78
|
+
if (!Array.isArray(result.paths)) throw new Error(`Invalid paths returned from getStaticPaths for ${route}; paths must be an array.`);
|
|
79
|
+
return {
|
|
80
|
+
fallback: result.fallback,
|
|
81
|
+
paths: result.paths
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
function hasUnsafeRawUrlPathCharacter(value) {
|
|
85
|
+
for (let index = 0; index < value.length; index++) {
|
|
86
|
+
const code = value.charCodeAt(index);
|
|
87
|
+
if (code === 92 || code <= 31 || code === 127) return true;
|
|
53
88
|
}
|
|
89
|
+
return false;
|
|
54
90
|
}
|
|
55
|
-
function
|
|
56
|
-
if (
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
91
|
+
function validatePagesStaticPathsEntry(entry, pattern) {
|
|
92
|
+
if (typeof entry === "string") {
|
|
93
|
+
if (!entry.startsWith("/") || entry.includes("//") || entry.includes("?") || entry.includes("#") || hasUnsafeRawUrlPathCharacter(entry)) throw new Error(`The provided path \`${entry}\` from getStaticPaths does not match the route pattern \`${pattern}\`.`);
|
|
94
|
+
let decodedSegments;
|
|
95
|
+
try {
|
|
96
|
+
decodedSegments = entry.split("/").map((segment) => decodeURIComponent(segment));
|
|
97
|
+
} catch {
|
|
98
|
+
throw new Error(`The provided path \`${entry}\` from getStaticPaths contains malformed percent-encoding.`);
|
|
99
|
+
}
|
|
100
|
+
if (decodedSegments.some((segment) => segment === "." || segment === "..")) throw new Error(`The provided path \`${entry}\` from getStaticPaths contains a dot path segment.`);
|
|
101
|
+
return entry;
|
|
61
102
|
}
|
|
103
|
+
if (!entry || typeof entry !== "object" || Array.isArray(entry)) return entry;
|
|
104
|
+
const extraKeys = Object.keys(entry).filter((key) => key !== "params" && key !== "locale");
|
|
105
|
+
if (extraKeys.length > 0) throw new Error(`Additional key(s) returned from getStaticPaths for ${pattern}: ${extraKeys.join(", ")}.`);
|
|
106
|
+
if (entry.locale !== void 0 && typeof entry.locale !== "string") throw new Error(`Invalid locale returned from getStaticPaths for ${pattern}.`);
|
|
107
|
+
return {
|
|
108
|
+
...entry,
|
|
109
|
+
params: validateDiscoveredParams(entry.params, pattern, "getStaticPaths")
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
async function fetchDiscoveryEndpoint(url, headers, retryOptions = {}) {
|
|
113
|
+
const hasSharedPhaseDeadline = retryOptions.deadlineAt !== void 0;
|
|
114
|
+
const retryDelayMs = Math.max(0, retryOptions.retryDelayMs ?? (hasSharedPhaseDeadline ? 1e3 : 0));
|
|
115
|
+
const phaseTimeoutMs = Math.max(1, retryOptions.phaseTimeoutMs ?? 12e4);
|
|
116
|
+
const retryBudgetDelayMs = retryDelayMs > 0 ? retryDelayMs : DEFAULT_REMOTE_PATH_DISCOVERY_RETRY_DELAY_MS;
|
|
117
|
+
const retries = Math.max(0, retryOptions.retries ?? (hasSharedPhaseDeadline ? Math.ceil(phaseTimeoutMs / retryBudgetDelayMs) : 0));
|
|
118
|
+
const deadlineAt = retryOptions.deadlineAt ?? Date.now() + phaseTimeoutMs;
|
|
119
|
+
let lastError;
|
|
120
|
+
let attemptsRun = 0;
|
|
121
|
+
let lastTransientStatus;
|
|
122
|
+
const attemptSummary = () => ` after ${attemptsRun} attempt(s)${lastTransientStatus === void 0 ? "" : `; last transient status was HTTP ${lastTransientStatus}`}`;
|
|
123
|
+
const phaseTimeoutError = () => /* @__PURE__ */ new Error(`remote path discovery exceeded its ${phaseTimeoutMs}ms phase deadline${attemptSummary()}`);
|
|
124
|
+
for (let attempt = 0; attempt <= retries; attempt++) {
|
|
125
|
+
const remainingMs = deadlineAt - Date.now();
|
|
126
|
+
if (remainingMs <= 0) throw phaseTimeoutError();
|
|
127
|
+
attemptsRun++;
|
|
128
|
+
const controller = new AbortController();
|
|
129
|
+
const attemptTimeoutMs = Math.min(PATH_DISCOVERY_FETCH_TIMEOUT_MS, remainingMs);
|
|
130
|
+
let timeout;
|
|
131
|
+
let shouldRetry = true;
|
|
132
|
+
try {
|
|
133
|
+
const request = (async () => {
|
|
134
|
+
const res = await fetch(url, {
|
|
135
|
+
headers,
|
|
136
|
+
signal: controller.signal
|
|
137
|
+
});
|
|
138
|
+
return {
|
|
139
|
+
res,
|
|
140
|
+
text: await res.text()
|
|
141
|
+
};
|
|
142
|
+
})();
|
|
143
|
+
const timedOut = new Promise((_resolve, reject) => {
|
|
144
|
+
timeout = setTimeout(() => {
|
|
145
|
+
controller.abort();
|
|
146
|
+
reject(new DOMException(`Timed out after ${attemptTimeoutMs}ms`, "AbortError"));
|
|
147
|
+
}, attemptTimeoutMs);
|
|
148
|
+
});
|
|
149
|
+
const { res, text } = await Promise.race([request, timedOut]);
|
|
150
|
+
if (res.ok) {
|
|
151
|
+
if (res.status === 204) return null;
|
|
152
|
+
return text;
|
|
153
|
+
}
|
|
154
|
+
const userFailure = readDiscoveryUserFailure(res, text);
|
|
155
|
+
const detail = userFailure ?? (/cloudflare:|ERR_UNSUPPORTED_ESM_URL_SCHEME/i.test(text) ? text.trim() : "");
|
|
156
|
+
lastError = /* @__PURE__ */ new Error(`path discovery returned HTTP ${res.status}${detail ? `: ${detail}` : ""}`);
|
|
157
|
+
if (!(res.status === 404 || res.status >= 500 && res.status <= 599 && userFailure === null)) {
|
|
158
|
+
shouldRetry = false;
|
|
159
|
+
throw lastError;
|
|
160
|
+
}
|
|
161
|
+
lastTransientStatus = res.status;
|
|
162
|
+
} catch (error) {
|
|
163
|
+
if (Date.now() >= deadlineAt) throw phaseTimeoutError();
|
|
164
|
+
lastError = error instanceof Error && error.name === "AbortError" ? /* @__PURE__ */ new Error(`path discovery timed out after ${attemptTimeoutMs}ms`) : error;
|
|
165
|
+
if (!shouldRetry) throw lastError;
|
|
166
|
+
} finally {
|
|
167
|
+
if (timeout !== void 0) clearTimeout(timeout);
|
|
168
|
+
}
|
|
169
|
+
if (attempt < retries && retryDelayMs > 0) {
|
|
170
|
+
const delayMs = Math.min(retryDelayMs, Math.max(0, deadlineAt - Date.now()));
|
|
171
|
+
if (delayMs <= 0) throw phaseTimeoutError();
|
|
172
|
+
await new Promise((resolve) => setTimeout(resolve, delayMs));
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
const message = lastError instanceof Error ? lastError.message : String(lastError);
|
|
176
|
+
throw new Error(`${message}${attemptSummary()}`, { cause: lastError });
|
|
62
177
|
}
|
|
63
178
|
function resolveConfiguredRouteDirs(root, routeRootConfig) {
|
|
64
179
|
if (!routeRootConfig) return {
|
|
@@ -83,16 +198,12 @@ function resolveConfiguredRouteDirs(root, routeRootConfig) {
|
|
|
83
198
|
pagesDir: fs.existsSync(pagesDir) ? pagesDir : null
|
|
84
199
|
};
|
|
85
200
|
}
|
|
86
|
-
function appRouteMayHaveGenerateStaticParams(route) {
|
|
87
|
-
if (fileHasNamedExport(route.pagePath, "generateStaticParams")) return true;
|
|
88
|
-
return route.layouts.some((layoutPath) => fileHasNamedExport(layoutPath, "generateStaticParams"));
|
|
89
|
-
}
|
|
90
201
|
async function shouldStartPathDiscoveryServer(options) {
|
|
91
202
|
if (options.appDir) {
|
|
92
|
-
if ((await appRouter(options.appDir, options.pageExtensions)).some((route) => route.isDynamic
|
|
203
|
+
if ((await appRouter(options.appDir, options.pageExtensions)).some((route) => route.isDynamic)) return true;
|
|
93
204
|
}
|
|
94
205
|
if (options.pagesDir) {
|
|
95
|
-
if ((await pagesRouter(options.pagesDir, options.pageExtensions)).some((route) => route.isDynamic
|
|
206
|
+
if ((await pagesRouter(options.pagesDir, options.pageExtensions)).some((route) => route.isDynamic)) return true;
|
|
96
207
|
}
|
|
97
208
|
return false;
|
|
98
209
|
}
|
|
@@ -113,73 +224,294 @@ async function collectPagesPaths(options) {
|
|
|
113
224
|
const apiPatterns = new Set(apiRoutes.map((route) => route.pattern));
|
|
114
225
|
const paths = [];
|
|
115
226
|
const seen = /* @__PURE__ */ new Set();
|
|
227
|
+
const dataPaths = [];
|
|
228
|
+
const seenDataPaths = /* @__PURE__ */ new Set();
|
|
229
|
+
const fallbackRoutePatterns = [];
|
|
230
|
+
const nonDynamicPaths = [];
|
|
231
|
+
const seenNonDynamicPaths = /* @__PURE__ */ new Set();
|
|
116
232
|
for (const route of pageRoutes) {
|
|
117
233
|
if (apiPatterns.has(route.pattern)) continue;
|
|
118
234
|
if (BLOCKED_PAGES.includes(route.pattern)) continue;
|
|
119
235
|
if (route.pattern === "/404" || route.pattern === "/500" || route.pattern === "/_error") continue;
|
|
120
|
-
const { type } = classifyPagesRoute(route.filePath);
|
|
121
|
-
if (type === "api"
|
|
236
|
+
const { hasServerSideProps, hasStaticProps, type } = classifyPagesRoute(route.filePath);
|
|
237
|
+
if (type === "api") continue;
|
|
122
238
|
if (!route.isDynamic) {
|
|
123
|
-
|
|
239
|
+
if (options.i18n) for (const locale of options.i18n.locales) {
|
|
240
|
+
const pathname = localizePagesPath(route.pattern, locale, options.i18n);
|
|
241
|
+
addPath(paths, seen, pathname);
|
|
242
|
+
addPath(nonDynamicPaths, seenNonDynamicPaths, pathname);
|
|
243
|
+
if (hasStaticProps || hasServerSideProps) addPath(dataPaths, seenDataPaths, pathname);
|
|
244
|
+
}
|
|
245
|
+
else {
|
|
246
|
+
addPath(paths, seen, route.pattern);
|
|
247
|
+
addPath(nonDynamicPaths, seenNonDynamicPaths, route.pattern);
|
|
248
|
+
if (hasStaticProps || hasServerSideProps) addPath(dataPaths, seenDataPaths, route.pattern);
|
|
249
|
+
}
|
|
124
250
|
continue;
|
|
125
251
|
}
|
|
126
|
-
if (!
|
|
252
|
+
if (!options.enumerateDynamicPaths) continue;
|
|
253
|
+
if (type === "ssr") continue;
|
|
127
254
|
if (!options.baseUrl) continue;
|
|
128
255
|
try {
|
|
129
256
|
const search = new URLSearchParams({ pattern: route.pattern });
|
|
130
|
-
|
|
257
|
+
if (options.i18n) {
|
|
258
|
+
search.set("locales", JSON.stringify(options.i18n.locales));
|
|
259
|
+
search.set("defaultLocale", options.i18n.defaultLocale);
|
|
260
|
+
}
|
|
261
|
+
const text = await fetchDiscoveryEndpoint(`${options.baseUrl}/__vinext/prerender/pages-static-paths?${search}`, options.secretHeaders, options.retryOptions);
|
|
131
262
|
if (text === null) continue;
|
|
132
|
-
const pathsResult = JSON.parse(text);
|
|
133
|
-
|
|
134
|
-
|
|
263
|
+
const pathsResult = validatePagesStaticPathsResult(JSON.parse(text), route.pattern);
|
|
264
|
+
if (pathsResult.fallback !== false) fallbackRoutePatterns.push({
|
|
265
|
+
kind: "pages-page",
|
|
266
|
+
pattern: route.pattern
|
|
267
|
+
});
|
|
268
|
+
for (const item of pathsResult.paths) {
|
|
269
|
+
const validatedItem = validatePagesStaticPathsEntry(item, route.pattern);
|
|
270
|
+
let itemToNormalize = validatedItem;
|
|
271
|
+
let locale = options.i18n?.defaultLocale;
|
|
272
|
+
if (options.i18n && typeof validatedItem === "string") itemToNormalize = extractPagesStaticPathLocale(validatedItem, options.i18n).url;
|
|
273
|
+
else if (options.i18n && validatedItem && typeof validatedItem === "object" && validatedItem.locale) {
|
|
274
|
+
if (!options.i18n.locales.includes(validatedItem.locale)) throw new Error(`Invalid locale returned from getStaticPaths for ${route.pattern}: ${validatedItem.locale}`);
|
|
275
|
+
locale = validatedItem.locale;
|
|
276
|
+
}
|
|
277
|
+
const normalized = normalizeStaticPathsEntry(itemToNormalize, route.pattern);
|
|
135
278
|
if ("error" in normalized) throw new Error(normalized.error);
|
|
136
|
-
|
|
279
|
+
const pathname = typeof validatedItem === "string" ? normalizeStaticPathname(validatedItem) : localizePagesPath(buildUrlFromParams(route.pattern, normalized.params), locale, options.i18n);
|
|
280
|
+
addPath(paths, seen, pathname);
|
|
281
|
+
if (hasStaticProps) addPath(dataPaths, seenDataPaths, pathname);
|
|
137
282
|
}
|
|
138
283
|
} catch (error) {
|
|
139
|
-
|
|
284
|
+
throwDiscoveryFailure(route.pattern, error);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
return {
|
|
288
|
+
dataPaths,
|
|
289
|
+
fallbackRoutePatterns,
|
|
290
|
+
nonDynamicPaths,
|
|
291
|
+
paths
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
async function excludePagesApiWarmPaths(options) {
|
|
295
|
+
const apiRoutes = await apiRouter(options.pagesDir, options.pageExtensions);
|
|
296
|
+
return options.paths.filter((pathname) => {
|
|
297
|
+
const pagesPathname = options.i18n ? extractLocaleFromUrl(pathname, options.i18n).url : pathname;
|
|
298
|
+
if (pagesPathname !== "/api" && !pagesPathname.startsWith("/api/")) return true;
|
|
299
|
+
return matchRoute(pagesPathname, apiRoutes) === null;
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
async function resolvePagesWarmRouteMetadata(options) {
|
|
303
|
+
const pageRoutes = await pagesRouter(options.pagesDir, options.pageExtensions);
|
|
304
|
+
const classifications = /* @__PURE__ */ new Map();
|
|
305
|
+
const dataPaths = [];
|
|
306
|
+
const routePatterns = {};
|
|
307
|
+
for (const pathname of options.paths) {
|
|
308
|
+
const pagesPathname = options.i18n ? extractLocaleFromUrl(pathname, options.i18n).url : pathname;
|
|
309
|
+
const match = matchRoute(pagesPathname, pageRoutes);
|
|
310
|
+
if (!match) continue;
|
|
311
|
+
routePatterns[pathname] = {
|
|
312
|
+
kind: "pages-page",
|
|
313
|
+
pattern: match.route.pattern
|
|
314
|
+
};
|
|
315
|
+
let classification = classifications.get(match.route.filePath);
|
|
316
|
+
if (!classification) {
|
|
317
|
+
classification = classifyPagesRoute(match.route.filePath);
|
|
318
|
+
classifications.set(match.route.filePath, classification);
|
|
140
319
|
}
|
|
320
|
+
const { hasServerSideProps, hasStaticProps } = classification;
|
|
321
|
+
if (hasServerSideProps || hasStaticProps) dataPaths.push(pathname);
|
|
141
322
|
}
|
|
142
|
-
return
|
|
323
|
+
return {
|
|
324
|
+
dataPaths,
|
|
325
|
+
routePatterns
|
|
326
|
+
};
|
|
327
|
+
}
|
|
328
|
+
function localizePagesPath(pathname, locale, i18n) {
|
|
329
|
+
if (!i18n || !locale || locale === i18n.defaultLocale) return pathname;
|
|
330
|
+
return pathname === "/" ? `/${locale}` : `/${locale}${pathname}`;
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Next.js data URLs always carry the locale segment, including the default
|
|
334
|
+
* locale that is omitted from the corresponding public HTML pathname.
|
|
335
|
+
*
|
|
336
|
+
* Ported from Next.js:
|
|
337
|
+
* packages/next/src/shared/lib/router/utils/format-next-pathname-info.ts
|
|
338
|
+
*/
|
|
339
|
+
function localizePagesDataPath(pathname, i18n) {
|
|
340
|
+
if (!i18n) return pathname;
|
|
341
|
+
if (extractPagesStaticPathLocale(pathname, i18n).explicitLocalePrefix) return pathname;
|
|
342
|
+
return pathname === "/" ? `/${i18n.defaultLocale}` : `/${i18n.defaultLocale}${pathname}`;
|
|
343
|
+
}
|
|
344
|
+
function extractPagesStaticPathLocale(url, i18n) {
|
|
345
|
+
const queryIndex = url.indexOf("?");
|
|
346
|
+
const pathname = queryIndex === -1 ? url : url.slice(0, queryIndex);
|
|
347
|
+
const query = queryIndex === -1 ? "" : url.slice(queryIndex);
|
|
348
|
+
const parts = pathname.split("/").filter(Boolean);
|
|
349
|
+
const locale = parts.length > 0 ? i18n.locales.find((candidate) => candidate.toLowerCase() === parts[0].toLowerCase()) : void 0;
|
|
350
|
+
if (!locale) return extractLocaleFromUrl(url, i18n);
|
|
351
|
+
const rest = `/${parts.slice(1).join("/")}`;
|
|
352
|
+
return {
|
|
353
|
+
explicitLocalePrefix: parts[0],
|
|
354
|
+
locale,
|
|
355
|
+
url: `${rest || "/"}${query}`
|
|
356
|
+
};
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Whether Next.js classifies an App page route as static or SSG, read from its
|
|
360
|
+
* layout, page and parallel-slot sources with the helpers dispatch applies to
|
|
361
|
+
* the loaded modules. Only such a route has listed paths.
|
|
362
|
+
*
|
|
363
|
+
* An MDX source read without the MDX parser has unknown exports, so its route
|
|
364
|
+
* is "unreadable". Its paths are still listed: the built runtime reads the real
|
|
365
|
+
* exports and never stores a route that isn't static, while an unlisted path's
|
|
366
|
+
* render failure would be dropped instead of failing. But no probe renders an
|
|
367
|
+
* unreadable route's fallback, so it never certifies one.
|
|
368
|
+
*/
|
|
369
|
+
function classifyAppPageRouteStaticEligibility(route, readMdxEsm) {
|
|
370
|
+
let unreadable = false;
|
|
371
|
+
const readSegmentConfig = (filePath) => {
|
|
372
|
+
if (!filePath) return null;
|
|
373
|
+
let code = fs.readFileSync(filePath, "utf8");
|
|
374
|
+
if (filePath.toLowerCase().endsWith(".mdx")) {
|
|
375
|
+
let esm = null;
|
|
376
|
+
try {
|
|
377
|
+
esm = readMdxEsm?.(code) ?? null;
|
|
378
|
+
} catch {}
|
|
379
|
+
unreadable ||= esm === null;
|
|
380
|
+
code = esm ?? "";
|
|
381
|
+
}
|
|
382
|
+
const dynamic = extractExportConstString(code, "dynamic");
|
|
383
|
+
const revalidate = extractExportConstNumber(code, "revalidate");
|
|
384
|
+
const runtime = extractExportConstString(code, "runtime");
|
|
385
|
+
return {
|
|
386
|
+
...dynamic === null ? {} : { dynamic },
|
|
387
|
+
...hasRuntimeExportedName(code, "generateStaticParams") ? { generateStaticParams() {} } : {},
|
|
388
|
+
...revalidate === null ? {} : { revalidate },
|
|
389
|
+
...runtime === null ? {} : { runtime }
|
|
390
|
+
};
|
|
391
|
+
};
|
|
392
|
+
const layouts = route.layouts.map(readSegmentConfig);
|
|
393
|
+
const page = readSegmentConfig(route.pagePath);
|
|
394
|
+
const parallelBranches = route.parallelSlots.map((slot) => ({
|
|
395
|
+
configLayouts: (slot.configLayoutPaths ?? []).map(readSegmentConfig),
|
|
396
|
+
configLayoutTreePositions: slot.configLayoutTreePositions ?? [],
|
|
397
|
+
isDefault: !slot.pagePath,
|
|
398
|
+
layout: readSegmentConfig(slot.layoutPath),
|
|
399
|
+
name: slot.name,
|
|
400
|
+
ownerTreePosition: slot.ownerTreePosition ?? null,
|
|
401
|
+
page: readSegmentConfig(slot.pagePath ?? slot.defaultPath),
|
|
402
|
+
routeSegments: slot.routeSegments
|
|
403
|
+
}));
|
|
404
|
+
if (unreadable) return "unreadable";
|
|
405
|
+
const segmentConfig = resolveAppPageSegmentConfig({
|
|
406
|
+
layouts,
|
|
407
|
+
layoutTreePositions: route.layoutTreePositions,
|
|
408
|
+
page,
|
|
409
|
+
parallelBranches,
|
|
410
|
+
routeSegments: route.routeSegments
|
|
411
|
+
});
|
|
412
|
+
return isAppPageStaticEligible({
|
|
413
|
+
dynamicConfig: segmentConfig.dynamicConfig,
|
|
414
|
+
hasGenerateStaticParams: hasAppPageGenerateStaticParamsAtLastDynamicSegment({
|
|
415
|
+
childrenSlot: route.childrenSlot ?? null,
|
|
416
|
+
layouts,
|
|
417
|
+
layoutTreePositions: route.layoutTreePositions,
|
|
418
|
+
page,
|
|
419
|
+
parallelBranches,
|
|
420
|
+
routeSegments: route.routeSegments
|
|
421
|
+
}),
|
|
422
|
+
isDynamicRoute: route.isDynamic,
|
|
423
|
+
isStaticGenerationEdgeRuntime: isEdgeRuntime(resolveAppPageStaticGenerationRuntime(collectAppPageStaticGenerationRuntimes({
|
|
424
|
+
childrenSlot: route.childrenSlot ?? null,
|
|
425
|
+
layouts,
|
|
426
|
+
layoutTreePositions: route.layoutTreePositions,
|
|
427
|
+
page,
|
|
428
|
+
parallelBranches,
|
|
429
|
+
routeSegments: route.routeSegments
|
|
430
|
+
}))),
|
|
431
|
+
revalidateSeconds: segmentConfig.revalidateSeconds
|
|
432
|
+
}) ? "eligible" : "ineligible";
|
|
433
|
+
}
|
|
434
|
+
/** Keys a path an App page route lists by the route and the pathname together. */
|
|
435
|
+
function appPageListingKey(routePattern, pathname) {
|
|
436
|
+
return `${routePattern}\0${pathname}`;
|
|
143
437
|
}
|
|
144
438
|
async function collectAppPaths(options) {
|
|
145
439
|
const routes = await appRouter(options.appDir, options.pageExtensions);
|
|
146
440
|
const paths = [];
|
|
147
441
|
const seen = /* @__PURE__ */ new Set();
|
|
442
|
+
const routeHandlerPaths = [];
|
|
443
|
+
const seenRouteHandlerPaths = /* @__PURE__ */ new Set();
|
|
444
|
+
const fallbackRoutePatterns = [];
|
|
445
|
+
const nonDynamicPaths = [];
|
|
446
|
+
const seenNonDynamicPaths = /* @__PURE__ */ new Set();
|
|
447
|
+
const listedRoutePaths = /* @__PURE__ */ new Set();
|
|
148
448
|
const staticParamsCache = /* @__PURE__ */ new Map();
|
|
449
|
+
let requireNonEmptyStaticParams = false;
|
|
149
450
|
const staticParamsMap = new Proxy({}, {
|
|
150
451
|
get(_target, pattern) {
|
|
151
452
|
return async ({ params }) => {
|
|
152
453
|
if (!options.baseUrl) return null;
|
|
153
|
-
const
|
|
154
|
-
const
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
454
|
+
const rejectEmptyResults = requireNonEmptyStaticParams;
|
|
455
|
+
const cacheKey = `${pattern}\0${JSON.stringify(params)}\0${rejectEmptyResults}`;
|
|
456
|
+
let request = staticParamsCache.get(cacheKey);
|
|
457
|
+
if (request === void 0) {
|
|
458
|
+
request = (async () => {
|
|
459
|
+
const search = new URLSearchParams({ pattern });
|
|
460
|
+
if (Object.keys(params).length > 0) search.set("parentParams", JSON.stringify(params));
|
|
461
|
+
if (rejectEmptyResults) search.set("rejectEmptyResults", "1");
|
|
462
|
+
const text = await fetchDiscoveryEndpoint(`${options.baseUrl}/__vinext/prerender/static-params?${search}`, options.secretHeaders, options.retryOptions);
|
|
463
|
+
if (text === null) return null;
|
|
464
|
+
const value = JSON.parse(text);
|
|
465
|
+
if (!Array.isArray(value)) throw new Error(`generateStaticParams must return an array for ${pattern}.`);
|
|
466
|
+
return value.map((entry) => {
|
|
467
|
+
if (!entry || typeof entry !== "object" || Array.isArray(entry)) throw new Error(`generateStaticParams must return parameter objects for ${pattern}.`);
|
|
468
|
+
return validateDiscoveredParams({
|
|
469
|
+
...params,
|
|
470
|
+
...entry
|
|
471
|
+
}, pattern, "generateStaticParams");
|
|
472
|
+
});
|
|
473
|
+
})();
|
|
474
|
+
request.catch(() => staticParamsCache.delete(cacheKey));
|
|
475
|
+
staticParamsCache.set(cacheKey, request);
|
|
476
|
+
}
|
|
477
|
+
const value = await request;
|
|
478
|
+
if (rejectEmptyResults && value?.length === 0) throw new Error("When using Cache Components, all `generateStaticParams` functions must return at least one result. This is to ensure that we can perform build-time validation that there is no other dynamic accesses that would cause a runtime error.\n\nLearn more: https://nextjs.org/docs/messages/empty-generate-static-params");
|
|
479
|
+
return value;
|
|
166
480
|
};
|
|
167
481
|
},
|
|
168
482
|
has() {
|
|
169
483
|
return false;
|
|
170
484
|
}
|
|
171
485
|
});
|
|
486
|
+
const readMdxEsm = !options.cacheComponents && options.pageExtensions.includes("mdx") ? await loadMdxEsmReader(options.root) : null;
|
|
172
487
|
for (const route of routes) {
|
|
173
|
-
const
|
|
488
|
+
const isRouteHandler = route.routePath !== null && route.pagePath === null;
|
|
489
|
+
const renderEntryPath = isRouteHandler ? route.routePath : getAppRouteRenderEntryPath(route);
|
|
174
490
|
if (!renderEntryPath) continue;
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
491
|
+
if (isRouteHandler) {
|
|
492
|
+
const classification = classifyAppRouteHandler(route.routePath);
|
|
493
|
+
if (!classification.hasGet || !classification.staticGenerationEnabled) continue;
|
|
494
|
+
} else {
|
|
495
|
+
const { type } = classifyAppRoute(renderEntryPath, route.routePath, route.isDynamic);
|
|
496
|
+
if (type === "api") continue;
|
|
497
|
+
}
|
|
498
|
+
const staticEligibility = isRouteHandler || options.cacheComponents ? "eligible" : classifyAppPageRouteStaticEligibility(route, readMdxEsm);
|
|
499
|
+
const isStaticEligible = staticEligibility !== "ineligible";
|
|
500
|
+
const addDiscoveredPath = (pathname) => {
|
|
501
|
+
if (isRouteHandler) {
|
|
502
|
+
addPath(routeHandlerPaths, seenRouteHandlerPaths, pathname);
|
|
503
|
+
return;
|
|
504
|
+
}
|
|
505
|
+
addPath(paths, seen, pathname);
|
|
506
|
+
if (isStaticEligible) listedRoutePaths.add(appPageListingKey(route.pattern, pathname));
|
|
507
|
+
};
|
|
178
508
|
if (!route.isDynamic) {
|
|
179
|
-
|
|
509
|
+
addDiscoveredPath(route.pattern);
|
|
510
|
+
addPath(nonDynamicPaths, seenNonDynamicPaths, route.pattern);
|
|
180
511
|
continue;
|
|
181
512
|
}
|
|
182
|
-
if (!
|
|
513
|
+
if (!options.enumerateDynamicPaths) continue;
|
|
514
|
+
requireNonEmptyStaticParams = options.cacheComponents && !isRouteHandler;
|
|
183
515
|
try {
|
|
184
516
|
const generateStaticParams = staticParamsMap[route.pattern];
|
|
185
517
|
if (typeof generateStaticParams !== "function") continue;
|
|
@@ -190,28 +522,255 @@ async function collectAppPaths(options) {
|
|
|
190
522
|
for (const parentParams of parentParamSets) {
|
|
191
523
|
const childResults = await generateStaticParams({ params: parentParams });
|
|
192
524
|
if (childResults === null) {
|
|
193
|
-
paramSets =
|
|
525
|
+
paramSets = layoutOnlyParamSets(route, parentParamSets);
|
|
194
526
|
break;
|
|
195
527
|
}
|
|
196
|
-
if (Array.isArray(childResults))
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
528
|
+
if (Array.isArray(childResults)) {
|
|
529
|
+
if (childResults.length === 0) paramSets.push(parentParams);
|
|
530
|
+
for (const childParams of childResults) paramSets.push({
|
|
531
|
+
...parentParams,
|
|
532
|
+
...childParams
|
|
533
|
+
});
|
|
534
|
+
}
|
|
200
535
|
}
|
|
536
|
+
if (paramSets !== null) paramSets = routeStaticParamSets(route, paramSets);
|
|
201
537
|
} else {
|
|
202
538
|
const results = await generateStaticParams({ params: {} });
|
|
203
|
-
paramSets = Array.isArray(results)
|
|
539
|
+
paramSets = results === null ? null : routeStaticParamSets(route, Array.isArray(results) ? results : []);
|
|
540
|
+
}
|
|
541
|
+
if (!paramSets?.length) {
|
|
542
|
+
if (isRouteHandler) {
|
|
543
|
+
const dynamicConfig = extractExportConstString(fs.readFileSync(renderEntryPath, "utf8"), "dynamic");
|
|
544
|
+
if (paramSets !== null || dynamicConfig === "force-static" || dynamicConfig === "error") fallbackRoutePatterns.push({
|
|
545
|
+
kind: "app-route",
|
|
546
|
+
pattern: route.pattern
|
|
547
|
+
});
|
|
548
|
+
continue;
|
|
549
|
+
}
|
|
550
|
+
const parallelSegments = route.parallelSlots.flatMap((slot) => [
|
|
551
|
+
slot.layoutPath,
|
|
552
|
+
...slot.configLayoutPaths ?? [],
|
|
553
|
+
slot.pagePath ?? slot.defaultPath
|
|
554
|
+
].filter((filePath) => typeof filePath === "string"));
|
|
555
|
+
const hasDynamicSegment = [
|
|
556
|
+
...route.layouts,
|
|
557
|
+
renderEntryPath,
|
|
558
|
+
...parallelSegments
|
|
559
|
+
].map((filePath) => classifyAppRoute(filePath, null, false)).some((classification) => classification.type === "ssr");
|
|
560
|
+
const readDynamicConfig = (filePath) => {
|
|
561
|
+
const dynamic = extractExportConstString(fs.readFileSync(filePath, "utf8"), "dynamic");
|
|
562
|
+
return dynamic === null ? {} : { dynamic };
|
|
563
|
+
};
|
|
564
|
+
const dynamicConfig = resolveAppPageDynamicConfig({
|
|
565
|
+
layouts: route.layouts.map(readDynamicConfig),
|
|
566
|
+
page: readDynamicConfig(renderEntryPath),
|
|
567
|
+
parallelSegments: parallelSegments.map(readDynamicConfig)
|
|
568
|
+
});
|
|
569
|
+
if ((paramSets !== null || dynamicConfig === "force-static" || dynamicConfig === "error") && !hasDynamicSegment && staticEligibility === "eligible") fallbackRoutePatterns.push({
|
|
570
|
+
kind: "app-page",
|
|
571
|
+
pattern: route.pattern
|
|
572
|
+
});
|
|
573
|
+
continue;
|
|
204
574
|
}
|
|
205
|
-
if (!paramSets?.length) continue;
|
|
206
575
|
for (const params of paramSets) {
|
|
207
576
|
if (params === null || params === void 0) continue;
|
|
208
|
-
|
|
577
|
+
addDiscoveredPath(buildUrlFromParams(route.pattern, params));
|
|
209
578
|
}
|
|
210
579
|
} catch (error) {
|
|
211
|
-
|
|
580
|
+
throwDiscoveryFailure(route.pattern, error);
|
|
581
|
+
}
|
|
582
|
+
}
|
|
583
|
+
return {
|
|
584
|
+
fallbackRoutePatterns,
|
|
585
|
+
nonDynamicPaths,
|
|
586
|
+
paths,
|
|
587
|
+
routeHandlerPaths,
|
|
588
|
+
listedRoutePaths
|
|
589
|
+
};
|
|
590
|
+
}
|
|
591
|
+
async function resolveAppWarmPaths(options) {
|
|
592
|
+
const appRoutes = await appRouter(options.appDir, options.pageExtensions);
|
|
593
|
+
const loadingBoundaryRoutePatterns = appRoutes.filter((route) => !(route.routePath && !route.pagePath) && appRouteHasMainTreeLoadingBoundary(route)).map((route) => route.pattern).sort();
|
|
594
|
+
const routeHandlerClassifications = new Map(appRoutes.flatMap((route) => route.routePath && !route.pagePath ? [[route.routePath, classifyAppRouteHandler(route.routePath)]] : []));
|
|
595
|
+
const [pageRoutes, apiRoutes] = options.pagesDir ? await Promise.all([pagesRouter(options.pagesDir, options.pageExtensions), apiRouter(options.pagesDir, options.pageExtensions)]) : [[], []];
|
|
596
|
+
const rscPaths = [];
|
|
597
|
+
const appPaths = [];
|
|
598
|
+
const appRoutePaths = [];
|
|
599
|
+
const htmlPaths = [];
|
|
600
|
+
const loadingShellPaths = [];
|
|
601
|
+
const pagesPaths = [];
|
|
602
|
+
const routePatterns = {};
|
|
603
|
+
for (const pathname of options.paths) {
|
|
604
|
+
const appMatch = matchAppRoute(pathname, appRoutes);
|
|
605
|
+
const pagesPathname = options.i18n ? extractLocaleFromUrl(pathname, options.i18n).url : pathname;
|
|
606
|
+
const isPagesApiRequest = pathname === "/api" || pathname.startsWith("/api/");
|
|
607
|
+
const pagesMatch = matchRoute(pagesPathname, isPagesApiRequest ? apiRoutes : pageRoutes);
|
|
608
|
+
if (pagesMatch && (!appMatch || pagesRouteHasPriorityOverAppRoute(pagesMatch.route, appMatch.route))) {
|
|
609
|
+
if (!isPagesApiRequest) {
|
|
610
|
+
htmlPaths.push(pathname);
|
|
611
|
+
pagesPaths.push(pathname);
|
|
612
|
+
routePatterns[pathname] = {
|
|
613
|
+
kind: "pages-page",
|
|
614
|
+
pattern: pagesMatch.route.pattern
|
|
615
|
+
};
|
|
616
|
+
}
|
|
617
|
+
continue;
|
|
618
|
+
}
|
|
619
|
+
if (!appMatch) continue;
|
|
620
|
+
const matchedAppRoute = appMatch.route;
|
|
621
|
+
if (matchedAppRoute.routePath && !matchedAppRoute.pagePath) {
|
|
622
|
+
const classification = routeHandlerClassifications.get(matchedAppRoute.routePath);
|
|
623
|
+
if (classification?.hasGet && classification.staticGenerationEnabled) {
|
|
624
|
+
appRoutePaths.push(pathname);
|
|
625
|
+
routePatterns[pathname] = {
|
|
626
|
+
kind: "app-route",
|
|
627
|
+
pattern: matchedAppRoute.pattern
|
|
628
|
+
};
|
|
629
|
+
}
|
|
630
|
+
continue;
|
|
212
631
|
}
|
|
632
|
+
const appRenderEntryPath = getAppRouteRenderEntryPath(matchedAppRoute);
|
|
633
|
+
if (!appRenderEntryPath) continue;
|
|
634
|
+
if (classifyAppRoute(appRenderEntryPath, matchedAppRoute.routePath, matchedAppRoute.isDynamic).type === "api") continue;
|
|
635
|
+
appPaths.push(pathname);
|
|
636
|
+
htmlPaths.push(pathname);
|
|
637
|
+
rscPaths.push(pathname);
|
|
638
|
+
routePatterns[pathname] = {
|
|
639
|
+
kind: "app-page",
|
|
640
|
+
pattern: matchedAppRoute.pattern
|
|
641
|
+
};
|
|
642
|
+
if (appRouteHasMainTreeLoadingBoundary(matchedAppRoute)) loadingShellPaths.push(pathname);
|
|
643
|
+
}
|
|
644
|
+
return {
|
|
645
|
+
appPaths,
|
|
646
|
+
appRoutePaths,
|
|
647
|
+
htmlPaths,
|
|
648
|
+
loadingBoundaryRoutePatterns,
|
|
649
|
+
loadingShellPaths,
|
|
650
|
+
pagesPaths,
|
|
651
|
+
routePatterns,
|
|
652
|
+
rscPaths
|
|
653
|
+
};
|
|
654
|
+
}
|
|
655
|
+
function cachePolicyRuleMatchesWarmPath(pathname, rule, config) {
|
|
656
|
+
const canonicalPathname = normalizePathTrailingSlash(pathname, config.trailingSlash);
|
|
657
|
+
return [void 0, ...config.i18n?.domains?.map((domain) => domain.domain) ?? []].some((hostname) => {
|
|
658
|
+
const matchPathname = normalizeDefaultLocalePathname(canonicalPathname, config.i18n, { hostname });
|
|
659
|
+
let sourceMatched = false;
|
|
660
|
+
matchHeaders(matchPathname, [rule], {
|
|
661
|
+
cookies: {},
|
|
662
|
+
headers: new Headers(),
|
|
663
|
+
host: hostname ?? "",
|
|
664
|
+
query: new URLSearchParams()
|
|
665
|
+
}, {
|
|
666
|
+
basePath: config.basePath,
|
|
667
|
+
hadBasePath: true
|
|
668
|
+
}, () => {
|
|
669
|
+
sourceMatched = true;
|
|
670
|
+
});
|
|
671
|
+
return sourceMatched;
|
|
672
|
+
});
|
|
673
|
+
}
|
|
674
|
+
function cachePolicyRuleSourceMatchesWarmPath(pathname, rule, config) {
|
|
675
|
+
return cachePolicyRuleMatchesWarmPath(pathname, {
|
|
676
|
+
...rule,
|
|
677
|
+
has: void 0,
|
|
678
|
+
missing: void 0
|
|
679
|
+
}, config);
|
|
680
|
+
}
|
|
681
|
+
function staticConfigPatternSegments(pattern) {
|
|
682
|
+
const segments = [];
|
|
683
|
+
for (const segment of pattern.split("/").filter(Boolean)) {
|
|
684
|
+
if (/[:*()[\]{}]/.test(segment)) break;
|
|
685
|
+
segments.push(segment);
|
|
686
|
+
}
|
|
687
|
+
return segments;
|
|
688
|
+
}
|
|
689
|
+
function routePatternCouldIntersectCachePolicyRule(routePattern, rule, basePath) {
|
|
690
|
+
let ruleSource = rule.source;
|
|
691
|
+
if (rule.basePath !== false && basePath && (ruleSource === basePath || ruleSource.startsWith(`${basePath}/`))) ruleSource = ruleSource.slice(basePath.length) || "/";
|
|
692
|
+
const routeSegments = staticConfigPatternSegments(routePattern);
|
|
693
|
+
const ruleSegments = staticConfigPatternSegments(ruleSource);
|
|
694
|
+
const sharedLength = Math.min(routeSegments.length, ruleSegments.length);
|
|
695
|
+
for (let index = 0; index < sharedLength; index++) if (routeSegments[index] !== ruleSegments[index]) return false;
|
|
696
|
+
return true;
|
|
697
|
+
}
|
|
698
|
+
/**
|
|
699
|
+
* Certify only route-config bailouts that cannot hide a path- or
|
|
700
|
+
* request-specific next.config cache policy. The final Worker still evaluates
|
|
701
|
+
* every concrete response before emitting public cache headers.
|
|
702
|
+
*/
|
|
703
|
+
function annotateCacheabilityProbeSafety(routePatterns, config, routeMayResolve, requestStageMayTerminate, unlisted, isResponsePolicyHeader) {
|
|
704
|
+
const cachePolicyRules = config.headers.filter((rule) => rule.headers.some((header) => isResponsePolicyHeader(header.key)));
|
|
705
|
+
const matchingPolicyRules = new Map(Object.keys(routePatterns).map((pathname) => [pathname, new Set(cachePolicyRules.filter((rule) => cachePolicyRuleMatchesWarmPath(pathname, rule, config)))]));
|
|
706
|
+
const pathsByPattern = /* @__PURE__ */ new Map();
|
|
707
|
+
for (const [pathname, route] of Object.entries(routePatterns)) {
|
|
708
|
+
const key = `${route.kind}\0${route.pattern}`;
|
|
709
|
+
const paths = pathsByPattern.get(key) ?? [];
|
|
710
|
+
paths.push(pathname);
|
|
711
|
+
pathsByPattern.set(key, paths);
|
|
213
712
|
}
|
|
214
|
-
|
|
713
|
+
const canPrunePatterns = /* @__PURE__ */ new Map();
|
|
714
|
+
for (const [patternKey, patternPaths] of pathsByPattern) {
|
|
715
|
+
const routePattern = routePatterns[patternPaths[0]].pattern;
|
|
716
|
+
const relevantRules = cachePolicyRules.filter((rule) => patternPaths.some((path) => cachePolicyRuleSourceMatchesWarmPath(path, rule, config)) || routePatternCouldIntersectCachePolicyRule(routePattern, rule, config.basePath));
|
|
717
|
+
canPrunePatterns.set(patternKey, relevantRules.every((rule) => !rule.has?.length && !rule.missing?.length && patternPaths.every((path) => matchingPolicyRules.get(path)?.has(rule) === true)));
|
|
718
|
+
}
|
|
719
|
+
return Object.fromEntries(Object.entries(routePatterns).map(([pathname, route]) => {
|
|
720
|
+
const patternKey = `${route.kind}\0${route.pattern}`;
|
|
721
|
+
const canPrunePattern = canPrunePatterns.get(patternKey) ?? false;
|
|
722
|
+
return [pathname, {
|
|
723
|
+
...route,
|
|
724
|
+
cacheabilityProbe: {
|
|
725
|
+
canPrunePattern,
|
|
726
|
+
...routeMayResolve.has(pathname) ? { routeMayResolve: true } : {},
|
|
727
|
+
...requestStageMayTerminate.has(pathname) ? { requestStageMayTerminate: true } : {},
|
|
728
|
+
...unlisted.has(pathname) ? { unlisted: true } : {}
|
|
729
|
+
}
|
|
730
|
+
}];
|
|
731
|
+
}));
|
|
732
|
+
}
|
|
733
|
+
function configuredRulesAffectWarmPath(pathname, rules, config) {
|
|
734
|
+
const canonicalPathname = normalizePathTrailingSlash(pathname, config.trailingSlash);
|
|
735
|
+
const hostnames = [void 0, ...config.i18n?.domains?.map((domain) => domain.domain) ?? []];
|
|
736
|
+
const matchPathnames = new Set(hostnames.map((hostname) => normalizeDefaultLocalePathname(canonicalPathname, config.i18n, { hostname })));
|
|
737
|
+
return rules.some((rule) => Array.from(matchPathnames).some((matchPathname) => matchesRewriteSource(matchPathname, rule, {
|
|
738
|
+
basePath: config.basePath,
|
|
739
|
+
hadBasePath: true
|
|
740
|
+
})));
|
|
741
|
+
}
|
|
742
|
+
/**
|
|
743
|
+
* Whether a configured rewrite can replace a route-owned warm response.
|
|
744
|
+
* Non-dynamic filesystem routes win before `afterFiles`, while every concrete
|
|
745
|
+
* path discovered here wins dynamic matching before `fallback`.
|
|
746
|
+
*/
|
|
747
|
+
function configuredRewritesCanReplaceWarmPath(pathname, rewrites, hasNonDynamicRoute, config, include) {
|
|
748
|
+
return configuredRulesAffectWarmPath(pathname, [...rewrites.beforeFiles.filter(include), ...hasNonDynamicRoute ? [] : rewrites.afterFiles.filter(include)], config);
|
|
749
|
+
}
|
|
750
|
+
function findMiddlewareConventionFile(root, appDir, pagesDir, pageExtensions) {
|
|
751
|
+
const routeDir = appDir ?? pagesDir;
|
|
752
|
+
const routeRoot = routeDir ? path.dirname(routeDir) : root;
|
|
753
|
+
const conventionDir = routeRoot === path.join(root, "src") ? routeRoot : root;
|
|
754
|
+
for (const name of ["proxy", "middleware"]) for (const extension of pageExtensions) {
|
|
755
|
+
const filePath = path.join(conventionDir, `${name}.${extension}`);
|
|
756
|
+
if (fs.existsSync(filePath)) return filePath;
|
|
757
|
+
}
|
|
758
|
+
return null;
|
|
759
|
+
}
|
|
760
|
+
/** @internal Match the pathname forms and locale provenance used by middleware runtime. */
|
|
761
|
+
function matchesMiddlewareWarmPath(pathname, matcher, i18n) {
|
|
762
|
+
const encodedPathname = new URL(pathname, "https://vinext.invalid").pathname;
|
|
763
|
+
const firstSegment = encodedPathname.split("/", 3)[1]?.toLowerCase();
|
|
764
|
+
const localeContexts = i18n ? i18n.locales.some((locale) => locale.toLowerCase() === firstSegment) ? [{ kind: "literal" }] : Array.from(/* @__PURE__ */ new Set([i18n.defaultLocale, ...i18n.domains?.map((domain) => domain.defaultLocale) ?? []]), (defaultLocale) => ({
|
|
765
|
+
defaultLocale,
|
|
766
|
+
kind: "defaulted"
|
|
767
|
+
})) : [void 0];
|
|
768
|
+
const matchPathnames = [encodedPathname];
|
|
769
|
+
try {
|
|
770
|
+
const decodedPathname = decodeURIComponent(encodedPathname);
|
|
771
|
+
if (decodedPathname !== encodedPathname) matchPathnames.push(decodedPathname);
|
|
772
|
+
} catch {}
|
|
773
|
+
return matchPathnames.some((matchPathname) => localeContexts.some((localeContext) => matchesMiddlewarePathname(matchPathname, matcher, i18n, localeContext)));
|
|
215
774
|
}
|
|
216
775
|
async function startPathDiscoveryServer(options) {
|
|
217
776
|
return startProdServer({
|
|
@@ -219,34 +778,50 @@ async function startPathDiscoveryServer(options) {
|
|
|
219
778
|
host: "127.0.0.1",
|
|
220
779
|
outDir: options.pagesBundlePath ? path.dirname(path.dirname(options.pagesBundlePath)) : path.dirname(options.serverDir),
|
|
221
780
|
rscEntryPath: options.rscBundlePath,
|
|
781
|
+
serverDir: options.serverDir,
|
|
222
782
|
serverEntryPath: options.pagesBundlePath,
|
|
223
783
|
noCompression: true,
|
|
224
784
|
purpose: "prerender"
|
|
225
785
|
});
|
|
226
786
|
}
|
|
227
|
-
async function
|
|
787
|
+
async function discoverPrerenderPathManifest(options) {
|
|
228
788
|
const { root } = options;
|
|
229
789
|
const configuredRouteDirs = resolveConfiguredRouteDirs(root, options.routeRootConfig);
|
|
230
790
|
const appDir = options.appDir !== void 0 ? options.appDir : configuredRouteDirs.appDir;
|
|
231
791
|
const pagesDir = options.pagesDir !== void 0 ? options.pagesDir : configuredRouteDirs.pagesDir;
|
|
232
792
|
if (!appDir && !pagesDir) return null;
|
|
233
|
-
const
|
|
793
|
+
const configuredRscServerDir = options.routeRootConfig?.rscOutDir ? path.resolve(root, options.routeRootConfig.rscOutDir) : path.join(root, "dist", "server");
|
|
794
|
+
const defaultRscBundlePath = resolveBuiltRscEntryPath(configuredRscServerDir);
|
|
234
795
|
const rscBundlePath = options.rscBundlePath ?? defaultRscBundlePath;
|
|
796
|
+
const relativeRscEntryPath = path.relative(configuredRscServerDir, rscBundlePath);
|
|
797
|
+
const rscServerDir = !relativeRscEntryPath.startsWith("../") && !path.isAbsolute(relativeRscEntryPath) ? configuredRscServerDir : path.dirname(rscBundlePath);
|
|
235
798
|
const pagesBundlePath = options.pagesBundlePath ?? path.join(root, "dist", "server", "entry.js");
|
|
236
|
-
const bundleServerDir = fs.existsSync(rscBundlePath) ?
|
|
799
|
+
const bundleServerDir = fs.existsSync(rscBundlePath) ? rscServerDir : path.dirname(pagesBundlePath);
|
|
237
800
|
const manifestDir = path.join(root, "dist", "server");
|
|
238
801
|
const config = options.nextConfig ? { ...options.nextConfig } : { ...await resolveNextConfig(await loadNextConfig(root, PHASE_PRODUCTION_BUILD), root) };
|
|
239
802
|
const builtBuildId = readBuiltBuildId(manifestDir) ?? readBuiltBuildId(bundleServerDir);
|
|
803
|
+
const rscBuildId = readBuiltRscBuildId(manifestDir) ?? readBuiltRscBuildId(bundleServerDir);
|
|
240
804
|
if (builtBuildId) config.buildId = builtBuildId;
|
|
241
805
|
const paths = [];
|
|
242
806
|
const seen = /* @__PURE__ */ new Set();
|
|
807
|
+
const discoveredPagesPaths = [];
|
|
808
|
+
const seenPagesPaths = /* @__PURE__ */ new Set();
|
|
809
|
+
const discoveredPagesDataPaths = [];
|
|
810
|
+
const seenPagesDataPaths = /* @__PURE__ */ new Set();
|
|
811
|
+
const discoveredRouteHandlerPaths = [];
|
|
812
|
+
const seenRouteHandlerPaths = /* @__PURE__ */ new Set();
|
|
813
|
+
const discoveredNonDynamicPathSet = /* @__PURE__ */ new Set();
|
|
814
|
+
const appListedRoutePaths = /* @__PURE__ */ new Set();
|
|
815
|
+
const candidateOnlyPathSet = /* @__PURE__ */ new Set();
|
|
816
|
+
const fallbackRoutePatterns = [];
|
|
243
817
|
await withPrerenderEndpoints(async () => {
|
|
244
818
|
let prodServer = null;
|
|
245
|
-
|
|
819
|
+
const needsServer = await shouldStartPathDiscoveryServer({
|
|
246
820
|
appDir,
|
|
247
821
|
pagesDir,
|
|
248
822
|
pageExtensions: config.pageExtensions
|
|
249
|
-
})
|
|
823
|
+
});
|
|
824
|
+
if (needsServer && !options.pathDiscoveryTarget) try {
|
|
250
825
|
prodServer = await startPathDiscoveryServer({
|
|
251
826
|
serverDir: bundleServerDir,
|
|
252
827
|
pagesBundlePath: !appDir && pagesDir ? pagesBundlePath : void 0,
|
|
@@ -254,37 +829,177 @@ async function emitPrerenderPathManifest(options) {
|
|
|
254
829
|
});
|
|
255
830
|
} catch (error) {
|
|
256
831
|
const message = error instanceof Error ? error.message : String(error);
|
|
257
|
-
|
|
832
|
+
throw new Error(`Failed to start prerender path discovery server: ${message}`, { cause: error });
|
|
258
833
|
}
|
|
259
|
-
const baseUrl = prodServer ? `http://127.0.0.1:${prodServer.port}` : null;
|
|
834
|
+
const baseUrl = options.pathDiscoveryTarget?.baseUrl ? new URL(options.pathDiscoveryTarget.baseUrl).origin : prodServer ? `http://127.0.0.1:${prodServer.port}` : null;
|
|
260
835
|
const prerenderSecret = readPrerenderSecret(bundleServerDir) ?? readPrerenderSecret(manifestDir);
|
|
261
|
-
|
|
836
|
+
if (needsServer && options.pathDiscoveryTarget && !prerenderSecret) throw new Error("Cannot discover warmup paths from the staged Worker because dist/server/vinext-server.json does not contain a prerender secret. Rebuild the app before deploying.");
|
|
837
|
+
const secretHeaders = Object.fromEntries(new Headers(options.pathDiscoveryTarget?.headers));
|
|
838
|
+
if (prerenderSecret) secretHeaders[VINEXT_PRERENDER_SECRET_HEADER] = prerenderSecret;
|
|
839
|
+
const pathDiscoveryRetryOptions = options.pathDiscoveryTarget ? {
|
|
840
|
+
deadlineAt: Date.now() + Math.max(1, options.pathDiscoveryTarget.phaseTimeoutMs ?? 12e4),
|
|
841
|
+
phaseTimeoutMs: options.pathDiscoveryTarget.phaseTimeoutMs,
|
|
842
|
+
retries: options.pathDiscoveryTarget.retries,
|
|
843
|
+
retryDelayMs: options.pathDiscoveryTarget.retryDelayMs
|
|
844
|
+
} : void 0;
|
|
262
845
|
try {
|
|
263
|
-
if (appDir)
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
846
|
+
if (appDir) {
|
|
847
|
+
const appPathResult = await collectAppPaths({
|
|
848
|
+
appDir,
|
|
849
|
+
baseUrl,
|
|
850
|
+
cacheComponents: config.cacheComponents,
|
|
851
|
+
enumerateDynamicPaths: options.candidatePathsOnly !== true,
|
|
852
|
+
pageExtensions: config.pageExtensions,
|
|
853
|
+
retryOptions: pathDiscoveryRetryOptions,
|
|
854
|
+
root,
|
|
855
|
+
secretHeaders
|
|
856
|
+
});
|
|
857
|
+
for (const pathname of appPathResult.paths) addPath(paths, seen, pathname);
|
|
858
|
+
for (const pathname of appPathResult.routeHandlerPaths) addPath(discoveredRouteHandlerPaths, seenRouteHandlerPaths, pathname);
|
|
859
|
+
for (const pathname of appPathResult.nonDynamicPaths) discoveredNonDynamicPathSet.add(pathname);
|
|
860
|
+
fallbackRoutePatterns.push(...appPathResult.fallbackRoutePatterns);
|
|
861
|
+
for (const key of appPathResult.listedRoutePaths) appListedRoutePaths.add(key);
|
|
862
|
+
}
|
|
863
|
+
if (pagesDir) {
|
|
864
|
+
const pagesPathResult = await collectPagesPaths({
|
|
865
|
+
baseUrl,
|
|
866
|
+
enumerateDynamicPaths: options.candidatePathsOnly !== true,
|
|
867
|
+
i18n: config.i18n,
|
|
868
|
+
pagesDir,
|
|
869
|
+
pageExtensions: config.pageExtensions,
|
|
870
|
+
retryOptions: pathDiscoveryRetryOptions,
|
|
871
|
+
secretHeaders
|
|
872
|
+
});
|
|
873
|
+
for (const pathname of pagesPathResult.paths) {
|
|
874
|
+
addPath(paths, seen, pathname);
|
|
875
|
+
addPath(discoveredPagesPaths, seenPagesPaths, pathname);
|
|
876
|
+
}
|
|
877
|
+
for (const pathname of pagesPathResult.dataPaths) addPath(discoveredPagesDataPaths, seenPagesDataPaths, pathname);
|
|
878
|
+
for (const pathname of pagesPathResult.nonDynamicPaths) discoveredNonDynamicPathSet.add(pathname);
|
|
879
|
+
fallbackRoutePatterns.push(...pagesPathResult.fallbackRoutePatterns);
|
|
880
|
+
}
|
|
275
881
|
} finally {
|
|
276
882
|
if (prodServer) await new Promise((resolve) => prodServer.server.close(() => resolve()));
|
|
277
883
|
}
|
|
278
884
|
});
|
|
885
|
+
for (const publicPathname of options.candidatePaths ?? []) {
|
|
886
|
+
let pathname = normalizePathTrailingSlash(new URL(publicPathname, "http://vinext.local").pathname, false);
|
|
887
|
+
if (config.basePath) {
|
|
888
|
+
if (pathname === config.basePath) pathname = "/";
|
|
889
|
+
else if (pathname.startsWith(`${config.basePath}/`)) pathname = pathname.slice(config.basePath.length);
|
|
890
|
+
else continue;
|
|
891
|
+
}
|
|
892
|
+
if (!seen.has(pathname)) candidateOnlyPathSet.add(pathname);
|
|
893
|
+
addPath(paths, seen, pathname);
|
|
894
|
+
if (pagesDir) addPath(discoveredPagesPaths, seenPagesPaths, pathname);
|
|
895
|
+
}
|
|
896
|
+
const hasStagedRequestRouting = options.requestRouting === "uncached-stage";
|
|
897
|
+
const middlewarePath = hasStagedRequestRouting ? findMiddlewareConventionFile(root, appDir, pagesDir, config.pageExtensions) : null;
|
|
898
|
+
const configuredMatcher = middlewarePath ? extractMiddlewareMatcherConfig(middlewarePath) : void 0;
|
|
899
|
+
const middlewareMayRouteWarmPath = (pathname) => middlewarePath !== null && matchesMiddlewareWarmPath(pathname, configuredMatcher, config.i18n);
|
|
900
|
+
const routedWarmPaths = [...paths, ...discoveredRouteHandlerPaths];
|
|
901
|
+
const routeMayResolveWarmPathSet = new Set(hasStagedRequestRouting ? routedWarmPaths.filter((pathname) => middlewareMayRouteWarmPath(pathname) || configuredRewritesCanReplaceWarmPath(pathname, config.rewrites, discoveredNonDynamicPathSet.has(pathname), config, (rewrite) => !isExternalUrl(rewrite.destination))) : []);
|
|
902
|
+
const requestStageMayTerminateWarmPathSet = new Set(hasStagedRequestRouting ? routedWarmPaths.filter((pathname) => middlewareMayRouteWarmPath(pathname) || configuredRulesAffectWarmPath(pathname, config.redirects, config) || configuredRewritesCanReplaceWarmPath(pathname, config.rewrites, discoveredNonDynamicPathSet.has(pathname), config, (rewrite) => isExternalUrl(rewrite.destination))) : []);
|
|
903
|
+
const excludedWarmPathSet = new Set(options.responseVary && !hasStagedRequestRouting ? routedWarmPaths.filter((pathname) => configuredRulesAffectWarmPath(pathname, config.redirects, config) || configuredRewritesCanReplaceWarmPath(pathname, config.rewrites, discoveredNonDynamicPathSet.has(pathname), config, () => true)) : []);
|
|
904
|
+
const configuredPagesWarmPaths = discoveredPagesPaths.filter((pathname) => !excludedWarmPathSet.has(pathname));
|
|
905
|
+
const resolvedPagesWarmPaths = !appDir && pagesDir ? await excludePagesApiWarmPaths({
|
|
906
|
+
i18n: config.i18n,
|
|
907
|
+
pagesDir,
|
|
908
|
+
pageExtensions: config.pageExtensions,
|
|
909
|
+
paths: configuredPagesWarmPaths
|
|
910
|
+
}) : configuredPagesWarmPaths;
|
|
911
|
+
const configuredCandidatePaths = paths.filter((pathname) => !excludedWarmPathSet.has(pathname));
|
|
912
|
+
const configuredRouteHandlerPaths = discoveredRouteHandlerPaths.filter((pathname) => !excludedWarmPathSet.has(pathname));
|
|
913
|
+
const pagesWarmMetadata = pagesDir ? await resolvePagesWarmRouteMetadata({
|
|
914
|
+
i18n: config.i18n,
|
|
915
|
+
pagesDir,
|
|
916
|
+
pageExtensions: config.pageExtensions,
|
|
917
|
+
paths: resolvedPagesWarmPaths
|
|
918
|
+
}) : {
|
|
919
|
+
dataPaths: [],
|
|
920
|
+
routePatterns: {}
|
|
921
|
+
};
|
|
922
|
+
for (const pathname of pagesWarmMetadata.dataPaths) addPath(discoveredPagesDataPaths, seenPagesDataPaths, pathname);
|
|
923
|
+
const discoveredPagesDataPathSet = new Set(discoveredPagesDataPaths);
|
|
924
|
+
const pagesOnlyWarmPaths = resolvedPagesWarmPaths.filter((pathname) => pagesWarmMetadata.routePatterns[pathname] !== void 0);
|
|
925
|
+
const appOwnedWarmPaths = appDir ? await resolveAppWarmPaths({
|
|
926
|
+
appDir,
|
|
927
|
+
i18n: config.i18n,
|
|
928
|
+
pagesDir,
|
|
929
|
+
pageExtensions: config.pageExtensions,
|
|
930
|
+
paths: [...configuredCandidatePaths, ...configuredRouteHandlerPaths]
|
|
931
|
+
}) : {
|
|
932
|
+
appPaths: [],
|
|
933
|
+
appRoutePaths: [],
|
|
934
|
+
htmlPaths: pagesOnlyWarmPaths,
|
|
935
|
+
loadingBoundaryRoutePatterns: [],
|
|
936
|
+
loadingShellPaths: [],
|
|
937
|
+
pagesPaths: pagesOnlyWarmPaths,
|
|
938
|
+
routePatterns: pagesWarmMetadata.routePatterns,
|
|
939
|
+
rscPaths: []
|
|
940
|
+
};
|
|
941
|
+
for (const pathname of configuredCandidatePaths) {
|
|
942
|
+
if (appOwnedWarmPaths.routePatterns[pathname] || !routeMayResolveWarmPathSet.has(pathname) && !requestStageMayTerminateWarmPathSet.has(pathname)) continue;
|
|
943
|
+
appOwnedWarmPaths.htmlPaths.push(pathname);
|
|
944
|
+
(appDir ? appOwnedWarmPaths.appPaths : appOwnedWarmPaths.pagesPaths).push(pathname);
|
|
945
|
+
if (appDir && routeMayResolveWarmPathSet.has(pathname)) appOwnedWarmPaths.rscPaths.push(pathname);
|
|
946
|
+
appOwnedWarmPaths.routePatterns[pathname] = {
|
|
947
|
+
kind: appDir ? "app-page" : "pages-page",
|
|
948
|
+
pattern: pathname
|
|
949
|
+
};
|
|
950
|
+
}
|
|
951
|
+
const warmPaths = appOwnedWarmPaths.htmlPaths;
|
|
952
|
+
const pagesOwnedWarmPaths = appOwnedWarmPaths.pagesPaths;
|
|
953
|
+
const resolvedPagesDataWarmPaths = pagesOwnedWarmPaths.filter((pathname) => discoveredPagesDataPathSet.has(pathname));
|
|
954
|
+
const pagesDataPaths = resolvedPagesDataWarmPaths.map((pathname) => buildPagesDataHref(config.basePath, config.buildId, localizePagesDataPath(pathname, config.i18n), ""));
|
|
955
|
+
const unlistedPathSet = new Set(Object.entries(appOwnedWarmPaths.routePatterns).flatMap(([pathname, route]) => (route.kind === "app-page" ? !appListedRoutePaths.has(appPageListingKey(route.pattern, pathname)) : candidateOnlyPathSet.has(pathname)) ? [pathname] : []));
|
|
956
|
+
const routePatterns = annotateCacheabilityProbeSafety(appOwnedWarmPaths.routePatterns, config, routeMayResolveWarmPathSet, requestStageMayTerminateWarmPathSet, unlistedPathSet, (name) => name.trim().toLowerCase() === "cache-control" || options.isResponsePolicyHeader?.(name) === true);
|
|
957
|
+
for (let index = 0; index < resolvedPagesDataWarmPaths.length; index++) {
|
|
958
|
+
const route = routePatterns[resolvedPagesDataWarmPaths[index]];
|
|
959
|
+
if (route) {
|
|
960
|
+
const htmlPathname = resolvedPagesDataWarmPaths[index] === "/" ? config.basePath || "/" : `${config.basePath}${resolvedPagesDataWarmPaths[index]}`;
|
|
961
|
+
routePatterns[pagesDataPaths[index]] = {
|
|
962
|
+
...route,
|
|
963
|
+
cacheabilityProbe: {
|
|
964
|
+
...route.cacheabilityProbe,
|
|
965
|
+
concretePathname: htmlPathname
|
|
966
|
+
}
|
|
967
|
+
};
|
|
968
|
+
}
|
|
969
|
+
}
|
|
970
|
+
const includeCanonicalRsc = options.responseVary || options.includeCanonicalRsc;
|
|
279
971
|
const manifest = {
|
|
972
|
+
...appDir ? { appPaths: appOwnedWarmPaths.appPaths } : {},
|
|
973
|
+
...config.basePath ? { basePath: config.basePath } : {},
|
|
280
974
|
buildId: config.buildId,
|
|
975
|
+
...rscBuildId && options.buildIdentity === "response-header" ? { buildIdentity: rscBuildId } : {},
|
|
976
|
+
...config.deploymentId ? { deploymentId: config.deploymentId } : {},
|
|
977
|
+
...pagesDir ? {
|
|
978
|
+
pagesDataPaths,
|
|
979
|
+
pagesPaths: pagesOwnedWarmPaths
|
|
980
|
+
} : {},
|
|
981
|
+
...excludedWarmPathSet.size > 0 ? { excludedWarmPaths: Array.from(excludedWarmPathSet) } : {},
|
|
982
|
+
...fallbackRoutePatterns.length > 0 ? { fallbackRoutePatterns } : {},
|
|
983
|
+
...appOwnedWarmPaths.loadingBoundaryRoutePatterns.length > 0 ? { loadingBoundaryRoutePatterns: appOwnedWarmPaths.loadingBoundaryRoutePatterns } : {},
|
|
984
|
+
...rscBuildId ? { rscBuildId } : {},
|
|
985
|
+
...options.responseVary ? { responseVary: options.responseVary } : {},
|
|
986
|
+
...includeCanonicalRsc ? { rscPaths: appOwnedWarmPaths.rscPaths } : {},
|
|
987
|
+
...Object.keys(routePatterns).length > 0 ? { routePatterns } : {},
|
|
988
|
+
...appOwnedWarmPaths.appRoutePaths.length > 0 ? { routeHandlerPaths: appOwnedWarmPaths.appRoutePaths } : {},
|
|
989
|
+
...includeCanonicalRsc ? { loadingShellPaths: appOwnedWarmPaths.loadingShellPaths } : {},
|
|
281
990
|
trailingSlash: config.trailingSlash,
|
|
282
|
-
paths
|
|
991
|
+
paths: warmPaths
|
|
283
992
|
};
|
|
993
|
+
console.log(` Discovered ${warmPaths.length + appOwnedWarmPaths.appRoutePaths.length} CDN warmup path(s).`);
|
|
994
|
+
return manifest;
|
|
995
|
+
}
|
|
996
|
+
async function emitPrerenderPathManifest(options) {
|
|
997
|
+
const manifest = await discoverPrerenderPathManifest(options);
|
|
998
|
+
if (!manifest) return null;
|
|
999
|
+
const manifestDir = path.join(options.root, "dist", "server");
|
|
284
1000
|
fs.mkdirSync(manifestDir, { recursive: true });
|
|
285
1001
|
fs.writeFileSync(path.join(manifestDir, PRERENDER_PATHS_MANIFEST), JSON.stringify(manifest, null, 2) + "\n", "utf-8");
|
|
286
|
-
console.log(` Discovered ${paths.length} CDN warmup path(s).`);
|
|
287
1002
|
return manifest;
|
|
288
1003
|
}
|
|
289
1004
|
//#endregion
|
|
290
|
-
export { PRERENDER_PATHS_MANIFEST, PRERENDER_PATH_DISCOVERY_ENV, emitPrerenderPathManifest };
|
|
1005
|
+
export { DEFAULT_REMOTE_PATH_DISCOVERY_PHASE_TIMEOUT_MS, DEFAULT_REMOTE_PATH_DISCOVERY_RETRY_DELAY_MS, PRERENDER_PATHS_MANIFEST, PRERENDER_PATH_DISCOVERY_ENV, discoverPrerenderPathManifest, emitPrerenderPathManifest, matchesMiddlewareWarmPath };
|