@wular/pnext 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +153 -0
- package/bin/pnext +67 -0
- package/config/lint/base.js +48 -0
- package/config/ts/base.json +26 -0
- package/config/ts/react.json +13 -0
- package/package.json +70 -0
- package/reference/compat.md +63 -0
- package/reference/config.md +120 -0
- package/reference/css.md +58 -0
- package/reference/dev.md +69 -0
- package/reference/env.md +40 -0
- package/reference/metadata.md +86 -0
- package/reference/navigation.md +149 -0
- package/reference/overview.md +35 -0
- package/reference/performance.md +97 -0
- package/reference/rendering.md +127 -0
- package/reference/routing.md +167 -0
- package/reference/typegen.md +64 -0
- package/src/api/cache.ts +80 -0
- package/src/api/client-cache.ts +9 -0
- package/src/api/client-navigation.ts +279 -0
- package/src/api/dynamic.tsx +102 -0
- package/src/api/link.tsx +119 -0
- package/src/api/navigation.ts +198 -0
- package/src/api/router/events.ts +53 -0
- package/src/api/router/history.ts +70 -0
- package/src/api/router/hub.ts +194 -0
- package/src/api/router/policies.ts +107 -0
- package/src/api/router/runtime.ts +5238 -0
- package/src/api/router/types.ts +299 -0
- package/src/api/router.ts +167 -0
- package/src/api/server.ts +323 -0
- package/src/api/suspense.ts +16 -0
- package/src/cache/context.ts +61 -0
- package/src/cli/adapters/vercel-warm.ts +375 -0
- package/src/cli/adapters/vercel.ts +1310 -0
- package/src/cli/analyze-print.ts +181 -0
- package/src/cli/analyze.ts +328 -0
- package/src/cli/boot-trace.ts +29 -0
- package/src/cli/build.ts +3114 -0
- package/src/cli/dev.ts +276 -0
- package/src/cli/index.ts +196 -0
- package/src/cli/named-bin.ts +119 -0
- package/src/cli/serve-ui.ts +160 -0
- package/src/cli/start.ts +1425 -0
- package/src/client/build.ts +2136 -0
- package/src/client/chunk-fold.ts +526 -0
- package/src/client/entry.ts +1525 -0
- package/src/client/paths.ts +22 -0
- package/src/client/prebuilt.ts +621 -0
- package/src/client/profile.ts +75 -0
- package/src/client/react-compiler.ts +94 -0
- package/src/client/reference-stub.ts +145 -0
- package/src/client/reference.ts +47 -0
- package/src/compat/actions/action-client.ts +531 -0
- package/src/compat/actions/action-dispatch.ts +676 -0
- package/src/compat/actions/action-router.ts +40 -0
- package/src/compat/actions/action-shared.ts +95 -0
- package/src/compat/actions/client-plugin.ts +135 -0
- package/src/compat/actions/client-stub.ts +65 -0
- package/src/compat/actions/config.ts +164 -0
- package/src/compat/actions/detect.ts +208 -0
- package/src/compat/actions/discovery.ts +244 -0
- package/src/compat/actions/early-submit.ts +40 -0
- package/src/compat/actions/endpoint.ts +602 -0
- package/src/compat/actions/flight.ts +52 -0
- package/src/compat/actions/form-state.ts +73 -0
- package/src/compat/actions/hoist.ts +485 -0
- package/src/compat/actions/ids.ts +39 -0
- package/src/compat/actions/index.ts +41 -0
- package/src/compat/actions/instances.ts +144 -0
- package/src/compat/actions/origin.ts +109 -0
- package/src/compat/actions/protocol.ts +125 -0
- package/src/compat/actions/registry.ts +74 -0
- package/src/compat/actions/rewrite.ts +282 -0
- package/src/compat/actions/serve.ts +414 -0
- package/src/compat/actions/server-tag.ts +21 -0
- package/src/compat/actions/unrecognized-error.ts +30 -0
- package/src/compat/adapter/build-complete.ts +257 -0
- package/src/compat/bundler/bun-externals.ts +53 -0
- package/src/compat/bundler/cjs-exports.ts +542 -0
- package/src/compat/bundler/config.ts +363 -0
- package/src/compat/bundler/externals.ts +34 -0
- package/src/compat/bundler/import-meta-url.ts +60 -0
- package/src/compat/bundler/modularize-imports.ts +119 -0
- package/src/compat/bundler/new-url-asset.ts +87 -0
- package/src/compat/bundler/optimize-package-imports.ts +273 -0
- package/src/compat/bundler/polyfill.ts +88 -0
- package/src/compat/bundler/react-compiler.ts +61 -0
- package/src/compat/bundler/react-profiler.tsx +25 -0
- package/src/compat/bundler/relay-transform.ts +116 -0
- package/src/compat/bundler/require-context.ts +281 -0
- package/src/compat/bundler/resolve-extensions.ts +75 -0
- package/src/compat/bundler/source-cache.ts +61 -0
- package/src/compat/bundler/static-imports.ts +25 -0
- package/src/compat/bundler/symlink-imports.ts +119 -0
- package/src/compat/bundler/tsconfig-paths.ts +50 -0
- package/src/compat/bundler/wasm.ts +153 -0
- package/src/compat/bundler/webpack-loaders.ts +685 -0
- package/src/compat/bundler/worker.ts +278 -0
- package/src/compat/cache/build-flags.ts +81 -0
- package/src/compat/cache/build-prerender-errors.ts +163 -0
- package/src/compat/cache/custom-handler.ts +159 -0
- package/src/compat/cache/fetch-patch.ts +745 -0
- package/src/compat/cache/handler.ts +100 -0
- package/src/compat/cache/modern-handler.ts +275 -0
- package/src/compat/cache/resume-data-cache.ts +143 -0
- package/src/compat/cache/revalidate.ts +759 -0
- package/src/compat/cache/runtime-error.ts +124 -0
- package/src/compat/cache/use-cache-transform.ts +961 -0
- package/src/compat/cache/use-cache.ts +1695 -0
- package/src/compat/cache-control.ts +269 -0
- package/src/compat/client/base-path.ts +64 -0
- package/src/compat/client/css-order.ts +36 -0
- package/src/compat/client/errors/control-flow.ts +92 -0
- package/src/compat/client/errors/error-boundary.ts +222 -0
- package/src/compat/client/errors/global-error.ts +238 -0
- package/src/compat/client/errors/install.ts +217 -0
- package/src/compat/client/errors/lazy.ts +53 -0
- package/src/compat/client/errors/primitive-throw.ts +126 -0
- package/src/compat/client/errors/soft-refresh.ts +14 -0
- package/src/compat/client/link-status.ts +86 -0
- package/src/compat/client/nav-compat-runtime.ts +57 -0
- package/src/compat/client/nav-compat.ts +42 -0
- package/src/compat/client/navigation-scroll.ts +154 -0
- package/src/compat/client/optimistic-routing.ts +206 -0
- package/src/compat/client/prefetch-cache.ts +111 -0
- package/src/compat/client/route-announcer.ts +72 -0
- package/src/compat/client/segment-cache-policy.ts +159 -0
- package/src/compat/client/segment-cache.ts +1077 -0
- package/src/compat/client/segment-prefetch.ts +375 -0
- package/src/compat/client/trailing-slash.ts +24 -0
- package/src/compat/css/chunking.ts +254 -0
- package/src/compat/css/inline-css.ts +73 -0
- package/src/compat/css/lightningcss.ts +90 -0
- package/src/compat/css/modules.ts +373 -0
- package/src/compat/css/nonce.ts +30 -0
- package/src/compat/css/sass-plugin.ts +65 -0
- package/src/compat/css/sass.ts +392 -0
- package/src/compat/css/styled-jsx-runtime.ts +80 -0
- package/src/compat/css/styled-jsx.ts +49 -0
- package/src/compat/edge-runtime.ts +71 -0
- package/src/compat/export/client.ts +112 -0
- package/src/compat/export/index.ts +272 -0
- package/src/compat/export/standalone.ts +207 -0
- package/src/compat/image-optimizer/cache.ts +119 -0
- package/src/compat/image-optimizer/detect.ts +143 -0
- package/src/compat/image-optimizer/index.ts +601 -0
- package/src/compat/image-optimizer/source.ts +243 -0
- package/src/compat/index.ts +458 -0
- package/src/compat/lifecycle/after-scope.ts +86 -0
- package/src/compat/lifecycle/after.ts +173 -0
- package/src/compat/lifecycle/error-funnel.ts +306 -0
- package/src/compat/lifecycle/error-serialize.ts +87 -0
- package/src/compat/lifecycle/error-ui.ts +167 -0
- package/src/compat/lifecycle/instrumentation-client.ts +138 -0
- package/src/compat/lifecycle/instrumentation.ts +277 -0
- package/src/compat/lifecycle/node-console.ts +19 -0
- package/src/compat/lifecycle/testmode.ts +263 -0
- package/src/compat/mdx/compile.ts +219 -0
- package/src/compat/mdx/next-mdx-stub.ts +46 -0
- package/src/compat/mdx/plugin.ts +37 -0
- package/src/compat/metadata-route-artifacts.ts +458 -0
- package/src/compat/metadata.ts +295 -0
- package/src/compat/middleware/manifest.ts +210 -0
- package/src/compat/misc/action-return.ts +173 -0
- package/src/compat/next/cache.ts +211 -0
- package/src/compat/next/canonical-url.ts +35 -0
- package/src/compat/next/client-cache.ts +57 -0
- package/src/compat/next/client-navigation.ts +313 -0
- package/src/compat/next/client-only.ts +3 -0
- package/src/compat/next/client-script.tsx +215 -0
- package/src/compat/next/client-server.ts +39 -0
- package/src/compat/next/config-loader.ts +569 -0
- package/src/compat/next/config.ts +29 -0
- package/src/compat/next/constants.cjs +6 -0
- package/src/compat/next/constants.ts +6 -0
- package/src/compat/next/custom-server.ts +236 -0
- package/src/compat/next/dist/client/components/app-router-headers.ts +32 -0
- package/src/compat/next/dist/server/app-render/work-unit-async-storage.external.cjs +38 -0
- package/src/compat/next/dist/server/web/spec-extension/revalidate.ts +1 -0
- package/src/compat/next/dist/server/web/spec-extension/unstable-cache.ts +1 -0
- package/src/compat/next/dist/server/web/spec-extension/unstable-no-store.ts +1 -0
- package/src/compat/next/dynamic.tsx +46 -0
- package/src/compat/next/error.tsx +148 -0
- package/src/compat/next/font/cache.ts +171 -0
- package/src/compat/next/font/google.ts +2 -0
- package/src/compat/next/font/index.ts +8 -0
- package/src/compat/next/font/local.ts +5 -0
- package/src/compat/next/font/runtime-client.ts +71 -0
- package/src/compat/next/font/runtime.ts +974 -0
- package/src/compat/next/font/shared.ts +281 -0
- package/src/compat/next/form.tsx +156 -0
- package/src/compat/next/head.tsx +10 -0
- package/src/compat/next/headers.ts +247 -0
- package/src/compat/next/image/config.ts +196 -0
- package/src/compat/next/image/optimizer.ts +96 -0
- package/src/compat/next/image/patterns.ts +103 -0
- package/src/compat/next/image/shared.ts +141 -0
- package/src/compat/next/image/static-metadata.ts +283 -0
- package/src/compat/next/image/validate.ts +269 -0
- package/src/compat/next/image-client.tsx +215 -0
- package/src/compat/next/image-props.ts +575 -0
- package/src/compat/next/image-usage.ts +102 -0
- package/src/compat/next/image.tsx +56 -0
- package/src/compat/next/index.ts +1 -0
- package/src/compat/next/legacy-image.tsx +97 -0
- package/src/compat/next/link-usage.ts +29 -0
- package/src/compat/next/link-validation-transform.ts +200 -0
- package/src/compat/next/link.tsx +466 -0
- package/src/compat/next/navigation.cjs +21 -0
- package/src/compat/next/navigation.ts +188 -0
- package/src/compat/next/offline.ts +51 -0
- package/src/compat/next/og.ts +324 -0
- package/src/compat/next/optimistic-route-state.ts +188 -0
- package/src/compat/next/preferred-region.ts +39 -0
- package/src/compat/next/redirects.ts +131 -0
- package/src/compat/next/resource-hints.ts +136 -0
- package/src/compat/next/rewrites.ts +350 -0
- package/src/compat/next/root-params.ts +142 -0
- package/src/compat/next/router.cjs +49 -0
- package/src/compat/next/router.ts +143 -0
- package/src/compat/next/script.tsx +355 -0
- package/src/compat/next/server-only.ts +3 -0
- package/src/compat/next/server.ts +28 -0
- package/src/compat/next/svgr.ts +58 -0
- package/src/compat/next/telemetry.ts +77 -0
- package/src/compat/next/user-agent.ts +100 -0
- package/src/compat/next/web-vitals.ts +56 -0
- package/src/compat/otel/api.ts +95 -0
- package/src/compat/otel/client-trace-metadata.ts +71 -0
- package/src/compat/otel/fetch-span.ts +77 -0
- package/src/compat/otel/tracer.ts +944 -0
- package/src/compat/pages/client-plugin.ts +108 -0
- package/src/compat/pages/index.ts +527 -0
- package/src/compat/pages/router-state.ts +94 -0
- package/src/compat/ppr/io.ts +38 -0
- package/src/compat/ppr/missing-root-params.ts +105 -0
- package/src/compat/ppr/root-params-scan.ts +164 -0
- package/src/compat/ppr/root-params-transform.ts +75 -0
- package/src/compat/ppr/root-params.ts +129 -0
- package/src/compat/ppr/segment-config-incompat.ts +34 -0
- package/src/compat/protocol.ts +202 -0
- package/src/compat/react/client.ts +59 -0
- package/src/compat/react/compiler-runtime.ts +60 -0
- package/src/compat/react/dom-client.ts +115 -0
- package/src/compat/react/dom-react-server.ts +20 -0
- package/src/compat/react/dom-server.ts +40 -0
- package/src/compat/react/dom.ts +154 -0
- package/src/compat/react/preact.ts +522 -0
- package/src/compat/react/react-server.ts +84 -0
- package/src/compat/react/router-shim.ts +26 -0
- package/src/compat/react/server-component-use.ts +48 -0
- package/src/compat/react/server-inserted-html.ts +87 -0
- package/src/compat/react/server.ts +156 -0
- package/src/compat/react/view-transition.ts +60 -0
- package/src/compat/register/actions.ts +875 -0
- package/src/compat/register/boot.ts +141 -0
- package/src/compat/register/build-tier.ts +11 -0
- package/src/compat/register/build.ts +182 -0
- package/src/compat/register/bundler.ts +587 -0
- package/src/compat/register/cache.ts +85 -0
- package/src/compat/register/client-errors.ts +18 -0
- package/src/compat/register/config.ts +17 -0
- package/src/compat/register/css-extras.ts +120 -0
- package/src/compat/register/edge-runtime.ts +6 -0
- package/src/compat/register/errors.ts +46 -0
- package/src/compat/register/export.ts +23 -0
- package/src/compat/register/font.ts +36 -0
- package/src/compat/register/hooks.ts +34 -0
- package/src/compat/register/image.ts +133 -0
- package/src/compat/register/index.ts +111 -0
- package/src/compat/register/instrumentation-client.ts +35 -0
- package/src/compat/register/lifecycle.ts +86 -0
- package/src/compat/register/mdx.ts +48 -0
- package/src/compat/register/middleware.ts +36 -0
- package/src/compat/register/misc.ts +44 -0
- package/src/compat/register/otel.ts +288 -0
- package/src/compat/register/pages-api.ts +473 -0
- package/src/compat/register/ppr.ts +56 -0
- package/src/compat/register/protocol.ts +57 -0
- package/src/compat/register/proxy.ts +127 -0
- package/src/compat/register/render.ts +268 -0
- package/src/compat/register/routing.ts +410 -0
- package/src/compat/register/segment.ts +1903 -0
- package/src/compat/register/static-image.ts +21 -0
- package/src/compat/register/typed-routes.ts +35 -0
- package/src/compat/register/usecache.ts +131 -0
- package/src/compat/register/validation.ts +56 -0
- package/src/compat/segment/loading-boundary.ts +113 -0
- package/src/compat/segment/page-slot.ts +200 -0
- package/src/compat/segment/tree.ts +481 -0
- package/src/compat/segment/vary-key.ts +102 -0
- package/src/compat/segment/vary-params.ts +551 -0
- package/src/compat/static-params.ts +33 -0
- package/src/compat/tsconfig-defaults.ts +301 -0
- package/src/compat/typecheck/index.ts +1481 -0
- package/src/compat/typecheck/worker.ts +26 -0
- package/src/compat/typed-routes/index.ts +92 -0
- package/src/compat/typed-routes/manifest.ts +356 -0
- package/src/compat/typed-routes/typegen.ts +566 -0
- package/src/compat/validation/errors.ts +159 -0
- package/src/compat/validation/index.ts +1770 -0
- package/src/compat/validation/prerender-diagnostics.ts +1508 -0
- package/src/compat-bootstrap.ts +67 -0
- package/src/config.ts +218 -0
- package/src/css/build.ts +697 -0
- package/src/css/index.ts +2 -0
- package/src/css/postcss.ts +236 -0
- package/src/css/worker.ts +34 -0
- package/src/dev/client-actions.ts +35 -0
- package/src/dev/client-chunk-store.ts +92 -0
- package/src/dev/client-key-cache.ts +178 -0
- package/src/dev/global-css-cache.ts +212 -0
- package/src/dev/imports.ts +2430 -0
- package/src/dev/module-cache.ts +721 -0
- package/src/dev/module-generations.ts +38 -0
- package/src/dev/module-transform.ts +188 -0
- package/src/dev/node-module-bundle-cache.ts +63 -0
- package/src/dev/restart-cache.ts +10 -0
- package/src/dev/route-bundle-key-cache.ts +154 -0
- package/src/dev/route-facts-cache.ts +223 -0
- package/src/dev/server.ts +1710 -0
- package/src/dynamic/source.ts +307 -0
- package/src/dynamic/tree-shake.ts +262 -0
- package/src/env.ts +92 -0
- package/src/extensions.ts +1898 -0
- package/src/index.ts +34 -0
- package/src/internal.ts +43 -0
- package/src/islands/boundary-error.ts +8 -0
- package/src/islands/static-children.ts +37 -0
- package/src/islands/static-slots.ts +106 -0
- package/src/ppr-postpone.ts +24 -0
- package/src/ppr.ts +784 -0
- package/src/proxy.ts +752 -0
- package/src/render/hooks.ts +384 -0
- package/src/render/index.ts +1 -0
- package/src/render/island-context.ts +47 -0
- package/src/render/metadata.ts +857 -0
- package/src/render/renderer.ts +7391 -0
- package/src/render/resource-hints.ts +44 -0
- package/src/render/slots.tsx +679 -0
- package/src/request/context.ts +396 -0
- package/src/resolve/engine.ts +219 -0
- package/src/resolve/imports.ts +1104 -0
- package/src/resolve/scan-facts.ts +474 -0
- package/src/resolve/source-text.ts +86 -0
- package/src/routing/forwarded.ts +41 -0
- package/src/routing/handler.ts +271 -0
- package/src/routing/href.ts +203 -0
- package/src/routing/metadata.ts +1018 -0
- package/src/routing/request-runtime.ts +43 -0
- package/src/routing/routes.ts +2560 -0
- package/src/routing/slots.ts +432 -0
- package/src/runtime/server.ts +3453 -0
- package/src/runtime/vendor.ts +1160 -0
- package/src/style-modules.d.ts +9 -0
- package/src/typegen.ts +151 -0
- package/src/types.ts +725 -0
- package/src/utils/ansi.ts +9 -0
- package/src/utils/content-type.ts +31 -0
- package/src/utils/decode.ts +7 -0
- package/src/utils/dev-profile.ts +31 -0
- package/src/utils/error-log.ts +29 -0
- package/src/utils/fs-cache.ts +31 -0
- package/src/utils/fs.ts +119 -0
- package/src/utils/html.ts +46 -0
- package/src/utils/serialize.ts +378 -0
- package/src/utils/source.ts +35 -0
- package/src/utils/verbose.ts +39 -0
- package/tsconfig.json +10 -0
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
import { safeDecode } from '../utils/decode';
|
|
2
|
+
import { getProxyExtensions, getProxyResponseProtocol } from '../extensions';
|
|
3
|
+
import { getBasePathPrefix } from '../routing/href';
|
|
4
|
+
import type {
|
|
5
|
+
NextRequest as NextRequestLike,
|
|
6
|
+
NextRequestCookie,
|
|
7
|
+
NextRequestCookies,
|
|
8
|
+
NextURL,
|
|
9
|
+
NextResponseCookies,
|
|
10
|
+
} from '../types';
|
|
11
|
+
|
|
12
|
+
const nextResponseMetaSymbol = Symbol.for('pnext.nextResponse');
|
|
13
|
+
|
|
14
|
+
export type { NextFetchEvent } from '../types';
|
|
15
|
+
|
|
16
|
+
export interface NextRequestGeo {
|
|
17
|
+
city?: string;
|
|
18
|
+
country?: string;
|
|
19
|
+
region?: string;
|
|
20
|
+
latitude?: string;
|
|
21
|
+
longitude?: string;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Runtime NextRequest for user code that constructs requests, mirroring
|
|
26
|
+
* Next's `new NextRequest(input, init?)`. Internal paths keep augmenting
|
|
27
|
+
* plain Requests via toNextRequest().
|
|
28
|
+
*/
|
|
29
|
+
export class NextRequest extends Request implements NextRequestLike {
|
|
30
|
+
readonly cookies: NextRequestCookies;
|
|
31
|
+
readonly nextUrl: NextURL;
|
|
32
|
+
readonly geo?: NextRequestGeo;
|
|
33
|
+
readonly ip?: string;
|
|
34
|
+
|
|
35
|
+
constructor(input: RequestInfo | URL, init?: RequestInit) {
|
|
36
|
+
super(input, init);
|
|
37
|
+
this.cookies = requestCookies(this.headers);
|
|
38
|
+
this.nextUrl = createNextUrl(this.url);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export type NextResponseKind = 'next' | 'rewrite';
|
|
43
|
+
|
|
44
|
+
export interface NextResponseMeta {
|
|
45
|
+
kind: NextResponseKind;
|
|
46
|
+
url?: string;
|
|
47
|
+
requestHeaders?: Headers;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
type NextResponseInit = ResponseInit & {
|
|
51
|
+
request?: {
|
|
52
|
+
headers?: HeadersInit;
|
|
53
|
+
};
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
export class NextResponse extends Response {
|
|
57
|
+
readonly cookies: NextResponseCookies;
|
|
58
|
+
readonly [nextResponseMetaSymbol]?: NextResponseMeta;
|
|
59
|
+
|
|
60
|
+
constructor(body?: BodyInit | null, init?: ResponseInit) {
|
|
61
|
+
super(body, init);
|
|
62
|
+
this.cookies = responseCookies(this.headers);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
static json<JsonBody>(body: JsonBody, init?: ResponseInit) {
|
|
66
|
+
const headers = new Headers(init?.headers);
|
|
67
|
+
if (!headers.has('content-type')) headers.set('content-type', 'application/json');
|
|
68
|
+
return new NextResponse(JSON.stringify(body), {
|
|
69
|
+
...init,
|
|
70
|
+
headers,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
static next(init?: NextResponseInit) {
|
|
75
|
+
const response = new NextResponse(null, init);
|
|
76
|
+
response.headers.set(getProxyResponseProtocol().nextHeader, '1');
|
|
77
|
+
defineMeta(response, { kind: 'next', ...requestMeta(init) });
|
|
78
|
+
return response;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
static rewrite(url: string | URL, init?: NextResponseInit) {
|
|
82
|
+
const response = new NextResponse(null, init);
|
|
83
|
+
response.headers.set(getProxyResponseProtocol().rewriteHeader, String(url));
|
|
84
|
+
defineMeta(response, { kind: 'rewrite', url: String(url), ...requestMeta(init) });
|
|
85
|
+
return response;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
static redirect(url: string | URL, init: number | ResponseInit = 307) {
|
|
89
|
+
const responseInit = typeof init === 'number' ? { status: init } : init;
|
|
90
|
+
const headers = new Headers(responseInit.headers);
|
|
91
|
+
headers.set('location', String(url));
|
|
92
|
+
return new NextResponse(null, {
|
|
93
|
+
...responseInit,
|
|
94
|
+
status: responseInit.status ?? 307,
|
|
95
|
+
headers,
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
export function toNextRequest(request: Request): NextRequestLike {
|
|
101
|
+
const nextRequest = request as Partial<NextRequestLike>;
|
|
102
|
+
if (nextRequest.cookies && nextRequest.nextUrl) return request as NextRequestLike;
|
|
103
|
+
|
|
104
|
+
Object.defineProperties(request, {
|
|
105
|
+
cookies: {
|
|
106
|
+
configurable: true,
|
|
107
|
+
enumerable: true,
|
|
108
|
+
value: requestCookies(request.headers),
|
|
109
|
+
},
|
|
110
|
+
nextUrl: {
|
|
111
|
+
configurable: true,
|
|
112
|
+
enumerable: true,
|
|
113
|
+
value: createNextUrl(request.url),
|
|
114
|
+
},
|
|
115
|
+
});
|
|
116
|
+
return request as NextRequestLike;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
export function nextResponseMeta(response: Response): NextResponseMeta | undefined {
|
|
120
|
+
const meta = (response as Response & { [nextResponseMetaSymbol]?: NextResponseMeta })[nextResponseMetaSymbol];
|
|
121
|
+
if (meta) return meta;
|
|
122
|
+
|
|
123
|
+
const protocol = getProxyResponseProtocol();
|
|
124
|
+
const rewrite = response.headers.get(protocol.rewriteHeader);
|
|
125
|
+
if (rewrite) return { kind: 'rewrite', url: rewrite };
|
|
126
|
+
if (response.headers.get(protocol.nextHeader)) return { kind: 'next' };
|
|
127
|
+
return undefined;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
export function copyMiddlewareHeaders(from: Response, to: Response) {
|
|
131
|
+
const internalHeaders = proxyInternalHeaders();
|
|
132
|
+
from.headers.forEach((value, key) => {
|
|
133
|
+
if (internalHeaders.has(key) || key === 'content-length' || key === 'set-cookie') return;
|
|
134
|
+
// Vary is merged, never overwritten: the middleware's vary tokens join the
|
|
135
|
+
// handler/page's own (both survive for CDN correctness). Every other header
|
|
136
|
+
// is the middleware's to set.
|
|
137
|
+
if (key === 'vary') mergeVaryInto(to.headers, value);
|
|
138
|
+
else to.headers.set(key, value);
|
|
139
|
+
});
|
|
140
|
+
const middlewareCookies = getSetCookie(from.headers);
|
|
141
|
+
if (middlewareCookies.length === 0) return;
|
|
142
|
+
const responseCookies = getSetCookie(to.headers);
|
|
143
|
+
to.headers.delete('set-cookie');
|
|
144
|
+
for (const cookie of middlewareCookies) to.headers.append('set-cookie', cookie);
|
|
145
|
+
for (const cookie of responseCookies) to.headers.append('set-cookie', cookie);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// Forward a middleware response's non-internal headers onto the DOWNSTREAM REQUEST (in addition to
|
|
149
|
+
// the response). Next applies every non-internal middleware response header to both req.headers and
|
|
150
|
+
// the final response, so NextResponse.next({ headers }) values are visible to route handlers and
|
|
151
|
+
// pages as request headers. set-cookie is handled separately and never forwarded here.
|
|
152
|
+
export function forwardMiddlewareRequestHeaders(from: Response, request: Request): Request {
|
|
153
|
+
const additions: [string, string][] = [];
|
|
154
|
+
const internalHeaders = proxyInternalHeaders();
|
|
155
|
+
from.headers.forEach((value, key) => {
|
|
156
|
+
if (internalHeaders.has(key) || key === 'content-length' || key === 'set-cookie') return;
|
|
157
|
+
additions.push([key, value]);
|
|
158
|
+
});
|
|
159
|
+
if (additions.length === 0) return request;
|
|
160
|
+
const headers = new Headers(request.headers);
|
|
161
|
+
for (const [key, value] of additions) headers.set(key, value);
|
|
162
|
+
return new Request(request, { headers });
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
function proxyInternalHeaders() {
|
|
166
|
+
const protocol = getProxyResponseProtocol();
|
|
167
|
+
return new Set([protocol.nextHeader, protocol.rewriteHeader]);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// Append `value`'s comma-separated tokens to the response's Vary, preserving
|
|
171
|
+
// existing tokens and never duplicating (case-insensitive).
|
|
172
|
+
function mergeVaryInto(headers: Headers, value: string) {
|
|
173
|
+
const existing = headers.get('vary');
|
|
174
|
+
const seen = new Set(
|
|
175
|
+
(existing ?? '')
|
|
176
|
+
.split(',')
|
|
177
|
+
.map(token => token.trim().toLowerCase())
|
|
178
|
+
.filter(Boolean),
|
|
179
|
+
);
|
|
180
|
+
const merged = existing
|
|
181
|
+
? existing.split(',').map(token => token.trim()).filter(Boolean)
|
|
182
|
+
: [];
|
|
183
|
+
for (const token of value.split(',').map(part => part.trim()).filter(Boolean)) {
|
|
184
|
+
if (seen.has(token.toLowerCase())) continue;
|
|
185
|
+
seen.add(token.toLowerCase());
|
|
186
|
+
merged.push(token);
|
|
187
|
+
}
|
|
188
|
+
if (merged.length > 0) headers.set('vary', merged.join(', '));
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
function defineMeta(response: NextResponse, meta: NextResponseMeta) {
|
|
192
|
+
Object.defineProperty(response, nextResponseMetaSymbol, {
|
|
193
|
+
configurable: false,
|
|
194
|
+
enumerable: false,
|
|
195
|
+
value: meta,
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
function requestMeta(init: NextResponseInit | undefined): Pick<NextResponseMeta, 'requestHeaders'> {
|
|
200
|
+
return init?.request?.headers ? { requestHeaders: new Headers(init.request.headers) } : {};
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
function createNextUrl(url: string | URL): NextURL {
|
|
204
|
+
const nextUrl = new URL(url) as NextURL;
|
|
205
|
+
Object.defineProperty(nextUrl, 'clone', {
|
|
206
|
+
configurable: true,
|
|
207
|
+
enumerable: false,
|
|
208
|
+
value: () => createNextUrl(nextUrl.href),
|
|
209
|
+
});
|
|
210
|
+
// Next's NextURL exposes basePath (the configured prefix, '' when unset) and
|
|
211
|
+
// locale ('' without i18n). The request URL reaching middleware already has
|
|
212
|
+
// any basePath stripped, so pathname stays app-relative while basePath holds
|
|
213
|
+
// the prefix. Defaulting these to strings (never undefined) matches Next, so
|
|
214
|
+
// `req.nextUrl.basePath` reads as a falsy '' rather than the string
|
|
215
|
+
// "undefined" when forwarded through a header.
|
|
216
|
+
nextUrl.basePath = getBasePathPrefix();
|
|
217
|
+
nextUrl.locale = getProxyExtensions().locale(nextUrl);
|
|
218
|
+
return nextUrl;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
function requestCookies(headers: Headers): NextRequestCookies {
|
|
222
|
+
let cookies = parseCookies(headers.get('cookie') ?? '');
|
|
223
|
+
const sync = () => {
|
|
224
|
+
const header = requestCookieHeader(cookies);
|
|
225
|
+
if (header) headers.set('cookie', header);
|
|
226
|
+
else headers.delete('cookie');
|
|
227
|
+
};
|
|
228
|
+
return {
|
|
229
|
+
get(name) {
|
|
230
|
+
return cookies.find(cookie => cookie.name === name);
|
|
231
|
+
},
|
|
232
|
+
getAll(name) {
|
|
233
|
+
return name ? cookies.filter(cookie => cookie.name === name) : [...cookies];
|
|
234
|
+
},
|
|
235
|
+
has(name) {
|
|
236
|
+
return cookies.some(cookie => cookie.name === name);
|
|
237
|
+
},
|
|
238
|
+
set(name, value) {
|
|
239
|
+
cookies = [...cookies.filter(cookie => cookie.name !== name), { name, value }];
|
|
240
|
+
sync();
|
|
241
|
+
return this;
|
|
242
|
+
},
|
|
243
|
+
delete(name) {
|
|
244
|
+
const existed = cookies.some(cookie => cookie.name === name);
|
|
245
|
+
cookies = cookies.filter(cookie => cookie.name !== name);
|
|
246
|
+
sync();
|
|
247
|
+
return existed;
|
|
248
|
+
},
|
|
249
|
+
clear() {
|
|
250
|
+
cookies = [];
|
|
251
|
+
sync();
|
|
252
|
+
},
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
function responseCookies(headers: Headers): NextResponseCookies {
|
|
257
|
+
return {
|
|
258
|
+
set(nameOrOptions: string | ResponseCookie, value?: string, options: ResponseCookieOptions = {}) {
|
|
259
|
+
const cookie: ResponseCookie =
|
|
260
|
+
typeof nameOrOptions === 'string'
|
|
261
|
+
? { ...options, name: nameOrOptions, value: value ?? '' }
|
|
262
|
+
: nameOrOptions;
|
|
263
|
+
headers.append('set-cookie', serializeCookie(cookie.name, cookie.value, cookie));
|
|
264
|
+
return this;
|
|
265
|
+
},
|
|
266
|
+
delete(name) {
|
|
267
|
+
headers.append('set-cookie', serializeCookie(name, '', { maxAge: 0, path: '/' }));
|
|
268
|
+
return this;
|
|
269
|
+
},
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
interface ResponseCookieOptions {
|
|
274
|
+
path?: string;
|
|
275
|
+
maxAge?: number;
|
|
276
|
+
httpOnly?: boolean;
|
|
277
|
+
secure?: boolean;
|
|
278
|
+
sameSite?: 'strict' | 'lax' | 'none';
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
interface ResponseCookie extends ResponseCookieOptions {
|
|
282
|
+
name: string;
|
|
283
|
+
value: string;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
function serializeCookie(
|
|
287
|
+
name: string,
|
|
288
|
+
value: string,
|
|
289
|
+
options: ResponseCookieOptions,
|
|
290
|
+
) {
|
|
291
|
+
const parts = [`${encodeURIComponent(name)}=${encodeURIComponent(value)}`];
|
|
292
|
+
// Next's ResponseCookies default the cookie path to '/' when unspecified,
|
|
293
|
+
// so a route handler's Set-Cookie is visible to sibling routes/middleware
|
|
294
|
+
// (not scoped to the request path). Match that default.
|
|
295
|
+
parts.push(`Path=${options.path ?? '/'}`);
|
|
296
|
+
if (options.maxAge !== undefined) parts.push(`Max-Age=${options.maxAge}`);
|
|
297
|
+
if (options.httpOnly) parts.push('HttpOnly');
|
|
298
|
+
if (options.secure) parts.push('Secure');
|
|
299
|
+
if (options.sameSite) parts.push(`SameSite=${options.sameSite}`);
|
|
300
|
+
return parts.join('; ');
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
export function parseCookies(header: string): NextRequestCookie[] {
|
|
304
|
+
return header
|
|
305
|
+
.split(';')
|
|
306
|
+
.map(part => part.trim())
|
|
307
|
+
.filter(Boolean)
|
|
308
|
+
.map(part => {
|
|
309
|
+
const [key = '', ...rest] = part.split('=');
|
|
310
|
+
return { name: safeDecode(key), value: safeDecode(rest.join('=')) };
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
export function requestCookieHeader(cookies: NextRequestCookie[]) {
|
|
315
|
+
return cookies
|
|
316
|
+
.map(cookie => `${encodeURIComponent(cookie.name)}=${encodeURIComponent(cookie.value)}`)
|
|
317
|
+
.join('; ');
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
export function getSetCookie(headers: Headers) {
|
|
321
|
+
const withSetCookie = headers as Headers & { getSetCookie?: () => string[] };
|
|
322
|
+
return withSetCookie.getSetCookie?.() ?? [];
|
|
323
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ComponentChildren } from 'preact';
|
|
2
|
+
|
|
3
|
+
export interface SuspenseProps {
|
|
4
|
+
fallback?: ComponentChildren;
|
|
5
|
+
children?: ComponentChildren;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Server streaming boundary for core PNext apps. The renderer resolves these
|
|
10
|
+
* boundaries itself (streaming, PPR, loading.tsx), so no preact/compat
|
|
11
|
+
* suspension machinery is involved. Rendered directly (client trees, tests),
|
|
12
|
+
* it passes children through.
|
|
13
|
+
*/
|
|
14
|
+
export function Suspense(props: SuspenseProps): ComponentChildren {
|
|
15
|
+
return props.children ?? null;
|
|
16
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
2
|
+
|
|
3
|
+
export interface CacheNode {
|
|
4
|
+
children: Map<unknown, CacheNode>;
|
|
5
|
+
record?: CacheRecord;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export type CacheRecord =
|
|
9
|
+
| { status: 'pending'; value: Promise<unknown> }
|
|
10
|
+
| { status: 'resolved'; value: unknown; async: boolean }
|
|
11
|
+
| { status: 'rejected'; error: unknown; async: boolean };
|
|
12
|
+
|
|
13
|
+
export interface CacheScope {
|
|
14
|
+
functions: WeakMap<object, CacheNode>;
|
|
15
|
+
fetches?: Map<string, Promise<unknown>>;
|
|
16
|
+
/**
|
|
17
|
+
* Lazily-created controller backing React.cacheSignal() in a request render. The signal stays live
|
|
18
|
+
* for the whole render - including deferred/streamed Suspense boundaries that resolve after the
|
|
19
|
+
* shell has flushed - so a slow cache component's bounded polling is never cut short. A build
|
|
20
|
+
* prerender uses the prerender scope's signal instead, which aborts at completePrerender().
|
|
21
|
+
*/
|
|
22
|
+
controller?: AbortController;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const storage = new AsyncLocalStorage<CacheScope>();
|
|
26
|
+
|
|
27
|
+
export function currentCacheScope() {
|
|
28
|
+
return storage.getStore();
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* The AbortSignal for the current cache/render scope (React.cacheSignal()), or null outside any
|
|
33
|
+
* render. A request render's shell can flush while deferred boundaries are still resolving, so this
|
|
34
|
+
* signal is intentionally NOT aborted at shell-flush time - doing so would abort a still-pending slow
|
|
35
|
+
* boundary's polling. Build prerenders get a deterministically-aborting signal from the prerender scope.
|
|
36
|
+
*/
|
|
37
|
+
export function currentCacheSignal(): AbortSignal | null {
|
|
38
|
+
const scope = storage.getStore();
|
|
39
|
+
if (!scope) return null;
|
|
40
|
+
if (!scope.controller) scope.controller = new AbortController();
|
|
41
|
+
return scope.controller.signal;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export function runWithCacheScope<T>(callback: () => T): T {
|
|
45
|
+
const existing = storage.getStore();
|
|
46
|
+
if (existing) return callback();
|
|
47
|
+
return storage.run({ functions: new WeakMap() }, callback);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Capture the current cache scope (if any) and return a wrapper that re-runs a
|
|
52
|
+
* function inside it. after() uses this so a callback registered during a page
|
|
53
|
+
* render still shares the render's React cache() memo cache when it runs later
|
|
54
|
+
* in the detached work-unit flush (which otherwise carries no cache scope).
|
|
55
|
+
* Returns an identity wrapper when no scope is active.
|
|
56
|
+
*/
|
|
57
|
+
export function captureCacheScope(): <T>(fn: () => T) => T {
|
|
58
|
+
const scope = storage.getStore();
|
|
59
|
+
if (!scope) return fn => fn();
|
|
60
|
+
return fn => storage.run(scope, fn);
|
|
61
|
+
}
|