@qzsy/vinext 0.1.7
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/LICENSE +21 -0
- package/README.md +773 -0
- package/dist/build/assets-ignore.d.ts +32 -0
- package/dist/build/assets-ignore.js +48 -0
- package/dist/build/clean-output.d.ts +13 -0
- package/dist/build/clean-output.js +34 -0
- package/dist/build/client-build-config.d.ts +171 -0
- package/dist/build/client-build-config.js +270 -0
- package/dist/build/css-url-assets.d.ts +29 -0
- package/dist/build/css-url-assets.js +213 -0
- package/dist/build/google-fonts/build-url.d.ts +9 -0
- package/dist/build/google-fonts/build-url.js +28 -0
- package/dist/build/google-fonts/fallback-metrics-data.js +14029 -0
- package/dist/build/google-fonts/fallback-metrics.d.ts +12 -0
- package/dist/build/google-fonts/fallback-metrics.js +44 -0
- package/dist/build/google-fonts/find-font-files-in-css.d.ts +16 -0
- package/dist/build/google-fonts/find-font-files-in-css.js +28 -0
- package/dist/build/google-fonts/font-data.js +24983 -0
- package/dist/build/google-fonts/font-metadata.d.ts +16 -0
- package/dist/build/google-fonts/font-metadata.js +5 -0
- package/dist/build/google-fonts/get-axes.d.ts +6 -0
- package/dist/build/google-fonts/get-axes.js +37 -0
- package/dist/build/google-fonts/sort-variants.d.ts +4 -0
- package/dist/build/google-fonts/sort-variants.js +12 -0
- package/dist/build/google-fonts/validate.d.ts +27 -0
- package/dist/build/google-fonts/validate.js +54 -0
- package/dist/build/inline-css.d.ts +6 -0
- package/dist/build/inline-css.js +48 -0
- package/dist/build/layout-classification-types.d.ts +61 -0
- package/dist/build/layout-classification-types.js +1 -0
- package/dist/build/layout-classification.d.ts +59 -0
- package/dist/build/layout-classification.js +98 -0
- package/dist/build/next-client-runtime-manifests.d.ts +14 -0
- package/dist/build/next-client-runtime-manifests.js +39 -0
- package/dist/build/nitro-route-rules.d.ts +49 -0
- package/dist/build/nitro-route-rules.js +79 -0
- package/dist/build/precompress.d.ts +27 -0
- package/dist/build/precompress.js +110 -0
- package/dist/build/prerender.d.ts +209 -0
- package/dist/build/prerender.js +932 -0
- package/dist/build/report.d.ts +132 -0
- package/dist/build/report.js +504 -0
- package/dist/build/route-classification-injector.d.ts +34 -0
- package/dist/build/route-classification-injector.js +59 -0
- package/dist/build/route-classification-manifest.d.ts +52 -0
- package/dist/build/route-classification-manifest.js +143 -0
- package/dist/build/run-prerender.d.ts +61 -0
- package/dist/build/run-prerender.js +224 -0
- package/dist/build/server-manifest.d.ts +18 -0
- package/dist/build/server-manifest.js +22 -0
- package/dist/build/ssr-manifest.d.ts +18 -0
- package/dist/build/ssr-manifest.js +69 -0
- package/dist/build/standalone.d.ts +31 -0
- package/dist/build/standalone.js +203 -0
- package/dist/build/static-export.d.ts +55 -0
- package/dist/build/static-export.js +60 -0
- package/dist/cache/cache-adapters-virtual.d.ts +50 -0
- package/dist/cache/cache-adapters-virtual.js +45 -0
- package/dist/cache.d.ts +2 -0
- package/dist/cache.js +2 -0
- package/dist/check.d.ts +87 -0
- package/dist/check.js +1037 -0
- package/dist/cli-args.d.ts +33 -0
- package/dist/cli-args.js +124 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +744 -0
- package/dist/client/app-nav-failure-handler.d.ts +8 -0
- package/dist/client/app-nav-failure-handler.js +44 -0
- package/dist/client/empty-module.d.ts +1 -0
- package/dist/client/empty-module.js +1 -0
- package/dist/client/instrumentation-client-inject.d.ts +33 -0
- package/dist/client/instrumentation-client-inject.js +55 -0
- package/dist/client/instrumentation-client-state.d.ts +9 -0
- package/dist/client/instrumentation-client-state.js +17 -0
- package/dist/client/instrumentation-client.d.ts +7 -0
- package/dist/client/instrumentation-client.js +6 -0
- package/dist/client/navigation-runtime.d.ts +70 -0
- package/dist/client/navigation-runtime.js +169 -0
- package/dist/client/pages-router-link-navigation.d.ts +61 -0
- package/dist/client/pages-router-link-navigation.js +42 -0
- package/dist/client/validate-module-path.d.ts +17 -0
- package/dist/client/validate-module-path.js +24 -0
- package/dist/client/vinext-next-data.d.ts +44 -0
- package/dist/client/vinext-next-data.js +50 -0
- package/dist/client/window-next.d.ts +168 -0
- package/dist/client/window-next.js +57 -0
- package/dist/cloudflare/index.d.ts +3 -0
- package/dist/cloudflare/index.js +3 -0
- package/dist/cloudflare/src/cache/cdn-adapter.runtime.js +102 -0
- package/dist/cloudflare/src/cache/kv-data-adapter.runtime.d.ts +126 -0
- package/dist/cloudflare/src/cache/kv-data-adapter.runtime.js +435 -0
- package/dist/cloudflare/src/utils/cache-control-metadata.js +20 -0
- package/dist/cloudflare/tpr.d.ts +82 -0
- package/dist/cloudflare/tpr.js +558 -0
- package/dist/config/config-matchers.d.ts +257 -0
- package/dist/config/config-matchers.js +1046 -0
- package/dist/config/dotenv.d.ts +56 -0
- package/dist/config/dotenv.js +88 -0
- package/dist/config/next-config.d.ts +540 -0
- package/dist/config/next-config.js +1050 -0
- package/dist/config/tsconfig-paths.d.ts +21 -0
- package/dist/config/tsconfig-paths.js +157 -0
- package/dist/deploy.d.ts +190 -0
- package/dist/deploy.js +1033 -0
- package/dist/entries/app-browser-entry.d.ts +29 -0
- package/dist/entries/app-browser-entry.js +83 -0
- package/dist/entries/app-rsc-entry.d.ts +81 -0
- package/dist/entries/app-rsc-entry.js +943 -0
- package/dist/entries/app-rsc-manifest.d.ts +53 -0
- package/dist/entries/app-rsc-manifest.js +294 -0
- package/dist/entries/app-ssr-entry.d.ts +15 -0
- package/dist/entries/app-ssr-entry.js +24 -0
- package/dist/entries/pages-client-entry.d.ts +11 -0
- package/dist/entries/pages-client-entry.js +204 -0
- package/dist/entries/pages-entry-helpers.d.ts +2 -0
- package/dist/entries/pages-entry-helpers.js +2 -0
- package/dist/entries/pages-server-entry.d.ts +11 -0
- package/dist/entries/pages-server-entry.js +398 -0
- package/dist/entries/runtime-entry-module.d.ts +25 -0
- package/dist/entries/runtime-entry-module.js +46 -0
- package/dist/index.d.ts +115 -0
- package/dist/index.js +2661 -0
- package/dist/init.d.ts +69 -0
- package/dist/init.js +253 -0
- package/dist/plugins/ast-utils.d.ts +20 -0
- package/dist/plugins/ast-utils.js +78 -0
- package/dist/plugins/async-hooks-stub.d.ts +18 -0
- package/dist/plugins/async-hooks-stub.js +40 -0
- package/dist/plugins/client-reference-dedup.d.ts +35 -0
- package/dist/plugins/client-reference-dedup.js +189 -0
- package/dist/plugins/css-data-url.d.ts +6 -0
- package/dist/plugins/css-data-url.js +83 -0
- package/dist/plugins/dynamic-preload-metadata.d.ts +13 -0
- package/dist/plugins/dynamic-preload-metadata.js +413 -0
- package/dist/plugins/extensionless-dynamic-import.d.ts +6 -0
- package/dist/plugins/extensionless-dynamic-import.js +155 -0
- package/dist/plugins/fonts.d.ts +95 -0
- package/dist/plugins/fonts.js +711 -0
- package/dist/plugins/import-meta-url.d.ts +16 -0
- package/dist/plugins/import-meta-url.js +353 -0
- package/dist/plugins/instrumentation-client.d.ts +6 -0
- package/dist/plugins/instrumentation-client.js +27 -0
- package/dist/plugins/middleware-export-validation.d.ts +5 -0
- package/dist/plugins/middleware-export-validation.js +36 -0
- package/dist/plugins/middleware-server-only.d.ts +53 -0
- package/dist/plugins/middleware-server-only.js +90 -0
- package/dist/plugins/og-asset-ownership.d.ts +27 -0
- package/dist/plugins/og-asset-ownership.js +285 -0
- package/dist/plugins/og-assets.d.ts +50 -0
- package/dist/plugins/og-assets.js +229 -0
- package/dist/plugins/optimize-imports.d.ts +42 -0
- package/dist/plugins/optimize-imports.js +587 -0
- package/dist/plugins/postcss.d.ts +26 -0
- package/dist/plugins/postcss.js +96 -0
- package/dist/plugins/remove-console.d.ts +21 -0
- package/dist/plugins/remove-console.js +177 -0
- package/dist/plugins/require-context.d.ts +6 -0
- package/dist/plugins/require-context.js +185 -0
- package/dist/plugins/rsc-client-reference-loaders.d.ts +6 -0
- package/dist/plugins/rsc-client-reference-loaders.js +46 -0
- package/dist/plugins/rsc-client-shim-excludes.d.ts +6 -0
- package/dist/plugins/rsc-client-shim-excludes.js +35 -0
- package/dist/plugins/sass.d.ts +62 -0
- package/dist/plugins/sass.js +268 -0
- package/dist/plugins/server-externals-manifest.d.ts +26 -0
- package/dist/plugins/server-externals-manifest.js +81 -0
- package/dist/plugins/strip-server-exports.d.ts +21 -0
- package/dist/plugins/strip-server-exports.js +519 -0
- package/dist/plugins/typeof-window.d.ts +14 -0
- package/dist/plugins/typeof-window.js +150 -0
- package/dist/plugins/wasm-module-import.d.ts +15 -0
- package/dist/plugins/wasm-module-import.js +50 -0
- package/dist/routing/app-route-graph.d.ts +336 -0
- package/dist/routing/app-route-graph.js +1518 -0
- package/dist/routing/app-router.d.ts +30 -0
- package/dist/routing/app-router.js +59 -0
- package/dist/routing/file-matcher.d.ts +60 -0
- package/dist/routing/file-matcher.js +147 -0
- package/dist/routing/pages-router.d.ts +48 -0
- package/dist/routing/pages-router.js +163 -0
- package/dist/routing/route-matching.d.ts +27 -0
- package/dist/routing/route-matching.js +42 -0
- package/dist/routing/route-pattern.d.ts +64 -0
- package/dist/routing/route-pattern.js +165 -0
- package/dist/routing/route-trie.d.ts +67 -0
- package/dist/routing/route-trie.js +143 -0
- package/dist/routing/route-validation.d.ts +10 -0
- package/dist/routing/route-validation.js +101 -0
- package/dist/routing/utils.d.ts +117 -0
- package/dist/routing/utils.js +242 -0
- package/dist/server/accept-encoding.d.ts +29 -0
- package/dist/server/accept-encoding.js +95 -0
- package/dist/server/api-handler.d.ts +17 -0
- package/dist/server/api-handler.js +276 -0
- package/dist/server/app-action-request.d.ts +4 -0
- package/dist/server/app-action-request.js +9 -0
- package/dist/server/app-bfcache-id.d.ts +5 -0
- package/dist/server/app-bfcache-id.js +5 -0
- package/dist/server/app-bfcache-identity.d.ts +36 -0
- package/dist/server/app-bfcache-identity.js +156 -0
- package/dist/server/app-browser-action-result.d.ts +64 -0
- package/dist/server/app-browser-action-result.js +111 -0
- package/dist/server/app-browser-client-reuse-manifest.d.ts +12 -0
- package/dist/server/app-browser-client-reuse-manifest.js +101 -0
- package/dist/server/app-browser-entry.d.ts +1 -0
- package/dist/server/app-browser-entry.js +1087 -0
- package/dist/server/app-browser-error.d.ts +13 -0
- package/dist/server/app-browser-error.js +52 -0
- package/dist/server/app-browser-history-controller.d.ts +104 -0
- package/dist/server/app-browser-history-controller.js +210 -0
- package/dist/server/app-browser-hydration.d.ts +32 -0
- package/dist/server/app-browser-hydration.js +29 -0
- package/dist/server/app-browser-interception-context.d.ts +24 -0
- package/dist/server/app-browser-interception-context.js +43 -0
- package/dist/server/app-browser-mpa-navigation.d.ts +16 -0
- package/dist/server/app-browser-mpa-navigation.js +42 -0
- package/dist/server/app-browser-navigation-controller.d.ts +109 -0
- package/dist/server/app-browser-navigation-controller.js +465 -0
- package/dist/server/app-browser-popstate.d.ts +26 -0
- package/dist/server/app-browser-popstate.js +44 -0
- package/dist/server/app-browser-rsc-redirect.d.ts +38 -0
- package/dist/server/app-browser-rsc-redirect.js +64 -0
- package/dist/server/app-browser-server-action-client.d.ts +32 -0
- package/dist/server/app-browser-server-action-client.js +128 -0
- package/dist/server/app-browser-server-action-navigation.d.ts +6 -0
- package/dist/server/app-browser-server-action-navigation.js +9 -0
- package/dist/server/app-browser-state.d.ts +140 -0
- package/dist/server/app-browser-state.js +315 -0
- package/dist/server/app-browser-stream.d.ts +28 -0
- package/dist/server/app-browser-stream.js +122 -0
- package/dist/server/app-browser-visible-commit.d.ts +78 -0
- package/dist/server/app-browser-visible-commit.js +241 -0
- package/dist/server/app-client-reference-preloader.d.ts +14 -0
- package/dist/server/app-client-reference-preloader.js +44 -0
- package/dist/server/app-elements-wire.d.ts +192 -0
- package/dist/server/app-elements-wire.js +443 -0
- package/dist/server/app-elements.d.ts +9 -0
- package/dist/server/app-elements.js +18 -0
- package/dist/server/app-fallback-renderer.d.ts +89 -0
- package/dist/server/app-fallback-renderer.js +136 -0
- package/dist/server/app-history-state.d.ts +85 -0
- package/dist/server/app-history-state.js +223 -0
- package/dist/server/app-hook-warning-suppression.d.ts +6 -0
- package/dist/server/app-hook-warning-suppression.js +10 -0
- package/dist/server/app-inline-css-client.d.ts +6 -0
- package/dist/server/app-inline-css-client.js +35 -0
- package/dist/server/app-interception-context-header.d.ts +32 -0
- package/dist/server/app-interception-context-header.js +42 -0
- package/dist/server/app-layout-param-observation.d.ts +43 -0
- package/dist/server/app-layout-param-observation.js +168 -0
- package/dist/server/app-middleware.d.ts +46 -0
- package/dist/server/app-middleware.js +168 -0
- package/dist/server/app-mounted-slots-header.d.ts +35 -0
- package/dist/server/app-mounted-slots-header.js +58 -0
- package/dist/server/app-optimistic-routing.d.ts +53 -0
- package/dist/server/app-optimistic-routing.js +227 -0
- package/dist/server/app-page-boundary-render.d.ts +85 -0
- package/dist/server/app-page-boundary-render.js +305 -0
- package/dist/server/app-page-boundary.d.ts +102 -0
- package/dist/server/app-page-boundary.js +120 -0
- package/dist/server/app-page-cache-finalizer.d.ts +62 -0
- package/dist/server/app-page-cache-finalizer.js +122 -0
- package/dist/server/app-page-cache-render.d.ts +53 -0
- package/dist/server/app-page-cache-render.js +91 -0
- package/dist/server/app-page-cache.d.ts +83 -0
- package/dist/server/app-page-cache.js +272 -0
- package/dist/server/app-page-dispatch.d.ts +223 -0
- package/dist/server/app-page-dispatch.js +610 -0
- package/dist/server/app-page-element-builder.d.ts +96 -0
- package/dist/server/app-page-element-builder.js +205 -0
- package/dist/server/app-page-execution.d.ts +138 -0
- package/dist/server/app-page-execution.js +328 -0
- package/dist/server/app-page-head.d.ts +65 -0
- package/dist/server/app-page-head.js +228 -0
- package/dist/server/app-page-method.d.ts +15 -0
- package/dist/server/app-page-method.js +25 -0
- package/dist/server/app-page-params.d.ts +8 -0
- package/dist/server/app-page-params.js +39 -0
- package/dist/server/app-page-ppr-runtime.d.ts +7 -0
- package/dist/server/app-page-ppr-runtime.js +70 -0
- package/dist/server/app-page-probe.d.ts +134 -0
- package/dist/server/app-page-probe.js +276 -0
- package/dist/server/app-page-render-identity.d.ts +21 -0
- package/dist/server/app-page-render-identity.js +40 -0
- package/dist/server/app-page-render-observation.d.ts +36 -0
- package/dist/server/app-page-render-observation.js +82 -0
- package/dist/server/app-page-render.d.ts +111 -0
- package/dist/server/app-page-render.js +602 -0
- package/dist/server/app-page-request.d.ts +137 -0
- package/dist/server/app-page-request.js +216 -0
- package/dist/server/app-page-response.d.ts +68 -0
- package/dist/server/app-page-response.js +120 -0
- package/dist/server/app-page-route-wiring.d.ts +151 -0
- package/dist/server/app-page-route-wiring.js +452 -0
- package/dist/server/app-page-search-params-observation.d.ts +10 -0
- package/dist/server/app-page-search-params-observation.js +20 -0
- package/dist/server/app-page-segment-state.d.ts +9 -0
- package/dist/server/app-page-segment-state.js +80 -0
- package/dist/server/app-page-stream.d.ts +151 -0
- package/dist/server/app-page-stream.js +143 -0
- package/dist/server/app-pages-bridge.d.ts +63 -0
- package/dist/server/app-pages-bridge.js +63 -0
- package/dist/server/app-post-middleware-context.d.ts +15 -0
- package/dist/server/app-post-middleware-context.js +26 -0
- package/dist/server/app-ppr-fallback-shell-render.d.ts +18 -0
- package/dist/server/app-ppr-fallback-shell-render.js +26 -0
- package/dist/server/app-ppr-fallback-shell.d.ts +33 -0
- package/dist/server/app-ppr-fallback-shell.js +89 -0
- package/dist/server/app-prerender-endpoints.d.ts +18 -0
- package/dist/server/app-prerender-endpoints.js +94 -0
- package/dist/server/app-prerender-static-params.d.ts +30 -0
- package/dist/server/app-prerender-static-params.js +81 -0
- package/dist/server/app-render-dependency.d.ts +14 -0
- package/dist/server/app-render-dependency.js +41 -0
- package/dist/server/app-request-context.d.ts +20 -0
- package/dist/server/app-request-context.js +29 -0
- package/dist/server/app-route-handler-cache.d.ts +46 -0
- package/dist/server/app-route-handler-cache.js +78 -0
- package/dist/server/app-route-handler-dispatch.d.ts +49 -0
- package/dist/server/app-route-handler-dispatch.js +163 -0
- package/dist/server/app-route-handler-execution.d.ts +86 -0
- package/dist/server/app-route-handler-execution.js +128 -0
- package/dist/server/app-route-handler-policy.d.ts +55 -0
- package/dist/server/app-route-handler-policy.js +58 -0
- package/dist/server/app-route-handler-response.d.ts +28 -0
- package/dist/server/app-route-handler-response.js +145 -0
- package/dist/server/app-route-handler-runtime.d.ts +39 -0
- package/dist/server/app-route-handler-runtime.js +250 -0
- package/dist/server/app-route-module-loader.d.ts +91 -0
- package/dist/server/app-route-module-loader.js +83 -0
- package/dist/server/app-router-entry.d.ts +13 -0
- package/dist/server/app-router-entry.js +49 -0
- package/dist/server/app-rsc-cache-busting.d.ts +64 -0
- package/dist/server/app-rsc-cache-busting.js +206 -0
- package/dist/server/app-rsc-embedded-chunks.d.ts +8 -0
- package/dist/server/app-rsc-embedded-chunks.js +32 -0
- package/dist/server/app-rsc-error-handler.d.ts +20 -0
- package/dist/server/app-rsc-error-handler.js +28 -0
- package/dist/server/app-rsc-errors.d.ts +40 -0
- package/dist/server/app-rsc-errors.js +60 -0
- package/dist/server/app-rsc-handler.d.ts +201 -0
- package/dist/server/app-rsc-handler.js +538 -0
- package/dist/server/app-rsc-render-mode.d.ts +11 -0
- package/dist/server/app-rsc-render-mode.js +25 -0
- package/dist/server/app-rsc-request-normalization.d.ts +48 -0
- package/dist/server/app-rsc-request-normalization.js +75 -0
- package/dist/server/app-rsc-response-finalizer.d.ts +37 -0
- package/dist/server/app-rsc-response-finalizer.js +54 -0
- package/dist/server/app-rsc-route-matching.d.ts +93 -0
- package/dist/server/app-rsc-route-matching.js +134 -0
- package/dist/server/app-segment-config.d.ts +46 -0
- package/dist/server/app-segment-config.js +113 -0
- package/dist/server/app-server-action-execution.d.ts +219 -0
- package/dist/server/app-server-action-execution.js +767 -0
- package/dist/server/app-ssr-entry.d.ts +52 -0
- package/dist/server/app-ssr-entry.js +295 -0
- package/dist/server/app-ssr-error-meta.d.ts +13 -0
- package/dist/server/app-ssr-error-meta.js +48 -0
- package/dist/server/app-ssr-router-instance.d.ts +6 -0
- package/dist/server/app-ssr-router-instance.js +24 -0
- package/dist/server/app-ssr-stream.d.ts +60 -0
- package/dist/server/app-ssr-stream.js +408 -0
- package/dist/server/app-static-generation.d.ts +15 -0
- package/dist/server/app-static-generation.js +19 -0
- package/dist/server/app-visited-response-cache.d.ts +23 -0
- package/dist/server/app-visited-response-cache.js +19 -0
- package/dist/server/artifact-compatibility.d.ts +54 -0
- package/dist/server/artifact-compatibility.js +91 -0
- package/dist/server/before-interactive-head.d.ts +17 -0
- package/dist/server/before-interactive-head.js +35 -0
- package/dist/server/cache-control.d.ts +37 -0
- package/dist/server/cache-control.js +56 -0
- package/dist/server/cache-headers.d.ts +6 -0
- package/dist/server/cache-headers.js +17 -0
- package/dist/server/cache-proof.d.ts +364 -0
- package/dist/server/cache-proof.js +794 -0
- package/dist/server/client-reuse-manifest.d.ts +104 -0
- package/dist/server/client-reuse-manifest.js +209 -0
- package/dist/server/client-trace-metadata.d.ts +30 -0
- package/dist/server/client-trace-metadata.js +81 -0
- package/dist/server/cookie-utils.d.ts +12 -0
- package/dist/server/cookie-utils.js +18 -0
- package/dist/server/csp.d.ts +10 -0
- package/dist/server/csp.js +41 -0
- package/dist/server/default-global-error-module.d.ts +19 -0
- package/dist/server/default-global-error-module.js +18 -0
- package/dist/server/default-not-found-module.d.ts +19 -0
- package/dist/server/default-not-found-module.js +18 -0
- package/dist/server/defer-until-stream-consumed.d.ts +7 -0
- package/dist/server/defer-until-stream-consumed.js +34 -0
- package/dist/server/dev-error-overlay-store.d.ts +39 -0
- package/dist/server/dev-error-overlay-store.js +86 -0
- package/dist/server/dev-error-overlay.d.ts +51 -0
- package/dist/server/dev-error-overlay.js +1341 -0
- package/dist/server/dev-initial-server-error.d.ts +9 -0
- package/dist/server/dev-initial-server-error.js +26 -0
- package/dist/server/dev-lockfile.d.ts +109 -0
- package/dist/server/dev-lockfile.js +179 -0
- package/dist/server/dev-module-runner.d.ts +30 -0
- package/dist/server/dev-module-runner.js +91 -0
- package/dist/server/dev-origin-check.d.ts +62 -0
- package/dist/server/dev-origin-check.js +156 -0
- package/dist/server/dev-route-files.d.ts +6 -0
- package/dist/server/dev-route-files.js +71 -0
- package/dist/server/dev-server.d.ts +58 -0
- package/dist/server/dev-server.js +1114 -0
- package/dist/server/dev-stack-sourcemap-endpoint.d.ts +4 -0
- package/dist/server/dev-stack-sourcemap-endpoint.js +4 -0
- package/dist/server/dev-stack-sourcemap.d.ts +43 -0
- package/dist/server/dev-stack-sourcemap.js +443 -0
- package/dist/server/document-initial-head.d.ts +6 -0
- package/dist/server/document-initial-head.js +33 -0
- package/dist/server/edge-api-runtime.d.ts +4 -0
- package/dist/server/edge-api-runtime.js +6 -0
- package/dist/server/file-based-metadata.d.ts +29 -0
- package/dist/server/file-based-metadata.js +401 -0
- package/dist/server/headers.d.ts +114 -0
- package/dist/server/headers.js +136 -0
- package/dist/server/html.d.ts +28 -0
- package/dist/server/html.js +41 -0
- package/dist/server/http-error-responses.d.ts +91 -0
- package/dist/server/http-error-responses.js +105 -0
- package/dist/server/hybrid-route-priority.d.ts +22 -0
- package/dist/server/hybrid-route-priority.js +33 -0
- package/dist/server/image-optimization.d.ts +130 -0
- package/dist/server/image-optimization.js +247 -0
- package/dist/server/implicit-tags.d.ts +6 -0
- package/dist/server/implicit-tags.js +44 -0
- package/dist/server/instrumentation-runtime.d.ts +49 -0
- package/dist/server/instrumentation-runtime.js +35 -0
- package/dist/server/instrumentation.d.ts +85 -0
- package/dist/server/instrumentation.js +130 -0
- package/dist/server/isr-cache.d.ts +127 -0
- package/dist/server/isr-cache.js +282 -0
- package/dist/server/isr-decision.d.ts +79 -0
- package/dist/server/isr-decision.js +70 -0
- package/dist/server/metadata-route-build-data.d.ts +24 -0
- package/dist/server/metadata-route-build-data.js +148 -0
- package/dist/server/metadata-route-response.d.ts +16 -0
- package/dist/server/metadata-route-response.js +205 -0
- package/dist/server/metadata-routes.d.ts +139 -0
- package/dist/server/metadata-routes.js +433 -0
- package/dist/server/middleware-matcher.d.ts +14 -0
- package/dist/server/middleware-matcher.js +111 -0
- package/dist/server/middleware-request-headers.d.ts +11 -0
- package/dist/server/middleware-request-headers.js +65 -0
- package/dist/server/middleware-response-headers.d.ts +12 -0
- package/dist/server/middleware-response-headers.js +42 -0
- package/dist/server/middleware-runtime.d.ts +67 -0
- package/dist/server/middleware-runtime.js +240 -0
- package/dist/server/middleware.d.ts +62 -0
- package/dist/server/middleware.js +114 -0
- package/dist/server/navigation-planner.d.ts +308 -0
- package/dist/server/navigation-planner.js +831 -0
- package/dist/server/navigation-trace.d.ts +68 -0
- package/dist/server/navigation-trace.js +71 -0
- package/dist/server/next-error-digest.d.ts +44 -0
- package/dist/server/next-error-digest.js +40 -0
- package/dist/server/normalize-path.d.ts +38 -0
- package/dist/server/normalize-path.js +70 -0
- package/dist/server/open-redirect.d.ts +12 -0
- package/dist/server/open-redirect.js +21 -0
- package/dist/server/operation-token.d.ts +40 -0
- package/dist/server/operation-token.js +85 -0
- package/dist/server/otel-tracer-extension.d.ts +45 -0
- package/dist/server/otel-tracer-extension.js +89 -0
- package/dist/server/pages-api-route.d.ts +83 -0
- package/dist/server/pages-api-route.js +75 -0
- package/dist/server/pages-asset-tags.d.ts +78 -0
- package/dist/server/pages-asset-tags.js +126 -0
- package/dist/server/pages-body-parser-config.d.ts +59 -0
- package/dist/server/pages-body-parser-config.js +77 -0
- package/dist/server/pages-data-route.d.ts +121 -0
- package/dist/server/pages-data-route.js +157 -0
- package/dist/server/pages-default-404.d.ts +30 -0
- package/dist/server/pages-default-404.js +38 -0
- package/dist/server/pages-dev-module-url.d.ts +4 -0
- package/dist/server/pages-dev-module-url.js +15 -0
- package/dist/server/pages-document-initial-props.d.ts +77 -0
- package/dist/server/pages-document-initial-props.js +109 -0
- package/dist/server/pages-get-initial-props.d.ts +67 -0
- package/dist/server/pages-get-initial-props.js +92 -0
- package/dist/server/pages-i18n.d.ts +106 -0
- package/dist/server/pages-i18n.js +183 -0
- package/dist/server/pages-media-type.d.ts +15 -0
- package/dist/server/pages-media-type.js +24 -0
- package/dist/server/pages-node-compat.d.ts +55 -0
- package/dist/server/pages-node-compat.js +235 -0
- package/dist/server/pages-page-data.d.ts +223 -0
- package/dist/server/pages-page-data.js +484 -0
- package/dist/server/pages-page-handler.d.ts +100 -0
- package/dist/server/pages-page-handler.js +403 -0
- package/dist/server/pages-page-method.d.ts +47 -0
- package/dist/server/pages-page-method.js +17 -0
- package/dist/server/pages-page-response.d.ts +138 -0
- package/dist/server/pages-page-response.js +285 -0
- package/dist/server/pages-readiness.d.ts +36 -0
- package/dist/server/pages-readiness.js +21 -0
- package/dist/server/pages-request-pipeline.d.ts +116 -0
- package/dist/server/pages-request-pipeline.js +311 -0
- package/dist/server/pages-revalidate.d.ts +15 -0
- package/dist/server/pages-revalidate.js +19 -0
- package/dist/server/pages-serializable-props.d.ts +24 -0
- package/dist/server/pages-serializable-props.js +67 -0
- package/dist/server/pregenerated-concrete-paths.d.ts +16 -0
- package/dist/server/pregenerated-concrete-paths.js +61 -0
- package/dist/server/prerender-manifest.d.ts +33 -0
- package/dist/server/prerender-manifest.js +54 -0
- package/dist/server/prerender-route-params.d.ts +23 -0
- package/dist/server/prerender-route-params.js +113 -0
- package/dist/server/prerender-work-unit-setup.d.ts +6 -0
- package/dist/server/prerender-work-unit-setup.js +28 -0
- package/dist/server/prod-server.d.ts +148 -0
- package/dist/server/prod-server.js +1136 -0
- package/dist/server/proxy-trust.d.ts +40 -0
- package/dist/server/proxy-trust.js +68 -0
- package/dist/server/request-log.d.ts +39 -0
- package/dist/server/request-log.js +56 -0
- package/dist/server/request-pipeline.d.ts +187 -0
- package/dist/server/request-pipeline.js +447 -0
- package/dist/server/rsc-stream-hints.d.ts +10 -0
- package/dist/server/rsc-stream-hints.js +41 -0
- package/dist/server/seed-cache.d.ts +29 -0
- package/dist/server/seed-cache.js +125 -0
- package/dist/server/server-action-not-found.d.ts +21 -0
- package/dist/server/server-action-not-found.js +62 -0
- package/dist/server/server-globals.d.ts +4 -0
- package/dist/server/server-globals.js +35 -0
- package/dist/server/skip-cache-proof.d.ts +61 -0
- package/dist/server/skip-cache-proof.js +168 -0
- package/dist/server/socket-error-backstop.d.ts +34 -0
- package/dist/server/socket-error-backstop.js +200 -0
- package/dist/server/static-file-cache.d.ts +56 -0
- package/dist/server/static-file-cache.js +231 -0
- package/dist/server/static-layout-client-reuse-proof.d.ts +15 -0
- package/dist/server/static-layout-client-reuse-proof.js +33 -0
- package/dist/server/streaming-metadata.d.ts +4 -0
- package/dist/server/streaming-metadata.js +8 -0
- package/dist/server/worker-utils.d.ts +7 -0
- package/dist/server/worker-utils.js +99 -0
- package/dist/shims/amp.d.ts +19 -0
- package/dist/shims/amp.js +23 -0
- package/dist/shims/app-router-scroll-state.d.ts +15 -0
- package/dist/shims/app-router-scroll-state.js +61 -0
- package/dist/shims/app-router-scroll.d.ts +29 -0
- package/dist/shims/app-router-scroll.js +141 -0
- package/dist/shims/app.d.ts +42 -0
- package/dist/shims/app.js +48 -0
- package/dist/shims/before-interactive-context.d.ts +40 -0
- package/dist/shims/before-interactive-context.js +8 -0
- package/dist/shims/cache-for-request.d.ts +57 -0
- package/dist/shims/cache-for-request.js +72 -0
- package/dist/shims/cache-handler.d.ts +106 -0
- package/dist/shims/cache-handler.js +176 -0
- package/dist/shims/cache-request-state.d.ts +47 -0
- package/dist/shims/cache-request-state.js +126 -0
- package/dist/shims/cache-runtime.d.ts +83 -0
- package/dist/shims/cache-runtime.js +452 -0
- package/dist/shims/cache.d.ts +145 -0
- package/dist/shims/cache.js +401 -0
- package/dist/shims/cdn-cache.d.ts +125 -0
- package/dist/shims/cdn-cache.js +100 -0
- package/dist/shims/client-hook-error.d.ts +13 -0
- package/dist/shims/client-hook-error.js +17 -0
- package/dist/shims/client-locale.d.ts +14 -0
- package/dist/shims/client-locale.js +11 -0
- package/dist/shims/client-only.d.ts +1 -0
- package/dist/shims/client-only.js +1 -0
- package/dist/shims/compat-router.d.ts +16 -0
- package/dist/shims/compat-router.js +25 -0
- package/dist/shims/config.d.ts +28 -0
- package/dist/shims/config.js +21 -0
- package/dist/shims/constants.d.ts +130 -0
- package/dist/shims/constants.js +167 -0
- package/dist/shims/default-global-error.d.ts +31 -0
- package/dist/shims/default-global-error.js +179 -0
- package/dist/shims/default-not-found.d.ts +11 -0
- package/dist/shims/default-not-found.js +59 -0
- package/dist/shims/document.d.ts +92 -0
- package/dist/shims/document.js +76 -0
- package/dist/shims/dynamic-preload-chunks.d.ts +8 -0
- package/dist/shims/dynamic-preload-chunks.js +79 -0
- package/dist/shims/dynamic.d.ts +35 -0
- package/dist/shims/dynamic.js +204 -0
- package/dist/shims/error-boundary-navigation.d.ts +7 -0
- package/dist/shims/error-boundary-navigation.js +44 -0
- package/dist/shims/error-boundary.d.ts +155 -0
- package/dist/shims/error-boundary.js +342 -0
- package/dist/shims/error.d.ts +31 -0
- package/dist/shims/error.js +123 -0
- package/dist/shims/error.react-server.d.ts +9 -0
- package/dist/shims/error.react-server.js +6 -0
- package/dist/shims/fetch-cache.d.ts +136 -0
- package/dist/shims/fetch-cache.js +766 -0
- package/dist/shims/font-google-base.d.ts +83 -0
- package/dist/shims/font-google-base.js +290 -0
- package/dist/shims/font-google.d.ts +2 -0
- package/dist/shims/font-google.js +2 -0
- package/dist/shims/font-local.d.ts +50 -0
- package/dist/shims/font-local.js +195 -0
- package/dist/shims/font-utils.d.ts +56 -0
- package/dist/shims/font-utils.js +107 -0
- package/dist/shims/form.d.ts +19 -0
- package/dist/shims/form.js +236 -0
- package/dist/shims/hash-scroll.d.ts +10 -0
- package/dist/shims/hash-scroll.js +47 -0
- package/dist/shims/head-state.d.ts +16 -0
- package/dist/shims/head-state.js +43 -0
- package/dist/shims/head.d.ts +73 -0
- package/dist/shims/head.js +340 -0
- package/dist/shims/headers.d.ts +253 -0
- package/dist/shims/headers.js +754 -0
- package/dist/shims/i18n-context.d.ts +22 -0
- package/dist/shims/i18n-context.js +42 -0
- package/dist/shims/i18n-state.d.ts +14 -0
- package/dist/shims/i18n-state.js +38 -0
- package/dist/shims/image-config.d.ts +45 -0
- package/dist/shims/image-config.js +85 -0
- package/dist/shims/image.d.ts +55 -0
- package/dist/shims/image.js +582 -0
- package/dist/shims/internal/als-registry.d.ts +14 -0
- package/dist/shims/internal/als-registry.js +80 -0
- package/dist/shims/internal/api-utils.d.ts +14 -0
- package/dist/shims/internal/api-utils.js +1 -0
- package/dist/shims/internal/app-page-props-cache-key.d.ts +5 -0
- package/dist/shims/internal/app-page-props-cache-key.js +16 -0
- package/dist/shims/internal/app-route-detection.d.ts +39 -0
- package/dist/shims/internal/app-route-detection.js +62 -0
- package/dist/shims/internal/app-router-context.d.ts +31 -0
- package/dist/shims/internal/app-router-context.js +28 -0
- package/dist/shims/internal/cookie-serialize.d.ts +45 -0
- package/dist/shims/internal/cookie-serialize.js +49 -0
- package/dist/shims/internal/cookies.d.ts +2 -0
- package/dist/shims/internal/cookies.js +2 -0
- package/dist/shims/internal/hybrid-client-route-owner.d.ts +31 -0
- package/dist/shims/internal/hybrid-client-route-owner.js +143 -0
- package/dist/shims/internal/interpolate-as.d.ts +25 -0
- package/dist/shims/internal/interpolate-as.js +196 -0
- package/dist/shims/internal/link-status-registry.d.ts +43 -0
- package/dist/shims/internal/link-status-registry.js +42 -0
- package/dist/shims/internal/make-hanging-promise.d.ts +15 -0
- package/dist/shims/internal/make-hanging-promise.js +44 -0
- package/dist/shims/internal/navigation-untracked.d.ts +35 -0
- package/dist/shims/internal/navigation-untracked.js +56 -0
- package/dist/shims/internal/pages-data-fetch-dedup.d.ts +54 -0
- package/dist/shims/internal/pages-data-fetch-dedup.js +121 -0
- package/dist/shims/internal/pages-data-target.d.ts +62 -0
- package/dist/shims/internal/pages-data-target.js +98 -0
- package/dist/shims/internal/pages-data-url.d.ts +41 -0
- package/dist/shims/internal/pages-data-url.js +71 -0
- package/dist/shims/internal/pages-router-accessor.d.ts +19 -0
- package/dist/shims/internal/pages-router-accessor.js +13 -0
- package/dist/shims/internal/route-pattern-for-warning.d.ts +27 -0
- package/dist/shims/internal/route-pattern-for-warning.js +40 -0
- package/dist/shims/internal/router-context.d.ts +7 -0
- package/dist/shims/internal/router-context.js +13 -0
- package/dist/shims/internal/utils.d.ts +52 -0
- package/dist/shims/internal/utils.js +27 -0
- package/dist/shims/internal/work-unit-async-storage.d.ts +30 -0
- package/dist/shims/internal/work-unit-async-storage.js +17 -0
- package/dist/shims/layout-segment-context.d.ts +24 -0
- package/dist/shims/layout-segment-context.js +39 -0
- package/dist/shims/legacy-image.d.ts +41 -0
- package/dist/shims/legacy-image.js +49 -0
- package/dist/shims/link-prefetch.d.ts +41 -0
- package/dist/shims/link-prefetch.js +43 -0
- package/dist/shims/link.d.ts +102 -0
- package/dist/shims/link.js +687 -0
- package/dist/shims/metadata.d.ts +285 -0
- package/dist/shims/metadata.js +820 -0
- package/dist/shims/navigation-context-state.d.ts +40 -0
- package/dist/shims/navigation-context-state.js +116 -0
- package/dist/shims/navigation-errors.d.ts +55 -0
- package/dist/shims/navigation-errors.js +110 -0
- package/dist/shims/navigation-server.d.ts +3 -0
- package/dist/shims/navigation-server.js +3 -0
- package/dist/shims/navigation-state.d.ts +25 -0
- package/dist/shims/navigation-state.js +66 -0
- package/dist/shims/navigation.d.ts +286 -0
- package/dist/shims/navigation.js +1206 -0
- package/dist/shims/navigation.react-server.d.ts +14 -0
- package/dist/shims/navigation.react-server.js +32 -0
- package/dist/shims/offline.d.ts +4 -0
- package/dist/shims/offline.js +15 -0
- package/dist/shims/og.d.ts +17 -0
- package/dist/shims/og.js +48 -0
- package/dist/shims/pages-router-runtime.d.ts +12 -0
- package/dist/shims/pages-router-runtime.js +24 -0
- package/dist/shims/ppr-fallback-shell.d.ts +33 -0
- package/dist/shims/ppr-fallback-shell.js +170 -0
- package/dist/shims/readonly-url-search-params.d.ts +13 -0
- package/dist/shims/readonly-url-search-params.js +26 -0
- package/dist/shims/request-context.d.ts +58 -0
- package/dist/shims/request-context.js +45 -0
- package/dist/shims/request-state-types.d.ts +12 -0
- package/dist/shims/request-state-types.js +1 -0
- package/dist/shims/root-params.d.ts +12 -0
- package/dist/shims/root-params.js +30 -0
- package/dist/shims/router-state.d.ts +32 -0
- package/dist/shims/router-state.js +39 -0
- package/dist/shims/router.d.ts +192 -0
- package/dist/shims/router.js +1786 -0
- package/dist/shims/script-nonce-context.d.ts +11 -0
- package/dist/shims/script-nonce-context.js +23 -0
- package/dist/shims/script.d.ts +43 -0
- package/dist/shims/script.js +370 -0
- package/dist/shims/server-only.d.ts +1 -0
- package/dist/shims/server-only.js +1 -0
- package/dist/shims/server.d.ts +323 -0
- package/dist/shims/server.js +729 -0
- package/dist/shims/slot.d.ts +45 -0
- package/dist/shims/slot.js +230 -0
- package/dist/shims/thenable-params.d.ts +11 -0
- package/dist/shims/thenable-params.js +176 -0
- package/dist/shims/unified-request-context.d.ts +68 -0
- package/dist/shims/unified-request-context.js +86 -0
- package/dist/shims/unrecognized-action-error.d.ts +34 -0
- package/dist/shims/unrecognized-action-error.js +39 -0
- package/dist/shims/url-safety.d.ts +34 -0
- package/dist/shims/url-safety.js +70 -0
- package/dist/shims/url-utils.d.ts +51 -0
- package/dist/shims/url-utils.js +156 -0
- package/dist/shims/use-merged-ref.d.ts +6 -0
- package/dist/shims/use-merged-ref.js +38 -0
- package/dist/shims/web-vitals.d.ts +8 -0
- package/dist/shims/web-vitals.js +22 -0
- package/dist/typegen.d.ts +9 -0
- package/dist/typegen.js +228 -0
- package/dist/utils/asset-prefix.d.ts +96 -0
- package/dist/utils/asset-prefix.js +122 -0
- package/dist/utils/base-path.d.ts +31 -0
- package/dist/utils/base-path.js +45 -0
- package/dist/utils/built-asset-url.d.ts +4 -0
- package/dist/utils/built-asset-url.js +11 -0
- package/dist/utils/cache-control-metadata.d.ts +4 -0
- package/dist/utils/cache-control-metadata.js +12 -0
- package/dist/utils/client-build-manifest.d.ts +21 -0
- package/dist/utils/client-build-manifest.js +87 -0
- package/dist/utils/client-entry-manifest.d.ts +11 -0
- package/dist/utils/client-entry-manifest.js +29 -0
- package/dist/utils/client-runtime-metadata.d.ts +45 -0
- package/dist/utils/client-runtime-metadata.js +63 -0
- package/dist/utils/commonjs-loader.d.ts +16 -0
- package/dist/utils/commonjs-loader.js +100 -0
- package/dist/utils/compare.d.ts +4 -0
- package/dist/utils/compare.js +8 -0
- package/dist/utils/deployment-id.d.ts +8 -0
- package/dist/utils/deployment-id.js +22 -0
- package/dist/utils/dev-error-recovery-event.d.ts +4 -0
- package/dist/utils/dev-error-recovery-event.js +4 -0
- package/dist/utils/domain-locale.d.ts +26 -0
- package/dist/utils/domain-locale.js +50 -0
- package/dist/utils/encode-cache-tag.d.ts +30 -0
- package/dist/utils/encode-cache-tag.js +36 -0
- package/dist/utils/error-cause.d.ts +4 -0
- package/dist/utils/error-cause.js +95 -0
- package/dist/utils/has-trailing-comma.d.ts +24 -0
- package/dist/utils/has-trailing-comma.js +62 -0
- package/dist/utils/hash.d.ts +24 -0
- package/dist/utils/hash.js +55 -0
- package/dist/utils/html-limited-bots.d.ts +21 -0
- package/dist/utils/html-limited-bots.js +35 -0
- package/dist/utils/lazy-chunks.d.ts +59 -0
- package/dist/utils/lazy-chunks.js +112 -0
- package/dist/utils/manifest-paths.d.ts +30 -0
- package/dist/utils/manifest-paths.js +66 -0
- package/dist/utils/mdx-scan.d.ts +9 -0
- package/dist/utils/mdx-scan.js +34 -0
- package/dist/utils/navigation-signal.d.ts +4 -0
- package/dist/utils/navigation-signal.js +12 -0
- package/dist/utils/number.d.ts +4 -0
- package/dist/utils/number.js +6 -0
- package/dist/utils/parse-cookie.d.ts +13 -0
- package/dist/utils/parse-cookie.js +52 -0
- package/dist/utils/path.d.ts +22 -0
- package/dist/utils/path.js +30 -0
- package/dist/utils/prerender-output-paths.d.ts +14 -0
- package/dist/utils/prerender-output-paths.js +22 -0
- package/dist/utils/project.d.ts +76 -0
- package/dist/utils/project.js +213 -0
- package/dist/utils/promise.d.ts +4 -0
- package/dist/utils/promise.js +6 -0
- package/dist/utils/public-routes.d.ts +4 -0
- package/dist/utils/public-routes.js +48 -0
- package/dist/utils/query.d.ts +49 -0
- package/dist/utils/query.js +122 -0
- package/dist/utils/record.d.ts +4 -0
- package/dist/utils/record.js +6 -0
- package/dist/utils/regex.d.ts +4 -0
- package/dist/utils/regex.js +6 -0
- package/dist/utils/safe-json-file.d.ts +17 -0
- package/dist/utils/safe-json-file.js +23 -0
- package/dist/utils/sorted-array.d.ts +8 -0
- package/dist/utils/sorted-array.js +20 -0
- package/dist/utils/text-stream.d.ts +28 -0
- package/dist/utils/text-stream.js +64 -0
- package/dist/utils/vinext-root.d.ts +23 -0
- package/dist/utils/vinext-root.js +29 -0
- package/dist/utils/virtual-module.d.ts +5 -0
- package/dist/utils/virtual-module.js +0 -0
- package/dist/utils/vite-version.d.ts +21 -0
- package/dist/utils/vite-version.js +42 -0
- package/package.json +145 -0
|
@@ -0,0 +1,558 @@
|
|
|
1
|
+
import { VINEXT_REVALIDATE_HEADER } from "../server/headers.js";
|
|
2
|
+
import { isrCacheKey } from "../server/isr-cache.js";
|
|
3
|
+
import { buildAppPageCacheTags } from "../server/app-page-cache.js";
|
|
4
|
+
import { ENTRY_PREFIX } from "./src/cache/kv-data-adapter.runtime.js";
|
|
5
|
+
import fs from "node:fs";
|
|
6
|
+
import path from "node:path";
|
|
7
|
+
import { spawn } from "node:child_process";
|
|
8
|
+
//#region src/cloudflare/tpr.ts
|
|
9
|
+
/**
|
|
10
|
+
* TPR: Traffic-aware Pre-Rendering
|
|
11
|
+
*
|
|
12
|
+
* Uses Cloudflare zone analytics to determine which pages actually get
|
|
13
|
+
* traffic, and pre-renders only those during deploy. The pre-rendered
|
|
14
|
+
* HTML is uploaded to KV in the same format ISR uses at runtime — no
|
|
15
|
+
* runtime changes needed.
|
|
16
|
+
*
|
|
17
|
+
* Flow:
|
|
18
|
+
* 1. Parse wrangler config to find custom domain and KV namespace
|
|
19
|
+
* 2. Resolve the Cloudflare zone for the custom domain
|
|
20
|
+
* 3. Query zone analytics (GraphQL) for top pages by request count
|
|
21
|
+
* 4. Walk ranked list until coverage threshold is met
|
|
22
|
+
* 5. Start the built production server locally
|
|
23
|
+
* 6. Fetch each hot route to produce HTML
|
|
24
|
+
* 7. Upload pre-rendered HTML to KV (same KVCacheEntry format ISR reads)
|
|
25
|
+
*
|
|
26
|
+
* TPR is an experimental feature enabled via --experimental-tpr. It
|
|
27
|
+
* gracefully skips when no custom domain, no API token, no traffic data,
|
|
28
|
+
* or no KV namespace is configured.
|
|
29
|
+
*/
|
|
30
|
+
/**
|
|
31
|
+
* Parse wrangler config (JSONC or TOML) to extract the fields TPR needs:
|
|
32
|
+
* account_id, VINEXT_KV_CACHE KV namespace ID, and custom domain.
|
|
33
|
+
*/
|
|
34
|
+
function parseWranglerConfig(root) {
|
|
35
|
+
for (const filename of ["wrangler.jsonc", "wrangler.json"]) {
|
|
36
|
+
const filepath = path.join(root, filename);
|
|
37
|
+
if (fs.existsSync(filepath)) {
|
|
38
|
+
const content = fs.readFileSync(filepath, "utf-8");
|
|
39
|
+
try {
|
|
40
|
+
return extractFromJSON(JSON.parse(stripJsonComments(content)));
|
|
41
|
+
} catch {
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
const tomlPath = path.join(root, "wrangler.toml");
|
|
47
|
+
if (fs.existsSync(tomlPath)) return extractFromTOML(fs.readFileSync(tomlPath, "utf-8"));
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Strip single-line (//) and multi-line comments from JSONC while
|
|
52
|
+
* preserving strings that contain slashes.
|
|
53
|
+
*/
|
|
54
|
+
function stripJsonComments(str) {
|
|
55
|
+
let result = "";
|
|
56
|
+
let inString = false;
|
|
57
|
+
let inSingleLine = false;
|
|
58
|
+
let inMultiLine = false;
|
|
59
|
+
let escapeNext = false;
|
|
60
|
+
for (let i = 0; i < str.length; i++) {
|
|
61
|
+
const ch = str[i];
|
|
62
|
+
const next = str[i + 1];
|
|
63
|
+
if (escapeNext) {
|
|
64
|
+
if (!inSingleLine && !inMultiLine) result += ch;
|
|
65
|
+
escapeNext = false;
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
if (ch === "\\" && inString) {
|
|
69
|
+
result += ch;
|
|
70
|
+
escapeNext = true;
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
if (inSingleLine) {
|
|
74
|
+
if (ch === "\n") {
|
|
75
|
+
inSingleLine = false;
|
|
76
|
+
result += ch;
|
|
77
|
+
}
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
if (inMultiLine) {
|
|
81
|
+
if (ch === "*" && next === "/") {
|
|
82
|
+
inMultiLine = false;
|
|
83
|
+
i++;
|
|
84
|
+
}
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
if (ch === "\"" && !inString) {
|
|
88
|
+
inString = true;
|
|
89
|
+
result += ch;
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
if (ch === "\"" && inString) {
|
|
93
|
+
inString = false;
|
|
94
|
+
result += ch;
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
if (!inString && ch === "/" && next === "/") {
|
|
98
|
+
inSingleLine = true;
|
|
99
|
+
i++;
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
if (!inString && ch === "/" && next === "*") {
|
|
103
|
+
inMultiLine = true;
|
|
104
|
+
i++;
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
result += ch;
|
|
108
|
+
}
|
|
109
|
+
return result;
|
|
110
|
+
}
|
|
111
|
+
function extractFromJSON(config) {
|
|
112
|
+
const result = {};
|
|
113
|
+
if (typeof config.account_id === "string") result.accountId = config.account_id;
|
|
114
|
+
if (Array.isArray(config.kv_namespaces)) {
|
|
115
|
+
const vinextKV = config.kv_namespaces.find((ns) => ns && typeof ns === "object" && (ns.binding === "VINEXT_KV_CACHE" || ns.binding === "VINEXT_CACHE"));
|
|
116
|
+
if (vinextKV && typeof vinextKV.id === "string" && vinextKV.id !== "<your-kv-namespace-id>") result.kvNamespaceId = vinextKV.id;
|
|
117
|
+
}
|
|
118
|
+
const domain = extractDomainFromRoutes(config.routes) ?? extractDomainFromCustomDomains(config);
|
|
119
|
+
if (domain) result.customDomain = domain;
|
|
120
|
+
return result;
|
|
121
|
+
}
|
|
122
|
+
function extractDomainFromRoutes(routes) {
|
|
123
|
+
if (!Array.isArray(routes)) return null;
|
|
124
|
+
for (const route of routes) if (typeof route === "string") {
|
|
125
|
+
const domain = cleanDomain(route);
|
|
126
|
+
if (domain && !domain.includes("workers.dev")) return domain;
|
|
127
|
+
} else if (route && typeof route === "object") {
|
|
128
|
+
const r = route;
|
|
129
|
+
const pattern = typeof r.zone_name === "string" ? r.zone_name : typeof r.pattern === "string" ? r.pattern : null;
|
|
130
|
+
if (pattern) {
|
|
131
|
+
const domain = cleanDomain(pattern);
|
|
132
|
+
if (domain && !domain.includes("workers.dev")) return domain;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
137
|
+
function extractDomainFromCustomDomains(config) {
|
|
138
|
+
if (Array.isArray(config.custom_domains)) {
|
|
139
|
+
for (const d of config.custom_domains) if (typeof d === "string" && !d.includes("workers.dev")) return cleanDomain(d);
|
|
140
|
+
}
|
|
141
|
+
return null;
|
|
142
|
+
}
|
|
143
|
+
/** Strip protocol and trailing wildcards from a route pattern to get a bare domain. */
|
|
144
|
+
function cleanDomain(raw) {
|
|
145
|
+
return raw.replace(/^https?:\/\//, "").replace(/\/\*$/, "").replace(/\/+$/, "").split("/")[0] || null;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Simple extraction of specific fields from wrangler.toml content.
|
|
149
|
+
* Not a full TOML parser — just enough for the fields we need.
|
|
150
|
+
*/
|
|
151
|
+
function extractFromTOML(content) {
|
|
152
|
+
const result = {};
|
|
153
|
+
const accountMatch = content.match(/^account_id\s*=\s*"([^"]+)"/m);
|
|
154
|
+
if (accountMatch) result.accountId = accountMatch[1];
|
|
155
|
+
const kvBlocks = content.split(/\[\[kv_namespaces\]\]/);
|
|
156
|
+
for (let i = 1; i < kvBlocks.length; i++) {
|
|
157
|
+
const block = kvBlocks[i].split(/\[\[/)[0];
|
|
158
|
+
const bindingMatch = block.match(/binding\s*=\s*"([^"]+)"/);
|
|
159
|
+
const idMatch = block.match(/\bid\s*=\s*"([^"]+)"/);
|
|
160
|
+
if ((bindingMatch?.[1] === "VINEXT_KV_CACHE" || bindingMatch?.[1] === "VINEXT_CACHE") && idMatch?.[1] && idMatch[1] !== "<your-kv-namespace-id>") result.kvNamespaceId = idMatch[1];
|
|
161
|
+
}
|
|
162
|
+
const routeMatch = content.match(/^route\s*=\s*"([^"]+)"/m);
|
|
163
|
+
if (routeMatch) {
|
|
164
|
+
const domain = cleanDomain(routeMatch[1]);
|
|
165
|
+
if (domain && !domain.includes("workers.dev")) result.customDomain = domain;
|
|
166
|
+
}
|
|
167
|
+
if (!result.customDomain) {
|
|
168
|
+
const routeBlocks = content.split(/\[\[routes\]\]/);
|
|
169
|
+
for (let i = 1; i < routeBlocks.length; i++) {
|
|
170
|
+
const patternMatch = routeBlocks[i].split(/\[\[/)[0].match(/pattern\s*=\s*"([^"]+)"/);
|
|
171
|
+
if (patternMatch) {
|
|
172
|
+
const domain = cleanDomain(patternMatch[1]);
|
|
173
|
+
if (domain && !domain.includes("workers.dev")) {
|
|
174
|
+
result.customDomain = domain;
|
|
175
|
+
break;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
return result;
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Generate zone lookup candidates from shortest (2-part) to longest.
|
|
184
|
+
* Tries the most common case first (e.g., "example.com") and progressively
|
|
185
|
+
* adds labels for multi-part TLDs (e.g., "co.uk" → "example.co.uk").
|
|
186
|
+
*
|
|
187
|
+
* "shop.example.com" → ["example.com", "shop.example.com"]
|
|
188
|
+
* "shop.example.co.uk" → ["co.uk", "example.co.uk", "shop.example.co.uk"]
|
|
189
|
+
* "example.com" → ["example.com"]
|
|
190
|
+
*/
|
|
191
|
+
function domainCandidates(domain) {
|
|
192
|
+
const parts = domain.split(".");
|
|
193
|
+
const candidates = [];
|
|
194
|
+
for (let i = parts.length - 2; i >= 0; i--) candidates.push(parts.slice(i).join("."));
|
|
195
|
+
return candidates;
|
|
196
|
+
}
|
|
197
|
+
/** Resolve zone ID from a domain name via the Cloudflare API. */
|
|
198
|
+
async function resolveZoneId(domain, apiToken) {
|
|
199
|
+
for (const candidate of domainCandidates(domain)) {
|
|
200
|
+
const response = await fetch(`https://api.cloudflare.com/client/v4/zones?name=${encodeURIComponent(candidate)}`, { headers: {
|
|
201
|
+
Authorization: `Bearer ${apiToken}`,
|
|
202
|
+
"Content-Type": "application/json"
|
|
203
|
+
} });
|
|
204
|
+
if (!response.ok) continue;
|
|
205
|
+
const data = await response.json();
|
|
206
|
+
if (data.success && data.result?.length) return data.result[0].id;
|
|
207
|
+
}
|
|
208
|
+
return null;
|
|
209
|
+
}
|
|
210
|
+
/** Resolve the account ID associated with the API token. */
|
|
211
|
+
async function resolveAccountId(apiToken) {
|
|
212
|
+
const response = await fetch("https://api.cloudflare.com/client/v4/accounts?per_page=1", { headers: {
|
|
213
|
+
Authorization: `Bearer ${apiToken}`,
|
|
214
|
+
"Content-Type": "application/json"
|
|
215
|
+
} });
|
|
216
|
+
if (!response.ok) return null;
|
|
217
|
+
const data = await response.json();
|
|
218
|
+
if (!data.success || !data.result?.length) return null;
|
|
219
|
+
return data.result[0].id;
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Query Cloudflare zone analytics for top page paths by request count
|
|
223
|
+
* over the given time window.
|
|
224
|
+
*/
|
|
225
|
+
async function queryTraffic(zoneTag, apiToken, windowHours) {
|
|
226
|
+
const now = /* @__PURE__ */ new Date();
|
|
227
|
+
const query = `{
|
|
228
|
+
viewer {
|
|
229
|
+
zones(filter: { zoneTag: "${zoneTag}" }) {
|
|
230
|
+
httpRequestsAdaptiveGroups(
|
|
231
|
+
limit: 10000
|
|
232
|
+
orderBy: [sum_requests_DESC]
|
|
233
|
+
filter: {
|
|
234
|
+
datetime_geq: "${(/* @__PURE__ */ new Date(now.getTime() - windowHours * 60 * 60 * 1e3)).toISOString()}"
|
|
235
|
+
datetime_lt: "${now.toISOString()}"
|
|
236
|
+
requestSource: "eyeball"
|
|
237
|
+
}
|
|
238
|
+
) {
|
|
239
|
+
sum { requests }
|
|
240
|
+
dimensions { clientRequestPath }
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}`;
|
|
245
|
+
const response = await fetch("https://api.cloudflare.com/client/v4/graphql", {
|
|
246
|
+
method: "POST",
|
|
247
|
+
headers: {
|
|
248
|
+
Authorization: `Bearer ${apiToken}`,
|
|
249
|
+
"Content-Type": "application/json"
|
|
250
|
+
},
|
|
251
|
+
body: JSON.stringify({ query })
|
|
252
|
+
});
|
|
253
|
+
if (!response.ok) throw new Error(`Zone analytics query failed: ${response.status} ${response.statusText}`);
|
|
254
|
+
const data = await response.json();
|
|
255
|
+
if (data.errors?.length) throw new Error(`Zone analytics error: ${data.errors[0].message}`);
|
|
256
|
+
const groups = data.data?.viewer?.zones?.[0]?.httpRequestsAdaptiveGroups;
|
|
257
|
+
if (!groups || groups.length === 0) return [];
|
|
258
|
+
return filterTrafficPaths(groups.map((g) => ({
|
|
259
|
+
path: g.dimensions.clientRequestPath,
|
|
260
|
+
requests: g.sum.requests
|
|
261
|
+
})));
|
|
262
|
+
}
|
|
263
|
+
/** Filter out non-page requests (static assets, API routes, internal routes). */
|
|
264
|
+
function filterTrafficPaths(entries) {
|
|
265
|
+
return entries.filter((e) => {
|
|
266
|
+
if (!e.path.startsWith("/")) return false;
|
|
267
|
+
if (/\.(js|css|png|jpg|jpeg|gif|svg|ico|woff2?|ttf|eot|map|webp|avif)$/i.test(e.path)) return false;
|
|
268
|
+
if (e.path.startsWith("/api/")) return false;
|
|
269
|
+
if (e.path.startsWith("/_next/") || e.path.startsWith("/__vinext/")) return false;
|
|
270
|
+
if (e.path.endsWith(".rsc")) return false;
|
|
271
|
+
return true;
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Walk the ranked traffic list, accumulating request counts until the
|
|
276
|
+
* coverage target is met or the hard cap is reached.
|
|
277
|
+
*/
|
|
278
|
+
function selectRoutes(traffic, coverageTarget, limit) {
|
|
279
|
+
const totalRequests = traffic.reduce((sum, e) => sum + e.requests, 0);
|
|
280
|
+
if (totalRequests === 0) return {
|
|
281
|
+
routes: [],
|
|
282
|
+
totalRequests: 0,
|
|
283
|
+
coveredRequests: 0,
|
|
284
|
+
coveragePercent: 0
|
|
285
|
+
};
|
|
286
|
+
const target = totalRequests * (coverageTarget / 100);
|
|
287
|
+
const selected = [];
|
|
288
|
+
let accumulated = 0;
|
|
289
|
+
for (const entry of traffic) {
|
|
290
|
+
if (accumulated >= target || selected.length >= limit) break;
|
|
291
|
+
selected.push(entry);
|
|
292
|
+
accumulated += entry.requests;
|
|
293
|
+
}
|
|
294
|
+
return {
|
|
295
|
+
routes: selected,
|
|
296
|
+
totalRequests,
|
|
297
|
+
coveredRequests: accumulated,
|
|
298
|
+
coveragePercent: accumulated / totalRequests * 100
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
/** Pre-render port — high number to avoid collisions with dev servers. */
|
|
302
|
+
const PRERENDER_PORT = 19384;
|
|
303
|
+
/** Max time to wait for the local server to start (ms). */
|
|
304
|
+
const SERVER_STARTUP_TIMEOUT = 3e4;
|
|
305
|
+
/** Max concurrent fetch requests during pre-rendering. */
|
|
306
|
+
const FETCH_CONCURRENCY = 10;
|
|
307
|
+
/**
|
|
308
|
+
* Start a local production server, fetch each route to produce HTML,
|
|
309
|
+
* and return the results. Pages that fail to render are skipped.
|
|
310
|
+
*/
|
|
311
|
+
async function prerenderRoutes(routes, root, hostDomain) {
|
|
312
|
+
const results = /* @__PURE__ */ new Map();
|
|
313
|
+
let failedCount = 0;
|
|
314
|
+
const port = PRERENDER_PORT;
|
|
315
|
+
const distDir = path.join(root, "dist");
|
|
316
|
+
if (!fs.existsSync(distDir)) {
|
|
317
|
+
console.log(" TPR: Skipping pre-render — dist/ directory not found");
|
|
318
|
+
return results;
|
|
319
|
+
}
|
|
320
|
+
const serverProcess = startLocalServer(root, port);
|
|
321
|
+
try {
|
|
322
|
+
await waitForServer(port, SERVER_STARTUP_TIMEOUT);
|
|
323
|
+
for (let i = 0; i < routes.length; i += FETCH_CONCURRENCY) {
|
|
324
|
+
const promises = routes.slice(i, i + FETCH_CONCURRENCY).map(async (routePath) => {
|
|
325
|
+
try {
|
|
326
|
+
const response = await fetch(`http://127.0.0.1:${port}${routePath}`, {
|
|
327
|
+
headers: {
|
|
328
|
+
"User-Agent": "vinext-tpr/1.0",
|
|
329
|
+
...hostDomain ? { Host: hostDomain } : {}
|
|
330
|
+
},
|
|
331
|
+
redirect: "manual"
|
|
332
|
+
});
|
|
333
|
+
if (response.status < 400) {
|
|
334
|
+
const html = await response.text();
|
|
335
|
+
const headers = {};
|
|
336
|
+
response.headers.forEach((value, key) => {
|
|
337
|
+
if (key === "content-type" || key === "cache-control" || key === "x-vinext-revalidate" || key === "location") headers[key] = value;
|
|
338
|
+
});
|
|
339
|
+
results.set(routePath, {
|
|
340
|
+
html,
|
|
341
|
+
status: response.status,
|
|
342
|
+
headers
|
|
343
|
+
});
|
|
344
|
+
}
|
|
345
|
+
} catch {
|
|
346
|
+
failedCount++;
|
|
347
|
+
}
|
|
348
|
+
});
|
|
349
|
+
await Promise.all(promises);
|
|
350
|
+
}
|
|
351
|
+
if (failedCount > 0) console.log(` TPR: ${failedCount} page(s) failed to pre-render (skipped)`);
|
|
352
|
+
} finally {
|
|
353
|
+
serverProcess.kill("SIGTERM");
|
|
354
|
+
await new Promise((resolve) => {
|
|
355
|
+
serverProcess.on("exit", resolve);
|
|
356
|
+
setTimeout(resolve, 2e3);
|
|
357
|
+
});
|
|
358
|
+
}
|
|
359
|
+
return results;
|
|
360
|
+
}
|
|
361
|
+
/**
|
|
362
|
+
* Spawn a subprocess running the vinext production server.
|
|
363
|
+
* Uses the same Node.js binary and resolves prod-server.js relative
|
|
364
|
+
* to the current module (works whether vinext is installed or linked).
|
|
365
|
+
*/
|
|
366
|
+
function startLocalServer(root, port) {
|
|
367
|
+
const prodServerPath = path.resolve(import.meta.dirname, "..", "server", "prod-server.js");
|
|
368
|
+
const outDir = path.join(root, "dist");
|
|
369
|
+
const escapedProdServer = prodServerPath.replace(/\\/g, "\\\\");
|
|
370
|
+
const escapedOutDir = outDir.replace(/\\/g, "\\\\");
|
|
371
|
+
const script = [
|
|
372
|
+
`import("file://${escapedProdServer}")`,
|
|
373
|
+
`.then(m => m.startProdServer({ port: ${port}, host: "127.0.0.1", outDir: "${escapedOutDir}" }))`,
|
|
374
|
+
`.catch(e => { console.error("[vinext-tpr] Server failed to start:", e); process.exit(1); });`
|
|
375
|
+
].join("");
|
|
376
|
+
const proc = spawn(process.execPath, [
|
|
377
|
+
"--input-type=module",
|
|
378
|
+
"-e",
|
|
379
|
+
script
|
|
380
|
+
], {
|
|
381
|
+
cwd: root,
|
|
382
|
+
stdio: "pipe",
|
|
383
|
+
env: {
|
|
384
|
+
...process.env,
|
|
385
|
+
NODE_ENV: "production"
|
|
386
|
+
}
|
|
387
|
+
});
|
|
388
|
+
proc.stderr?.on("data", (chunk) => {
|
|
389
|
+
const msg = chunk.toString().trim();
|
|
390
|
+
if (msg) console.error(` [tpr-server] ${msg}`);
|
|
391
|
+
});
|
|
392
|
+
return proc;
|
|
393
|
+
}
|
|
394
|
+
/** Poll the local server until it responds or the timeout is reached. */
|
|
395
|
+
async function waitForServer(port, timeoutMs) {
|
|
396
|
+
const start = Date.now();
|
|
397
|
+
while (Date.now() - start < timeoutMs) try {
|
|
398
|
+
const controller = new AbortController();
|
|
399
|
+
const timer = setTimeout(() => controller.abort(), 2e3);
|
|
400
|
+
const response = await fetch(`http://127.0.0.1:${port}/`, {
|
|
401
|
+
redirect: "manual",
|
|
402
|
+
signal: controller.signal
|
|
403
|
+
});
|
|
404
|
+
clearTimeout(timer);
|
|
405
|
+
await response.text();
|
|
406
|
+
return;
|
|
407
|
+
} catch {
|
|
408
|
+
await new Promise((r) => setTimeout(r, 300));
|
|
409
|
+
}
|
|
410
|
+
throw new Error(`Local production server failed to start within ${timeoutMs / 1e3}s`);
|
|
411
|
+
}
|
|
412
|
+
/** KV bulk API accepts up to 10,000 pairs per request */
|
|
413
|
+
const KV_BATCH_SIZE = 1e4;
|
|
414
|
+
/** Maximum KV expiration TTL: 30 days */
|
|
415
|
+
const MAX_KV_TTL_SECONDS = 720 * 3600;
|
|
416
|
+
/**
|
|
417
|
+
* Build KV bulk API pairs from pre-rendered entries.
|
|
418
|
+
*
|
|
419
|
+
* Key format matches the runtime KVCacheHandler exactly:
|
|
420
|
+
* ENTRY_PREFIX + isrCacheKey("app", pathname, buildId) + ":html"
|
|
421
|
+
* → "cache:app:<buildId>:<pathname>:html"
|
|
422
|
+
*/
|
|
423
|
+
function buildTprKVPairs(entries, buildId, defaultRevalidateSeconds) {
|
|
424
|
+
const now = Date.now();
|
|
425
|
+
const pairs = [];
|
|
426
|
+
for (const [routePath, result] of entries) {
|
|
427
|
+
const revalidateHeader = result.headers[VINEXT_REVALIDATE_HEADER];
|
|
428
|
+
const revalidateSeconds = revalidateHeader && !isNaN(Number(revalidateHeader)) ? Number(revalidateHeader) : defaultRevalidateSeconds;
|
|
429
|
+
const revalidateAt = revalidateSeconds > 0 ? now + revalidateSeconds * 1e3 : null;
|
|
430
|
+
const kvTtl = revalidateSeconds > 0 ? MAX_KV_TTL_SECONDS : 24 * 3600;
|
|
431
|
+
const tags = buildAppPageCacheTags(routePath, []);
|
|
432
|
+
const entry = {
|
|
433
|
+
value: {
|
|
434
|
+
kind: "APP_PAGE",
|
|
435
|
+
html: result.html,
|
|
436
|
+
headers: result.headers,
|
|
437
|
+
status: result.status
|
|
438
|
+
},
|
|
439
|
+
tags,
|
|
440
|
+
lastModified: now,
|
|
441
|
+
revalidateAt
|
|
442
|
+
};
|
|
443
|
+
const cacheKey = ENTRY_PREFIX + isrCacheKey("app", routePath, buildId) + ":html";
|
|
444
|
+
pairs.push({
|
|
445
|
+
key: cacheKey,
|
|
446
|
+
value: JSON.stringify(entry),
|
|
447
|
+
expiration_ttl: kvTtl
|
|
448
|
+
});
|
|
449
|
+
}
|
|
450
|
+
return pairs;
|
|
451
|
+
}
|
|
452
|
+
/**
|
|
453
|
+
* Upload pre-rendered pages to KV using the Cloudflare REST API.
|
|
454
|
+
* Writes in the same KVCacheEntry format that KVCacheHandler reads
|
|
455
|
+
* at runtime, so ISR serves these entries without any code changes.
|
|
456
|
+
*/
|
|
457
|
+
async function uploadToKV(entries, namespaceId, accountId, apiToken, defaultRevalidateSeconds, buildId) {
|
|
458
|
+
const pairs = buildTprKVPairs(entries, buildId, defaultRevalidateSeconds);
|
|
459
|
+
for (let i = 0; i < pairs.length; i += KV_BATCH_SIZE) {
|
|
460
|
+
const batch = pairs.slice(i, i + KV_BATCH_SIZE);
|
|
461
|
+
const response = await fetch(`https://api.cloudflare.com/client/v4/accounts/${accountId}/storage/kv/namespaces/${namespaceId}/bulk`, {
|
|
462
|
+
method: "PUT",
|
|
463
|
+
headers: {
|
|
464
|
+
Authorization: `Bearer ${apiToken}`,
|
|
465
|
+
"Content-Type": "application/json"
|
|
466
|
+
},
|
|
467
|
+
body: JSON.stringify(batch)
|
|
468
|
+
});
|
|
469
|
+
if (!response.ok) {
|
|
470
|
+
const text = await response.text();
|
|
471
|
+
throw new Error(`KV bulk upload failed (batch ${Math.floor(i / KV_BATCH_SIZE) + 1}): ${response.status} — ${text}`);
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
/** Default revalidation TTL for pre-rendered pages (1 hour). */
|
|
476
|
+
const DEFAULT_REVALIDATE_SECONDS = 3600;
|
|
477
|
+
/**
|
|
478
|
+
* Run the TPR pipeline: query traffic, select routes, pre-render, upload.
|
|
479
|
+
*
|
|
480
|
+
* Designed to be called between the build step and wrangler deploy in
|
|
481
|
+
* the `vinext deploy` pipeline. Gracefully skips (never errors) when
|
|
482
|
+
* the prerequisites aren't met.
|
|
483
|
+
*/
|
|
484
|
+
async function runTPR(options) {
|
|
485
|
+
const startTime = Date.now();
|
|
486
|
+
const { root, coverage, limit, window: windowHours } = options;
|
|
487
|
+
const skip = (reason) => ({
|
|
488
|
+
totalPaths: 0,
|
|
489
|
+
prerenderedCount: 0,
|
|
490
|
+
coverageAchieved: 0,
|
|
491
|
+
durationMs: Date.now() - startTime,
|
|
492
|
+
skipped: reason
|
|
493
|
+
});
|
|
494
|
+
const apiToken = process.env.CLOUDFLARE_API_TOKEN;
|
|
495
|
+
if (!apiToken) return skip("no CLOUDFLARE_API_TOKEN set");
|
|
496
|
+
const wranglerConfig = parseWranglerConfig(root);
|
|
497
|
+
if (!wranglerConfig) return skip("could not parse wrangler config");
|
|
498
|
+
if (!wranglerConfig.customDomain) return skip("no custom domain — zone analytics unavailable");
|
|
499
|
+
if (!wranglerConfig.kvNamespaceId) return skip("no VINEXT_KV_CACHE KV namespace configured");
|
|
500
|
+
const accountId = wranglerConfig.accountId ?? await resolveAccountId(apiToken);
|
|
501
|
+
if (!accountId) return skip("could not resolve Cloudflare account ID");
|
|
502
|
+
console.log(` TPR: Analyzing traffic for ${wranglerConfig.customDomain} (last ${windowHours}h)`);
|
|
503
|
+
const zoneId = await resolveZoneId(wranglerConfig.customDomain, apiToken);
|
|
504
|
+
if (!zoneId) return skip(`could not resolve zone for ${wranglerConfig.customDomain}`);
|
|
505
|
+
let traffic;
|
|
506
|
+
try {
|
|
507
|
+
traffic = await queryTraffic(zoneId, apiToken, windowHours);
|
|
508
|
+
} catch (err) {
|
|
509
|
+
return skip(`analytics query failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
510
|
+
}
|
|
511
|
+
if (traffic.length === 0) return skip("no traffic data available (first deploy?)");
|
|
512
|
+
const selection = selectRoutes(traffic, coverage, limit);
|
|
513
|
+
console.log(` TPR: ${traffic.length.toLocaleString()} unique paths — ${selection.routes.length} pages cover ${Math.round(selection.coveragePercent)}% of traffic`);
|
|
514
|
+
if (selection.routes.length === 0) return {
|
|
515
|
+
totalPaths: traffic.length,
|
|
516
|
+
prerenderedCount: 0,
|
|
517
|
+
coverageAchieved: 0,
|
|
518
|
+
durationMs: Date.now() - startTime,
|
|
519
|
+
skipped: "no pre-renderable routes after filtering"
|
|
520
|
+
};
|
|
521
|
+
console.log(` TPR: Pre-rendering ${selection.routes.length} pages...`);
|
|
522
|
+
const routePaths = selection.routes.map((r) => r.path);
|
|
523
|
+
let rendered;
|
|
524
|
+
try {
|
|
525
|
+
rendered = await prerenderRoutes(routePaths, root, wranglerConfig.customDomain);
|
|
526
|
+
} catch (err) {
|
|
527
|
+
return skip(`pre-rendering failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
528
|
+
}
|
|
529
|
+
if (rendered.size === 0) return {
|
|
530
|
+
totalPaths: traffic.length,
|
|
531
|
+
prerenderedCount: 0,
|
|
532
|
+
coverageAchieved: selection.coveragePercent,
|
|
533
|
+
durationMs: Date.now() - startTime,
|
|
534
|
+
skipped: "all pages failed to pre-render (request-dependent?)"
|
|
535
|
+
};
|
|
536
|
+
let buildId;
|
|
537
|
+
try {
|
|
538
|
+
buildId = fs.readFileSync(path.join(root, "dist", "server", "BUILD_ID"), "utf-8").trim();
|
|
539
|
+
} catch {
|
|
540
|
+
console.warn(" TPR: Could not read BUILD_ID from dist/server/ — KV keys will not match runtime. Skipping KV upload.");
|
|
541
|
+
return skip("BUILD_ID not found in dist/server/ — build output may be incomplete");
|
|
542
|
+
}
|
|
543
|
+
try {
|
|
544
|
+
await uploadToKV(rendered, wranglerConfig.kvNamespaceId, accountId, apiToken, DEFAULT_REVALIDATE_SECONDS, buildId);
|
|
545
|
+
} catch (err) {
|
|
546
|
+
return skip(`KV upload failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
547
|
+
}
|
|
548
|
+
const durationMs = Date.now() - startTime;
|
|
549
|
+
console.log(` TPR: Pre-rendered ${rendered.size} pages in ${(durationMs / 1e3).toFixed(1)}s → KV cache`);
|
|
550
|
+
return {
|
|
551
|
+
totalPaths: traffic.length,
|
|
552
|
+
prerenderedCount: rendered.size,
|
|
553
|
+
coverageAchieved: selection.coveragePercent,
|
|
554
|
+
durationMs
|
|
555
|
+
};
|
|
556
|
+
}
|
|
557
|
+
//#endregion
|
|
558
|
+
export { buildTprKVPairs, domainCandidates, parseWranglerConfig, runTPR };
|