vinext 0.0.49 → 0.0.51
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/dist/build/client-build-config.js.map +1 -1
- package/dist/build/google-fonts/build-url.js.map +1 -1
- package/dist/build/google-fonts/fallback-metrics-data.js +14031 -0
- package/dist/build/google-fonts/fallback-metrics-data.js.map +1 -0
- package/dist/build/google-fonts/fallback-metrics.d.ts +13 -0
- package/dist/build/google-fonts/fallback-metrics.js +46 -0
- package/dist/build/google-fonts/fallback-metrics.js.map +1 -0
- package/dist/build/google-fonts/get-axes.js.map +1 -1
- package/dist/build/google-fonts/sort-variants.js.map +1 -1
- package/dist/build/google-fonts/validate.js.map +1 -1
- package/dist/build/layout-classification.js.map +1 -1
- package/dist/build/nitro-route-rules.js.map +1 -1
- package/dist/build/precompress.d.ts +13 -2
- package/dist/build/precompress.js +12 -3
- package/dist/build/precompress.js.map +1 -1
- package/dist/build/prerender.d.ts +17 -1
- package/dist/build/prerender.js +114 -23
- package/dist/build/prerender.js.map +1 -1
- package/dist/build/report.d.ts +5 -4
- package/dist/build/report.js +196 -348
- package/dist/build/report.js.map +1 -1
- package/dist/build/route-classification-injector.js.map +1 -1
- package/dist/build/route-classification-manifest.js.map +1 -1
- package/dist/build/run-prerender.js.map +1 -1
- package/dist/build/server-manifest.js.map +1 -1
- package/dist/build/ssr-manifest.js.map +1 -1
- package/dist/build/standalone.js.map +1 -1
- package/dist/build/static-export.js.map +1 -1
- package/dist/check.js +2 -1
- package/dist/check.js.map +1 -1
- package/dist/cli-args.js.map +1 -1
- package/dist/cli.js +68 -7
- package/dist/cli.js.map +1 -1
- package/dist/client/instrumentation-client-state.js.map +1 -1
- package/dist/client/validate-module-path.js.map +1 -1
- package/dist/client/vinext-next-data.d.ts +5 -1
- package/dist/client/window-next.d.ts +151 -0
- package/dist/client/window-next.js +48 -0
- package/dist/client/window-next.js.map +1 -0
- package/dist/cloudflare/kv-cache-handler.js.map +1 -1
- package/dist/cloudflare/tpr.js +2 -1
- package/dist/cloudflare/tpr.js.map +1 -1
- package/dist/config/config-matchers.d.ts +3 -1
- package/dist/config/config-matchers.js +5 -4
- package/dist/config/config-matchers.js.map +1 -1
- package/dist/config/dotenv.d.ts +11 -1
- package/dist/config/dotenv.js.map +1 -1
- package/dist/config/next-config.d.ts +93 -6
- package/dist/config/next-config.js +233 -6
- package/dist/config/next-config.js.map +1 -1
- package/dist/config/tsconfig-paths.d.ts +13 -0
- package/dist/config/tsconfig-paths.js +117 -0
- package/dist/config/tsconfig-paths.js.map +1 -0
- package/dist/deploy.js +16 -7
- package/dist/deploy.js.map +1 -1
- package/dist/entries/app-browser-entry.d.ts +3 -1
- package/dist/entries/app-browser-entry.js +36 -2
- package/dist/entries/app-browser-entry.js.map +1 -1
- package/dist/entries/app-rsc-entry.d.ts +19 -1
- package/dist/entries/app-rsc-entry.js +49 -12
- package/dist/entries/app-rsc-entry.js.map +1 -1
- package/dist/entries/app-rsc-manifest.d.ts +9 -0
- package/dist/entries/app-rsc-manifest.js +8 -1
- package/dist/entries/app-rsc-manifest.js.map +1 -1
- package/dist/entries/app-ssr-entry.js.map +1 -1
- package/dist/entries/pages-client-entry.js +3 -5
- package/dist/entries/pages-client-entry.js.map +1 -1
- package/dist/entries/pages-entry-helpers.js.map +1 -1
- package/dist/entries/pages-server-entry.js +34 -1
- package/dist/entries/pages-server-entry.js.map +1 -1
- package/dist/entries/runtime-entry-module.js.map +1 -1
- package/dist/index.js +204 -53
- package/dist/index.js.map +1 -1
- package/dist/init.js.map +1 -1
- package/dist/plugins/async-hooks-stub.js.map +1 -1
- package/dist/plugins/client-reference-dedup.d.ts +15 -2
- package/dist/plugins/client-reference-dedup.js +138 -16
- package/dist/plugins/client-reference-dedup.js.map +1 -1
- package/dist/plugins/fonts.d.ts +2 -2
- package/dist/plugins/fonts.js +15 -6
- package/dist/plugins/fonts.js.map +1 -1
- package/dist/plugins/instrumentation-client.js.map +1 -1
- package/dist/plugins/og-assets.js.map +1 -1
- package/dist/plugins/optimize-imports.js.map +1 -1
- package/dist/plugins/postcss.js.map +1 -1
- package/dist/plugins/rsc-client-reference-loaders.d.ts +7 -0
- package/dist/plugins/rsc-client-reference-loaders.js +48 -0
- package/dist/plugins/rsc-client-reference-loaders.js.map +1 -0
- package/dist/plugins/rsc-client-shim-excludes.js.map +1 -1
- package/dist/plugins/sass.d.ts +34 -0
- package/dist/plugins/sass.js +22 -0
- package/dist/plugins/sass.js.map +1 -0
- package/dist/plugins/server-externals-manifest.js.map +1 -1
- package/dist/plugins/strip-server-exports.js.map +1 -1
- package/dist/routing/app-route-graph.d.ts +78 -6
- package/dist/routing/app-route-graph.js +241 -25
- package/dist/routing/app-route-graph.js.map +1 -1
- package/dist/routing/app-router.js.map +1 -1
- package/dist/routing/file-matcher.js.map +1 -1
- package/dist/routing/pages-router.js.map +1 -1
- package/dist/routing/route-matching.js.map +1 -1
- package/dist/routing/route-pattern.d.ts +56 -1
- package/dist/routing/route-pattern.js +60 -1
- package/dist/routing/route-pattern.js.map +1 -1
- package/dist/routing/route-trie.js.map +1 -1
- package/dist/routing/route-validation.js.map +1 -1
- package/dist/routing/utils.js.map +1 -1
- package/dist/server/api-handler.js.map +1 -1
- package/dist/server/app-browser-action-result.d.ts +44 -0
- package/dist/server/app-browser-action-result.js +79 -0
- package/dist/server/app-browser-action-result.js.map +1 -0
- package/dist/server/app-browser-entry.js +330 -133
- package/dist/server/app-browser-entry.js.map +1 -1
- package/dist/server/app-browser-error.js.map +1 -1
- package/dist/server/app-browser-hydration.d.ts +31 -0
- package/dist/server/app-browser-hydration.js +30 -0
- package/dist/server/app-browser-hydration.js.map +1 -0
- package/dist/server/app-browser-navigation-controller.d.ts +20 -4
- package/dist/server/app-browser-navigation-controller.js +90 -23
- package/dist/server/app-browser-navigation-controller.js.map +1 -1
- package/dist/server/app-browser-popstate.d.ts +16 -0
- package/dist/server/app-browser-popstate.js +17 -0
- package/dist/server/app-browser-popstate.js.map +1 -0
- package/dist/server/app-browser-rsc-redirect.d.ts +28 -0
- package/dist/server/app-browser-rsc-redirect.js +37 -0
- package/dist/server/app-browser-rsc-redirect.js.map +1 -0
- package/dist/server/app-browser-state.d.ts +27 -23
- package/dist/server/app-browser-state.js +158 -54
- package/dist/server/app-browser-state.js.map +1 -1
- package/dist/server/app-browser-stream.d.ts +9 -4
- package/dist/server/app-browser-stream.js +29 -8
- package/dist/server/app-browser-stream.js.map +1 -1
- package/dist/server/app-browser-visible-commit.d.ts +11 -1
- package/dist/server/app-browser-visible-commit.js +69 -21
- package/dist/server/app-browser-visible-commit.js.map +1 -1
- package/dist/server/app-client-reference-preloader.js.map +1 -1
- package/dist/server/app-elements-wire.d.ts +43 -6
- package/dist/server/app-elements-wire.js +121 -5
- package/dist/server/app-elements-wire.js.map +1 -1
- package/dist/server/app-elements.d.ts +2 -2
- package/dist/server/app-elements.js +2 -2
- package/dist/server/app-elements.js.map +1 -1
- package/dist/server/app-fallback-renderer.d.ts +10 -1
- package/dist/server/app-fallback-renderer.js +37 -1
- package/dist/server/app-fallback-renderer.js.map +1 -1
- package/dist/server/app-history-state.d.ts +26 -0
- package/dist/server/app-history-state.js +53 -0
- package/dist/server/app-history-state.js.map +1 -0
- package/dist/server/app-hook-warning-suppression.js.map +1 -1
- package/dist/server/app-middleware.d.ts +1 -1
- package/dist/server/app-middleware.js +4 -9
- package/dist/server/app-middleware.js.map +1 -1
- package/dist/server/app-mounted-slots-header.js.map +1 -1
- package/dist/server/app-page-boundary-render.d.ts +11 -1
- package/dist/server/app-page-boundary-render.js +27 -19
- package/dist/server/app-page-boundary-render.js.map +1 -1
- package/dist/server/app-page-boundary.d.ts +1 -0
- package/dist/server/app-page-boundary.js +10 -7
- package/dist/server/app-page-boundary.js.map +1 -1
- package/dist/server/app-page-cache.d.ts +23 -3
- package/dist/server/app-page-cache.js +63 -27
- package/dist/server/app-page-cache.js.map +1 -1
- package/dist/server/app-page-dispatch.d.ts +11 -1
- package/dist/server/app-page-dispatch.js +85 -14
- package/dist/server/app-page-dispatch.js.map +1 -1
- package/dist/server/app-page-element-builder.d.ts +10 -1
- package/dist/server/app-page-element-builder.js +38 -6
- package/dist/server/app-page-element-builder.js.map +1 -1
- package/dist/server/app-page-execution.js +2 -3
- package/dist/server/app-page-execution.js.map +1 -1
- package/dist/server/app-page-head.d.ts +7 -0
- package/dist/server/app-page-head.js +6 -1
- package/dist/server/app-page-head.js.map +1 -1
- package/dist/server/app-page-method.js.map +1 -1
- package/dist/server/app-page-params.js.map +1 -1
- package/dist/server/app-page-probe.d.ts +23 -1
- package/dist/server/app-page-probe.js +29 -1
- package/dist/server/app-page-probe.js.map +1 -1
- package/dist/server/app-page-render-observation.d.ts +35 -0
- package/dist/server/app-page-render-observation.js +68 -0
- package/dist/server/app-page-render-observation.js.map +1 -0
- package/dist/server/app-page-render.d.ts +12 -2
- package/dist/server/app-page-render.js +90 -7
- package/dist/server/app-page-render.js.map +1 -1
- package/dist/server/app-page-request.d.ts +1 -0
- package/dist/server/app-page-request.js +2 -1
- package/dist/server/app-page-request.js.map +1 -1
- package/dist/server/app-page-response.d.ts +2 -0
- package/dist/server/app-page-response.js +18 -7
- package/dist/server/app-page-response.js.map +1 -1
- package/dist/server/app-page-route-wiring.d.ts +9 -3
- package/dist/server/app-page-route-wiring.js +91 -62
- package/dist/server/app-page-route-wiring.js.map +1 -1
- package/dist/server/app-page-segment-state.d.ts +10 -0
- package/dist/server/app-page-segment-state.js +87 -0
- package/dist/server/app-page-segment-state.js.map +1 -0
- package/dist/server/app-page-stream.d.ts +9 -2
- package/dist/server/app-page-stream.js +4 -1
- package/dist/server/app-page-stream.js.map +1 -1
- package/dist/server/app-post-middleware-context.js.map +1 -1
- package/dist/server/app-prerender-endpoints.js.map +1 -1
- package/dist/server/app-prerender-static-params.js.map +1 -1
- package/dist/server/app-render-dependency.js.map +1 -1
- package/dist/server/app-request-context.js.map +1 -1
- package/dist/server/app-route-handler-cache.js.map +1 -1
- package/dist/server/app-route-handler-dispatch.js +3 -1
- package/dist/server/app-route-handler-dispatch.js.map +1 -1
- package/dist/server/app-route-handler-execution.js.map +1 -1
- package/dist/server/app-route-handler-policy.js +1 -0
- package/dist/server/app-route-handler-policy.js.map +1 -1
- package/dist/server/app-route-handler-response.js +4 -3
- package/dist/server/app-route-handler-response.js.map +1 -1
- package/dist/server/app-route-handler-runtime.js.map +1 -1
- package/dist/server/app-router-entry.js +7 -15
- package/dist/server/app-router-entry.js.map +1 -1
- package/dist/server/app-rsc-cache-busting.d.ts +23 -2
- package/dist/server/app-rsc-cache-busting.js +75 -19
- package/dist/server/app-rsc-cache-busting.js.map +1 -1
- package/dist/server/app-rsc-embedded-chunks.d.ts +9 -0
- package/dist/server/app-rsc-embedded-chunks.js +34 -0
- package/dist/server/app-rsc-embedded-chunks.js.map +1 -0
- package/dist/server/app-rsc-error-handler.js.map +1 -1
- package/dist/server/app-rsc-errors.d.ts +4 -1
- package/dist/server/app-rsc-errors.js +1 -1
- package/dist/server/app-rsc-errors.js.map +1 -1
- package/dist/server/app-rsc-handler.d.ts +18 -1
- package/dist/server/app-rsc-handler.js +55 -16
- package/dist/server/app-rsc-handler.js.map +1 -1
- package/dist/server/app-rsc-render-mode.d.ts +11 -0
- package/dist/server/app-rsc-render-mode.js +21 -0
- package/dist/server/app-rsc-render-mode.js.map +1 -0
- package/dist/server/app-rsc-request-normalization.d.ts +4 -1
- package/dist/server/app-rsc-request-normalization.js +7 -2
- package/dist/server/app-rsc-request-normalization.js.map +1 -1
- package/dist/server/app-rsc-response-finalizer.d.ts +2 -1
- package/dist/server/app-rsc-response-finalizer.js +6 -1
- package/dist/server/app-rsc-response-finalizer.js.map +1 -1
- package/dist/server/app-rsc-route-matching.d.ts +23 -0
- package/dist/server/app-rsc-route-matching.js +45 -23
- package/dist/server/app-rsc-route-matching.js.map +1 -1
- package/dist/server/app-segment-config.js.map +1 -1
- package/dist/server/app-server-action-execution.d.ts +51 -5
- package/dist/server/app-server-action-execution.js +161 -51
- package/dist/server/app-server-action-execution.js.map +1 -1
- package/dist/server/app-ssr-entry.d.ts +7 -0
- package/dist/server/app-ssr-entry.js +44 -14
- package/dist/server/app-ssr-entry.js.map +1 -1
- package/dist/server/app-ssr-error-meta.d.ts +14 -0
- package/dist/server/app-ssr-error-meta.js +50 -0
- package/dist/server/app-ssr-error-meta.js.map +1 -0
- package/dist/server/app-ssr-stream.d.ts +1 -1
- package/dist/server/app-ssr-stream.js +9 -12
- package/dist/server/app-ssr-stream.js.map +1 -1
- package/dist/server/app-static-generation.js.map +1 -1
- package/dist/server/artifact-compatibility.d.ts +12 -2
- package/dist/server/artifact-compatibility.js +12 -8
- package/dist/server/artifact-compatibility.js.map +1 -1
- package/dist/server/cache-control.js +1 -0
- package/dist/server/cache-control.js.map +1 -1
- package/dist/server/cache-proof.d.ts +124 -5
- package/dist/server/cache-proof.js +416 -18
- package/dist/server/cache-proof.js.map +1 -1
- package/dist/server/csp.js.map +1 -1
- package/dist/server/dev-error-overlay-store.js.map +1 -1
- package/dist/server/dev-error-overlay.js +5 -0
- package/dist/server/dev-error-overlay.js.map +1 -1
- package/dist/server/dev-lockfile.d.ts +110 -0
- package/dist/server/dev-lockfile.js +180 -0
- package/dist/server/dev-lockfile.js.map +1 -0
- package/dist/server/dev-module-runner.js.map +1 -1
- package/dist/server/dev-origin-check.js.map +1 -1
- package/dist/server/dev-route-files.js.map +1 -1
- package/dist/server/dev-server.js +23 -10
- package/dist/server/dev-server.js.map +1 -1
- package/dist/server/file-based-metadata.d.ts +13 -0
- package/dist/server/file-based-metadata.js +49 -2
- package/dist/server/file-based-metadata.js.map +1 -1
- package/dist/server/headers.d.ts +81 -0
- package/dist/server/headers.js +104 -0
- package/dist/server/headers.js.map +1 -0
- package/dist/server/html.js +1 -1
- package/dist/server/html.js.map +1 -1
- package/dist/server/http-error-responses.d.ts +10 -0
- package/dist/server/http-error-responses.js +11 -1
- package/dist/server/http-error-responses.js.map +1 -1
- package/dist/server/image-optimization.d.ts +11 -1
- package/dist/server/image-optimization.js.map +1 -1
- package/dist/server/implicit-tags.js +2 -1
- package/dist/server/implicit-tags.js.map +1 -1
- package/dist/server/instrumentation-runtime.js.map +1 -1
- package/dist/server/instrumentation.js.map +1 -1
- package/dist/server/isr-cache.d.ts +12 -2
- package/dist/server/isr-cache.js +16 -5
- package/dist/server/isr-cache.js.map +1 -1
- package/dist/server/metadata-route-build-data.js.map +1 -1
- package/dist/server/metadata-route-response.js +22 -5
- package/dist/server/metadata-route-response.js.map +1 -1
- package/dist/server/metadata-routes.js +27 -8
- package/dist/server/metadata-routes.js.map +1 -1
- package/dist/server/middleware-matcher.js.map +1 -1
- package/dist/server/middleware-request-headers.d.ts +4 -1
- package/dist/server/middleware-request-headers.js +15 -8
- package/dist/server/middleware-request-headers.js.map +1 -1
- package/dist/server/middleware-response-headers.d.ts +2 -1
- package/dist/server/middleware-response-headers.js +1 -1
- package/dist/server/middleware-response-headers.js.map +1 -1
- package/dist/server/middleware-runtime.d.ts +1 -0
- package/dist/server/middleware-runtime.js +7 -3
- package/dist/server/middleware-runtime.js.map +1 -1
- package/dist/server/middleware.d.ts +12 -0
- package/dist/server/middleware.js +12 -0
- package/dist/server/middleware.js.map +1 -1
- package/dist/server/navigation-planner.d.ts +133 -0
- package/dist/server/navigation-planner.js +432 -0
- package/dist/server/navigation-planner.js.map +1 -0
- package/dist/server/navigation-trace.d.ts +19 -2
- package/dist/server/navigation-trace.js +20 -1
- package/dist/server/navigation-trace.js.map +1 -1
- package/dist/server/next-error-digest.d.ts +3 -2
- package/dist/server/next-error-digest.js +4 -2
- package/dist/server/next-error-digest.js.map +1 -1
- package/dist/server/normalize-path.d.ts +2 -1
- package/dist/server/normalize-path.js +4 -1
- package/dist/server/normalize-path.js.map +1 -1
- package/dist/server/pages-api-route.js +1 -0
- package/dist/server/pages-api-route.js.map +1 -1
- package/dist/server/pages-i18n.js.map +1 -1
- package/dist/server/pages-media-type.js.map +1 -1
- package/dist/server/pages-node-compat.js.map +1 -1
- package/dist/server/pages-page-data.d.ts +3 -2
- package/dist/server/pages-page-data.js +27 -5
- package/dist/server/pages-page-data.js.map +1 -1
- package/dist/server/pages-page-response.js +2 -1
- package/dist/server/pages-page-response.js.map +1 -1
- package/dist/server/prerender-work-unit-setup.js +1 -1
- package/dist/server/prerender-work-unit-setup.js.map +1 -1
- package/dist/server/prod-server.d.ts +28 -1
- package/dist/server/prod-server.js +97 -22
- package/dist/server/prod-server.js.map +1 -1
- package/dist/server/request-log.js.map +1 -1
- package/dist/server/request-pipeline.d.ts +1 -13
- package/dist/server/request-pipeline.js +3 -25
- package/dist/server/request-pipeline.js.map +1 -1
- package/dist/server/rsc-stream-hints.js.map +1 -1
- package/dist/server/seed-cache.js.map +1 -1
- package/dist/server/server-action-not-found.d.ts +16 -3
- package/dist/server/server-action-not-found.js +22 -4
- package/dist/server/server-action-not-found.js.map +1 -1
- package/dist/server/server-globals.d.ts +5 -0
- package/dist/server/server-globals.js +37 -0
- package/dist/server/server-globals.js.map +1 -0
- package/dist/server/socket-error-backstop.js.map +1 -1
- package/dist/server/static-file-cache.js +1 -1
- package/dist/server/static-file-cache.js.map +1 -1
- package/dist/server/worker-utils.d.ts +0 -7
- package/dist/server/worker-utils.js +3 -2
- package/dist/server/worker-utils.js.map +1 -1
- package/dist/shims/amp.js.map +1 -1
- package/dist/shims/app.d.ts +37 -4
- package/dist/shims/app.js +50 -1
- package/dist/shims/app.js.map +1 -0
- package/dist/shims/cache-for-request.js.map +1 -1
- package/dist/shims/cache-runtime.d.ts +19 -2
- package/dist/shims/cache-runtime.js +87 -19
- package/dist/shims/cache-runtime.js.map +1 -1
- package/dist/shims/cache.d.ts +20 -21
- package/dist/shims/cache.js +101 -15
- package/dist/shims/cache.js.map +1 -1
- package/dist/shims/client-hook-error.js.map +1 -1
- package/dist/shims/compat-router.js.map +1 -1
- package/dist/shims/config.js.map +1 -1
- package/dist/shims/constants.js.map +1 -1
- package/dist/shims/document.js.map +1 -1
- package/dist/shims/dynamic.d.ts +18 -10
- package/dist/shims/dynamic.js +107 -51
- package/dist/shims/dynamic.js.map +1 -1
- package/dist/shims/error-boundary.d.ts +35 -6
- package/dist/shims/error-boundary.js +116 -33
- package/dist/shims/error-boundary.js.map +1 -1
- package/dist/shims/error.d.ts +18 -1
- package/dist/shims/error.js +56 -1
- package/dist/shims/error.js.map +1 -1
- package/dist/shims/fetch-cache.d.ts +25 -1
- package/dist/shims/fetch-cache.js +159 -13
- package/dist/shims/fetch-cache.js.map +1 -1
- package/dist/shims/font-google-base.d.ts +22 -8
- package/dist/shims/font-google-base.js +41 -71
- package/dist/shims/font-google-base.js.map +1 -1
- package/dist/shims/font-local.d.ts +3 -20
- package/dist/shims/font-local.js +23 -75
- package/dist/shims/font-local.js.map +1 -1
- package/dist/shims/font-utils.d.ts +51 -0
- package/dist/shims/font-utils.js +97 -0
- package/dist/shims/font-utils.js.map +1 -0
- package/dist/shims/form.js +3 -1
- package/dist/shims/form.js.map +1 -1
- package/dist/shims/hash-scroll.d.ts +7 -0
- package/dist/shims/hash-scroll.js +30 -0
- package/dist/shims/hash-scroll.js.map +1 -0
- package/dist/shims/head-state.js.map +1 -1
- package/dist/shims/head.d.ts +3 -1
- package/dist/shims/head.js +28 -16
- package/dist/shims/head.js.map +1 -1
- package/dist/shims/headers.d.ts +11 -12
- package/dist/shims/headers.js +45 -8
- package/dist/shims/headers.js.map +1 -1
- package/dist/shims/i18n-context.js.map +1 -1
- package/dist/shims/i18n-state.js.map +1 -1
- package/dist/shims/image-config.d.ts +14 -1
- package/dist/shims/image-config.js +24 -1
- package/dist/shims/image-config.js.map +1 -1
- package/dist/shims/image.d.ts +1 -0
- package/dist/shims/image.js +159 -80
- package/dist/shims/image.js.map +1 -1
- package/dist/shims/internal/als-registry.js.map +1 -1
- package/dist/shims/internal/app-router-context.d.ts +7 -6
- package/dist/shims/internal/app-router-context.js +17 -6
- package/dist/shims/internal/app-router-context.js.map +1 -1
- package/dist/shims/internal/cookie-serialize.js.map +1 -1
- package/dist/shims/internal/make-hanging-promise.d.ts +1 -1
- package/dist/shims/internal/make-hanging-promise.js +1 -1
- package/dist/shims/internal/make-hanging-promise.js.map +1 -1
- package/dist/shims/internal/parse-cookie-header.js.map +1 -1
- package/dist/shims/internal/utils.js.map +1 -1
- package/dist/shims/internal/work-unit-async-storage.js +2 -2
- package/dist/shims/internal/work-unit-async-storage.js.map +1 -1
- package/dist/shims/layout-segment-context.js.map +1 -1
- package/dist/shims/legacy-image.js.map +1 -1
- package/dist/shims/link-prefetch.d.ts +42 -0
- package/dist/shims/link-prefetch.js +45 -0
- package/dist/shims/link-prefetch.js.map +1 -0
- package/dist/shims/link.d.ts +37 -4
- package/dist/shims/link.js +156 -46
- package/dist/shims/link.js.map +1 -1
- package/dist/shims/metadata.d.ts +16 -30
- package/dist/shims/metadata.js +87 -28
- package/dist/shims/metadata.js.map +1 -1
- package/dist/shims/navigation-state.js.map +1 -1
- package/dist/shims/navigation.d.ts +172 -10
- package/dist/shims/navigation.js +335 -70
- package/dist/shims/navigation.js.map +1 -1
- package/dist/shims/navigation.react-server.d.ts +3 -2
- package/dist/shims/navigation.react-server.js +5 -2
- package/dist/shims/navigation.react-server.js.map +1 -1
- package/dist/shims/offline.js.map +1 -1
- package/dist/shims/pages-router-runtime.d.ts +7 -0
- package/dist/shims/pages-router-runtime.js +16 -0
- package/dist/shims/pages-router-runtime.js.map +1 -0
- package/dist/shims/readonly-url-search-params.js.map +1 -1
- package/dist/shims/request-context.js.map +1 -1
- package/dist/shims/root-params.js.map +1 -1
- package/dist/shims/router-state.js.map +1 -1
- package/dist/shims/router.d.ts +69 -7
- package/dist/shims/router.js +232 -249
- package/dist/shims/router.js.map +1 -1
- package/dist/shims/script-nonce-context.js.map +1 -1
- package/dist/shims/script.js +110 -32
- package/dist/shims/script.js.map +1 -1
- package/dist/shims/server.js +12 -15
- package/dist/shims/server.js.map +1 -1
- package/dist/shims/slot.d.ts +7 -1
- package/dist/shims/slot.js +60 -7
- package/dist/shims/slot.js.map +1 -1
- package/dist/shims/thenable-params.js.map +1 -1
- package/dist/shims/unified-request-context.js +5 -0
- package/dist/shims/unified-request-context.js.map +1 -1
- package/dist/shims/unrecognized-action-error.d.ts +35 -0
- package/dist/shims/unrecognized-action-error.js +41 -0
- package/dist/shims/unrecognized-action-error.js.map +1 -0
- package/dist/shims/url-safety.js.map +1 -1
- package/dist/shims/url-utils.d.ts +22 -1
- package/dist/shims/url-utils.js +76 -3
- package/dist/shims/url-utils.js.map +1 -1
- package/dist/shims/use-merged-ref.js.map +1 -1
- package/dist/shims/web-vitals.d.ts +4 -21
- package/dist/shims/web-vitals.js +19 -6
- package/dist/shims/web-vitals.js.map +1 -1
- package/dist/utils/asset-prefix.d.ts +69 -0
- package/dist/utils/asset-prefix.js +91 -0
- package/dist/utils/asset-prefix.js.map +1 -0
- package/dist/utils/base-path.d.ts +7 -1
- package/dist/utils/base-path.js +10 -1
- package/dist/utils/base-path.js.map +1 -1
- package/dist/utils/cache-control-metadata.js.map +1 -1
- package/dist/utils/domain-locale.js.map +1 -1
- package/dist/utils/encode-cache-tag.d.ts +31 -0
- package/dist/utils/encode-cache-tag.js +38 -0
- package/dist/utils/encode-cache-tag.js.map +1 -0
- package/dist/utils/error-cause.js.map +1 -1
- package/dist/utils/hash.js.map +1 -1
- package/dist/utils/lazy-chunks.js.map +1 -1
- package/dist/utils/manifest-paths.js.map +1 -1
- package/dist/utils/mdx-scan.js.map +1 -1
- package/dist/utils/navigation-signal.d.ts +5 -0
- package/dist/utils/navigation-signal.js +14 -0
- package/dist/utils/navigation-signal.js.map +1 -0
- package/dist/utils/project.js.map +1 -1
- package/dist/utils/public-routes.js.map +1 -1
- package/dist/utils/query.js.map +1 -1
- package/dist/utils/safe-json-file.js.map +1 -1
- package/dist/utils/sorted-array.d.ts +9 -0
- package/dist/utils/sorted-array.js +22 -0
- package/dist/utils/sorted-array.js.map +1 -0
- package/dist/utils/text-stream.js.map +1 -1
- package/dist/utils/vinext-root.js.map +1 -1
- package/package.json +8 -6
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
import { AppRscRenderMode } from "./app-rsc-render-mode.js";
|
|
1
2
|
import { FetchCacheMode } from "../shims/fetch-cache.js";
|
|
2
3
|
import { HeadersAccessPhase } from "../shims/headers.js";
|
|
4
|
+
import { ReactFormState } from "react-dom/client";
|
|
3
5
|
|
|
4
6
|
//#region src/server/app-server-action-execution.d.ts
|
|
5
7
|
type AppPageParams = Record<string, string | string[]>;
|
|
@@ -13,6 +15,7 @@ type AppServerActionErrorReporter = (error: Error, request: {
|
|
|
13
15
|
routeType: "action";
|
|
14
16
|
}) => void;
|
|
15
17
|
type AppServerActionDecoder = (body: FormData) => Promise<unknown>;
|
|
18
|
+
type AppServerActionFormStateDecoder = (actionResult: unknown, body: FormData) => Promise<ReactFormState | undefined>;
|
|
16
19
|
type ReadFormDataWithLimit = (request: Request, maxBytes: number) => Promise<FormData>;
|
|
17
20
|
type ReadBodyWithLimit = (request: Request, maxBytes: number) => Promise<string>;
|
|
18
21
|
type AppServerActionReturnValue = {
|
|
@@ -25,6 +28,15 @@ type AppServerActionReturnValue = {
|
|
|
25
28
|
type AppServerActionRoute = {
|
|
26
29
|
pattern: string;
|
|
27
30
|
};
|
|
31
|
+
type ProgressiveServerActionResult = {
|
|
32
|
+
formState: ReactFormState | null;
|
|
33
|
+
kind: "form-state";
|
|
34
|
+
} | {
|
|
35
|
+
actionError: unknown;
|
|
36
|
+
actionFailed: true;
|
|
37
|
+
formState: null;
|
|
38
|
+
kind: "form-state";
|
|
39
|
+
};
|
|
28
40
|
type AppServerActionMatch<TRoute extends AppServerActionRoute> = {
|
|
29
41
|
params: AppPageParams;
|
|
30
42
|
route: TRoute;
|
|
@@ -32,6 +44,7 @@ type AppServerActionMatch<TRoute extends AppServerActionRoute> = {
|
|
|
32
44
|
type AppServerActionIntercept<TPage = unknown> = {
|
|
33
45
|
matchedParams: AppPageParams;
|
|
34
46
|
page: TPage;
|
|
47
|
+
slotId?: string | null;
|
|
35
48
|
slotKey: string;
|
|
36
49
|
sourceRouteIndex: number;
|
|
37
50
|
};
|
|
@@ -44,10 +57,16 @@ type BuildServerActionPageElementOptions<TRoute extends AppServerActionRoute, TI
|
|
|
44
57
|
request: Request;
|
|
45
58
|
route: TRoute;
|
|
46
59
|
searchParams: URLSearchParams;
|
|
60
|
+
renderMode: AppRscRenderMode;
|
|
47
61
|
};
|
|
48
62
|
type AppServerActionRscModel<TElement> = {
|
|
63
|
+
/**
|
|
64
|
+
* Omitted when the action did not invalidate page data. This mirrors Next.js'
|
|
65
|
+
* empty Flight payload for non-revalidating fetch actions: the client resolves
|
|
66
|
+
* the action value without committing a visible router update.
|
|
67
|
+
*/
|
|
68
|
+
root?: TElement;
|
|
49
69
|
returnValue: AppServerActionReturnValue;
|
|
50
|
-
root: TElement;
|
|
51
70
|
};
|
|
52
71
|
type RenderServerActionRscStreamOptions<TTemporaryReferences> = {
|
|
53
72
|
onError: (error: unknown) => unknown;
|
|
@@ -58,11 +77,13 @@ type DecodeServerActionReplyOptions<TTemporaryReferences> = {
|
|
|
58
77
|
};
|
|
59
78
|
type HandleProgressiveServerActionRequestOptions = {
|
|
60
79
|
actionId: string | null;
|
|
61
|
-
allowedOrigins: string[];
|
|
80
|
+
allowedOrigins: string[]; /** Configured next.config `basePath`. Prefixed onto progressive Location targets. */
|
|
81
|
+
basePath?: string;
|
|
62
82
|
cleanPathname: string;
|
|
63
83
|
clearRequestContext: () => void;
|
|
64
84
|
contentType: string;
|
|
65
85
|
decodeAction: AppServerActionDecoder;
|
|
86
|
+
decodeFormState: AppServerActionFormStateDecoder;
|
|
66
87
|
getAndClearPendingCookies: () => string[];
|
|
67
88
|
getDraftModeCookieHeader: () => string | null | undefined;
|
|
68
89
|
maxActionBodySize: number;
|
|
@@ -74,7 +95,8 @@ type HandleProgressiveServerActionRequestOptions = {
|
|
|
74
95
|
};
|
|
75
96
|
type HandleServerActionRscRequestOptions<TElement, TRoute extends AppServerActionRoute, TInterceptOpts, TTemporaryReferences, TPage = unknown> = {
|
|
76
97
|
actionId: string | null;
|
|
77
|
-
allowedOrigins: string[];
|
|
98
|
+
allowedOrigins: string[]; /** Configured next.config `basePath`. Prefixed onto ACTION_REDIRECT_HEADER targets. */
|
|
99
|
+
basePath?: string;
|
|
78
100
|
buildPageElement: (options: BuildServerActionPageElementOptions<TRoute, TInterceptOpts>) => TElement;
|
|
79
101
|
cleanPathname: string;
|
|
80
102
|
clearRequestContext: () => void;
|
|
@@ -114,9 +136,33 @@ type HandleServerActionRscRequestOptions<TElement, TRoute extends AppServerActio
|
|
|
114
136
|
};
|
|
115
137
|
declare function readActionBodyWithLimit(request: Request, maxBytes: number): Promise<string>;
|
|
116
138
|
declare function readActionFormDataWithLimit(request: Request, maxBytes: number): Promise<FormData>;
|
|
139
|
+
/**
|
|
140
|
+
* Prepend the configured next.config `basePath` to a server-action redirect
|
|
141
|
+
* target before it goes on the wire.
|
|
142
|
+
*
|
|
143
|
+
* `redirect("/foo")` called from a server action mounted at `/base/...` must
|
|
144
|
+
* land the browser at `/base/foo`, mirroring how Next.js threads basePath
|
|
145
|
+
* through `addPathPrefix(getURLFromRedirectError(err), basePath)` in
|
|
146
|
+
* `app-render.tsx` for SSR redirects and in `action-handler.ts` for action
|
|
147
|
+
* redirects.
|
|
148
|
+
*
|
|
149
|
+
* Idempotent and external-aware:
|
|
150
|
+
* - Empty basePath → returned unchanged.
|
|
151
|
+
* - External URLs (`http://`, `https://`, `data:`, protocol-relative `//`)
|
|
152
|
+
* are returned unchanged because the framework does not own those routes.
|
|
153
|
+
* - Targets that already start with the configured basePath are returned
|
|
154
|
+
* unchanged so this helper can be applied at any layer without risk of
|
|
155
|
+
* double-prefixing (`/base/base/foo`).
|
|
156
|
+
*
|
|
157
|
+
* Exported for tests. Used by both the progressive (no-JS form POST) and
|
|
158
|
+
* RSC (`ACTION_REDIRECT_HEADER`) action redirect paths below.
|
|
159
|
+
*
|
|
160
|
+
* @see https://github.com/vercel/next.js/blob/canary/packages/next/src/server/app-render/action-handler.ts
|
|
161
|
+
*/
|
|
162
|
+
declare function applyActionRedirectBasePath(url: string, basePath: string): string;
|
|
117
163
|
declare function isProgressiveServerActionRequest(request: Pick<Request, "method">, contentType: string, actionId: string | null): boolean;
|
|
118
|
-
declare function handleProgressiveServerActionRequest(options: HandleProgressiveServerActionRequestOptions): Promise<Response | null>;
|
|
164
|
+
declare function handleProgressiveServerActionRequest(options: HandleProgressiveServerActionRequestOptions): Promise<Response | ProgressiveServerActionResult | null>;
|
|
119
165
|
declare function handleServerActionRscRequest<TElement, TRoute extends AppServerActionRoute, TInterceptOpts, TTemporaryReferences, TPage = unknown>(options: HandleServerActionRscRequestOptions<TElement, TRoute, TInterceptOpts, TTemporaryReferences, TPage>): Promise<Response | null>;
|
|
120
166
|
//#endregion
|
|
121
|
-
export { HandleProgressiveServerActionRequestOptions, HandleServerActionRscRequestOptions, handleProgressiveServerActionRequest, handleServerActionRscRequest, isProgressiveServerActionRequest, readActionBodyWithLimit, readActionFormDataWithLimit };
|
|
167
|
+
export { HandleProgressiveServerActionRequestOptions, HandleServerActionRscRequestOptions, applyActionRedirectBasePath, handleProgressiveServerActionRequest, handleServerActionRscRequest, isProgressiveServerActionRequest, readActionBodyWithLimit, readActionFormDataWithLimit };
|
|
122
168
|
//# sourceMappingURL=app-server-action-execution.d.ts.map
|
|
@@ -1,7 +1,12 @@
|
|
|
1
|
+
import { addBasePathToPathname, hasBasePath } from "../utils/base-path.js";
|
|
2
|
+
import { ACTION_REDIRECT_HEADER, ACTION_REDIRECT_STATUS_HEADER, ACTION_REDIRECT_TYPE_HEADER, ACTION_REVALIDATED_HEADER } from "./headers.js";
|
|
3
|
+
import { isExternalUrl } from "../config/config-matchers.js";
|
|
1
4
|
import { internalServerErrorResponse, payloadTooLargeResponse } from "./http-error-responses.js";
|
|
2
5
|
import { validateCsrfOrigin, validateServerActionPayload } from "./request-pipeline.js";
|
|
6
|
+
import { getAndClearActionRevalidationKind } from "../shims/cache.js";
|
|
7
|
+
import { APP_RSC_RENDER_MODE_ACTION_RERENDER_PRESERVE_UI } from "./app-rsc-render-mode.js";
|
|
3
8
|
import { setCurrentFetchCacheMode } from "../shims/fetch-cache.js";
|
|
4
|
-
import { VINEXT_RSC_VARY_HEADER } from "./app-rsc-cache-busting.js";
|
|
9
|
+
import { VINEXT_RSC_CONTENT_TYPE, VINEXT_RSC_VARY_HEADER, applyRscCompatibilityIdHeader } from "./app-rsc-cache-busting.js";
|
|
5
10
|
import { createServerActionNotFoundResponse, getServerActionNotFoundMessage, isServerActionNotFoundError } from "./server-action-not-found.js";
|
|
6
11
|
import { mergeMiddlewareResponseHeaders } from "./middleware-response-headers.js";
|
|
7
12
|
import { readStreamAsTextWithLimit } from "../utils/text-stream.js";
|
|
@@ -13,6 +18,17 @@ import { resolveAppPageActionRerenderTarget } from "./app-page-request.js";
|
|
|
13
18
|
* Function.prototype.apply when decoding hostile action payloads.
|
|
14
19
|
*/
|
|
15
20
|
const SERVER_ACTION_ARGS_LIMIT = 1e3;
|
|
21
|
+
const ACTION_DID_NOT_REVALIDATE = 0;
|
|
22
|
+
const ACTION_DID_REVALIDATE_STATIC_AND_DYNAMIC = 1;
|
|
23
|
+
function setActionRevalidatedHeader(headers, kind) {
|
|
24
|
+
if (kind === ACTION_DID_NOT_REVALIDATE) return;
|
|
25
|
+
headers.set(ACTION_REVALIDATED_HEADER, JSON.stringify(kind));
|
|
26
|
+
}
|
|
27
|
+
function resolveActionRevalidationKind(hasModifiedCookies) {
|
|
28
|
+
const revalidationKind = getAndClearActionRevalidationKind();
|
|
29
|
+
if (hasModifiedCookies) return ACTION_DID_REVALIDATE_STATIC_AND_DYNAMIC;
|
|
30
|
+
return revalidationKind;
|
|
31
|
+
}
|
|
16
32
|
function isRequestBodyTooLarge(error) {
|
|
17
33
|
return error instanceof Error && error.message === "Request body too large";
|
|
18
34
|
}
|
|
@@ -57,24 +73,6 @@ async function readActionFormDataWithLimit(request, maxBytes) {
|
|
|
57
73
|
}
|
|
58
74
|
return new Response(combined, { headers: { "Content-Type": request.headers.get("content-type") || "" } }).formData();
|
|
59
75
|
}
|
|
60
|
-
function getActionControlResponse(error) {
|
|
61
|
-
const digest = getNextErrorDigest(error);
|
|
62
|
-
if (!digest) return null;
|
|
63
|
-
const redirect = parseNextRedirectDigest(digest);
|
|
64
|
-
if (redirect) return {
|
|
65
|
-
kind: "redirect",
|
|
66
|
-
url: redirect.url
|
|
67
|
-
};
|
|
68
|
-
const httpError = parseNextHttpErrorDigest(digest);
|
|
69
|
-
if (httpError) {
|
|
70
|
-
if (!Number.isInteger(httpError.status)) return null;
|
|
71
|
-
return {
|
|
72
|
-
kind: "status",
|
|
73
|
-
statusCode: httpError.status
|
|
74
|
-
};
|
|
75
|
-
}
|
|
76
|
-
return null;
|
|
77
|
-
}
|
|
78
76
|
function getActionRedirect(error) {
|
|
79
77
|
const digest = getNextErrorDigest(error);
|
|
80
78
|
if (!digest) return null;
|
|
@@ -82,13 +80,51 @@ function getActionRedirect(error) {
|
|
|
82
80
|
if (!redirect) return null;
|
|
83
81
|
return {
|
|
84
82
|
status: redirect.status,
|
|
85
|
-
type: redirect.type,
|
|
83
|
+
type: redirect.type ?? "push",
|
|
86
84
|
url: redirect.url
|
|
87
85
|
};
|
|
88
86
|
}
|
|
89
|
-
|
|
87
|
+
/**
|
|
88
|
+
* Prepend the configured next.config `basePath` to a server-action redirect
|
|
89
|
+
* target before it goes on the wire.
|
|
90
|
+
*
|
|
91
|
+
* `redirect("/foo")` called from a server action mounted at `/base/...` must
|
|
92
|
+
* land the browser at `/base/foo`, mirroring how Next.js threads basePath
|
|
93
|
+
* through `addPathPrefix(getURLFromRedirectError(err), basePath)` in
|
|
94
|
+
* `app-render.tsx` for SSR redirects and in `action-handler.ts` for action
|
|
95
|
+
* redirects.
|
|
96
|
+
*
|
|
97
|
+
* Idempotent and external-aware:
|
|
98
|
+
* - Empty basePath → returned unchanged.
|
|
99
|
+
* - External URLs (`http://`, `https://`, `data:`, protocol-relative `//`)
|
|
100
|
+
* are returned unchanged because the framework does not own those routes.
|
|
101
|
+
* - Targets that already start with the configured basePath are returned
|
|
102
|
+
* unchanged so this helper can be applied at any layer without risk of
|
|
103
|
+
* double-prefixing (`/base/base/foo`).
|
|
104
|
+
*
|
|
105
|
+
* Exported for tests. Used by both the progressive (no-JS form POST) and
|
|
106
|
+
* RSC (`ACTION_REDIRECT_HEADER`) action redirect paths below.
|
|
107
|
+
*
|
|
108
|
+
* @see https://github.com/vercel/next.js/blob/canary/packages/next/src/server/app-render/action-handler.ts
|
|
109
|
+
*/
|
|
110
|
+
function applyActionRedirectBasePath(url, basePath) {
|
|
111
|
+
if (!basePath) return url;
|
|
112
|
+
if (isExternalUrl(url)) return url;
|
|
113
|
+
if (hasBasePath(url, basePath)) return url;
|
|
114
|
+
if (!url.startsWith("/")) return url;
|
|
115
|
+
const queryIndex = url.indexOf("?");
|
|
116
|
+
const hashIndex = url.indexOf("#");
|
|
117
|
+
const splitAt = queryIndex === -1 ? hashIndex : hashIndex === -1 ? queryIndex : Math.min(queryIndex, hashIndex);
|
|
118
|
+
const pathname = splitAt === -1 ? url : url.slice(0, splitAt);
|
|
119
|
+
const suffix = splitAt === -1 ? "" : url.slice(splitAt);
|
|
120
|
+
return `${addBasePathToPathname(pathname, basePath)}${suffix}`;
|
|
121
|
+
}
|
|
122
|
+
function getActionHttpFallbackStatus(error) {
|
|
90
123
|
const digest = getNextErrorDigest(error);
|
|
91
|
-
|
|
124
|
+
if (!digest) return null;
|
|
125
|
+
const httpError = parseNextHttpErrorDigest(digest);
|
|
126
|
+
if (!httpError || !Number.isInteger(httpError.status)) return null;
|
|
127
|
+
return httpError.status;
|
|
92
128
|
}
|
|
93
129
|
function createServerActionErrorResponse(error, options) {
|
|
94
130
|
options.getAndClearPendingCookies();
|
|
@@ -116,6 +152,10 @@ function isProgressiveServerActionRequest(request, contentType, actionId) {
|
|
|
116
152
|
}
|
|
117
153
|
async function handleProgressiveServerActionRequest(options) {
|
|
118
154
|
if (!isProgressiveServerActionRequest(options.request, options.contentType, options.actionId)) return null;
|
|
155
|
+
if (options.request.headers.get("x-action-forwarded")) return createActionNotFoundResponse(null, {
|
|
156
|
+
clearRequestContext: options.clearRequestContext,
|
|
157
|
+
getAndClearPendingCookies: options.getAndClearPendingCookies
|
|
158
|
+
});
|
|
119
159
|
const csrfResponse = validateCsrfOrigin(options.request, options.allowedOrigins);
|
|
120
160
|
if (csrfResponse) return csrfResponse;
|
|
121
161
|
if (parseInt(options.request.headers.get("content-length") || "0", 10) > options.maxActionBodySize) {
|
|
@@ -139,28 +179,61 @@ async function handleProgressiveServerActionRequest(options) {
|
|
|
139
179
|
return payloadResponse;
|
|
140
180
|
}
|
|
141
181
|
const action = await options.decodeAction(body);
|
|
142
|
-
if (
|
|
143
|
-
let
|
|
182
|
+
if (!isAppServerActionFunction(action)) return null;
|
|
183
|
+
let actionRedirect = null;
|
|
184
|
+
let actionError = void 0;
|
|
185
|
+
let actionFailed = false;
|
|
186
|
+
let actionResult;
|
|
144
187
|
const previousHeadersPhase = options.setHeadersAccessPhase("action");
|
|
145
188
|
try {
|
|
146
|
-
await action();
|
|
189
|
+
actionResult = await action();
|
|
147
190
|
} catch (error) {
|
|
148
|
-
|
|
149
|
-
if (!
|
|
191
|
+
actionRedirect = getActionRedirect(error);
|
|
192
|
+
if (!actionRedirect) {
|
|
193
|
+
actionError = error;
|
|
194
|
+
actionFailed = true;
|
|
195
|
+
if (!(getActionHttpFallbackStatus(error) !== null || isServerActionNotFoundError(error, null))) {
|
|
196
|
+
console.error("[vinext] Server action error:", error);
|
|
197
|
+
options.reportRequestError(normalizeError(error), {
|
|
198
|
+
path: options.cleanPathname,
|
|
199
|
+
method: options.request.method,
|
|
200
|
+
headers: Object.fromEntries(options.request.headers.entries())
|
|
201
|
+
}, {
|
|
202
|
+
routerKind: "App Router",
|
|
203
|
+
routePath: options.cleanPathname,
|
|
204
|
+
routeType: "action"
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
}
|
|
150
208
|
} finally {
|
|
151
209
|
options.setHeadersAccessPhase(previousHeadersPhase);
|
|
152
210
|
}
|
|
153
|
-
if (!
|
|
211
|
+
if (!actionRedirect) {
|
|
212
|
+
getAndClearActionRevalidationKind();
|
|
213
|
+
if (actionFailed) return {
|
|
214
|
+
kind: "form-state",
|
|
215
|
+
formState: null,
|
|
216
|
+
actionError,
|
|
217
|
+
actionFailed
|
|
218
|
+
};
|
|
219
|
+
return {
|
|
220
|
+
kind: "form-state",
|
|
221
|
+
formState: await options.decodeFormState(actionResult, body) ?? null
|
|
222
|
+
};
|
|
223
|
+
}
|
|
154
224
|
const actionPendingCookies = options.getAndClearPendingCookies();
|
|
155
225
|
const actionDraftCookie = options.getDraftModeCookieHeader();
|
|
226
|
+
const actionRevalidationKind = resolveActionRevalidationKind(actionPendingCookies.length > 0 || Boolean(actionDraftCookie));
|
|
156
227
|
options.clearRequestContext();
|
|
157
228
|
const headers = new Headers();
|
|
158
|
-
|
|
229
|
+
const prefixedRedirectUrl = applyActionRedirectBasePath(actionRedirect.url, options.basePath ?? "");
|
|
230
|
+
headers.set("Location", new URL(prefixedRedirectUrl, options.request.url).toString());
|
|
159
231
|
mergeMiddlewareResponseHeaders(headers, options.middlewareHeaders);
|
|
160
232
|
for (const cookie of actionPendingCookies) headers.append("Set-Cookie", cookie);
|
|
161
233
|
if (actionDraftCookie) headers.append("Set-Cookie", actionDraftCookie);
|
|
234
|
+
setActionRevalidatedHeader(headers, actionRevalidationKind);
|
|
162
235
|
return new Response(null, {
|
|
163
|
-
status:
|
|
236
|
+
status: 303,
|
|
164
237
|
headers
|
|
165
238
|
});
|
|
166
239
|
} catch (error) {
|
|
@@ -168,8 +241,9 @@ async function handleProgressiveServerActionRequest(options) {
|
|
|
168
241
|
clearRequestContext: options.clearRequestContext,
|
|
169
242
|
getAndClearPendingCookies: options.getAndClearPendingCookies
|
|
170
243
|
});
|
|
244
|
+
getAndClearActionRevalidationKind();
|
|
171
245
|
options.getAndClearPendingCookies();
|
|
172
|
-
console.error("[vinext] Server action error:", error);
|
|
246
|
+
console.error("[vinext] Server action payload parsing error:", error);
|
|
173
247
|
options.reportRequestError(normalizeError(error), {
|
|
174
248
|
path: options.cleanPathname,
|
|
175
249
|
method: options.request.method,
|
|
@@ -180,11 +254,15 @@ async function handleProgressiveServerActionRequest(options) {
|
|
|
180
254
|
routeType: "action"
|
|
181
255
|
});
|
|
182
256
|
options.clearRequestContext();
|
|
183
|
-
return internalServerErrorResponse(process.env.NODE_ENV === "production" ? void 0 : "Server action failed: " + getServerActionFailureMessage(error));
|
|
257
|
+
return internalServerErrorResponse(process.env.NODE_ENV === "production" ? void 0 : "Server action parsing failed: " + getServerActionFailureMessage(error));
|
|
184
258
|
}
|
|
185
259
|
}
|
|
186
260
|
async function handleServerActionRscRequest(options) {
|
|
187
261
|
if (options.request.method.toUpperCase() !== "POST" || !options.actionId) return null;
|
|
262
|
+
if (options.request.headers.get("x-action-forwarded")) return createActionNotFoundResponse(options.actionId, {
|
|
263
|
+
clearRequestContext: options.clearRequestContext,
|
|
264
|
+
getAndClearPendingCookies: options.getAndClearPendingCookies
|
|
265
|
+
});
|
|
188
266
|
const csrfResponse = validateCsrfOrigin(options.request, options.allowedOrigins);
|
|
189
267
|
if (csrfResponse) return csrfResponse;
|
|
190
268
|
if (parseInt(options.request.headers.get("content-length") || "0", 10) > options.maxActionBodySize) {
|
|
@@ -225,6 +303,7 @@ async function handleServerActionRscRequest(options) {
|
|
|
225
303
|
const args = await options.decodeReply(body, { temporaryReferences });
|
|
226
304
|
let returnValue;
|
|
227
305
|
let actionRedirect = null;
|
|
306
|
+
let actionStatus = 200;
|
|
228
307
|
const previousHeadersPhase = options.setHeadersAccessPhase("action");
|
|
229
308
|
try {
|
|
230
309
|
try {
|
|
@@ -239,16 +318,21 @@ async function handleServerActionRscRequest(options) {
|
|
|
239
318
|
ok: true,
|
|
240
319
|
data: void 0
|
|
241
320
|
};
|
|
242
|
-
else if (isActionHttpFallback(error)) returnValue = {
|
|
243
|
-
ok: false,
|
|
244
|
-
data: error
|
|
245
|
-
};
|
|
246
321
|
else {
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
322
|
+
const httpFallbackStatus = getActionHttpFallbackStatus(error);
|
|
323
|
+
if (httpFallbackStatus !== null) {
|
|
324
|
+
actionStatus = httpFallbackStatus;
|
|
325
|
+
returnValue = {
|
|
326
|
+
ok: false,
|
|
327
|
+
data: error
|
|
328
|
+
};
|
|
329
|
+
} else {
|
|
330
|
+
console.error("[vinext] Server action error:", error);
|
|
331
|
+
returnValue = {
|
|
332
|
+
ok: false,
|
|
333
|
+
data: options.sanitizeErrorForClient(error)
|
|
334
|
+
};
|
|
335
|
+
}
|
|
252
336
|
}
|
|
253
337
|
}
|
|
254
338
|
} finally {
|
|
@@ -257,22 +341,46 @@ async function handleServerActionRscRequest(options) {
|
|
|
257
341
|
if (actionRedirect) {
|
|
258
342
|
const actionPendingCookies = options.getAndClearPendingCookies();
|
|
259
343
|
const actionDraftCookie = options.getDraftModeCookieHeader();
|
|
344
|
+
const actionRevalidationKind = resolveActionRevalidationKind(actionPendingCookies.length > 0 || Boolean(actionDraftCookie));
|
|
260
345
|
options.clearRequestContext();
|
|
261
346
|
const redirectHeaders = new Headers({
|
|
262
|
-
"Content-Type":
|
|
347
|
+
"Content-Type": VINEXT_RSC_CONTENT_TYPE,
|
|
263
348
|
Vary: VINEXT_RSC_VARY_HEADER
|
|
264
349
|
});
|
|
265
350
|
mergeMiddlewareResponseHeaders(redirectHeaders, options.middlewareHeaders);
|
|
266
|
-
redirectHeaders
|
|
267
|
-
redirectHeaders.set(
|
|
268
|
-
redirectHeaders.set(
|
|
351
|
+
applyRscCompatibilityIdHeader(redirectHeaders);
|
|
352
|
+
redirectHeaders.set(ACTION_REDIRECT_HEADER, applyActionRedirectBasePath(actionRedirect.url, options.basePath ?? ""));
|
|
353
|
+
redirectHeaders.set(ACTION_REDIRECT_TYPE_HEADER, actionRedirect.type);
|
|
354
|
+
redirectHeaders.set(ACTION_REDIRECT_STATUS_HEADER, String(actionRedirect.status));
|
|
269
355
|
for (const cookie of actionPendingCookies) redirectHeaders.append("Set-Cookie", cookie);
|
|
270
356
|
if (actionDraftCookie) redirectHeaders.append("Set-Cookie", actionDraftCookie);
|
|
357
|
+
setActionRevalidatedHeader(redirectHeaders, actionRevalidationKind);
|
|
271
358
|
return new Response("", {
|
|
272
359
|
status: 200,
|
|
273
360
|
headers: redirectHeaders
|
|
274
361
|
});
|
|
275
362
|
}
|
|
363
|
+
const actionPendingCookies = options.getAndClearPendingCookies();
|
|
364
|
+
const actionDraftCookie = options.getDraftModeCookieHeader();
|
|
365
|
+
const actionRevalidationKind = resolveActionRevalidationKind(actionPendingCookies.length > 0 || Boolean(actionDraftCookie));
|
|
366
|
+
if (actionRevalidationKind === ACTION_DID_NOT_REVALIDATE) {
|
|
367
|
+
const onRenderError = options.createRscOnErrorHandler(options.request, options.cleanPathname, options.cleanPathname);
|
|
368
|
+
const rscStream = await options.renderToReadableStream({ returnValue }, {
|
|
369
|
+
temporaryReferences,
|
|
370
|
+
onError: onRenderError
|
|
371
|
+
});
|
|
372
|
+
options.clearRequestContext();
|
|
373
|
+
const actionHeaders = new Headers({
|
|
374
|
+
"Content-Type": VINEXT_RSC_CONTENT_TYPE,
|
|
375
|
+
Vary: VINEXT_RSC_VARY_HEADER
|
|
376
|
+
});
|
|
377
|
+
mergeMiddlewareResponseHeaders(actionHeaders, options.middlewareHeaders);
|
|
378
|
+
applyRscCompatibilityIdHeader(actionHeaders);
|
|
379
|
+
return new Response(rscStream, {
|
|
380
|
+
status: options.middlewareStatus ?? actionStatus,
|
|
381
|
+
headers: actionHeaders
|
|
382
|
+
});
|
|
383
|
+
}
|
|
276
384
|
const match = options.matchRoute(options.cleanPathname);
|
|
277
385
|
let element;
|
|
278
386
|
let errorPattern = match ? match.route.pattern : options.cleanPathname;
|
|
@@ -302,7 +410,8 @@ async function handleServerActionRscRequest(options) {
|
|
|
302
410
|
params: actionRerenderTarget.params,
|
|
303
411
|
request: options.request,
|
|
304
412
|
route: actionRerenderTarget.route,
|
|
305
|
-
searchParams: options.searchParams
|
|
413
|
+
searchParams: options.searchParams,
|
|
414
|
+
renderMode: APP_RSC_RENDER_MODE_ACTION_RERENDER_PRESERVE_UI
|
|
306
415
|
});
|
|
307
416
|
errorPattern = actionRerenderTarget.route.pattern;
|
|
308
417
|
} else {
|
|
@@ -317,15 +426,15 @@ async function handleServerActionRscRequest(options) {
|
|
|
317
426
|
temporaryReferences,
|
|
318
427
|
onError: onRenderError
|
|
319
428
|
});
|
|
320
|
-
const actionPendingCookies = options.getAndClearPendingCookies();
|
|
321
|
-
const actionDraftCookie = options.getDraftModeCookieHeader();
|
|
322
429
|
const actionHeaders = new Headers({
|
|
323
|
-
"Content-Type":
|
|
430
|
+
"Content-Type": VINEXT_RSC_CONTENT_TYPE,
|
|
324
431
|
Vary: VINEXT_RSC_VARY_HEADER
|
|
325
432
|
});
|
|
326
433
|
mergeMiddlewareResponseHeaders(actionHeaders, options.middlewareHeaders);
|
|
434
|
+
applyRscCompatibilityIdHeader(actionHeaders);
|
|
435
|
+
setActionRevalidatedHeader(actionHeaders, actionRevalidationKind);
|
|
327
436
|
const actionResponse = new Response(rscStream, {
|
|
328
|
-
status: options.middlewareStatus ??
|
|
437
|
+
status: options.middlewareStatus ?? actionStatus,
|
|
329
438
|
headers: actionHeaders
|
|
330
439
|
});
|
|
331
440
|
if (actionPendingCookies.length > 0 || actionDraftCookie) {
|
|
@@ -334,6 +443,7 @@ async function handleServerActionRscRequest(options) {
|
|
|
334
443
|
}
|
|
335
444
|
return actionResponse;
|
|
336
445
|
} catch (error) {
|
|
446
|
+
getAndClearActionRevalidationKind();
|
|
337
447
|
return createServerActionErrorResponse(error, {
|
|
338
448
|
cleanPathname: options.cleanPathname,
|
|
339
449
|
clearRequestContext: options.clearRequestContext,
|
|
@@ -344,6 +454,6 @@ async function handleServerActionRscRequest(options) {
|
|
|
344
454
|
}
|
|
345
455
|
}
|
|
346
456
|
//#endregion
|
|
347
|
-
export { handleProgressiveServerActionRequest, handleServerActionRscRequest, isProgressiveServerActionRequest, readActionBodyWithLimit, readActionFormDataWithLimit };
|
|
457
|
+
export { applyActionRedirectBasePath, handleProgressiveServerActionRequest, handleServerActionRscRequest, isProgressiveServerActionRequest, readActionBodyWithLimit, readActionFormDataWithLimit };
|
|
348
458
|
|
|
349
459
|
//# sourceMappingURL=app-server-action-execution.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-server-action-execution.js","names":[],"sources":["../../src/server/app-server-action-execution.ts"],"sourcesContent":["import type { HeadersAccessPhase } from \"vinext/shims/headers\";\nimport { type FetchCacheMode, setCurrentFetchCacheMode } from \"vinext/shims/fetch-cache\";\nimport { VINEXT_RSC_VARY_HEADER } from \"./app-rsc-cache-busting.js\";\nimport { resolveAppPageActionRerenderTarget } from \"./app-page-request.js\";\nimport { mergeMiddlewareResponseHeaders } from \"./middleware-response-headers.js\";\nimport {\n getNextErrorDigest,\n parseNextHttpErrorDigest,\n parseNextRedirectDigest,\n} from \"./next-error-digest.js\";\nimport { validateCsrfOrigin, validateServerActionPayload } from \"./request-pipeline.js\";\nimport { readStreamAsTextWithLimit } from \"../utils/text-stream.js\";\nimport {\n createServerActionNotFoundResponse,\n getServerActionNotFoundMessage,\n isServerActionNotFoundError,\n} from \"./server-action-not-found.js\";\nimport { internalServerErrorResponse, payloadTooLargeResponse } from \"./http-error-responses.js\";\n\ntype AppPageParams = Record<string, string | string[]>;\n\ntype AppServerActionErrorReporter = (\n error: Error,\n request: { path: string; method: string; headers: Record<string, string> },\n route: { routerKind: \"App Router\"; routePath: string; routeType: \"action\" },\n) => void;\n\ntype AppServerActionDecoder = (body: FormData) => Promise<unknown>;\n\ntype ReadFormDataWithLimit = (request: Request, maxBytes: number) => Promise<FormData>;\n\ntype ReadBodyWithLimit = (request: Request, maxBytes: number) => Promise<string>;\n\ntype AppServerActionFunction = (...args: unknown[]) => unknown;\n\ntype AppServerActionReturnValue =\n | {\n data: unknown;\n ok: true;\n }\n | {\n data: unknown;\n ok: false;\n };\n\ntype AppServerActionRedirect = {\n status: number;\n type: string;\n url: string;\n};\n\ntype AppServerActionRoute = {\n pattern: string;\n};\n\ntype AppServerActionMatch<TRoute extends AppServerActionRoute> = {\n params: AppPageParams;\n route: TRoute;\n};\n\ntype AppServerActionIntercept<TPage = unknown> = {\n matchedParams: AppPageParams;\n page: TPage;\n slotKey: string;\n sourceRouteIndex: number;\n};\n\ntype BuildServerActionPageElementOptions<TRoute extends AppServerActionRoute, TInterceptOpts> = {\n cleanPathname: string;\n interceptOpts: TInterceptOpts | undefined;\n isRscRequest: boolean;\n mountedSlotsHeader: string | null;\n params: AppPageParams;\n request: Request;\n route: TRoute;\n searchParams: URLSearchParams;\n};\n\ntype AppServerActionRscModel<TElement> = {\n returnValue: AppServerActionReturnValue;\n root: TElement;\n};\n\ntype RenderServerActionRscStreamOptions<TTemporaryReferences> = {\n onError: (error: unknown) => unknown;\n temporaryReferences: TTemporaryReferences;\n};\n\ntype DecodeServerActionReplyOptions<TTemporaryReferences> = {\n temporaryReferences: TTemporaryReferences;\n};\n\nexport type HandleProgressiveServerActionRequestOptions = {\n actionId: string | null;\n allowedOrigins: string[];\n cleanPathname: string;\n clearRequestContext: () => void;\n contentType: string;\n decodeAction: AppServerActionDecoder;\n getAndClearPendingCookies: () => string[];\n getDraftModeCookieHeader: () => string | null | undefined;\n maxActionBodySize: number;\n middlewareHeaders: Headers | null;\n readFormDataWithLimit: ReadFormDataWithLimit;\n reportRequestError: AppServerActionErrorReporter;\n request: Request;\n setHeadersAccessPhase: (phase: HeadersAccessPhase) => HeadersAccessPhase;\n};\n\nexport type HandleServerActionRscRequestOptions<\n TElement,\n TRoute extends AppServerActionRoute,\n TInterceptOpts,\n TTemporaryReferences,\n TPage = unknown,\n> = {\n actionId: string | null;\n allowedOrigins: string[];\n buildPageElement: (\n options: BuildServerActionPageElementOptions<TRoute, TInterceptOpts>,\n ) => TElement;\n cleanPathname: string;\n clearRequestContext: () => void;\n contentType: string;\n createNotFoundElement: (routeId: string) => TElement;\n createPayloadRouteId: (pathname: string, interceptionContext: string | null) => string;\n createRscOnErrorHandler: (\n request: Request,\n pathname: string,\n pattern: string,\n ) => (error: unknown) => unknown;\n createTemporaryReferenceSet: () => TTemporaryReferences;\n decodeReply: (\n body: string | FormData,\n options: DecodeServerActionReplyOptions<TTemporaryReferences>,\n ) => Promise<unknown[]> | unknown[];\n findIntercept: (pathname: string) => AppServerActionIntercept<TPage> | null;\n getAndClearPendingCookies: () => string[];\n getDraftModeCookieHeader: () => string | null | undefined;\n getRouteParamNames: (route: TRoute) => readonly string[];\n getSourceRoute: (sourceRouteIndex: number) => TRoute | undefined;\n isRscRequest: boolean;\n loadServerAction: (actionId: string) => Promise<unknown>;\n matchRoute: (pathname: string) => AppServerActionMatch<TRoute> | null;\n maxActionBodySize: number;\n middlewareHeaders: Headers | null;\n middlewareStatus: number | null | undefined;\n mountedSlotsHeader: string | null;\n readBodyWithLimit: ReadBodyWithLimit;\n readFormDataWithLimit: ReadFormDataWithLimit;\n renderToReadableStream: (\n model: AppServerActionRscModel<TElement>,\n options: RenderServerActionRscStreamOptions<TTemporaryReferences>,\n ) => BodyInit | null | Promise<BodyInit | null>;\n reportRequestError: AppServerActionErrorReporter;\n resolveRouteFetchCacheMode?: (route: TRoute) => FetchCacheMode | null;\n request: Request;\n sanitizeErrorForClient: (error: unknown) => unknown;\n searchParams: URLSearchParams;\n setHeadersAccessPhase: (phase: HeadersAccessPhase) => HeadersAccessPhase;\n setNavigationContext: (context: {\n params: AppPageParams;\n pathname: string;\n searchParams: URLSearchParams;\n }) => void;\n toInterceptOpts: (intercept: AppServerActionIntercept<TPage>) => TInterceptOpts;\n};\n\ntype ActionControlResponse =\n | {\n kind: \"redirect\";\n url: string;\n }\n | {\n kind: \"status\";\n statusCode: number;\n };\n\n/**\n * Matches Next.js' server action argument cap to prevent stack overflow in\n * Function.prototype.apply when decoding hostile action payloads.\n */\nconst SERVER_ACTION_ARGS_LIMIT = 1000;\n\nfunction isRequestBodyTooLarge(error: unknown): boolean {\n return error instanceof Error && error.message === \"Request body too large\";\n}\n\nfunction isAppServerActionFunction(action: unknown): action is AppServerActionFunction {\n return typeof action === \"function\";\n}\n\nfunction normalizeError(error: unknown): Error {\n return error instanceof Error ? error : new Error(String(error));\n}\n\nfunction getServerActionFailureMessage(error: unknown): string {\n return error instanceof Error && error.message ? error.message : String(error);\n}\n\nfunction validateServerActionArgs(args: readonly unknown[]): void {\n if (args.length > SERVER_ACTION_ARGS_LIMIT) {\n throw new Error(\n `Server Action arguments list is too long (${args.length}). Maximum allowed is ${SERVER_ACTION_ARGS_LIMIT}.`,\n );\n }\n}\n\nexport async function readActionBodyWithLimit(request: Request, maxBytes: number): Promise<string> {\n if (!request.body) return \"\";\n return readStreamAsTextWithLimit(request.body, maxBytes, () => {\n throw new Error(\"Request body too large\");\n });\n}\n\nexport async function readActionFormDataWithLimit(\n request: Request,\n maxBytes: number,\n): Promise<FormData> {\n if (!request.body) return new FormData();\n\n const reader = request.body.getReader();\n const chunks: Uint8Array[] = [];\n let totalSize = 0;\n\n for (;;) {\n const result = await reader.read();\n if (result.done) break;\n\n totalSize += result.value.byteLength;\n if (totalSize > maxBytes) {\n await reader.cancel();\n throw new Error(\"Request body too large\");\n }\n chunks.push(result.value);\n }\n\n const combined = new Uint8Array(totalSize);\n let offset = 0;\n for (const chunk of chunks) {\n combined.set(chunk, offset);\n offset += chunk.byteLength;\n }\n\n return new Response(combined, {\n headers: { \"Content-Type\": request.headers.get(\"content-type\") || \"\" },\n }).formData();\n}\n\nfunction getActionControlResponse(error: unknown): ActionControlResponse | null {\n const digest = getNextErrorDigest(error);\n if (!digest) return null;\n\n const redirect = parseNextRedirectDigest(digest);\n if (redirect) {\n return {\n kind: \"redirect\",\n url: redirect.url,\n };\n }\n\n const httpError = parseNextHttpErrorDigest(digest);\n if (httpError) {\n if (!Number.isInteger(httpError.status)) {\n return null;\n }\n\n return {\n kind: \"status\",\n statusCode: httpError.status,\n };\n }\n\n return null;\n}\n\nfunction getActionRedirect(error: unknown): AppServerActionRedirect | null {\n const digest = getNextErrorDigest(error);\n if (!digest) return null;\n\n const redirect = parseNextRedirectDigest(digest);\n if (!redirect) return null;\n\n return {\n status: redirect.status,\n type: redirect.type,\n url: redirect.url,\n };\n}\n\nfunction isActionHttpFallback(error: unknown): boolean {\n const digest = getNextErrorDigest(error);\n return digest !== null && parseNextHttpErrorDigest(digest) !== null;\n}\n\nfunction createServerActionErrorResponse(\n error: unknown,\n options: {\n cleanPathname: string;\n clearRequestContext: () => void;\n getAndClearPendingCookies: () => string[];\n reportRequestError: AppServerActionErrorReporter;\n request: Request;\n },\n): Response {\n options.getAndClearPendingCookies();\n console.error(\"[vinext] Server action error:\", error);\n options.reportRequestError(\n normalizeError(error),\n {\n path: options.cleanPathname,\n method: options.request.method,\n headers: Object.fromEntries(options.request.headers.entries()),\n },\n { routerKind: \"App Router\", routePath: options.cleanPathname, routeType: \"action\" },\n );\n options.clearRequestContext();\n return internalServerErrorResponse(\n process.env.NODE_ENV === \"production\"\n ? undefined\n : \"Server action failed: \" + getServerActionFailureMessage(error),\n );\n}\n\nfunction createActionNotFoundResponse(\n actionId: string | null,\n options: {\n clearRequestContext: () => void;\n getAndClearPendingCookies: () => string[];\n },\n): Response {\n options.getAndClearPendingCookies();\n console.warn(getServerActionNotFoundMessage(actionId));\n options.clearRequestContext();\n return createServerActionNotFoundResponse();\n}\n\nexport function isProgressiveServerActionRequest(\n request: Pick<Request, \"method\">,\n contentType: string,\n actionId: string | null,\n): boolean {\n return (\n request.method.toUpperCase() === \"POST\" &&\n contentType.startsWith(\"multipart/form-data\") &&\n !actionId\n );\n}\n\nexport async function handleProgressiveServerActionRequest(\n options: HandleProgressiveServerActionRequestOptions,\n): Promise<Response | null> {\n if (!isProgressiveServerActionRequest(options.request, options.contentType, options.actionId)) {\n return null;\n }\n\n const csrfResponse = validateCsrfOrigin(options.request, options.allowedOrigins);\n if (csrfResponse) {\n return csrfResponse;\n }\n\n const contentLength = parseInt(options.request.headers.get(\"content-length\") || \"0\", 10);\n if (contentLength > options.maxActionBodySize) {\n options.clearRequestContext();\n return payloadTooLargeResponse();\n }\n\n try {\n let body: FormData;\n try {\n // Progressive submissions can still fall through to a regular page render when\n // the multipart body is not an action payload. Read a clone so that fallback\n // code can still consume the original request body.\n body = await options.readFormDataWithLimit(\n options.request.clone(),\n options.maxActionBodySize,\n );\n } catch (error) {\n if (isRequestBodyTooLarge(error)) {\n options.clearRequestContext();\n return payloadTooLargeResponse();\n }\n throw error;\n }\n\n const payloadResponse = await validateServerActionPayload(body);\n if (payloadResponse) {\n options.clearRequestContext();\n return payloadResponse;\n }\n\n const action = await options.decodeAction(body);\n if (typeof action !== \"function\") {\n return null;\n }\n\n let actionControlResponse: ActionControlResponse | null = null;\n const previousHeadersPhase = options.setHeadersAccessPhase(\"action\");\n try {\n await action();\n } catch (error) {\n actionControlResponse = getActionControlResponse(error);\n if (!actionControlResponse) {\n throw error;\n }\n } finally {\n options.setHeadersAccessPhase(previousHeadersPhase);\n }\n\n if (!actionControlResponse) {\n // Next.js decodes form state and re-renders after a successful MPA action.\n // vinext currently supports the redirect/error status cases; successful\n // non-redirect actions intentionally fall through to the page render.\n return null;\n }\n\n const actionPendingCookies = options.getAndClearPendingCookies();\n const actionDraftCookie = options.getDraftModeCookieHeader();\n options.clearRequestContext();\n\n const headers = new Headers();\n if (actionControlResponse.kind === \"redirect\") {\n headers.set(\"Location\", new URL(actionControlResponse.url, options.request.url).toString());\n }\n mergeMiddlewareResponseHeaders(headers, options.middlewareHeaders);\n for (const cookie of actionPendingCookies) {\n headers.append(\"Set-Cookie\", cookie);\n }\n if (actionDraftCookie) {\n headers.append(\"Set-Cookie\", actionDraftCookie);\n }\n\n return new Response(null, {\n status: actionControlResponse.kind === \"redirect\" ? 303 : actionControlResponse.statusCode,\n headers,\n });\n } catch (error) {\n if (isServerActionNotFoundError(error, null)) {\n return createActionNotFoundResponse(null, {\n clearRequestContext: options.clearRequestContext,\n getAndClearPendingCookies: options.getAndClearPendingCookies,\n });\n }\n\n options.getAndClearPendingCookies();\n // Next.js rethrows generic MPA action errors into its page render path.\n // vinext does not yet implement that form-state render path, so unexpected\n // action failures remain request failures here.\n console.error(\"[vinext] Server action error:\", error);\n options.reportRequestError(\n normalizeError(error),\n {\n path: options.cleanPathname,\n method: options.request.method,\n headers: Object.fromEntries(options.request.headers.entries()),\n },\n { routerKind: \"App Router\", routePath: options.cleanPathname, routeType: \"action\" },\n );\n options.clearRequestContext();\n return internalServerErrorResponse(\n process.env.NODE_ENV === \"production\"\n ? undefined\n : \"Server action failed: \" + getServerActionFailureMessage(error),\n );\n }\n}\n\nexport async function handleServerActionRscRequest<\n TElement,\n TRoute extends AppServerActionRoute,\n TInterceptOpts,\n TTemporaryReferences,\n TPage = unknown,\n>(\n options: HandleServerActionRscRequestOptions<\n TElement,\n TRoute,\n TInterceptOpts,\n TTemporaryReferences,\n TPage\n >,\n): Promise<Response | null> {\n if (options.request.method.toUpperCase() !== \"POST\" || !options.actionId) {\n return null;\n }\n\n const csrfResponse = validateCsrfOrigin(options.request, options.allowedOrigins);\n if (csrfResponse) return csrfResponse;\n\n const contentLength = parseInt(options.request.headers.get(\"content-length\") || \"0\", 10);\n if (contentLength > options.maxActionBodySize) {\n options.clearRequestContext();\n return payloadTooLargeResponse();\n }\n\n try {\n let body: string | FormData;\n try {\n body = options.contentType.startsWith(\"multipart/form-data\")\n ? await options.readFormDataWithLimit(options.request, options.maxActionBodySize)\n : await options.readBodyWithLimit(options.request, options.maxActionBodySize);\n } catch (error) {\n if (isRequestBodyTooLarge(error)) {\n options.clearRequestContext();\n return payloadTooLargeResponse();\n }\n throw error;\n }\n\n const payloadResponse = await validateServerActionPayload(body);\n if (payloadResponse) {\n options.clearRequestContext();\n return payloadResponse;\n }\n\n let action: unknown;\n try {\n action = await options.loadServerAction(options.actionId);\n } catch (error) {\n if (isServerActionNotFoundError(error, options.actionId)) {\n return createActionNotFoundResponse(options.actionId, {\n clearRequestContext: options.clearRequestContext,\n getAndClearPendingCookies: options.getAndClearPendingCookies,\n });\n }\n\n throw error;\n }\n\n if (!isAppServerActionFunction(action)) {\n return createActionNotFoundResponse(options.actionId, {\n clearRequestContext: options.clearRequestContext,\n getAndClearPendingCookies: options.getAndClearPendingCookies,\n });\n }\n\n const temporaryReferences = options.createTemporaryReferenceSet();\n const args = await options.decodeReply(body, { temporaryReferences });\n let returnValue: AppServerActionReturnValue;\n let actionRedirect: AppServerActionRedirect | null = null;\n const previousHeadersPhase = options.setHeadersAccessPhase(\"action\");\n try {\n try {\n validateServerActionArgs(args);\n const data = await action.apply(null, args);\n returnValue = { ok: true, data };\n } catch (error) {\n actionRedirect = getActionRedirect(error);\n if (actionRedirect) {\n returnValue = { ok: true, data: undefined };\n } else if (isActionHttpFallback(error)) {\n returnValue = { ok: false, data: error };\n } else {\n console.error(\"[vinext] Server action error:\", error);\n returnValue = { ok: false, data: options.sanitizeErrorForClient(error) };\n }\n }\n } finally {\n options.setHeadersAccessPhase(previousHeadersPhase);\n }\n\n if (actionRedirect) {\n const actionPendingCookies = options.getAndClearPendingCookies();\n const actionDraftCookie = options.getDraftModeCookieHeader();\n options.clearRequestContext();\n const redirectHeaders = new Headers({\n \"Content-Type\": \"text/x-component; charset=utf-8\",\n Vary: VINEXT_RSC_VARY_HEADER,\n });\n mergeMiddlewareResponseHeaders(redirectHeaders, options.middlewareHeaders);\n redirectHeaders.set(\"x-action-redirect\", actionRedirect.url);\n redirectHeaders.set(\"x-action-redirect-type\", actionRedirect.type);\n redirectHeaders.set(\"x-action-redirect-status\", String(actionRedirect.status));\n for (const cookie of actionPendingCookies) {\n redirectHeaders.append(\"Set-Cookie\", cookie);\n }\n if (actionDraftCookie) redirectHeaders.append(\"Set-Cookie\", actionDraftCookie);\n return new Response(\"\", { status: 200, headers: redirectHeaders });\n }\n\n const match = options.matchRoute(options.cleanPathname);\n let element: TElement;\n let errorPattern = match ? match.route.pattern : options.cleanPathname;\n if (match) {\n const { route: actionRoute, params: actionParams } = match;\n const actionRerenderTarget = resolveAppPageActionRerenderTarget({\n cleanPathname: options.cleanPathname,\n currentParams: actionParams,\n currentRoute: actionRoute,\n findIntercept: options.findIntercept,\n getRouteParamNames: options.getRouteParamNames,\n getSourceRoute: options.getSourceRoute,\n isRscRequest: options.isRscRequest,\n toInterceptOpts: options.toInterceptOpts,\n });\n\n options.setNavigationContext({\n pathname: options.cleanPathname,\n searchParams: options.searchParams,\n params: actionRerenderTarget.navigationParams,\n });\n setCurrentFetchCacheMode(\n options.resolveRouteFetchCacheMode?.(actionRerenderTarget.route) ?? null,\n );\n element = options.buildPageElement({\n cleanPathname: options.cleanPathname,\n interceptOpts: actionRerenderTarget.interceptOpts,\n isRscRequest: options.isRscRequest,\n mountedSlotsHeader: options.mountedSlotsHeader,\n params: actionRerenderTarget.params,\n request: options.request,\n route: actionRerenderTarget.route,\n searchParams: options.searchParams,\n });\n errorPattern = actionRerenderTarget.route.pattern;\n } else {\n const actionRouteId = options.createPayloadRouteId(options.cleanPathname, null);\n element = options.createNotFoundElement(actionRouteId);\n }\n\n const onRenderError = options.createRscOnErrorHandler(\n options.request,\n options.cleanPathname,\n errorPattern,\n );\n const rscStream = await options.renderToReadableStream(\n { root: element, returnValue },\n { temporaryReferences, onError: onRenderError },\n );\n\n const actionPendingCookies = options.getAndClearPendingCookies();\n const actionDraftCookie = options.getDraftModeCookieHeader();\n\n const actionHeaders = new Headers({\n \"Content-Type\": \"text/x-component; charset=utf-8\",\n Vary: VINEXT_RSC_VARY_HEADER,\n });\n mergeMiddlewareResponseHeaders(actionHeaders, options.middlewareHeaders);\n const actionResponse = new Response(rscStream, {\n status: options.middlewareStatus ?? 200,\n headers: actionHeaders,\n });\n if (actionPendingCookies.length > 0 || actionDraftCookie) {\n for (const cookie of actionPendingCookies) {\n actionResponse.headers.append(\"Set-Cookie\", cookie);\n }\n if (actionDraftCookie) actionResponse.headers.append(\"Set-Cookie\", actionDraftCookie);\n }\n return actionResponse;\n } catch (error) {\n return createServerActionErrorResponse(error, {\n cleanPathname: options.cleanPathname,\n clearRequestContext: options.clearRequestContext,\n getAndClearPendingCookies: options.getAndClearPendingCookies,\n reportRequestError: options.reportRequestError,\n request: options.request,\n });\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"app-server-action-execution.js","names":[],"sources":["../../src/server/app-server-action-execution.ts"],"sourcesContent":["import { getAndClearActionRevalidationKind, type ActionRevalidationKind } from \"vinext/shims/cache\";\nimport type { HeadersAccessPhase } from \"vinext/shims/headers\";\nimport { type FetchCacheMode, setCurrentFetchCacheMode } from \"vinext/shims/fetch-cache\";\nimport type { ReactFormState } from \"react-dom/client\";\nimport { isExternalUrl } from \"../config/config-matchers.js\";\nimport { addBasePathToPathname, hasBasePath } from \"../utils/base-path.js\";\nimport {\n ACTION_FORWARDED_HEADER,\n ACTION_REDIRECT_HEADER,\n ACTION_REDIRECT_STATUS_HEADER,\n ACTION_REDIRECT_TYPE_HEADER,\n ACTION_REVALIDATED_HEADER,\n} from \"./headers.js\";\nimport {\n VINEXT_RSC_CONTENT_TYPE,\n VINEXT_RSC_VARY_HEADER,\n applyRscCompatibilityIdHeader,\n} from \"./app-rsc-cache-busting.js\";\nimport { resolveAppPageActionRerenderTarget } from \"./app-page-request.js\";\nimport { mergeMiddlewareResponseHeaders } from \"./middleware-response-headers.js\";\nimport {\n APP_RSC_RENDER_MODE_ACTION_RERENDER_PRESERVE_UI,\n type AppRscRenderMode,\n} from \"./app-rsc-render-mode.js\";\nimport {\n getNextErrorDigest,\n parseNextHttpErrorDigest,\n parseNextRedirectDigest,\n} from \"./next-error-digest.js\";\nimport { validateCsrfOrigin, validateServerActionPayload } from \"./request-pipeline.js\";\nimport { readStreamAsTextWithLimit } from \"../utils/text-stream.js\";\nimport {\n createServerActionNotFoundResponse,\n getServerActionNotFoundMessage,\n isServerActionNotFoundError,\n} from \"./server-action-not-found.js\";\nimport { internalServerErrorResponse, payloadTooLargeResponse } from \"./http-error-responses.js\";\n\ntype AppPageParams = Record<string, string | string[]>;\n\ntype AppServerActionErrorReporter = (\n error: Error,\n request: { path: string; method: string; headers: Record<string, string> },\n route: { routerKind: \"App Router\"; routePath: string; routeType: \"action\" },\n) => void;\n\ntype AppServerActionDecoder = (body: FormData) => Promise<unknown>;\ntype AppServerActionFormStateDecoder = (\n actionResult: unknown,\n body: FormData,\n) => Promise<ReactFormState | undefined>;\n\ntype ReadFormDataWithLimit = (request: Request, maxBytes: number) => Promise<FormData>;\n\ntype ReadBodyWithLimit = (request: Request, maxBytes: number) => Promise<string>;\n\ntype AppServerActionFunction = (...args: unknown[]) => unknown;\n\ntype AppServerActionReturnValue =\n | {\n data: unknown;\n ok: true;\n }\n | {\n data: unknown;\n ok: false;\n };\n\ntype AppServerActionRedirect = {\n status: number;\n type: string;\n url: string;\n};\n\ntype AppServerActionRoute = {\n pattern: string;\n};\n\ntype ProgressiveServerActionResult =\n | {\n formState: ReactFormState | null;\n kind: \"form-state\";\n }\n | {\n actionError: unknown;\n actionFailed: true;\n formState: null;\n kind: \"form-state\";\n };\n\ntype AppServerActionMatch<TRoute extends AppServerActionRoute> = {\n params: AppPageParams;\n route: TRoute;\n};\n\ntype AppServerActionIntercept<TPage = unknown> = {\n matchedParams: AppPageParams;\n page: TPage;\n slotId?: string | null;\n slotKey: string;\n sourceRouteIndex: number;\n};\n\ntype BuildServerActionPageElementOptions<TRoute extends AppServerActionRoute, TInterceptOpts> = {\n cleanPathname: string;\n interceptOpts: TInterceptOpts | undefined;\n isRscRequest: boolean;\n mountedSlotsHeader: string | null;\n params: AppPageParams;\n request: Request;\n route: TRoute;\n searchParams: URLSearchParams;\n renderMode: AppRscRenderMode;\n};\n\ntype AppServerActionRscModel<TElement> = {\n /**\n * Omitted when the action did not invalidate page data. This mirrors Next.js'\n * empty Flight payload for non-revalidating fetch actions: the client resolves\n * the action value without committing a visible router update.\n */\n root?: TElement;\n returnValue: AppServerActionReturnValue;\n};\n\ntype RenderServerActionRscStreamOptions<TTemporaryReferences> = {\n onError: (error: unknown) => unknown;\n temporaryReferences: TTemporaryReferences;\n};\n\ntype DecodeServerActionReplyOptions<TTemporaryReferences> = {\n temporaryReferences: TTemporaryReferences;\n};\n\nexport type HandleProgressiveServerActionRequestOptions = {\n actionId: string | null;\n allowedOrigins: string[];\n /** Configured next.config `basePath`. Prefixed onto progressive Location targets. */\n basePath?: string;\n cleanPathname: string;\n clearRequestContext: () => void;\n contentType: string;\n decodeAction: AppServerActionDecoder;\n decodeFormState: AppServerActionFormStateDecoder;\n getAndClearPendingCookies: () => string[];\n getDraftModeCookieHeader: () => string | null | undefined;\n maxActionBodySize: number;\n middlewareHeaders: Headers | null;\n readFormDataWithLimit: ReadFormDataWithLimit;\n reportRequestError: AppServerActionErrorReporter;\n request: Request;\n setHeadersAccessPhase: (phase: HeadersAccessPhase) => HeadersAccessPhase;\n};\n\nexport type HandleServerActionRscRequestOptions<\n TElement,\n TRoute extends AppServerActionRoute,\n TInterceptOpts,\n TTemporaryReferences,\n TPage = unknown,\n> = {\n actionId: string | null;\n allowedOrigins: string[];\n /** Configured next.config `basePath`. Prefixed onto ACTION_REDIRECT_HEADER targets. */\n basePath?: string;\n buildPageElement: (\n options: BuildServerActionPageElementOptions<TRoute, TInterceptOpts>,\n ) => TElement;\n cleanPathname: string;\n clearRequestContext: () => void;\n contentType: string;\n createNotFoundElement: (routeId: string) => TElement;\n createPayloadRouteId: (pathname: string, interceptionContext: string | null) => string;\n createRscOnErrorHandler: (\n request: Request,\n pathname: string,\n pattern: string,\n ) => (error: unknown) => unknown;\n createTemporaryReferenceSet: () => TTemporaryReferences;\n decodeReply: (\n body: string | FormData,\n options: DecodeServerActionReplyOptions<TTemporaryReferences>,\n ) => Promise<unknown[]> | unknown[];\n findIntercept: (pathname: string) => AppServerActionIntercept<TPage> | null;\n getAndClearPendingCookies: () => string[];\n getDraftModeCookieHeader: () => string | null | undefined;\n getRouteParamNames: (route: TRoute) => readonly string[];\n getSourceRoute: (sourceRouteIndex: number) => TRoute | undefined;\n isRscRequest: boolean;\n loadServerAction: (actionId: string) => Promise<unknown>;\n matchRoute: (pathname: string) => AppServerActionMatch<TRoute> | null;\n maxActionBodySize: number;\n middlewareHeaders: Headers | null;\n middlewareStatus: number | null | undefined;\n mountedSlotsHeader: string | null;\n readBodyWithLimit: ReadBodyWithLimit;\n readFormDataWithLimit: ReadFormDataWithLimit;\n renderToReadableStream: (\n model: AppServerActionRscModel<TElement>,\n options: RenderServerActionRscStreamOptions<TTemporaryReferences>,\n ) => BodyInit | null | Promise<BodyInit | null>;\n reportRequestError: AppServerActionErrorReporter;\n resolveRouteFetchCacheMode?: (route: TRoute) => FetchCacheMode | null;\n request: Request;\n sanitizeErrorForClient: (error: unknown) => unknown;\n searchParams: URLSearchParams;\n setHeadersAccessPhase: (phase: HeadersAccessPhase) => HeadersAccessPhase;\n setNavigationContext: (context: {\n params: AppPageParams;\n pathname: string;\n searchParams: URLSearchParams;\n }) => void;\n toInterceptOpts: (intercept: AppServerActionIntercept<TPage>) => TInterceptOpts;\n};\n\n/**\n * Matches Next.js' server action argument cap to prevent stack overflow in\n * Function.prototype.apply when decoding hostile action payloads.\n */\nconst SERVER_ACTION_ARGS_LIMIT = 1000;\nconst ACTION_DID_NOT_REVALIDATE = 0 satisfies ActionRevalidationKind;\nconst ACTION_DID_REVALIDATE_STATIC_AND_DYNAMIC = 1 satisfies ActionRevalidationKind;\n\nfunction setActionRevalidatedHeader(headers: Headers, kind: ActionRevalidationKind): void {\n if (kind === ACTION_DID_NOT_REVALIDATE) return;\n headers.set(ACTION_REVALIDATED_HEADER, JSON.stringify(kind));\n}\n\nfunction resolveActionRevalidationKind(hasModifiedCookies: boolean): ActionRevalidationKind {\n const revalidationKind = getAndClearActionRevalidationKind();\n // Cookie mutations are a hard override to STATIC_AND_DYNAMIC: any cookie\n // change can invalidate downstream cached payloads regardless of what\n // (if anything) the action explicitly revalidated, so we always emit the\n // strongest kind. STATIC_AND_DYNAMIC is also the lowest numeric value, so\n // this matches the max-precedence semantics in markActionRevalidation.\n if (hasModifiedCookies) return ACTION_DID_REVALIDATE_STATIC_AND_DYNAMIC;\n return revalidationKind;\n}\n\nfunction isRequestBodyTooLarge(error: unknown): boolean {\n return error instanceof Error && error.message === \"Request body too large\";\n}\n\nfunction isAppServerActionFunction(action: unknown): action is AppServerActionFunction {\n return typeof action === \"function\";\n}\n\nfunction normalizeError(error: unknown): Error {\n return error instanceof Error ? error : new Error(String(error));\n}\n\nfunction getServerActionFailureMessage(error: unknown): string {\n return error instanceof Error && error.message ? error.message : String(error);\n}\n\nfunction validateServerActionArgs(args: readonly unknown[]): void {\n if (args.length > SERVER_ACTION_ARGS_LIMIT) {\n throw new Error(\n `Server Action arguments list is too long (${args.length}). Maximum allowed is ${SERVER_ACTION_ARGS_LIMIT}.`,\n );\n }\n}\n\nexport async function readActionBodyWithLimit(request: Request, maxBytes: number): Promise<string> {\n if (!request.body) return \"\";\n return readStreamAsTextWithLimit(request.body, maxBytes, () => {\n throw new Error(\"Request body too large\");\n });\n}\n\nexport async function readActionFormDataWithLimit(\n request: Request,\n maxBytes: number,\n): Promise<FormData> {\n if (!request.body) return new FormData();\n\n const reader = request.body.getReader();\n const chunks: Uint8Array[] = [];\n let totalSize = 0;\n\n for (;;) {\n const result = await reader.read();\n if (result.done) break;\n\n totalSize += result.value.byteLength;\n if (totalSize > maxBytes) {\n await reader.cancel();\n throw new Error(\"Request body too large\");\n }\n chunks.push(result.value);\n }\n\n const combined = new Uint8Array(totalSize);\n let offset = 0;\n for (const chunk of chunks) {\n combined.set(chunk, offset);\n offset += chunk.byteLength;\n }\n\n return new Response(combined, {\n headers: { \"Content-Type\": request.headers.get(\"content-type\") || \"\" },\n }).formData();\n}\n\nfunction getActionRedirect(error: unknown): AppServerActionRedirect | null {\n const digest = getNextErrorDigest(error);\n if (!digest) return null;\n\n const redirect = parseNextRedirectDigest(digest);\n if (!redirect) return null;\n\n return {\n status: redirect.status,\n type: redirect.type ?? \"push\",\n url: redirect.url,\n };\n}\n\n/**\n * Prepend the configured next.config `basePath` to a server-action redirect\n * target before it goes on the wire.\n *\n * `redirect(\"/foo\")` called from a server action mounted at `/base/...` must\n * land the browser at `/base/foo`, mirroring how Next.js threads basePath\n * through `addPathPrefix(getURLFromRedirectError(err), basePath)` in\n * `app-render.tsx` for SSR redirects and in `action-handler.ts` for action\n * redirects.\n *\n * Idempotent and external-aware:\n * - Empty basePath → returned unchanged.\n * - External URLs (`http://`, `https://`, `data:`, protocol-relative `//`)\n * are returned unchanged because the framework does not own those routes.\n * - Targets that already start with the configured basePath are returned\n * unchanged so this helper can be applied at any layer without risk of\n * double-prefixing (`/base/base/foo`).\n *\n * Exported for tests. Used by both the progressive (no-JS form POST) and\n * RSC (`ACTION_REDIRECT_HEADER`) action redirect paths below.\n *\n * @see https://github.com/vercel/next.js/blob/canary/packages/next/src/server/app-render/action-handler.ts\n */\nexport function applyActionRedirectBasePath(url: string, basePath: string): string {\n if (!basePath) return url;\n if (isExternalUrl(url)) return url;\n // Pathnames that already include basePath are returned as-is.\n if (hasBasePath(url, basePath)) return url;\n // Relative or hash/query-only targets cannot be prefixed safely without an\n // origin; leave them to the caller's URL resolution.\n if (!url.startsWith(\"/\")) return url;\n // Split off optional query+hash so addBasePathToPathname only operates on\n // the path. We must accept hash too because Next.js redirect targets may\n // contain \"#anchor\".\n const queryIndex = url.indexOf(\"?\");\n const hashIndex = url.indexOf(\"#\");\n const splitAt =\n queryIndex === -1 ? hashIndex : hashIndex === -1 ? queryIndex : Math.min(queryIndex, hashIndex);\n const pathname = splitAt === -1 ? url : url.slice(0, splitAt);\n const suffix = splitAt === -1 ? \"\" : url.slice(splitAt);\n return `${addBasePathToPathname(pathname, basePath)}${suffix}`;\n}\n\nfunction getActionHttpFallbackStatus(error: unknown): number | null {\n const digest = getNextErrorDigest(error);\n if (!digest) return null;\n\n const httpError = parseNextHttpErrorDigest(digest);\n if (!httpError || !Number.isInteger(httpError.status)) return null;\n\n return httpError.status;\n}\n\nfunction createServerActionErrorResponse(\n error: unknown,\n options: {\n cleanPathname: string;\n clearRequestContext: () => void;\n getAndClearPendingCookies: () => string[];\n reportRequestError: AppServerActionErrorReporter;\n request: Request;\n },\n): Response {\n options.getAndClearPendingCookies();\n console.error(\"[vinext] Server action error:\", error);\n options.reportRequestError(\n normalizeError(error),\n {\n path: options.cleanPathname,\n method: options.request.method,\n headers: Object.fromEntries(options.request.headers.entries()),\n },\n { routerKind: \"App Router\", routePath: options.cleanPathname, routeType: \"action\" },\n );\n options.clearRequestContext();\n return internalServerErrorResponse(\n process.env.NODE_ENV === \"production\"\n ? undefined\n : \"Server action failed: \" + getServerActionFailureMessage(error),\n );\n}\n\nfunction createActionNotFoundResponse(\n actionId: string | null,\n options: {\n clearRequestContext: () => void;\n getAndClearPendingCookies: () => string[];\n },\n): Response {\n options.getAndClearPendingCookies();\n console.warn(getServerActionNotFoundMessage(actionId));\n options.clearRequestContext();\n return createServerActionNotFoundResponse();\n}\n\nexport function isProgressiveServerActionRequest(\n request: Pick<Request, \"method\">,\n contentType: string,\n actionId: string | null,\n): boolean {\n return (\n request.method.toUpperCase() === \"POST\" &&\n contentType.startsWith(\"multipart/form-data\") &&\n !actionId\n );\n}\n\nexport async function handleProgressiveServerActionRequest(\n options: HandleProgressiveServerActionRequestOptions,\n): Promise<Response | ProgressiveServerActionResult | null> {\n if (!isProgressiveServerActionRequest(options.request, options.contentType, options.actionId)) {\n return null;\n }\n\n // Defensive guard: prevent infinite forwarding loops. See handleServerActionRscRequest.\n if (options.request.headers.get(ACTION_FORWARDED_HEADER)) {\n return createActionNotFoundResponse(null, {\n clearRequestContext: options.clearRequestContext,\n getAndClearPendingCookies: options.getAndClearPendingCookies,\n });\n }\n\n const csrfResponse = validateCsrfOrigin(options.request, options.allowedOrigins);\n if (csrfResponse) {\n return csrfResponse;\n }\n\n const contentLength = parseInt(options.request.headers.get(\"content-length\") || \"0\", 10);\n if (contentLength > options.maxActionBodySize) {\n options.clearRequestContext();\n return payloadTooLargeResponse();\n }\n\n try {\n let body: FormData;\n try {\n // Progressive submissions can still fall through to a regular page render when\n // the multipart body is not an action payload. Read a clone so that fallback\n // code can still consume the original request body.\n body = await options.readFormDataWithLimit(\n options.request.clone(),\n options.maxActionBodySize,\n );\n } catch (error) {\n if (isRequestBodyTooLarge(error)) {\n options.clearRequestContext();\n return payloadTooLargeResponse();\n }\n throw error;\n }\n\n const payloadResponse = await validateServerActionPayload(body);\n if (payloadResponse) {\n options.clearRequestContext();\n return payloadResponse;\n }\n\n const action = await options.decodeAction(body);\n if (!isAppServerActionFunction(action)) {\n return null;\n }\n\n let actionRedirect: AppServerActionRedirect | null = null;\n let actionError: unknown = undefined;\n let actionFailed = false;\n let actionResult: unknown;\n const previousHeadersPhase = options.setHeadersAccessPhase(\"action\");\n try {\n actionResult = await action();\n } catch (error) {\n actionRedirect = getActionRedirect(error);\n if (!actionRedirect) {\n actionError = error;\n actionFailed = true;\n const isControlFlow =\n getActionHttpFallbackStatus(error) !== null || isServerActionNotFoundError(error, null);\n if (!isControlFlow) {\n console.error(\"[vinext] Server action error:\", error);\n options.reportRequestError(\n normalizeError(error),\n {\n path: options.cleanPathname,\n method: options.request.method,\n headers: Object.fromEntries(options.request.headers.entries()),\n },\n { routerKind: \"App Router\", routePath: options.cleanPathname, routeType: \"action\" },\n );\n }\n }\n } finally {\n options.setHeadersAccessPhase(previousHeadersPhase);\n }\n\n if (!actionRedirect) {\n getAndClearActionRevalidationKind();\n if (actionFailed) {\n return { kind: \"form-state\", formState: null, actionError, actionFailed };\n }\n\n const formState = await options.decodeFormState(actionResult, body);\n return { kind: \"form-state\", formState: formState ?? null };\n }\n\n const actionPendingCookies = options.getAndClearPendingCookies();\n const actionDraftCookie = options.getDraftModeCookieHeader();\n const actionRevalidationKind = resolveActionRevalidationKind(\n actionPendingCookies.length > 0 || Boolean(actionDraftCookie),\n );\n options.clearRequestContext();\n\n const headers = new Headers();\n // Prefix the configured basePath onto the redirect target before it\n // becomes an absolute Location URL. Mirrors Next.js, which threads\n // basePath through `addPathPrefix(...)` for server-action redirects.\n const prefixedRedirectUrl = applyActionRedirectBasePath(\n actionRedirect.url,\n options.basePath ?? \"\",\n );\n headers.set(\"Location\", new URL(prefixedRedirectUrl, options.request.url).toString());\n mergeMiddlewareResponseHeaders(headers, options.middlewareHeaders);\n for (const cookie of actionPendingCookies) {\n headers.append(\"Set-Cookie\", cookie);\n }\n if (actionDraftCookie) {\n headers.append(\"Set-Cookie\", actionDraftCookie);\n }\n setActionRevalidatedHeader(headers, actionRevalidationKind);\n\n return new Response(null, {\n status: 303,\n headers,\n });\n } catch (error) {\n if (isServerActionNotFoundError(error, null)) {\n return createActionNotFoundResponse(null, {\n clearRequestContext: options.clearRequestContext,\n getAndClearPendingCookies: options.getAndClearPendingCookies,\n });\n }\n\n getAndClearActionRevalidationKind();\n options.getAndClearPendingCookies();\n console.error(\"[vinext] Server action payload parsing error:\", error);\n options.reportRequestError(\n normalizeError(error),\n {\n path: options.cleanPathname,\n method: options.request.method,\n headers: Object.fromEntries(options.request.headers.entries()),\n },\n { routerKind: \"App Router\", routePath: options.cleanPathname, routeType: \"action\" },\n );\n options.clearRequestContext();\n return internalServerErrorResponse(\n process.env.NODE_ENV === \"production\"\n ? undefined\n : \"Server action parsing failed: \" + getServerActionFailureMessage(error),\n );\n }\n}\n\nexport async function handleServerActionRscRequest<\n TElement,\n TRoute extends AppServerActionRoute,\n TInterceptOpts,\n TTemporaryReferences,\n TPage = unknown,\n>(\n options: HandleServerActionRscRequestOptions<\n TElement,\n TRoute,\n TInterceptOpts,\n TTemporaryReferences,\n TPage\n >,\n): Promise<Response | null> {\n if (options.request.method.toUpperCase() !== \"POST\" || !options.actionId) {\n return null;\n }\n\n // Defensive guard: if this request has already been forwarded between workers,\n // do not attempt to process it again. Prevents infinite forwarding loops when\n // middleware rewrites action POSTs. Matches Next.js behavior:\n // https://github.com/vercel/next.js/commit/20892dd44e1321c13f755f051e48c3cadd75204b\n if (options.request.headers.get(ACTION_FORWARDED_HEADER)) {\n return createActionNotFoundResponse(options.actionId, {\n clearRequestContext: options.clearRequestContext,\n getAndClearPendingCookies: options.getAndClearPendingCookies,\n });\n }\n\n const csrfResponse = validateCsrfOrigin(options.request, options.allowedOrigins);\n if (csrfResponse) return csrfResponse;\n\n const contentLength = parseInt(options.request.headers.get(\"content-length\") || \"0\", 10);\n if (contentLength > options.maxActionBodySize) {\n options.clearRequestContext();\n return payloadTooLargeResponse();\n }\n\n try {\n let body: string | FormData;\n try {\n body = options.contentType.startsWith(\"multipart/form-data\")\n ? await options.readFormDataWithLimit(options.request, options.maxActionBodySize)\n : await options.readBodyWithLimit(options.request, options.maxActionBodySize);\n } catch (error) {\n if (isRequestBodyTooLarge(error)) {\n options.clearRequestContext();\n return payloadTooLargeResponse();\n }\n throw error;\n }\n\n const payloadResponse = await validateServerActionPayload(body);\n if (payloadResponse) {\n options.clearRequestContext();\n return payloadResponse;\n }\n\n let action: unknown;\n try {\n action = await options.loadServerAction(options.actionId);\n } catch (error) {\n if (isServerActionNotFoundError(error, options.actionId)) {\n return createActionNotFoundResponse(options.actionId, {\n clearRequestContext: options.clearRequestContext,\n getAndClearPendingCookies: options.getAndClearPendingCookies,\n });\n }\n\n throw error;\n }\n\n if (!isAppServerActionFunction(action)) {\n return createActionNotFoundResponse(options.actionId, {\n clearRequestContext: options.clearRequestContext,\n getAndClearPendingCookies: options.getAndClearPendingCookies,\n });\n }\n\n const temporaryReferences = options.createTemporaryReferenceSet();\n const args = await options.decodeReply(body, { temporaryReferences });\n let returnValue: AppServerActionReturnValue;\n let actionRedirect: AppServerActionRedirect | null = null;\n let actionStatus = 200;\n const previousHeadersPhase = options.setHeadersAccessPhase(\"action\");\n try {\n try {\n validateServerActionArgs(args);\n const data = await action.apply(null, args);\n returnValue = { ok: true, data };\n } catch (error) {\n actionRedirect = getActionRedirect(error);\n if (actionRedirect) {\n returnValue = { ok: true, data: undefined };\n } else {\n const httpFallbackStatus = getActionHttpFallbackStatus(error);\n if (httpFallbackStatus !== null) {\n actionStatus = httpFallbackStatus;\n returnValue = { ok: false, data: error };\n } else {\n console.error(\"[vinext] Server action error:\", error);\n returnValue = { ok: false, data: options.sanitizeErrorForClient(error) };\n }\n }\n }\n } finally {\n options.setHeadersAccessPhase(previousHeadersPhase);\n }\n\n if (actionRedirect) {\n const actionPendingCookies = options.getAndClearPendingCookies();\n const actionDraftCookie = options.getDraftModeCookieHeader();\n const actionRevalidationKind = resolveActionRevalidationKind(\n actionPendingCookies.length > 0 || Boolean(actionDraftCookie),\n );\n options.clearRequestContext();\n const redirectHeaders = new Headers({\n \"Content-Type\": VINEXT_RSC_CONTENT_TYPE,\n Vary: VINEXT_RSC_VARY_HEADER,\n });\n mergeMiddlewareResponseHeaders(redirectHeaders, options.middlewareHeaders);\n applyRscCompatibilityIdHeader(redirectHeaders);\n // Prefix basePath onto the redirect target. The client-side handler in\n // app-browser-entry reads ACTION_REDIRECT_HEADER and calls\n // window.location.assign/replace verbatim, so the value must already\n // be a basePath-prefixed URL.\n redirectHeaders.set(\n ACTION_REDIRECT_HEADER,\n applyActionRedirectBasePath(actionRedirect.url, options.basePath ?? \"\"),\n );\n redirectHeaders.set(ACTION_REDIRECT_TYPE_HEADER, actionRedirect.type);\n redirectHeaders.set(ACTION_REDIRECT_STATUS_HEADER, String(actionRedirect.status));\n for (const cookie of actionPendingCookies) {\n redirectHeaders.append(\"Set-Cookie\", cookie);\n }\n if (actionDraftCookie) redirectHeaders.append(\"Set-Cookie\", actionDraftCookie);\n setActionRevalidatedHeader(redirectHeaders, actionRevalidationKind);\n return new Response(\"\", { status: 200, headers: redirectHeaders });\n }\n\n const actionPendingCookies = options.getAndClearPendingCookies();\n const actionDraftCookie = options.getDraftModeCookieHeader();\n const actionRevalidationKind = resolveActionRevalidationKind(\n actionPendingCookies.length > 0 || Boolean(actionDraftCookie),\n );\n\n const shouldSkipPageRendering = actionRevalidationKind === ACTION_DID_NOT_REVALIDATE;\n if (shouldSkipPageRendering) {\n const onRenderError = options.createRscOnErrorHandler(\n options.request,\n options.cleanPathname,\n options.cleanPathname,\n );\n const rscStream = await options.renderToReadableStream(\n { returnValue },\n { temporaryReferences, onError: onRenderError },\n );\n\n options.clearRequestContext();\n\n const actionHeaders = new Headers({\n \"Content-Type\": VINEXT_RSC_CONTENT_TYPE,\n Vary: VINEXT_RSC_VARY_HEADER,\n });\n mergeMiddlewareResponseHeaders(actionHeaders, options.middlewareHeaders);\n applyRscCompatibilityIdHeader(actionHeaders);\n\n return new Response(rscStream, {\n status: options.middlewareStatus ?? actionStatus,\n headers: actionHeaders,\n });\n }\n\n const match = options.matchRoute(options.cleanPathname);\n let element: TElement;\n let errorPattern = match ? match.route.pattern : options.cleanPathname;\n if (match) {\n const { route: actionRoute, params: actionParams } = match;\n const actionRerenderTarget = resolveAppPageActionRerenderTarget({\n cleanPathname: options.cleanPathname,\n currentParams: actionParams,\n currentRoute: actionRoute,\n findIntercept: options.findIntercept,\n getRouteParamNames: options.getRouteParamNames,\n getSourceRoute: options.getSourceRoute,\n isRscRequest: options.isRscRequest,\n toInterceptOpts: options.toInterceptOpts,\n });\n\n options.setNavigationContext({\n pathname: options.cleanPathname,\n searchParams: options.searchParams,\n params: actionRerenderTarget.navigationParams,\n });\n setCurrentFetchCacheMode(\n options.resolveRouteFetchCacheMode?.(actionRerenderTarget.route) ?? null,\n );\n element = options.buildPageElement({\n cleanPathname: options.cleanPathname,\n interceptOpts: actionRerenderTarget.interceptOpts,\n isRscRequest: options.isRscRequest,\n mountedSlotsHeader: options.mountedSlotsHeader,\n params: actionRerenderTarget.params,\n request: options.request,\n route: actionRerenderTarget.route,\n searchParams: options.searchParams,\n renderMode: APP_RSC_RENDER_MODE_ACTION_RERENDER_PRESERVE_UI,\n });\n errorPattern = actionRerenderTarget.route.pattern;\n } else {\n const actionRouteId = options.createPayloadRouteId(options.cleanPathname, null);\n element = options.createNotFoundElement(actionRouteId);\n }\n\n const onRenderError = options.createRscOnErrorHandler(\n options.request,\n options.cleanPathname,\n errorPattern,\n );\n const rscStream = await options.renderToReadableStream(\n { root: element, returnValue },\n { temporaryReferences, onError: onRenderError },\n );\n\n const actionHeaders = new Headers({\n \"Content-Type\": VINEXT_RSC_CONTENT_TYPE,\n Vary: VINEXT_RSC_VARY_HEADER,\n });\n mergeMiddlewareResponseHeaders(actionHeaders, options.middlewareHeaders);\n applyRscCompatibilityIdHeader(actionHeaders);\n setActionRevalidatedHeader(actionHeaders, actionRevalidationKind);\n const actionResponse = new Response(rscStream, {\n status: options.middlewareStatus ?? actionStatus,\n headers: actionHeaders,\n });\n if (actionPendingCookies.length > 0 || actionDraftCookie) {\n for (const cookie of actionPendingCookies) {\n actionResponse.headers.append(\"Set-Cookie\", cookie);\n }\n if (actionDraftCookie) actionResponse.headers.append(\"Set-Cookie\", actionDraftCookie);\n }\n return actionResponse;\n } catch (error) {\n getAndClearActionRevalidationKind();\n return createServerActionErrorResponse(error, {\n cleanPathname: options.cleanPathname,\n clearRequestContext: options.clearRequestContext,\n getAndClearPendingCookies: options.getAndClearPendingCookies,\n reportRequestError: options.reportRequestError,\n request: options.request,\n });\n }\n}\n"],"mappings":"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"}
|