vinext 1.0.0-beta.9 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +150 -92
- package/THIRD_PARTY_LICENSES.md +51 -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 +7 -14
- package/dist/build/precompress.d.ts +2 -3
- package/dist/build/precompress.js +1 -1
- 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 +36 -11
- package/dist/build/prerender-paths.js +274 -102
- 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 +73 -16
- package/dist/build/prerender.js +272 -80
- 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 +24 -20
- package/dist/build/report.js +10 -2
- 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 +26 -16
- package/dist/build/server-entry.d.ts +6 -0
- package/dist/build/server-entry.js +34 -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 +6 -7
- package/dist/cache/cache-adapters-virtual.d.ts +60 -20
- package/dist/cache/cache-adapters-virtual.js +50 -7
- 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 -442
- package/dist/client/app-nav-failure-handler.d.ts +6 -7
- package/dist/client/browser-globals.d.ts +4 -0
- package/dist/client/browser-globals.js +5 -0
- 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 +20 -17
- package/dist/client/navigation-runtime.js +4 -3
- 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 -10
- package/dist/client/window-next.d.ts +4 -5
- package/dist/config/config-matchers.d.ts +16 -16
- package/dist/config/config-matchers.js +2 -4
- package/dist/config/dotenv.d.ts +3 -4
- package/dist/config/dotenv.js +14 -2
- 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 +4 -5
- package/dist/entries/app-browser-entry.js +1 -3
- package/dist/entries/app-rsc-entry.d.ts +10 -3
- package/dist/entries/app-rsc-entry.js +503 -51
- package/dist/entries/app-rsc-manifest.d.ts +4 -3
- package/dist/entries/app-rsc-manifest.js +26 -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 +234 -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 +848 -255
- package/dist/init-cloudflare.d.ts +26 -17
- package/dist/init-cloudflare.js +711 -103
- 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 +126 -42
- 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/commonjs-syntax.d.ts +16 -0
- package/dist/plugins/commonjs-syntax.js +22 -0
- 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 +14 -4
- package/dist/plugins/ignore-dynamic-requests.js +113 -91
- package/dist/plugins/import-meta-url.d.ts +6 -7
- package/dist/plugins/import-meta-url.js +36 -48
- 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 +5 -4
- package/dist/plugins/og-asset-ownership.js +24 -13
- package/dist/plugins/og-assets.d.ts +22 -5
- package/dist/plugins/og-assets.js +82 -21
- package/dist/plugins/og-harfbuzz.d.ts +24 -0
- package/dist/plugins/og-harfbuzz.js +271 -0
- package/dist/plugins/optimize-imports.d.ts +7 -7
- package/dist/plugins/optimize-imports.js +34 -45
- 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 +3 -3
- package/dist/plugins/require-context.js +41 -22
- 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/scan-build-css.d.ts +12 -0
- package/dist/plugins/scan-build-css.js +39 -0
- package/dist/plugins/server-externals-manifest.d.ts +2 -3
- package/dist/plugins/strip-server-exports.d.ts +7 -6
- package/dist/plugins/strip-server-exports.js +4 -2
- 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 +21 -4
- package/dist/plugins/transform-result.js +23 -2
- package/dist/plugins/transitive-externals.d.ts +2 -3
- package/dist/plugins/typeof-window.d.ts +16 -7
- package/dist/plugins/typeof-window.js +62 -39
- 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 +18 -19
- package/dist/routing/app-route-graph.js +5 -6
- package/dist/routing/app-route-ids.d.ts +3 -0
- package/dist/routing/app-route-ids.js +6 -0
- package/dist/routing/app-router.d.ts +19 -6
- package/dist/routing/app-router.js +24 -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 +4 -4
- package/dist/server/app-bfcache-id.js +7 -1
- package/dist/server/app-bfcache-identity.d.ts +8 -9
- package/dist/server/app-bfcache-identity.js +1 -2
- 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 +91 -36
- 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 +15 -2
- 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 +5 -6
- 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-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 +25 -27
- package/dist/server/app-history-state.js +21 -16
- 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 +7 -7
- package/dist/server/app-middleware.js +2 -3
- 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 +10 -11
- package/dist/server/app-optimistic-routing.js +3 -2
- 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 +1 -1
- package/dist/server/app-page-cache-finalizer.d.ts +18 -9
- package/dist/server/app-page-cache-finalizer.js +51 -16
- package/dist/server/app-page-cache-render.d.ts +8 -5
- package/dist/server/app-page-cache-render.js +22 -4
- package/dist/server/app-page-cache.d.ts +28 -9
- package/dist/server/app-page-cache.js +95 -24
- package/dist/server/app-page-dispatch.d.ts +34 -12
- package/dist/server/app-page-dispatch.js +181 -64
- 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 +11 -7
- 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 +41 -6
- package/dist/server/app-page-render.js +171 -24
- 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 +30 -12
- 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 +43 -7
- 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 +34 -6
- package/dist/server/app-page-tracing.d.ts +33 -0
- package/dist/server/app-page-tracing.js +50 -0
- package/dist/server/app-pages-bridge.d.ts +6 -6
- package/dist/server/app-pages-bridge.js +18 -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 +3 -1
- package/dist/server/app-prerender-static-params.d.ts +15 -7
- package/dist/server/app-prerender-static-params.js +24 -9
- package/dist/server/app-render-abort-error.d.ts +3 -0
- package/dist/server/app-render-abort-error.js +8 -0
- 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 +112 -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 +4 -4
- package/dist/server/app-route-handler-cache.js +51 -35
- package/dist/server/app-route-handler-dispatch.d.ts +3 -3
- package/dist/server/app-route-handler-dispatch.js +77 -56
- package/dist/server/app-route-handler-execution.d.ts +26 -14
- package/dist/server/app-route-handler-execution.js +94 -28
- 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 +11 -11
- package/dist/server/app-route-handler-policy.js +2 -2
- package/dist/server/app-route-handler-response.d.ts +9 -10
- package/dist/server/app-route-handler-response.js +14 -3
- 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 +4 -1
- package/dist/server/app-router-entry.js +33 -17
- package/dist/server/app-rsc-cache-busting.d.ts +34 -27
- package/dist/server/app-rsc-cache-busting.js +14 -2
- 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 +11 -9
- package/dist/server/app-rsc-errors.js +14 -16
- package/dist/server/app-rsc-handler.d.ts +32 -6
- package/dist/server/app-rsc-handler.js +425 -64
- 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 +5 -3
- package/dist/server/app-rsc-response-finalizer.d.ts +8 -5
- package/dist/server/app-rsc-response-finalizer.js +10 -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 +3 -4
- package/dist/server/app-rsc-route-matching.js +3 -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 +119 -7
- package/dist/server/app-segment-config.js +242 -2
- package/dist/server/app-server-action-execution.d.ts +18 -13
- package/dist/server/app-server-action-execution.js +86 -33
- package/dist/server/app-ssr-entry.d.ts +14 -4
- package/dist/server/app-ssr-entry.js +62 -15
- 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 +34 -8
- 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 +35 -13
- package/dist/server/cache-control.js +64 -6
- 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 +4 -5
- package/dist/server/cacheability-limits.js +2 -2
- package/dist/server/cacheability-manifest.d.ts +42 -16
- package/dist/server/cacheability-manifest.js +60 -10
- package/dist/server/cacheability-request.d.ts +37 -8
- package/dist/server/cacheability-request.js +192 -90
- 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 +25 -11
- 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 +141 -64
- 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 +56 -61
- package/dist/server/headers.js +22 -31
- 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-error-responses.js +1 -0
- 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 +30 -27
- package/dist/server/isr-cache.js +23 -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-response.d.ts +7 -7
- package/dist/server/metadata-route-response.js +158 -35
- 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 +6 -7
- 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 +7 -8
- package/dist/server/middleware-runtime.js +36 -7
- 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/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 +28 -9
- package/dist/server/pages-asset-tags.d.ts +7 -6
- package/dist/server/pages-asset-tags.js +104 -18
- 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 +13 -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-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 +23 -19
- package/dist/server/pages-page-data.js +82 -75
- package/dist/server/pages-page-handler.d.ts +7 -6
- package/dist/server/pages-page-handler.js +103 -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 +52 -32
- 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 +15 -12
- package/dist/server/pages-request-pipeline.js +80 -35
- package/dist/server/pages-request-stage-entry.d.ts +23 -0
- package/dist/server/pages-request-stage-entry.js +316 -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 +35 -148
- 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 +17 -11
- package/dist/server/prerender-manifest.js +7 -4
- package/dist/server/prerender-route-params.d.ts +16 -9
- package/dist/server/prerender-route-params.js +18 -3
- package/dist/server/prerender-work-unit-setup.d.ts +2 -3
- package/dist/server/prerender-work-unit-setup.js +5 -5
- package/dist/server/prod-server.d.ts +12 -9
- package/dist/server/prod-server.js +127 -44
- 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 +16 -16
- package/dist/server/request-pipeline.js +7 -2
- 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 +1 -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/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 +9 -6
- package/dist/server/static-file-signal.js +51 -2
- 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 +5 -6
- package/dist/server/worker-revalidation-context.d.ts +4 -4
- package/dist/server/worker-revalidation-context.js +6 -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 +2 -1
- package/dist/server/workers-tracing.d.ts +34 -0
- package/dist/server/workers-tracing.js +67 -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 +26 -38
- package/dist/shims/cache-request-state.js +2 -13
- package/dist/shims/cache-runtime.d.ts +23 -21
- package/dist/shims/cache-runtime.js +110 -28
- package/dist/shims/cache.d.ts +17 -16
- package/dist/shims/cache.js +19 -15
- package/dist/shims/cacheability-classification.d.ts +50 -29
- package/dist/shims/cacheability-classification.js +29 -14
- 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 +59 -21
- package/dist/shims/cdn-cache.js +31 -47
- 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 +5 -19
- package/dist/shims/error.js +17 -10
- package/dist/shims/error.react-server.d.ts +4 -7
- package/dist/shims/error.react-server.js +4 -1
- package/dist/shims/fetch-cache.d.ts +22 -22
- package/dist/shims/fetch-cache.js +46 -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 +44 -73
- package/dist/shims/headers.js +87 -144
- 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 +5 -17
- package/dist/shims/internal/app-prefetch-rsc-request.js +5 -14
- package/dist/shims/internal/app-route-detection.d.ts +2 -2
- package/dist/shims/internal/app-route-prefetch-policy.d.ts +5 -8
- package/dist/shims/internal/app-route-prefetch-policy.js +0 -1
- package/dist/shims/internal/app-router-context.d.ts +9 -10
- package/dist/shims/internal/cache-context-accessor.d.ts +16 -0
- package/dist/shims/internal/cache-context-accessor.js +15 -0
- 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/headers-state.d.ts +74 -0
- package/dist/shims/internal/headers-state.js +157 -0
- package/dist/shims/internal/hybrid-client-route-owner-direct.d.ts +6 -7
- package/dist/shims/internal/hybrid-client-route-owner.d.ts +3 -3
- package/dist/shims/internal/hybrid-client-route-owner.js +3 -2
- 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 +3 -4
- 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 +10 -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 +56 -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 +26 -18
- package/dist/shims/navigation.react-server.d.ts +9 -9
- 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 +5 -6
- package/dist/shims/request-state-types.d.ts +2 -1
- package/dist/shims/root-params.d.ts +14 -15
- package/dist/shims/root-params.js +1 -1
- 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 +66 -30
- 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 +35 -32
- 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 +12 -13
- 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 +4 -4
- package/dist/utils/encode-cache-tag.js +11 -1
- 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 +4 -5
- 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 +151 -0
- package/dist/utils/vite-version.d.ts +5 -6
- package/next-package.json +4 -0
- package/package.json +51 -6
- package/dist/server/metadata-route-cache-policy.d.ts +0 -6
- package/dist/server/metadata-route-cache-policy.js +0 -6
package/dist/init-cloudflare.js
CHANGED
|
@@ -1,59 +1,112 @@
|
|
|
1
1
|
import path from "./deps/.pnpm/pathslash@0.1.0/deps/pathslash/dist/index.js";
|
|
2
2
|
import { detectProject } from "./utils/project.js";
|
|
3
|
+
import { isUnknownRecord } from "./utils/record.js";
|
|
3
4
|
import { createRequire } from "node:module";
|
|
4
5
|
import fs from "node:fs";
|
|
6
|
+
import { createHash } from "node:crypto";
|
|
5
7
|
import MagicString from "magic-string";
|
|
6
8
|
//#region src/init-cloudflare.ts
|
|
7
9
|
const require = createRequire(import.meta.url);
|
|
8
10
|
const DEFAULT_CLOUDFLARE_INIT_OPTIONS = {
|
|
9
|
-
dataCache: "
|
|
10
|
-
cdnCache: "
|
|
11
|
+
dataCache: "none",
|
|
12
|
+
cdnCache: "none",
|
|
11
13
|
imageOptimization: "cloudflare-images"
|
|
12
14
|
};
|
|
13
15
|
const DEFAULT_VERSION_METADATA_BINDING = "CF_VERSION_METADATA";
|
|
16
|
+
const RESPONSE_STORE_WRANGLER_CONFIG = "wrangler.response-store.jsonc";
|
|
17
|
+
const RESPONSE_STORE_BINDING = "RESPONSE_STORE";
|
|
18
|
+
const RESPONSE_STORE_ENTRYPOINT = "ResponseStoreService";
|
|
19
|
+
const RESPONSE_STORE_MAIN = "./node_modules/@cloudflare/workers-response-store/dist/service.js";
|
|
20
|
+
const CACHE_BODIES_BINDING = "CACHE_BODIES";
|
|
21
|
+
const CACHE_METADATA_BINDING = "CACHE_METADATA";
|
|
22
|
+
const CACHE_METADATA_CLASS = "CacheMetadata";
|
|
23
|
+
const CACHE_METADATA_EXPORT = {
|
|
24
|
+
type: "durable-object",
|
|
25
|
+
storage: "sqlite"
|
|
26
|
+
};
|
|
27
|
+
const CTX_EXPORTS_DEFAULT_DATE = "2025-11-17";
|
|
14
28
|
function validateCloudflarePlatformSetup(context, cloudflare) {
|
|
29
|
+
if (!cloudflare.legacyWrangler) {
|
|
30
|
+
const existingWrangler = [
|
|
31
|
+
"wrangler.toml",
|
|
32
|
+
"wrangler.json",
|
|
33
|
+
"wrangler.jsonc",
|
|
34
|
+
RESPONSE_STORE_WRANGLER_CONFIG
|
|
35
|
+
].find((name) => fs.existsSync(path.join(context.root, name)));
|
|
36
|
+
if (existingWrangler) throw new Error(`Cloudflare init cannot replace an existing Wrangler config (${existingWrangler}). Migrate its bindings to cloudflare.config.ts first, or use --legacy-wrangler-cloudflare-init to keep the Wrangler setup.`);
|
|
37
|
+
const typedConfigPath = path.join(context.root, "cloudflare.config.ts");
|
|
38
|
+
if (cloudflare.cdnCache === "static-assets" && fs.existsSync(typedConfigPath)) throw new Error("Static Assets cache setup for an existing cloudflare.config.ts must be configured manually. Keep its assets binding aligned with staticAssetsAdapter({ binding }) and include \"/_vinext/static-cache/*\" in assets.runWorkerFirst to protect private cache files.");
|
|
39
|
+
if (cloudflare.cdnCache === "response-store" && (cloudflare.responseStoreMode ?? "service-binding") === "service-binding" && fs.existsSync(typedConfigPath) && !fs.readFileSync(typedConfigPath, "utf-8").includes("export const responseStoreServiceBinding")) throw new Error("The existing cloudflare.config.ts must export responseStoreServiceBinding for the Response Store auxiliary Worker. Configure it before rerunning init.");
|
|
40
|
+
if (context.existingViteConfigPath && cloudflare.cdnCache === "response-store" && (cloudflare.responseStoreMode ?? "service-binding") === "service-binding" && !fs.readFileSync(context.existingViteConfigPath, "utf-8").includes("auxiliaryWorkers: [{ config: responseStoreServiceBinding }]")) throw new Error("Cloudflare init with Response Store service-binding requires a fresh Vite config so the auxiliary Worker is connected. Remove the existing Vite config or configure it manually.");
|
|
41
|
+
if (context.existingViteConfigPath) {
|
|
42
|
+
const updatedConfig = updateViteConfigForCloudflare(context.existingViteConfigPath, fs.readFileSync(context.existingViteConfigPath, "utf-8"), {
|
|
43
|
+
isAppRouter: context.isAppRouter,
|
|
44
|
+
nativeModulesToStub: detectProject(context.root).nativeModulesToStub,
|
|
45
|
+
cache: cloudflare
|
|
46
|
+
});
|
|
47
|
+
if (context.hasCssModules) updateViteConfigForCssModules(context.existingViteConfigPath, updatedConfig);
|
|
48
|
+
}
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
15
51
|
const tomlPath = path.join(context.root, "wrangler.toml");
|
|
16
52
|
if (fs.existsSync(tomlPath)) throw new Error("wrangler.toml is not supported by vinext init. Convert it to wrangler.jsonc and rerun.");
|
|
17
53
|
const projectInfo = detectProject(context.root);
|
|
18
54
|
const wranglerPath = ["wrangler.jsonc", "wrangler.json"].map((fileName) => path.join(context.root, fileName)).find((candidate) => fs.existsSync(candidate));
|
|
19
55
|
const wranglerCode = wranglerPath ? fs.readFileSync(wranglerPath, "utf-8") : void 0;
|
|
56
|
+
if (!wranglerCode && cloudflare.cdnCache === "response-store" && (cloudflare.responseStoreMode ?? "service-binding") === "service-binding" && fs.existsSync(path.join(context.root, RESPONSE_STORE_WRANGLER_CONFIG))) readResponseStoreServiceName(context.root, {});
|
|
20
57
|
const updatedWranglerCode = wranglerCode ? updateWranglerConfigForCloudflare(wranglerCode, cloudflare, { root: context.root }) : void 0;
|
|
21
58
|
const imagesBinding = updatedWranglerCode ? getWranglerImagesBinding(updatedWranglerCode) : "IMAGES";
|
|
59
|
+
const assetsBinding = updatedWranglerCode ? getWranglerAssetsBinding(updatedWranglerCode) : "ASSETS";
|
|
60
|
+
const assetsDirectory = updatedWranglerCode ? getWranglerAssetsDirectory(updatedWranglerCode) : "dist/client";
|
|
22
61
|
const versionMetadataBinding = updatedWranglerCode ? getWranglerVersionMetadataBinding(updatedWranglerCode) : DEFAULT_VERSION_METADATA_BINDING;
|
|
23
|
-
if (context.existingViteConfigPath)
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
62
|
+
if (context.existingViteConfigPath) {
|
|
63
|
+
const updatedConfig = updateViteConfigForCloudflare(context.existingViteConfigPath, fs.readFileSync(context.existingViteConfigPath, "utf-8"), {
|
|
64
|
+
isAppRouter: context.isAppRouter,
|
|
65
|
+
nativeModulesToStub: projectInfo.nativeModulesToStub,
|
|
66
|
+
cache: cloudflare,
|
|
67
|
+
assetsBinding,
|
|
68
|
+
assetsDirectory,
|
|
69
|
+
imagesBinding,
|
|
70
|
+
versionMetadataBinding
|
|
71
|
+
});
|
|
72
|
+
if (context.hasCssModules) updateViteConfigForCssModules(context.existingViteConfigPath, updatedConfig);
|
|
73
|
+
}
|
|
31
74
|
}
|
|
32
75
|
function setupCloudflarePlatform(context, cloudflare) {
|
|
76
|
+
if (!cloudflare.legacyWrangler) return setupCfPlatform(context, cloudflare);
|
|
33
77
|
const projectInfo = detectProject(context.root);
|
|
34
78
|
const wranglerPath = ["wrangler.jsonc", "wrangler.json"].map((fileName) => path.join(context.root, fileName)).find((candidate) => fs.existsSync(candidate));
|
|
35
79
|
const wranglerCode = wranglerPath ? fs.readFileSync(wranglerPath, "utf-8") : void 0;
|
|
36
80
|
const updatedWranglerCode = wranglerCode ? updateWranglerConfigForCloudflare(wranglerCode, cloudflare, { root: context.root }) : void 0;
|
|
37
81
|
const imagesBinding = updatedWranglerCode ? getWranglerImagesBinding(updatedWranglerCode) : "IMAGES";
|
|
82
|
+
const assetsBinding = updatedWranglerCode ? getWranglerAssetsBinding(updatedWranglerCode) : "ASSETS";
|
|
83
|
+
const assetsDirectory = updatedWranglerCode ? getWranglerAssetsDirectory(updatedWranglerCode) : "dist/client";
|
|
38
84
|
const versionMetadataBinding = updatedWranglerCode ? getWranglerVersionMetadataBinding(updatedWranglerCode) : DEFAULT_VERSION_METADATA_BINDING;
|
|
39
85
|
let generatedViteConfig = false;
|
|
40
86
|
let skippedViteConfig = false;
|
|
87
|
+
let preservedExistingGenerateScopedName = false;
|
|
41
88
|
if (context.existingViteConfigPath) {
|
|
42
89
|
const currentConfig = fs.readFileSync(context.existingViteConfigPath, "utf-8");
|
|
43
|
-
|
|
90
|
+
let updatedConfig = updateViteConfigForCloudflare(context.existingViteConfigPath, currentConfig, {
|
|
44
91
|
isAppRouter: context.isAppRouter,
|
|
45
92
|
nativeModulesToStub: projectInfo.nativeModulesToStub,
|
|
46
93
|
cache: cloudflare,
|
|
94
|
+
assetsBinding,
|
|
95
|
+
assetsDirectory,
|
|
47
96
|
imagesBinding,
|
|
48
|
-
versionMetadataBinding
|
|
49
|
-
prerender: context.prerender
|
|
97
|
+
versionMetadataBinding
|
|
50
98
|
});
|
|
99
|
+
if (context.hasCssModules) {
|
|
100
|
+
const cssUpdate = updateViteConfigForCssModules(context.existingViteConfigPath, updatedConfig);
|
|
101
|
+
updatedConfig = cssUpdate.code;
|
|
102
|
+
preservedExistingGenerateScopedName = cssUpdate.preservedExistingGenerateScopedName;
|
|
103
|
+
}
|
|
51
104
|
if (updatedConfig !== currentConfig) {
|
|
52
105
|
fs.writeFileSync(context.existingViteConfigPath, updatedConfig, "utf-8");
|
|
53
106
|
generatedViteConfig = true;
|
|
54
107
|
} else skippedViteConfig = true;
|
|
55
108
|
} else {
|
|
56
|
-
const configContent = context.isAppRouter ? generateAppRouterViteConfig(projectInfo, cloudflare, imagesBinding, context.
|
|
109
|
+
const configContent = context.isAppRouter ? generateAppRouterViteConfig(projectInfo, cloudflare, imagesBinding, versionMetadataBinding, false, assetsBinding, assetsDirectory, context.hasCssModules) : generatePagesRouterViteConfig(projectInfo, cloudflare, imagesBinding, versionMetadataBinding, false, context.hasCssModules, assetsBinding, assetsDirectory);
|
|
57
110
|
fs.writeFileSync(path.join(context.root, "vite.config.ts"), configContent, "utf-8");
|
|
58
111
|
generatedViteConfig = true;
|
|
59
112
|
}
|
|
@@ -68,22 +121,116 @@ function setupCloudflarePlatform(context, cloudflare) {
|
|
|
68
121
|
}
|
|
69
122
|
}
|
|
70
123
|
const finalWranglerPath = wranglerPath ?? path.join(context.root, "wrangler.jsonc");
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
124
|
+
if (cloudflare.cdnCache === "response-store" && (cloudflare.responseStoreMode ?? "service-binding") === "service-binding") {
|
|
125
|
+
const responseStorePath = path.join(path.dirname(finalWranglerPath), RESPONSE_STORE_WRANGLER_CONFIG);
|
|
126
|
+
if (!fs.existsSync(responseStorePath)) {
|
|
127
|
+
fs.writeFileSync(responseStorePath, generateResponseStoreWranglerConfig(fs.readFileSync(finalWranglerPath, "utf-8"), context.root), "utf-8");
|
|
128
|
+
generatedPlatformFiles.push(path.relative(context.root, responseStorePath) || RESPONSE_STORE_WRANGLER_CONFIG);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
const nextSteps = [];
|
|
132
|
+
if (cloudflare.cdnCache === "response-store" && (cloudflare.responseStoreMode ?? "service-binding") === "service-binding") nextSteps.push("Deploy Workers Response Store before deploying the application:", ` ${context.packageManager ?? "npm"} run deploy:response-store`);
|
|
133
|
+
if (cloudflare.prerender && cloudflare.cdnCache !== "static-assets") nextSteps.push("Pre-rendered routes are built, but Cloudflare deploys do not serve them.", " Use the Static Assets cache to serve them, or cache warming to fill another cache.");
|
|
74
134
|
return {
|
|
75
135
|
generatedViteConfig,
|
|
76
136
|
skippedViteConfig,
|
|
77
137
|
generatedPlatformFiles,
|
|
78
|
-
nextSteps
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
138
|
+
nextSteps,
|
|
139
|
+
preservedExistingGenerateScopedName
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
function setupCfPlatform(context, cloudflare) {
|
|
143
|
+
const projectInfo = detectProject(context.root);
|
|
144
|
+
const serviceBinding = cloudflare.cdnCache === "response-store" && (cloudflare.responseStoreMode ?? "service-binding") === "service-binding";
|
|
145
|
+
let generatedViteConfig = false;
|
|
146
|
+
let preservedExistingGenerateScopedName = false;
|
|
147
|
+
if (context.existingViteConfigPath) {
|
|
148
|
+
const current = fs.readFileSync(context.existingViteConfigPath, "utf-8");
|
|
149
|
+
let updated = updateViteConfigForCloudflare(context.existingViteConfigPath, current, {
|
|
150
|
+
isAppRouter: context.isAppRouter,
|
|
151
|
+
nativeModulesToStub: projectInfo.nativeModulesToStub,
|
|
152
|
+
cache: cloudflare
|
|
153
|
+
});
|
|
154
|
+
if (context.hasCssModules) {
|
|
155
|
+
const cssUpdate = updateViteConfigForCssModules(context.existingViteConfigPath, updated);
|
|
156
|
+
updated = cssUpdate.code;
|
|
157
|
+
preservedExistingGenerateScopedName = cssUpdate.preservedExistingGenerateScopedName;
|
|
158
|
+
}
|
|
159
|
+
if (updated !== current) {
|
|
160
|
+
fs.writeFileSync(context.existingViteConfigPath, updated, "utf-8");
|
|
161
|
+
generatedViteConfig = true;
|
|
162
|
+
}
|
|
163
|
+
} else {
|
|
164
|
+
const viteConfig = context.isAppRouter ? generateAppRouterViteConfig(projectInfo, cloudflare, "IMAGES", DEFAULT_VERSION_METADATA_BINDING, serviceBinding, "ASSETS", "dist/client", context.hasCssModules) : generatePagesRouterViteConfig(projectInfo, cloudflare, "IMAGES", DEFAULT_VERSION_METADATA_BINDING, serviceBinding, context.hasCssModules);
|
|
165
|
+
fs.writeFileSync(path.join(context.root, "vite.config.ts"), viteConfig, "utf-8");
|
|
166
|
+
generatedViteConfig = true;
|
|
167
|
+
}
|
|
168
|
+
const configPath = path.join(context.root, "cloudflare.config.ts");
|
|
169
|
+
const generatedPlatformFiles = [];
|
|
170
|
+
if (!fs.existsSync(configPath)) {
|
|
171
|
+
fs.writeFileSync(configPath, generateTypedCloudflareConfig(projectInfo, cloudflare, context.today));
|
|
172
|
+
generatedPlatformFiles.push("cloudflare.config.ts");
|
|
173
|
+
}
|
|
174
|
+
const nextSteps = [];
|
|
175
|
+
if (serviceBinding) nextSteps.push("After `vinext build`, deploy the Response Store Worker explicitly (and repeat when its code/config changes):", ` ${context.packageManager ?? "npm"} run deploy:response-store`, "vinext-cloudflare deploy only deploys the application Worker.");
|
|
176
|
+
if (cloudflare.prerender && cloudflare.cdnCache !== "static-assets") nextSteps.push("Pre-rendered routes are built, but Cloudflare deploys do not serve them.", " Use the Static Assets cache to serve them, or cache warming to fill another cache.");
|
|
177
|
+
nextSteps.push("For TypeScript, add \".cloudflare/types\" to the include list in tsconfig.json.", "Worker types are generated during dev/build; run `cf workers types` before standalone type-checks.");
|
|
178
|
+
return {
|
|
179
|
+
generatedViteConfig,
|
|
180
|
+
skippedViteConfig: !generatedViteConfig,
|
|
181
|
+
generatedPlatformFiles,
|
|
182
|
+
nextSteps,
|
|
183
|
+
preservedExistingGenerateScopedName
|
|
85
184
|
};
|
|
86
185
|
}
|
|
186
|
+
function generateTypedCloudflareConfig(info, options, today = (/* @__PURE__ */ new Date()).toISOString().split("T")[0]) {
|
|
187
|
+
const serviceBinding = options.cdnCache === "response-store" && (options.responseStoreMode ?? "service-binding") === "service-binding";
|
|
188
|
+
const selfContained = options.cdnCache === "response-store" && !serviceBinding;
|
|
189
|
+
const workersCache = options.cdnCache === "workers-cache";
|
|
190
|
+
const helper = serviceBinding ? "createWorkersResponseStoreServiceBindingConfig" : selfContained ? "createWorkersResponseStoreSelfContainedConfig" : workersCache ? "createWorkersCacheConfig" : void 0;
|
|
191
|
+
const imports = [`import { bindings, defineConfig, defineWorker } from "cf/config";`, ...helper ? [`import { ${helper} } from "@vinext/cloudflare/cache/config";`] : []];
|
|
192
|
+
const responseStoreName = compactResourceName(info.projectName, "-response-store", 63);
|
|
193
|
+
const bucket = serviceBinding ? compactResourceName(responseStoreName, "-cache-bodies", 63) : compactResourceName(info.projectName, "-response-store-cache-bodies", 63);
|
|
194
|
+
const shared = serviceBinding ? `const responseStore = await ${helper}({
|
|
195
|
+
worker: {
|
|
196
|
+
name: ${JSON.stringify(responseStoreName)},
|
|
197
|
+
compatibilityDate: ${JSON.stringify(today)},
|
|
198
|
+
compatibilityFlags: ["nodejs_compat"],
|
|
199
|
+
},
|
|
200
|
+
bucket: ${JSON.stringify(bucket)},
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
export const responseStoreServiceBinding = responseStore.serviceBindingWorker;
|
|
204
|
+
|
|
205
|
+
` : selfContained ? `const cache = await ${helper}({
|
|
206
|
+
worker: ${JSON.stringify(info.projectName)},
|
|
207
|
+
bucket: ${JSON.stringify(bucket)},
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
` : workersCache ? `const cache = await ${helper}();\n\n` : "";
|
|
211
|
+
const cacheSpread = serviceBinding ? "responseStore.applicationWorker" : helper ? "cache" : void 0;
|
|
212
|
+
const envBindings = [
|
|
213
|
+
...cacheSpread ? [`...${cacheSpread}.env`] : [],
|
|
214
|
+
"ASSETS: bindings.assets()",
|
|
215
|
+
...options.imageOptimization === "cloudflare-images" ? ["IMAGES: bindings.images()"] : [],
|
|
216
|
+
...options.dataCache === "kv" ? ["VINEXT_KV_CACHE: bindings.kv()"] : []
|
|
217
|
+
];
|
|
218
|
+
return `${imports.join("\n")}
|
|
219
|
+
|
|
220
|
+
${shared}export default defineConfig({
|
|
221
|
+
worker: defineWorker({
|
|
222
|
+
${cacheSpread ? `...${cacheSpread},\n ` : ""}name: ${JSON.stringify(info.projectName)},
|
|
223
|
+
entrypoint: ${JSON.stringify(resolveWorkerEntry(info.root))},
|
|
224
|
+
compatibilityDate: ${JSON.stringify(today)},
|
|
225
|
+
compatibilityFlags: ["nodejs_compat"],
|
|
226
|
+
assets: { notFoundHandling: "none"${options.cdnCache === "static-assets" ? ", runWorkerFirst: [\"/_vinext/static-cache/*\"]" : ""} },
|
|
227
|
+
env: {
|
|
228
|
+
${envBindings.join(",\n ")},
|
|
229
|
+
},
|
|
230
|
+
}),
|
|
231
|
+
});
|
|
232
|
+
`;
|
|
233
|
+
}
|
|
87
234
|
/**
|
|
88
235
|
* `main` is what makes a Wrangler config a Worker rather than a static-assets
|
|
89
236
|
* project. A custom `worker/index.*` wins when present; otherwise the
|
|
@@ -106,7 +253,8 @@ function generateWranglerConfig(info, options = DEFAULT_CLOUDFLARE_INIT_OPTIONS,
|
|
|
106
253
|
assets: {
|
|
107
254
|
directory: "dist/client",
|
|
108
255
|
not_found_handling: "none",
|
|
109
|
-
binding: "ASSETS"
|
|
256
|
+
binding: "ASSETS",
|
|
257
|
+
...options.cdnCache === "static-assets" ? { run_worker_first: ["/_vinext/static-cache/*"] } : {}
|
|
110
258
|
}
|
|
111
259
|
};
|
|
112
260
|
if (options.cdnCache === "workers-cache") {
|
|
@@ -114,11 +262,11 @@ function generateWranglerConfig(info, options = DEFAULT_CLOUDFLARE_INIT_OPTIONS,
|
|
|
114
262
|
config.version_metadata = { binding: DEFAULT_VERSION_METADATA_BINDING };
|
|
115
263
|
}
|
|
116
264
|
if (options.imageOptimization === "cloudflare-images") config.images = { binding: "IMAGES" };
|
|
117
|
-
if (options.dataCache === "kv") config.kv_namespaces = [{
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
return JSON.stringify(
|
|
265
|
+
if (options.dataCache === "kv") config.kv_namespaces = [{ binding: "VINEXT_KV_CACHE" }];
|
|
266
|
+
const code = `${JSON.stringify(config, null, 2)}\n`;
|
|
267
|
+
if (options.cdnCache !== "response-store") return code;
|
|
268
|
+
const configured = configureResponseStoreWrangler(code, config, options.responseStoreMode ?? "service-binding", info.root);
|
|
269
|
+
return `${JSON.stringify(JSON.parse(configured), null, 2)}\n`;
|
|
122
270
|
}
|
|
123
271
|
function stripJsonComments(code) {
|
|
124
272
|
let output = "";
|
|
@@ -277,6 +425,197 @@ function appendTopLevelJsonProperty(code, property) {
|
|
|
277
425
|
const structuralBefore = stripJsonComments(before);
|
|
278
426
|
return `${before}${!/,\s*$/.test(structuralBefore) && !/{\s*$/.test(structuralBefore) ? "," : ""}\n${property}\n${code.slice(closing)}`;
|
|
279
427
|
}
|
|
428
|
+
function setTopLevelJsonProperty(code, name, value) {
|
|
429
|
+
const property = findTopLevelJsonProperty(code, name);
|
|
430
|
+
const serialized = JSON.stringify(value);
|
|
431
|
+
if (!property) return appendTopLevelJsonProperty(code, ` ${JSON.stringify(name)}: ${serialized}`);
|
|
432
|
+
return `${code.slice(0, property.valueStart)}${serialized}${code.slice(property.valueEnd)}`;
|
|
433
|
+
}
|
|
434
|
+
function compactResourceName(name, suffix, maxLength) {
|
|
435
|
+
const fullName = `${name}${suffix}`;
|
|
436
|
+
if (fullName.length <= maxLength) return fullName;
|
|
437
|
+
const hash = createHash("sha256").update(name).digest("hex").slice(0, 8);
|
|
438
|
+
return `${name.slice(0, maxLength - suffix.length - hash.length - 1)}-${hash}${suffix}`;
|
|
439
|
+
}
|
|
440
|
+
function isCacheMetadataExport(value) {
|
|
441
|
+
return isUnknownRecord(value) && value.type === CACHE_METADATA_EXPORT.type && value.storage === CACHE_METADATA_EXPORT.storage;
|
|
442
|
+
}
|
|
443
|
+
function readResponseStoreServiceName(root, appConfig) {
|
|
444
|
+
const responseStorePath = path.join(root, RESPONSE_STORE_WRANGLER_CONFIG);
|
|
445
|
+
if (fs.existsSync(responseStorePath)) {
|
|
446
|
+
let responseStoreConfig;
|
|
447
|
+
try {
|
|
448
|
+
responseStoreConfig = JSON.parse(stripJsonComments(fs.readFileSync(responseStorePath, "utf8")));
|
|
449
|
+
} catch (cause) {
|
|
450
|
+
throw new Error(`Could not parse ${RESPONSE_STORE_WRANGLER_CONFIG}.`, { cause });
|
|
451
|
+
}
|
|
452
|
+
if (!isUnknownRecord(responseStoreConfig) || typeof responseStoreConfig.name !== "string" || responseStoreConfig.name.length === 0) throw new Error(`${RESPONSE_STORE_WRANGLER_CONFIG} must contain a Worker name.`);
|
|
453
|
+
if (responseStoreConfig.main !== RESPONSE_STORE_MAIN) throw new Error(`${RESPONSE_STORE_WRANGLER_CONFIG} already exists but does not use @cloudflare/workers-response-store.`);
|
|
454
|
+
const responseStoreExport = isUnknownRecord(responseStoreConfig.exports) ? responseStoreConfig.exports.ResponseStoreBinding : void 0;
|
|
455
|
+
const cacheMetadataExport = isUnknownRecord(responseStoreConfig.exports) ? responseStoreConfig.exports[CACHE_METADATA_CLASS] : void 0;
|
|
456
|
+
const hasCacheBodies = Array.isArray(responseStoreConfig.r2_buckets) && responseStoreConfig.r2_buckets.some((binding) => isUnknownRecord(binding) && binding.binding === CACHE_BODIES_BINDING);
|
|
457
|
+
const durableBindings = isUnknownRecord(responseStoreConfig.durable_objects) ? responseStoreConfig.durable_objects.bindings : void 0;
|
|
458
|
+
const hasCacheMetadata = Array.isArray(durableBindings) && durableBindings.some((binding) => isUnknownRecord(binding) && binding.name === CACHE_METADATA_BINDING && binding.class_name === CACHE_METADATA_CLASS && binding.script_name === void 0);
|
|
459
|
+
const hasNoMigrations = responseStoreConfig.migrations === void 0 || Array.isArray(responseStoreConfig.migrations) && responseStoreConfig.migrations.length === 0;
|
|
460
|
+
if (!isUnknownRecord(responseStoreConfig.cache) || responseStoreConfig.cache.enabled !== true || !isUnknownRecord(responseStoreExport) || !isUnknownRecord(responseStoreExport.cache) || responseStoreExport.cache.enabled !== true || !hasCacheBodies || !hasCacheMetadata || !isCacheMetadataExport(cacheMetadataExport) || !hasNoMigrations) throw new Error(`${RESPONSE_STORE_WRANGLER_CONFIG} is missing required Response Store bindings.`);
|
|
461
|
+
const compatibilityFlags = responseStoreConfig.compatibility_flags;
|
|
462
|
+
if (compatibilityFlags !== void 0 && (!Array.isArray(compatibilityFlags) || compatibilityFlags.some((flag) => typeof flag !== "string"))) throw new Error(`${RESPONSE_STORE_WRANGLER_CONFIG} has invalid compatibility flags.`);
|
|
463
|
+
const flags = compatibilityFlags ?? [];
|
|
464
|
+
if (flags.includes("disable_ctx_exports") || (typeof responseStoreConfig.compatibility_date !== "string" || responseStoreConfig.compatibility_date < CTX_EXPORTS_DEFAULT_DATE) && !flags.includes("enable_ctx_exports")) throw new Error(`${RESPONSE_STORE_WRANGLER_CONFIG} must enable ctx.exports with a compatibility date on or after ${CTX_EXPORTS_DEFAULT_DATE}, or the enable_ctx_exports compatibility flag.`);
|
|
465
|
+
return responseStoreConfig.name;
|
|
466
|
+
}
|
|
467
|
+
if (Array.isArray(appConfig.services)) {
|
|
468
|
+
const binding = appConfig.services.find((service) => isUnknownRecord(service) && service.binding === RESPONSE_STORE_BINDING);
|
|
469
|
+
if (isUnknownRecord(binding) && typeof binding.service === "string" && binding.service.length > 0) return binding.service;
|
|
470
|
+
}
|
|
471
|
+
return compactResourceName(typeof appConfig.name === "string" && appConfig.name.length > 0 ? appConfig.name : detectProject(root).projectName, "-response-store", 63);
|
|
472
|
+
}
|
|
473
|
+
function configureResponseStoreWrangler(code, config, mode, root) {
|
|
474
|
+
const flags = Array.isArray(config.compatibility_flags) ? config.compatibility_flags.filter((flag) => typeof flag === "string") : [];
|
|
475
|
+
if (flags.includes("disable_ctx_exports")) throw new Error("Workers Response Store requires ctx.exports to be enabled.");
|
|
476
|
+
if ((typeof config.compatibility_date !== "string" || config.compatibility_date < CTX_EXPORTS_DEFAULT_DATE) && !flags.includes("enable_ctx_exports")) code = setTopLevelJsonProperty(code, "compatibility_flags", [...flags, "enable_ctx_exports"]);
|
|
477
|
+
const versionMetadata = config.version_metadata;
|
|
478
|
+
if (versionMetadata !== void 0 && (!isUnknownRecord(versionMetadata) || versionMetadata.binding !== DEFAULT_VERSION_METADATA_BINDING)) throw new Error(`Workers Response Store requires version_metadata.binding to be ${JSON.stringify(DEFAULT_VERSION_METADATA_BINDING)}.`);
|
|
479
|
+
code = setTopLevelJsonProperty(code, "version_metadata", { binding: DEFAULT_VERSION_METADATA_BINDING });
|
|
480
|
+
const cache = config.cache;
|
|
481
|
+
if (cache !== void 0 && !isUnknownRecord(cache)) throw new Error("The existing Wrangler config has an invalid cache value.");
|
|
482
|
+
code = setTopLevelJsonProperty(code, "cache", {
|
|
483
|
+
...cache,
|
|
484
|
+
enabled: mode === "self-contained"
|
|
485
|
+
});
|
|
486
|
+
const exportsConfig = config.exports;
|
|
487
|
+
if (exportsConfig !== void 0 && !isUnknownRecord(exportsConfig)) throw new Error("The existing Wrangler config has an invalid exports value.");
|
|
488
|
+
const workerExports = { ...exportsConfig };
|
|
489
|
+
const cacheMetadataExport = workerExports[CACHE_METADATA_CLASS];
|
|
490
|
+
const hasCacheMetadataExport = isCacheMetadataExport(cacheMetadataExport);
|
|
491
|
+
let updateWorkerExports = mode === "self-contained";
|
|
492
|
+
const services = config.services;
|
|
493
|
+
if (services !== void 0 && !Array.isArray(services)) throw new Error("The existing Wrangler config has an invalid services value.");
|
|
494
|
+
const existingServices = services ?? [];
|
|
495
|
+
if (existingServices.some((service) => !isUnknownRecord(service))) throw new Error("The existing Wrangler config has an invalid service binding.");
|
|
496
|
+
const responseStoreService = existingServices.find((service) => service.binding === RESPONSE_STORE_BINDING);
|
|
497
|
+
if (responseStoreService && responseStoreService.entrypoint !== RESPONSE_STORE_ENTRYPOINT) throw new Error(`The ${RESPONSE_STORE_BINDING} service binding uses a different entrypoint.`);
|
|
498
|
+
if (mode === "service-binding") {
|
|
499
|
+
const responseStoreExport = workerExports.ResponseStoreBinding;
|
|
500
|
+
const hasSelfContainedResponseStore = isUnknownRecord(responseStoreExport) && responseStoreExport.type === "worker" && isUnknownRecord(responseStoreExport.cache) && responseStoreExport.cache.enabled === true;
|
|
501
|
+
if (responseStoreExport !== void 0 && !hasSelfContainedResponseStore) throw new Error("The existing ResponseStoreBinding export conflicts with Workers Response Store.");
|
|
502
|
+
if (hasSelfContainedResponseStore && cacheMetadataExport !== void 0 && !hasCacheMetadataExport) throw new Error(`The existing ${CACHE_METADATA_CLASS} export conflicts with Workers Response Store.`);
|
|
503
|
+
const hasCacheBodies = Array.isArray(config.r2_buckets) && config.r2_buckets.some((bucket) => isUnknownRecord(bucket) && bucket.binding === CACHE_BODIES_BINDING);
|
|
504
|
+
const durableBindings = isUnknownRecord(config.durable_objects) ? config.durable_objects.bindings : void 0;
|
|
505
|
+
const hasCacheMetadata = Array.isArray(durableBindings) && durableBindings.some((binding) => isUnknownRecord(binding) && binding.name === CACHE_METADATA_BINDING);
|
|
506
|
+
if (!hasSelfContainedResponseStore && hasCacheBodies) throw new Error(`${CACHE_BODIES_BINDING} is already used by an application-owned R2 binding.`);
|
|
507
|
+
if (!hasSelfContainedResponseStore && hasCacheMetadata) throw new Error(`${CACHE_METADATA_BINDING} is already used by an application-owned Durable Object binding.`);
|
|
508
|
+
const serviceName = readResponseStoreServiceName(root, config);
|
|
509
|
+
code = setTopLevelJsonProperty(code, "services", [...existingServices.filter((service) => service.binding !== RESPONSE_STORE_BINDING), {
|
|
510
|
+
...responseStoreService,
|
|
511
|
+
binding: RESPONSE_STORE_BINDING,
|
|
512
|
+
service: serviceName,
|
|
513
|
+
entrypoint: RESPONSE_STORE_ENTRYPOINT
|
|
514
|
+
}]);
|
|
515
|
+
updateWorkerExports = hasSelfContainedResponseStore;
|
|
516
|
+
delete workerExports.ResponseStoreBinding;
|
|
517
|
+
if (hasSelfContainedResponseStore) delete workerExports[CACHE_METADATA_CLASS];
|
|
518
|
+
if (Array.isArray(config.r2_buckets)) code = setTopLevelJsonProperty(code, "r2_buckets", config.r2_buckets.filter((bucket) => !isUnknownRecord(bucket) || bucket.binding !== CACHE_BODIES_BINDING));
|
|
519
|
+
if (isUnknownRecord(config.durable_objects) && Array.isArray(config.durable_objects.bindings)) code = setTopLevelJsonProperty(code, "durable_objects", {
|
|
520
|
+
...config.durable_objects,
|
|
521
|
+
bindings: config.durable_objects.bindings.filter((binding) => !isUnknownRecord(binding) || binding.name !== CACHE_METADATA_BINDING)
|
|
522
|
+
});
|
|
523
|
+
} else {
|
|
524
|
+
const defaultExport = workerExports.default;
|
|
525
|
+
if (defaultExport !== void 0 && !isUnknownRecord(defaultExport)) throw new Error("The existing Wrangler config has an invalid default export.");
|
|
526
|
+
workerExports.default = {
|
|
527
|
+
...defaultExport,
|
|
528
|
+
type: "worker",
|
|
529
|
+
cache: { enabled: false }
|
|
530
|
+
};
|
|
531
|
+
if (responseStoreService) code = setTopLevelJsonProperty(code, "services", existingServices.filter((service) => service.binding !== RESPONSE_STORE_BINDING));
|
|
532
|
+
for (const [name, value] of Object.entries(workerExports)) {
|
|
533
|
+
if (!isUnknownRecord(value)) throw new Error(`The existing Wrangler config has an invalid ${name} export.`);
|
|
534
|
+
if (value.type === "worker" && value.cache === void 0) workerExports[name] = {
|
|
535
|
+
...value,
|
|
536
|
+
cache: { enabled: false }
|
|
537
|
+
};
|
|
538
|
+
}
|
|
539
|
+
const responseStoreExport = workerExports.ResponseStoreBinding;
|
|
540
|
+
if (responseStoreExport !== void 0 && !isUnknownRecord(responseStoreExport)) throw new Error("The existing Wrangler config has an invalid ResponseStoreBinding export.");
|
|
541
|
+
workerExports.ResponseStoreBinding = {
|
|
542
|
+
...responseStoreExport,
|
|
543
|
+
type: "worker",
|
|
544
|
+
cache: { enabled: true }
|
|
545
|
+
};
|
|
546
|
+
if (cacheMetadataExport !== void 0 && !hasCacheMetadataExport) throw new Error(`The existing ${CACHE_METADATA_CLASS} export conflicts with Workers Response Store.`);
|
|
547
|
+
workerExports[CACHE_METADATA_CLASS] = CACHE_METADATA_EXPORT;
|
|
548
|
+
const r2Buckets = config.r2_buckets;
|
|
549
|
+
if (r2Buckets !== void 0 && !Array.isArray(r2Buckets)) throw new Error("The existing Wrangler config has an invalid r2_buckets value.");
|
|
550
|
+
const existingBuckets = r2Buckets ?? [];
|
|
551
|
+
if (existingBuckets.some((bucket) => !isUnknownRecord(bucket))) throw new Error("The existing Wrangler config has an invalid R2 binding.");
|
|
552
|
+
if (!existingBuckets.some((bucket) => bucket.binding === CACHE_BODIES_BINDING)) {
|
|
553
|
+
const appName = typeof config.name === "string" && config.name.length > 0 ? config.name : detectProject(root).projectName;
|
|
554
|
+
code = setTopLevelJsonProperty(code, "r2_buckets", [...existingBuckets, {
|
|
555
|
+
binding: CACHE_BODIES_BINDING,
|
|
556
|
+
bucket_name: compactResourceName(appName, "-response-store-cache-bodies", 63)
|
|
557
|
+
}]);
|
|
558
|
+
}
|
|
559
|
+
const durableObjects = config.durable_objects;
|
|
560
|
+
if (durableObjects !== void 0 && !isUnknownRecord(durableObjects)) throw new Error("The existing Wrangler config has an invalid durable_objects value.");
|
|
561
|
+
const durableBindings = durableObjects?.bindings;
|
|
562
|
+
if (durableBindings !== void 0 && !Array.isArray(durableBindings)) throw new Error("The existing Wrangler config has invalid Durable Object bindings.");
|
|
563
|
+
const existingDurableBindings = durableBindings ?? [];
|
|
564
|
+
if (existingDurableBindings.some((binding) => !isUnknownRecord(binding))) throw new Error("The existing Wrangler config has an invalid Durable Object binding.");
|
|
565
|
+
const existingMetadataBinding = existingDurableBindings.find((binding) => binding.name === CACHE_METADATA_BINDING);
|
|
566
|
+
if (existingMetadataBinding && (existingMetadataBinding.class_name !== CACHE_METADATA_CLASS || existingMetadataBinding.script_name !== void 0)) throw new Error(`The ${CACHE_METADATA_BINDING} Durable Object binding is incompatible.`);
|
|
567
|
+
code = setTopLevelJsonProperty(code, "durable_objects", {
|
|
568
|
+
...durableObjects,
|
|
569
|
+
bindings: existingMetadataBinding ? existingDurableBindings : [...existingDurableBindings, {
|
|
570
|
+
name: CACHE_METADATA_BINDING,
|
|
571
|
+
class_name: CACHE_METADATA_CLASS
|
|
572
|
+
}]
|
|
573
|
+
});
|
|
574
|
+
const migrations = config.migrations;
|
|
575
|
+
if (migrations !== void 0 && !Array.isArray(migrations)) throw new Error("The existing Wrangler config has an invalid migrations value.");
|
|
576
|
+
const existingMigrations = migrations ?? [];
|
|
577
|
+
if (existingMigrations.some((migration) => !isUnknownRecord(migration))) throw new Error("The existing Wrangler config has an invalid Durable Object migration.");
|
|
578
|
+
if (existingMigrations.length > 0) throw new Error("Self-contained Workers Response Store cannot be combined with migration-based Durable Objects. Convert the existing Durable Objects to declarative exports or use service-binding mode.");
|
|
579
|
+
}
|
|
580
|
+
return updateWorkerExports ? setTopLevelJsonProperty(code, "exports", workerExports) : code;
|
|
581
|
+
}
|
|
582
|
+
function generateResponseStoreWranglerConfig(appWranglerCode, root) {
|
|
583
|
+
const appConfig = JSON.parse(stripJsonComments(appWranglerCode));
|
|
584
|
+
const serviceName = readResponseStoreServiceName(root, appConfig);
|
|
585
|
+
const compatibilityDate = typeof appConfig.compatibility_date === "string" ? appConfig.compatibility_date : (/* @__PURE__ */ new Date()).toISOString().split("T")[0];
|
|
586
|
+
const compatibilityFlags = ["nodejs_compat"];
|
|
587
|
+
if (compatibilityDate < CTX_EXPORTS_DEFAULT_DATE) compatibilityFlags.push("enable_ctx_exports");
|
|
588
|
+
return `${JSON.stringify({
|
|
589
|
+
$schema: "node_modules/wrangler/config-schema.json",
|
|
590
|
+
name: serviceName,
|
|
591
|
+
main: RESPONSE_STORE_MAIN,
|
|
592
|
+
compatibility_date: compatibilityDate,
|
|
593
|
+
compatibility_flags: compatibilityFlags,
|
|
594
|
+
workers_dev: false,
|
|
595
|
+
preview_urls: false,
|
|
596
|
+
cache: { enabled: true },
|
|
597
|
+
exports: {
|
|
598
|
+
default: {
|
|
599
|
+
type: "worker",
|
|
600
|
+
cache: { enabled: false }
|
|
601
|
+
},
|
|
602
|
+
ResponseStoreBinding: {
|
|
603
|
+
type: "worker",
|
|
604
|
+
cache: { enabled: true }
|
|
605
|
+
},
|
|
606
|
+
[CACHE_METADATA_CLASS]: CACHE_METADATA_EXPORT
|
|
607
|
+
},
|
|
608
|
+
r2_buckets: [{
|
|
609
|
+
binding: CACHE_BODIES_BINDING,
|
|
610
|
+
bucket_name: compactResourceName(serviceName, "-cache-bodies", 63)
|
|
611
|
+
}],
|
|
612
|
+
durable_objects: { bindings: [{
|
|
613
|
+
name: CACHE_METADATA_BINDING,
|
|
614
|
+
class_name: CACHE_METADATA_CLASS
|
|
615
|
+
}] },
|
|
616
|
+
...typeof appConfig.account_id === "string" ? { account_id: appConfig.account_id } : {}
|
|
617
|
+
}, null, 2)}\n`;
|
|
618
|
+
}
|
|
280
619
|
function updateWranglerConfigForCloudflare(code, options, context = {}) {
|
|
281
620
|
let config;
|
|
282
621
|
try {
|
|
@@ -291,6 +630,24 @@ function updateWranglerConfigForCloudflare(code, options, context = {}) {
|
|
|
291
630
|
output = appendTopLevelJsonProperty(output, ` "main": ${JSON.stringify(workerEntry)}`);
|
|
292
631
|
}
|
|
293
632
|
if (!findTopLevelJsonProperty(output, "assets")) output = appendTopLevelJsonProperty(output, " \"assets\": { \"directory\": \"dist/client\", \"not_found_handling\": \"none\", \"binding\": \"ASSETS\" }");
|
|
633
|
+
if (options.cdnCache === "static-assets") {
|
|
634
|
+
const assetsProperty = findTopLevelJsonProperty(output, "assets");
|
|
635
|
+
const assets = JSON.parse(stripJsonComments(output.slice(assetsProperty.valueStart, assetsProperty.valueEnd)));
|
|
636
|
+
if (!assets || typeof assets !== "object" || Array.isArray(assets)) throw new Error("The existing Wrangler config has an invalid assets value.");
|
|
637
|
+
const workerFirst = assets.run_worker_first;
|
|
638
|
+
if (workerFirst !== void 0 && typeof workerFirst !== "boolean" && !Array.isArray(workerFirst)) throw new Error("The existing Wrangler config has an invalid assets.run_worker_first value.");
|
|
639
|
+
if (Array.isArray(workerFirst) && workerFirst.some((pattern) => typeof pattern !== "string" || pattern.startsWith("!"))) throw new Error("Static Assets cache requires run_worker_first without exclusion patterns. Use true or an array of positive path patterns.");
|
|
640
|
+
const protectedRouting = workerFirst === true ? true : [.../* @__PURE__ */ new Set([...Array.isArray(workerFirst) ? workerFirst : [], "/_vinext/static-cache/*"])];
|
|
641
|
+
if (typeof assets.directory !== "string" || assets.directory.length === 0 || typeof assets.binding !== "string" || assets.binding.length === 0 || JSON.stringify(workerFirst) !== JSON.stringify(protectedRouting)) {
|
|
642
|
+
const updatedAssets = JSON.stringify({
|
|
643
|
+
...assets,
|
|
644
|
+
...typeof assets.directory === "string" && assets.directory.length > 0 ? {} : { directory: "dist/client" },
|
|
645
|
+
...typeof assets.binding === "string" && assets.binding.length > 0 ? {} : { binding: "ASSETS" },
|
|
646
|
+
run_worker_first: protectedRouting
|
|
647
|
+
});
|
|
648
|
+
output = `${output.slice(0, assetsProperty.valueStart)}${updatedAssets}${output.slice(assetsProperty.valueEnd)}`;
|
|
649
|
+
}
|
|
650
|
+
}
|
|
294
651
|
if (options.cdnCache === "workers-cache") {
|
|
295
652
|
const cacheProperty = findTopLevelJsonProperty(output, "cache");
|
|
296
653
|
if (!cacheProperty) output = appendTopLevelJsonProperty(output, " \"cache\": { \"enabled\": true }");
|
|
@@ -321,17 +678,18 @@ function updateWranglerConfigForCloudflare(code, options, context = {}) {
|
|
|
321
678
|
}
|
|
322
679
|
if (options.dataCache === "kv") {
|
|
323
680
|
const kvProperty = findTopLevelJsonProperty(output, "kv_namespaces");
|
|
324
|
-
if (!kvProperty) output = appendTopLevelJsonProperty(output, " \"kv_namespaces\": [{ \"binding\": \"VINEXT_KV_CACHE\"
|
|
681
|
+
if (!kvProperty) output = appendTopLevelJsonProperty(output, " \"kv_namespaces\": [{ \"binding\": \"VINEXT_KV_CACHE\" }]");
|
|
325
682
|
else {
|
|
326
683
|
const rawValue = output.slice(kvProperty.valueStart, kvProperty.valueEnd);
|
|
327
684
|
if (!JSON.parse(stripJsonComments(rawValue)).some((namespace) => namespace.binding === "VINEXT_KV_CACHE")) {
|
|
328
685
|
const closing = kvProperty.valueEnd - 1;
|
|
329
686
|
const content = output.slice(kvProperty.valueStart + 1, closing);
|
|
330
687
|
const separator = content.trim() ? `${/,\s*$/.test(content) ? "" : ","}\n ` : "";
|
|
331
|
-
output = `${output.slice(0, closing)}${separator}{ "binding": "VINEXT_KV_CACHE"
|
|
688
|
+
output = `${output.slice(0, closing)}${separator}{ "binding": "VINEXT_KV_CACHE" }${output.slice(closing)}`;
|
|
332
689
|
}
|
|
333
690
|
}
|
|
334
691
|
}
|
|
692
|
+
if (options.cdnCache === "response-store") output = configureResponseStoreWrangler(output, config, options.responseStoreMode ?? "service-binding", context.root ?? process.cwd());
|
|
335
693
|
return output;
|
|
336
694
|
}
|
|
337
695
|
function getWranglerImagesBinding(code) {
|
|
@@ -340,6 +698,18 @@ function getWranglerImagesBinding(code) {
|
|
|
340
698
|
const images = JSON.parse(stripJsonComments(code.slice(property.valueStart, property.valueEnd)));
|
|
341
699
|
return images && typeof images.binding === "string" && images.binding.length > 0 ? images.binding : "IMAGES";
|
|
342
700
|
}
|
|
701
|
+
function getWranglerAssetsBinding(code) {
|
|
702
|
+
const property = findTopLevelJsonProperty(code, "assets");
|
|
703
|
+
if (!property) return "ASSETS";
|
|
704
|
+
const assets = JSON.parse(stripJsonComments(code.slice(property.valueStart, property.valueEnd)));
|
|
705
|
+
return assets && typeof assets.binding === "string" && assets.binding.length > 0 ? assets.binding : "ASSETS";
|
|
706
|
+
}
|
|
707
|
+
function getWranglerAssetsDirectory(code) {
|
|
708
|
+
const property = findTopLevelJsonProperty(code, "assets");
|
|
709
|
+
if (!property) return "dist/client";
|
|
710
|
+
const assets = JSON.parse(stripJsonComments(code.slice(property.valueStart, property.valueEnd)));
|
|
711
|
+
return assets && typeof assets.directory === "string" && assets.directory.length > 0 ? assets.directory : "dist/client";
|
|
712
|
+
}
|
|
343
713
|
function getWranglerVersionMetadataBinding(code) {
|
|
344
714
|
const property = findTopLevelJsonProperty(code, "version_metadata");
|
|
345
715
|
if (!property) return DEFAULT_VERSION_METADATA_BINDING;
|
|
@@ -349,40 +719,67 @@ function getWranglerVersionMetadataBinding(code) {
|
|
|
349
719
|
function cacheImports(options) {
|
|
350
720
|
const imports = [];
|
|
351
721
|
if (options.dataCache === "kv") imports.push("import { kvDataAdapter } from \"@vinext/cloudflare/cache/kv-data-adapter\";");
|
|
352
|
-
if (options.cdnCache === "workers-cache") imports.push("import {
|
|
722
|
+
if (options.cdnCache === "workers-cache") imports.push("import { workersCacheCdnAdapter } from \"@vinext/cloudflare/cache/workers-cache-cdn-adapter\";");
|
|
723
|
+
if (options.cdnCache === "static-assets") imports.push("import { staticAssetsAdapter } from \"@vinext/cloudflare/cache/static-assets-adapter\";");
|
|
724
|
+
if (options.cdnCache === "response-store") imports.push("import { responseStoreAdapter } from \"@vinext/cloudflare/cache/response-store-adapter\";");
|
|
353
725
|
if (options.imageOptimization === "cloudflare-images") imports.push("import { imagesOptimizer } from \"@vinext/cloudflare/images/images-optimizer\";");
|
|
354
726
|
return imports;
|
|
355
727
|
}
|
|
356
|
-
function vinextExpression(options, binding = "vinext", imageBinding = "imagesOptimizer", imagesBinding = "IMAGES",
|
|
728
|
+
function vinextExpression(options, binding = "vinext", imageBinding = "imagesOptimizer", imagesBinding = "IMAGES", versionMetadataBinding = DEFAULT_VERSION_METADATA_BINDING, responseStoreBinding = "responseStoreAdapter", assetsBinding = "ASSETS", assetsDirectory = "dist/client") {
|
|
729
|
+
const responseStore = options.cdnCache === "response-store";
|
|
357
730
|
const cacheEntries = [];
|
|
358
731
|
if (options.dataCache === "kv") cacheEntries.push("data: kvDataAdapter()");
|
|
359
732
|
if (options.cdnCache === "workers-cache") {
|
|
360
733
|
const adapterOptions = versionMetadataBinding === DEFAULT_VERSION_METADATA_BINDING ? "" : `{ versionMetadataBinding: ${JSON.stringify(versionMetadataBinding)} }`;
|
|
361
|
-
cacheEntries.push(`cdn:
|
|
734
|
+
cacheEntries.push(`cdn: workersCacheCdnAdapter(${adapterOptions})`);
|
|
735
|
+
}
|
|
736
|
+
if (options.cdnCache === "static-assets") {
|
|
737
|
+
const adapterOptions = assetsBinding === "ASSETS" ? "" : `{ binding: ${JSON.stringify(assetsBinding)} }`;
|
|
738
|
+
cacheEntries.push(`cdn: staticAssetsAdapter(${adapterOptions})`);
|
|
362
739
|
}
|
|
363
740
|
const optionEntries = [];
|
|
364
|
-
if (
|
|
741
|
+
if (responseStore) optionEntries.push(`cache: ${responseStoreBinding}(${options.responseStoreMode === "self-contained" ? "{ mode: \"self-contained\" }" : ""})`);
|
|
742
|
+
else if (cacheEntries.length > 0) optionEntries.push(`cache: { ${cacheEntries.join(", ")} }`);
|
|
743
|
+
if (options.cdnCache === "static-assets" || options.prerender) optionEntries.push("prerender: { routes: \"*\" }");
|
|
744
|
+
if (options.cdnCache === "static-assets") {
|
|
745
|
+
if (path.normalize(assetsDirectory) !== path.normalize("dist/client")) optionEntries.push(`clientOutDir: ${JSON.stringify(assetsDirectory)}`);
|
|
746
|
+
}
|
|
365
747
|
if (options.imageOptimization === "cloudflare-images") {
|
|
366
748
|
const adapterOptions = imagesBinding === "IMAGES" ? "" : `{ binding: ${JSON.stringify(imagesBinding)} }`;
|
|
367
749
|
optionEntries.push(`images: { optimizer: ${imageBinding}(${adapterOptions}) }`);
|
|
368
750
|
}
|
|
369
|
-
if (prerender) optionEntries.push(`prerender: { routes: "*" }`);
|
|
370
751
|
return optionEntries.length === 0 ? `${binding}()` : `${binding}({\n ${optionEntries.join(",\n ")},\n})`;
|
|
371
752
|
}
|
|
753
|
+
function scopedNameSource(indent, pathBinding = "path", hashBinding = "createHash", typescript = true) {
|
|
754
|
+
return `${indent}generateScopedName(${typescript ? "name: string, filename: string" : "name, filename"}) {
|
|
755
|
+
${indent} const relativePath = ${pathBinding}.relative(import.meta.dirname, filename.replace(/\\?.*$/, "")).replaceAll("\\\\", "/");
|
|
756
|
+
${indent} return \`_\${name}_\${${hashBinding}("sha256").update(relativePath).digest("hex").slice(0, 7)}\`;
|
|
757
|
+
${indent}}`;
|
|
758
|
+
}
|
|
759
|
+
function cssModulesConfigSource(indent = " ") {
|
|
760
|
+
return `\n${indent}css: {
|
|
761
|
+
${indent} modules: {
|
|
762
|
+
${scopedNameSource(`${indent} `)},
|
|
763
|
+
${indent} },
|
|
764
|
+
${indent}},`;
|
|
765
|
+
}
|
|
372
766
|
/** Generate vite.config.ts for App Router */
|
|
373
|
-
function generateAppRouterViteConfig(info, options = DEFAULT_CLOUDFLARE_INIT_OPTIONS, imagesBinding = "IMAGES",
|
|
767
|
+
function generateAppRouterViteConfig(info, options = DEFAULT_CLOUDFLARE_INIT_OPTIONS, imagesBinding = "IMAGES", versionMetadataBinding = DEFAULT_VERSION_METADATA_BINDING, serviceBinding = false, assetsBinding = "ASSETS", assetsDirectory = "dist/client", hasCssModules = false) {
|
|
374
768
|
const imports = [
|
|
375
769
|
`import { defineConfig } from "vite";`,
|
|
376
770
|
`import vinext from "vinext";`,
|
|
377
771
|
`import { cloudflare } from "@cloudflare/vite-plugin";`,
|
|
378
|
-
...
|
|
772
|
+
...serviceBinding ? ["import { responseStoreServiceBinding } from \"./cloudflare.config\";"] : [],
|
|
773
|
+
...cacheImports(options),
|
|
774
|
+
...hasCssModules ? ["import { createHash } from \"node:crypto\";", "import { patchCssModules } from \"vite-css-modules\";"] : []
|
|
379
775
|
];
|
|
380
|
-
if (info?.nativeModulesToStub && info.nativeModulesToStub.length > 0) imports.push(`import path from "node:path";`);
|
|
776
|
+
if (hasCssModules || info?.nativeModulesToStub && info.nativeModulesToStub.length > 0) imports.push(`import path from "node:path";`);
|
|
381
777
|
const plugins = [];
|
|
778
|
+
if (hasCssModules) plugins.push(" patchCssModules({ exportMode: \"default\" }),");
|
|
382
779
|
if (info?.hasMDX) plugins.push(` // vinext auto-injects @mdx-js/rollup with plugins from next.config`);
|
|
383
|
-
plugins.push(` ${vinextExpression(options, "vinext", "imagesOptimizer", imagesBinding,
|
|
780
|
+
plugins.push(` ${vinextExpression(options, "vinext", "imagesOptimizer", imagesBinding, versionMetadataBinding, "responseStoreAdapter", assetsBinding, assetsDirectory).replace(/\n/g, "\n ")},`);
|
|
384
781
|
plugins.push(` cloudflare({
|
|
385
|
-
viteEnvironment: {
|
|
782
|
+
${serviceBinding ? "auxiliaryWorkers: [{ config: responseStoreServiceBinding }],\n " : ""}viteEnvironment: {
|
|
386
783
|
name: "rsc",
|
|
387
784
|
childEnvironments: ["ssr"],
|
|
388
785
|
},
|
|
@@ -396,19 +793,22 @@ function generateAppRouterViteConfig(info, options = DEFAULT_CLOUDFLARE_INIT_OPT
|
|
|
396
793
|
export default defineConfig({
|
|
397
794
|
plugins: [
|
|
398
795
|
${plugins.join("\n")}
|
|
399
|
-
],${resolveBlock}
|
|
796
|
+
],${resolveBlock}${hasCssModules ? cssModulesConfigSource() : ""}
|
|
400
797
|
});
|
|
401
798
|
`;
|
|
402
799
|
}
|
|
403
800
|
/** Generate vite.config.ts for Pages Router */
|
|
404
|
-
function generatePagesRouterViteConfig(info, options = DEFAULT_CLOUDFLARE_INIT_OPTIONS, imagesBinding = "IMAGES",
|
|
801
|
+
function generatePagesRouterViteConfig(info, options = DEFAULT_CLOUDFLARE_INIT_OPTIONS, imagesBinding = "IMAGES", versionMetadataBinding = DEFAULT_VERSION_METADATA_BINDING, serviceBinding = false, hasCssModules = false, assetsBinding = "ASSETS", assetsDirectory = "dist/client") {
|
|
802
|
+
const legacyStaticAssets = options.legacyWrangler && options.cdnCache === "static-assets";
|
|
405
803
|
const imports = [
|
|
406
804
|
`import { defineConfig } from "vite";`,
|
|
407
805
|
`import vinext from "vinext";`,
|
|
408
806
|
`import { cloudflare } from "@cloudflare/vite-plugin";`,
|
|
409
|
-
...
|
|
807
|
+
...serviceBinding ? ["import { responseStoreServiceBinding } from \"./cloudflare.config\";"] : [],
|
|
808
|
+
...cacheImports(options),
|
|
809
|
+
...hasCssModules ? ["import { createHash } from \"node:crypto\";", "import { patchCssModules } from \"vite-css-modules\";"] : []
|
|
410
810
|
];
|
|
411
|
-
if (info?.nativeModulesToStub && info.nativeModulesToStub.length > 0) imports.push(`import path from "node:path";`);
|
|
811
|
+
if (hasCssModules || info?.nativeModulesToStub && info.nativeModulesToStub.length > 0) imports.push(`import path from "node:path";`);
|
|
412
812
|
let resolveBlock = "";
|
|
413
813
|
const aliases = [];
|
|
414
814
|
if (info?.nativeModulesToStub && info.nativeModulesToStub.length > 0) for (const mod of info.nativeModulesToStub) aliases.push(` "${mod}": path.resolve(__dirname, "empty-stub.js"),`);
|
|
@@ -416,10 +816,10 @@ function generatePagesRouterViteConfig(info, options = DEFAULT_CLOUDFLARE_INIT_O
|
|
|
416
816
|
return `${imports.join("\n")}
|
|
417
817
|
|
|
418
818
|
export default defineConfig({
|
|
419
|
-
plugins: [
|
|
420
|
-
${vinextExpression(options, "vinext", "imagesOptimizer", imagesBinding,
|
|
421
|
-
cloudflare(),
|
|
422
|
-
],${resolveBlock}
|
|
819
|
+
${legacyStaticAssets ? ` environments: { client: { build: { outDir: ${JSON.stringify(assetsDirectory)} } }, ssr: { build: { outDir: "dist/server" } } },\n` : ""} plugins: [
|
|
820
|
+
${hasCssModules ? " patchCssModules({ exportMode: \"default\" }),\n" : ""} ${vinextExpression(options, "vinext", "imagesOptimizer", imagesBinding, versionMetadataBinding, "responseStoreAdapter", assetsBinding, assetsDirectory).replace(/\n/g, "\n ")},
|
|
821
|
+
cloudflare(${legacyStaticAssets ? "{ viteEnvironment: { name: \"ssr\" } }" : serviceBinding ? "{ auxiliaryWorkers: [{ config: responseStoreServiceBinding }] }" : ""}),
|
|
822
|
+
],${resolveBlock}${hasCssModules ? cssModulesConfigSource() : ""}
|
|
423
823
|
});
|
|
424
824
|
`;
|
|
425
825
|
}
|
|
@@ -555,14 +955,17 @@ function allocateBinding(bindings, preferred) {
|
|
|
555
955
|
}
|
|
556
956
|
function findImportedBinding(program, source, imported) {
|
|
557
957
|
for (const statement of program.body) {
|
|
558
|
-
if (statement.type !== "ImportDeclaration" || statement.source.value !== source) continue;
|
|
559
|
-
for (const specifier of statement.specifiers) if (specifier.type === "ImportSpecifier" && specifier.imported.type === "Identifier" && specifier.imported.name === imported) return specifier.local.name;
|
|
958
|
+
if (statement.type !== "ImportDeclaration" || statement.importKind === "type" || statement.source.value !== source) continue;
|
|
959
|
+
for (const specifier of statement.specifiers) if (specifier.type === "ImportSpecifier" && specifier.importKind !== "type" && specifier.imported.type === "Identifier" && specifier.imported.name === imported) return specifier.local.name;
|
|
560
960
|
}
|
|
561
961
|
}
|
|
962
|
+
function quoteImportSource(program, source) {
|
|
963
|
+
return program.body.find((statement) => statement.type === "ImportDeclaration")?.source.raw?.startsWith("'") ? `'${source.replaceAll("\\", "\\\\").replaceAll("'", "\\'")}'` : JSON.stringify(source);
|
|
964
|
+
}
|
|
562
965
|
function ensureNamedImport(program, output, source, imported, binding) {
|
|
563
966
|
const existing = findImportedBinding(program, source, imported);
|
|
564
967
|
if (existing) return existing;
|
|
565
|
-
const declaration = program.body.find((statement) => statement.type === "ImportDeclaration" && statement.source.value === source);
|
|
968
|
+
const declaration = program.body.find((statement) => statement.type === "ImportDeclaration" && statement.importKind !== "type" && statement.source.value === source);
|
|
566
969
|
if (declaration) {
|
|
567
970
|
const named = declaration.specifiers.filter((specifier) => specifier.type === "ImportSpecifier");
|
|
568
971
|
if (named.length > 0) {
|
|
@@ -572,15 +975,15 @@ function ensureNamedImport(program, output, source, imported, binding) {
|
|
|
572
975
|
}
|
|
573
976
|
}
|
|
574
977
|
const offset = importInsertionOffset(program);
|
|
575
|
-
const sourceText = `import { ${binding === imported ? imported : `${imported} as ${binding}`} } from ${
|
|
978
|
+
const sourceText = `import { ${binding === imported ? imported : `${imported} as ${binding}`} } from ${quoteImportSource(program, source)};`;
|
|
576
979
|
output.appendLeft(offset, offset === 0 ? `${sourceText}\n` : `\n${sourceText}`);
|
|
577
980
|
return binding;
|
|
578
981
|
}
|
|
579
982
|
function ensureDefaultImport(program, output, source, binding) {
|
|
580
|
-
const existing = program.body.find((statement) => statement.type === "ImportDeclaration" && statement.source.value === source)?.specifiers.find((specifier) => specifier.type === "ImportDefaultSpecifier");
|
|
983
|
+
const existing = program.body.find((statement) => statement.type === "ImportDeclaration" && statement.importKind !== "type" && statement.source.value === source)?.specifiers.find((specifier) => specifier.type === "ImportDefaultSpecifier");
|
|
581
984
|
if (existing) return existing.local.name;
|
|
582
985
|
const offset = importInsertionOffset(program);
|
|
583
|
-
const sourceText = `import ${binding} from ${
|
|
986
|
+
const sourceText = `import ${binding} from ${quoteImportSource(program, source)};`;
|
|
584
987
|
output.appendLeft(offset, offset === 0 ? `${sourceText}\n` : `\n${sourceText}`);
|
|
585
988
|
return binding;
|
|
586
989
|
}
|
|
@@ -619,11 +1022,50 @@ function ensureDefaultRequire(program, output, source, binding) {
|
|
|
619
1022
|
output.appendLeft(offset, offset === 0 ? `${sourceText}\n` : `\n${sourceText}`);
|
|
620
1023
|
return binding;
|
|
621
1024
|
}
|
|
1025
|
+
const insertedCommas = /* @__PURE__ */ new WeakMap();
|
|
622
1026
|
function insertObjectProperty(output, object, source, code) {
|
|
623
1027
|
const offset = object.end - 1;
|
|
624
|
-
const
|
|
625
|
-
|
|
626
|
-
|
|
1028
|
+
const lastProperty = object.properties.at(-1);
|
|
1029
|
+
if (lastProperty) {
|
|
1030
|
+
const gap = code.slice(lastProperty.end, offset);
|
|
1031
|
+
if (!endsWithCommaIgnoringWhitespaceAndComments(gap) && !insertedCommas.get(output)?.has(lastProperty.end)) {
|
|
1032
|
+
if (/^[ \t]+$/.test(gap)) output.update(lastProperty.end, offset, ",");
|
|
1033
|
+
else output.appendLeft(lastProperty.end, ",");
|
|
1034
|
+
const offsets = insertedCommas.get(output) ?? /* @__PURE__ */ new Set();
|
|
1035
|
+
offsets.add(lastProperty.end);
|
|
1036
|
+
insertedCommas.set(output, offsets);
|
|
1037
|
+
}
|
|
1038
|
+
}
|
|
1039
|
+
output.appendLeft(offset, `\n${source}\n`);
|
|
1040
|
+
}
|
|
1041
|
+
function formatInlineConfig(filePath, code, originalCode) {
|
|
1042
|
+
if (code === originalCode) return code;
|
|
1043
|
+
const config = findConfigObject(parseViteConfig(filePath, code));
|
|
1044
|
+
if (!config || config.properties.length === 0) return code;
|
|
1045
|
+
const output = new MagicString(code);
|
|
1046
|
+
const lineStart = code.lastIndexOf("\n", config.start) + 1;
|
|
1047
|
+
const indent = code.slice(lineStart, config.start).match(/^[ \t]*/)?.[0] ?? "";
|
|
1048
|
+
const properties = config.properties;
|
|
1049
|
+
const first = properties[0];
|
|
1050
|
+
const opening = code.slice(config.start + 1, first.start);
|
|
1051
|
+
if (/^[ \t]*$/.test(opening)) {
|
|
1052
|
+
if (opening) output.update(config.start + 1, first.start, `\n${indent} `);
|
|
1053
|
+
else output.appendLeft(first.start, `\n${indent} `);
|
|
1054
|
+
}
|
|
1055
|
+
for (let index = 1; index < properties.length; index++) {
|
|
1056
|
+
const previous = properties[index - 1];
|
|
1057
|
+
const current = properties[index];
|
|
1058
|
+
const gap = code.slice(previous.end, current.start);
|
|
1059
|
+
if (/^,[ \t]*$/.test(gap)) output.update(previous.end, current.start, `,\n${indent} `);
|
|
1060
|
+
}
|
|
1061
|
+
const last = properties.at(-1);
|
|
1062
|
+
const closing = code.slice(last.end, config.end - 1);
|
|
1063
|
+
if (/^,?[ \t]*$/.test(closing)) {
|
|
1064
|
+
const replacement = `${closing.includes(",") ? "," : ""}\n${indent}`;
|
|
1065
|
+
if (closing) output.update(last.end, config.end - 1, replacement);
|
|
1066
|
+
else output.appendLeft(last.end, replacement);
|
|
1067
|
+
}
|
|
1068
|
+
return output.toString();
|
|
627
1069
|
}
|
|
628
1070
|
function endsWithCommaIgnoringWhitespaceAndComments(code) {
|
|
629
1071
|
let index = 0;
|
|
@@ -701,6 +1143,11 @@ function getVinextCacheSlot(call, name) {
|
|
|
701
1143
|
if (cache?.value.type !== "ObjectExpression") return void 0;
|
|
702
1144
|
return findProperty(cache.value, name);
|
|
703
1145
|
}
|
|
1146
|
+
function getVinextCacheOption(call) {
|
|
1147
|
+
const firstArgument = call?.arguments[0];
|
|
1148
|
+
if (!firstArgument || firstArgument.type === "SpreadElement" || firstArgument.type !== "ObjectExpression") return;
|
|
1149
|
+
return findProperty(firstArgument, "cache");
|
|
1150
|
+
}
|
|
704
1151
|
function hasVinextCacheSlot(call, name) {
|
|
705
1152
|
return Boolean(getVinextCacheSlot(call, name));
|
|
706
1153
|
}
|
|
@@ -711,11 +1158,6 @@ function getVinextImageOptimizer(call) {
|
|
|
711
1158
|
if (images?.value.type !== "ObjectExpression") return void 0;
|
|
712
1159
|
return findProperty(images.value, "optimizer");
|
|
713
1160
|
}
|
|
714
|
-
function hasVinextPrerender(call) {
|
|
715
|
-
const firstArgument = call?.arguments[0];
|
|
716
|
-
if (!firstArgument || firstArgument.type === "SpreadElement" || firstArgument.type !== "ObjectExpression") return false;
|
|
717
|
-
return Boolean(findProperty(firstArgument, "prerender"));
|
|
718
|
-
}
|
|
719
1161
|
function isUsableImageOptimizer(property) {
|
|
720
1162
|
if (!property) return false;
|
|
721
1163
|
const value = property.value;
|
|
@@ -745,6 +1187,17 @@ function ensureVinextCache(output, config, vinextBinding, additions, code) {
|
|
|
745
1187
|
const missing = additions.filter(({ name }) => !findProperty(cacheObject, name));
|
|
746
1188
|
if (missing.length > 0) insertObjectProperty(output, cacheObject, missing.map(({ name, expression }) => ` ${name}: ${expression},`).join("\n"), code);
|
|
747
1189
|
}
|
|
1190
|
+
function ensureVinextResponseStore(output, config, vinextBinding, expression, code) {
|
|
1191
|
+
if (!expression) return;
|
|
1192
|
+
const call = findPluginCall(config, vinextBinding);
|
|
1193
|
+
const firstArgument = call?.arguments[0];
|
|
1194
|
+
if (!call || !firstArgument || firstArgument.type === "SpreadElement") return;
|
|
1195
|
+
if (firstArgument.type !== "ObjectExpression") throw new Error("The vinext() plugin options must be a static object for vinext init to configure Workers Response Store.");
|
|
1196
|
+
const optionsObject = firstArgument;
|
|
1197
|
+
const cache = findProperty(optionsObject, "cache");
|
|
1198
|
+
if (!cache) insertObjectProperty(output, optionsObject, ` cache: ${expression},`, code);
|
|
1199
|
+
else if (cache.value.type === "ObjectExpression" && cache.value.properties.length === 0) output.overwrite(cache.value.start, cache.value.end, expression);
|
|
1200
|
+
}
|
|
748
1201
|
function ensureVinextImageOptimizer(output, config, vinextBinding, expression, code) {
|
|
749
1202
|
if (!expression) return;
|
|
750
1203
|
const call = findPluginCall(config, vinextBinding);
|
|
@@ -767,17 +1220,28 @@ function ensureVinextImageOptimizer(output, config, vinextBinding, expression, c
|
|
|
767
1220
|
if (!optimizer) insertObjectProperty(output, imagesObject, ` optimizer: ${expression},`, code);
|
|
768
1221
|
else output.overwrite(optimizer.value.start, optimizer.value.end, expression);
|
|
769
1222
|
}
|
|
770
|
-
function
|
|
771
|
-
if (!prerender) return;
|
|
1223
|
+
function ensureVinextPrerenderOptions(output, config, vinextBinding, assetsDirectory, code) {
|
|
772
1224
|
const call = findPluginCall(config, vinextBinding);
|
|
773
|
-
|
|
774
|
-
if (call.
|
|
775
|
-
|
|
776
|
-
|
|
1225
|
+
const firstArgument = call?.arguments[0];
|
|
1226
|
+
if (!call || !firstArgument || firstArgument.type === "SpreadElement") return;
|
|
1227
|
+
if (firstArgument.type !== "ObjectExpression") throw new Error("The vinext() plugin options must be a static object for vinext init to configure build-time prerendering.");
|
|
1228
|
+
const optionsObject = firstArgument;
|
|
1229
|
+
const additions = [];
|
|
1230
|
+
const prerender = findProperty(optionsObject, "prerender");
|
|
1231
|
+
if (!prerender) additions.push(" prerender: { routes: \"*\" },");
|
|
1232
|
+
else {
|
|
1233
|
+
const value = prerender.value;
|
|
1234
|
+
if (value.type === "Literal" && (value.value === false || value.value === null) || value.type === "Identifier" && value.name === "undefined") output.overwrite(value.start, value.end, "{ routes: \"*\" }");
|
|
777
1235
|
}
|
|
778
|
-
const
|
|
779
|
-
if (
|
|
780
|
-
|
|
1236
|
+
const clientOutDir = assetsDirectory && findProperty(optionsObject, "clientOutDir");
|
|
1237
|
+
if (assetsDirectory && !clientOutDir) {
|
|
1238
|
+
if (path.normalize(assetsDirectory) !== path.normalize("dist/client")) additions.push(` clientOutDir: ${JSON.stringify(assetsDirectory)},`);
|
|
1239
|
+
} else if (assetsDirectory && clientOutDir) {
|
|
1240
|
+
const value = clientOutDir.value;
|
|
1241
|
+
if (value.type !== "Literal" || typeof value.value !== "string") throw new Error("The vinext() clientOutDir option must be a string literal for vinext init to align it with Wrangler assets.directory.");
|
|
1242
|
+
if (path.normalize(value.value) !== path.normalize(assetsDirectory)) throw new Error(`The vinext() clientOutDir (${JSON.stringify(value.value)}) must match Wrangler assets.directory (${JSON.stringify(assetsDirectory)}) when using the Static Assets cache.`);
|
|
1243
|
+
}
|
|
1244
|
+
if (additions.length > 0) insertObjectProperty(output, optionsObject, additions.join("\n"), code);
|
|
781
1245
|
}
|
|
782
1246
|
function indentBlock(source, indent) {
|
|
783
1247
|
return source.split("\n").map((line) => `${indent}${line}`).join("\n");
|
|
@@ -790,8 +1254,9 @@ function ensurePlugins(output, config, additions, code) {
|
|
|
790
1254
|
}
|
|
791
1255
|
if (plugins.value.type !== "ArrayExpression") throw new Error("The Vite config's plugins option must be an array for vinext init to update it.");
|
|
792
1256
|
const array = plugins.value;
|
|
793
|
-
const propertyIndent = code.slice(0, plugins.start).split("\n").at(-1)?.match(
|
|
794
|
-
const
|
|
1257
|
+
const propertyIndent = code.slice(0, plugins.start).split("\n").at(-1)?.match(/^[ \t]*/)?.[0] ?? "";
|
|
1258
|
+
const inlinePropertyIndent = code.slice(config.start, plugins.start).includes("\n") ? propertyIndent : `${propertyIndent} `;
|
|
1259
|
+
const elementIndent = `${inlinePropertyIndent} `;
|
|
795
1260
|
const missingExpressions = [];
|
|
796
1261
|
for (const addition of additions) if (!array.elements.some((element) => element?.type === "CallExpression" && element.callee.type === "Identifier" && element.callee.name === addition.binding)) missingExpressions.push(addition.expression);
|
|
797
1262
|
if (missingExpressions.length === 0) return;
|
|
@@ -820,7 +1285,91 @@ function ensurePlugins(output, config, additions, code) {
|
|
|
820
1285
|
previousElement = element;
|
|
821
1286
|
}
|
|
822
1287
|
}
|
|
823
|
-
output.appendLeft(closingOffset, `${prefix}\n${missingExpressions.map((expression) => indentBlock(expression, elementIndent)).join(",\n")},\n${
|
|
1288
|
+
output.appendLeft(closingOffset, `${prefix}\n${missingExpressions.map((expression) => indentBlock(expression, elementIndent)).join(",\n")},\n${inlinePropertyIndent}`);
|
|
1289
|
+
}
|
|
1290
|
+
function simpleCssConfig(program) {
|
|
1291
|
+
const value = program.body.find((statement) => statement.type === "ExportDefaultDeclaration")?.declaration;
|
|
1292
|
+
const direct = value && value.type !== "FunctionDeclaration" && value.type !== "ClassDeclaration" ? unwrapObject(value) : void 0;
|
|
1293
|
+
if (direct) return direct;
|
|
1294
|
+
if (value?.type === "CallExpression" && value.callee.type === "Identifier" && value.callee.name === findImportedBinding(program, "vite", "defineConfig") && value.arguments[0]?.type === "ObjectExpression") return value.arguments[0];
|
|
1295
|
+
throw new Error("CSS Modules require an inline Vite config object (export default { ... } or defineConfig({ ... })). Convert a dynamic config to an inline object before running vinext init, or finish migration manually with patchCssModules({ exportMode: \"default\" }) and a deterministic css.modules.generateScopedName.");
|
|
1296
|
+
}
|
|
1297
|
+
function simpleProperties(object) {
|
|
1298
|
+
const names = /* @__PURE__ */ new Set();
|
|
1299
|
+
for (const property of object.properties) {
|
|
1300
|
+
const name = property.type === "Property" ? propertyName(property) : void 0;
|
|
1301
|
+
if (!name || property.type !== "Property" || property.kind !== "init" || names.has(name)) throw new Error("CSS Modules cannot safely update Vite config spreads, computed keys, accessors, or duplicate properties. Add patchCssModules({ exportMode: \"default\" }) before vinext() and a deterministic css.modules.generateScopedName manually.");
|
|
1302
|
+
names.add(name);
|
|
1303
|
+
}
|
|
1304
|
+
}
|
|
1305
|
+
function updateViteConfigForCssModules(filePath, code) {
|
|
1306
|
+
const program = parseViteConfig(filePath, code);
|
|
1307
|
+
const config = simpleCssConfig(program);
|
|
1308
|
+
simpleProperties(config);
|
|
1309
|
+
const css = findProperty(config, "css");
|
|
1310
|
+
const cssObject = css?.value.type === "ObjectExpression" ? css.value : void 0;
|
|
1311
|
+
if (css && !cssObject) throw new Error("CSS Modules require a literal css config object.");
|
|
1312
|
+
if (cssObject) simpleProperties(cssObject);
|
|
1313
|
+
const modules = cssObject && findProperty(cssObject, "modules");
|
|
1314
|
+
const modulesObject = modules?.value.type === "ObjectExpression" ? modules.value : void 0;
|
|
1315
|
+
if (modules && !modulesObject) throw new Error("CSS Modules require a literal css.modules object.");
|
|
1316
|
+
if (modulesObject) simpleProperties(modulesObject);
|
|
1317
|
+
const existingName = modulesObject && findProperty(modulesObject, "generateScopedName");
|
|
1318
|
+
if (existingName) {
|
|
1319
|
+
const value = existingName.value;
|
|
1320
|
+
if (value.type !== "FunctionExpression" && value.type !== "ArrowFunctionExpression" && !(value.type === "Literal" && typeof value.value === "string" && !/\[hash(?::[^\]]*)?\]/i.test(value.value))) throw new Error("CSS Modules need a deterministic generateScopedName function; replace the existing hash template or dynamic value manually.");
|
|
1321
|
+
}
|
|
1322
|
+
const firstOutput = new MagicString(code);
|
|
1323
|
+
if (!existingName) {
|
|
1324
|
+
const bindings = collectTopLevelBindings(program);
|
|
1325
|
+
const hashBinding = ensureNamedImport(program, firstOutput, "node:crypto", "createHash", allocateBinding(bindings, "createHash"));
|
|
1326
|
+
const source = scopedNameSource(" ", ensureDefaultImport(program, firstOutput, "node:path", allocateBinding(bindings, "path")), hashBinding, [
|
|
1327
|
+
".ts",
|
|
1328
|
+
".mts",
|
|
1329
|
+
".cts"
|
|
1330
|
+
].includes(path.extname(filePath)));
|
|
1331
|
+
if (modulesObject) insertObjectProperty(firstOutput, modulesObject, `${source},`, code);
|
|
1332
|
+
else if (cssObject) insertObjectProperty(firstOutput, cssObject, ` modules: {\n${source},\n },`, code);
|
|
1333
|
+
else insertObjectProperty(firstOutput, config, ` css: {\n modules: {\n${source},\n },\n },`, code);
|
|
1334
|
+
}
|
|
1335
|
+
const withCss = firstOutput.toString();
|
|
1336
|
+
const nextProgram = parseViteConfig(filePath, withCss);
|
|
1337
|
+
const nextConfig = simpleCssConfig(nextProgram);
|
|
1338
|
+
const plugins = findProperty(nextConfig, "plugins");
|
|
1339
|
+
const pluginArray = plugins?.value.type === "ArrayExpression" ? plugins.value : void 0;
|
|
1340
|
+
if (plugins && !pluginArray) throw new Error("CSS Modules require a literal plugins array.");
|
|
1341
|
+
if (pluginArray?.elements.some((element) => element?.type === "SpreadElement")) throw new Error("CSS Modules cannot safely update a plugins array containing spreads.");
|
|
1342
|
+
if (pluginArray?.elements.some((element) => element && element.type !== "CallExpression")) throw new Error("CSS Modules require direct plugin calls in the plugins array.");
|
|
1343
|
+
const existingBinding = findImportedBinding(nextProgram, "vite-css-modules", "patchCssModules");
|
|
1344
|
+
const namespaceBinding = nextProgram.body.filter((statement) => statement.type === "ImportDeclaration" && statement.importKind !== "type" && statement.source.value === "vite-css-modules").flatMap((statement) => statement.specifiers).find((specifier) => specifier.type === "ImportNamespaceSpecifier")?.local.name;
|
|
1345
|
+
const existingCall = pluginArray?.elements.find((element) => element?.type === "CallExpression" && (element.callee.type === "Identifier" && element.callee.name === (existingBinding ?? "patchCssModules") || element.callee.type === "MemberExpression" && !element.callee.computed && element.callee.property.type === "Identifier" && element.callee.property.name === "patchCssModules"));
|
|
1346
|
+
if (existingCall?.type === "CallExpression") {
|
|
1347
|
+
const callee = existingCall.callee;
|
|
1348
|
+
if (callee.type === "Identifier" && callee.name !== existingBinding || callee.type === "MemberExpression" && (callee.object.type !== "Identifier" || callee.object.name !== namespaceBinding)) throw new Error("Import patchCssModules from \"vite-css-modules\" before configuring CSS Modules.");
|
|
1349
|
+
const argument = existingCall.arguments[0];
|
|
1350
|
+
if (argument?.type === "ObjectExpression") simpleProperties(argument);
|
|
1351
|
+
const mode = argument?.type === "ObjectExpression" ? findProperty(argument, "exportMode") : void 0;
|
|
1352
|
+
if (argument?.type !== "ObjectExpression" || argument.properties.some((property) => property.type !== "Property" || property.computed) || mode?.value.type !== "Literal" || mode.value.value !== "default") throw new Error("Set the existing patchCssModules plugin to exportMode: \"default\" for CSS classes named \"default\".");
|
|
1353
|
+
} else {
|
|
1354
|
+
const output = new MagicString(withCss);
|
|
1355
|
+
const expression = `${ensureNamedImport(nextProgram, output, "vite-css-modules", "patchCssModules", allocateBinding(collectTopLevelBindings(nextProgram), "patchCssModules"))}({ exportMode: "default" })`;
|
|
1356
|
+
if (!pluginArray) insertObjectProperty(output, nextConfig, ` plugins: [${expression}],`, withCss);
|
|
1357
|
+
else {
|
|
1358
|
+
const first = pluginArray.elements.find(Boolean);
|
|
1359
|
+
output.appendLeft(first ? first.start : pluginArray.end - 1, first ? `${expression}, ` : expression);
|
|
1360
|
+
}
|
|
1361
|
+
const updated = output.toString();
|
|
1362
|
+
parseViteConfig(filePath, updated);
|
|
1363
|
+
return {
|
|
1364
|
+
code: formatInlineConfig(filePath, updated, code),
|
|
1365
|
+
preservedExistingGenerateScopedName: Boolean(existingName)
|
|
1366
|
+
};
|
|
1367
|
+
}
|
|
1368
|
+
parseViteConfig(filePath, withCss);
|
|
1369
|
+
return {
|
|
1370
|
+
code: formatInlineConfig(filePath, withCss, code),
|
|
1371
|
+
preservedExistingGenerateScopedName: Boolean(existingName)
|
|
1372
|
+
};
|
|
824
1373
|
}
|
|
825
1374
|
function ensureNativeAliases(output, config, modules, pathBinding, code) {
|
|
826
1375
|
if (modules.length === 0) return;
|
|
@@ -845,11 +1394,7 @@ function ensureNativeAliases(output, config, modules, pathBinding, code) {
|
|
|
845
1394
|
}
|
|
846
1395
|
function updateViteConfigForCloudflare(filePath, code, options) {
|
|
847
1396
|
const program = parseViteConfig(filePath, code);
|
|
848
|
-
const cacheOptions = options.cache ??
|
|
849
|
-
dataCache: "none",
|
|
850
|
-
cdnCache: "workers-cache",
|
|
851
|
-
imageOptimization: "cloudflare-images"
|
|
852
|
-
};
|
|
1397
|
+
const cacheOptions = options.cache ?? DEFAULT_CLOUDFLARE_INIT_OPTIONS;
|
|
853
1398
|
const config = findConfigObject(program);
|
|
854
1399
|
if (!config) throw new Error(`Could not find a static Vite config object in ${path.basename(filePath)}. Use an object export or defineConfig({...}) so vinext init can update it.`);
|
|
855
1400
|
const output = new MagicString(code);
|
|
@@ -859,9 +1404,45 @@ function updateViteConfigForCloudflare(filePath, code, options) {
|
|
|
859
1404
|
const vinextBinding = commonJs ? ensureDefaultRequire(program, output, "vinext", vinextLocal) : ensureDefaultImport(program, output, "vinext", vinextLocal);
|
|
860
1405
|
const existingVinextCall = findPluginCall(config, vinextBinding);
|
|
861
1406
|
const existingImageOptimizer = getVinextImageOptimizer(existingVinextCall);
|
|
862
|
-
const needsPrerender = Boolean(options.prerender && !hasVinextPrerender(existingVinextCall));
|
|
863
1407
|
const configureCaches = options.cache !== void 0;
|
|
1408
|
+
const existingCache = getVinextCacheOption(existingVinextCall);
|
|
1409
|
+
if (configureCaches && existingCache) {
|
|
1410
|
+
const cacheObject = existingCache.value.type === "ObjectExpression" ? existingCache.value : void 0;
|
|
1411
|
+
if (!cacheObject && cacheOptions.cdnCache !== "response-store" || cacheObject && (cacheOptions.cdnCache === "none" || cacheOptions.cdnCache === "data-cache") && findProperty(cacheObject, "cdn") || cacheObject && cacheOptions.dataCache === "none" && findProperty(cacheObject, "data")) throw new Error("The existing vinext() cache configuration does not match the selected cache options. Remove it before rerunning vinext init.");
|
|
1412
|
+
}
|
|
864
1413
|
const cacheAdditions = [];
|
|
1414
|
+
let responseStoreExpression;
|
|
1415
|
+
let responseStoreBinding = "responseStoreAdapter";
|
|
1416
|
+
if (configureCaches && cacheOptions.cdnCache === "response-store") {
|
|
1417
|
+
const source = "@vinext/cloudflare/cache/response-store-adapter";
|
|
1418
|
+
const imported = "responseStoreAdapter";
|
|
1419
|
+
const existing = commonJs ? findRequiredBinding(program, source, imported) : findImportedBinding(program, source, imported);
|
|
1420
|
+
const cache = getVinextCacheOption(existingVinextCall);
|
|
1421
|
+
const alreadyConfigured = Boolean(existing && cache?.value.type === "CallExpression" && cache.value.callee.type === "Identifier" && cache.value.callee.name === existing);
|
|
1422
|
+
if (cache && !alreadyConfigured && !(cache.value.type === "ObjectExpression" && cache.value.properties.length === 0)) throw new Error("The vinext() cache option is already configured. Remove it before configuring Workers Response Store.");
|
|
1423
|
+
if (!cache || alreadyConfigured || cache.value.type === "ObjectExpression" && cache.value.properties.length === 0) {
|
|
1424
|
+
const local = existing ?? allocateBinding(bindings, imported);
|
|
1425
|
+
const binding = commonJs ? ensureNamedRequire(program, output, source, imported, local) : ensureNamedImport(program, output, source, imported, local);
|
|
1426
|
+
responseStoreBinding = binding;
|
|
1427
|
+
responseStoreExpression = `${binding}(${cacheOptions.responseStoreMode === "self-contained" ? "{ mode: \"self-contained\" }" : ""})`;
|
|
1428
|
+
if (alreadyConfigured && cache) {
|
|
1429
|
+
const call = cache.value;
|
|
1430
|
+
const argument = call.arguments[0];
|
|
1431
|
+
const mode = cacheOptions.responseStoreMode ?? "service-binding";
|
|
1432
|
+
if (!argument) {
|
|
1433
|
+
if (mode === "self-contained") output.appendLeft(call.end - 1, "{ mode: \"self-contained\" }");
|
|
1434
|
+
} else if (argument.type === "ObjectExpression") {
|
|
1435
|
+
const optionsObject = argument;
|
|
1436
|
+
const existingMode = findProperty(optionsObject, "mode");
|
|
1437
|
+
if (existingMode) {
|
|
1438
|
+
if (existingMode.shorthand) output.overwrite(existingMode.start, existingMode.end, `mode: ${JSON.stringify(mode)}`);
|
|
1439
|
+
else output.overwrite(existingMode.value.start, existingMode.value.end, JSON.stringify(mode));
|
|
1440
|
+
} else if (mode === "self-contained") insertObjectProperty(output, optionsObject, " mode: \"self-contained\",", code);
|
|
1441
|
+
} else throw new Error("responseStoreAdapter() options must be a static object for vinext init to update its mode.");
|
|
1442
|
+
responseStoreExpression = void 0;
|
|
1443
|
+
}
|
|
1444
|
+
}
|
|
1445
|
+
}
|
|
865
1446
|
if (cacheOptions.dataCache === "kv" && !hasVinextCacheSlot(existingVinextCall, "data")) {
|
|
866
1447
|
const local = (commonJs ? findRequiredBinding(program, "@vinext/cloudflare/cache/kv-data-adapter", "kvDataAdapter") : findImportedBinding(program, "@vinext/cloudflare/cache/kv-data-adapter", "kvDataAdapter")) ?? allocateBinding(bindings, "kvDataAdapter");
|
|
867
1448
|
const binding = commonJs ? ensureNamedRequire(program, output, "@vinext/cloudflare/cache/kv-data-adapter", "kvDataAdapter", local) : ensureNamedImport(program, output, "@vinext/cloudflare/cache/kv-data-adapter", "kvDataAdapter", local);
|
|
@@ -871,12 +1452,15 @@ function updateViteConfigForCloudflare(filePath, code, options) {
|
|
|
871
1452
|
});
|
|
872
1453
|
}
|
|
873
1454
|
if (configureCaches && cacheOptions.cdnCache === "workers-cache") {
|
|
874
|
-
const imported = "cdnAdapter";
|
|
875
|
-
const source = "@vinext/cloudflare/cache/cdn-adapter";
|
|
876
|
-
const existing = commonJs ? findRequiredBinding(program, source, imported) : findImportedBinding(program, source, imported);
|
|
877
1455
|
const existingCdnSlot = getVinextCacheSlot(existingVinextCall, "cdn");
|
|
878
|
-
const
|
|
879
|
-
|
|
1456
|
+
const existingCallee = existingCdnSlot?.value.type === "CallExpression" && existingCdnSlot.value.callee.type === "Identifier" ? existingCdnSlot.value.callee.name : void 0;
|
|
1457
|
+
const adapterImports = [["@vinext/cloudflare/cache/workers-cache-cdn-adapter", "workersCacheCdnAdapter"], ["@vinext/cloudflare/cache/cdn-adapter", "cdnAdapter"]].map(([source, imported]) => ({
|
|
1458
|
+
source,
|
|
1459
|
+
imported,
|
|
1460
|
+
local: commonJs ? findRequiredBinding(program, source, imported) : findImportedBinding(program, source, imported)
|
|
1461
|
+
}));
|
|
1462
|
+
const { source, imported, local: existing } = adapterImports.find(({ local }) => local && local === existingCallee) ?? adapterImports[0];
|
|
1463
|
+
if (!existingCdnSlot || Boolean(existing && existingCallee === existing)) {
|
|
880
1464
|
const local = existing ?? allocateBinding(bindings, imported);
|
|
881
1465
|
const expression = `${commonJs ? ensureNamedRequire(program, output, source, imported, local) : ensureNamedImport(program, output, source, imported, local)}(${options.versionMetadataBinding && options.versionMetadataBinding !== DEFAULT_VERSION_METADATA_BINDING ? `{ versionMetadataBinding: ${JSON.stringify(options.versionMetadataBinding)} }` : ""})`;
|
|
882
1466
|
if (existingCdnSlot) output.overwrite(existingCdnSlot.value.start, existingCdnSlot.value.end, expression);
|
|
@@ -886,6 +1470,23 @@ function updateViteConfigForCloudflare(filePath, code, options) {
|
|
|
886
1470
|
});
|
|
887
1471
|
}
|
|
888
1472
|
}
|
|
1473
|
+
if (configureCaches && cacheOptions.cdnCache === "static-assets") {
|
|
1474
|
+
const imported = "staticAssetsAdapter";
|
|
1475
|
+
const source = "@vinext/cloudflare/cache/static-assets-adapter";
|
|
1476
|
+
const existing = commonJs ? findRequiredBinding(program, source, imported) : findImportedBinding(program, source, imported);
|
|
1477
|
+
const existingCdnSlot = getVinextCacheSlot(existingVinextCall, "cdn");
|
|
1478
|
+
const existingUsesStaticAssets = Boolean(existing && existingCdnSlot?.value.type === "CallExpression" && existingCdnSlot.value.callee.type === "Identifier" && existingCdnSlot.value.callee.name === existing);
|
|
1479
|
+
if (existingCdnSlot && !existingUsesStaticAssets) throw new Error("The existing vinext() CDN cache adapter does not match the selected Static Assets cache. Remove it before rerunning vinext init.");
|
|
1480
|
+
if (!existingCdnSlot || existingUsesStaticAssets) {
|
|
1481
|
+
const local = existing ?? allocateBinding(bindings, imported);
|
|
1482
|
+
const expression = `${commonJs ? ensureNamedRequire(program, output, source, imported, local) : ensureNamedImport(program, output, source, imported, local)}(${options.assetsBinding && options.assetsBinding !== "ASSETS" ? `{ binding: ${JSON.stringify(options.assetsBinding)} }` : ""})`;
|
|
1483
|
+
if (existingCdnSlot) output.overwrite(existingCdnSlot.value.start, existingCdnSlot.value.end, expression);
|
|
1484
|
+
else cacheAdditions.push({
|
|
1485
|
+
name: "cdn",
|
|
1486
|
+
expression
|
|
1487
|
+
});
|
|
1488
|
+
}
|
|
1489
|
+
}
|
|
889
1490
|
let imageOptimizerExpression;
|
|
890
1491
|
if (cacheOptions.imageOptimization === "cloudflare-images") {
|
|
891
1492
|
const source = "@vinext/cloudflare/images/images-optimizer";
|
|
@@ -899,37 +1500,44 @@ function updateViteConfigForCloudflare(filePath, code, options) {
|
|
|
899
1500
|
const cloudflareLocal = (commonJs ? findRequiredBinding(program, "@cloudflare/vite-plugin", "cloudflare") : findImportedBinding(program, "@cloudflare/vite-plugin", "cloudflare")) ?? allocateBinding(bindings, "cloudflare");
|
|
900
1501
|
const cloudflareBinding = commonJs ? ensureNamedRequire(program, output, "@cloudflare/vite-plugin", "cloudflare", cloudflareLocal) : ensureNamedImport(program, output, "@cloudflare/vite-plugin", "cloudflare", cloudflareLocal);
|
|
901
1502
|
ensurePlugins(output, config, [{
|
|
902
|
-
expression: existingVinextCall ? `${vinextBinding}()` : options.cache
|
|
1503
|
+
expression: existingVinextCall ? `${vinextBinding}()` : options.cache ? vinextExpression(cacheOptions, vinextBinding, imageOptimizerExpression?.slice(0, imageOptimizerExpression.indexOf("(")) || "imagesOptimizer", options.imagesBinding, options.versionMetadataBinding, responseStoreBinding, options.assetsBinding, options.assetsDirectory) : `${vinextBinding}()`,
|
|
903
1504
|
binding: vinextBinding
|
|
904
1505
|
}, {
|
|
905
1506
|
expression: cloudflarePluginExpression(options.isAppRouter, cloudflareBinding),
|
|
906
1507
|
binding: cloudflareBinding
|
|
907
1508
|
}], code);
|
|
908
1509
|
ensureCloudflareViteEnvironment(output, config, cloudflareBinding, options.isAppRouter, code);
|
|
909
|
-
if (existingVinextCall)
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
1510
|
+
if (existingVinextCall) {
|
|
1511
|
+
if (existingVinextCall.arguments.length === 0 && (responseStoreExpression || cacheAdditions.length > 0 || imageOptimizerExpression || cacheOptions.cdnCache === "static-assets" || cacheOptions.prerender)) {
|
|
1512
|
+
const properties = [];
|
|
1513
|
+
if (responseStoreExpression) properties.push(`cache: ${responseStoreExpression}`);
|
|
1514
|
+
else if (cacheAdditions.length > 0) properties.push(`cache: { ${cacheAdditions.map(({ name, expression }) => `${name}: ${expression}`).join(", ")} }`);
|
|
1515
|
+
if (imageOptimizerExpression) properties.push(`images: { optimizer: ${imageOptimizerExpression} }`);
|
|
1516
|
+
if (cacheOptions.cdnCache === "static-assets" || cacheOptions.prerender) properties.push("prerender: { routes: \"*\" }");
|
|
1517
|
+
if (cacheOptions.cdnCache === "static-assets") {
|
|
1518
|
+
if (options.assetsDirectory && path.normalize(options.assetsDirectory) !== path.normalize("dist/client")) properties.push(`clientOutDir: ${JSON.stringify(options.assetsDirectory)}`);
|
|
1519
|
+
}
|
|
1520
|
+
const plugins = findProperty(config, "plugins");
|
|
1521
|
+
const closingIndent = `${plugins ? code.slice(0, plugins.start).split("\n").at(-1)?.match(/^\s*/)?.[0] ?? "" : ""} `;
|
|
1522
|
+
const propertyEntryIndent = `${closingIndent} `;
|
|
1523
|
+
output.appendLeft(existingVinextCall.end - 1, `{\n${propertyEntryIndent}${properties.join(`,\n${propertyEntryIndent}`)},\n${closingIndent}}`);
|
|
1524
|
+
} else {
|
|
1525
|
+
ensureVinextResponseStore(output, config, vinextBinding, responseStoreExpression, code);
|
|
1526
|
+
ensureVinextCache(output, config, vinextBinding, cacheAdditions, code);
|
|
1527
|
+
ensureVinextImageOptimizer(output, config, vinextBinding, imageOptimizerExpression, code);
|
|
1528
|
+
if (cacheOptions.cdnCache === "static-assets" || cacheOptions.prerender) ensureVinextPrerenderOptions(output, config, vinextBinding, cacheOptions.cdnCache === "static-assets" ? options.assetsDirectory ?? "dist/client" : void 0, code);
|
|
1529
|
+
}
|
|
922
1530
|
}
|
|
923
1531
|
if (options.nativeModulesToStub.length > 0) {
|
|
924
1532
|
const pathLocal = (commonJs ? findRequiredBinding(program, "node:path", "default") : program.body.filter((statement) => statement.type === "ImportDeclaration").find((statement) => statement.source.value === "node:path")?.specifiers.find((specifier) => specifier.type === "ImportDefaultSpecifier")?.local.name) ?? allocateBinding(bindings, "path");
|
|
925
1533
|
const pathBinding = commonJs ? ensureDefaultRequire(program, output, "node:path", pathLocal) : ensureDefaultImport(program, output, "node:path", pathLocal);
|
|
926
1534
|
ensureNativeAliases(output, config, options.nativeModulesToStub, pathBinding, code);
|
|
927
1535
|
}
|
|
928
|
-
return output.toString();
|
|
1536
|
+
return formatInlineConfig(filePath, output.toString(), code);
|
|
929
1537
|
}
|
|
930
1538
|
function usesCommonJsViteConfig(filePath, code) {
|
|
931
1539
|
if (/\.(?:cjs|cts)$/.test(filePath)) return true;
|
|
932
1540
|
return parseViteConfig(filePath, code).body.some((statement) => statement.type === "ExpressionStatement" && statement.expression.type === "AssignmentExpression" && statement.expression.left.type === "MemberExpression" && statement.expression.left.object.type === "Identifier" && statement.expression.left.object.name === "module" && statement.expression.left.property.type === "Identifier" && statement.expression.left.property.name === "exports");
|
|
933
1541
|
}
|
|
934
1542
|
//#endregion
|
|
935
|
-
export { generateAppRouterViteConfig, generatePagesRouterViteConfig, generateWranglerConfig, getWranglerImagesBinding, getWranglerVersionMetadataBinding, setupCloudflarePlatform, updateViteConfigForCloudflare, updateWranglerConfigForCloudflare, usesCommonJsViteConfig, validateCloudflarePlatformSetup };
|
|
1543
|
+
export { compactResourceName, cssModulesConfigSource, generateAppRouterViteConfig, generatePagesRouterViteConfig, generateResponseStoreWranglerConfig, generateWranglerConfig, getWranglerImagesBinding, getWranglerVersionMetadataBinding, setupCloudflarePlatform, updateViteConfigForCloudflare, updateViteConfigForCssModules, updateWranglerConfigForCloudflare, usesCommonJsViteConfig, validateCloudflarePlatformSetup };
|