vinext 1.2.1 → 1.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -9
- package/dist/_virtual/_rolldown/runtime.js +1 -1
- package/dist/build/action-owner-manifest.d.ts +3 -2
- package/dist/build/action-owner-manifest.js +18 -2
- package/dist/build/app-page-static-eligibility.d.ts +17 -1
- package/dist/build/app-page-static-eligibility.js +80 -13
- package/dist/build/clean-output.d.ts +2 -1
- package/dist/build/client-build-config.d.ts +77 -6
- package/dist/build/client-build-config.js +176 -12
- package/dist/build/client-reference-async.d.ts +48 -0
- package/dist/build/client-reference-async.js +123 -0
- package/dist/build/client-reference-chunks.d.ts +32 -0
- package/dist/build/client-reference-chunks.js +111 -0
- package/dist/build/client-reference-groups.d.ts +171 -0
- package/dist/build/client-reference-groups.js +572 -0
- package/dist/build/css-url-assets.d.ts +2 -1
- package/dist/build/google-fonts/fallback-metrics.d.ts +2 -1
- package/dist/build/google-fonts/find-font-files-in-css.d.ts +1 -0
- package/dist/build/google-fonts/find-font-files-in-css.js +17 -4
- package/dist/build/google-fonts/font-metadata.d.ts +2 -1
- package/dist/build/google-fonts/validate.d.ts +2 -1
- package/dist/build/inline-css.d.ts +2 -1
- package/dist/build/layout-classification.d.ts +2 -1
- package/dist/build/module-dependency-cache.d.ts +33 -1
- package/dist/build/module-dependency-cache.js +51 -1
- package/dist/build/next-client-runtime-manifests.d.ts +12 -2
- package/dist/build/next-client-runtime-manifests.js +19 -4
- package/dist/build/nitro-public-files.d.ts +24 -0
- package/dist/build/nitro-public-files.js +60 -0
- package/dist/build/pages-client-assets-module.js +1 -1
- package/dist/build/precompress.d.ts +2 -1
- package/dist/build/precompress.js +1 -1
- package/dist/build/prerender-paths.d.ts +2 -1
- package/dist/build/prerender-paths.js +5 -2
- package/dist/build/prerender-phase.d.ts +2 -1
- package/dist/build/prerender-server-pool.js +1 -1
- package/dist/build/prerender.d.ts +3 -2
- package/dist/build/prerender.js +5 -4
- package/dist/build/report.d.ts +2 -1
- package/dist/build/route-classification-injector.d.ts +2 -1
- package/dist/build/route-classification-manifest.d.ts +2 -1
- package/dist/build/run-prerender.d.ts +2 -1
- package/dist/build/server-actions-encryption-key.d.ts +24 -0
- package/dist/build/server-actions-encryption-key.js +101 -0
- package/dist/build/ssr-manifest.d.ts +3 -0
- package/dist/build/ssr-manifest.js +34 -2
- package/dist/build/standalone.d.ts +2 -1
- package/dist/cache/cache-adapters-virtual.d.ts +2 -1
- package/dist/cache.js +1 -2
- package/dist/check.d.ts +2 -1
- package/dist/check.js +4 -0
- package/dist/cli-args.d.ts +2 -1
- package/dist/cli.js +2 -0
- package/dist/client/client-redirect-matcher.js +2 -1
- package/dist/client/client-redirects.d.ts +4 -3
- package/dist/client/client-redirects.js +2 -1
- package/dist/client/client-rewrite-params.d.ts +9 -0
- package/dist/client/client-rewrite-params.js +20 -0
- package/dist/client/client-rewrites.d.ts +2 -1
- package/dist/client/dev-error-overlay-store.d.ts +2 -1
- package/dist/client/dev-error-overlay.js +2 -1
- package/dist/client/index.js +1 -2
- package/dist/client/instrumentation-client-state.js +5 -5
- package/dist/client/navigation-runtime.d.ts +28 -3
- package/dist/client/navigation-runtime.js +42 -11
- package/dist/client/pages-router-link-navigation.d.ts +2 -1
- package/dist/client/vinext-next-data.d.ts +25 -2
- package/dist/client/window-next.d.ts +2 -1
- package/dist/config/config-matchers.d.ts +27 -41
- package/dist/config/config-matchers.js +293 -270
- package/dist/config/config-source.d.ts +34 -0
- package/dist/config/config-source.js +141 -0
- package/dist/config/dotenv.d.ts +2 -1
- package/dist/config/header-params.d.ts +29 -0
- package/dist/config/header-params.js +106 -0
- package/dist/config/next-config.d.ts +20 -6
- package/dist/config/next-config.js +149 -11
- package/dist/config/tsconfig-paths.d.ts +2 -1
- package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/detector.js +23 -0
- package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/index.js +2 -0
- package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/lookup.js +25 -0
- package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/bmp.js +11 -0
- package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/cur.js +15 -0
- package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/dds.js +11 -0
- package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/gif.js +12 -0
- package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/heif.js +55 -0
- package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/icns.js +76 -0
- package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/ico.js +39 -0
- package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/index.js +46 -0
- package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/j2c.js +11 -0
- package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/jp2.js +21 -0
- package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/jpg.js +71 -0
- package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/jxl-stream.js +42 -0
- package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/jxl.js +46 -0
- package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/ktx.js +19 -0
- package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/png.js +28 -0
- package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/pnm.js +54 -0
- package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/psd.js +11 -0
- package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/svg.js +79 -0
- package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/tga.js +15 -0
- package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/tiff.js +96 -0
- package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/utils.js +53 -0
- package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/types/webp.js +45 -0
- package/dist/deps/.pnpm/image-size@2.0.4/deps/image-size/dist/esm/utils/bit-reader.js +38 -0
- package/dist/deps/.pnpm/ua-parser-js@1.0.35/deps/ua-parser-js/src/ua-parser.js +2 -2
- package/dist/entries/app-browser-entry.d.ts +34 -6
- package/dist/entries/app-browser-entry.js +103 -40
- package/dist/entries/app-rsc-entry.d.ts +4 -1
- package/dist/entries/app-rsc-entry.js +131 -66
- package/dist/entries/app-rsc-manifest.d.ts +12 -1
- package/dist/entries/app-rsc-manifest.js +73 -1
- package/dist/entries/app-ssr-entry.d.ts +4 -1
- package/dist/entries/app-ssr-entry.js +9 -2
- package/dist/entries/pages-client-entry.d.ts +1 -0
- package/dist/entries/pages-client-entry.js +6 -6
- package/dist/entries/pages-entry-helpers.js +1 -2
- package/dist/entries/pages-server-entry.d.ts +2 -1
- package/dist/entries/pages-server-entry.js +18 -15
- package/dist/entries/runtime-entry-module.d.ts +1 -0
- package/dist/entries/runtime-entry-module.js +4 -1
- package/dist/image/image-adapters-virtual.d.ts +2 -1
- package/dist/index.d.ts +11 -0
- package/dist/index.js +340 -116
- package/dist/init.js +17 -0
- package/dist/plugins/client-compile-hints.d.ts +30 -0
- package/dist/plugins/client-compile-hints.js +88 -0
- package/dist/plugins/client-reference-dedup.d.ts +2 -1
- package/dist/plugins/cloudflare-dev-module-urls.d.ts +2 -1
- package/dist/plugins/dynamic-preload-metadata.d.ts +3 -1
- package/dist/plugins/dynamic-preload-metadata.js +1 -1
- package/dist/plugins/environment.d.ts +2 -1
- package/dist/plugins/fonts.js +9 -12
- package/dist/plugins/ignore-dynamic-requests.d.ts +2 -1
- package/dist/plugins/import-meta-url.d.ts +2 -1
- package/dist/plugins/og-assets.d.ts +2 -1
- package/dist/plugins/og-assets.js +2 -3
- package/dist/plugins/optimize-imports.d.ts +27 -3
- package/dist/plugins/optimize-imports.js +106 -20
- package/dist/plugins/pages-node-externals.d.ts +2 -1
- package/dist/plugins/remove-console.d.ts +2 -1
- package/dist/plugins/require-condition-resolution.d.ts +2 -1
- package/dist/plugins/rsc-client-reference-loaders.d.ts +53 -1
- package/dist/plugins/rsc-client-reference-loaders.js +447 -27
- package/dist/plugins/rsc-client-shim-excludes.js +2 -0
- package/dist/plugins/sass.d.ts +2 -1
- package/dist/plugins/strip-server-exports.d.ts +2 -1
- package/dist/plugins/styled-jsx.d.ts +2 -1
- package/dist/plugins/transform-result.d.ts +2 -1
- package/dist/plugins/typeof-window.d.ts +2 -1
- package/dist/plugins/use-cache-callable.d.ts +5 -0
- package/dist/plugins/use-cache-callable.js +30 -8
- package/dist/plugins/worker-image-imports.d.ts +1 -0
- package/dist/plugins/worker-image-imports.js +2 -2
- package/dist/plugins/worker-use-server.d.ts +2 -1
- package/dist/routing/app-route-graph.d.ts +41 -1
- package/dist/routing/app-route-graph.js +122 -50
- package/dist/routing/browser-route-manifest.d.ts +44 -0
- package/dist/routing/browser-route-manifest.js +195 -0
- package/dist/routing/hashed-route-patterns.d.ts +4 -0
- package/dist/routing/hashed-route-patterns.js +22 -0
- package/dist/routing/optimistic-route-trie.d.ts +28 -0
- package/dist/routing/optimistic-route-trie.js +102 -0
- package/dist/routing/route-matching.d.ts +2 -1
- package/dist/routing/route-pattern.d.ts +2 -1
- package/dist/routing/route-validation.d.ts +6 -1
- package/dist/routing/route-validation.js +26 -10
- package/dist/server/accept-encoding.d.ts +2 -1
- package/dist/server/app-action-forwarding.d.ts +10 -1
- package/dist/server/app-action-forwarding.js +15 -1
- package/dist/server/app-bfcache-identity.d.ts +2 -1
- package/dist/server/app-browser-action-result.d.ts +2 -1
- package/dist/server/app-browser-client-reuse-manifest.d.ts +2 -1
- package/dist/server/app-browser-entry.js +175 -64
- package/dist/server/app-browser-error.d.ts +5 -2
- package/dist/server/app-browser-error.js +7 -2
- package/dist/server/app-browser-history-controller.d.ts +2 -1
- package/dist/server/app-browser-hydration.d.ts +2 -1
- package/dist/server/app-browser-interception-context.d.ts +4 -3
- package/dist/server/app-browser-mpa-navigation.d.ts +1 -0
- package/dist/server/app-browser-mpa-navigation.js +6 -5
- package/dist/server/app-browser-navigation-controller.d.ts +17 -6
- package/dist/server/app-browser-navigation-controller.js +103 -36
- package/dist/server/app-browser-popstate.d.ts +2 -1
- package/dist/server/app-browser-rsc-redirect.d.ts +2 -1
- package/dist/server/app-browser-server-action-client.d.ts +2 -1
- package/dist/server/app-browser-state.d.ts +2 -2
- package/dist/server/app-browser-state.js +1 -1
- package/dist/server/app-browser-stream.d.ts +2 -1
- package/dist/server/app-browser-visible-commit.d.ts +6 -5
- package/dist/server/app-client-reference-manifest.d.ts +31 -0
- package/dist/server/app-client-reference-manifest.js +46 -0
- package/dist/server/app-client-reference-preloader.d.ts +45 -2
- package/dist/server/app-client-reference-preloader.js +48 -10
- package/dist/server/app-elements-wire.d.ts +2 -1
- package/dist/server/app-elements.d.ts +2 -0
- package/dist/server/app-elements.js +3 -1
- package/dist/server/app-fallback-renderer.d.ts +9 -2
- package/dist/server/app-fallback-renderer.js +6 -2
- package/dist/server/app-history-state.d.ts +2 -1
- package/dist/server/app-inline-css-client.d.ts +2 -1
- package/dist/server/app-layout-param-observation.d.ts +2 -1
- package/dist/server/app-metadata-tracing.d.ts +2 -1
- package/dist/server/app-middleware.d.ts +6 -0
- package/dist/server/app-middleware.js +8 -10
- package/dist/server/app-optimistic-routing.d.ts +26 -11
- package/dist/server/app-optimistic-routing.js +38 -96
- package/dist/server/app-page-boundary-render.d.ts +20 -2
- package/dist/server/app-page-boundary-render.js +229 -39
- package/dist/server/app-page-boundary.d.ts +34 -5
- package/dist/server/app-page-boundary.js +40 -7
- package/dist/server/app-page-cache-finalizer.d.ts +2 -1
- package/dist/server/app-page-cache-finalizer.js +1 -1
- package/dist/server/app-page-cache-render.d.ts +10 -2
- package/dist/server/app-page-cache-render.js +15 -2
- package/dist/server/app-page-cache.js +2 -2
- package/dist/server/app-page-dispatch.d.ts +34 -1
- package/dist/server/app-page-dispatch.js +165 -34
- package/dist/server/app-page-element-builder.d.ts +17 -1
- package/dist/server/app-page-element-builder.js +187 -66
- package/dist/server/app-page-execution.d.ts +28 -1
- package/dist/server/app-page-execution.js +114 -5
- package/dist/server/app-page-head.d.ts +95 -3
- package/dist/server/app-page-head.js +307 -152
- package/dist/server/app-page-http-access-fallback-metadata.d.ts +48 -2
- package/dist/server/app-page-http-access-fallback-metadata.js +76 -1
- package/dist/server/app-page-method.d.ts +2 -1
- package/dist/server/app-page-probe.d.ts +2 -1
- package/dist/server/app-page-render-identity.d.ts +2 -1
- package/dist/server/app-page-render.d.ts +7 -1
- package/dist/server/app-page-render.js +38 -11
- package/dist/server/app-page-request.d.ts +14 -1
- package/dist/server/app-page-request.js +1 -1
- package/dist/server/app-page-route-wiring.d.ts +52 -2
- package/dist/server/app-page-route-wiring.js +197 -47
- package/dist/server/app-page-rsc-render-status.d.ts +3 -1
- package/dist/server/app-page-rsc-render-status.js +1 -0
- package/dist/server/app-page-search-params-observation.d.ts +8 -6
- package/dist/server/app-page-search-params-observation.js +16 -11
- package/dist/server/app-page-segment-plan.d.ts +2 -1
- package/dist/server/app-page-stream.d.ts +38 -1
- package/dist/server/app-page-stream.js +24 -4
- package/dist/server/app-pages-bridge.d.ts +4 -2
- package/dist/server/app-pages-bridge.js +11 -7
- package/dist/server/app-ppr-fallback-shell-render.d.ts +2 -1
- package/dist/server/app-ppr-fallback-shell.d.ts +2 -1
- package/dist/server/app-prerender-endpoints.d.ts +2 -1
- package/dist/server/app-prerender-static-params.d.ts +2 -1
- package/dist/server/app-prerender-static-params.js +3 -2
- package/dist/server/app-render-dependency.d.ts +11 -1
- package/dist/server/app-render-dependency.js +65 -6
- package/dist/server/app-request-stage-independent-entry.d.ts +2 -1
- package/dist/server/app-request-stage-independent-entry.js +2 -2
- package/dist/server/app-response-stage-entry.d.ts +2 -1
- package/dist/server/app-response-stage-entry.js +3 -3
- package/dist/server/app-route-handler-cache.d.ts +2 -1
- package/dist/server/app-route-handler-dispatch.d.ts +2 -1
- package/dist/server/app-route-handler-dispatch.js +4 -2
- package/dist/server/app-route-handler-execution.d.ts +4 -1
- package/dist/server/app-route-handler-execution.js +9 -2
- package/dist/server/app-route-handler-middleware-context.d.ts +2 -1
- package/dist/server/app-route-handler-middleware-context.js +3 -3
- package/dist/server/app-route-handler-response.d.ts +4 -2
- package/dist/server/app-route-handler-response.js +2 -2
- package/dist/server/app-route-handler-runtime.d.ts +4 -1
- package/dist/server/app-route-handler-runtime.js +20 -3
- package/dist/server/app-route-module-loader.d.ts +18 -1
- package/dist/server/app-route-module-loader.js +15 -6
- package/dist/server/app-route-tree-prefetch.d.ts +2 -1
- package/dist/server/app-route-tree.d.ts +20 -0
- package/dist/server/app-route-tree.js +18 -0
- package/dist/server/app-router-entry.js +2 -2
- package/dist/server/app-rsc-combined-handler.js +8 -1
- package/dist/server/app-rsc-error-handler.d.ts +2 -1
- package/dist/server/app-rsc-errors.d.ts +9 -1
- package/dist/server/app-rsc-errors.js +9 -2
- package/dist/server/app-rsc-handler.d.ts +6 -2
- package/dist/server/app-rsc-handler.js +152 -140
- package/dist/server/app-rsc-response-finalizer.d.ts +7 -1
- package/dist/server/app-rsc-response-finalizer.js +4 -1
- package/dist/server/app-rsc-response-stage.js +3 -1
- package/dist/server/app-rsc-route-matching.d.ts +39 -1
- package/dist/server/app-rsc-route-matching.js +25 -1
- package/dist/server/app-segment-config.d.ts +2 -1
- package/dist/server/app-segment-config.js +1 -14
- package/dist/server/app-server-action-execution.d.ts +25 -7
- package/dist/server/app-server-action-execution.js +53 -59
- package/dist/server/app-ssr-entry.d.ts +12 -0
- package/dist/server/app-ssr-entry.js +104 -48
- package/dist/server/app-ssr-error-meta.d.ts +2 -1
- package/dist/server/app-ssr-search-params-gate.d.ts +2 -1
- package/dist/server/app-ssr-stream.d.ts +29 -10
- package/dist/server/app-ssr-stream.js +311 -67
- package/dist/server/app-static-generation.d.ts +2 -1
- package/dist/server/app-streamed-client-references.d.ts +39 -0
- package/dist/server/app-streamed-client-references.js +156 -0
- package/dist/server/app-visited-response-cache.d.ts +2 -1
- package/dist/server/app-worker-stages.d.ts +2 -1
- package/dist/server/artifact-compatibility.d.ts +2 -1
- package/dist/server/bfcache-identity.d.ts +2 -1
- package/dist/server/cache-headers.d.ts +2 -1
- package/dist/server/cacheability-request.d.ts +2 -1
- package/dist/server/client-reuse-manifest.d.ts +2 -1
- package/dist/server/config-headers.d.ts +2 -1
- package/dist/server/config-headers.js +12 -3
- package/dist/server/csp.d.ts +2 -1
- package/dist/server/default-global-not-found-module.d.ts +2 -1
- package/dist/server/default-http-access-fallback-modules.d.ts +33 -0
- package/dist/server/default-http-access-fallback-modules.js +31 -0
- package/dist/server/defer-until-stream-consumed.d.ts +34 -0
- package/dist/server/defer-until-stream-consumed.js +154 -21
- package/dist/server/dev-lockfile.d.ts +32 -2
- package/dist/server/dev-lockfile.js +46 -2
- package/dist/server/dev-module-runner.d.ts +2 -1
- package/dist/server/dev-server.js +10 -3
- package/dist/server/fetch-handler.js +1 -2
- package/dist/server/file-based-metadata.d.ts +2 -1
- package/dist/server/framework-tracer.d.ts +2 -1
- package/dist/server/html.d.ts +1 -0
- package/dist/server/html.js +19 -1
- package/dist/server/http-conditional.d.ts +2 -1
- package/dist/server/http-error-responses.d.ts +2 -1
- package/dist/server/implicit-tags.d.ts +2 -1
- package/dist/server/isolate-shared-promise.d.ts +10 -0
- package/dist/server/isolate-shared-promise.js +33 -0
- package/dist/server/isr-cache.js +3 -2
- package/dist/server/metadata-route-build-data.d.ts +2 -1
- package/dist/server/metadata-route-build-data.js +1 -1
- package/dist/server/metadata-route-response.d.ts +2 -1
- package/dist/server/metadata-route-response.js +1 -1
- package/dist/server/metadata-routes.d.ts +2 -1
- package/dist/server/middleware-matcher-pattern.d.ts +0 -1
- package/dist/server/middleware-matcher-pattern.js +11 -140
- package/dist/server/middleware-matcher.js +5 -6
- package/dist/server/middleware-response-headers.d.ts +31 -0
- package/dist/server/middleware-response-headers.js +57 -1
- package/dist/server/middleware-runtime.d.ts +2 -1
- package/dist/server/middleware-runtime.js +26 -13
- package/dist/server/navigation-planner.d.ts +2 -2
- package/dist/server/navigation-trace.d.ts +2 -1
- package/dist/server/next-error-digest.d.ts +2 -1
- package/dist/server/nitro-public-files-plugin.d.ts +39 -0
- package/dist/server/nitro-public-files-plugin.js +106 -0
- package/dist/server/nitro-public-files.d.ts +22 -0
- package/dist/server/nitro-public-files.js +39 -0
- package/dist/server/opentelemetry-api.d.ts +2 -1
- package/dist/server/operation-token.d.ts +2 -1
- package/dist/server/pages-api-route.d.ts +2 -1
- package/dist/server/pages-asset-tags.d.ts +7 -1
- package/dist/server/pages-asset-tags.js +9 -2
- package/dist/server/pages-body-parser-config.d.ts +2 -1
- package/dist/server/pages-client-assets.d.ts +8 -1
- package/dist/server/pages-data-route.d.ts +2 -1
- package/dist/server/pages-document-asset-props.d.ts +2 -1
- package/dist/server/pages-document-initial-props.d.ts +2 -1
- package/dist/server/pages-execution-tracing.d.ts +2 -1
- package/dist/server/pages-execution-tracing.js +1 -1
- package/dist/server/pages-get-initial-props.d.ts +2 -1
- package/dist/server/pages-i18n.d.ts +18 -0
- package/dist/server/pages-i18n.js +18 -2
- package/dist/server/pages-node-compat.d.ts +5 -3
- package/dist/server/pages-node-compat.js +35 -16
- package/dist/server/pages-page-data.d.ts +7 -1
- package/dist/server/pages-page-data.js +35 -12
- package/dist/server/pages-page-handler.d.ts +3 -2
- package/dist/server/pages-page-handler.js +16 -7
- package/dist/server/pages-page-method.d.ts +2 -1
- package/dist/server/pages-page-response.d.ts +2 -1
- package/dist/server/pages-preview.d.ts +2 -1
- package/dist/server/pages-readiness.d.ts +2 -1
- package/dist/server/pages-request-pipeline.d.ts +8 -2
- package/dist/server/pages-request-pipeline.js +35 -40
- package/dist/server/pages-request-stage-entry.d.ts +2 -1
- package/dist/server/pages-request-stage-entry.js +16 -6
- package/dist/server/pages-response-stage-entry.d.ts +2 -1
- package/dist/server/pages-response-stage-entry.js +1 -1
- package/dist/server/pages-revalidate.js +1 -0
- package/dist/server/pages-route-data-kind.d.ts +2 -1
- package/dist/server/pages-router-entry.js +1 -1
- package/dist/server/prerender-cache-life-header.d.ts +2 -1
- package/dist/server/prerender-route-params.d.ts +2 -1
- package/dist/server/prod-server.d.ts +2 -2
- package/dist/server/prod-server.js +80 -36
- package/dist/server/proxy-trust.d.ts +6 -0
- package/dist/server/proxy-trust.js +12 -6
- package/dist/server/request-log.d.ts +2 -1
- package/dist/server/request-pipeline.d.ts +5 -0
- package/dist/server/request-pipeline.js +12 -1
- package/dist/server/request-tracing.d.ts +2 -1
- package/dist/server/request-tracing.js +1 -1
- package/dist/server/response-start-tracing.js +7 -29
- package/dist/server/rsc-render-stream.d.ts +4 -0
- package/dist/server/rsc-render-stream.js +25 -0
- package/dist/server/seed-cache.d.ts +2 -1
- package/dist/server/seed-cache.js +1 -1
- package/dist/server/server-reference-loader.js +10 -1
- package/dist/server/static-file-cache.d.ts +2 -1
- package/dist/server/static-file-cache.js +16 -3
- package/dist/server/static-layout-client-reuse-proof.d.ts +2 -1
- package/dist/server/worker-revalidation-context.d.ts +2 -1
- package/dist/server/worker-stages.d.ts +2 -1
- package/dist/server/worker-utils.js +1 -1
- package/dist/shims/app.d.ts +2 -1
- package/dist/shims/cache-callable-runtime.d.ts +2 -1
- package/dist/shims/cache-handler.d.ts +8 -3
- package/dist/shims/cache-handler.js +32 -11
- package/dist/shims/cache-request-state.d.ts +40 -3
- package/dist/shims/cache-request-state.js +70 -5
- package/dist/shims/cache-runtime.js +47 -19
- package/dist/shims/cache.d.ts +2 -2
- package/dist/shims/cache.js +17 -8
- package/dist/shims/caught-not-found-boundaries.d.ts +15 -0
- package/dist/shims/caught-not-found-boundaries.js +48 -0
- package/dist/shims/cdn-purge-routes.d.ts +25 -0
- package/dist/shims/cdn-purge-routes.js +77 -0
- package/dist/shims/client-locale.js +2 -1
- package/dist/shims/client-page-root.d.ts +2 -1
- package/dist/shims/config.d.ts +2 -1
- package/dist/shims/default-forbidden.d.ts +4 -0
- package/dist/shims/default-forbidden.js +18 -0
- package/dist/shims/default-not-found.d.ts +0 -5
- package/dist/shims/default-not-found.js +5 -41
- package/dist/shims/default-unauthorized.d.ts +4 -0
- package/dist/shims/default-unauthorized.js +18 -0
- package/dist/shims/dynamic.js +17 -4
- package/dist/shims/error-boundary.d.ts +39 -3
- package/dist/shims/error-boundary.js +31 -16
- package/dist/shims/font-google.js +1 -2
- package/dist/shims/font-utils.d.ts +3 -2
- package/dist/shims/font-utils.js +5 -3
- package/dist/shims/form.js +9 -4
- package/dist/shims/http-access-error-fallback.d.ts +7 -0
- package/dist/shims/http-access-error-fallback.js +47 -0
- package/dist/shims/image-props.d.ts +93 -0
- package/dist/shims/image-props.js +323 -0
- package/dist/shims/image.d.ts +4 -39
- package/dist/shims/image.js +4 -319
- package/dist/shims/internal/app-prefetch-fetch-queue.d.ts +22 -2
- package/dist/shims/internal/app-prefetch-fetch-queue.js +71 -18
- package/dist/shims/internal/app-route-prefetch-policy.d.ts +14 -3
- package/dist/shims/internal/app-route-prefetch-policy.js +29 -4
- package/dist/shims/internal/cache-context-accessor.d.ts +2 -1
- package/dist/shims/internal/client-reference-loader.d.ts +7 -0
- package/dist/shims/internal/client-reference-loader.js +91 -0
- package/dist/shims/internal/cookie-serialize.d.ts +2 -1
- package/dist/shims/internal/cookies.js +1 -2
- package/dist/shims/internal/headers-state.d.ts +9 -0
- package/dist/shims/internal/headers-state.js +19 -2
- package/dist/shims/internal/hybrid-client-route-owner-direct.d.ts +6 -2
- package/dist/shims/internal/hybrid-client-route-owner-direct.js +31 -14
- package/dist/shims/internal/hybrid-client-route-owner.js +8 -8
- package/dist/shims/internal/interpolate-as.d.ts +2 -1
- package/dist/shims/internal/pages-data-target.d.ts +2 -1
- package/dist/shims/internal/pages-data-url.d.ts +2 -1
- package/dist/shims/internal/thenable-well-known-properties.d.ts +2 -1
- package/dist/shims/link.js +198 -53
- package/dist/shims/metadata.d.ts +32 -11
- package/dist/shims/metadata.js +88 -26
- package/dist/shims/navigation-errors.d.ts +2 -1
- package/dist/shims/navigation.d.ts +23 -3
- package/dist/shims/navigation.js +91 -25
- package/dist/shims/og.js +35 -10
- package/dist/shims/pages-router-runtime.d.ts +2 -1
- package/dist/shims/ppr-fallback-shell.d.ts +2 -1
- package/dist/shims/request-context.d.ts +13 -0
- package/dist/shims/router.js +33 -43
- package/dist/shims/server.d.ts +31 -4
- package/dist/shims/server.js +58 -10
- package/dist/shims/thenable-params.d.ts +6 -1
- package/dist/shims/thenable-params.js +11 -2
- package/dist/shims/unified-request-context.d.ts +5 -0
- package/dist/shims/unified-request-context.js +5 -3
- package/dist/typegen.d.ts +2 -1
- package/dist/utils/asset-prefix.d.ts +7 -0
- package/dist/utils/asset-prefix.js +10 -1
- package/dist/utils/client-build-manifest.d.ts +4 -1
- package/dist/utils/client-build-manifest.js +20 -6
- package/dist/utils/client-entry-manifest.d.ts +13 -0
- package/dist/utils/client-entry-manifest.js +20 -1
- package/dist/utils/client-reference-chunks.d.ts +45 -0
- package/dist/utils/client-reference-chunks.js +30 -0
- package/dist/utils/client-runtime-metadata.d.ts +10 -1
- package/dist/utils/client-runtime-metadata.js +53 -9
- package/dist/utils/compare.d.ts +9 -0
- package/dist/utils/compare.js +15 -1
- package/dist/utils/lazy-chunks.d.ts +18 -0
- package/dist/utils/lazy-chunks.js +27 -1
- package/dist/utils/manifest-paths.d.ts +14 -0
- package/dist/utils/manifest-paths.js +22 -1
- package/dist/utils/middleware-request-headers.d.ts +2 -1
- package/dist/utils/path-to-regexp.d.ts +21 -0
- package/dist/{server/middleware-path-to-regexp.js → utils/path-to-regexp.js} +14 -11
- package/dist/utils/plugin-react-version.d.ts +15 -0
- package/dist/utils/plugin-react-version.js +64 -0
- package/dist/utils/project.d.ts +2 -1
- package/dist/utils/project.js +9 -1
- package/dist/utils/public-routes.d.ts +2 -0
- package/dist/utils/public-routes.js +18 -7
- package/dist/utils/query.d.ts +2 -1
- package/dist/utils/sorted-array.d.ts +2 -1
- package/dist/utils/vite-cli-invocation.d.ts +2 -1
- package/package.json +5 -5
- package/dist/deps/.pnpm/image-size@2.0.2/deps/image-size/dist/index.js +0 -808
- package/dist/server/default-not-found-module.d.ts +0 -19
- package/dist/server/default-not-found-module.js +0 -18
- package/dist/server/middleware-path-to-regexp.d.ts +0 -13
- package/dist/server/rsc-stream-hints.d.ts +0 -21
- package/dist/server/rsc-stream-hints.js +0 -227
- package/dist/utils/regex-safety.d.ts +0 -17
- package/dist/utils/regex-safety.js +0 -789
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { getOrCreateAls } from "../shims/internal/als-registry.js";
|
|
2
|
+
import { escapeHtmlAttr } from "./html.js";
|
|
3
|
+
import * as ReactDOM from "react-dom";
|
|
4
|
+
import { setOnClientReference } from "@vitejs/plugin-rsc/ssr";
|
|
5
|
+
//#region src/server/app-streamed-client-references.ts
|
|
6
|
+
/**
|
|
7
|
+
* Stream the client references an SSR render may show before they load, and
|
|
8
|
+
* link every client reference's scripts with the render's CSP nonce and the
|
|
9
|
+
* configured crossOrigin, and its stylesheets with the configured crossOrigin.
|
|
10
|
+
*
|
|
11
|
+
* A render waits for its route's client references before it starts, except
|
|
12
|
+
* those whose modules evaluate asynchronously (top-level await). Like Next.js,
|
|
13
|
+
* it streams those: React suspends on one until it loads, showing the nearest
|
|
14
|
+
* Suspense fallback first.
|
|
15
|
+
*
|
|
16
|
+
* plugin-rsc links a client module's stylesheets as the render reads its
|
|
17
|
+
* exports, so a streamed module would link them wherever it rendered once
|
|
18
|
+
* loaded, which depends on how long it took. Instead, a render links a
|
|
19
|
+
* streamed reference's stylesheets in the route's import order, as Next.js's
|
|
20
|
+
* Turbopack build does: just before the first reference after it links its
|
|
21
|
+
* own, or after the shell's stylesheets when none does. Its scripts link as the
|
|
22
|
+
* Flight stream names it.
|
|
23
|
+
*
|
|
24
|
+
* plugin-rsc hints a client module's scripts without the render's nonce, which
|
|
25
|
+
* a nonce-based CSP blocks, and always as anonymous, so under
|
|
26
|
+
* `crossOrigin: "use-credentials"` the browser fetches the module the page
|
|
27
|
+
* then imports without credentials. React keeps the first hint for each
|
|
28
|
+
* script, so a render with either hints them first, with both, as Next.js does.
|
|
29
|
+
* plugin-rsc also links its stylesheets as anonymous whatever the config, so a
|
|
30
|
+
* render links them first with the configured crossOrigin too. Unlike Next.js,
|
|
31
|
+
* it links them as anonymous when that's unset: Vite's preload helper always
|
|
32
|
+
* links a lazily imported module's stylesheets as anonymous, and a later page
|
|
33
|
+
* doing so would fail the CORS check on the no-cors copy the browser cached.
|
|
34
|
+
*/
|
|
35
|
+
const WRAPPED = Symbol.for("vinext.streamedClientReferences.wrapped");
|
|
36
|
+
const STYLESHEET_PRECEDENCE = "vite-rsc/client-reference";
|
|
37
|
+
const referenceDeps = /* @__PURE__ */ new Map();
|
|
38
|
+
const renderStorage = getOrCreateAls("vinext.streamedClientReferences");
|
|
39
|
+
function hintsScripts(render) {
|
|
40
|
+
return !!render.nonce || render.crossOrigin === "use-credentials";
|
|
41
|
+
}
|
|
42
|
+
function linkScripts(deps, render) {
|
|
43
|
+
const options = {
|
|
44
|
+
as: "script",
|
|
45
|
+
crossOrigin: render.crossOrigin,
|
|
46
|
+
fetchPriority: "low",
|
|
47
|
+
nonce: render.nonce
|
|
48
|
+
};
|
|
49
|
+
for (const href of deps.js) ReactDOM.preloadModule(href, options);
|
|
50
|
+
}
|
|
51
|
+
function linkStylesheets(hrefs, render) {
|
|
52
|
+
const options = {
|
|
53
|
+
as: "style",
|
|
54
|
+
crossOrigin: render.crossOrigin,
|
|
55
|
+
precedence: STYLESHEET_PRECEDENCE
|
|
56
|
+
};
|
|
57
|
+
for (const href of hrefs) ReactDOM.preinit(href, options);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Before reference `id` links its stylesheets, link those of the streamed
|
|
61
|
+
* references that come before it in import order.
|
|
62
|
+
*/
|
|
63
|
+
function linkStreamedStylesheetsBefore(render, id) {
|
|
64
|
+
const position = render.positions.get(id);
|
|
65
|
+
if (position === void 0) return;
|
|
66
|
+
while (render.unlinked.length > 0 && render.positions.get(render.unlinked[0]) < position) {
|
|
67
|
+
const hrefs = referenceDeps.get(render.unlinked.shift())?.css ?? [];
|
|
68
|
+
for (const href of hrefs) render.linkedStylesheets.add(href);
|
|
69
|
+
linkStylesheets(hrefs, render);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Wrap plugin-rsc's client-reference loader before any client reference
|
|
74
|
+
* loads; a production build calls this as its SSR entry starts. `asyncIds` are
|
|
75
|
+
* the references any route may stream, and `getLoader` returns a reference's
|
|
76
|
+
* own loader from the client-references module.
|
|
77
|
+
*/
|
|
78
|
+
function wrapClientReferenceRequire(asyncIds, getLoader) {
|
|
79
|
+
const load = globalThis.__vite_rsc_client_require__;
|
|
80
|
+
if (typeof load !== "function" || WRAPPED in load) return;
|
|
81
|
+
setOnClientReference(({ id, deps }) => {
|
|
82
|
+
referenceDeps.set(id, deps);
|
|
83
|
+
const render = renderStorage.getStore();
|
|
84
|
+
if (render && !render.streamed.has(id)) for (const href of deps.css) render.linkedStylesheets.add(href);
|
|
85
|
+
});
|
|
86
|
+
const loads = /* @__PURE__ */ new Map();
|
|
87
|
+
const wrapped = (id) => {
|
|
88
|
+
const render = renderStorage.getStore();
|
|
89
|
+
if (render?.streamed.has(id)) {
|
|
90
|
+
const deps = referenceDeps.get(id);
|
|
91
|
+
if (deps) linkScripts(deps, render);
|
|
92
|
+
}
|
|
93
|
+
let loading = loads.get(id);
|
|
94
|
+
if (!loading) {
|
|
95
|
+
const loader = asyncIds.has(id) ? getLoader(id) : void 0;
|
|
96
|
+
loading = Promise.all([load(id), loader?.()]).then(([mod, exports]) => new Proxy(mod, { get(target, key, receiver) {
|
|
97
|
+
const render = renderStorage.getStore();
|
|
98
|
+
if (render) {
|
|
99
|
+
if (exports !== void 0 && render.streamed.has(id)) return Reflect.get(exports, key);
|
|
100
|
+
linkStreamedStylesheetsBefore(render, id);
|
|
101
|
+
const deps = referenceDeps.get(id);
|
|
102
|
+
if (deps && key in target) {
|
|
103
|
+
linkStylesheets(deps.css, render);
|
|
104
|
+
if (hintsScripts(render)) linkScripts(deps, render);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return Reflect.get(target, key, receiver);
|
|
108
|
+
} }));
|
|
109
|
+
loads.set(id, loading);
|
|
110
|
+
}
|
|
111
|
+
return loading;
|
|
112
|
+
};
|
|
113
|
+
Object.defineProperty(wrapped, WRAPPED, { value: true });
|
|
114
|
+
globalThis.__vite_rsc_client_require__ = wrapped;
|
|
115
|
+
}
|
|
116
|
+
function createStreamedClientReferences(route, nonce, crossOrigin) {
|
|
117
|
+
const streamed = new Set(route?.streamed);
|
|
118
|
+
return {
|
|
119
|
+
nonce,
|
|
120
|
+
crossOrigin,
|
|
121
|
+
streamed,
|
|
122
|
+
positions: new Map(route?.references.map((id, index) => [id, index])),
|
|
123
|
+
unlinked: route?.references.filter((id) => streamed.has(id)) ?? [],
|
|
124
|
+
linkedStylesheets: /* @__PURE__ */ new Set()
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Forget the stylesheets a discarded render linked, so the render that
|
|
129
|
+
* replaces it links them again.
|
|
130
|
+
*/
|
|
131
|
+
function resetStreamedClientReferences(render, route) {
|
|
132
|
+
if (!render) return;
|
|
133
|
+
render.unlinked = route?.references.filter((id) => render.streamed.has(id)) ?? [];
|
|
134
|
+
render.linkedStylesheets.clear();
|
|
135
|
+
}
|
|
136
|
+
/** Run a render, and the Flight stream it reads, with its streamed references. */
|
|
137
|
+
function runWithStreamedClientReferences(render, fn) {
|
|
138
|
+
return renderStorage.run(render, fn);
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* The `<head>` links of the streamed stylesheets a render's shell left
|
|
142
|
+
* unlinked, those of streamed references after every reference it rendered.
|
|
143
|
+
*/
|
|
144
|
+
function renderStreamedStylesheets(render) {
|
|
145
|
+
const hrefs = /* @__PURE__ */ new Set();
|
|
146
|
+
for (const id of render.unlinked.splice(0)) for (const href of referenceDeps.get(id)?.css ?? []) if (!render.linkedStylesheets.has(href)) hrefs.add(href);
|
|
147
|
+
const crossOrigin = render.crossOrigin === "use-credentials" ? "use-credentials" : "";
|
|
148
|
+
let html = "";
|
|
149
|
+
for (const href of hrefs) {
|
|
150
|
+
render.linkedStylesheets.add(href);
|
|
151
|
+
html += `<link rel="stylesheet" href="${escapeHtmlAttr(href)}" data-precedence="${STYLESHEET_PRECEDENCE}" crossorigin="${crossOrigin}"/>`;
|
|
152
|
+
}
|
|
153
|
+
return html;
|
|
154
|
+
}
|
|
155
|
+
//#endregion
|
|
156
|
+
export { createStreamedClientReferences, renderStreamedStylesheets, resetStreamedClientReferences, runWithStreamedClientReferences, wrapClientReferenceRequire };
|
|
@@ -35,4 +35,5 @@ export declare function findVisitedResponseCacheEntry(cache: Map<string, Visited
|
|
|
35
35
|
export declare function deleteVisitedResponseCacheEntry(cache: Map<string, VisitedResponseCacheEntry>, rscUrl: string, interceptionContext: string | null): boolean;
|
|
36
36
|
export declare function deleteAllVisitedResponseCacheEntries(cache: Map<string, VisitedResponseCacheEntry>, rscUrl: string, interceptionContext: string | null): number;
|
|
37
37
|
export declare function deleteInvalidatedHistoryRestoreEntries(cache: Map<string, VisitedResponseCacheEntry>): void;
|
|
38
|
-
//#endregion
|
|
38
|
+
//#endregion
|
|
39
|
+
export {};
|
|
@@ -114,4 +114,5 @@ export declare function withoutAppPageDispatchQuery(requestUrl: string, props: A
|
|
|
114
114
|
*/
|
|
115
115
|
export declare function isStaticCandidateAppPageDispatch(projection: CacheabilityManifest, request: Request, props: AppMatchedWorkerResponseStageProps): boolean;
|
|
116
116
|
export declare function isAppWorkerResponseStageProps(value: unknown): value is AppWorkerResponseStageProps;
|
|
117
|
-
//#endregion
|
|
117
|
+
//#endregion
|
|
118
|
+
export {};
|
|
@@ -50,4 +50,5 @@ export declare function createArtifactCompatibilityEnvelope(input?: ArtifactComp
|
|
|
50
50
|
export declare function createArtifactCompatibilityGraphVersion(input: ArtifactCompatibilityGraphVersionInput): string;
|
|
51
51
|
export declare function parseArtifactCompatibilityEnvelope(value: unknown): ArtifactCompatibilityEnvelope | null;
|
|
52
52
|
export declare function evaluateArtifactCompatibility(current: ArtifactCompatibilityEnvelope, candidate: ArtifactCompatibilityEnvelope, options?: ArtifactCompatibilityEvaluationOptions): ArtifactCompatibilityDecision;
|
|
53
|
-
//#endregion
|
|
53
|
+
//#endregion
|
|
54
|
+
export {};
|
|
@@ -2,4 +2,5 @@
|
|
|
2
2
|
type VinextCacheState = "HIT" | "MISS" | "STALE" | "STATIC";
|
|
3
3
|
export declare function setCacheStateHeaders(headers: Headers, cacheState: VinextCacheState): void;
|
|
4
4
|
export declare function buildCacheStateHeaders(cacheState: VinextCacheState): Record<string, string>;
|
|
5
|
-
//#endregion
|
|
5
|
+
//#endregion
|
|
6
|
+
export {};
|
|
@@ -46,4 +46,5 @@ export type CacheabilityAdmissionCaptureBudget = {
|
|
|
46
46
|
export declare function createCacheabilityAdmissionCaptureBudget(maxBytes: number): CacheabilityAdmissionCaptureBudget;
|
|
47
47
|
export declare function captureCacheabilityAdmissionBody(body: ReadableStream<Uint8Array> | null, deadlineAt: number, limit?: number, budget?: CacheabilityAdmissionCaptureBudget): Promise<CapturedAdmissionBody>;
|
|
48
48
|
export declare function finalizeWorkerCacheabilityResponse(response: Response, ctx: ExecutionContextLike): Promise<Response>;
|
|
49
|
-
//#endregion
|
|
49
|
+
//#endregion
|
|
50
|
+
export {};
|
|
@@ -99,4 +99,5 @@ export declare function createClientReusePayloadHash(input: string): string;
|
|
|
99
99
|
export declare function createClientReuseManifest(input: CreateClientReuseManifestInput): ClientReuseManifestWire;
|
|
100
100
|
export declare function serializeClientReuseManifest(input: CreateClientReuseManifestInput): string;
|
|
101
101
|
export declare function parseClientReuseManifestHeader(rawHeader: string | null | undefined, options?: ParseClientReuseManifestOptions): ClientReuseManifestParseResult;
|
|
102
|
-
//#endregion
|
|
102
|
+
//#endregion
|
|
103
|
+
export {};
|
|
@@ -39,4 +39,5 @@ type ApplyConfigHeadersOptions = {
|
|
|
39
39
|
export declare function applyConfigHeadersToResponse(responseHeaders: Headers, options: ApplyConfigHeadersOptions): void;
|
|
40
40
|
/** Apply matched next.config.js headers to an early response header record. */
|
|
41
41
|
export declare function applyConfigHeadersToHeaderRecord(headers: HeaderRecord, options: ApplyConfigHeadersOptions): void;
|
|
42
|
-
//#endregion
|
|
42
|
+
//#endregion
|
|
43
|
+
export {};
|
|
@@ -76,10 +76,12 @@ function appendVaryHeaderRecord(headers, value) {
|
|
|
76
76
|
function applyConfigHeadersToResponse(responseHeaders, options) {
|
|
77
77
|
const matched = retainLastSingularConfigValues(matchHeaders(options.pathname, options.configHeaders, options.requestContext, options.basePathState, options.recordCacheability === false ? void 0 : markConditionalConfigHeaderCacheability));
|
|
78
78
|
if (options.recordCacheability !== false) markExplicitConfigResponseVeto(matched);
|
|
79
|
+
const configCookies = [];
|
|
79
80
|
for (const header of matched) {
|
|
80
81
|
const lowerName = header.key.toLowerCase();
|
|
81
82
|
if (lowerName === "x-vinext-special-error-status") continue;
|
|
82
|
-
if (lowerName === "
|
|
83
|
+
if (lowerName === "set-cookie") configCookies.push(header.value);
|
|
84
|
+
else if (lowerName === "link") {
|
|
83
85
|
if (options.middlewareHeaders?.get(lowerName)) continue;
|
|
84
86
|
const postConfigLink = options.appendToPostConfigLink ? responseHeaders.get(lowerName) : null;
|
|
85
87
|
responseHeaders.set(header.key, postConfigLink ? `${header.value}, ${postConfigLink}` : header.value);
|
|
@@ -88,15 +90,22 @@ function applyConfigHeadersToResponse(responseHeaders, options) {
|
|
|
88
90
|
else if (ADDITIVE_CONFIG_HEADER_NAMES.has(lowerName)) responseHeaders.append(header.key, header.value);
|
|
89
91
|
else if ((typeof options.overwriteExisting === "function" ? options.overwriteExisting(lowerName) : options.overwriteExisting?.has(lowerName)) || !responseHeaders.has(lowerName)) responseHeaders.set(header.key, header.value);
|
|
90
92
|
}
|
|
93
|
+
if (configCookies.length > 0 && !options.middlewareHeaders?.get("set-cookie")) {
|
|
94
|
+
const responseCookies = responseHeaders.getSetCookie();
|
|
95
|
+
responseHeaders.delete("set-cookie");
|
|
96
|
+
for (const cookie of [...configCookies, ...responseCookies]) responseHeaders.append("set-cookie", cookie);
|
|
97
|
+
}
|
|
91
98
|
}
|
|
92
99
|
/** Apply matched next.config.js headers to an early response header record. */
|
|
93
100
|
function applyConfigHeadersToHeaderRecord(headers, options) {
|
|
94
101
|
const matched = retainLastSingularConfigValues(matchHeaders(options.pathname, options.configHeaders, options.requestContext, options.basePathState, options.recordCacheability === false ? void 0 : markConditionalConfigHeaderCacheability));
|
|
95
102
|
if (options.recordCacheability !== false) markExplicitConfigResponseVeto(matched);
|
|
103
|
+
const middlewareSetsCookie = Boolean(options.middlewareHeaders?.get("set-cookie")) || findHeaderRecordKey(headers, "set-cookie") !== void 0;
|
|
96
104
|
for (const header of matched) {
|
|
97
105
|
const lowerName = header.key.toLowerCase();
|
|
98
|
-
if (lowerName === "set-cookie")
|
|
99
|
-
|
|
106
|
+
if (lowerName === "set-cookie") {
|
|
107
|
+
if (!middlewareSetsCookie) appendHeaderRecord(headers, lowerName, header.value);
|
|
108
|
+
} else if (lowerName === "vary") appendVaryHeaderRecord(headers, header.value);
|
|
100
109
|
else if (findHeaderRecordKey(headers, lowerName) === void 0) headers[lowerName] = header.value;
|
|
101
110
|
}
|
|
102
111
|
}
|
package/dist/server/csp.d.ts
CHANGED
|
@@ -5,4 +5,5 @@ export declare function getScriptNonceFromHeader(cspHeaderValue: string): string
|
|
|
5
5
|
export declare function getScriptNonceFromHeaders(headers: Headers | null | undefined): string | undefined;
|
|
6
6
|
export declare function getScriptNonceFromNodeHeaderSources(...headersList: readonly (NodeHeaders | null | undefined)[]): string | undefined;
|
|
7
7
|
export declare function getScriptNonceFromHeaderSources(...headersList: readonly (Headers | null | undefined)[]): string | undefined;
|
|
8
|
-
//#endregion
|
|
8
|
+
//#endregion
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import DefaultForbidden from "../shims/default-forbidden.js";
|
|
2
|
+
import DefaultNotFound from "../shims/default-not-found.js";
|
|
3
|
+
import DefaultUnauthorized from "../shims/default-unauthorized.js";
|
|
4
|
+
//#region src/server/default-http-access-fallback-modules.d.ts
|
|
5
|
+
/**
|
|
6
|
+
* Module-shaped wrappers around vinext's built-in not-found, forbidden and
|
|
7
|
+
* unauthorized components. Used as the fallback when an app does not define
|
|
8
|
+
* its own `app/not-found.tsx` (and has not opted into
|
|
9
|
+
* `app/global-not-found.tsx`), `app/forbidden.tsx` or `app/unauthorized.tsx`.
|
|
10
|
+
* The runtime treats any `{ default: Component }` record as a boundary
|
|
11
|
+
* module, so wrapping the components this way lets us thread the defaults
|
|
12
|
+
* through the existing boundary plumbing without introducing a parallel code
|
|
13
|
+
* path.
|
|
14
|
+
*
|
|
15
|
+
* Mirrors Next.js's `builtin/not-found.js`, `builtin/forbidden.js` and
|
|
16
|
+
* `builtin/unauthorized.js`, which the app loader selects for the root
|
|
17
|
+
* segment when the user has not supplied the file:
|
|
18
|
+
* https://github.com/vercel/next.js/blob/canary/packages/next/src/build/webpack/loaders/next-app-loader/index.ts
|
|
19
|
+
* https://github.com/vercel/next.js/blob/canary/crates/next-core/src/app_structure.rs
|
|
20
|
+
*/
|
|
21
|
+
export declare const DEFAULT_NOT_FOUND_MODULE: {
|
|
22
|
+
readonly default: typeof DefaultNotFound;
|
|
23
|
+
};
|
|
24
|
+
export declare const DEFAULT_FORBIDDEN_MODULE: {
|
|
25
|
+
readonly default: typeof DefaultForbidden;
|
|
26
|
+
};
|
|
27
|
+
export declare const DEFAULT_UNAUTHORIZED_MODULE: {
|
|
28
|
+
readonly default: typeof DefaultUnauthorized;
|
|
29
|
+
};
|
|
30
|
+
export declare function getDefaultHttpAccessFallbackModule(statusCode: number): {
|
|
31
|
+
readonly default: typeof DefaultNotFound;
|
|
32
|
+
} | null;
|
|
33
|
+
//#endregion
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import DefaultForbidden from "../shims/default-forbidden.js";
|
|
2
|
+
import DefaultNotFound from "../shims/default-not-found.js";
|
|
3
|
+
import DefaultUnauthorized from "../shims/default-unauthorized.js";
|
|
4
|
+
//#region src/server/default-http-access-fallback-modules.ts
|
|
5
|
+
/**
|
|
6
|
+
* Module-shaped wrappers around vinext's built-in not-found, forbidden and
|
|
7
|
+
* unauthorized components. Used as the fallback when an app does not define
|
|
8
|
+
* its own `app/not-found.tsx` (and has not opted into
|
|
9
|
+
* `app/global-not-found.tsx`), `app/forbidden.tsx` or `app/unauthorized.tsx`.
|
|
10
|
+
* The runtime treats any `{ default: Component }` record as a boundary
|
|
11
|
+
* module, so wrapping the components this way lets us thread the defaults
|
|
12
|
+
* through the existing boundary plumbing without introducing a parallel code
|
|
13
|
+
* path.
|
|
14
|
+
*
|
|
15
|
+
* Mirrors Next.js's `builtin/not-found.js`, `builtin/forbidden.js` and
|
|
16
|
+
* `builtin/unauthorized.js`, which the app loader selects for the root
|
|
17
|
+
* segment when the user has not supplied the file:
|
|
18
|
+
* https://github.com/vercel/next.js/blob/canary/packages/next/src/build/webpack/loaders/next-app-loader/index.ts
|
|
19
|
+
* https://github.com/vercel/next.js/blob/canary/crates/next-core/src/app_structure.rs
|
|
20
|
+
*/
|
|
21
|
+
const DEFAULT_NOT_FOUND_MODULE = { default: DefaultNotFound };
|
|
22
|
+
const DEFAULT_FORBIDDEN_MODULE = { default: DefaultForbidden };
|
|
23
|
+
const DEFAULT_UNAUTHORIZED_MODULE = { default: DefaultUnauthorized };
|
|
24
|
+
function getDefaultHttpAccessFallbackModule(statusCode) {
|
|
25
|
+
if (statusCode === 404) return DEFAULT_NOT_FOUND_MODULE;
|
|
26
|
+
if (statusCode === 403) return DEFAULT_FORBIDDEN_MODULE;
|
|
27
|
+
if (statusCode === 401) return DEFAULT_UNAUTHORIZED_MODULE;
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
//#endregion
|
|
31
|
+
export { DEFAULT_FORBIDDEN_MODULE, DEFAULT_NOT_FOUND_MODULE, DEFAULT_UNAUTHORIZED_MODULE, getDefaultHttpAccessFallbackModule };
|
|
@@ -1,7 +1,41 @@
|
|
|
1
1
|
//#region src/server/defer-until-stream-consumed.d.ts
|
|
2
|
+
export type StreamConsumptionCallbacks = {
|
|
3
|
+
/** Runs once when the consumer reads the first chunk. */
|
|
4
|
+
onStart?: () => void;
|
|
5
|
+
/** Runs once when the stream ends, errors or is cancelled. */
|
|
6
|
+
onFlush?: () => void;
|
|
7
|
+
onError?: (error: unknown) => void;
|
|
8
|
+
onCancel?: (reason: unknown) => void;
|
|
9
|
+
};
|
|
2
10
|
/**
|
|
3
11
|
* Defers cleanup until the downstream consumer drains or cancels the stream.
|
|
4
12
|
* `onCancel` runs before the cancellation reaches the source stream.
|
|
5
13
|
*/
|
|
6
14
|
export declare function deferUntilStreamConsumed(stream: ReadableStream<Uint8Array>, onFlush: () => void, onError?: (error: unknown) => void, onCancel?: (reason: unknown) => void): ReadableStream<Uint8Array>;
|
|
15
|
+
/**
|
|
16
|
+
* Runs the callbacks as the downstream consumer reads the stream: `onStart`
|
|
17
|
+
* when it reads the first chunk, the others when the stream ends, errors or
|
|
18
|
+
* is cancelled.
|
|
19
|
+
*
|
|
20
|
+
* The wrapper reads the source directly instead of piping it through an
|
|
21
|
+
* identity `TransformStream`, and a wrapper that is wrapped again before
|
|
22
|
+
* anything reads it takes on the new callbacks instead of adding a layer.
|
|
23
|
+
* Every streamed response passes through several of these, and each layer
|
|
24
|
+
* cost a pipe, two more streams and their promise hops per chunk. Nothing is
|
|
25
|
+
* read ahead of the consumer, so an unread wrapper is still untouched.
|
|
26
|
+
*
|
|
27
|
+
* The callbacks run as separate layers would run them. Start, flush and error
|
|
28
|
+
* callbacks run innermost first, and a layer sees the error an inner layer's
|
|
29
|
+
* callback threw as its stream error, or the error its own flush callback
|
|
30
|
+
* threw. Cancel callbacks run outermost first. A layer whose error or cancel
|
|
31
|
+
* callback throws doesn't run its flush callback. When a start callback
|
|
32
|
+
* throws, that layer and the layers outside it see the error, and the layers
|
|
33
|
+
* inside it are cancelled with it. As with the pipe, each layer's callbacks
|
|
34
|
+
* run in the async context that added them, and the source is read and
|
|
35
|
+
* cancelled in the context of the first layer. Cleanup reads and clears
|
|
36
|
+
* request-scoped state, and spans the source starts while producing chunks
|
|
37
|
+
* need their request parent, but the consumer (the runtime sending the body)
|
|
38
|
+
* reads from outside that scope.
|
|
39
|
+
*/
|
|
40
|
+
export declare function observeStreamConsumption(stream: ReadableStream<Uint8Array>, callbacks: StreamConsumptionCallbacks): ReadableStream<Uint8Array>;
|
|
7
41
|
//#endregion
|
|
@@ -1,37 +1,170 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
1
2
|
//#region src/server/defer-until-stream-consumed.ts
|
|
3
|
+
const UNREAD_WRAPPERS_KEY = Symbol.for("vinext.deferUntilStreamConsumed.unreadWrappers");
|
|
4
|
+
const unreadWrappers = globalThis[UNREAD_WRAPPERS_KEY] ??= /* @__PURE__ */ new WeakMap();
|
|
2
5
|
/**
|
|
3
6
|
* Defers cleanup until the downstream consumer drains or cancels the stream.
|
|
4
7
|
* `onCancel` runs before the cancellation reaches the source stream.
|
|
5
8
|
*/
|
|
6
9
|
function deferUntilStreamConsumed(stream, onFlush, onError, onCancel) {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
10
|
+
return observeStreamConsumption(stream, {
|
|
11
|
+
onFlush,
|
|
12
|
+
onError,
|
|
13
|
+
onCancel
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Runs the callbacks as the downstream consumer reads the stream: `onStart`
|
|
18
|
+
* when it reads the first chunk, the others when the stream ends, errors or
|
|
19
|
+
* is cancelled.
|
|
20
|
+
*
|
|
21
|
+
* The wrapper reads the source directly instead of piping it through an
|
|
22
|
+
* identity `TransformStream`, and a wrapper that is wrapped again before
|
|
23
|
+
* anything reads it takes on the new callbacks instead of adding a layer.
|
|
24
|
+
* Every streamed response passes through several of these, and each layer
|
|
25
|
+
* cost a pipe, two more streams and their promise hops per chunk. Nothing is
|
|
26
|
+
* read ahead of the consumer, so an unread wrapper is still untouched.
|
|
27
|
+
*
|
|
28
|
+
* The callbacks run as separate layers would run them. Start, flush and error
|
|
29
|
+
* callbacks run innermost first, and a layer sees the error an inner layer's
|
|
30
|
+
* callback threw as its stream error, or the error its own flush callback
|
|
31
|
+
* threw. Cancel callbacks run outermost first. A layer whose error or cancel
|
|
32
|
+
* callback throws doesn't run its flush callback. When a start callback
|
|
33
|
+
* throws, that layer and the layers outside it see the error, and the layers
|
|
34
|
+
* inside it are cancelled with it. As with the pipe, each layer's callbacks
|
|
35
|
+
* run in the async context that added them, and the source is read and
|
|
36
|
+
* cancelled in the context of the first layer. Cleanup reads and clears
|
|
37
|
+
* request-scoped state, and spans the source starts while producing chunks
|
|
38
|
+
* need their request parent, but the consumer (the runtime sending the body)
|
|
39
|
+
* reads from outside that scope.
|
|
40
|
+
*/
|
|
41
|
+
function observeStreamConsumption(stream, callbacks) {
|
|
42
|
+
const layer = {
|
|
43
|
+
...callbacks,
|
|
44
|
+
runInCreationContext: AsyncLocalStorage.snapshot()
|
|
45
|
+
};
|
|
46
|
+
const unread = unreadWrappers.get(stream);
|
|
47
|
+
if (unread && !stream.locked) {
|
|
48
|
+
unread.push(layer);
|
|
49
|
+
return stream;
|
|
50
|
+
}
|
|
51
|
+
const layers = [layer];
|
|
52
|
+
let started = false;
|
|
53
|
+
let settled = false;
|
|
54
|
+
const finish = (sourceFailure, first = 0, end = layers.length) => {
|
|
55
|
+
let failure = sourceFailure;
|
|
56
|
+
for (const current of layers.slice(first, end)) current.runInCreationContext(() => {
|
|
57
|
+
const reportedError = failure !== void 0;
|
|
58
|
+
try {
|
|
59
|
+
if (failure) current.onError?.(failure.error);
|
|
60
|
+
} catch (error) {
|
|
61
|
+
failure = { error };
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
try {
|
|
65
|
+
current.onFlush?.();
|
|
66
|
+
} catch (error) {
|
|
67
|
+
failure = { error };
|
|
68
|
+
if (reportedError) return;
|
|
69
|
+
try {
|
|
70
|
+
current.onError?.(error);
|
|
71
|
+
} catch (callbackError) {
|
|
72
|
+
failure = { error: callbackError };
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
return failure;
|
|
77
|
+
};
|
|
78
|
+
const cancelLayers = (reason, end) => {
|
|
79
|
+
let failure;
|
|
80
|
+
for (const current of layers.slice(0, end).reverse()) current.runInCreationContext(() => {
|
|
81
|
+
try {
|
|
82
|
+
current.onCancel?.(reason);
|
|
83
|
+
} catch (error) {
|
|
84
|
+
failure ??= { error };
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
try {
|
|
88
|
+
current.onFlush?.();
|
|
89
|
+
} catch (error) {
|
|
90
|
+
failure ??= { error };
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
return failure;
|
|
94
|
+
};
|
|
95
|
+
const start = () => {
|
|
96
|
+
for (const [index, current] of layers.entries()) {
|
|
97
|
+
try {
|
|
98
|
+
current.runInCreationContext(() => current.onStart?.());
|
|
99
|
+
} catch (error) {
|
|
100
|
+
return {
|
|
101
|
+
error,
|
|
102
|
+
index
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
if (settled) return void 0;
|
|
12
106
|
}
|
|
13
107
|
};
|
|
14
|
-
const
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
108
|
+
const reader = stream.getReader();
|
|
109
|
+
const release = () => {
|
|
110
|
+
try {
|
|
111
|
+
reader.releaseLock();
|
|
112
|
+
} catch {}
|
|
113
|
+
};
|
|
114
|
+
const wrapped = new ReadableStream({
|
|
19
115
|
pull(controller) {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
116
|
+
unreadWrappers.delete(wrapped);
|
|
117
|
+
return layer.runInCreationContext(() => reader.read()).then(({ done, value }) => {
|
|
118
|
+
if (settled) return;
|
|
119
|
+
if (!done) {
|
|
120
|
+
if (!started) {
|
|
121
|
+
started = true;
|
|
122
|
+
const startFailure = start();
|
|
123
|
+
if (settled) return;
|
|
124
|
+
if (startFailure) {
|
|
125
|
+
settled = true;
|
|
126
|
+
const { error, index } = startFailure;
|
|
127
|
+
let failure = finish({ error }, index, index + 1);
|
|
128
|
+
cancelLayers(error, index);
|
|
129
|
+
layer.runInCreationContext(() => reader.cancel(error)).catch(() => {}).finally(release);
|
|
130
|
+
failure = finish(failure, index + 1);
|
|
131
|
+
controller.error(failure?.error);
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
controller.enqueue(value);
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
settled = true;
|
|
139
|
+
release();
|
|
140
|
+
const failure = finish(void 0);
|
|
141
|
+
if (failure) controller.error(failure.error);
|
|
142
|
+
else controller.close();
|
|
23
143
|
}, (error) => {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
144
|
+
if (settled) return;
|
|
145
|
+
settled = true;
|
|
146
|
+
release();
|
|
147
|
+
controller.error(finish({ error })?.error);
|
|
27
148
|
});
|
|
28
149
|
},
|
|
29
150
|
cancel(reason) {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
151
|
+
unreadWrappers.delete(wrapped);
|
|
152
|
+
let failure;
|
|
153
|
+
if (!settled) {
|
|
154
|
+
settled = true;
|
|
155
|
+
failure = cancelLayers(reason, layers.length);
|
|
156
|
+
}
|
|
157
|
+
const cancelled = layer.runInCreationContext(() => reader.cancel(reason)).finally(release);
|
|
158
|
+
if (!failure) return cancelled;
|
|
159
|
+
const { error } = failure;
|
|
160
|
+
const fail = () => {
|
|
161
|
+
throw error;
|
|
162
|
+
};
|
|
163
|
+
return cancelled.then(fail, fail);
|
|
33
164
|
}
|
|
34
|
-
});
|
|
165
|
+
}, { highWaterMark: 0 });
|
|
166
|
+
unreadWrappers.set(wrapped, layers);
|
|
167
|
+
return wrapped;
|
|
35
168
|
}
|
|
36
169
|
//#endregion
|
|
37
|
-
export { deferUntilStreamConsumed };
|
|
170
|
+
export { deferUntilStreamConsumed, observeStreamConsumption };
|
|
@@ -19,6 +19,9 @@
|
|
|
19
19
|
* (`process.kill(pid, 0)`), which is good enough for the dev-server
|
|
20
20
|
* "another server is running" use case. Race conditions on lock acquisition
|
|
21
21
|
* are tolerated: at worst, two dev servers race and one fails to bind a port.
|
|
22
|
+
* Unlike a `flock()`, the lock file survives a hard restart, so a lock
|
|
23
|
+
* written before the current boot is treated as stale whatever its PID: the
|
|
24
|
+
* PID may now belong to an unrelated process. See `predatesCurrentBoot()`.
|
|
22
25
|
* - Lock file lives in `<root>/.vinext/dev/lock.json` (mirroring Next.js'
|
|
23
26
|
* `.next/dev/lock` layout). `.vinext/` is already used by the fonts plugin
|
|
24
27
|
* to cache self-hosted Google Fonts, so this re-uses the same project-local
|
|
@@ -62,6 +65,31 @@ export declare function readLockfile(lockfilePath: string): DevServerInfo | unde
|
|
|
62
65
|
* signal it (in which case it's still running, just owned by someone else).
|
|
63
66
|
*/
|
|
64
67
|
export declare function isPidAlive(pid: number): boolean;
|
|
68
|
+
/**
|
|
69
|
+
* Returns true if a lock with the given `startedAt` was written before the
|
|
70
|
+
* machine last booted.
|
|
71
|
+
*
|
|
72
|
+
* Such a lock was left behind by a session whose exit handler never ran (a
|
|
73
|
+
* crash, a forced restart, power loss). PIDs are handed out again after a
|
|
74
|
+
* boot, so the lock's PID may be held by an unrelated process, and
|
|
75
|
+
* `isPidAlive()` alone would report the dead server as running.
|
|
76
|
+
*
|
|
77
|
+
* The boot time is derived from `Date.now() - os.uptime()`. Stepping the wall
|
|
78
|
+
* clock forward moves it too (`os.uptime()` doesn't change), so a forward
|
|
79
|
+
* step larger than the uptime at which a server started makes its lock look
|
|
80
|
+
* stale, e.g. a VM resuming after the host slept. The second `vinext dev`
|
|
81
|
+
* then takes over, as in the acquisition race tolerated below: Vite moves it
|
|
82
|
+
* to another port, or it fails to bind with `strictPort`.
|
|
83
|
+
*
|
|
84
|
+
* Known limitations, where a lock is still checked by PID alone:
|
|
85
|
+
* - A wall clock that comes back from a reboot behind the previous session
|
|
86
|
+
* (an RTC running slow, or NTP stepping it back) can leave the lock's
|
|
87
|
+
* `startedAt` after the derived boot time.
|
|
88
|
+
* - Windows Fast Startup shuts down by hibernating the kernel, so
|
|
89
|
+
* `os.uptime()` keeps counting across that shutdown.
|
|
90
|
+
* - A container restart doesn't reset the host's uptime.
|
|
91
|
+
*/
|
|
92
|
+
export declare function predatesCurrentBoot(startedAt: number): boolean;
|
|
65
93
|
type FormatErrorOptions = {
|
|
66
94
|
/** Existing server info from the lock file, if readable. */
|
|
67
95
|
existing: DevServerInfo | undefined;
|
|
@@ -87,7 +115,8 @@ type AcquireOptions = {
|
|
|
87
115
|
/** Initial server info to write. Port/URL may be updated later via `update()`. */
|
|
88
116
|
info: DevServerInfo;
|
|
89
117
|
/**
|
|
90
|
-
* If a lock file exists but its PID is dead,
|
|
118
|
+
* If a lock file exists but is stale (its PID is dead, or it was written
|
|
119
|
+
* before the current boot), take over instead of failing.
|
|
91
120
|
* Defaults to `true`. Set to `false` for testing.
|
|
92
121
|
*/
|
|
93
122
|
takeOverStale?: boolean;
|
|
@@ -117,4 +146,5 @@ type AcquireResult = AcquireSuccess | AcquireFailure;
|
|
|
117
146
|
* already holds the lock.
|
|
118
147
|
*/
|
|
119
148
|
export declare function tryAcquireLockfile(opts: AcquireOptions): AcquireResult;
|
|
120
|
-
//#endregion
|
|
149
|
+
//#endregion
|
|
150
|
+
export {};
|