vinext 0.0.51 → 0.0.53
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/build/clean-output.d.ts +14 -0
- package/dist/build/clean-output.js +36 -0
- package/dist/build/clean-output.js.map +1 -0
- package/dist/build/precompress.d.ts +7 -7
- package/dist/build/precompress.js +18 -17
- package/dist/build/precompress.js.map +1 -1
- package/dist/build/prerender.d.ts +9 -16
- package/dist/build/prerender.js +88 -50
- package/dist/build/prerender.js.map +1 -1
- package/dist/build/run-prerender.js +10 -1
- package/dist/build/run-prerender.js.map +1 -1
- package/dist/build/static-export.d.ts +5 -0
- package/dist/build/static-export.js +8 -3
- package/dist/build/static-export.js.map +1 -1
- package/dist/check.js +4 -0
- package/dist/check.js.map +1 -1
- package/dist/cli-args.d.ts +1 -0
- package/dist/cli-args.js +5 -0
- package/dist/cli-args.js.map +1 -1
- package/dist/cli.js +58 -4
- package/dist/cli.js.map +1 -1
- package/dist/client/instrumentation-client-inject.d.ts +34 -0
- package/dist/client/instrumentation-client-inject.js +57 -0
- package/dist/client/instrumentation-client-inject.js.map +1 -0
- package/dist/client/navigation-runtime.d.ts +60 -0
- package/dist/client/navigation-runtime.js +171 -0
- package/dist/client/navigation-runtime.js.map +1 -0
- package/dist/client/pages-router-link-navigation.d.ts +26 -0
- package/dist/client/pages-router-link-navigation.js +14 -0
- package/dist/client/pages-router-link-navigation.js.map +1 -0
- package/dist/client/vinext-next-data.d.ts +14 -3
- package/dist/client/vinext-next-data.js +50 -1
- package/dist/client/vinext-next-data.js.map +1 -0
- package/dist/client/window-next.d.ts +10 -2
- package/dist/client/window-next.js.map +1 -1
- package/dist/cloudflare/kv-cache-handler.js +2 -1
- package/dist/cloudflare/kv-cache-handler.js.map +1 -1
- package/dist/cloudflare/tpr.js +1 -1
- package/dist/cloudflare/tpr.js.map +1 -1
- package/dist/config/config-matchers.d.ts +63 -16
- package/dist/config/config-matchers.js +145 -9
- package/dist/config/config-matchers.js.map +1 -1
- package/dist/config/next-config.d.ts +32 -5
- package/dist/config/next-config.js +55 -15
- package/dist/config/next-config.js.map +1 -1
- package/dist/deploy.js +130 -46
- package/dist/deploy.js.map +1 -1
- package/dist/entries/app-browser-entry.js +9 -3
- package/dist/entries/app-browser-entry.js.map +1 -1
- package/dist/entries/app-rsc-entry.d.ts +4 -2
- package/dist/entries/app-rsc-entry.js +76 -16
- package/dist/entries/app-rsc-entry.js.map +1 -1
- package/dist/entries/app-rsc-manifest.d.ts +1 -0
- package/dist/entries/app-rsc-manifest.js +53 -6
- package/dist/entries/app-rsc-manifest.js.map +1 -1
- package/dist/entries/app-ssr-entry.d.ts +3 -3
- package/dist/entries/app-ssr-entry.js +4 -4
- package/dist/entries/app-ssr-entry.js.map +1 -1
- package/dist/entries/pages-client-entry.js +40 -3
- package/dist/entries/pages-client-entry.js.map +1 -1
- package/dist/entries/pages-server-entry.js +261 -31
- package/dist/entries/pages-server-entry.js.map +1 -1
- package/dist/entries/runtime-entry-module.d.ts +2 -1
- package/dist/entries/runtime-entry-module.js +9 -3
- package/dist/entries/runtime-entry-module.js.map +1 -1
- package/dist/index.js +161 -46
- package/dist/index.js.map +1 -1
- package/dist/plugins/css-data-url.d.ts +7 -0
- package/dist/plugins/css-data-url.js +81 -0
- package/dist/plugins/css-data-url.js.map +1 -0
- package/dist/plugins/fonts.js +30 -5
- package/dist/plugins/fonts.js.map +1 -1
- package/dist/plugins/middleware-server-only.d.ts +54 -0
- package/dist/plugins/middleware-server-only.js +91 -0
- package/dist/plugins/middleware-server-only.js.map +1 -0
- package/dist/plugins/optimize-imports.js +4 -4
- package/dist/plugins/optimize-imports.js.map +1 -1
- package/dist/plugins/strip-server-exports.js +5 -8
- package/dist/plugins/strip-server-exports.js.map +1 -1
- package/dist/routing/app-route-graph.d.ts +20 -1
- package/dist/routing/app-route-graph.js +58 -6
- package/dist/routing/app-route-graph.js.map +1 -1
- package/dist/routing/app-router.d.ts +2 -2
- package/dist/routing/app-router.js +2 -2
- package/dist/routing/app-router.js.map +1 -1
- package/dist/routing/route-trie.js +13 -18
- package/dist/routing/route-trie.js.map +1 -1
- package/dist/routing/utils.d.ts +12 -1
- package/dist/routing/utils.js +18 -1
- package/dist/routing/utils.js.map +1 -1
- package/dist/server/api-handler.js +153 -42
- package/dist/server/api-handler.js.map +1 -1
- package/dist/server/app-browser-action-result.d.ts +16 -1
- package/dist/server/app-browser-action-result.js +15 -1
- package/dist/server/app-browser-action-result.js.map +1 -1
- package/dist/server/app-browser-entry.js +309 -155
- package/dist/server/app-browser-entry.js.map +1 -1
- package/dist/server/app-browser-interception-context.d.ts +24 -0
- package/dist/server/app-browser-interception-context.js +32 -0
- package/dist/server/app-browser-interception-context.js.map +1 -0
- package/dist/server/app-browser-navigation-controller.d.ts +3 -1
- package/dist/server/app-browser-navigation-controller.js +5 -1
- package/dist/server/app-browser-navigation-controller.js.map +1 -1
- package/dist/server/app-browser-rsc-redirect.d.ts +2 -1
- package/dist/server/app-browser-rsc-redirect.js +2 -2
- package/dist/server/app-browser-rsc-redirect.js.map +1 -1
- package/dist/server/app-browser-state.d.ts +18 -1
- package/dist/server/app-browser-state.js +19 -1
- package/dist/server/app-browser-state.js.map +1 -1
- package/dist/server/app-browser-stream.d.ts +5 -14
- package/dist/server/app-browser-stream.js +13 -7
- package/dist/server/app-browser-stream.js.map +1 -1
- package/dist/server/app-browser-visible-commit.d.ts +2 -1
- package/dist/server/app-browser-visible-commit.js +1 -0
- package/dist/server/app-browser-visible-commit.js.map +1 -1
- package/dist/server/app-elements-wire.d.ts +10 -5
- package/dist/server/app-elements-wire.js +84 -2
- package/dist/server/app-elements-wire.js.map +1 -1
- package/dist/server/app-elements.d.ts +3 -2
- package/dist/server/app-elements.js +3 -2
- package/dist/server/app-elements.js.map +1 -1
- package/dist/server/app-fallback-renderer.d.ts +12 -3
- package/dist/server/app-fallback-renderer.js +15 -8
- package/dist/server/app-fallback-renderer.js.map +1 -1
- package/dist/server/app-history-state.js +6 -2
- package/dist/server/app-history-state.js.map +1 -1
- package/dist/server/app-interception-context-header.d.ts +33 -0
- package/dist/server/app-interception-context-header.js +44 -0
- package/dist/server/app-interception-context-header.js.map +1 -0
- package/dist/server/app-middleware.d.ts +13 -0
- package/dist/server/app-middleware.js +3 -1
- package/dist/server/app-middleware.js.map +1 -1
- package/dist/server/app-mounted-slots-header.d.ts +19 -0
- package/dist/server/app-mounted-slots-header.js +40 -1
- package/dist/server/app-mounted-slots-header.js.map +1 -1
- package/dist/server/app-optimistic-routing.d.ts +54 -0
- package/dist/server/app-optimistic-routing.js +208 -0
- package/dist/server/app-optimistic-routing.js.map +1 -0
- package/dist/server/app-page-boundary-render.d.ts +1 -0
- package/dist/server/app-page-boundary-render.js +2 -0
- 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 +2 -0
- package/dist/server/app-page-boundary.js.map +1 -1
- package/dist/server/app-page-cache.d.ts +15 -1
- package/dist/server/app-page-cache.js +68 -7
- package/dist/server/app-page-cache.js.map +1 -1
- package/dist/server/app-page-dispatch.d.ts +5 -0
- package/dist/server/app-page-dispatch.js +39 -5
- package/dist/server/app-page-dispatch.js.map +1 -1
- package/dist/server/app-page-element-builder.d.ts +2 -1
- package/dist/server/app-page-element-builder.js +7 -3
- package/dist/server/app-page-element-builder.js.map +1 -1
- package/dist/server/app-page-execution.d.ts +29 -1
- package/dist/server/app-page-execution.js +91 -4
- package/dist/server/app-page-execution.js.map +1 -1
- package/dist/server/app-page-head.d.ts +1 -0
- package/dist/server/app-page-head.js +29 -2
- package/dist/server/app-page-head.js.map +1 -1
- package/dist/server/app-page-probe.js +1 -1
- package/dist/server/app-page-render-observation.js +1 -1
- package/dist/server/app-page-render.d.ts +3 -0
- package/dist/server/app-page-render.js +7 -3
- package/dist/server/app-page-render.js.map +1 -1
- package/dist/server/app-page-response.d.ts +11 -1
- package/dist/server/app-page-response.js +18 -5
- package/dist/server/app-page-response.js.map +1 -1
- package/dist/server/app-page-route-wiring.d.ts +1 -0
- package/dist/server/app-page-route-wiring.js +35 -15
- package/dist/server/app-page-route-wiring.js.map +1 -1
- package/dist/server/app-page-stream.d.ts +4 -0
- package/dist/server/app-page-stream.js +3 -0
- package/dist/server/app-page-stream.js.map +1 -1
- package/dist/server/app-prerender-static-params.d.ts +2 -1
- package/dist/server/app-prerender-static-params.js +44 -8
- package/dist/server/app-prerender-static-params.js.map +1 -1
- package/dist/server/app-route-handler-cache.d.ts +2 -2
- package/dist/server/app-route-handler-cache.js +3 -2
- package/dist/server/app-route-handler-cache.js.map +1 -1
- package/dist/server/app-route-handler-dispatch.d.ts +7 -1
- package/dist/server/app-route-handler-dispatch.js +4 -1
- package/dist/server/app-route-handler-dispatch.js.map +1 -1
- package/dist/server/app-route-handler-execution.d.ts +18 -2
- package/dist/server/app-route-handler-execution.js +1 -0
- package/dist/server/app-route-handler-execution.js.map +1 -1
- package/dist/server/app-route-handler-response.js +6 -5
- package/dist/server/app-route-handler-response.js.map +1 -1
- package/dist/server/app-router-entry.js +6 -2
- package/dist/server/app-router-entry.js.map +1 -1
- package/dist/server/app-rsc-handler.d.ts +11 -1
- package/dist/server/app-rsc-handler.js +48 -21
- package/dist/server/app-rsc-handler.js.map +1 -1
- package/dist/server/app-rsc-render-mode.d.ts +4 -3
- package/dist/server/app-rsc-render-mode.js +7 -1
- package/dist/server/app-rsc-render-mode.js.map +1 -1
- package/dist/server/app-rsc-request-normalization.d.ts +4 -1
- package/dist/server/app-rsc-request-normalization.js +6 -2
- package/dist/server/app-rsc-request-normalization.js.map +1 -1
- package/dist/server/app-rsc-response-finalizer.d.ts +8 -1
- package/dist/server/app-rsc-response-finalizer.js +10 -3
- package/dist/server/app-rsc-response-finalizer.js.map +1 -1
- package/dist/server/app-rsc-route-matching.js +2 -2
- package/dist/server/app-rsc-route-matching.js.map +1 -1
- package/dist/server/app-segment-config.d.ts +4 -1
- package/dist/server/app-segment-config.js +6 -1
- package/dist/server/app-segment-config.js.map +1 -1
- package/dist/server/app-server-action-execution.d.ts +1 -0
- package/dist/server/app-server-action-execution.js +5 -1
- package/dist/server/app-server-action-execution.js.map +1 -1
- package/dist/server/app-ssr-entry.d.ts +2 -0
- package/dist/server/app-ssr-entry.js +92 -55
- package/dist/server/app-ssr-entry.js.map +1 -1
- package/dist/server/app-ssr-stream.d.ts +30 -2
- package/dist/server/app-ssr-stream.js +95 -8
- package/dist/server/app-ssr-stream.js.map +1 -1
- package/dist/server/app-static-generation.d.ts +1 -0
- package/dist/server/app-static-generation.js +2 -1
- package/dist/server/app-static-generation.js.map +1 -1
- package/dist/server/artifact-compatibility.d.ts +1 -1
- package/dist/server/artifact-compatibility.js.map +1 -1
- package/dist/server/cache-headers.d.ts +7 -0
- package/dist/server/cache-headers.js +19 -0
- package/dist/server/cache-headers.js.map +1 -0
- package/dist/server/cache-proof.d.ts +49 -3
- package/dist/server/cache-proof.js +78 -22
- package/dist/server/cache-proof.js.map +1 -1
- package/dist/server/client-reuse-manifest.d.ts +99 -0
- package/dist/server/client-reuse-manifest.js +212 -0
- package/dist/server/client-reuse-manifest.js.map +1 -0
- package/dist/server/default-global-error-module.d.ts +20 -0
- package/dist/server/default-global-error-module.js +20 -0
- package/dist/server/default-global-error-module.js.map +1 -0
- package/dist/server/default-not-found-module.d.ts +20 -0
- package/dist/server/default-not-found-module.js +20 -0
- package/dist/server/default-not-found-module.js.map +1 -0
- package/dist/server/dev-server.d.ts +10 -2
- package/dist/server/dev-server.js +99 -36
- package/dist/server/dev-server.js.map +1 -1
- package/dist/server/edge-api-runtime.d.ts +5 -0
- package/dist/server/edge-api-runtime.js +8 -0
- package/dist/server/edge-api-runtime.js.map +1 -0
- package/dist/server/headers.d.ts +22 -1
- package/dist/server/headers.js +22 -1
- package/dist/server/headers.js.map +1 -1
- package/dist/server/http-error-responses.d.ts +16 -1
- package/dist/server/http-error-responses.js +21 -1
- package/dist/server/http-error-responses.js.map +1 -1
- package/dist/server/image-optimization.d.ts +13 -4
- package/dist/server/image-optimization.js +15 -4
- package/dist/server/image-optimization.js.map +1 -1
- package/dist/server/isr-cache.d.ts +6 -2
- package/dist/server/isr-cache.js +20 -4
- package/dist/server/isr-cache.js.map +1 -1
- package/dist/server/middleware-runtime.d.ts +15 -0
- package/dist/server/middleware-runtime.js +59 -7
- package/dist/server/middleware-runtime.js.map +1 -1
- package/dist/server/middleware.d.ts +1 -1
- package/dist/server/middleware.js +5 -3
- package/dist/server/middleware.js.map +1 -1
- package/dist/server/navigation-planner.d.ts +9 -3
- package/dist/server/navigation-planner.js +98 -25
- package/dist/server/navigation-planner.js.map +1 -1
- package/dist/server/navigation-trace.d.ts +2 -1
- package/dist/server/navigation-trace.js +1 -0
- package/dist/server/navigation-trace.js.map +1 -1
- package/dist/server/pages-api-route.d.ts +45 -1
- package/dist/server/pages-api-route.js +27 -4
- package/dist/server/pages-api-route.js.map +1 -1
- package/dist/server/pages-body-parser-config.d.ts +60 -0
- package/dist/server/pages-body-parser-config.js +79 -0
- package/dist/server/pages-body-parser-config.js.map +1 -0
- package/dist/server/pages-data-route.d.ts +77 -0
- package/dist/server/pages-data-route.js +98 -0
- package/dist/server/pages-data-route.js.map +1 -0
- package/dist/server/pages-default-404.d.ts +31 -0
- package/dist/server/pages-default-404.js +40 -0
- package/dist/server/pages-default-404.js.map +1 -0
- package/dist/server/pages-i18n.d.ts +51 -1
- package/dist/server/pages-i18n.js +61 -1
- package/dist/server/pages-i18n.js.map +1 -1
- package/dist/server/pages-node-compat.d.ts +10 -0
- package/dist/server/pages-node-compat.js +12 -1
- package/dist/server/pages-node-compat.js.map +1 -1
- package/dist/server/pages-page-data.d.ts +69 -2
- package/dist/server/pages-page-data.js +47 -31
- package/dist/server/pages-page-data.js.map +1 -1
- package/dist/server/pages-page-response.d.ts +13 -1
- package/dist/server/pages-page-response.js +16 -11
- package/dist/server/pages-page-response.js.map +1 -1
- package/dist/server/prerender-route-params.d.ts +14 -0
- package/dist/server/prerender-route-params.js +94 -0
- package/dist/server/prerender-route-params.js.map +1 -0
- package/dist/server/prod-server.d.ts +15 -37
- package/dist/server/prod-server.js +143 -107
- package/dist/server/prod-server.js.map +1 -1
- package/dist/server/proxy-trust.d.ts +41 -0
- package/dist/server/proxy-trust.js +70 -0
- package/dist/server/proxy-trust.js.map +1 -0
- package/dist/server/request-pipeline.d.ts +13 -4
- package/dist/server/request-pipeline.js +32 -14
- package/dist/server/request-pipeline.js.map +1 -1
- package/dist/server/seed-cache.d.ts +12 -31
- package/dist/server/seed-cache.js +30 -37
- package/dist/server/seed-cache.js.map +1 -1
- package/dist/server/server-action-not-found.js +8 -3
- package/dist/server/server-action-not-found.js.map +1 -1
- package/dist/server/skip-cache-proof.d.ts +41 -0
- package/dist/server/skip-cache-proof.js +101 -0
- package/dist/server/skip-cache-proof.js.map +1 -0
- package/dist/server/static-file-cache.d.ts +1 -1
- package/dist/server/static-file-cache.js +8 -7
- package/dist/server/static-file-cache.js.map +1 -1
- package/dist/server/streaming-metadata.d.ts +5 -0
- package/dist/server/streaming-metadata.js +10 -0
- package/dist/server/streaming-metadata.js.map +1 -0
- package/dist/shims/app-router-scroll-state.d.ts +12 -0
- package/dist/shims/app-router-scroll-state.js +38 -0
- package/dist/shims/app-router-scroll-state.js.map +1 -0
- package/dist/shims/app-router-scroll.d.ts +14 -0
- package/dist/shims/app-router-scroll.js +100 -0
- package/dist/shims/app-router-scroll.js.map +1 -0
- package/dist/shims/before-interactive-context.d.ts +30 -0
- package/dist/shims/before-interactive-context.js +10 -0
- package/dist/shims/before-interactive-context.js.map +1 -0
- package/dist/shims/cache-runtime.d.ts +1 -1
- package/dist/shims/cache-runtime.js +14 -1
- package/dist/shims/cache-runtime.js.map +1 -1
- package/dist/shims/client-locale.d.ts +15 -0
- package/dist/shims/client-locale.js +13 -0
- package/dist/shims/client-locale.js.map +1 -0
- package/dist/shims/default-global-error.d.ts +32 -0
- package/dist/shims/default-global-error.js +181 -0
- package/dist/shims/default-global-error.js.map +1 -0
- package/dist/shims/default-not-found.d.ts +12 -0
- package/dist/shims/default-not-found.js +61 -0
- package/dist/shims/default-not-found.js.map +1 -0
- package/dist/shims/document.d.ts +59 -3
- package/dist/shims/document.js +36 -5
- package/dist/shims/document.js.map +1 -1
- package/dist/shims/error-boundary.d.ts +2 -2
- package/dist/shims/font-local.d.ts +5 -0
- package/dist/shims/font-local.js +6 -2
- package/dist/shims/font-local.js.map +1 -1
- package/dist/shims/form.js +13 -6
- package/dist/shims/form.js.map +1 -1
- package/dist/shims/head.js +4 -4
- package/dist/shims/head.js.map +1 -1
- package/dist/shims/headers.d.ts +6 -2
- package/dist/shims/headers.js +64 -21
- package/dist/shims/headers.js.map +1 -1
- package/dist/shims/image.d.ts +1 -1
- package/dist/shims/image.js +4 -4
- package/dist/shims/image.js.map +1 -1
- package/dist/shims/internal/pages-data-target.d.ts +58 -0
- package/dist/shims/internal/pages-data-target.js +91 -0
- package/dist/shims/internal/pages-data-target.js.map +1 -0
- package/dist/shims/internal/pages-data-url.d.ts +42 -0
- package/dist/shims/internal/pages-data-url.js +73 -0
- package/dist/shims/internal/pages-data-url.js.map +1 -0
- package/dist/shims/link.d.ts +21 -3
- package/dist/shims/link.js +189 -30
- package/dist/shims/link.js.map +1 -1
- package/dist/shims/metadata.d.ts +2 -1
- package/dist/shims/metadata.js +65 -6
- package/dist/shims/metadata.js.map +1 -1
- package/dist/shims/navigation.d.ts +8 -2
- package/dist/shims/navigation.js +67 -23
- package/dist/shims/navigation.js.map +1 -1
- package/dist/shims/og.d.ts +18 -2
- package/dist/shims/og.js +49 -1
- package/dist/shims/og.js.map +1 -0
- package/dist/shims/request-state-types.d.ts +1 -1
- package/dist/shims/root-params.d.ts +3 -1
- package/dist/shims/root-params.js +11 -3
- package/dist/shims/root-params.js.map +1 -1
- package/dist/shims/router-state.d.ts +1 -0
- package/dist/shims/router-state.js.map +1 -1
- package/dist/shims/router.d.ts +12 -5
- package/dist/shims/router.js +535 -86
- package/dist/shims/router.js.map +1 -1
- package/dist/shims/script.js +86 -12
- package/dist/shims/script.js.map +1 -1
- package/dist/shims/server.d.ts +21 -4
- package/dist/shims/server.js +30 -9
- package/dist/shims/server.js.map +1 -1
- package/dist/shims/slot.js +5 -1
- package/dist/shims/slot.js.map +1 -1
- package/dist/shims/unified-request-context.d.ts +1 -1
- package/dist/shims/url-safety.d.ts +23 -1
- package/dist/shims/url-safety.js +29 -2
- package/dist/shims/url-safety.js.map +1 -1
- package/dist/shims/url-utils.d.ts +2 -1
- package/dist/shims/url-utils.js +15 -4
- package/dist/shims/url-utils.js.map +1 -1
- package/dist/typegen.d.ts +10 -0
- package/dist/typegen.js +242 -0
- package/dist/typegen.js.map +1 -0
- package/dist/utils/asset-prefix.d.ts +33 -5
- package/dist/utils/asset-prefix.js +39 -6
- package/dist/utils/asset-prefix.js.map +1 -1
- package/dist/utils/cache-control-metadata.d.ts +2 -1
- package/dist/utils/cache-control-metadata.js +1 -3
- package/dist/utils/cache-control-metadata.js.map +1 -1
- package/dist/utils/domain-locale.d.ts +2 -1
- package/dist/utils/domain-locale.js +9 -1
- package/dist/utils/domain-locale.js.map +1 -1
- package/dist/utils/html-limited-bots.d.ts +5 -0
- package/dist/utils/html-limited-bots.js +15 -0
- package/dist/utils/html-limited-bots.js.map +1 -0
- package/dist/utils/lazy-chunks.d.ts +1 -1
- package/dist/utils/lazy-chunks.js +1 -1
- package/dist/utils/lazy-chunks.js.map +1 -1
- package/dist/utils/prerender-output-paths.d.ts +15 -0
- package/dist/utils/prerender-output-paths.js +24 -0
- package/dist/utils/prerender-output-paths.js.map +1 -0
- package/dist/utils/query.d.ts +23 -1
- package/dist/utils/query.js +46 -2
- package/dist/utils/query.js.map +1 -1
- package/dist/utils/record.d.ts +5 -0
- package/dist/utils/record.js +8 -0
- package/dist/utils/record.js.map +1 -0
- package/package.json +11 -3
package/dist/shims/server.d.ts
CHANGED
|
@@ -20,6 +20,7 @@ declare class NextRequest extends Request {
|
|
|
20
20
|
locales: string[];
|
|
21
21
|
defaultLocale: string;
|
|
22
22
|
};
|
|
23
|
+
trailingSlash?: boolean;
|
|
23
24
|
};
|
|
24
25
|
});
|
|
25
26
|
get nextUrl(): NextURL;
|
|
@@ -59,12 +60,12 @@ declare class NextResponse<_Body = unknown> extends Response {
|
|
|
59
60
|
/**
|
|
60
61
|
* Create a redirect response.
|
|
61
62
|
*/
|
|
62
|
-
static redirect(url: string | URL, init?: number | ResponseInit): NextResponse;
|
|
63
|
+
static redirect(url: string | URL | NextURL, init?: number | ResponseInit): NextResponse;
|
|
63
64
|
/**
|
|
64
65
|
* Create a rewrite response (middleware pattern).
|
|
65
66
|
* Sets the x-middleware-rewrite header.
|
|
66
67
|
*/
|
|
67
|
-
static rewrite(destination: string | URL, init?: MiddlewareResponseInit): NextResponse;
|
|
68
|
+
static rewrite(destination: string | URL | NextURL, init?: MiddlewareResponseInit): NextResponse;
|
|
68
69
|
/**
|
|
69
70
|
* Continue to the next handler (middleware pattern).
|
|
70
71
|
* Sets the x-middleware-next header.
|
|
@@ -78,12 +79,20 @@ type NextURLConfig = {
|
|
|
78
79
|
locales: string[];
|
|
79
80
|
defaultLocale: string;
|
|
80
81
|
};
|
|
82
|
+
/**
|
|
83
|
+
* When true, `href`/`toString()` formats non-root, non-file-like pathnames
|
|
84
|
+
* with a trailing slash. Matches Next.js's `formatNextPathnameInfo` so that
|
|
85
|
+
* `NextResponse.redirect(request.nextUrl)` and `NextResponse.rewrite(url)`
|
|
86
|
+
* honour the user's `trailingSlash` config.
|
|
87
|
+
*/
|
|
88
|
+
trailingSlash?: boolean;
|
|
81
89
|
};
|
|
82
90
|
};
|
|
83
91
|
declare class NextURL {
|
|
84
92
|
/** Internal URL stores the pathname WITHOUT basePath or locale prefix. */
|
|
85
93
|
private _url;
|
|
86
94
|
private _basePath;
|
|
95
|
+
private _trailingSlash;
|
|
87
96
|
private _locale;
|
|
88
97
|
private _defaultLocale;
|
|
89
98
|
private _locales;
|
|
@@ -93,10 +102,18 @@ declare class NextURL {
|
|
|
93
102
|
/** Extract locale from pathname, stripping it from the internal URL. */
|
|
94
103
|
private _analyzeLocale;
|
|
95
104
|
/**
|
|
96
|
-
* Reconstruct the full pathname with basePath + locale prefix
|
|
97
|
-
*
|
|
105
|
+
* Reconstruct the full pathname with basePath + locale prefix and apply
|
|
106
|
+
* the configured trailingSlash policy.
|
|
107
|
+
* Mirrors Next.js's internal formatNextPathnameInfo().
|
|
98
108
|
*/
|
|
99
109
|
private _formatPathname;
|
|
110
|
+
/**
|
|
111
|
+
* Apply the configured trailingSlash policy to a composed pathname. Matches
|
|
112
|
+
* Next.js's `formatNextPathnameInfo`: when `trailingSlash` is true, add a
|
|
113
|
+
* trailing slash unless the path is empty/root; when false, strip a trailing
|
|
114
|
+
* slash unless the path is empty/root.
|
|
115
|
+
*/
|
|
116
|
+
private _applyTrailingSlash;
|
|
100
117
|
get href(): string;
|
|
101
118
|
set href(value: string);
|
|
102
119
|
get origin(): string;
|
package/dist/shims/server.js
CHANGED
|
@@ -46,6 +46,7 @@ var NextRequest = class extends Request {
|
|
|
46
46
|
_url;
|
|
47
47
|
_cookies;
|
|
48
48
|
constructor(input, init) {
|
|
49
|
+
validateURL(typeof input !== "string" && "url" in input ? input.url : String(input));
|
|
49
50
|
const { nextConfig: _nextConfig, ...requestInit } = init ?? {};
|
|
50
51
|
if (input instanceof Request) {
|
|
51
52
|
const requestInput = requestInit.body === void 0 && input.body && !input.bodyUsed ? input.clone() : input;
|
|
@@ -54,7 +55,10 @@ var NextRequest = class extends Request {
|
|
|
54
55
|
const url = typeof input === "string" ? new URL(input, "http://localhost") : input instanceof URL ? input : new URL(input.url, "http://localhost");
|
|
55
56
|
const urlConfig = _nextConfig ? {
|
|
56
57
|
basePath: _nextConfig.basePath,
|
|
57
|
-
nextConfig: {
|
|
58
|
+
nextConfig: {
|
|
59
|
+
i18n: _nextConfig.i18n,
|
|
60
|
+
trailingSlash: _nextConfig.trailingSlash
|
|
61
|
+
}
|
|
58
62
|
} : void 0;
|
|
59
63
|
this._nextUrl = new NextURL(url, void 0, urlConfig);
|
|
60
64
|
this._url = process.env.__NEXT_NO_MIDDLEWARE_URL_NORMALIZE ? url.toString() : this._nextUrl.toString();
|
|
@@ -180,12 +184,14 @@ var NextURL = class NextURL {
|
|
|
180
184
|
/** Internal URL stores the pathname WITHOUT basePath or locale prefix. */
|
|
181
185
|
_url;
|
|
182
186
|
_basePath;
|
|
187
|
+
_trailingSlash;
|
|
183
188
|
_locale;
|
|
184
189
|
_defaultLocale;
|
|
185
190
|
_locales;
|
|
186
191
|
constructor(input, base, config) {
|
|
187
192
|
this._url = new URL(input.toString(), base);
|
|
188
193
|
this._basePath = config?.basePath ?? "";
|
|
194
|
+
this._trailingSlash = config?.nextConfig?.trailingSlash ?? false;
|
|
189
195
|
this._stripBasePath();
|
|
190
196
|
const i18n = config?.nextConfig?.i18n;
|
|
191
197
|
if (i18n) {
|
|
@@ -210,15 +216,27 @@ var NextURL = class NextURL {
|
|
|
210
216
|
} else this._locale = this._defaultLocale;
|
|
211
217
|
}
|
|
212
218
|
/**
|
|
213
|
-
* Reconstruct the full pathname with basePath + locale prefix
|
|
214
|
-
*
|
|
219
|
+
* Reconstruct the full pathname with basePath + locale prefix and apply
|
|
220
|
+
* the configured trailingSlash policy.
|
|
221
|
+
* Mirrors Next.js's internal formatNextPathnameInfo().
|
|
215
222
|
*/
|
|
216
223
|
_formatPathname() {
|
|
217
224
|
let prefix = this._basePath;
|
|
218
225
|
if (this._locale && this._locale !== this._defaultLocale) prefix += "/" + this._locale;
|
|
219
|
-
if (!prefix) return this._url.pathname;
|
|
220
226
|
const inner = this._url.pathname;
|
|
221
|
-
|
|
227
|
+
const composed = !prefix ? inner : inner === "/" ? prefix : prefix + inner;
|
|
228
|
+
return this._applyTrailingSlash(composed);
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Apply the configured trailingSlash policy to a composed pathname. Matches
|
|
232
|
+
* Next.js's `formatNextPathnameInfo`: when `trailingSlash` is true, add a
|
|
233
|
+
* trailing slash unless the path is empty/root; when false, strip a trailing
|
|
234
|
+
* slash unless the path is empty/root.
|
|
235
|
+
*/
|
|
236
|
+
_applyTrailingSlash(pathname) {
|
|
237
|
+
if (pathname === "" || pathname === "/") return pathname;
|
|
238
|
+
if (this._trailingSlash) return pathname.endsWith("/") ? pathname : pathname + "/";
|
|
239
|
+
return pathname.endsWith("/") ? pathname.slice(0, -1) : pathname;
|
|
222
240
|
}
|
|
223
241
|
get href() {
|
|
224
242
|
const formatted = this._formatPathname();
|
|
@@ -319,12 +337,15 @@ var NextURL = class NextURL {
|
|
|
319
337
|
return this._locales ? [...this._locales] : void 0;
|
|
320
338
|
}
|
|
321
339
|
clone() {
|
|
340
|
+
const nextConfig = {};
|
|
341
|
+
if (this._locales) nextConfig.i18n = {
|
|
342
|
+
locales: [...this._locales],
|
|
343
|
+
defaultLocale: this._defaultLocale
|
|
344
|
+
};
|
|
345
|
+
if (this._trailingSlash) nextConfig.trailingSlash = true;
|
|
322
346
|
const config = {
|
|
323
347
|
basePath: this._basePath,
|
|
324
|
-
nextConfig:
|
|
325
|
-
locales: [...this._locales],
|
|
326
|
-
defaultLocale: this._defaultLocale
|
|
327
|
-
} } : void 0
|
|
348
|
+
nextConfig: Object.keys(nextConfig).length > 0 ? nextConfig : void 0
|
|
328
349
|
};
|
|
329
350
|
return new NextURL(this.href, void 0, config);
|
|
330
351
|
}
|
package/dist/shims/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","names":[],"sources":["../../src/shims/server.ts"],"sourcesContent":["/**\n * next/server shim\n *\n * Provides NextRequest, NextResponse, and related types that work with\n * standard Web APIs (Request/Response). This means they work on Node,\n * Cloudflare Workers, Deno, and any WinterCG-compatible runtime.\n *\n * This is a pragmatic subset — we implement the most commonly used APIs\n * rather than bug-for-bug parity with Next.js internals.\n */\n\nimport {\n MIDDLEWARE_NEXT_HEADER,\n MIDDLEWARE_REWRITE_HEADER,\n MIDDLEWARE_SET_COOKIE_HEADER,\n} from \"../server/headers.js\";\nimport { encodeMiddlewareRequestHeaders } from \"../server/middleware-request-headers.js\";\nimport { serializeSetCookie, validateCookieName } from \"./internal/cookie-serialize.js\";\nimport { parseCookieHeader } from \"./internal/parse-cookie-header.js\";\nimport { getRequestExecutionContext } from \"./request-context.js\";\nimport { assertSafeNavigationUrl } from \"./url-safety.js\";\nimport { stripBasePath } from \"../utils/base-path.js\";\n\n// ---------------------------------------------------------------------------\n// Inlined cache-scope guard for after()\n//\n// We cannot statically import throwIfInsideCacheScope from headers.ts here\n// because headers.ts contains the \"use cache\" directive string in its error\n// message, which causes Vite's use-cache transform to include it in the module\n// graph. If headers.ts is pulled in via static import from server.ts, the\n// transform fires on it in Pages Router fixtures that lack @vitejs/plugin-rsc.\n//\n// The connection() function in this file avoids the same problem by using\n// `await import(\"./headers.js\")` (dynamic import, async function). after()\n// must remain synchronous, so we inline the check using the same Symbol.for\n// keys that cache-runtime.ts and cache.ts register their ALS instances with.\n// ---------------------------------------------------------------------------\n\nconst _USE_CACHE_ALS_KEY = Symbol.for(\"vinext.cacheRuntime.contextAls\");\nconst _UNSTABLE_CACHE_ALS_KEY = Symbol.for(\"vinext.unstableCache.als\");\nconst _g = globalThis as unknown as Record<PropertyKey, unknown>;\n\n/**\n * Record an invalid dynamic usage error on the request context so it survives\n * user try/catch and can be forwarded to the dev overlay on client-side navigations.\n */\nfunction _recordInvalidDynamicUsageError(error: Error): void {\n try {\n const _unifiedAls = _g[Symbol.for(\"vinext.unifiedRequestContext.als\")] as\n | { getStore(): unknown }\n | undefined;\n const ctx = _unifiedAls?.getStore() as Record<string, unknown> | undefined;\n if (ctx) ctx.invalidDynamicUsageError = error;\n } catch {\n // Ignore — best-effort recording for dev diagnostics\n }\n}\n\nfunction _throwIfInsideCacheScope(apiName: string): void {\n const cacheAls = _g[_USE_CACHE_ALS_KEY] as { getStore(): unknown } | undefined;\n if (cacheAls?.getStore() != null) {\n const error = new Error(\n `\\`${apiName}\\` cannot be called inside \"use cache\". ` +\n `If you need this data inside a cached function, call \\`${apiName}\\` ` +\n \"outside and pass the required data as an argument.\",\n );\n _recordInvalidDynamicUsageError(error);\n throw error;\n }\n const unstableAls = _g[_UNSTABLE_CACHE_ALS_KEY] as { getStore(): unknown } | undefined;\n if (unstableAls?.getStore() === true) {\n const error = new Error(\n `\\`${apiName}\\` cannot be called inside a function cached with \\`unstable_cache()\\`. ` +\n `If you need this data inside a cached function, call \\`${apiName}\\` ` +\n \"outside and pass the required data as an argument.\",\n );\n _recordInvalidDynamicUsageError(error);\n throw error;\n }\n}\n\n// ---------------------------------------------------------------------------\n// NextRequest\n// ---------------------------------------------------------------------------\n\nexport class NextRequest extends Request {\n private _nextUrl: NextURL;\n private _url: string;\n private _cookies: RequestCookies;\n\n constructor(\n input: URL | RequestInfo,\n init?: RequestInit & {\n nextConfig?: {\n basePath?: string;\n i18n?: { locales: string[]; defaultLocale: string };\n };\n },\n ) {\n // Strip nextConfig before passing to super() — it's vinext-internal,\n // not a valid RequestInit property.\n const { nextConfig: _nextConfig, ...requestInit } = init ?? {};\n if (input instanceof Request) {\n // Keep caller-owned request bodies readable after wrapping. Middleware and\n // route-handler plumbing may need the source Request after this wrapper runs.\n const requestInput =\n requestInit.body === undefined && input.body && !input.bodyUsed ? input.clone() : input;\n super(requestInput, requestInit);\n } else {\n super(input, requestInit);\n }\n const url =\n typeof input === \"string\"\n ? new URL(input, \"http://localhost\")\n : input instanceof URL\n ? input\n : new URL(input.url, \"http://localhost\");\n const urlConfig: NextURLConfig | undefined = _nextConfig\n ? { basePath: _nextConfig.basePath, nextConfig: { i18n: _nextConfig.i18n } }\n : undefined;\n this._nextUrl = new NextURL(url, undefined, urlConfig);\n this._url = process.env.__NEXT_NO_MIDDLEWARE_URL_NORMALIZE\n ? url.toString()\n : this._nextUrl.toString();\n this._cookies = new RequestCookies(this.headers);\n }\n\n get nextUrl(): NextURL {\n return this._nextUrl;\n }\n\n get url(): string {\n return this._url;\n }\n\n get cookies(): RequestCookies {\n return this._cookies;\n }\n\n /**\n * Client IP address. Prefers Cloudflare's trusted CF-Connecting-IP header\n * over the spoofable X-Forwarded-For. Returns undefined if unavailable.\n */\n get ip(): string | undefined {\n return (\n this.headers.get(\"cf-connecting-ip\") ??\n this.headers.get(\"x-real-ip\") ??\n this.headers.get(\"x-forwarded-for\")?.split(\",\")[0]?.trim() ??\n undefined\n );\n }\n\n /**\n * Geolocation data. Platform-dependent (e.g., Cloudflare, Vercel).\n * Returns undefined if not available.\n */\n get geo():\n | { city?: string; country?: string; region?: string; latitude?: string; longitude?: string }\n | undefined {\n // Check Cloudflare-style headers, Vercel-style headers\n const country =\n this.headers.get(\"cf-ipcountry\") ?? this.headers.get(\"x-vercel-ip-country\") ?? undefined;\n if (!country) return undefined;\n return {\n country,\n city: this.headers.get(\"cf-ipcity\") ?? this.headers.get(\"x-vercel-ip-city\") ?? undefined,\n region:\n this.headers.get(\"cf-region\") ??\n this.headers.get(\"x-vercel-ip-country-region\") ??\n undefined,\n latitude:\n this.headers.get(\"cf-iplatitude\") ?? this.headers.get(\"x-vercel-ip-latitude\") ?? undefined,\n longitude:\n this.headers.get(\"cf-iplongitude\") ??\n this.headers.get(\"x-vercel-ip-longitude\") ??\n undefined,\n };\n }\n\n /**\n * The build ID of the Next.js application.\n * Delegates to `nextUrl.buildId` to match Next.js API surface.\n * Can be used in middleware to detect deployment skew between client and server.\n */\n get buildId(): string | undefined {\n return this._nextUrl.buildId;\n }\n}\n\n// ---------------------------------------------------------------------------\n// NextResponse\n// ---------------------------------------------------------------------------\n\n/** Valid HTTP redirect status codes, matching Next.js's REDIRECTS set. */\nconst REDIRECT_STATUSES = new Set([301, 302, 303, 307, 308]);\n\nfunction validateURL(url: string | URL): string {\n assertSafeNavigationUrl(String(url));\n try {\n return String(new URL(String(url)));\n } catch (error) {\n throw new Error(\n `URL is malformed \"${String(\n url,\n )}\". Please use only absolute URLs - https://nextjs.org/docs/messages/middleware-relative-urls`,\n { cause: error },\n );\n }\n}\n\nexport class NextResponse<_Body = unknown> extends Response {\n private _cookies: ResponseCookies;\n\n constructor(body?: BodyInit | null, init?: ResponseInit) {\n super(body, init);\n this._cookies = new MiddlewareResponseCookies(this.headers);\n }\n\n get cookies(): ResponseCookies {\n return this._cookies;\n }\n\n /**\n * Create a JSON response.\n */\n static json<JsonBody>(body: JsonBody, init?: ResponseInit): NextResponse<JsonBody> {\n const headers = new Headers(init?.headers);\n if (!headers.has(\"content-type\")) {\n headers.set(\"content-type\", \"application/json\");\n }\n return new NextResponse(JSON.stringify(body), {\n ...init,\n headers,\n }) as NextResponse<JsonBody>;\n }\n\n /**\n * Create a redirect response.\n */\n static redirect(url: string | URL, init?: number | ResponseInit): NextResponse {\n const status = typeof init === \"number\" ? init : (init?.status ?? 307);\n if (!REDIRECT_STATUSES.has(status)) {\n throw new RangeError(`Failed to execute \"redirect\" on \"response\": Invalid status code`);\n }\n const headers = new Headers(typeof init === \"object\" ? init?.headers : undefined);\n headers.set(\"Location\", validateURL(url));\n return new NextResponse(null, { status, headers });\n }\n\n /**\n * Create a rewrite response (middleware pattern).\n * Sets the x-middleware-rewrite header.\n */\n static rewrite(destination: string | URL, init?: MiddlewareResponseInit): NextResponse {\n const headers = new Headers(init?.headers);\n headers.set(MIDDLEWARE_REWRITE_HEADER, validateURL(destination));\n if (init?.request?.headers) {\n encodeMiddlewareRequestHeaders(headers, init.request.headers);\n }\n return new NextResponse(null, { ...init, headers });\n }\n\n /**\n * Continue to the next handler (middleware pattern).\n * Sets the x-middleware-next header.\n */\n static next(init?: MiddlewareResponseInit): NextResponse {\n const headers = new Headers(init?.headers);\n headers.set(MIDDLEWARE_NEXT_HEADER, \"1\");\n if (init?.request?.headers) {\n encodeMiddlewareRequestHeaders(headers, init.request.headers);\n }\n return new NextResponse(null, { ...init, headers });\n }\n}\n\n// ---------------------------------------------------------------------------\n// NextURL — lightweight URL wrapper with pathname helpers\n// ---------------------------------------------------------------------------\n\nexport type NextURLConfig = {\n basePath?: string;\n nextConfig?: {\n i18n?: {\n locales: string[];\n defaultLocale: string;\n };\n };\n};\n\nexport class NextURL {\n /** Internal URL stores the pathname WITHOUT basePath or locale prefix. */\n private _url: URL;\n private _basePath: string;\n private _locale: string | undefined;\n private _defaultLocale: string | undefined;\n private _locales: string[] | undefined;\n\n constructor(input: string | URL, base?: string | URL, config?: NextURLConfig) {\n this._url = new URL(input.toString(), base);\n this._basePath = config?.basePath ?? \"\";\n this._stripBasePath();\n const i18n = config?.nextConfig?.i18n;\n if (i18n) {\n this._locales = [...i18n.locales];\n this._defaultLocale = i18n.defaultLocale;\n this._analyzeLocale(this._locales);\n }\n }\n\n /** Strip basePath prefix from the internal pathname. */\n private _stripBasePath(): void {\n if (!this._basePath) return;\n this._url.pathname = stripBasePath(this._url.pathname, this._basePath);\n }\n\n /** Extract locale from pathname, stripping it from the internal URL. */\n private _analyzeLocale(locales: string[]): void {\n const segments = this._url.pathname.split(\"/\");\n const candidate = segments[1]?.toLowerCase();\n const match = locales.find((l) => l.toLowerCase() === candidate);\n if (match) {\n this._locale = match;\n this._url.pathname = \"/\" + segments.slice(2).join(\"/\");\n } else {\n this._locale = this._defaultLocale;\n }\n }\n\n /**\n * Reconstruct the full pathname with basePath + locale prefix.\n * Mirrors Next.js's internal formatPathname().\n */\n private _formatPathname(): string {\n // Build prefix: basePath + locale (skip defaultLocale — Next.js omits it)\n let prefix = this._basePath;\n if (this._locale && this._locale !== this._defaultLocale) {\n prefix += \"/\" + this._locale;\n }\n if (!prefix) return this._url.pathname;\n const inner = this._url.pathname;\n return inner === \"/\" ? prefix : prefix + inner;\n }\n\n get href(): string {\n const formatted = this._formatPathname();\n if (formatted === this._url.pathname) return this._url.href;\n // Replace pathname in href via string slicing — avoids URL allocation.\n // URL.href is always <origin+auth><pathname><search><hash>.\n const { href, pathname, search, hash } = this._url;\n const baseEnd = href.length - pathname.length - search.length - hash.length;\n return href.slice(0, baseEnd) + formatted + search + hash;\n }\n set href(value: string) {\n this._url.href = value;\n this._stripBasePath();\n if (this._locales) this._analyzeLocale(this._locales);\n }\n\n get origin(): string {\n return this._url.origin;\n }\n\n get protocol(): string {\n return this._url.protocol;\n }\n set protocol(value: string) {\n this._url.protocol = value;\n }\n\n get username(): string {\n return this._url.username;\n }\n set username(value: string) {\n this._url.username = value;\n }\n\n get password(): string {\n return this._url.password;\n }\n set password(value: string) {\n this._url.password = value;\n }\n\n get host(): string {\n return this._url.host;\n }\n set host(value: string) {\n this._url.host = value;\n }\n\n get hostname(): string {\n return this._url.hostname;\n }\n set hostname(value: string) {\n this._url.hostname = value;\n }\n\n get port(): string {\n return this._url.port;\n }\n set port(value: string) {\n this._url.port = value;\n }\n\n /** Returns the pathname WITHOUT basePath or locale prefix. */\n get pathname(): string {\n return this._url.pathname;\n }\n set pathname(value: string) {\n this._url.pathname = value;\n }\n\n get search(): string {\n return this._url.search;\n }\n set search(value: string) {\n this._url.search = value;\n }\n\n get searchParams(): URLSearchParams {\n return this._url.searchParams;\n }\n\n get hash(): string {\n return this._url.hash;\n }\n set hash(value: string) {\n this._url.hash = value;\n }\n\n get basePath(): string {\n return this._basePath;\n }\n set basePath(value: string) {\n this._basePath = value === \"\" ? \"\" : value.startsWith(\"/\") ? value : \"/\" + value;\n }\n\n get locale(): string {\n return this._locale ?? \"\";\n }\n set locale(value: string | undefined) {\n if (this._locales) {\n if (!value) {\n this._locale = this._defaultLocale;\n return;\n }\n if (!this._locales.includes(value)) {\n throw new TypeError(\n `The locale \"${value}\" is not in the configured locales: ${this._locales.join(\", \")}`,\n );\n }\n }\n this._locale = this._locales ? value : this._locale;\n }\n\n get defaultLocale(): string | undefined {\n return this._defaultLocale;\n }\n\n get locales(): string[] | undefined {\n return this._locales ? [...this._locales] : undefined;\n }\n\n clone(): NextURL {\n const config: NextURLConfig = {\n basePath: this._basePath,\n nextConfig: this._locales\n ? { i18n: { locales: [...this._locales], defaultLocale: this._defaultLocale! } }\n : undefined,\n };\n // Pass the full href (with locale/basePath re-added) so the constructor\n // can re-analyze and extract locale correctly.\n return new NextURL(this.href, undefined, config);\n }\n\n toString(): string {\n return this.href;\n }\n\n /**\n * The build ID of the Next.js application.\n * Set from `generateBuildId` in next.config.js, or a random UUID if not configured.\n * Can be used in middleware to detect deployment skew between client and server.\n * Matches the Next.js API: `request.nextUrl.buildId`.\n */\n get buildId(): string | undefined {\n return process.env.__VINEXT_BUILD_ID ?? undefined;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Cookie helpers (minimal implementations)\n// ---------------------------------------------------------------------------\n\ntype CookieEntry = {\n name: string;\n value: string;\n};\n\nexport class RequestCookies {\n private _headers: Headers;\n private _parsed: Map<string, string>;\n\n constructor(headers: Headers) {\n this._headers = headers;\n this._parsed = parseCookieHeader(headers.get(\"cookie\") ?? \"\");\n }\n\n get(name: string): CookieEntry | undefined {\n const value = this._parsed.get(name);\n return value !== undefined ? { name, value } : undefined;\n }\n\n getAll(nameOrOptions?: string | CookieEntry): CookieEntry[] {\n const name = typeof nameOrOptions === \"string\" ? nameOrOptions : nameOrOptions?.name;\n return [...this._parsed.entries()]\n .filter(([cookieName]) => name === undefined || cookieName === name)\n .map(([cookieName, value]) => ({ name: cookieName, value }));\n }\n\n has(name: string): boolean {\n return this._parsed.has(name);\n }\n\n set(nameOrOptions: string | CookieEntry, value?: string): this {\n let cookieName: string;\n let cookieValue: string;\n if (typeof nameOrOptions === \"string\") {\n cookieName = nameOrOptions;\n cookieValue = value ?? \"\";\n } else {\n cookieName = nameOrOptions.name;\n cookieValue = nameOrOptions.value;\n }\n validateCookieName(cookieName);\n this._parsed.set(cookieName, cookieValue);\n this._syncHeader();\n return this;\n }\n\n delete(names: string | string[]): boolean | boolean[] {\n if (Array.isArray(names)) {\n const results = names.map((name) => {\n validateCookieName(name);\n return this._parsed.delete(name);\n });\n this._syncHeader();\n return results;\n }\n validateCookieName(names);\n const result = this._parsed.delete(names);\n this._syncHeader();\n return result;\n }\n\n clear(): this {\n this._parsed.clear();\n this._syncHeader();\n return this;\n }\n\n get size(): number {\n return this._parsed.size;\n }\n\n toString(): string {\n return this._serialize();\n }\n\n private _serialize(): string {\n return [...this._parsed.entries()].map(([n, v]) => `${n}=${encodeURIComponent(v)}`).join(\"; \");\n }\n\n private _syncHeader(): void {\n if (this._parsed.size === 0) {\n this._headers.delete(\"cookie\");\n } else {\n this._headers.set(\"cookie\", this._serialize());\n }\n }\n\n [Symbol.iterator](): IterableIterator<[string, CookieEntry]> {\n const entries = this.getAll().map((c) => [c.name, c] as [string, CookieEntry]);\n return entries[Symbol.iterator]();\n }\n}\n\n// Keep this error message in sync with headers.ts. This adapter backs\n// NextRequest cookies, while headers.ts owns the next/headers cookies object.\nclass ReadonlyRequestCookiesError extends Error {\n constructor() {\n super(\n \"Cookies can only be modified in a Server Action or Route Handler. Read more: https://nextjs.org/docs/app/api-reference/functions/cookies#options\",\n );\n }\n\n static callable(this: void): never {\n throw new ReadonlyRequestCookiesError();\n }\n}\n\nconst REQUEST_HEADERS_MUTATING_METHODS = new Set([\"set\", \"delete\", \"append\"]);\n\n// Keep this error message in sync with headers.ts. This adapter backs\n// NextRequest headers in force-static route handlers, while headers.ts owns the\n// next/headers object.\nclass ReadonlyRequestHeadersError extends Error {\n constructor() {\n super(\n \"Headers cannot be modified. Read more: https://nextjs.org/docs/app/api-reference/functions/headers\",\n );\n }\n\n static callable(this: void): never {\n throw new ReadonlyRequestHeadersError();\n }\n}\n\nexport function sealRequestHeaders(headers: Headers): Headers {\n return new Proxy<Headers>(headers, {\n get(target, prop) {\n if (typeof prop === \"string\" && REQUEST_HEADERS_MUTATING_METHODS.has(prop)) {\n return ReadonlyRequestHeadersError.callable;\n }\n\n const value = Reflect.get(target, prop, target);\n return typeof value === \"function\" ? value.bind(target) : value;\n },\n });\n}\n\nexport function sealRequestCookies(cookies: RequestCookies): RequestCookies {\n return new Proxy<RequestCookies>(cookies, {\n get(target, prop) {\n if (prop === \"set\" || prop === \"delete\" || prop === \"clear\") {\n return ReadonlyRequestCookiesError.callable;\n }\n\n const value = Reflect.get(target, prop, target);\n return typeof value === \"function\" ? value.bind(target) : value;\n },\n });\n}\n\nexport class ResponseCookies {\n private _headers: Headers;\n /** Internal map keyed by cookie name — single source of truth. */\n private _parsed: Map<string, { serialized: string; entry: CookieEntry }> = new Map();\n\n constructor(headers: Headers) {\n this._headers = headers;\n\n // Hydrate internal map from any existing Set-Cookie headers\n for (const header of headers.getSetCookie()) {\n const eq = header.indexOf(\"=\");\n if (eq === -1) continue;\n const cookieName = header.slice(0, eq);\n const semi = header.indexOf(\";\", eq);\n const raw = header.slice(eq + 1, semi === -1 ? undefined : semi);\n let value: string;\n try {\n value = decodeURIComponent(raw);\n } catch {\n value = raw;\n }\n this._parsed.set(cookieName, { serialized: header, entry: { name: cookieName, value } });\n }\n }\n\n set(\n ...args:\n | [name: string, value: string, options?: CookieOptions]\n | [options: CookieOptions & { name: string; value: string }]\n ): this {\n const [name, value, opts] = parseCookieSetArgs(args);\n validateCookieName(name);\n\n const serialized = serializeSetCookie(name, value, opts);\n this._parsed.set(name, { serialized, entry: { name, value } });\n this._syncHeaders();\n return this;\n }\n\n get(...args: [name: string] | [options: { name: string }]): CookieEntry | undefined {\n const key = typeof args[0] === \"string\" ? args[0] : args[0].name;\n return this._parsed.get(key)?.entry;\n }\n\n has(name: string): boolean {\n return this._parsed.has(name);\n }\n\n getAll(...args: [name: string] | [options: { name: string }] | []): CookieEntry[] {\n const all = [...this._parsed.values()].map((v) => v.entry);\n if (args.length === 0) return all;\n const key = typeof args[0] === \"string\" ? args[0] : args[0].name;\n return all.filter((c) => c.name === key);\n }\n\n delete(\n ...args:\n | [name: string]\n | [options: Omit<CookieOptions & { name: string }, \"maxAge\" | \"expires\">]\n ): this {\n const [name, opts] =\n typeof args[0] === \"string\" ? [args[0], undefined] : [args[0].name, args[0]];\n return this.set({\n name,\n value: \"\",\n expires: new Date(0),\n path: opts?.path,\n domain: opts?.domain,\n httpOnly: opts?.httpOnly,\n secure: opts?.secure,\n sameSite: opts?.sameSite,\n });\n }\n\n [Symbol.iterator](): IterableIterator<[string, CookieEntry]> {\n const entries: [string, CookieEntry][] = [...this._parsed.values()].map((v) => [\n v.entry.name,\n v.entry,\n ]);\n return entries[Symbol.iterator]();\n }\n\n /** Delete all Set-Cookie headers and re-append from the internal map. */\n private _syncHeaders(): void {\n this._headers.delete(\"Set-Cookie\");\n for (const { serialized } of this._parsed.values()) {\n this._headers.append(\"Set-Cookie\", serialized);\n }\n }\n}\n\nclass MiddlewareResponseCookies extends ResponseCookies {\n private _responseHeaders: Headers;\n\n constructor(headers: Headers) {\n super(headers);\n this._responseHeaders = headers;\n }\n\n override set(\n ...args:\n | [name: string, value: string, options?: CookieOptions]\n | [options: CookieOptions & { name: string; value: string }]\n ): this {\n super.set(...args);\n this._syncMiddlewareCookieHeader();\n return this;\n }\n\n override delete(\n ...args:\n | [name: string]\n | [options: Omit<CookieOptions & { name: string }, \"maxAge\" | \"expires\">]\n ): this {\n super.delete(...args);\n this._syncMiddlewareCookieHeader();\n return this;\n }\n\n private _syncMiddlewareCookieHeader(): void {\n const cookies = this._responseHeaders.getSetCookie();\n if (cookies.length === 0) {\n this._responseHeaders.delete(MIDDLEWARE_SET_COOKIE_HEADER);\n return;\n }\n\n this._responseHeaders.set(MIDDLEWARE_SET_COOKIE_HEADER, cookies.join(\",\"));\n }\n}\n\ntype CookieOptions = {\n path?: string;\n domain?: string;\n maxAge?: number;\n expires?: Date;\n httpOnly?: boolean;\n secure?: boolean;\n sameSite?: \"Strict\" | \"Lax\" | \"None\";\n};\n\n/**\n * Parse the overloaded arguments for ResponseCookies.set():\n * - (name, value, options?) — positional form\n * - ({ name, value, ...options }) — object form\n */\nfunction parseCookieSetArgs(\n args:\n | [name: string, value: string, options?: CookieOptions]\n | [options: CookieOptions & { name: string; value: string }],\n): [string, string, CookieOptions | undefined] {\n if (typeof args[0] === \"string\") {\n return [args[0], args[1] as string, args[2] as CookieOptions | undefined];\n }\n const { name, value, ...opts } = args[0];\n return [name, value, opts as CookieOptions];\n}\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type MiddlewareResponseInit = {\n request?: {\n headers?: Headers;\n };\n} & ResponseInit;\n\nexport type NextMiddlewareResult = NextResponse | Response | null | undefined | void;\n\nexport type NextMiddleware = (\n request: NextRequest,\n event: NextFetchEvent,\n) => NextMiddlewareResult | Promise<NextMiddlewareResult>;\n\n/**\n * Minimal NextFetchEvent — extends FetchEvent where available,\n * otherwise provides the waitUntil pattern standalone.\n */\nexport class NextFetchEvent {\n sourcePage: string;\n private _waitUntilPromises: Promise<unknown>[] = [];\n\n constructor(params: { page: string }) {\n this.sourcePage = params.page;\n }\n\n waitUntil(promise: Promise<unknown>): void {\n this._waitUntilPromises.push(promise);\n }\n\n get waitUntilPromises(): Promise<unknown>[] {\n return this._waitUntilPromises;\n }\n\n /** Drain all waitUntil promises. Returns a single promise that settles when all are done. */\n drainWaitUntil(): Promise<PromiseSettledResult<unknown>[]> {\n return Promise.allSettled(this._waitUntilPromises);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Utility exports\n// ---------------------------------------------------------------------------\n\n/**\n * Parse user agent string. Minimal implementation — for full UA parsing,\n * apps should use a dedicated library like `ua-parser-js`.\n */\nexport function userAgentFromString(ua: string | undefined): UserAgent {\n const input = ua ?? \"\";\n return {\n isBot: /bot|crawler|spider|crawling/i.test(input),\n ua: input,\n browser: {},\n device: {},\n engine: {},\n os: {},\n cpu: {},\n };\n}\n\nexport function userAgent({ headers }: { headers: Headers }): UserAgent {\n return userAgentFromString(headers.get(\"user-agent\") ?? undefined);\n}\n\nexport type UserAgent = {\n isBot: boolean;\n ua: string;\n browser: { name?: string; version?: string; major?: string };\n device: { model?: string; type?: string; vendor?: string };\n engine: { name?: string; version?: string };\n os: { name?: string; version?: string };\n cpu: { architecture?: string };\n};\n\n/**\n * after() — schedule work after the response is sent.\n *\n * Uses the platform's `waitUntil` (via the per-request ExecutionContext) when\n * available so the task survives past the response on Cloudflare Workers.\n * Falls back to a fire-and-forget microtask on runtimes without an execution\n * context (e.g. Node.js dev server).\n *\n * Throws when called inside a cached scope — request-specific\n * side-effects must not leak into cached results.\n */\nexport function after<T>(task: Promise<T> | (() => T | Promise<T>)): void {\n _throwIfInsideCacheScope(\"after()\");\n\n const promise = typeof task === \"function\" ? Promise.resolve().then(task) : task;\n // NOTE: vinext runs function tasks concurrently with response streaming (next microtask),\n // whereas Next.js queues them to run strictly after the response is sent via onClose.\n // This is a known simplification — function tasks here are not guaranteed to run\n // after the response completes, only after the current synchronous execution.\n //\n // `.catch()` is attached synchronously in the same tick as `promise` is created, so\n // there is no window where a pre-rejected `task` promise could trigger an\n // `unhandledrejection` event before the handler is in place.\n const guarded = promise.catch((err) => {\n console.error(\"[vinext] after() task failed:\", err);\n });\n\n // TODO: Next.js throws when after() is called outside a request context or when\n // waitUntil is unavailable, preventing silent task loss. vinext falls back to\n // fire-and-forget here, which is correct for the Node.js dev server (where\n // getRequestExecutionContext() always returns null). On Workers, a misconfigured\n // entry that omits runWithExecutionContext would silently drop tasks — consider\n // a one-time console.warn on the fallback path, gated to production only (e.g.\n // `process.env.NODE_ENV === 'production'` or `typeof caches !== 'undefined'` for\n // a Workers runtime check) with a module-level `let _warned = false` guard so it\n // fires at most once and doesn't spam the dev-server console.\n getRequestExecutionContext()?.waitUntil(guarded);\n}\n\n/**\n * connection() — signals that the response requires a live connection\n * (not a static/cached response). Opts the page out of ISR caching\n * and sets Cache-Control: no-store on the response.\n */\nexport async function connection(): Promise<void> {\n const { markDynamicUsage, markRenderRequestApiUsage, throwIfInsideCacheScope } =\n await import(\"./headers.js\");\n markRenderRequestApiUsage(\"connection\");\n throwIfInsideCacheScope(\"connection()\");\n markDynamicUsage();\n}\n\n/**\n * URLPattern re-export — used in middleware for route matching.\n * Available natively in Node 20+, Cloudflare Workers, Deno.\n * Falls back to urlpattern-polyfill if the global is not available.\n */\nexport const URLPattern: typeof globalThis.URLPattern =\n globalThis.URLPattern ??\n (() => {\n throw new Error(\n \"URLPattern is not available in this runtime. \" +\n \"Install the `urlpattern-polyfill` package or upgrade to Node 20+.\",\n );\n });\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"server.js","names":[],"sources":["../../src/shims/server.ts"],"sourcesContent":["/**\n * next/server shim\n *\n * Provides NextRequest, NextResponse, and related types that work with\n * standard Web APIs (Request/Response). This means they work on Node,\n * Cloudflare Workers, Deno, and any WinterCG-compatible runtime.\n *\n * This is a pragmatic subset — we implement the most commonly used APIs\n * rather than bug-for-bug parity with Next.js internals.\n */\n\nimport {\n MIDDLEWARE_NEXT_HEADER,\n MIDDLEWARE_REWRITE_HEADER,\n MIDDLEWARE_SET_COOKIE_HEADER,\n} from \"../server/headers.js\";\nimport { encodeMiddlewareRequestHeaders } from \"../server/middleware-request-headers.js\";\nimport { serializeSetCookie, validateCookieName } from \"./internal/cookie-serialize.js\";\nimport { parseCookieHeader } from \"./internal/parse-cookie-header.js\";\nimport { getRequestExecutionContext } from \"./request-context.js\";\nimport { assertSafeNavigationUrl } from \"./url-safety.js\";\nimport { stripBasePath } from \"../utils/base-path.js\";\n\n// ---------------------------------------------------------------------------\n// Inlined cache-scope guard for after()\n//\n// We cannot statically import throwIfInsideCacheScope from headers.ts here\n// because headers.ts contains the \"use cache\" directive string in its error\n// message, which causes Vite's use-cache transform to include it in the module\n// graph. If headers.ts is pulled in via static import from server.ts, the\n// transform fires on it in Pages Router fixtures that lack @vitejs/plugin-rsc.\n//\n// The connection() function in this file avoids the same problem by using\n// `await import(\"./headers.js\")` (dynamic import, async function). after()\n// must remain synchronous, so we inline the check using the same Symbol.for\n// keys that cache-runtime.ts and cache.ts register their ALS instances with.\n// ---------------------------------------------------------------------------\n\nconst _USE_CACHE_ALS_KEY = Symbol.for(\"vinext.cacheRuntime.contextAls\");\nconst _UNSTABLE_CACHE_ALS_KEY = Symbol.for(\"vinext.unstableCache.als\");\nconst _g = globalThis as unknown as Record<PropertyKey, unknown>;\n\n/**\n * Record an invalid dynamic usage error on the request context so it survives\n * user try/catch and can be forwarded to the dev overlay on client-side navigations.\n */\nfunction _recordInvalidDynamicUsageError(error: Error): void {\n try {\n const _unifiedAls = _g[Symbol.for(\"vinext.unifiedRequestContext.als\")] as\n | { getStore(): unknown }\n | undefined;\n const ctx = _unifiedAls?.getStore() as Record<string, unknown> | undefined;\n if (ctx) ctx.invalidDynamicUsageError = error;\n } catch {\n // Ignore — best-effort recording for dev diagnostics\n }\n}\n\nfunction _throwIfInsideCacheScope(apiName: string): void {\n const cacheAls = _g[_USE_CACHE_ALS_KEY] as { getStore(): unknown } | undefined;\n if (cacheAls?.getStore() != null) {\n const error = new Error(\n `\\`${apiName}\\` cannot be called inside \"use cache\". ` +\n `If you need this data inside a cached function, call \\`${apiName}\\` ` +\n \"outside and pass the required data as an argument.\",\n );\n _recordInvalidDynamicUsageError(error);\n throw error;\n }\n const unstableAls = _g[_UNSTABLE_CACHE_ALS_KEY] as { getStore(): unknown } | undefined;\n if (unstableAls?.getStore() === true) {\n const error = new Error(\n `\\`${apiName}\\` cannot be called inside a function cached with \\`unstable_cache()\\`. ` +\n `If you need this data inside a cached function, call \\`${apiName}\\` ` +\n \"outside and pass the required data as an argument.\",\n );\n _recordInvalidDynamicUsageError(error);\n throw error;\n }\n}\n\n// ---------------------------------------------------------------------------\n// NextRequest\n// ---------------------------------------------------------------------------\n\nexport class NextRequest extends Request {\n private _nextUrl: NextURL;\n private _url: string;\n private _cookies: RequestCookies;\n\n constructor(\n input: URL | RequestInfo,\n init?: RequestInit & {\n nextConfig?: {\n basePath?: string;\n i18n?: { locales: string[]; defaultLocale: string };\n trailingSlash?: boolean;\n };\n },\n ) {\n // Match Next.js: reject relative URLs with the canonical error before any\n // fallback URL parsing kicks in. Next.js calls `validateURL(url)` at the\n // top of its NextRequest constructor; we mirror that here so middleware\n // tests asserting on the error message text get the documented string.\n // Reuse the local `validateURL` helper so the message format stays in lockstep\n // with NextResponse, and so `javascript:` / `data:` URIs are blocked too.\n const rawUrl = typeof input !== \"string\" && \"url\" in input ? input.url : String(input);\n validateURL(rawUrl);\n // Strip nextConfig before passing to super() — it's vinext-internal,\n // not a valid RequestInit property.\n const { nextConfig: _nextConfig, ...requestInit } = init ?? {};\n if (input instanceof Request) {\n // Keep caller-owned request bodies readable after wrapping. Middleware and\n // route-handler plumbing may need the source Request after this wrapper runs.\n const requestInput =\n requestInit.body === undefined && input.body && !input.bodyUsed ? input.clone() : input;\n super(requestInput, requestInit);\n } else {\n super(input, requestInit);\n }\n const url =\n typeof input === \"string\"\n ? new URL(input, \"http://localhost\")\n : input instanceof URL\n ? input\n : new URL(input.url, \"http://localhost\");\n const urlConfig: NextURLConfig | undefined = _nextConfig\n ? {\n basePath: _nextConfig.basePath,\n nextConfig: { i18n: _nextConfig.i18n, trailingSlash: _nextConfig.trailingSlash },\n }\n : undefined;\n this._nextUrl = new NextURL(url, undefined, urlConfig);\n this._url = process.env.__NEXT_NO_MIDDLEWARE_URL_NORMALIZE\n ? url.toString()\n : this._nextUrl.toString();\n this._cookies = new RequestCookies(this.headers);\n }\n\n get nextUrl(): NextURL {\n return this._nextUrl;\n }\n\n get url(): string {\n return this._url;\n }\n\n get cookies(): RequestCookies {\n return this._cookies;\n }\n\n /**\n * Client IP address. Prefers Cloudflare's trusted CF-Connecting-IP header\n * over the spoofable X-Forwarded-For. Returns undefined if unavailable.\n */\n get ip(): string | undefined {\n return (\n this.headers.get(\"cf-connecting-ip\") ??\n this.headers.get(\"x-real-ip\") ??\n this.headers.get(\"x-forwarded-for\")?.split(\",\")[0]?.trim() ??\n undefined\n );\n }\n\n /**\n * Geolocation data. Platform-dependent (e.g., Cloudflare, Vercel).\n * Returns undefined if not available.\n */\n get geo():\n | { city?: string; country?: string; region?: string; latitude?: string; longitude?: string }\n | undefined {\n // Check Cloudflare-style headers, Vercel-style headers\n const country =\n this.headers.get(\"cf-ipcountry\") ?? this.headers.get(\"x-vercel-ip-country\") ?? undefined;\n if (!country) return undefined;\n return {\n country,\n city: this.headers.get(\"cf-ipcity\") ?? this.headers.get(\"x-vercel-ip-city\") ?? undefined,\n region:\n this.headers.get(\"cf-region\") ??\n this.headers.get(\"x-vercel-ip-country-region\") ??\n undefined,\n latitude:\n this.headers.get(\"cf-iplatitude\") ?? this.headers.get(\"x-vercel-ip-latitude\") ?? undefined,\n longitude:\n this.headers.get(\"cf-iplongitude\") ??\n this.headers.get(\"x-vercel-ip-longitude\") ??\n undefined,\n };\n }\n\n /**\n * The build ID of the Next.js application.\n * Delegates to `nextUrl.buildId` to match Next.js API surface.\n * Can be used in middleware to detect deployment skew between client and server.\n */\n get buildId(): string | undefined {\n return this._nextUrl.buildId;\n }\n}\n\n// ---------------------------------------------------------------------------\n// NextResponse\n// ---------------------------------------------------------------------------\n\n/** Valid HTTP redirect status codes, matching Next.js's REDIRECTS set. */\nconst REDIRECT_STATUSES = new Set([301, 302, 303, 307, 308]);\n\nfunction validateURL(url: string | URL | NextURL): string {\n assertSafeNavigationUrl(String(url));\n try {\n return String(new URL(String(url)));\n } catch (error) {\n throw new Error(\n `URL is malformed \"${String(\n url,\n )}\". Please use only absolute URLs - https://nextjs.org/docs/messages/middleware-relative-urls`,\n { cause: error },\n );\n }\n}\n\nexport class NextResponse<_Body = unknown> extends Response {\n private _cookies: ResponseCookies;\n\n constructor(body?: BodyInit | null, init?: ResponseInit) {\n super(body, init);\n this._cookies = new MiddlewareResponseCookies(this.headers);\n }\n\n get cookies(): ResponseCookies {\n return this._cookies;\n }\n\n /**\n * Create a JSON response.\n */\n static json<JsonBody>(body: JsonBody, init?: ResponseInit): NextResponse<JsonBody> {\n const headers = new Headers(init?.headers);\n if (!headers.has(\"content-type\")) {\n headers.set(\"content-type\", \"application/json\");\n }\n return new NextResponse(JSON.stringify(body), {\n ...init,\n headers,\n }) as NextResponse<JsonBody>;\n }\n\n /**\n * Create a redirect response.\n */\n static redirect(url: string | URL | NextURL, init?: number | ResponseInit): NextResponse {\n const status = typeof init === \"number\" ? init : (init?.status ?? 307);\n if (!REDIRECT_STATUSES.has(status)) {\n throw new RangeError(`Failed to execute \"redirect\" on \"response\": Invalid status code`);\n }\n const headers = new Headers(typeof init === \"object\" ? init?.headers : undefined);\n headers.set(\"Location\", validateURL(url));\n return new NextResponse(null, { status, headers });\n }\n\n /**\n * Create a rewrite response (middleware pattern).\n * Sets the x-middleware-rewrite header.\n */\n static rewrite(destination: string | URL | NextURL, init?: MiddlewareResponseInit): NextResponse {\n const headers = new Headers(init?.headers);\n headers.set(MIDDLEWARE_REWRITE_HEADER, validateURL(destination));\n if (init?.request?.headers) {\n encodeMiddlewareRequestHeaders(headers, init.request.headers);\n }\n return new NextResponse(null, { ...init, headers });\n }\n\n /**\n * Continue to the next handler (middleware pattern).\n * Sets the x-middleware-next header.\n */\n static next(init?: MiddlewareResponseInit): NextResponse {\n const headers = new Headers(init?.headers);\n headers.set(MIDDLEWARE_NEXT_HEADER, \"1\");\n if (init?.request?.headers) {\n encodeMiddlewareRequestHeaders(headers, init.request.headers);\n }\n return new NextResponse(null, { ...init, headers });\n }\n}\n\n// ---------------------------------------------------------------------------\n// NextURL — lightweight URL wrapper with pathname helpers\n// ---------------------------------------------------------------------------\n\nexport type NextURLConfig = {\n basePath?: string;\n nextConfig?: {\n i18n?: {\n locales: string[];\n defaultLocale: string;\n };\n /**\n * When true, `href`/`toString()` formats non-root, non-file-like pathnames\n * with a trailing slash. Matches Next.js's `formatNextPathnameInfo` so that\n * `NextResponse.redirect(request.nextUrl)` and `NextResponse.rewrite(url)`\n * honour the user's `trailingSlash` config.\n */\n trailingSlash?: boolean;\n };\n};\n\nexport class NextURL {\n /** Internal URL stores the pathname WITHOUT basePath or locale prefix. */\n private _url: URL;\n private _basePath: string;\n private _trailingSlash: boolean;\n private _locale: string | undefined;\n private _defaultLocale: string | undefined;\n private _locales: string[] | undefined;\n\n constructor(input: string | URL, base?: string | URL, config?: NextURLConfig) {\n this._url = new URL(input.toString(), base);\n this._basePath = config?.basePath ?? \"\";\n this._trailingSlash = config?.nextConfig?.trailingSlash ?? false;\n this._stripBasePath();\n const i18n = config?.nextConfig?.i18n;\n if (i18n) {\n this._locales = [...i18n.locales];\n this._defaultLocale = i18n.defaultLocale;\n this._analyzeLocale(this._locales);\n }\n }\n\n /** Strip basePath prefix from the internal pathname. */\n private _stripBasePath(): void {\n if (!this._basePath) return;\n this._url.pathname = stripBasePath(this._url.pathname, this._basePath);\n }\n\n /** Extract locale from pathname, stripping it from the internal URL. */\n private _analyzeLocale(locales: string[]): void {\n const segments = this._url.pathname.split(\"/\");\n const candidate = segments[1]?.toLowerCase();\n const match = locales.find((l) => l.toLowerCase() === candidate);\n if (match) {\n this._locale = match;\n this._url.pathname = \"/\" + segments.slice(2).join(\"/\");\n } else {\n this._locale = this._defaultLocale;\n }\n }\n\n /**\n * Reconstruct the full pathname with basePath + locale prefix and apply\n * the configured trailingSlash policy.\n * Mirrors Next.js's internal formatNextPathnameInfo().\n */\n private _formatPathname(): string {\n // Build prefix: basePath + locale (skip defaultLocale — Next.js omits it)\n let prefix = this._basePath;\n if (this._locale && this._locale !== this._defaultLocale) {\n prefix += \"/\" + this._locale;\n }\n const inner = this._url.pathname;\n const composed = !prefix ? inner : inner === \"/\" ? prefix : prefix + inner;\n return this._applyTrailingSlash(composed);\n }\n\n /**\n * Apply the configured trailingSlash policy to a composed pathname. Matches\n * Next.js's `formatNextPathnameInfo`: when `trailingSlash` is true, add a\n * trailing slash unless the path is empty/root; when false, strip a trailing\n * slash unless the path is empty/root.\n */\n private _applyTrailingSlash(pathname: string): string {\n // Never strip or add a slash to the root path.\n if (pathname === \"\" || pathname === \"/\") return pathname;\n if (this._trailingSlash) {\n return pathname.endsWith(\"/\") ? pathname : pathname + \"/\";\n }\n return pathname.endsWith(\"/\") ? pathname.slice(0, -1) : pathname;\n }\n\n get href(): string {\n const formatted = this._formatPathname();\n if (formatted === this._url.pathname) return this._url.href;\n // Replace pathname in href via string slicing — avoids URL allocation.\n // URL.href is always <origin+auth><pathname><search><hash>.\n const { href, pathname, search, hash } = this._url;\n const baseEnd = href.length - pathname.length - search.length - hash.length;\n return href.slice(0, baseEnd) + formatted + search + hash;\n }\n set href(value: string) {\n this._url.href = value;\n this._stripBasePath();\n if (this._locales) this._analyzeLocale(this._locales);\n }\n\n get origin(): string {\n return this._url.origin;\n }\n\n get protocol(): string {\n return this._url.protocol;\n }\n set protocol(value: string) {\n this._url.protocol = value;\n }\n\n get username(): string {\n return this._url.username;\n }\n set username(value: string) {\n this._url.username = value;\n }\n\n get password(): string {\n return this._url.password;\n }\n set password(value: string) {\n this._url.password = value;\n }\n\n get host(): string {\n return this._url.host;\n }\n set host(value: string) {\n this._url.host = value;\n }\n\n get hostname(): string {\n return this._url.hostname;\n }\n set hostname(value: string) {\n this._url.hostname = value;\n }\n\n get port(): string {\n return this._url.port;\n }\n set port(value: string) {\n this._url.port = value;\n }\n\n /** Returns the pathname WITHOUT basePath or locale prefix. */\n get pathname(): string {\n return this._url.pathname;\n }\n set pathname(value: string) {\n this._url.pathname = value;\n }\n\n get search(): string {\n return this._url.search;\n }\n set search(value: string) {\n this._url.search = value;\n }\n\n get searchParams(): URLSearchParams {\n return this._url.searchParams;\n }\n\n get hash(): string {\n return this._url.hash;\n }\n set hash(value: string) {\n this._url.hash = value;\n }\n\n get basePath(): string {\n return this._basePath;\n }\n set basePath(value: string) {\n this._basePath = value === \"\" ? \"\" : value.startsWith(\"/\") ? value : \"/\" + value;\n }\n\n get locale(): string {\n return this._locale ?? \"\";\n }\n set locale(value: string | undefined) {\n if (this._locales) {\n if (!value) {\n this._locale = this._defaultLocale;\n return;\n }\n if (!this._locales.includes(value)) {\n throw new TypeError(\n `The locale \"${value}\" is not in the configured locales: ${this._locales.join(\", \")}`,\n );\n }\n }\n this._locale = this._locales ? value : this._locale;\n }\n\n get defaultLocale(): string | undefined {\n return this._defaultLocale;\n }\n\n get locales(): string[] | undefined {\n return this._locales ? [...this._locales] : undefined;\n }\n\n clone(): NextURL {\n const nextConfig: NonNullable<NextURLConfig[\"nextConfig\"]> = {};\n if (this._locales) {\n nextConfig.i18n = { locales: [...this._locales], defaultLocale: this._defaultLocale! };\n }\n if (this._trailingSlash) {\n nextConfig.trailingSlash = true;\n }\n const config: NextURLConfig = {\n basePath: this._basePath,\n nextConfig: Object.keys(nextConfig).length > 0 ? nextConfig : undefined,\n };\n // Pass the full href (with locale/basePath re-added) so the constructor\n // can re-analyze and extract locale correctly.\n return new NextURL(this.href, undefined, config);\n }\n\n toString(): string {\n return this.href;\n }\n\n /**\n * The build ID of the Next.js application.\n * Set from `generateBuildId` in next.config.js, or a random UUID if not configured.\n * Can be used in middleware to detect deployment skew between client and server.\n * Matches the Next.js API: `request.nextUrl.buildId`.\n */\n get buildId(): string | undefined {\n return process.env.__VINEXT_BUILD_ID ?? undefined;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Cookie helpers (minimal implementations)\n// ---------------------------------------------------------------------------\n\ntype CookieEntry = {\n name: string;\n value: string;\n};\n\nexport class RequestCookies {\n private _headers: Headers;\n private _parsed: Map<string, string>;\n\n constructor(headers: Headers) {\n this._headers = headers;\n this._parsed = parseCookieHeader(headers.get(\"cookie\") ?? \"\");\n }\n\n get(name: string): CookieEntry | undefined {\n const value = this._parsed.get(name);\n return value !== undefined ? { name, value } : undefined;\n }\n\n getAll(nameOrOptions?: string | CookieEntry): CookieEntry[] {\n const name = typeof nameOrOptions === \"string\" ? nameOrOptions : nameOrOptions?.name;\n return [...this._parsed.entries()]\n .filter(([cookieName]) => name === undefined || cookieName === name)\n .map(([cookieName, value]) => ({ name: cookieName, value }));\n }\n\n has(name: string): boolean {\n return this._parsed.has(name);\n }\n\n set(nameOrOptions: string | CookieEntry, value?: string): this {\n let cookieName: string;\n let cookieValue: string;\n if (typeof nameOrOptions === \"string\") {\n cookieName = nameOrOptions;\n cookieValue = value ?? \"\";\n } else {\n cookieName = nameOrOptions.name;\n cookieValue = nameOrOptions.value;\n }\n validateCookieName(cookieName);\n this._parsed.set(cookieName, cookieValue);\n this._syncHeader();\n return this;\n }\n\n delete(names: string | string[]): boolean | boolean[] {\n if (Array.isArray(names)) {\n const results = names.map((name) => {\n validateCookieName(name);\n return this._parsed.delete(name);\n });\n this._syncHeader();\n return results;\n }\n validateCookieName(names);\n const result = this._parsed.delete(names);\n this._syncHeader();\n return result;\n }\n\n clear(): this {\n this._parsed.clear();\n this._syncHeader();\n return this;\n }\n\n get size(): number {\n return this._parsed.size;\n }\n\n toString(): string {\n return this._serialize();\n }\n\n private _serialize(): string {\n return [...this._parsed.entries()].map(([n, v]) => `${n}=${encodeURIComponent(v)}`).join(\"; \");\n }\n\n private _syncHeader(): void {\n if (this._parsed.size === 0) {\n this._headers.delete(\"cookie\");\n } else {\n this._headers.set(\"cookie\", this._serialize());\n }\n }\n\n [Symbol.iterator](): IterableIterator<[string, CookieEntry]> {\n const entries = this.getAll().map((c) => [c.name, c] as [string, CookieEntry]);\n return entries[Symbol.iterator]();\n }\n}\n\n// Keep this error message in sync with headers.ts. This adapter backs\n// NextRequest cookies, while headers.ts owns the next/headers cookies object.\nclass ReadonlyRequestCookiesError extends Error {\n constructor() {\n super(\n \"Cookies can only be modified in a Server Action or Route Handler. Read more: https://nextjs.org/docs/app/api-reference/functions/cookies#options\",\n );\n }\n\n static callable(this: void): never {\n throw new ReadonlyRequestCookiesError();\n }\n}\n\nconst REQUEST_HEADERS_MUTATING_METHODS = new Set([\"set\", \"delete\", \"append\"]);\n\n// Keep this error message in sync with headers.ts. This adapter backs\n// NextRequest headers in force-static route handlers, while headers.ts owns the\n// next/headers object.\nclass ReadonlyRequestHeadersError extends Error {\n constructor() {\n super(\n \"Headers cannot be modified. Read more: https://nextjs.org/docs/app/api-reference/functions/headers\",\n );\n }\n\n static callable(this: void): never {\n throw new ReadonlyRequestHeadersError();\n }\n}\n\nexport function sealRequestHeaders(headers: Headers): Headers {\n return new Proxy<Headers>(headers, {\n get(target, prop) {\n if (typeof prop === \"string\" && REQUEST_HEADERS_MUTATING_METHODS.has(prop)) {\n return ReadonlyRequestHeadersError.callable;\n }\n\n const value = Reflect.get(target, prop, target);\n return typeof value === \"function\" ? value.bind(target) : value;\n },\n });\n}\n\nexport function sealRequestCookies(cookies: RequestCookies): RequestCookies {\n return new Proxy<RequestCookies>(cookies, {\n get(target, prop) {\n if (prop === \"set\" || prop === \"delete\" || prop === \"clear\") {\n return ReadonlyRequestCookiesError.callable;\n }\n\n const value = Reflect.get(target, prop, target);\n return typeof value === \"function\" ? value.bind(target) : value;\n },\n });\n}\n\nexport class ResponseCookies {\n private _headers: Headers;\n /** Internal map keyed by cookie name — single source of truth. */\n private _parsed: Map<string, { serialized: string; entry: CookieEntry }> = new Map();\n\n constructor(headers: Headers) {\n this._headers = headers;\n\n // Hydrate internal map from any existing Set-Cookie headers\n for (const header of headers.getSetCookie()) {\n const eq = header.indexOf(\"=\");\n if (eq === -1) continue;\n const cookieName = header.slice(0, eq);\n const semi = header.indexOf(\";\", eq);\n const raw = header.slice(eq + 1, semi === -1 ? undefined : semi);\n let value: string;\n try {\n value = decodeURIComponent(raw);\n } catch {\n value = raw;\n }\n this._parsed.set(cookieName, { serialized: header, entry: { name: cookieName, value } });\n }\n }\n\n set(\n ...args:\n | [name: string, value: string, options?: CookieOptions]\n | [options: CookieOptions & { name: string; value: string }]\n ): this {\n const [name, value, opts] = parseCookieSetArgs(args);\n validateCookieName(name);\n\n const serialized = serializeSetCookie(name, value, opts);\n this._parsed.set(name, { serialized, entry: { name, value } });\n this._syncHeaders();\n return this;\n }\n\n get(...args: [name: string] | [options: { name: string }]): CookieEntry | undefined {\n const key = typeof args[0] === \"string\" ? args[0] : args[0].name;\n return this._parsed.get(key)?.entry;\n }\n\n has(name: string): boolean {\n return this._parsed.has(name);\n }\n\n getAll(...args: [name: string] | [options: { name: string }] | []): CookieEntry[] {\n const all = [...this._parsed.values()].map((v) => v.entry);\n if (args.length === 0) return all;\n const key = typeof args[0] === \"string\" ? args[0] : args[0].name;\n return all.filter((c) => c.name === key);\n }\n\n delete(\n ...args:\n | [name: string]\n | [options: Omit<CookieOptions & { name: string }, \"maxAge\" | \"expires\">]\n ): this {\n const [name, opts] =\n typeof args[0] === \"string\" ? [args[0], undefined] : [args[0].name, args[0]];\n return this.set({\n name,\n value: \"\",\n expires: new Date(0),\n path: opts?.path,\n domain: opts?.domain,\n httpOnly: opts?.httpOnly,\n secure: opts?.secure,\n sameSite: opts?.sameSite,\n });\n }\n\n [Symbol.iterator](): IterableIterator<[string, CookieEntry]> {\n const entries: [string, CookieEntry][] = [...this._parsed.values()].map((v) => [\n v.entry.name,\n v.entry,\n ]);\n return entries[Symbol.iterator]();\n }\n\n /** Delete all Set-Cookie headers and re-append from the internal map. */\n private _syncHeaders(): void {\n this._headers.delete(\"Set-Cookie\");\n for (const { serialized } of this._parsed.values()) {\n this._headers.append(\"Set-Cookie\", serialized);\n }\n }\n}\n\nclass MiddlewareResponseCookies extends ResponseCookies {\n private _responseHeaders: Headers;\n\n constructor(headers: Headers) {\n super(headers);\n this._responseHeaders = headers;\n }\n\n override set(\n ...args:\n | [name: string, value: string, options?: CookieOptions]\n | [options: CookieOptions & { name: string; value: string }]\n ): this {\n super.set(...args);\n this._syncMiddlewareCookieHeader();\n return this;\n }\n\n override delete(\n ...args:\n | [name: string]\n | [options: Omit<CookieOptions & { name: string }, \"maxAge\" | \"expires\">]\n ): this {\n super.delete(...args);\n this._syncMiddlewareCookieHeader();\n return this;\n }\n\n private _syncMiddlewareCookieHeader(): void {\n const cookies = this._responseHeaders.getSetCookie();\n if (cookies.length === 0) {\n this._responseHeaders.delete(MIDDLEWARE_SET_COOKIE_HEADER);\n return;\n }\n\n this._responseHeaders.set(MIDDLEWARE_SET_COOKIE_HEADER, cookies.join(\",\"));\n }\n}\n\ntype CookieOptions = {\n path?: string;\n domain?: string;\n maxAge?: number;\n expires?: Date;\n httpOnly?: boolean;\n secure?: boolean;\n sameSite?: \"Strict\" | \"Lax\" | \"None\";\n};\n\n/**\n * Parse the overloaded arguments for ResponseCookies.set():\n * - (name, value, options?) — positional form\n * - ({ name, value, ...options }) — object form\n */\nfunction parseCookieSetArgs(\n args:\n | [name: string, value: string, options?: CookieOptions]\n | [options: CookieOptions & { name: string; value: string }],\n): [string, string, CookieOptions | undefined] {\n if (typeof args[0] === \"string\") {\n return [args[0], args[1] as string, args[2] as CookieOptions | undefined];\n }\n const { name, value, ...opts } = args[0];\n return [name, value, opts as CookieOptions];\n}\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type MiddlewareResponseInit = {\n request?: {\n headers?: Headers;\n };\n} & ResponseInit;\n\nexport type NextMiddlewareResult = NextResponse | Response | null | undefined | void;\n\nexport type NextMiddleware = (\n request: NextRequest,\n event: NextFetchEvent,\n) => NextMiddlewareResult | Promise<NextMiddlewareResult>;\n\n/**\n * Minimal NextFetchEvent — extends FetchEvent where available,\n * otherwise provides the waitUntil pattern standalone.\n */\nexport class NextFetchEvent {\n sourcePage: string;\n private _waitUntilPromises: Promise<unknown>[] = [];\n\n constructor(params: { page: string }) {\n this.sourcePage = params.page;\n }\n\n waitUntil(promise: Promise<unknown>): void {\n this._waitUntilPromises.push(promise);\n }\n\n get waitUntilPromises(): Promise<unknown>[] {\n return this._waitUntilPromises;\n }\n\n /** Drain all waitUntil promises. Returns a single promise that settles when all are done. */\n drainWaitUntil(): Promise<PromiseSettledResult<unknown>[]> {\n return Promise.allSettled(this._waitUntilPromises);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Utility exports\n// ---------------------------------------------------------------------------\n\n/**\n * Parse user agent string. Minimal implementation — for full UA parsing,\n * apps should use a dedicated library like `ua-parser-js`.\n */\nexport function userAgentFromString(ua: string | undefined): UserAgent {\n const input = ua ?? \"\";\n return {\n isBot: /bot|crawler|spider|crawling/i.test(input),\n ua: input,\n browser: {},\n device: {},\n engine: {},\n os: {},\n cpu: {},\n };\n}\n\nexport function userAgent({ headers }: { headers: Headers }): UserAgent {\n return userAgentFromString(headers.get(\"user-agent\") ?? undefined);\n}\n\nexport type UserAgent = {\n isBot: boolean;\n ua: string;\n browser: { name?: string; version?: string; major?: string };\n device: { model?: string; type?: string; vendor?: string };\n engine: { name?: string; version?: string };\n os: { name?: string; version?: string };\n cpu: { architecture?: string };\n};\n\n/**\n * after() — schedule work after the response is sent.\n *\n * Uses the platform's `waitUntil` (via the per-request ExecutionContext) when\n * available so the task survives past the response on Cloudflare Workers.\n * Falls back to a fire-and-forget microtask on runtimes without an execution\n * context (e.g. Node.js dev server).\n *\n * Throws when called inside a cached scope — request-specific\n * side-effects must not leak into cached results.\n */\nexport function after<T>(task: Promise<T> | (() => T | Promise<T>)): void {\n _throwIfInsideCacheScope(\"after()\");\n\n const promise = typeof task === \"function\" ? Promise.resolve().then(task) : task;\n // NOTE: vinext runs function tasks concurrently with response streaming (next microtask),\n // whereas Next.js queues them to run strictly after the response is sent via onClose.\n // This is a known simplification — function tasks here are not guaranteed to run\n // after the response completes, only after the current synchronous execution.\n //\n // `.catch()` is attached synchronously in the same tick as `promise` is created, so\n // there is no window where a pre-rejected `task` promise could trigger an\n // `unhandledrejection` event before the handler is in place.\n const guarded = promise.catch((err) => {\n console.error(\"[vinext] after() task failed:\", err);\n });\n\n // TODO: Next.js throws when after() is called outside a request context or when\n // waitUntil is unavailable, preventing silent task loss. vinext falls back to\n // fire-and-forget here, which is correct for the Node.js dev server (where\n // getRequestExecutionContext() always returns null). On Workers, a misconfigured\n // entry that omits runWithExecutionContext would silently drop tasks — consider\n // a one-time console.warn on the fallback path, gated to production only (e.g.\n // `process.env.NODE_ENV === 'production'` or `typeof caches !== 'undefined'` for\n // a Workers runtime check) with a module-level `let _warned = false` guard so it\n // fires at most once and doesn't spam the dev-server console.\n getRequestExecutionContext()?.waitUntil(guarded);\n}\n\n/**\n * connection() — signals that the response requires a live connection\n * (not a static/cached response). Opts the page out of ISR caching\n * and sets Cache-Control: no-store on the response.\n */\nexport async function connection(): Promise<void> {\n const { markDynamicUsage, markRenderRequestApiUsage, throwIfInsideCacheScope } =\n await import(\"./headers.js\");\n markRenderRequestApiUsage(\"connection\");\n throwIfInsideCacheScope(\"connection()\");\n markDynamicUsage();\n}\n\n/**\n * URLPattern re-export — used in middleware for route matching.\n * Available natively in Node 20+, Cloudflare Workers, Deno.\n * Falls back to urlpattern-polyfill if the global is not available.\n */\nexport const URLPattern: typeof globalThis.URLPattern =\n globalThis.URLPattern ??\n (() => {\n throw new Error(\n \"URLPattern is not available in this runtime. \" +\n \"Install the `urlpattern-polyfill` package or upgrade to Node 20+.\",\n );\n });\n"],"mappings":"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"}
|
package/dist/shims/slot.js
CHANGED
|
@@ -36,8 +36,12 @@ function isInterceptionMetadataValue(value) {
|
|
|
36
36
|
if (typeof value !== "object" || value === null || Array.isArray(value)) return false;
|
|
37
37
|
return "sourceMatchedUrl" in value && typeof value.sourceMatchedUrl === "string" && "sourceRouteId" in value && typeof value.sourceRouteId === "string" && "slotId" in value && typeof value.slotId === "string" && "targetMatchedUrl" in value && typeof value.targetMatchedUrl === "string" && "targetRouteId" in value && typeof value.targetRouteId === "string";
|
|
38
38
|
}
|
|
39
|
+
function isCacheEntryReuseProofValue(value) {
|
|
40
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) return false;
|
|
41
|
+
return "kind" in value && value.kind === "runtime-cache-entry" && "decision" in value;
|
|
42
|
+
}
|
|
39
43
|
function isTransportMetadataValue(value) {
|
|
40
|
-
return isLayoutFlagsValue(value) || isArtifactCompatibilityEnvelopeValue(value) || isInterceptionMetadataValue(value) || isSlotBindingListValue(value);
|
|
44
|
+
return isLayoutFlagsValue(value) || isArtifactCompatibilityEnvelopeValue(value) || isCacheEntryReuseProofValue(value) || isInterceptionMetadataValue(value) || isSlotBindingListValue(value);
|
|
41
45
|
}
|
|
42
46
|
function warnTransportMetadataEntry(id) {
|
|
43
47
|
if (process.env.NODE_ENV === "production") return;
|
package/dist/shims/slot.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slot.js","names":["React"],"sources":["../../src/shims/slot.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport {\n AppElementsWire,\n UNMATCHED_SLOT,\n type AppElementValue,\n type AppElements,\n type AppElementsInterception,\n type AppElementsSlotBinding,\n type LayoutFlags,\n} from \"../server/app-elements.js\";\nimport type { ArtifactCompatibilityEnvelope } from \"../server/artifact-compatibility.js\";\nimport { notFound } from \"./navigation.js\";\n\nconst EMPTY_ELEMENTS: AppElements = Object.freeze({});\nconst warnedMissingEntryIds = new Set<string>();\nconst warnedTransportMetadataEntryIds = new Set<string>();\n\nexport { UNMATCHED_SLOT };\n\n/**\n * Holds resolved AppElements (not a Promise). React 19's use(Promise) during\n * hydration triggers \"async Client Component\" for native Promises that lack\n * React's internal .status property. Storing resolved values sidesteps this.\n */\nexport const ElementsContext = React.createContext<AppElements>(EMPTY_ELEMENTS);\n\nexport const ChildrenContext = React.createContext<React.ReactNode>(null);\n\nexport const ParallelSlotsContext = React.createContext<Readonly<\n Record<string, React.ReactNode>\n> | null>(null);\n\ntype MergeElementsOptions = {\n clearAbsentSlots?: boolean;\n preserveAbsentSlots?: boolean;\n preserveElementIds?: readonly string[];\n preservePreviousSlotIds?: readonly string[];\n};\n\nfunction isLayoutFlagsValue(value: unknown): value is LayoutFlags {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return false;\n const entries = Object.values(value);\n return entries.length > 0 && entries.every((entry) => entry === \"s\" || entry === \"d\");\n}\n\nfunction isArtifactCompatibilityEnvelopeValue(\n value: unknown,\n): value is ArtifactCompatibilityEnvelope {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return false;\n return (\n \"schemaVersion\" in value &&\n \"appElementsSchemaVersion\" in value &&\n \"rscPayloadSchemaVersion\" in value &&\n \"graphVersion\" in value &&\n \"deploymentVersion\" in value &&\n \"rootBoundaryId\" in value &&\n \"renderEpoch\" in value\n );\n}\n\nfunction isSlotBindingValue(value: unknown): value is AppElementsSlotBinding {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return false;\n return \"ownerLayoutId\" in value && \"slotId\" in value && \"state\" in value;\n}\n\nfunction isSlotBindingListValue(value: unknown): value is readonly AppElementsSlotBinding[] {\n // Empty [] is valid metadata when parsed from a missing __slotBindings key,\n // but it is not valid renderable slot content. Keep this guard non-empty so\n // accidental [] entries under render keys are not silently swallowed.\n return Array.isArray(value) && value.length > 0 && value.every(isSlotBindingValue);\n}\n\nfunction isInterceptionMetadataValue(value: unknown): value is AppElementsInterception {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return false;\n return (\n \"sourceMatchedUrl\" in value &&\n typeof value.sourceMatchedUrl === \"string\" &&\n \"sourceRouteId\" in value &&\n typeof value.sourceRouteId === \"string\" &&\n \"slotId\" in value &&\n typeof value.slotId === \"string\" &&\n \"targetMatchedUrl\" in value &&\n typeof value.targetMatchedUrl === \"string\" &&\n \"targetRouteId\" in value &&\n typeof value.targetRouteId === \"string\"\n );\n}\n\nfunction isTransportMetadataValue(\n value: AppElementValue | undefined,\n): value is\n | LayoutFlags\n | ArtifactCompatibilityEnvelope\n | AppElementsInterception\n | readonly AppElementsSlotBinding[] {\n return (\n isLayoutFlagsValue(value) ||\n isArtifactCompatibilityEnvelopeValue(value) ||\n isInterceptionMetadataValue(value) ||\n isSlotBindingListValue(value)\n );\n}\n\nfunction warnTransportMetadataEntry(id: string): void {\n if (process.env.NODE_ENV === \"production\") return;\n if (warnedTransportMetadataEntryIds.has(id)) return;\n\n warnedTransportMetadataEntryIds.add(id);\n console.warn(\"[vinext] Transport metadata value found under App Router render entry: \" + id);\n}\n\nexport function mergeElements(\n prev: AppElements,\n next: AppElements,\n options: MergeElementsOptions | boolean = {},\n): AppElements {\n const clearAbsentSlots =\n typeof options === \"boolean\" ? options : (options.clearAbsentSlots ?? false);\n const preserveAbsentSlots =\n typeof options === \"boolean\" ? !options : (options.preserveAbsentSlots ?? true);\n const preserveElementIds = typeof options === \"boolean\" ? [] : (options.preserveElementIds ?? []);\n const preservePreviousSlotIds =\n typeof options === \"boolean\" ? [] : (options.preservePreviousSlotIds ?? []);\n const merged: Record<string, AppElementValue> = { ...next };\n\n for (const id of preserveElementIds) {\n if (Object.hasOwn(merged, id)) continue;\n if (Object.hasOwn(prev, id)) {\n const value = prev[id];\n if (value !== undefined) merged[id] = value;\n }\n }\n\n const slotKeys = new Set(\n [...Object.keys(prev), ...Object.keys(next)].filter((key) => AppElementsWire.isSlotId(key)),\n );\n // On traversal (browser back/forward), the server renders the full destination\n // route tree. A slot absent from next means the destination route tree does not\n // include it, so clear it rather than keeping the stale prev value. The legacy\n // absent-slot path stays opt-in for unpromoted fallbacks; promoted navigation\n // commits preserve default/unmatched slots through planner-approved\n // preservePreviousSlotIds.\n if (clearAbsentSlots) {\n for (const key of slotKeys) {\n if (!Object.hasOwn(next, key)) {\n delete merged[key];\n }\n }\n } else if (preserveAbsentSlots) {\n for (const key of slotKeys) {\n if (!Object.hasOwn(merged, key) && Object.hasOwn(prev, key)) {\n const value = prev[key];\n if (value !== undefined) merged[key] = value;\n }\n }\n }\n\n // Default/unmatched slot preservation is a router-state decision, not a\n // consequence of a missing key or an unmatched marker on the transport. This\n // loop intentionally runs after clear/preserve element handling so planner-\n // approved slot content and binding proof win the final merged value.\n for (const id of preservePreviousSlotIds) {\n if (!AppElementsWire.isSlotId(id)) continue;\n if (!Object.hasOwn(prev, id)) continue;\n const value = prev[id];\n if (value !== undefined && value !== UNMATCHED_SLOT) {\n merged[id] = value;\n }\n }\n\n return merged;\n}\n\nexport function Slot({\n id,\n children,\n parallelSlots,\n}: {\n id: string;\n children?: React.ReactNode;\n parallelSlots?: Readonly<Record<string, React.ReactNode>>;\n}) {\n const elements = React.useContext(ElementsContext);\n\n if (!Object.hasOwn(elements, id)) {\n if (process.env.NODE_ENV !== \"production\" && !AppElementsWire.isSlotId(id)) {\n if (!warnedMissingEntryIds.has(id)) {\n warnedMissingEntryIds.add(id);\n console.warn(\"[vinext] Missing App Router element entry during render: \" + id);\n }\n }\n return null;\n }\n\n const element = elements[id];\n if (isTransportMetadataValue(element)) {\n warnTransportMetadataEntry(id);\n return null;\n }\n if (element === UNMATCHED_SLOT) {\n notFound();\n }\n\n return (\n <ParallelSlotsContext.Provider value={parallelSlots ?? null}>\n <ChildrenContext.Provider value={children ?? null}>{element}</ChildrenContext.Provider>\n </ParallelSlotsContext.Provider>\n );\n}\n\nexport function Children() {\n return React.useContext(ChildrenContext);\n}\n\nexport function ParallelSlot({ name }: { name: string }) {\n const slots = React.useContext(ParallelSlotsContext);\n return slots?.[name] ?? null;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"slot.js","names":["React"],"sources":["../../src/shims/slot.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport {\n AppElementsWire,\n UNMATCHED_SLOT,\n type AppElementValue,\n type AppElements,\n type AppElementsInterception,\n type AppElementsSlotBinding,\n type LayoutFlags,\n} from \"../server/app-elements.js\";\nimport type { ArtifactCompatibilityEnvelope } from \"../server/artifact-compatibility.js\";\nimport type { CacheEntryReuseProof } from \"../server/cache-proof.js\";\nimport { notFound } from \"./navigation.js\";\n\nconst EMPTY_ELEMENTS: AppElements = Object.freeze({});\nconst warnedMissingEntryIds = new Set<string>();\nconst warnedTransportMetadataEntryIds = new Set<string>();\n\nexport { UNMATCHED_SLOT };\n\n/**\n * Holds resolved AppElements (not a Promise). React 19's use(Promise) during\n * hydration triggers \"async Client Component\" for native Promises that lack\n * React's internal .status property. Storing resolved values sidesteps this.\n */\nexport const ElementsContext = React.createContext<AppElements>(EMPTY_ELEMENTS);\n\nexport const ChildrenContext = React.createContext<React.ReactNode>(null);\n\nexport const ParallelSlotsContext = React.createContext<Readonly<\n Record<string, React.ReactNode>\n> | null>(null);\n\ntype MergeElementsOptions = {\n clearAbsentSlots?: boolean;\n preserveAbsentSlots?: boolean;\n preserveElementIds?: readonly string[];\n preservePreviousSlotIds?: readonly string[];\n};\n\nfunction isLayoutFlagsValue(value: unknown): value is LayoutFlags {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return false;\n const entries = Object.values(value);\n return entries.length > 0 && entries.every((entry) => entry === \"s\" || entry === \"d\");\n}\n\nfunction isArtifactCompatibilityEnvelopeValue(\n value: unknown,\n): value is ArtifactCompatibilityEnvelope {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return false;\n return (\n \"schemaVersion\" in value &&\n \"appElementsSchemaVersion\" in value &&\n \"rscPayloadSchemaVersion\" in value &&\n \"graphVersion\" in value &&\n \"deploymentVersion\" in value &&\n \"rootBoundaryId\" in value &&\n \"renderEpoch\" in value\n );\n}\n\nfunction isSlotBindingValue(value: unknown): value is AppElementsSlotBinding {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return false;\n return \"ownerLayoutId\" in value && \"slotId\" in value && \"state\" in value;\n}\n\nfunction isSlotBindingListValue(value: unknown): value is readonly AppElementsSlotBinding[] {\n // Empty [] is valid metadata when parsed from a missing __slotBindings key,\n // but it is not valid renderable slot content. Keep this guard non-empty so\n // accidental [] entries under render keys are not silently swallowed.\n return Array.isArray(value) && value.length > 0 && value.every(isSlotBindingValue);\n}\n\nfunction isInterceptionMetadataValue(value: unknown): value is AppElementsInterception {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return false;\n return (\n \"sourceMatchedUrl\" in value &&\n typeof value.sourceMatchedUrl === \"string\" &&\n \"sourceRouteId\" in value &&\n typeof value.sourceRouteId === \"string\" &&\n \"slotId\" in value &&\n typeof value.slotId === \"string\" &&\n \"targetMatchedUrl\" in value &&\n typeof value.targetMatchedUrl === \"string\" &&\n \"targetRouteId\" in value &&\n typeof value.targetRouteId === \"string\"\n );\n}\n\nfunction isCacheEntryReuseProofValue(value: unknown): value is CacheEntryReuseProof {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return false;\n return \"kind\" in value && value.kind === \"runtime-cache-entry\" && \"decision\" in value;\n}\n\nfunction isTransportMetadataValue(\n value: AppElementValue | undefined,\n): value is\n | LayoutFlags\n | ArtifactCompatibilityEnvelope\n | CacheEntryReuseProof\n | AppElementsInterception\n | readonly AppElementsSlotBinding[] {\n return (\n isLayoutFlagsValue(value) ||\n isArtifactCompatibilityEnvelopeValue(value) ||\n isCacheEntryReuseProofValue(value) ||\n isInterceptionMetadataValue(value) ||\n isSlotBindingListValue(value)\n );\n}\n\nfunction warnTransportMetadataEntry(id: string): void {\n if (process.env.NODE_ENV === \"production\") return;\n if (warnedTransportMetadataEntryIds.has(id)) return;\n\n warnedTransportMetadataEntryIds.add(id);\n console.warn(\"[vinext] Transport metadata value found under App Router render entry: \" + id);\n}\n\nexport function mergeElements(\n prev: AppElements,\n next: AppElements,\n options: MergeElementsOptions | boolean = {},\n): AppElements {\n const clearAbsentSlots =\n typeof options === \"boolean\" ? options : (options.clearAbsentSlots ?? false);\n const preserveAbsentSlots =\n typeof options === \"boolean\" ? !options : (options.preserveAbsentSlots ?? true);\n const preserveElementIds = typeof options === \"boolean\" ? [] : (options.preserveElementIds ?? []);\n const preservePreviousSlotIds =\n typeof options === \"boolean\" ? [] : (options.preservePreviousSlotIds ?? []);\n const merged: Record<string, AppElementValue> = { ...next };\n\n for (const id of preserveElementIds) {\n if (Object.hasOwn(merged, id)) continue;\n if (Object.hasOwn(prev, id)) {\n const value = prev[id];\n if (value !== undefined) merged[id] = value;\n }\n }\n\n const slotKeys = new Set(\n [...Object.keys(prev), ...Object.keys(next)].filter((key) => AppElementsWire.isSlotId(key)),\n );\n // On traversal (browser back/forward), the server renders the full destination\n // route tree. A slot absent from next means the destination route tree does not\n // include it, so clear it rather than keeping the stale prev value. The legacy\n // absent-slot path stays opt-in for unpromoted fallbacks; promoted navigation\n // commits preserve default/unmatched slots through planner-approved\n // preservePreviousSlotIds.\n if (clearAbsentSlots) {\n for (const key of slotKeys) {\n if (!Object.hasOwn(next, key)) {\n delete merged[key];\n }\n }\n } else if (preserveAbsentSlots) {\n for (const key of slotKeys) {\n if (!Object.hasOwn(merged, key) && Object.hasOwn(prev, key)) {\n const value = prev[key];\n if (value !== undefined) merged[key] = value;\n }\n }\n }\n\n // Default/unmatched slot preservation is a router-state decision, not a\n // consequence of a missing key or an unmatched marker on the transport. This\n // loop intentionally runs after clear/preserve element handling so planner-\n // approved slot content and binding proof win the final merged value.\n for (const id of preservePreviousSlotIds) {\n if (!AppElementsWire.isSlotId(id)) continue;\n if (!Object.hasOwn(prev, id)) continue;\n const value = prev[id];\n if (value !== undefined && value !== UNMATCHED_SLOT) {\n merged[id] = value;\n }\n }\n\n return merged;\n}\n\nexport function Slot({\n id,\n children,\n parallelSlots,\n}: {\n id: string;\n children?: React.ReactNode;\n parallelSlots?: Readonly<Record<string, React.ReactNode>>;\n}) {\n const elements = React.useContext(ElementsContext);\n\n if (!Object.hasOwn(elements, id)) {\n if (process.env.NODE_ENV !== \"production\" && !AppElementsWire.isSlotId(id)) {\n if (!warnedMissingEntryIds.has(id)) {\n warnedMissingEntryIds.add(id);\n console.warn(\"[vinext] Missing App Router element entry during render: \" + id);\n }\n }\n return null;\n }\n\n const element = elements[id];\n if (isTransportMetadataValue(element)) {\n warnTransportMetadataEntry(id);\n return null;\n }\n if (element === UNMATCHED_SLOT) {\n notFound();\n }\n\n return (\n <ParallelSlotsContext.Provider value={parallelSlots ?? null}>\n <ChildrenContext.Provider value={children ?? null}>{element}</ChildrenContext.Provider>\n </ParallelSlotsContext.Provider>\n );\n}\n\nexport function Children() {\n return React.useContext(ChildrenContext);\n}\n\nexport function ParallelSlot({ name }: { name: string }) {\n const slots = React.useContext(ParallelSlotsContext);\n return slots?.[name] ?? null;\n}\n"],"mappings":";;;;;;;AAgBA,MAAM,iBAA8B,OAAO,OAAO,EAAE,CAAC;AACrD,MAAM,wCAAwB,IAAI,KAAa;AAC/C,MAAM,kDAAkC,IAAI,KAAa;;;;;;AASzD,MAAa,kBAAkBA,QAAM,cAA2B,eAAe;AAE/E,MAAa,kBAAkBA,QAAM,cAA+B,KAAK;AAEzE,MAAa,uBAAuBA,QAAM,cAEhC,KAAK;AASf,SAAS,mBAAmB,OAAsC;CAChE,IAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,MAAM,EAAE,OAAO;CAChF,MAAM,UAAU,OAAO,OAAO,MAAM;CACpC,OAAO,QAAQ,SAAS,KAAK,QAAQ,OAAO,UAAU,UAAU,OAAO,UAAU,IAAI;;AAGvF,SAAS,qCACP,OACwC;CACxC,IAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,MAAM,EAAE,OAAO;CAChF,OACE,mBAAmB,SACnB,8BAA8B,SAC9B,6BAA6B,SAC7B,kBAAkB,SAClB,uBAAuB,SACvB,oBAAoB,SACpB,iBAAiB;;AAIrB,SAAS,mBAAmB,OAAiD;CAC3E,IAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,MAAM,EAAE,OAAO;CAChF,OAAO,mBAAmB,SAAS,YAAY,SAAS,WAAW;;AAGrE,SAAS,uBAAuB,OAA4D;CAI1F,OAAO,MAAM,QAAQ,MAAM,IAAI,MAAM,SAAS,KAAK,MAAM,MAAM,mBAAmB;;AAGpF,SAAS,4BAA4B,OAAkD;CACrF,IAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,MAAM,EAAE,OAAO;CAChF,OACE,sBAAsB,SACtB,OAAO,MAAM,qBAAqB,YAClC,mBAAmB,SACnB,OAAO,MAAM,kBAAkB,YAC/B,YAAY,SACZ,OAAO,MAAM,WAAW,YACxB,sBAAsB,SACtB,OAAO,MAAM,qBAAqB,YAClC,mBAAmB,SACnB,OAAO,MAAM,kBAAkB;;AAInC,SAAS,4BAA4B,OAA+C;CAClF,IAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,MAAM,EAAE,OAAO;CAChF,OAAO,UAAU,SAAS,MAAM,SAAS,yBAAyB,cAAc;;AAGlF,SAAS,yBACP,OAMoC;CACpC,OACE,mBAAmB,MAAM,IACzB,qCAAqC,MAAM,IAC3C,4BAA4B,MAAM,IAClC,4BAA4B,MAAM,IAClC,uBAAuB,MAAM;;AAIjC,SAAS,2BAA2B,IAAkB;CACpD,IAAI,QAAQ,IAAI,aAAa,cAAc;CAC3C,IAAI,gCAAgC,IAAI,GAAG,EAAE;CAE7C,gCAAgC,IAAI,GAAG;CACvC,QAAQ,KAAK,4EAA4E,GAAG;;AAG9F,SAAgB,cACd,MACA,MACA,UAA0C,EAAE,EAC/B;CACb,MAAM,mBACJ,OAAO,YAAY,YAAY,UAAW,QAAQ,oBAAoB;CACxE,MAAM,sBACJ,OAAO,YAAY,YAAY,CAAC,UAAW,QAAQ,uBAAuB;CAC5E,MAAM,qBAAqB,OAAO,YAAY,YAAY,EAAE,GAAI,QAAQ,sBAAsB,EAAE;CAChG,MAAM,0BACJ,OAAO,YAAY,YAAY,EAAE,GAAI,QAAQ,2BAA2B,EAAE;CAC5E,MAAM,SAA0C,EAAE,GAAG,MAAM;CAE3D,KAAK,MAAM,MAAM,oBAAoB;EACnC,IAAI,OAAO,OAAO,QAAQ,GAAG,EAAE;EAC/B,IAAI,OAAO,OAAO,MAAM,GAAG,EAAE;GAC3B,MAAM,QAAQ,KAAK;GACnB,IAAI,UAAU,KAAA,GAAW,OAAO,MAAM;;;CAI1C,MAAM,WAAW,IAAI,IACnB,CAAC,GAAG,OAAO,KAAK,KAAK,EAAE,GAAG,OAAO,KAAK,KAAK,CAAC,CAAC,QAAQ,QAAQ,gBAAgB,SAAS,IAAI,CAAC,CAC5F;CAOD,IAAI;OACG,MAAM,OAAO,UAChB,IAAI,CAAC,OAAO,OAAO,MAAM,IAAI,EAC3B,OAAO,OAAO;QAGb,IAAI;OACJ,MAAM,OAAO,UAChB,IAAI,CAAC,OAAO,OAAO,QAAQ,IAAI,IAAI,OAAO,OAAO,MAAM,IAAI,EAAE;GAC3D,MAAM,QAAQ,KAAK;GACnB,IAAI,UAAU,KAAA,GAAW,OAAO,OAAO;;;CAS7C,KAAK,MAAM,MAAM,yBAAyB;EACxC,IAAI,CAAC,gBAAgB,SAAS,GAAG,EAAE;EACnC,IAAI,CAAC,OAAO,OAAO,MAAM,GAAG,EAAE;EAC9B,MAAM,QAAQ,KAAK;EACnB,IAAI,UAAU,KAAA,KAAa,UAAU,gBACnC,OAAO,MAAM;;CAIjB,OAAO;;AAGT,SAAgB,KAAK,EACnB,IACA,UACA,iBAKC;CACD,MAAM,WAAWA,QAAM,WAAW,gBAAgB;CAElD,IAAI,CAAC,OAAO,OAAO,UAAU,GAAG,EAAE;EAChC,IAAI,QAAQ,IAAI,aAAa,gBAAgB,CAAC,gBAAgB,SAAS,GAAG;OACpE,CAAC,sBAAsB,IAAI,GAAG,EAAE;IAClC,sBAAsB,IAAI,GAAG;IAC7B,QAAQ,KAAK,8DAA8D,GAAG;;;EAGlF,OAAO;;CAGT,MAAM,UAAU,SAAS;CACzB,IAAI,yBAAyB,QAAQ,EAAE;EACrC,2BAA2B,GAAG;EAC9B,OAAO;;CAET,IAAI,YAAY,gBACd,UAAU;CAGZ,OACE,oBAAC,qBAAqB,UAAtB;EAA+B,OAAO,iBAAiB;YACrD,oBAAC,gBAAgB,UAAjB;GAA0B,OAAO,YAAY;aAAO;GAAmC,CAAA;EACzD,CAAA;;AAIpC,SAAgB,WAAW;CACzB,OAAOA,QAAM,WAAW,gBAAgB;;AAG1C,SAAgB,aAAa,EAAE,QAA0B;CAEvD,OADcA,QAAM,WAAW,qBACnB,GAAG,SAAS"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { PrivateCacheState } from "./cache-runtime.js";
|
|
2
2
|
import { ExecutionContextLike } from "./request-context.js";
|
|
3
3
|
import { CacheState } from "./cache.js";
|
|
4
|
-
import { FetchCacheState } from "./fetch-cache.js";
|
|
5
4
|
import { RootParamsState } from "./root-params.js";
|
|
5
|
+
import { FetchCacheState } from "./fetch-cache.js";
|
|
6
6
|
import { VinextHeadersShimState } from "./headers.js";
|
|
7
7
|
import { RouterState } from "./router-state.js";
|
|
8
8
|
import { HeadState } from "./head-state.js";
|
|
@@ -7,7 +7,29 @@
|
|
|
7
7
|
*/
|
|
8
8
|
declare const DANGEROUS_URL_BLOCK_MESSAGE = "Next.js has blocked a javascript: URL as a security precaution.";
|
|
9
9
|
declare function isDangerousScheme(url: string): boolean;
|
|
10
|
+
/**
|
|
11
|
+
* Emit a `console.error` matching Next.js's blocked-navigation message.
|
|
12
|
+
*
|
|
13
|
+
* Next.js's `router.push` / `router.replace` / `router.prefetch` (and the
|
|
14
|
+
* Pages Router equivalents) throw an `Error` when the URL has a dangerous
|
|
15
|
+
* scheme. In the browser, React's event-handler runtime catches that throw
|
|
16
|
+
* and reports it through `console.error`, which is what the Next.js E2E
|
|
17
|
+
* `test/e2e/app-dir/javascript-urls` suite asserts on.
|
|
18
|
+
*
|
|
19
|
+
* Vinext's navigation guards run synchronously inside async event handlers
|
|
20
|
+
* (e.g. Link's `void handleClick(event)`), so a raw throw is dropped on the
|
|
21
|
+
* floor instead of bubbling up to React. Emitting the same `console.error`
|
|
22
|
+
* explicitly keeps observable behaviour aligned with Next.js — the test
|
|
23
|
+
* matcher uses `.includes("has blocked a javascript: URL as a security
|
|
24
|
+
* precaution.")` so any message containing that phrase satisfies it.
|
|
25
|
+
*
|
|
26
|
+
* Source reference (Next.js):
|
|
27
|
+
* packages/next/src/client/components/segment-cache/navigation.ts:537
|
|
28
|
+
* packages/next/src/client/components/app-router-instance.ts:345,402,442,460
|
|
29
|
+
* packages/next/src/shared/lib/router/router.ts:1025,1057
|
|
30
|
+
*/
|
|
31
|
+
declare function reportBlockedDangerousNavigation(): void;
|
|
10
32
|
declare function assertSafeNavigationUrl(url: string): void;
|
|
11
33
|
//#endregion
|
|
12
|
-
export { DANGEROUS_URL_BLOCK_MESSAGE, assertSafeNavigationUrl, isDangerousScheme };
|
|
34
|
+
export { DANGEROUS_URL_BLOCK_MESSAGE, assertSafeNavigationUrl, isDangerousScheme, reportBlockedDangerousNavigation };
|
|
13
35
|
//# sourceMappingURL=url-safety.d.ts.map
|
package/dist/shims/url-safety.js
CHANGED
|
@@ -36,10 +36,37 @@ function isDangerousScheme(url) {
|
|
|
36
36
|
const str = "" + url;
|
|
37
37
|
return DANGEROUS_SCHEME_RES.some((re) => re.test(str));
|
|
38
38
|
}
|
|
39
|
+
/**
|
|
40
|
+
* Emit a `console.error` matching Next.js's blocked-navigation message.
|
|
41
|
+
*
|
|
42
|
+
* Next.js's `router.push` / `router.replace` / `router.prefetch` (and the
|
|
43
|
+
* Pages Router equivalents) throw an `Error` when the URL has a dangerous
|
|
44
|
+
* scheme. In the browser, React's event-handler runtime catches that throw
|
|
45
|
+
* and reports it through `console.error`, which is what the Next.js E2E
|
|
46
|
+
* `test/e2e/app-dir/javascript-urls` suite asserts on.
|
|
47
|
+
*
|
|
48
|
+
* Vinext's navigation guards run synchronously inside async event handlers
|
|
49
|
+
* (e.g. Link's `void handleClick(event)`), so a raw throw is dropped on the
|
|
50
|
+
* floor instead of bubbling up to React. Emitting the same `console.error`
|
|
51
|
+
* explicitly keeps observable behaviour aligned with Next.js — the test
|
|
52
|
+
* matcher uses `.includes("has blocked a javascript: URL as a security
|
|
53
|
+
* precaution.")` so any message containing that phrase satisfies it.
|
|
54
|
+
*
|
|
55
|
+
* Source reference (Next.js):
|
|
56
|
+
* packages/next/src/client/components/segment-cache/navigation.ts:537
|
|
57
|
+
* packages/next/src/client/components/app-router-instance.ts:345,402,442,460
|
|
58
|
+
* packages/next/src/shared/lib/router/router.ts:1025,1057
|
|
59
|
+
*/
|
|
60
|
+
function reportBlockedDangerousNavigation() {
|
|
61
|
+
console.error(DANGEROUS_URL_BLOCK_MESSAGE);
|
|
62
|
+
}
|
|
39
63
|
function assertSafeNavigationUrl(url) {
|
|
40
|
-
if (isDangerousScheme(url))
|
|
64
|
+
if (isDangerousScheme(url)) {
|
|
65
|
+
reportBlockedDangerousNavigation();
|
|
66
|
+
throw new Error(DANGEROUS_URL_BLOCK_MESSAGE);
|
|
67
|
+
}
|
|
41
68
|
}
|
|
42
69
|
//#endregion
|
|
43
|
-
export { DANGEROUS_URL_BLOCK_MESSAGE, assertSafeNavigationUrl, isDangerousScheme };
|
|
70
|
+
export { DANGEROUS_URL_BLOCK_MESSAGE, assertSafeNavigationUrl, isDangerousScheme, reportBlockedDangerousNavigation };
|
|
44
71
|
|
|
45
72
|
//# sourceMappingURL=url-safety.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"url-safety.js","names":[],"sources":["../../src/shims/url-safety.ts"],"sourcesContent":["/**\n * Shared URL safety utilities for Link, Form, and navigation shims.\n *\n * Centralizes dangerous URI scheme detection so all components and\n * navigation functions use the same validation logic.\n */\n\n/**\n * Detect dangerous URI schemes that should never be navigated to.\n *\n * Adapted from Next.js's javascript URL detector:\n * packages/next/src/client/lib/javascript-url.ts\n * https://github.com/vercel/next.js/blob/canary/packages/next/src/client/lib/javascript-url.ts\n *\n * URL parsing ignores leading C0 control characters / spaces, and treats\n * embedded tab/newline characters in the scheme as insignificant. We mirror\n * that behavior here so obfuscated values like `java\\nscript:` and\n * `\\x00javascript:` are still blocked.\n *\n * Vinext intentionally extends this handling to `data:` and `vbscript:` too,\n * since both are also dangerous navigation targets.\n */\nconst LEADING_IGNORED = \"[\\\\u0000-\\\\u001F \\\\u200B\\\\uFEFF]*\";\nconst SCHEME_IGNORED = \"[\\\\r\\\\n\\\\t]*\";\n\nfunction buildDangerousSchemeRegex(scheme: string): RegExp {\n const chars = scheme.split(\"\").join(SCHEME_IGNORED);\n return new RegExp(`^${LEADING_IGNORED}${chars}${SCHEME_IGNORED}:`, \"i\");\n}\n\nconst DANGEROUS_SCHEME_RES = [\n buildDangerousSchemeRegex(\"javascript\"),\n buildDangerousSchemeRegex(\"data\"),\n buildDangerousSchemeRegex(\"vbscript\"),\n];\n\nexport const DANGEROUS_URL_BLOCK_MESSAGE =\n \"Next.js has blocked a javascript: URL as a security precaution.\";\n\nexport function isDangerousScheme(url: string): boolean {\n const str = \"\" + (url as unknown as string);\n return DANGEROUS_SCHEME_RES.some((re) => re.test(str));\n}\n\nexport function assertSafeNavigationUrl(url: string): void {\n if (isDangerousScheme(url)) {\n throw new Error(DANGEROUS_URL_BLOCK_MESSAGE);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAsBA,MAAM,kBAAkB;AACxB,MAAM,iBAAiB;AAEvB,SAAS,0BAA0B,QAAwB;CACzD,MAAM,QAAQ,OAAO,MAAM,GAAG,CAAC,KAAK,eAAe;CACnD,OAAO,IAAI,OAAO,IAAI,kBAAkB,QAAQ,eAAe,IAAI,IAAI;;AAGzE,MAAM,uBAAuB;CAC3B,0BAA0B,aAAa;CACvC,0BAA0B,OAAO;CACjC,0BAA0B,WAAW;CACtC;AAED,MAAa,8BACX;AAEF,SAAgB,kBAAkB,KAAsB;CACtD,MAAM,MAAM,KAAM;CAClB,OAAO,qBAAqB,MAAM,OAAO,GAAG,KAAK,IAAI,CAAC;;
|
|
1
|
+
{"version":3,"file":"url-safety.js","names":[],"sources":["../../src/shims/url-safety.ts"],"sourcesContent":["/**\n * Shared URL safety utilities for Link, Form, and navigation shims.\n *\n * Centralizes dangerous URI scheme detection so all components and\n * navigation functions use the same validation logic.\n */\n\n/**\n * Detect dangerous URI schemes that should never be navigated to.\n *\n * Adapted from Next.js's javascript URL detector:\n * packages/next/src/client/lib/javascript-url.ts\n * https://github.com/vercel/next.js/blob/canary/packages/next/src/client/lib/javascript-url.ts\n *\n * URL parsing ignores leading C0 control characters / spaces, and treats\n * embedded tab/newline characters in the scheme as insignificant. We mirror\n * that behavior here so obfuscated values like `java\\nscript:` and\n * `\\x00javascript:` are still blocked.\n *\n * Vinext intentionally extends this handling to `data:` and `vbscript:` too,\n * since both are also dangerous navigation targets.\n */\nconst LEADING_IGNORED = \"[\\\\u0000-\\\\u001F \\\\u200B\\\\uFEFF]*\";\nconst SCHEME_IGNORED = \"[\\\\r\\\\n\\\\t]*\";\n\nfunction buildDangerousSchemeRegex(scheme: string): RegExp {\n const chars = scheme.split(\"\").join(SCHEME_IGNORED);\n return new RegExp(`^${LEADING_IGNORED}${chars}${SCHEME_IGNORED}:`, \"i\");\n}\n\nconst DANGEROUS_SCHEME_RES = [\n buildDangerousSchemeRegex(\"javascript\"),\n buildDangerousSchemeRegex(\"data\"),\n buildDangerousSchemeRegex(\"vbscript\"),\n];\n\nexport const DANGEROUS_URL_BLOCK_MESSAGE =\n \"Next.js has blocked a javascript: URL as a security precaution.\";\n\nexport function isDangerousScheme(url: string): boolean {\n const str = \"\" + (url as unknown as string);\n return DANGEROUS_SCHEME_RES.some((re) => re.test(str));\n}\n\n/**\n * Emit a `console.error` matching Next.js's blocked-navigation message.\n *\n * Next.js's `router.push` / `router.replace` / `router.prefetch` (and the\n * Pages Router equivalents) throw an `Error` when the URL has a dangerous\n * scheme. In the browser, React's event-handler runtime catches that throw\n * and reports it through `console.error`, which is what the Next.js E2E\n * `test/e2e/app-dir/javascript-urls` suite asserts on.\n *\n * Vinext's navigation guards run synchronously inside async event handlers\n * (e.g. Link's `void handleClick(event)`), so a raw throw is dropped on the\n * floor instead of bubbling up to React. Emitting the same `console.error`\n * explicitly keeps observable behaviour aligned with Next.js — the test\n * matcher uses `.includes(\"has blocked a javascript: URL as a security\n * precaution.\")` so any message containing that phrase satisfies it.\n *\n * Source reference (Next.js):\n * packages/next/src/client/components/segment-cache/navigation.ts:537\n * packages/next/src/client/components/app-router-instance.ts:345,402,442,460\n * packages/next/src/shared/lib/router/router.ts:1025,1057\n */\nexport function reportBlockedDangerousNavigation(): void {\n console.error(DANGEROUS_URL_BLOCK_MESSAGE);\n}\n\nexport function assertSafeNavigationUrl(url: string): void {\n if (isDangerousScheme(url)) {\n reportBlockedDangerousNavigation();\n throw new Error(DANGEROUS_URL_BLOCK_MESSAGE);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAsBA,MAAM,kBAAkB;AACxB,MAAM,iBAAiB;AAEvB,SAAS,0BAA0B,QAAwB;CACzD,MAAM,QAAQ,OAAO,MAAM,GAAG,CAAC,KAAK,eAAe;CACnD,OAAO,IAAI,OAAO,IAAI,kBAAkB,QAAQ,eAAe,IAAI,IAAI;;AAGzE,MAAM,uBAAuB;CAC3B,0BAA0B,aAAa;CACvC,0BAA0B,OAAO;CACjC,0BAA0B,WAAW;CACtC;AAED,MAAa,8BACX;AAEF,SAAgB,kBAAkB,KAAsB;CACtD,MAAM,MAAM,KAAM;CAClB,OAAO,qBAAqB,MAAM,OAAO,GAAG,KAAK,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;AAwBxD,SAAgB,mCAAyC;CACvD,QAAQ,MAAM,4BAA4B;;AAG5C,SAAgB,wBAAwB,KAAmB;CACzD,IAAI,kBAAkB,IAAI,EAAE;EAC1B,kCAAkC;EAClC,MAAM,IAAI,MAAM,4BAA4B"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
//#region src/shims/url-utils.d.ts
|
|
2
2
|
declare function isAbsoluteUrl(url: string): boolean;
|
|
3
3
|
declare function isAbsoluteOrProtocolRelativeUrl(url: string): boolean;
|
|
4
|
+
declare function getWindowOrigin(): string | null;
|
|
4
5
|
/**
|
|
5
6
|
* If `url` is an absolute same-origin URL, return the local path
|
|
6
7
|
* (pathname + search + hash). Returns null for truly external URLs
|
|
@@ -47,5 +48,5 @@ declare function resolveRelativeHref(href: string, currentUrl?: string, basePath
|
|
|
47
48
|
declare function toBrowserNavigationHref(href: string, currentUrl?: string, basePath?: string): string;
|
|
48
49
|
declare function isHashOnlyBrowserUrlChange(href: string, currentHref: string, basePath?: string): boolean;
|
|
49
50
|
//#endregion
|
|
50
|
-
export { isAbsoluteOrProtocolRelativeUrl, isAbsoluteUrl, isHashOnlyBrowserUrlChange, normalizePathTrailingSlash, resolveRelativeHref, toBrowserNavigationHref, toSameOriginAppPath, toSameOriginPath, withBasePath };
|
|
51
|
+
export { getWindowOrigin, isAbsoluteOrProtocolRelativeUrl, isAbsoluteUrl, isHashOnlyBrowserUrlChange, normalizePathTrailingSlash, resolveRelativeHref, toBrowserNavigationHref, toSameOriginAppPath, toSameOriginPath, withBasePath };
|
|
51
52
|
//# sourceMappingURL=url-utils.d.ts.map
|
package/dist/shims/url-utils.js
CHANGED
|
@@ -14,16 +14,27 @@ function isAbsoluteUrl(url) {
|
|
|
14
14
|
function isAbsoluteOrProtocolRelativeUrl(url) {
|
|
15
15
|
return isAbsoluteUrl(url) || url.startsWith("//");
|
|
16
16
|
}
|
|
17
|
+
function getWindowOrigin() {
|
|
18
|
+
if (typeof window === "undefined") return null;
|
|
19
|
+
const { origin, href } = window.location;
|
|
20
|
+
if (origin) return origin;
|
|
21
|
+
try {
|
|
22
|
+
return new URL(href).origin;
|
|
23
|
+
} catch {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
17
27
|
/**
|
|
18
28
|
* If `url` is an absolute same-origin URL, return the local path
|
|
19
29
|
* (pathname + search + hash). Returns null for truly external URLs
|
|
20
30
|
* or on the server (where origin is unknown).
|
|
21
31
|
*/
|
|
22
32
|
function toSameOriginPath(url) {
|
|
23
|
-
|
|
33
|
+
const origin = getWindowOrigin();
|
|
34
|
+
if (!origin) return null;
|
|
24
35
|
try {
|
|
25
|
-
const parsed = url.startsWith("//") ? new URL(url,
|
|
26
|
-
if (parsed.origin ===
|
|
36
|
+
const parsed = url.startsWith("//") ? new URL(url, origin) : new URL(url);
|
|
37
|
+
if (parsed.origin === origin) return parsed.pathname + parsed.search + parsed.hash;
|
|
27
38
|
} catch {}
|
|
28
39
|
return null;
|
|
29
40
|
}
|
|
@@ -142,6 +153,6 @@ function isHashOnlyBrowserUrlChange(href, currentHref, basePath = "") {
|
|
|
142
153
|
}
|
|
143
154
|
}
|
|
144
155
|
//#endregion
|
|
145
|
-
export { isAbsoluteOrProtocolRelativeUrl, isAbsoluteUrl, isHashOnlyBrowserUrlChange, normalizePathTrailingSlash, resolveRelativeHref, toBrowserNavigationHref, toSameOriginAppPath, toSameOriginPath, withBasePath };
|
|
156
|
+
export { getWindowOrigin, isAbsoluteOrProtocolRelativeUrl, isAbsoluteUrl, isHashOnlyBrowserUrlChange, normalizePathTrailingSlash, resolveRelativeHref, toBrowserNavigationHref, toSameOriginAppPath, toSameOriginPath, withBasePath };
|
|
146
157
|
|
|
147
158
|
//# sourceMappingURL=url-utils.js.map
|