vinext 0.0.47 → 0.0.48
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/build/layout-classification.js +3 -1
- package/dist/build/layout-classification.js.map +1 -1
- package/dist/build/prerender.js +10 -10
- package/dist/build/prerender.js.map +1 -1
- package/dist/build/report.d.ts +8 -4
- package/dist/build/report.js +17 -7
- package/dist/build/report.js.map +1 -1
- package/dist/build/run-prerender.d.ts +5 -0
- package/dist/build/run-prerender.js +4 -1
- package/dist/build/run-prerender.js.map +1 -1
- package/dist/build/server-manifest.js +2 -7
- package/dist/build/server-manifest.js.map +1 -1
- package/dist/build/standalone.js +3 -5
- package/dist/build/standalone.js.map +1 -1
- package/dist/check.js +45 -29
- package/dist/check.js.map +1 -1
- package/dist/cli-args.d.ts +3 -1
- package/dist/cli-args.js +18 -1
- package/dist/cli-args.js.map +1 -1
- package/dist/cli.js +9 -1
- package/dist/cli.js.map +1 -1
- package/dist/config/config-matchers.js +46 -37
- package/dist/config/config-matchers.js.map +1 -1
- package/dist/deploy.d.ts +18 -2
- package/dist/deploy.js +47 -4
- package/dist/deploy.js.map +1 -1
- package/dist/entries/app-rsc-entry.js +11 -9
- package/dist/entries/app-rsc-entry.js.map +1 -1
- package/dist/entries/app-rsc-manifest.js +4 -1
- package/dist/entries/app-rsc-manifest.js.map +1 -1
- package/dist/entries/pages-client-entry.js +3 -2
- package/dist/entries/pages-client-entry.js.map +1 -1
- package/dist/entries/pages-server-entry.js +14 -59
- package/dist/entries/pages-server-entry.js.map +1 -1
- package/dist/entries/runtime-entry-module.d.ts +12 -3
- package/dist/entries/runtime-entry-module.js +15 -4
- package/dist/entries/runtime-entry-module.js.map +1 -1
- package/dist/index.js +12 -7
- package/dist/index.js.map +1 -1
- package/dist/plugins/og-assets.js +15 -16
- package/dist/plugins/og-assets.js.map +1 -1
- package/dist/plugins/rsc-client-shim-excludes.d.ts +2 -1
- package/dist/plugins/rsc-client-shim-excludes.js +10 -1
- package/dist/plugins/rsc-client-shim-excludes.js.map +1 -1
- package/dist/routing/app-route-graph.d.ts +90 -4
- package/dist/routing/app-route-graph.js +210 -7
- package/dist/routing/app-route-graph.js.map +1 -1
- package/dist/routing/app-router.d.ts +15 -3
- package/dist/routing/app-router.js +20 -23
- package/dist/routing/app-router.js.map +1 -1
- package/dist/routing/file-matcher.d.ts +3 -1
- package/dist/routing/file-matcher.js +6 -1
- package/dist/routing/file-matcher.js.map +1 -1
- package/dist/routing/pages-router.js +10 -19
- package/dist/routing/pages-router.js.map +1 -1
- package/dist/routing/route-matching.d.ts +28 -0
- package/dist/routing/route-matching.js +44 -0
- package/dist/routing/route-matching.js.map +1 -0
- package/dist/routing/route-pattern.js +4 -1
- package/dist/routing/route-pattern.js.map +1 -1
- package/dist/routing/route-trie.d.ts +8 -0
- package/dist/routing/route-trie.js +12 -1
- package/dist/routing/route-trie.js.map +1 -1
- package/dist/routing/route-validation.js +3 -4
- package/dist/routing/route-validation.js.map +1 -1
- package/dist/routing/utils.d.ts +8 -1
- package/dist/routing/utils.js +25 -2
- package/dist/routing/utils.js.map +1 -1
- package/dist/server/app-browser-entry.js +66 -49
- package/dist/server/app-browser-entry.js.map +1 -1
- package/dist/server/app-browser-navigation-controller.d.ts +7 -5
- package/dist/server/app-browser-navigation-controller.js +43 -35
- package/dist/server/app-browser-navigation-controller.js.map +1 -1
- package/dist/server/app-browser-state.d.ts +33 -15
- package/dist/server/app-browser-state.js +52 -59
- package/dist/server/app-browser-state.js.map +1 -1
- package/dist/server/app-browser-visible-commit.d.ts +68 -0
- package/dist/server/app-browser-visible-commit.js +182 -0
- package/dist/server/app-browser-visible-commit.js.map +1 -0
- package/dist/server/app-client-reference-preloader.d.ts +15 -0
- package/dist/server/app-client-reference-preloader.js +46 -0
- package/dist/server/app-client-reference-preloader.js.map +1 -0
- package/dist/server/app-elements-wire.d.ts +130 -0
- package/dist/server/app-elements-wire.js +205 -0
- package/dist/server/app-elements-wire.js.map +1 -0
- package/dist/server/app-elements.d.ts +2 -84
- package/dist/server/app-elements.js +3 -102
- package/dist/server/app-elements.js.map +1 -1
- package/dist/server/app-fallback-renderer.d.ts +1 -1
- package/dist/server/app-middleware.d.ts +2 -1
- package/dist/server/app-middleware.js +34 -11
- package/dist/server/app-middleware.js.map +1 -1
- package/dist/server/app-page-boundary-render.d.ts +1 -1
- package/dist/server/app-page-boundary-render.js +8 -5
- package/dist/server/app-page-boundary-render.js.map +1 -1
- package/dist/server/app-page-boundary.js +2 -1
- package/dist/server/app-page-boundary.js.map +1 -1
- package/dist/server/app-page-cache.d.ts +1 -0
- package/dist/server/app-page-cache.js +8 -13
- package/dist/server/app-page-cache.js.map +1 -1
- package/dist/server/app-page-dispatch.d.ts +2 -1
- package/dist/server/app-page-dispatch.js +18 -10
- package/dist/server/app-page-dispatch.js.map +1 -1
- package/dist/server/app-page-element-builder.d.ts +1 -1
- package/dist/server/app-page-element-builder.js +8 -5
- package/dist/server/app-page-element-builder.js.map +1 -1
- package/dist/server/app-page-execution.d.ts +23 -5
- package/dist/server/app-page-execution.js +39 -24
- package/dist/server/app-page-execution.js.map +1 -1
- package/dist/server/app-page-head.js +2 -1
- package/dist/server/app-page-head.js.map +1 -1
- package/dist/server/app-page-method.js +2 -5
- package/dist/server/app-page-method.js.map +1 -1
- package/dist/server/app-page-probe.d.ts +1 -1
- package/dist/server/app-page-probe.js +5 -1
- package/dist/server/app-page-probe.js.map +1 -1
- package/dist/server/app-page-render.d.ts +1 -1
- package/dist/server/app-page-render.js +38 -3
- package/dist/server/app-page-render.js.map +1 -1
- package/dist/server/app-page-request.d.ts +0 -1
- package/dist/server/app-page-request.js +7 -10
- package/dist/server/app-page-request.js.map +1 -1
- package/dist/server/app-page-response.js +3 -2
- package/dist/server/app-page-response.js.map +1 -1
- package/dist/server/app-page-route-wiring.d.ts +5 -2
- package/dist/server/app-page-route-wiring.js +15 -12
- package/dist/server/app-page-route-wiring.js.map +1 -1
- package/dist/server/app-page-stream.d.ts +7 -0
- package/dist/server/app-page-stream.js +9 -2
- package/dist/server/app-page-stream.js.map +1 -1
- package/dist/server/app-prerender-endpoints.js +3 -2
- package/dist/server/app-prerender-endpoints.js.map +1 -1
- package/dist/server/app-route-handler-cache.js +2 -1
- package/dist/server/app-route-handler-cache.js.map +1 -1
- package/dist/server/app-route-handler-dispatch.js +6 -5
- package/dist/server/app-route-handler-dispatch.js.map +1 -1
- package/dist/server/app-route-handler-policy.js +13 -13
- package/dist/server/app-route-handler-policy.js.map +1 -1
- package/dist/server/app-route-handler-response.js +2 -1
- package/dist/server/app-route-handler-response.js.map +1 -1
- package/dist/server/app-route-handler-runtime.d.ts +9 -1
- package/dist/server/app-route-handler-runtime.js +11 -1
- package/dist/server/app-route-handler-runtime.js.map +1 -1
- package/dist/server/app-router-entry.js +9 -4
- package/dist/server/app-router-entry.js.map +1 -1
- package/dist/server/app-rsc-cache-busting.d.ts +34 -0
- package/dist/server/app-rsc-cache-busting.js +137 -0
- package/dist/server/app-rsc-cache-busting.js.map +1 -0
- package/dist/server/app-rsc-handler.js +22 -11
- package/dist/server/app-rsc-handler.js.map +1 -1
- package/dist/server/app-rsc-request-normalization.d.ts +4 -2
- package/dist/server/app-rsc-request-normalization.js +10 -6
- package/dist/server/app-rsc-request-normalization.js.map +1 -1
- package/dist/server/app-rsc-response-finalizer.js +1 -1
- package/dist/server/app-rsc-route-matching.js +8 -4
- package/dist/server/app-rsc-route-matching.js.map +1 -1
- package/dist/server/app-segment-config.js +4 -0
- package/dist/server/app-segment-config.js.map +1 -1
- package/dist/server/app-server-action-execution.js +43 -51
- package/dist/server/app-server-action-execution.js.map +1 -1
- package/dist/server/app-ssr-entry.js +21 -20
- package/dist/server/app-ssr-entry.js.map +1 -1
- package/dist/server/artifact-compatibility.d.ts +44 -0
- package/dist/server/artifact-compatibility.js +82 -0
- package/dist/server/artifact-compatibility.js.map +1 -0
- package/dist/server/cache-proof.d.ts +200 -0
- package/dist/server/cache-proof.js +342 -0
- package/dist/server/cache-proof.js.map +1 -0
- package/dist/server/dev-origin-check.js +8 -4
- package/dist/server/dev-origin-check.js.map +1 -1
- package/dist/server/dev-server.js +1 -6
- package/dist/server/dev-server.js.map +1 -1
- package/dist/server/http-error-responses.d.ts +67 -0
- package/dist/server/http-error-responses.js +77 -0
- package/dist/server/http-error-responses.js.map +1 -0
- package/dist/server/image-optimization.js +2 -1
- package/dist/server/image-optimization.js.map +1 -1
- package/dist/server/metadata-route-response.js +6 -5
- package/dist/server/metadata-route-response.js.map +1 -1
- package/dist/server/metadata-routes.d.ts +1 -0
- package/dist/server/metadata-routes.js +6 -0
- package/dist/server/metadata-routes.js.map +1 -1
- package/dist/server/middleware-matcher.js +2 -2
- package/dist/server/middleware-matcher.js.map +1 -1
- package/dist/server/middleware-response-headers.js +21 -0
- package/dist/server/middleware-response-headers.js.map +1 -1
- package/dist/server/middleware-runtime.js +3 -3
- package/dist/server/middleware-runtime.js.map +1 -1
- package/dist/server/navigation-trace.d.ts +33 -0
- package/dist/server/navigation-trace.js +35 -0
- package/dist/server/navigation-trace.js.map +1 -0
- package/dist/server/next-error-digest.d.ts +44 -0
- package/dist/server/next-error-digest.js +40 -0
- package/dist/server/next-error-digest.js.map +1 -0
- package/dist/server/pages-api-route.js +2 -1
- package/dist/server/pages-api-route.js.map +1 -1
- package/dist/server/pages-node-compat.js +4 -16
- package/dist/server/pages-node-compat.js.map +1 -1
- package/dist/server/pages-page-response.d.ts +2 -8
- package/dist/server/pages-page-response.js +44 -14
- package/dist/server/pages-page-response.js.map +1 -1
- package/dist/server/prod-server.d.ts +6 -0
- package/dist/server/prod-server.js +28 -21
- package/dist/server/prod-server.js.map +1 -1
- package/dist/server/request-pipeline.d.ts +42 -1
- package/dist/server/request-pipeline.js +97 -17
- package/dist/server/request-pipeline.js.map +1 -1
- package/dist/shims/cache-runtime.d.ts +2 -2
- package/dist/shims/cache-runtime.js +3 -6
- package/dist/shims/cache-runtime.js.map +1 -1
- package/dist/shims/cache.js +3 -5
- package/dist/shims/cache.js.map +1 -1
- package/dist/shims/fetch-cache.js +2 -3
- package/dist/shims/fetch-cache.js.map +1 -1
- package/dist/shims/head-state.js +2 -3
- package/dist/shims/head-state.js.map +1 -1
- package/dist/shims/headers.js +4 -44
- package/dist/shims/headers.js.map +1 -1
- package/dist/shims/i18n-state.js +2 -3
- package/dist/shims/i18n-state.js.map +1 -1
- package/dist/shims/internal/als-registry.d.ts +15 -0
- package/dist/shims/internal/als-registry.js +55 -0
- package/dist/shims/internal/als-registry.js.map +1 -0
- package/dist/shims/internal/cookie-serialize.d.ts +46 -0
- package/dist/shims/internal/cookie-serialize.js +51 -0
- package/dist/shims/internal/cookie-serialize.js.map +1 -0
- package/dist/shims/link.js +31 -26
- package/dist/shims/link.js.map +1 -1
- package/dist/shims/metadata.d.ts +26 -1
- package/dist/shims/metadata.js +94 -4
- package/dist/shims/metadata.js.map +1 -1
- package/dist/shims/navigation-state.js +2 -3
- package/dist/shims/navigation-state.js.map +1 -1
- package/dist/shims/navigation.d.ts +2 -7
- package/dist/shims/navigation.js +44 -36
- package/dist/shims/navigation.js.map +1 -1
- package/dist/shims/request-context.js +2 -4
- package/dist/shims/request-context.js.map +1 -1
- package/dist/shims/router-state.js +2 -3
- package/dist/shims/router-state.js.map +1 -1
- package/dist/shims/router.js +2 -2
- package/dist/shims/router.js.map +1 -1
- package/dist/shims/server.js +5 -30
- package/dist/shims/server.js.map +1 -1
- package/dist/shims/slot.d.ts +1 -1
- package/dist/shims/slot.js +5 -4
- package/dist/shims/slot.js.map +1 -1
- package/dist/shims/thenable-params.d.ts +5 -2
- package/dist/shims/thenable-params.js +26 -6
- package/dist/shims/thenable-params.js.map +1 -1
- package/dist/shims/unified-request-context.js +2 -14
- package/dist/shims/unified-request-context.js.map +1 -1
- package/dist/utils/base-path.d.ts +7 -1
- package/dist/utils/base-path.js +12 -1
- package/dist/utils/base-path.js.map +1 -1
- package/dist/utils/safe-json-file.d.ts +18 -0
- package/dist/utils/safe-json-file.js +25 -0
- package/dist/utils/safe-json-file.js.map +1 -0
- package/dist/utils/text-stream.d.ts +29 -0
- package/dist/utils/text-stream.js +66 -0
- package/dist/utils/text-stream.js.map +1 -0
- package/package.json +5 -5
package/dist/shims/router.js
CHANGED
|
@@ -150,10 +150,10 @@ function setSSRContext(ctx) {
|
|
|
150
150
|
*/
|
|
151
151
|
function extractRouteParamNames(pattern) {
|
|
152
152
|
const names = [];
|
|
153
|
-
const bracketMatches = pattern.matchAll(/\[{1,2}(?:\.\.\.)?([
|
|
153
|
+
const bracketMatches = pattern.matchAll(/\[{1,2}(?:\.\.\.)?([^\]]+)\]{1,2}/g);
|
|
154
154
|
for (const m of bracketMatches) names.push(m[1]);
|
|
155
155
|
if (names.length > 0) return names;
|
|
156
|
-
const colonMatches = pattern.matchAll(/:([
|
|
156
|
+
const colonMatches = pattern.matchAll(/:([^/+*]+)[+*]?/g);
|
|
157
157
|
for (const m of colonMatches) names.push(m[1]);
|
|
158
158
|
return names;
|
|
159
159
|
}
|
package/dist/shims/router.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.js","names":[],"sources":["../../src/shims/router.ts"],"sourcesContent":["/**\n * next/router shim\n *\n * Provides useRouter() hook and Router singleton for Pages Router.\n * Backed by the browser History API. Supports client-side navigation\n * by fetching new page data and re-rendering the React root.\n */\nimport { useState, useEffect, useCallback, useMemo, createElement, type ReactElement } from \"react\";\nimport { RouterContext } from \"./internal/router-context.js\";\nimport type { VinextNextData } from \"../client/vinext-next-data.js\";\nimport { isValidModulePath } from \"../client/validate-module-path.js\";\nimport { toBrowserNavigationHref, toSameOriginAppPath } from \"./url-utils.js\";\nimport { stripBasePath } from \"../utils/base-path.js\";\nimport { addLocalePrefix, getDomainLocaleUrl, type DomainLocale } from \"../utils/domain-locale.js\";\nimport {\n addQueryParam,\n appendSearchParamsToUrl,\n type UrlQuery,\n urlQueryToSearchParams,\n} from \"../utils/query.js\";\n\n/** basePath from next.config.js, injected by the plugin at build time */\nconst __basePath: string = process.env.__NEXT_ROUTER_BASEPATH ?? \"\";\n\ntype BeforePopStateCallback = (state: {\n url: string;\n as: string;\n options: { shallow: boolean };\n}) => boolean;\n\nexport type NextRouter = {\n /** Current pathname */\n pathname: string;\n /** Current route pattern (e.g., \"/posts/[id]\") */\n route: string;\n /** Query parameters */\n query: Record<string, string | string[]>;\n /** Full URL including query string */\n asPath: string;\n /** Base path */\n basePath: string;\n /** Current locale */\n locale?: string;\n /** Available locales */\n locales?: string[];\n /** Default locale */\n defaultLocale?: string;\n /** Configured domain locales */\n domainLocales?: VinextNextData[\"domainLocales\"];\n /** Whether the router is ready */\n isReady: boolean;\n /** Whether this is a preview */\n isPreview: boolean;\n /** Whether this is a fallback page */\n isFallback: boolean;\n\n /** Navigate to a new URL */\n push(url: string | UrlObject, as?: string, options?: TransitionOptions): Promise<boolean>;\n /** Replace current URL */\n replace(url: string | UrlObject, as?: string, options?: TransitionOptions): Promise<boolean>;\n /** Go back */\n back(): void;\n /** Reload the page */\n reload(): void;\n /** Prefetch a page (injects <link rel=\"prefetch\">) */\n prefetch(url: string): Promise<void>;\n /** Register a callback to run before popstate navigation */\n beforePopState(cb: BeforePopStateCallback): void;\n /** Listen for route changes */\n events: RouterEvents;\n};\n\ntype UrlObject = {\n pathname?: string;\n query?: UrlQuery;\n};\n\ntype TransitionOptions = {\n shallow?: boolean;\n scroll?: boolean;\n locale?: string;\n};\n\ntype RouterEvents = {\n on(event: string, handler: (...args: unknown[]) => void): void;\n off(event: string, handler: (...args: unknown[]) => void): void;\n emit(event: string, ...args: unknown[]): void;\n};\n\nfunction createRouterEvents(): RouterEvents {\n const listeners = new Map<string, Set<(...args: unknown[]) => void>>();\n\n return {\n on(event: string, handler: (...args: unknown[]) => void) {\n if (!listeners.has(event)) listeners.set(event, new Set());\n (listeners.get(event) as Set<(...args: unknown[]) => void>).add(handler);\n },\n off(event: string, handler: (...args: unknown[]) => void) {\n listeners.get(event)?.delete(handler);\n },\n emit(event: string, ...args: unknown[]) {\n listeners.get(event)?.forEach((handler) => handler(...args));\n },\n };\n}\n\n// Singleton events instance\nconst routerEvents = createRouterEvents();\n\nfunction resolveUrl(url: string | UrlObject): string {\n if (typeof url === \"string\") return url;\n let result = url.pathname ?? \"/\";\n if (url.query) {\n const params = urlQueryToSearchParams(url.query);\n result = appendSearchParamsToUrl(result, params);\n }\n return result;\n}\n\n/**\n * When `as` is provided, use it as the navigation target. This is a\n * simplification: Next.js keeps `url` and `as` as separate values (url for\n * data fetching, as for the browser URL). We collapse them because vinext's\n * navigateClient() fetches HTML from the target URL, so `as` must be a\n * server-resolvable path. Purely decorative `as` values are not supported.\n */\nfunction resolveNavigationTarget(\n url: string | UrlObject,\n as: string | undefined,\n locale: string | undefined,\n): string {\n return applyNavigationLocale(as ?? resolveUrl(url), locale);\n}\n\nfunction getDomainLocales(): readonly DomainLocale[] | undefined {\n return (window.__NEXT_DATA__ as VinextNextData | undefined)?.domainLocales;\n}\n\nfunction getCurrentHostname(): string | undefined {\n return window.location?.hostname;\n}\n\nfunction getDomainLocalePath(url: string, locale: string): string | undefined {\n return getDomainLocaleUrl(url, locale, {\n basePath: __basePath,\n currentHostname: getCurrentHostname(),\n domainItems: getDomainLocales(),\n });\n}\n\n/**\n * Apply locale prefix to a URL for client-side navigation.\n * Same logic as Link's applyLocaleToHref but reads from window globals.\n */\nexport function applyNavigationLocale(url: string, locale?: string): string {\n if (!locale || typeof window === \"undefined\") return url;\n // Absolute and protocol-relative URLs must not be prefixed — locale\n // only applies to local paths.\n if (url.startsWith(\"http://\") || url.startsWith(\"https://\") || url.startsWith(\"//\")) {\n return url;\n }\n\n const domainLocalePath = getDomainLocalePath(url, locale);\n if (domainLocalePath) return domainLocalePath;\n\n return addLocalePrefix(url, locale, window.__VINEXT_DEFAULT_LOCALE__ ?? \"\");\n}\n\n/** Check if a URL is external (any URL scheme per RFC 3986, or protocol-relative) */\nexport function isExternalUrl(url: string): boolean {\n return /^[a-z][a-z0-9+.-]*:/i.test(url) || url.startsWith(\"//\");\n}\n\n/** Resolve a hash URL to a basePath-stripped app URL for event payloads */\nfunction resolveHashUrl(url: string): string {\n if (typeof window === \"undefined\") return url;\n if (url.startsWith(\"#\"))\n return stripBasePath(window.location.pathname, __basePath) + window.location.search + url;\n // Full-path hash URL — strip basePath for consistency with other events\n try {\n const parsed = new URL(url, window.location.href);\n return stripBasePath(parsed.pathname, __basePath) + parsed.search + parsed.hash;\n } catch {\n return url;\n }\n}\n\n/** Check if a href is only a hash change relative to the current URL */\nexport function isHashOnlyChange(href: string): boolean {\n if (href.startsWith(\"#\")) return true;\n if (typeof window === \"undefined\") return false;\n try {\n const current = new URL(window.location.href);\n const next = new URL(href, window.location.href);\n return current.pathname === next.pathname && current.search === next.search && next.hash !== \"\";\n } catch {\n return false;\n }\n}\n\n/** Scroll to hash target element, or top if no hash */\nfunction scrollToHash(hash: string): void {\n if (!hash || hash === \"#\") {\n window.scrollTo(0, 0);\n return;\n }\n const el = document.getElementById(hash.slice(1));\n if (el) el.scrollIntoView({ behavior: \"auto\" });\n}\n\n/** Save current scroll position into history state for back/forward restoration */\nfunction saveScrollPosition(): void {\n const state = window.history.state ?? {};\n window.history.replaceState(\n { ...state, __vinext_scrollX: window.scrollX, __vinext_scrollY: window.scrollY },\n \"\",\n );\n}\n\n/** Restore scroll position from history state */\nfunction restoreScrollPosition(state: unknown): void {\n if (state && typeof state === \"object\" && \"__vinext_scrollY\" in state) {\n const { __vinext_scrollX: x, __vinext_scrollY: y } = state as {\n __vinext_scrollX: number;\n __vinext_scrollY: number;\n };\n requestAnimationFrame(() => window.scrollTo(x, y));\n }\n}\n\n/**\n * SSR context - set by the dev server before rendering each page.\n */\ntype SSRContext = {\n pathname: string;\n query: Record<string, string | string[]>;\n asPath: string;\n locale?: string;\n locales?: string[];\n defaultLocale?: string;\n domainLocales?: VinextNextData[\"domainLocales\"];\n};\n\n// ---------------------------------------------------------------------------\n// Server-side SSR state uses a registration pattern so this module can be\n// bundled for the browser. The ALS-backed implementation lives in\n// router-state.ts (server-only) and registers itself on import.\n// ---------------------------------------------------------------------------\n\nlet _ssrContext: SSRContext | null = null;\n\nlet _getSSRContext = (): SSRContext | null => _ssrContext;\nlet _setSSRContextImpl = (ctx: SSRContext | null): void => {\n _ssrContext = ctx;\n};\n\n/**\n * Register ALS-backed state accessors. Called by router-state.ts on import.\n * @internal\n */\nexport function _registerRouterStateAccessors(accessors: {\n getSSRContext: () => SSRContext | null;\n setSSRContext: (ctx: SSRContext | null) => void;\n}): void {\n _getSSRContext = accessors.getSSRContext;\n _setSSRContextImpl = accessors.setSSRContext;\n}\n\nexport function setSSRContext(ctx: SSRContext | null): void {\n _setSSRContextImpl(ctx);\n}\n\n/**\n * Extract param names from a Next.js route pattern.\n * E.g., \"/posts/[id]\" → [\"id\"], \"/docs/[...slug]\" → [\"slug\"],\n * \"/shop/[[...path]]\" → [\"path\"], \"/blog/[year]/[month]\" → [\"year\", \"month\"]\n * Also handles internal format: \"/posts/:id\" → [\"id\"], \"/docs/:slug+\" → [\"slug\"]\n */\nfunction extractRouteParamNames(pattern: string): string[] {\n const names: string[] = [];\n // Match Next.js bracket format: [id], [...slug], [[...slug]]\n const bracketMatches = pattern.matchAll(/\\[{1,2}(?:\\.\\.\\.)?([\\w-]+)\\]{1,2}/g);\n for (const m of bracketMatches) {\n names.push(m[1]);\n }\n if (names.length > 0) return names;\n // Fallback: match internal :param format\n const colonMatches = pattern.matchAll(/:([\\w-]+)[+*]?/g);\n for (const m of colonMatches) {\n names.push(m[1]);\n }\n return names;\n}\n\nfunction getPathnameAndQuery(): {\n pathname: string;\n query: Record<string, string | string[]>;\n asPath: string;\n} {\n if (typeof window === \"undefined\") {\n const _ssrCtx = _getSSRContext();\n if (_ssrCtx) {\n const query: Record<string, string | string[]> = {};\n for (const [key, value] of Object.entries(_ssrCtx.query)) {\n query[key] = Array.isArray(value) ? [...value] : value;\n }\n return { pathname: _ssrCtx.pathname, query, asPath: _ssrCtx.asPath };\n }\n return { pathname: \"/\", query: {}, asPath: \"/\" };\n }\n const resolvedPath = stripBasePath(window.location.pathname, __basePath);\n // In Next.js, router.pathname is the route pattern (e.g., \"/posts/[id]\"),\n // not the resolved path (\"/posts/42\"). __NEXT_DATA__.page holds the route\n // pattern and is updated by navigateClient() on every client-side navigation.\n const pathname = window.__NEXT_DATA__?.page ?? resolvedPath;\n const routeQuery: Record<string, string | string[]> = {};\n // Include dynamic route params from __NEXT_DATA__ (e.g., { id: \"42\" } from /posts/[id]).\n // Only include keys that are part of the route pattern (not stale query params).\n const nextData = window.__NEXT_DATA__;\n if (nextData && nextData.query && nextData.page) {\n const routeParamNames = extractRouteParamNames(nextData.page);\n for (const key of routeParamNames) {\n const value = nextData.query[key];\n if (typeof value === \"string\") {\n routeQuery[key] = value;\n } else if (Array.isArray(value)) {\n routeQuery[key] = [...value];\n }\n }\n }\n // URL search params always reflect the current URL\n const searchQuery: Record<string, string | string[]> = {};\n const params = new URLSearchParams(window.location.search);\n for (const [key, value] of params) {\n addQueryParam(searchQuery, key, value);\n }\n const query = { ...searchQuery, ...routeQuery };\n // asPath uses the resolved browser path, not the route pattern\n const asPath = resolvedPath + window.location.search + window.location.hash;\n return { pathname, query, asPath };\n}\n\n/**\n * Error thrown when a navigation is superseded by a newer one.\n * Matches Next.js's convention of an Error with `.cancelled = true`.\n */\nclass NavigationCancelledError extends Error {\n cancelled = true;\n constructor(route: string) {\n super(`Abort fetching component for route: \"${route}\"`);\n this.name = \"NavigationCancelledError\";\n }\n}\n\n/**\n * Error thrown after queueing a hard navigation fallback for a known failure\n * mode. Callers can use this to avoid scheduling the same hard navigation twice.\n */\nclass HardNavigationScheduledError extends Error {\n hardNavigationScheduled = true;\n constructor(message: string) {\n super(message);\n this.name = \"HardNavigationScheduledError\";\n }\n}\n\n/**\n * Monotonically increasing ID for tracking the current navigation.\n * Each call to navigateClient() increments this and captures the value.\n * After each async boundary, the navigation checks whether it is still\n * the active one. If a newer navigation has started, the stale one\n * throws NavigationCancelledError so the caller can emit routeChangeError\n * and skip routeChangeComplete.\n *\n * Replaces the old boolean `_navInProgress` guard which silently dropped\n * the second navigation, causing URL/content mismatch.\n */\nlet _navigationId = 0;\n\n/** AbortController for the in-flight fetch, so superseded navigations abort network I/O. */\nlet _activeAbortController: AbortController | null = null;\n\nfunction scheduleHardNavigationAndThrow(url: string, message: string): never {\n if (typeof window === \"undefined\") {\n throw new HardNavigationScheduledError(message);\n }\n window.location.href = url;\n throw new HardNavigationScheduledError(message);\n}\n\n/**\n * Perform client-side navigation: fetch the target page's HTML,\n * extract __NEXT_DATA__, and re-render the React root.\n *\n * Throws NavigationCancelledError if a newer navigation supersedes this one.\n * Throws on hard-navigation failures (non-OK response, missing data) so the\n * caller can distinguish success from failure for event emission.\n */\nasync function navigateClient(url: string): Promise<void> {\n if (typeof window === \"undefined\") return;\n\n const root = window.__VINEXT_ROOT__;\n if (!root) {\n // No React root yet — fall back to hard navigation\n window.location.href = url;\n return;\n }\n\n // Cancel any in-flight navigation (abort its fetch, mark it stale)\n _activeAbortController?.abort();\n const controller = new AbortController();\n _activeAbortController = controller;\n\n const navId = ++_navigationId;\n\n /** Check if this navigation is still the active one. If not, throw. */\n function assertStillCurrent(): void {\n if (navId !== _navigationId) {\n throw new NavigationCancelledError(url);\n }\n }\n\n try {\n // Fetch the target page's SSR HTML\n let res: Response;\n try {\n res = await fetch(url, {\n headers: { Accept: \"text/html\" },\n signal: controller.signal,\n });\n } catch (err: unknown) {\n // AbortError means a newer navigation cancelled this fetch\n if (err instanceof DOMException && err.name === \"AbortError\") {\n throw new NavigationCancelledError(url);\n }\n throw err;\n }\n assertStillCurrent();\n\n if (!res.ok) {\n // Set window.location.href first so the browser navigates to the correct\n // page even if the caller suppresses the error. The assignment schedules\n // the navigation asynchronously (as a task), so synchronous routeChangeError\n // listeners still run — and observe the error — before the page unloads.\n // Contract: routeChangeError listeners MUST be synchronous; async listeners\n // will not fire before the navigation completes. Callers (runNavigateClient)\n // must NOT schedule a second hard navigation — this assignment already queues\n // the browser fallback, and the helper-level HardNavigationScheduledError\n // makes that contract explicit to callers.\n scheduleHardNavigationAndThrow(url, `Navigation failed: ${res.status} ${res.statusText}`);\n }\n\n const html = await res.text();\n assertStillCurrent();\n\n // Extract __NEXT_DATA__ from the HTML\n const match = html.match(/<script>window\\.__NEXT_DATA__\\s*=\\s*(.*?)<\\/script>/);\n if (!match) {\n scheduleHardNavigationAndThrow(url, \"Navigation failed: missing __NEXT_DATA__ in response\");\n }\n\n const nextData = JSON.parse(match[1]);\n const { pageProps } = nextData.props;\n // Defer writing window.__NEXT_DATA__ until just before root.render() —\n // writing it here would let a stale navigation briefly pollute the global\n // between this assertStillCurrent() and the next one after await import().\n\n // Get the page module URL from __NEXT_DATA__.__vinext (preferred),\n // or fall back to parsing the hydration script\n let pageModuleUrl: string | undefined = nextData.__vinext?.pageModuleUrl;\n\n if (!pageModuleUrl) {\n // Legacy fallback: try to find the module URL in the inline script\n const moduleMatch = html.match(/import\\(\"([^\"]+)\"\\);\\s*\\n\\s*const PageComponent/);\n const altMatch = html.match(/await import\\(\"([^\"]+pages\\/[^\"]+)\"\\)/);\n pageModuleUrl = moduleMatch?.[1] ?? altMatch?.[1] ?? undefined;\n }\n\n if (!pageModuleUrl) {\n scheduleHardNavigationAndThrow(url, \"Navigation failed: no page module URL found\");\n }\n\n // Validate the module URL before importing — defense-in-depth against\n // unexpected __NEXT_DATA__ or malformed HTML responses\n if (!isValidModulePath(pageModuleUrl)) {\n console.error(\"[vinext] Blocked import of invalid page module path:\", pageModuleUrl);\n scheduleHardNavigationAndThrow(url, \"Navigation failed: invalid page module path\");\n }\n\n // Dynamically import the new page module\n const pageModule = await import(/* @vite-ignore */ pageModuleUrl);\n assertStillCurrent();\n\n const PageComponent = pageModule.default;\n\n if (!PageComponent) {\n scheduleHardNavigationAndThrow(url, \"Navigation failed: page module has no default export\");\n }\n\n // Import React for createElement\n const React = (await import(\"react\")).default;\n assertStillCurrent();\n\n // Re-render with the new page, loading _app if needed\n let AppComponent = window.__VINEXT_APP__;\n const appModuleUrl: string | undefined = nextData.__vinext?.appModuleUrl;\n\n if (!AppComponent && appModuleUrl) {\n if (!isValidModulePath(appModuleUrl)) {\n console.error(\"[vinext] Blocked import of invalid app module path:\", appModuleUrl);\n } else {\n try {\n const appModule = await import(/* @vite-ignore */ appModuleUrl);\n AppComponent = appModule.default;\n window.__VINEXT_APP__ = AppComponent;\n } catch {\n // _app not available — continue without it\n }\n }\n }\n assertStillCurrent();\n\n let element;\n if (AppComponent) {\n element = React.createElement(AppComponent, {\n Component: PageComponent,\n pageProps,\n });\n } else {\n element = React.createElement(PageComponent, pageProps);\n }\n\n // Wrap with RouterContext.Provider so next/compat/router works\n element = wrapWithRouterContext(element);\n\n // Commit __NEXT_DATA__ only after all assertStillCurrent() checks have passed,\n // so a stale navigation can never pollute the global.\n // INVARIANT: Everything after the final assertStillCurrent() above (the\n // checkpoint immediately after the optional _app import) through\n // root.render() is synchronous. If any step here ever becomes async, add\n // another assertStillCurrent() before writing __NEXT_DATA__.\n window.__NEXT_DATA__ = nextData;\n root.render(element);\n } finally {\n // Clean up the abort controller if this navigation is still the active one\n if (navId === _navigationId) {\n _activeAbortController = null;\n }\n }\n}\n\n/**\n * Run navigateClient and handle errors: emit routeChangeError on failure,\n * and fall back to a hard navigation for non-cancel errors so the browser\n * recovers to a consistent state.\n *\n * Returns:\n * - \"completed\" — navigation finished, caller should emit routeChangeComplete\n * - \"cancelled\" — superseded by a newer navigation, caller should return true\n * without emitting routeChangeComplete (matches Next.js behaviour)\n * - \"failed\" — genuine error, caller should return false (hard nav is already\n * scheduled as recovery)\n */\nasync function runNavigateClient(\n fullUrl: string,\n resolvedUrl: string,\n): Promise<\"completed\" | \"cancelled\" | \"failed\"> {\n try {\n await navigateClient(fullUrl);\n return \"completed\";\n } catch (err: unknown) {\n routerEvents.emit(\"routeChangeError\", err, resolvedUrl, { shallow: false });\n if (err instanceof NavigationCancelledError) {\n return \"cancelled\";\n }\n // Genuine error (network, parse, import failure): fall back to a hard\n // navigation so the browser lands on the correct page. Known failure modes\n // throw HardNavigationScheduledError, and this guard skips those; only\n // unexpected failures (parse, import, render) need recovery here.\n if (typeof window !== \"undefined\" && !(err instanceof HardNavigationScheduledError)) {\n window.location.href = fullUrl;\n }\n return \"failed\";\n }\n}\n\n/**\n * Build the full router value object from the current pathname, query, asPath,\n * and a set of navigation methods. Shared by useRouter() (which passes\n * hook-derived callbacks) and wrapWithRouterContext() (which passes the Router\n * singleton methods) so the shape stays in sync.\n */\nfunction buildRouterValue(\n pathname: string,\n query: Record<string, string | string[]>,\n asPath: string,\n methods: {\n push: NextRouter[\"push\"];\n replace: NextRouter[\"replace\"];\n back: NextRouter[\"back\"];\n reload: NextRouter[\"reload\"];\n prefetch: NextRouter[\"prefetch\"];\n beforePopState: NextRouter[\"beforePopState\"];\n },\n): NextRouter {\n const _ssrState = _getSSRContext();\n const nextData =\n typeof window !== \"undefined\"\n ? (window.__NEXT_DATA__ as VinextNextData | undefined)\n : undefined;\n const locale = typeof window === \"undefined\" ? _ssrState?.locale : window.__VINEXT_LOCALE__;\n const locales = typeof window === \"undefined\" ? _ssrState?.locales : window.__VINEXT_LOCALES__;\n const defaultLocale =\n typeof window === \"undefined\" ? _ssrState?.defaultLocale : window.__VINEXT_DEFAULT_LOCALE__;\n const domainLocales =\n typeof window === \"undefined\" ? _ssrState?.domainLocales : nextData?.domainLocales;\n\n const route = typeof window !== \"undefined\" ? (nextData?.page ?? pathname) : pathname;\n\n return {\n pathname,\n route,\n query,\n asPath,\n basePath: __basePath,\n locale,\n locales,\n defaultLocale,\n domainLocales,\n isReady: true,\n isPreview: false,\n isFallback: typeof window !== \"undefined\" && nextData?.isFallback === true,\n ...methods,\n events: routerEvents,\n };\n}\n\n/**\n * useRouter hook - Pages Router compatible.\n */\nexport function useRouter(): NextRouter {\n const [{ pathname, query, asPath }, setState] = useState(getPathnameAndQuery);\n\n // Popstate is handled by the module-level listener below so beforePopState()\n // is consistently enforced even when multiple components mount useRouter().\n useEffect(() => {\n const onNavigate = ((_e: CustomEvent) => {\n setState(getPathnameAndQuery());\n }) as EventListener;\n window.addEventListener(\"vinext:navigate\", onNavigate);\n return () => window.removeEventListener(\"vinext:navigate\", onNavigate);\n }, []);\n\n const push = useCallback(\n async (url: string | UrlObject, as?: string, options?: TransitionOptions): Promise<boolean> => {\n let resolved = resolveNavigationTarget(url, as, options?.locale);\n\n // External URLs — delegate to browser (unless same-origin)\n if (isExternalUrl(resolved)) {\n const localPath = toSameOriginAppPath(resolved, __basePath);\n if (localPath == null) {\n window.location.assign(resolved);\n return true;\n }\n resolved = localPath;\n }\n\n const full = toBrowserNavigationHref(resolved, window.location.href, __basePath);\n\n // Hash-only change — no page fetch needed\n if (isHashOnlyChange(resolved)) {\n const eventUrl = resolveHashUrl(resolved);\n routerEvents.emit(\"hashChangeStart\", eventUrl, {\n shallow: options?.shallow ?? false,\n });\n const hash = resolved.includes(\"#\") ? resolved.slice(resolved.indexOf(\"#\")) : \"\";\n window.history.pushState({}, \"\", resolved.startsWith(\"#\") ? resolved : full);\n _lastPathnameAndSearch = window.location.pathname + window.location.search;\n scrollToHash(hash);\n setState(getPathnameAndQuery());\n routerEvents.emit(\"hashChangeComplete\", eventUrl, {\n shallow: options?.shallow ?? false,\n });\n window.dispatchEvent(new CustomEvent(\"vinext:navigate\"));\n return true;\n }\n\n saveScrollPosition();\n routerEvents.emit(\"routeChangeStart\", resolved, { shallow: options?.shallow ?? false });\n routerEvents.emit(\"beforeHistoryChange\", resolved, { shallow: options?.shallow ?? false });\n window.history.pushState({}, \"\", full);\n _lastPathnameAndSearch = window.location.pathname + window.location.search;\n if (!options?.shallow) {\n const result = await runNavigateClient(full, resolved);\n if (result === \"cancelled\") return true;\n if (result === \"failed\") return false;\n }\n setState(getPathnameAndQuery());\n routerEvents.emit(\"routeChangeComplete\", resolved, { shallow: options?.shallow ?? false });\n\n // Scroll: handle hash target, else scroll to top unless scroll:false\n const hash = resolved.includes(\"#\") ? resolved.slice(resolved.indexOf(\"#\")) : \"\";\n if (hash) {\n scrollToHash(hash);\n } else if (options?.scroll !== false) {\n window.scrollTo(0, 0);\n }\n window.dispatchEvent(new CustomEvent(\"vinext:navigate\"));\n return true;\n },\n [],\n );\n\n const replace = useCallback(\n async (url: string | UrlObject, as?: string, options?: TransitionOptions): Promise<boolean> => {\n let resolved = resolveNavigationTarget(url, as, options?.locale);\n\n // External URLs — delegate to browser (unless same-origin)\n if (isExternalUrl(resolved)) {\n const localPath = toSameOriginAppPath(resolved, __basePath);\n if (localPath == null) {\n window.location.replace(resolved);\n return true;\n }\n resolved = localPath;\n }\n\n const full = toBrowserNavigationHref(resolved, window.location.href, __basePath);\n\n // Hash-only change — no page fetch needed\n if (isHashOnlyChange(resolved)) {\n const eventUrl = resolveHashUrl(resolved);\n routerEvents.emit(\"hashChangeStart\", eventUrl, {\n shallow: options?.shallow ?? false,\n });\n const hash = resolved.includes(\"#\") ? resolved.slice(resolved.indexOf(\"#\")) : \"\";\n window.history.replaceState({}, \"\", resolved.startsWith(\"#\") ? resolved : full);\n _lastPathnameAndSearch = window.location.pathname + window.location.search;\n scrollToHash(hash);\n setState(getPathnameAndQuery());\n routerEvents.emit(\"hashChangeComplete\", eventUrl, {\n shallow: options?.shallow ?? false,\n });\n window.dispatchEvent(new CustomEvent(\"vinext:navigate\"));\n return true;\n }\n\n routerEvents.emit(\"routeChangeStart\", resolved, { shallow: options?.shallow ?? false });\n routerEvents.emit(\"beforeHistoryChange\", resolved, { shallow: options?.shallow ?? false });\n window.history.replaceState({}, \"\", full);\n _lastPathnameAndSearch = window.location.pathname + window.location.search;\n if (!options?.shallow) {\n const result = await runNavigateClient(full, resolved);\n if (result === \"cancelled\") return true;\n if (result === \"failed\") return false;\n }\n setState(getPathnameAndQuery());\n routerEvents.emit(\"routeChangeComplete\", resolved, { shallow: options?.shallow ?? false });\n\n // Scroll: handle hash target, else scroll to top unless scroll:false\n const hash = resolved.includes(\"#\") ? resolved.slice(resolved.indexOf(\"#\")) : \"\";\n if (hash) {\n scrollToHash(hash);\n } else if (options?.scroll !== false) {\n window.scrollTo(0, 0);\n }\n window.dispatchEvent(new CustomEvent(\"vinext:navigate\"));\n return true;\n },\n [],\n );\n\n const back = useCallback(() => {\n window.history.back();\n }, []);\n\n const reload = useCallback(() => {\n window.location.reload();\n }, []);\n\n const prefetch = useCallback(async (url: string): Promise<void> => {\n // Inject a <link rel=\"prefetch\"> for the target page\n if (typeof document !== \"undefined\") {\n const link = document.createElement(\"link\");\n link.rel = \"prefetch\";\n link.href = url;\n link.as = \"document\";\n document.head.appendChild(link);\n }\n }, []);\n\n const router = useMemo(\n (): NextRouter =>\n buildRouterValue(pathname, query, asPath, {\n push,\n replace,\n back,\n reload,\n prefetch,\n beforePopState: (cb: BeforePopStateCallback) => {\n _beforePopStateCb = cb;\n },\n }),\n [pathname, query, asPath, push, replace, back, reload, prefetch],\n );\n\n return router;\n}\n\n// beforePopState callback: called before handling browser back/forward.\n// If it returns false, the navigation is cancelled.\nlet _beforePopStateCb: BeforePopStateCallback | undefined;\n\n// Track pathname+search for detecting hash-only back/forward in the popstate\n// handler. Updated after every pushState/replaceState so that popstate can\n// compare the previous value with the (already-changed) window.location.\nlet _lastPathnameAndSearch =\n typeof window !== \"undefined\" ? window.location.pathname + window.location.search : \"\";\n\n// Module-level popstate listener: handles browser back/forward by re-rendering\n// the React root with the page at the new URL. This runs regardless of whether\n// any component calls useRouter().\nif (typeof window !== \"undefined\") {\n window.addEventListener(\"popstate\", (e: PopStateEvent) => {\n const browserUrl = window.location.pathname + window.location.search;\n const appUrl = stripBasePath(window.location.pathname, __basePath) + window.location.search;\n\n // Detect hash-only back/forward: pathname+search unchanged, only hash differs.\n const isHashOnly = browserUrl === _lastPathnameAndSearch;\n\n // Check beforePopState callback\n if (_beforePopStateCb !== undefined) {\n const shouldContinue = (_beforePopStateCb as BeforePopStateCallback)({\n url: appUrl,\n as: appUrl,\n options: { shallow: false },\n });\n if (!shouldContinue) return;\n }\n\n // Update tracker only after beforePopState confirms navigation proceeds.\n // If beforePopState cancels, the tracker must retain the previous value\n // so the next popstate compares against the correct baseline.\n _lastPathnameAndSearch = browserUrl;\n\n if (isHashOnly) {\n // Hash-only back/forward — no page fetch needed\n const hashUrl = appUrl + window.location.hash;\n routerEvents.emit(\"hashChangeStart\", hashUrl, { shallow: false });\n scrollToHash(window.location.hash);\n routerEvents.emit(\"hashChangeComplete\", hashUrl, { shallow: false });\n window.dispatchEvent(new CustomEvent(\"vinext:navigate\"));\n return;\n }\n\n const fullAppUrl = appUrl + window.location.hash;\n routerEvents.emit(\"routeChangeStart\", fullAppUrl, { shallow: false });\n // Note: The browser has already updated window.location by the time popstate\n // fires, so this is not truly \"before\" the URL change. In Next.js the popstate\n // handler calls replaceState to store history metadata — beforeHistoryChange\n // precedes that call, not the URL change itself. We emit it here for API\n // compatibility.\n routerEvents.emit(\"beforeHistoryChange\", fullAppUrl, { shallow: false });\n void (async () => {\n const result = await runNavigateClient(browserUrl, fullAppUrl);\n if (result === \"completed\") {\n routerEvents.emit(\"routeChangeComplete\", fullAppUrl, { shallow: false });\n restoreScrollPosition(e.state);\n window.dispatchEvent(new CustomEvent(\"vinext:navigate\"));\n }\n // \"cancelled\": superseded by a newer navigation, so this popstate no longer wins.\n // \"failed\": runNavigateClient already scheduled the hard-navigation fallback.\n })();\n });\n}\n\n/**\n * Wrap a React element in a RouterContext.Provider so that\n * next/compat/router's useRouter() returns the real Pages Router value.\n *\n * This is a plain function, NOT a React component — it builds the router\n * value object directly from the current SSR context (server) or\n * window.location + Router singleton (client), avoiding duplicate state\n * that a hook-based component would create.\n */\nexport function wrapWithRouterContext(element: ReactElement): ReactElement {\n const { pathname, query, asPath } = getPathnameAndQuery();\n\n const routerValue = buildRouterValue(pathname, query, asPath, {\n push: Router.push,\n replace: Router.replace,\n back: Router.back,\n reload: Router.reload,\n prefetch: Router.prefetch,\n beforePopState: Router.beforePopState,\n });\n\n return createElement(RouterContext.Provider, { value: routerValue }, element) as ReactElement;\n}\n\n// Also export a default Router singleton for `import Router from 'next/router'`\nconst Router = {\n push: async (url: string | UrlObject, as?: string, options?: TransitionOptions) => {\n let resolved = resolveNavigationTarget(url, as, options?.locale);\n\n // External URLs (unless same-origin)\n if (isExternalUrl(resolved)) {\n const localPath = toSameOriginAppPath(resolved, __basePath);\n if (localPath == null) {\n window.location.assign(resolved);\n return true;\n }\n resolved = localPath;\n }\n\n const full = toBrowserNavigationHref(resolved, window.location.href, __basePath);\n\n // Hash-only change\n if (isHashOnlyChange(resolved)) {\n const eventUrl = resolveHashUrl(resolved);\n routerEvents.emit(\"hashChangeStart\", eventUrl, {\n shallow: options?.shallow ?? false,\n });\n const hash = resolved.includes(\"#\") ? resolved.slice(resolved.indexOf(\"#\")) : \"\";\n window.history.pushState({}, \"\", resolved.startsWith(\"#\") ? resolved : full);\n _lastPathnameAndSearch = window.location.pathname + window.location.search;\n scrollToHash(hash);\n routerEvents.emit(\"hashChangeComplete\", eventUrl, {\n shallow: options?.shallow ?? false,\n });\n window.dispatchEvent(new CustomEvent(\"vinext:navigate\"));\n return true;\n }\n\n saveScrollPosition();\n routerEvents.emit(\"routeChangeStart\", resolved, { shallow: options?.shallow ?? false });\n routerEvents.emit(\"beforeHistoryChange\", resolved, { shallow: options?.shallow ?? false });\n window.history.pushState({}, \"\", full);\n _lastPathnameAndSearch = window.location.pathname + window.location.search;\n if (!options?.shallow) {\n const result = await runNavigateClient(full, resolved);\n if (result === \"cancelled\") return true;\n if (result === \"failed\") return false;\n }\n routerEvents.emit(\"routeChangeComplete\", resolved, { shallow: options?.shallow ?? false });\n\n const hash = resolved.includes(\"#\") ? resolved.slice(resolved.indexOf(\"#\")) : \"\";\n if (hash) {\n scrollToHash(hash);\n } else if (options?.scroll !== false) {\n window.scrollTo(0, 0);\n }\n window.dispatchEvent(new CustomEvent(\"vinext:navigate\"));\n return true;\n },\n replace: async (url: string | UrlObject, as?: string, options?: TransitionOptions) => {\n let resolved = resolveNavigationTarget(url, as, options?.locale);\n\n // External URLs (unless same-origin)\n if (isExternalUrl(resolved)) {\n const localPath = toSameOriginAppPath(resolved, __basePath);\n if (localPath == null) {\n window.location.replace(resolved);\n return true;\n }\n resolved = localPath;\n }\n\n const full = toBrowserNavigationHref(resolved, window.location.href, __basePath);\n\n // Hash-only change\n if (isHashOnlyChange(resolved)) {\n const eventUrl = resolveHashUrl(resolved);\n routerEvents.emit(\"hashChangeStart\", eventUrl, {\n shallow: options?.shallow ?? false,\n });\n const hash = resolved.includes(\"#\") ? resolved.slice(resolved.indexOf(\"#\")) : \"\";\n window.history.replaceState({}, \"\", resolved.startsWith(\"#\") ? resolved : full);\n _lastPathnameAndSearch = window.location.pathname + window.location.search;\n scrollToHash(hash);\n routerEvents.emit(\"hashChangeComplete\", eventUrl, {\n shallow: options?.shallow ?? false,\n });\n window.dispatchEvent(new CustomEvent(\"vinext:navigate\"));\n return true;\n }\n\n routerEvents.emit(\"routeChangeStart\", resolved, { shallow: options?.shallow ?? false });\n routerEvents.emit(\"beforeHistoryChange\", resolved, { shallow: options?.shallow ?? false });\n window.history.replaceState({}, \"\", full);\n _lastPathnameAndSearch = window.location.pathname + window.location.search;\n if (!options?.shallow) {\n const result = await runNavigateClient(full, resolved);\n if (result === \"cancelled\") return true;\n if (result === \"failed\") return false;\n }\n routerEvents.emit(\"routeChangeComplete\", resolved, { shallow: options?.shallow ?? false });\n\n const hash = resolved.includes(\"#\") ? resolved.slice(resolved.indexOf(\"#\")) : \"\";\n if (hash) {\n scrollToHash(hash);\n } else if (options?.scroll !== false) {\n window.scrollTo(0, 0);\n }\n window.dispatchEvent(new CustomEvent(\"vinext:navigate\"));\n return true;\n },\n back: () => window.history.back(),\n reload: () => window.location.reload(),\n prefetch: async (url: string) => {\n if (typeof document !== \"undefined\") {\n const link = document.createElement(\"link\");\n link.rel = \"prefetch\";\n link.href = url;\n link.as = \"document\";\n document.head.appendChild(link);\n }\n },\n beforePopState: (cb: BeforePopStateCallback) => {\n _beforePopStateCb = cb;\n },\n events: routerEvents,\n};\n\nexport default Router;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"router.js","names":[],"sources":["../../src/shims/router.ts"],"sourcesContent":["/**\n * next/router shim\n *\n * Provides useRouter() hook and Router singleton for Pages Router.\n * Backed by the browser History API. Supports client-side navigation\n * by fetching new page data and re-rendering the React root.\n */\nimport { useState, useEffect, useCallback, useMemo, createElement, type ReactElement } from \"react\";\nimport { RouterContext } from \"./internal/router-context.js\";\nimport type { VinextNextData } from \"../client/vinext-next-data.js\";\nimport { isValidModulePath } from \"../client/validate-module-path.js\";\nimport { toBrowserNavigationHref, toSameOriginAppPath } from \"./url-utils.js\";\nimport { stripBasePath } from \"../utils/base-path.js\";\nimport { addLocalePrefix, getDomainLocaleUrl, type DomainLocale } from \"../utils/domain-locale.js\";\nimport {\n addQueryParam,\n appendSearchParamsToUrl,\n type UrlQuery,\n urlQueryToSearchParams,\n} from \"../utils/query.js\";\n\n/** basePath from next.config.js, injected by the plugin at build time */\nconst __basePath: string = process.env.__NEXT_ROUTER_BASEPATH ?? \"\";\n\ntype BeforePopStateCallback = (state: {\n url: string;\n as: string;\n options: { shallow: boolean };\n}) => boolean;\n\nexport type NextRouter = {\n /** Current pathname */\n pathname: string;\n /** Current route pattern (e.g., \"/posts/[id]\") */\n route: string;\n /** Query parameters */\n query: Record<string, string | string[]>;\n /** Full URL including query string */\n asPath: string;\n /** Base path */\n basePath: string;\n /** Current locale */\n locale?: string;\n /** Available locales */\n locales?: string[];\n /** Default locale */\n defaultLocale?: string;\n /** Configured domain locales */\n domainLocales?: VinextNextData[\"domainLocales\"];\n /** Whether the router is ready */\n isReady: boolean;\n /** Whether this is a preview */\n isPreview: boolean;\n /** Whether this is a fallback page */\n isFallback: boolean;\n\n /** Navigate to a new URL */\n push(url: string | UrlObject, as?: string, options?: TransitionOptions): Promise<boolean>;\n /** Replace current URL */\n replace(url: string | UrlObject, as?: string, options?: TransitionOptions): Promise<boolean>;\n /** Go back */\n back(): void;\n /** Reload the page */\n reload(): void;\n /** Prefetch a page (injects <link rel=\"prefetch\">) */\n prefetch(url: string): Promise<void>;\n /** Register a callback to run before popstate navigation */\n beforePopState(cb: BeforePopStateCallback): void;\n /** Listen for route changes */\n events: RouterEvents;\n};\n\ntype UrlObject = {\n pathname?: string;\n query?: UrlQuery;\n};\n\ntype TransitionOptions = {\n shallow?: boolean;\n scroll?: boolean;\n locale?: string;\n};\n\ntype RouterEvents = {\n on(event: string, handler: (...args: unknown[]) => void): void;\n off(event: string, handler: (...args: unknown[]) => void): void;\n emit(event: string, ...args: unknown[]): void;\n};\n\nfunction createRouterEvents(): RouterEvents {\n const listeners = new Map<string, Set<(...args: unknown[]) => void>>();\n\n return {\n on(event: string, handler: (...args: unknown[]) => void) {\n if (!listeners.has(event)) listeners.set(event, new Set());\n (listeners.get(event) as Set<(...args: unknown[]) => void>).add(handler);\n },\n off(event: string, handler: (...args: unknown[]) => void) {\n listeners.get(event)?.delete(handler);\n },\n emit(event: string, ...args: unknown[]) {\n listeners.get(event)?.forEach((handler) => handler(...args));\n },\n };\n}\n\n// Singleton events instance\nconst routerEvents = createRouterEvents();\n\nfunction resolveUrl(url: string | UrlObject): string {\n if (typeof url === \"string\") return url;\n let result = url.pathname ?? \"/\";\n if (url.query) {\n const params = urlQueryToSearchParams(url.query);\n result = appendSearchParamsToUrl(result, params);\n }\n return result;\n}\n\n/**\n * When `as` is provided, use it as the navigation target. This is a\n * simplification: Next.js keeps `url` and `as` as separate values (url for\n * data fetching, as for the browser URL). We collapse them because vinext's\n * navigateClient() fetches HTML from the target URL, so `as` must be a\n * server-resolvable path. Purely decorative `as` values are not supported.\n */\nfunction resolveNavigationTarget(\n url: string | UrlObject,\n as: string | undefined,\n locale: string | undefined,\n): string {\n return applyNavigationLocale(as ?? resolveUrl(url), locale);\n}\n\nfunction getDomainLocales(): readonly DomainLocale[] | undefined {\n return (window.__NEXT_DATA__ as VinextNextData | undefined)?.domainLocales;\n}\n\nfunction getCurrentHostname(): string | undefined {\n return window.location?.hostname;\n}\n\nfunction getDomainLocalePath(url: string, locale: string): string | undefined {\n return getDomainLocaleUrl(url, locale, {\n basePath: __basePath,\n currentHostname: getCurrentHostname(),\n domainItems: getDomainLocales(),\n });\n}\n\n/**\n * Apply locale prefix to a URL for client-side navigation.\n * Same logic as Link's applyLocaleToHref but reads from window globals.\n */\nexport function applyNavigationLocale(url: string, locale?: string): string {\n if (!locale || typeof window === \"undefined\") return url;\n // Absolute and protocol-relative URLs must not be prefixed — locale\n // only applies to local paths.\n if (url.startsWith(\"http://\") || url.startsWith(\"https://\") || url.startsWith(\"//\")) {\n return url;\n }\n\n const domainLocalePath = getDomainLocalePath(url, locale);\n if (domainLocalePath) return domainLocalePath;\n\n return addLocalePrefix(url, locale, window.__VINEXT_DEFAULT_LOCALE__ ?? \"\");\n}\n\n/** Check if a URL is external (any URL scheme per RFC 3986, or protocol-relative) */\nexport function isExternalUrl(url: string): boolean {\n return /^[a-z][a-z0-9+.-]*:/i.test(url) || url.startsWith(\"//\");\n}\n\n/** Resolve a hash URL to a basePath-stripped app URL for event payloads */\nfunction resolveHashUrl(url: string): string {\n if (typeof window === \"undefined\") return url;\n if (url.startsWith(\"#\"))\n return stripBasePath(window.location.pathname, __basePath) + window.location.search + url;\n // Full-path hash URL — strip basePath for consistency with other events\n try {\n const parsed = new URL(url, window.location.href);\n return stripBasePath(parsed.pathname, __basePath) + parsed.search + parsed.hash;\n } catch {\n return url;\n }\n}\n\n/** Check if a href is only a hash change relative to the current URL */\nexport function isHashOnlyChange(href: string): boolean {\n if (href.startsWith(\"#\")) return true;\n if (typeof window === \"undefined\") return false;\n try {\n const current = new URL(window.location.href);\n const next = new URL(href, window.location.href);\n return current.pathname === next.pathname && current.search === next.search && next.hash !== \"\";\n } catch {\n return false;\n }\n}\n\n/** Scroll to hash target element, or top if no hash */\nfunction scrollToHash(hash: string): void {\n if (!hash || hash === \"#\") {\n window.scrollTo(0, 0);\n return;\n }\n const el = document.getElementById(hash.slice(1));\n if (el) el.scrollIntoView({ behavior: \"auto\" });\n}\n\n/** Save current scroll position into history state for back/forward restoration */\nfunction saveScrollPosition(): void {\n const state = window.history.state ?? {};\n window.history.replaceState(\n { ...state, __vinext_scrollX: window.scrollX, __vinext_scrollY: window.scrollY },\n \"\",\n );\n}\n\n/** Restore scroll position from history state */\nfunction restoreScrollPosition(state: unknown): void {\n if (state && typeof state === \"object\" && \"__vinext_scrollY\" in state) {\n const { __vinext_scrollX: x, __vinext_scrollY: y } = state as {\n __vinext_scrollX: number;\n __vinext_scrollY: number;\n };\n requestAnimationFrame(() => window.scrollTo(x, y));\n }\n}\n\n/**\n * SSR context - set by the dev server before rendering each page.\n */\ntype SSRContext = {\n pathname: string;\n query: Record<string, string | string[]>;\n asPath: string;\n locale?: string;\n locales?: string[];\n defaultLocale?: string;\n domainLocales?: VinextNextData[\"domainLocales\"];\n};\n\n// ---------------------------------------------------------------------------\n// Server-side SSR state uses a registration pattern so this module can be\n// bundled for the browser. The ALS-backed implementation lives in\n// router-state.ts (server-only) and registers itself on import.\n// ---------------------------------------------------------------------------\n\nlet _ssrContext: SSRContext | null = null;\n\nlet _getSSRContext = (): SSRContext | null => _ssrContext;\nlet _setSSRContextImpl = (ctx: SSRContext | null): void => {\n _ssrContext = ctx;\n};\n\n/**\n * Register ALS-backed state accessors. Called by router-state.ts on import.\n * @internal\n */\nexport function _registerRouterStateAccessors(accessors: {\n getSSRContext: () => SSRContext | null;\n setSSRContext: (ctx: SSRContext | null) => void;\n}): void {\n _getSSRContext = accessors.getSSRContext;\n _setSSRContextImpl = accessors.setSSRContext;\n}\n\nexport function setSSRContext(ctx: SSRContext | null): void {\n _setSSRContextImpl(ctx);\n}\n\n/**\n * Extract param names from a Next.js route pattern.\n * E.g., \"/posts/[id]\" → [\"id\"], \"/docs/[...slug]\" → [\"slug\"],\n * \"/shop/[[...path]]\" → [\"path\"], \"/blog/[year]/[month]\" → [\"year\", \"month\"]\n * Also handles internal format: \"/posts/:id\" → [\"id\"], \"/docs/:slug+\" → [\"slug\"]\n */\nfunction extractRouteParamNames(pattern: string): string[] {\n const names: string[] = [];\n // Match Next.js bracket format: [id], [...slug], [[...slug]]\n // Accepts any non-] characters inside brackets (Next.js PARAMETER_PATTERN parity).\n const bracketMatches = pattern.matchAll(/\\[{1,2}(?:\\.\\.\\.)?([^\\]]+)\\]{1,2}/g);\n for (const m of bracketMatches) {\n names.push(m[1]);\n }\n if (names.length > 0) return names;\n // Fallback: match internal :param format (any chars except /, +, *)\n const colonMatches = pattern.matchAll(/:([^/+*]+)[+*]?/g);\n for (const m of colonMatches) {\n names.push(m[1]);\n }\n return names;\n}\n\nfunction getPathnameAndQuery(): {\n pathname: string;\n query: Record<string, string | string[]>;\n asPath: string;\n} {\n if (typeof window === \"undefined\") {\n const _ssrCtx = _getSSRContext();\n if (_ssrCtx) {\n const query: Record<string, string | string[]> = {};\n for (const [key, value] of Object.entries(_ssrCtx.query)) {\n query[key] = Array.isArray(value) ? [...value] : value;\n }\n return { pathname: _ssrCtx.pathname, query, asPath: _ssrCtx.asPath };\n }\n return { pathname: \"/\", query: {}, asPath: \"/\" };\n }\n const resolvedPath = stripBasePath(window.location.pathname, __basePath);\n // In Next.js, router.pathname is the route pattern (e.g., \"/posts/[id]\"),\n // not the resolved path (\"/posts/42\"). __NEXT_DATA__.page holds the route\n // pattern and is updated by navigateClient() on every client-side navigation.\n const pathname = window.__NEXT_DATA__?.page ?? resolvedPath;\n const routeQuery: Record<string, string | string[]> = {};\n // Include dynamic route params from __NEXT_DATA__ (e.g., { id: \"42\" } from /posts/[id]).\n // Only include keys that are part of the route pattern (not stale query params).\n const nextData = window.__NEXT_DATA__;\n if (nextData && nextData.query && nextData.page) {\n const routeParamNames = extractRouteParamNames(nextData.page);\n for (const key of routeParamNames) {\n const value = nextData.query[key];\n if (typeof value === \"string\") {\n routeQuery[key] = value;\n } else if (Array.isArray(value)) {\n routeQuery[key] = [...value];\n }\n }\n }\n // URL search params always reflect the current URL\n const searchQuery: Record<string, string | string[]> = {};\n const params = new URLSearchParams(window.location.search);\n for (const [key, value] of params) {\n addQueryParam(searchQuery, key, value);\n }\n const query = { ...searchQuery, ...routeQuery };\n // asPath uses the resolved browser path, not the route pattern\n const asPath = resolvedPath + window.location.search + window.location.hash;\n return { pathname, query, asPath };\n}\n\n/**\n * Error thrown when a navigation is superseded by a newer one.\n * Matches Next.js's convention of an Error with `.cancelled = true`.\n */\nclass NavigationCancelledError extends Error {\n cancelled = true;\n constructor(route: string) {\n super(`Abort fetching component for route: \"${route}\"`);\n this.name = \"NavigationCancelledError\";\n }\n}\n\n/**\n * Error thrown after queueing a hard navigation fallback for a known failure\n * mode. Callers can use this to avoid scheduling the same hard navigation twice.\n */\nclass HardNavigationScheduledError extends Error {\n hardNavigationScheduled = true;\n constructor(message: string) {\n super(message);\n this.name = \"HardNavigationScheduledError\";\n }\n}\n\n/**\n * Monotonically increasing ID for tracking the current navigation.\n * Each call to navigateClient() increments this and captures the value.\n * After each async boundary, the navigation checks whether it is still\n * the active one. If a newer navigation has started, the stale one\n * throws NavigationCancelledError so the caller can emit routeChangeError\n * and skip routeChangeComplete.\n *\n * Replaces the old boolean `_navInProgress` guard which silently dropped\n * the second navigation, causing URL/content mismatch.\n */\nlet _navigationId = 0;\n\n/** AbortController for the in-flight fetch, so superseded navigations abort network I/O. */\nlet _activeAbortController: AbortController | null = null;\n\nfunction scheduleHardNavigationAndThrow(url: string, message: string): never {\n if (typeof window === \"undefined\") {\n throw new HardNavigationScheduledError(message);\n }\n window.location.href = url;\n throw new HardNavigationScheduledError(message);\n}\n\n/**\n * Perform client-side navigation: fetch the target page's HTML,\n * extract __NEXT_DATA__, and re-render the React root.\n *\n * Throws NavigationCancelledError if a newer navigation supersedes this one.\n * Throws on hard-navigation failures (non-OK response, missing data) so the\n * caller can distinguish success from failure for event emission.\n */\nasync function navigateClient(url: string): Promise<void> {\n if (typeof window === \"undefined\") return;\n\n const root = window.__VINEXT_ROOT__;\n if (!root) {\n // No React root yet — fall back to hard navigation\n window.location.href = url;\n return;\n }\n\n // Cancel any in-flight navigation (abort its fetch, mark it stale)\n _activeAbortController?.abort();\n const controller = new AbortController();\n _activeAbortController = controller;\n\n const navId = ++_navigationId;\n\n /** Check if this navigation is still the active one. If not, throw. */\n function assertStillCurrent(): void {\n if (navId !== _navigationId) {\n throw new NavigationCancelledError(url);\n }\n }\n\n try {\n // Fetch the target page's SSR HTML\n let res: Response;\n try {\n res = await fetch(url, {\n headers: { Accept: \"text/html\" },\n signal: controller.signal,\n });\n } catch (err: unknown) {\n // AbortError means a newer navigation cancelled this fetch\n if (err instanceof DOMException && err.name === \"AbortError\") {\n throw new NavigationCancelledError(url);\n }\n throw err;\n }\n assertStillCurrent();\n\n if (!res.ok) {\n // Set window.location.href first so the browser navigates to the correct\n // page even if the caller suppresses the error. The assignment schedules\n // the navigation asynchronously (as a task), so synchronous routeChangeError\n // listeners still run — and observe the error — before the page unloads.\n // Contract: routeChangeError listeners MUST be synchronous; async listeners\n // will not fire before the navigation completes. Callers (runNavigateClient)\n // must NOT schedule a second hard navigation — this assignment already queues\n // the browser fallback, and the helper-level HardNavigationScheduledError\n // makes that contract explicit to callers.\n scheduleHardNavigationAndThrow(url, `Navigation failed: ${res.status} ${res.statusText}`);\n }\n\n const html = await res.text();\n assertStillCurrent();\n\n // Extract __NEXT_DATA__ from the HTML\n const match = html.match(/<script>window\\.__NEXT_DATA__\\s*=\\s*(.*?)<\\/script>/);\n if (!match) {\n scheduleHardNavigationAndThrow(url, \"Navigation failed: missing __NEXT_DATA__ in response\");\n }\n\n const nextData = JSON.parse(match[1]);\n const { pageProps } = nextData.props;\n // Defer writing window.__NEXT_DATA__ until just before root.render() —\n // writing it here would let a stale navigation briefly pollute the global\n // between this assertStillCurrent() and the next one after await import().\n\n // Get the page module URL from __NEXT_DATA__.__vinext (preferred),\n // or fall back to parsing the hydration script\n let pageModuleUrl: string | undefined = nextData.__vinext?.pageModuleUrl;\n\n if (!pageModuleUrl) {\n // Legacy fallback: try to find the module URL in the inline script\n const moduleMatch = html.match(/import\\(\"([^\"]+)\"\\);\\s*\\n\\s*const PageComponent/);\n const altMatch = html.match(/await import\\(\"([^\"]+pages\\/[^\"]+)\"\\)/);\n pageModuleUrl = moduleMatch?.[1] ?? altMatch?.[1] ?? undefined;\n }\n\n if (!pageModuleUrl) {\n scheduleHardNavigationAndThrow(url, \"Navigation failed: no page module URL found\");\n }\n\n // Validate the module URL before importing — defense-in-depth against\n // unexpected __NEXT_DATA__ or malformed HTML responses\n if (!isValidModulePath(pageModuleUrl)) {\n console.error(\"[vinext] Blocked import of invalid page module path:\", pageModuleUrl);\n scheduleHardNavigationAndThrow(url, \"Navigation failed: invalid page module path\");\n }\n\n // Dynamically import the new page module\n const pageModule = await import(/* @vite-ignore */ pageModuleUrl);\n assertStillCurrent();\n\n const PageComponent = pageModule.default;\n\n if (!PageComponent) {\n scheduleHardNavigationAndThrow(url, \"Navigation failed: page module has no default export\");\n }\n\n // Import React for createElement\n const React = (await import(\"react\")).default;\n assertStillCurrent();\n\n // Re-render with the new page, loading _app if needed\n let AppComponent = window.__VINEXT_APP__;\n const appModuleUrl: string | undefined = nextData.__vinext?.appModuleUrl;\n\n if (!AppComponent && appModuleUrl) {\n if (!isValidModulePath(appModuleUrl)) {\n console.error(\"[vinext] Blocked import of invalid app module path:\", appModuleUrl);\n } else {\n try {\n const appModule = await import(/* @vite-ignore */ appModuleUrl);\n AppComponent = appModule.default;\n window.__VINEXT_APP__ = AppComponent;\n } catch {\n // _app not available — continue without it\n }\n }\n }\n assertStillCurrent();\n\n let element;\n if (AppComponent) {\n element = React.createElement(AppComponent, {\n Component: PageComponent,\n pageProps,\n });\n } else {\n element = React.createElement(PageComponent, pageProps);\n }\n\n // Wrap with RouterContext.Provider so next/compat/router works\n element = wrapWithRouterContext(element);\n\n // Commit __NEXT_DATA__ only after all assertStillCurrent() checks have passed,\n // so a stale navigation can never pollute the global.\n // INVARIANT: Everything after the final assertStillCurrent() above (the\n // checkpoint immediately after the optional _app import) through\n // root.render() is synchronous. If any step here ever becomes async, add\n // another assertStillCurrent() before writing __NEXT_DATA__.\n window.__NEXT_DATA__ = nextData;\n root.render(element);\n } finally {\n // Clean up the abort controller if this navigation is still the active one\n if (navId === _navigationId) {\n _activeAbortController = null;\n }\n }\n}\n\n/**\n * Run navigateClient and handle errors: emit routeChangeError on failure,\n * and fall back to a hard navigation for non-cancel errors so the browser\n * recovers to a consistent state.\n *\n * Returns:\n * - \"completed\" — navigation finished, caller should emit routeChangeComplete\n * - \"cancelled\" — superseded by a newer navigation, caller should return true\n * without emitting routeChangeComplete (matches Next.js behaviour)\n * - \"failed\" — genuine error, caller should return false (hard nav is already\n * scheduled as recovery)\n */\nasync function runNavigateClient(\n fullUrl: string,\n resolvedUrl: string,\n): Promise<\"completed\" | \"cancelled\" | \"failed\"> {\n try {\n await navigateClient(fullUrl);\n return \"completed\";\n } catch (err: unknown) {\n routerEvents.emit(\"routeChangeError\", err, resolvedUrl, { shallow: false });\n if (err instanceof NavigationCancelledError) {\n return \"cancelled\";\n }\n // Genuine error (network, parse, import failure): fall back to a hard\n // navigation so the browser lands on the correct page. Known failure modes\n // throw HardNavigationScheduledError, and this guard skips those; only\n // unexpected failures (parse, import, render) need recovery here.\n if (typeof window !== \"undefined\" && !(err instanceof HardNavigationScheduledError)) {\n window.location.href = fullUrl;\n }\n return \"failed\";\n }\n}\n\n/**\n * Build the full router value object from the current pathname, query, asPath,\n * and a set of navigation methods. Shared by useRouter() (which passes\n * hook-derived callbacks) and wrapWithRouterContext() (which passes the Router\n * singleton methods) so the shape stays in sync.\n */\nfunction buildRouterValue(\n pathname: string,\n query: Record<string, string | string[]>,\n asPath: string,\n methods: {\n push: NextRouter[\"push\"];\n replace: NextRouter[\"replace\"];\n back: NextRouter[\"back\"];\n reload: NextRouter[\"reload\"];\n prefetch: NextRouter[\"prefetch\"];\n beforePopState: NextRouter[\"beforePopState\"];\n },\n): NextRouter {\n const _ssrState = _getSSRContext();\n const nextData =\n typeof window !== \"undefined\"\n ? (window.__NEXT_DATA__ as VinextNextData | undefined)\n : undefined;\n const locale = typeof window === \"undefined\" ? _ssrState?.locale : window.__VINEXT_LOCALE__;\n const locales = typeof window === \"undefined\" ? _ssrState?.locales : window.__VINEXT_LOCALES__;\n const defaultLocale =\n typeof window === \"undefined\" ? _ssrState?.defaultLocale : window.__VINEXT_DEFAULT_LOCALE__;\n const domainLocales =\n typeof window === \"undefined\" ? _ssrState?.domainLocales : nextData?.domainLocales;\n\n const route = typeof window !== \"undefined\" ? (nextData?.page ?? pathname) : pathname;\n\n return {\n pathname,\n route,\n query,\n asPath,\n basePath: __basePath,\n locale,\n locales,\n defaultLocale,\n domainLocales,\n isReady: true,\n isPreview: false,\n isFallback: typeof window !== \"undefined\" && nextData?.isFallback === true,\n ...methods,\n events: routerEvents,\n };\n}\n\n/**\n * useRouter hook - Pages Router compatible.\n */\nexport function useRouter(): NextRouter {\n const [{ pathname, query, asPath }, setState] = useState(getPathnameAndQuery);\n\n // Popstate is handled by the module-level listener below so beforePopState()\n // is consistently enforced even when multiple components mount useRouter().\n useEffect(() => {\n const onNavigate = ((_e: CustomEvent) => {\n setState(getPathnameAndQuery());\n }) as EventListener;\n window.addEventListener(\"vinext:navigate\", onNavigate);\n return () => window.removeEventListener(\"vinext:navigate\", onNavigate);\n }, []);\n\n const push = useCallback(\n async (url: string | UrlObject, as?: string, options?: TransitionOptions): Promise<boolean> => {\n let resolved = resolveNavigationTarget(url, as, options?.locale);\n\n // External URLs — delegate to browser (unless same-origin)\n if (isExternalUrl(resolved)) {\n const localPath = toSameOriginAppPath(resolved, __basePath);\n if (localPath == null) {\n window.location.assign(resolved);\n return true;\n }\n resolved = localPath;\n }\n\n const full = toBrowserNavigationHref(resolved, window.location.href, __basePath);\n\n // Hash-only change — no page fetch needed\n if (isHashOnlyChange(resolved)) {\n const eventUrl = resolveHashUrl(resolved);\n routerEvents.emit(\"hashChangeStart\", eventUrl, {\n shallow: options?.shallow ?? false,\n });\n const hash = resolved.includes(\"#\") ? resolved.slice(resolved.indexOf(\"#\")) : \"\";\n window.history.pushState({}, \"\", resolved.startsWith(\"#\") ? resolved : full);\n _lastPathnameAndSearch = window.location.pathname + window.location.search;\n scrollToHash(hash);\n setState(getPathnameAndQuery());\n routerEvents.emit(\"hashChangeComplete\", eventUrl, {\n shallow: options?.shallow ?? false,\n });\n window.dispatchEvent(new CustomEvent(\"vinext:navigate\"));\n return true;\n }\n\n saveScrollPosition();\n routerEvents.emit(\"routeChangeStart\", resolved, { shallow: options?.shallow ?? false });\n routerEvents.emit(\"beforeHistoryChange\", resolved, { shallow: options?.shallow ?? false });\n window.history.pushState({}, \"\", full);\n _lastPathnameAndSearch = window.location.pathname + window.location.search;\n if (!options?.shallow) {\n const result = await runNavigateClient(full, resolved);\n if (result === \"cancelled\") return true;\n if (result === \"failed\") return false;\n }\n setState(getPathnameAndQuery());\n routerEvents.emit(\"routeChangeComplete\", resolved, { shallow: options?.shallow ?? false });\n\n // Scroll: handle hash target, else scroll to top unless scroll:false\n const hash = resolved.includes(\"#\") ? resolved.slice(resolved.indexOf(\"#\")) : \"\";\n if (hash) {\n scrollToHash(hash);\n } else if (options?.scroll !== false) {\n window.scrollTo(0, 0);\n }\n window.dispatchEvent(new CustomEvent(\"vinext:navigate\"));\n return true;\n },\n [],\n );\n\n const replace = useCallback(\n async (url: string | UrlObject, as?: string, options?: TransitionOptions): Promise<boolean> => {\n let resolved = resolveNavigationTarget(url, as, options?.locale);\n\n // External URLs — delegate to browser (unless same-origin)\n if (isExternalUrl(resolved)) {\n const localPath = toSameOriginAppPath(resolved, __basePath);\n if (localPath == null) {\n window.location.replace(resolved);\n return true;\n }\n resolved = localPath;\n }\n\n const full = toBrowserNavigationHref(resolved, window.location.href, __basePath);\n\n // Hash-only change — no page fetch needed\n if (isHashOnlyChange(resolved)) {\n const eventUrl = resolveHashUrl(resolved);\n routerEvents.emit(\"hashChangeStart\", eventUrl, {\n shallow: options?.shallow ?? false,\n });\n const hash = resolved.includes(\"#\") ? resolved.slice(resolved.indexOf(\"#\")) : \"\";\n window.history.replaceState({}, \"\", resolved.startsWith(\"#\") ? resolved : full);\n _lastPathnameAndSearch = window.location.pathname + window.location.search;\n scrollToHash(hash);\n setState(getPathnameAndQuery());\n routerEvents.emit(\"hashChangeComplete\", eventUrl, {\n shallow: options?.shallow ?? false,\n });\n window.dispatchEvent(new CustomEvent(\"vinext:navigate\"));\n return true;\n }\n\n routerEvents.emit(\"routeChangeStart\", resolved, { shallow: options?.shallow ?? false });\n routerEvents.emit(\"beforeHistoryChange\", resolved, { shallow: options?.shallow ?? false });\n window.history.replaceState({}, \"\", full);\n _lastPathnameAndSearch = window.location.pathname + window.location.search;\n if (!options?.shallow) {\n const result = await runNavigateClient(full, resolved);\n if (result === \"cancelled\") return true;\n if (result === \"failed\") return false;\n }\n setState(getPathnameAndQuery());\n routerEvents.emit(\"routeChangeComplete\", resolved, { shallow: options?.shallow ?? false });\n\n // Scroll: handle hash target, else scroll to top unless scroll:false\n const hash = resolved.includes(\"#\") ? resolved.slice(resolved.indexOf(\"#\")) : \"\";\n if (hash) {\n scrollToHash(hash);\n } else if (options?.scroll !== false) {\n window.scrollTo(0, 0);\n }\n window.dispatchEvent(new CustomEvent(\"vinext:navigate\"));\n return true;\n },\n [],\n );\n\n const back = useCallback(() => {\n window.history.back();\n }, []);\n\n const reload = useCallback(() => {\n window.location.reload();\n }, []);\n\n const prefetch = useCallback(async (url: string): Promise<void> => {\n // Inject a <link rel=\"prefetch\"> for the target page\n if (typeof document !== \"undefined\") {\n const link = document.createElement(\"link\");\n link.rel = \"prefetch\";\n link.href = url;\n link.as = \"document\";\n document.head.appendChild(link);\n }\n }, []);\n\n const router = useMemo(\n (): NextRouter =>\n buildRouterValue(pathname, query, asPath, {\n push,\n replace,\n back,\n reload,\n prefetch,\n beforePopState: (cb: BeforePopStateCallback) => {\n _beforePopStateCb = cb;\n },\n }),\n [pathname, query, asPath, push, replace, back, reload, prefetch],\n );\n\n return router;\n}\n\n// beforePopState callback: called before handling browser back/forward.\n// If it returns false, the navigation is cancelled.\nlet _beforePopStateCb: BeforePopStateCallback | undefined;\n\n// Track pathname+search for detecting hash-only back/forward in the popstate\n// handler. Updated after every pushState/replaceState so that popstate can\n// compare the previous value with the (already-changed) window.location.\nlet _lastPathnameAndSearch =\n typeof window !== \"undefined\" ? window.location.pathname + window.location.search : \"\";\n\n// Module-level popstate listener: handles browser back/forward by re-rendering\n// the React root with the page at the new URL. This runs regardless of whether\n// any component calls useRouter().\nif (typeof window !== \"undefined\") {\n window.addEventListener(\"popstate\", (e: PopStateEvent) => {\n const browserUrl = window.location.pathname + window.location.search;\n const appUrl = stripBasePath(window.location.pathname, __basePath) + window.location.search;\n\n // Detect hash-only back/forward: pathname+search unchanged, only hash differs.\n const isHashOnly = browserUrl === _lastPathnameAndSearch;\n\n // Check beforePopState callback\n if (_beforePopStateCb !== undefined) {\n const shouldContinue = (_beforePopStateCb as BeforePopStateCallback)({\n url: appUrl,\n as: appUrl,\n options: { shallow: false },\n });\n if (!shouldContinue) return;\n }\n\n // Update tracker only after beforePopState confirms navigation proceeds.\n // If beforePopState cancels, the tracker must retain the previous value\n // so the next popstate compares against the correct baseline.\n _lastPathnameAndSearch = browserUrl;\n\n if (isHashOnly) {\n // Hash-only back/forward — no page fetch needed\n const hashUrl = appUrl + window.location.hash;\n routerEvents.emit(\"hashChangeStart\", hashUrl, { shallow: false });\n scrollToHash(window.location.hash);\n routerEvents.emit(\"hashChangeComplete\", hashUrl, { shallow: false });\n window.dispatchEvent(new CustomEvent(\"vinext:navigate\"));\n return;\n }\n\n const fullAppUrl = appUrl + window.location.hash;\n routerEvents.emit(\"routeChangeStart\", fullAppUrl, { shallow: false });\n // Note: The browser has already updated window.location by the time popstate\n // fires, so this is not truly \"before\" the URL change. In Next.js the popstate\n // handler calls replaceState to store history metadata — beforeHistoryChange\n // precedes that call, not the URL change itself. We emit it here for API\n // compatibility.\n routerEvents.emit(\"beforeHistoryChange\", fullAppUrl, { shallow: false });\n void (async () => {\n const result = await runNavigateClient(browserUrl, fullAppUrl);\n if (result === \"completed\") {\n routerEvents.emit(\"routeChangeComplete\", fullAppUrl, { shallow: false });\n restoreScrollPosition(e.state);\n window.dispatchEvent(new CustomEvent(\"vinext:navigate\"));\n }\n // \"cancelled\": superseded by a newer navigation, so this popstate no longer wins.\n // \"failed\": runNavigateClient already scheduled the hard-navigation fallback.\n })();\n });\n}\n\n/**\n * Wrap a React element in a RouterContext.Provider so that\n * next/compat/router's useRouter() returns the real Pages Router value.\n *\n * This is a plain function, NOT a React component — it builds the router\n * value object directly from the current SSR context (server) or\n * window.location + Router singleton (client), avoiding duplicate state\n * that a hook-based component would create.\n */\nexport function wrapWithRouterContext(element: ReactElement): ReactElement {\n const { pathname, query, asPath } = getPathnameAndQuery();\n\n const routerValue = buildRouterValue(pathname, query, asPath, {\n push: Router.push,\n replace: Router.replace,\n back: Router.back,\n reload: Router.reload,\n prefetch: Router.prefetch,\n beforePopState: Router.beforePopState,\n });\n\n return createElement(RouterContext.Provider, { value: routerValue }, element) as ReactElement;\n}\n\n// Also export a default Router singleton for `import Router from 'next/router'`\nconst Router = {\n push: async (url: string | UrlObject, as?: string, options?: TransitionOptions) => {\n let resolved = resolveNavigationTarget(url, as, options?.locale);\n\n // External URLs (unless same-origin)\n if (isExternalUrl(resolved)) {\n const localPath = toSameOriginAppPath(resolved, __basePath);\n if (localPath == null) {\n window.location.assign(resolved);\n return true;\n }\n resolved = localPath;\n }\n\n const full = toBrowserNavigationHref(resolved, window.location.href, __basePath);\n\n // Hash-only change\n if (isHashOnlyChange(resolved)) {\n const eventUrl = resolveHashUrl(resolved);\n routerEvents.emit(\"hashChangeStart\", eventUrl, {\n shallow: options?.shallow ?? false,\n });\n const hash = resolved.includes(\"#\") ? resolved.slice(resolved.indexOf(\"#\")) : \"\";\n window.history.pushState({}, \"\", resolved.startsWith(\"#\") ? resolved : full);\n _lastPathnameAndSearch = window.location.pathname + window.location.search;\n scrollToHash(hash);\n routerEvents.emit(\"hashChangeComplete\", eventUrl, {\n shallow: options?.shallow ?? false,\n });\n window.dispatchEvent(new CustomEvent(\"vinext:navigate\"));\n return true;\n }\n\n saveScrollPosition();\n routerEvents.emit(\"routeChangeStart\", resolved, { shallow: options?.shallow ?? false });\n routerEvents.emit(\"beforeHistoryChange\", resolved, { shallow: options?.shallow ?? false });\n window.history.pushState({}, \"\", full);\n _lastPathnameAndSearch = window.location.pathname + window.location.search;\n if (!options?.shallow) {\n const result = await runNavigateClient(full, resolved);\n if (result === \"cancelled\") return true;\n if (result === \"failed\") return false;\n }\n routerEvents.emit(\"routeChangeComplete\", resolved, { shallow: options?.shallow ?? false });\n\n const hash = resolved.includes(\"#\") ? resolved.slice(resolved.indexOf(\"#\")) : \"\";\n if (hash) {\n scrollToHash(hash);\n } else if (options?.scroll !== false) {\n window.scrollTo(0, 0);\n }\n window.dispatchEvent(new CustomEvent(\"vinext:navigate\"));\n return true;\n },\n replace: async (url: string | UrlObject, as?: string, options?: TransitionOptions) => {\n let resolved = resolveNavigationTarget(url, as, options?.locale);\n\n // External URLs (unless same-origin)\n if (isExternalUrl(resolved)) {\n const localPath = toSameOriginAppPath(resolved, __basePath);\n if (localPath == null) {\n window.location.replace(resolved);\n return true;\n }\n resolved = localPath;\n }\n\n const full = toBrowserNavigationHref(resolved, window.location.href, __basePath);\n\n // Hash-only change\n if (isHashOnlyChange(resolved)) {\n const eventUrl = resolveHashUrl(resolved);\n routerEvents.emit(\"hashChangeStart\", eventUrl, {\n shallow: options?.shallow ?? false,\n });\n const hash = resolved.includes(\"#\") ? resolved.slice(resolved.indexOf(\"#\")) : \"\";\n window.history.replaceState({}, \"\", resolved.startsWith(\"#\") ? resolved : full);\n _lastPathnameAndSearch = window.location.pathname + window.location.search;\n scrollToHash(hash);\n routerEvents.emit(\"hashChangeComplete\", eventUrl, {\n shallow: options?.shallow ?? false,\n });\n window.dispatchEvent(new CustomEvent(\"vinext:navigate\"));\n return true;\n }\n\n routerEvents.emit(\"routeChangeStart\", resolved, { shallow: options?.shallow ?? false });\n routerEvents.emit(\"beforeHistoryChange\", resolved, { shallow: options?.shallow ?? false });\n window.history.replaceState({}, \"\", full);\n _lastPathnameAndSearch = window.location.pathname + window.location.search;\n if (!options?.shallow) {\n const result = await runNavigateClient(full, resolved);\n if (result === \"cancelled\") return true;\n if (result === \"failed\") return false;\n }\n routerEvents.emit(\"routeChangeComplete\", resolved, { shallow: options?.shallow ?? false });\n\n const hash = resolved.includes(\"#\") ? resolved.slice(resolved.indexOf(\"#\")) : \"\";\n if (hash) {\n scrollToHash(hash);\n } else if (options?.scroll !== false) {\n window.scrollTo(0, 0);\n }\n window.dispatchEvent(new CustomEvent(\"vinext:navigate\"));\n return true;\n },\n back: () => window.history.back(),\n reload: () => window.location.reload(),\n prefetch: async (url: string) => {\n if (typeof document !== \"undefined\") {\n const link = document.createElement(\"link\");\n link.rel = \"prefetch\";\n link.href = url;\n link.as = \"document\";\n document.head.appendChild(link);\n }\n },\n beforePopState: (cb: BeforePopStateCallback) => {\n _beforePopStateCb = cb;\n },\n events: routerEvents,\n};\n\nexport default Router;\n"],"mappings":"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"}
|
package/dist/shims/server.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
import { stripBasePath } from "../utils/base-path.js";
|
|
1
2
|
import { getRequestExecutionContext } from "./request-context.js";
|
|
2
3
|
import { encodeMiddlewareRequestHeaders } from "../server/middleware-request-headers.js";
|
|
4
|
+
import { serializeSetCookie, validateCookieName } from "./internal/cookie-serialize.js";
|
|
3
5
|
import { parseCookieHeader } from "./internal/parse-cookie-header.js";
|
|
4
6
|
import { assertSafeNavigationUrl } from "./url-safety.js";
|
|
5
7
|
//#region src/shims/server.ts
|
|
@@ -199,8 +201,7 @@ var NextURL = class NextURL {
|
|
|
199
201
|
/** Strip basePath prefix from the internal pathname. */
|
|
200
202
|
_stripBasePath() {
|
|
201
203
|
if (!this._basePath) return;
|
|
202
|
-
|
|
203
|
-
if (pathname === this._basePath || pathname.startsWith(this._basePath + "/")) this._url.pathname = pathname.slice(this._basePath.length) || "/";
|
|
204
|
+
this._url.pathname = stripBasePath(this._url.pathname, this._basePath);
|
|
204
205
|
}
|
|
205
206
|
/** Extract locale from pathname, stripping it from the internal URL. */
|
|
206
207
|
_analyzeLocale(locales) {
|
|
@@ -454,20 +455,6 @@ function sealRequestCookies(cookies) {
|
|
|
454
455
|
return typeof value === "function" ? value.bind(target) : value;
|
|
455
456
|
} });
|
|
456
457
|
}
|
|
457
|
-
/**
|
|
458
|
-
* RFC 6265 §4.1.1: cookie-name is a token (RFC 2616 §2.2).
|
|
459
|
-
* Allowed: any visible ASCII (0x21-0x7E) except separators: ()<>@,;:\"/[]?={}
|
|
460
|
-
*/
|
|
461
|
-
const VALID_COOKIE_NAME_RE = /^[\x21\x23-\x27\x2A\x2B\x2D\x2E\x30-\x39\x41-\x5A\x5E-\x7A\x7C\x7E]+$/;
|
|
462
|
-
function validateCookieName(name) {
|
|
463
|
-
if (!name || !VALID_COOKIE_NAME_RE.test(name)) throw new Error(`Invalid cookie name: ${JSON.stringify(name)}`);
|
|
464
|
-
}
|
|
465
|
-
function validateCookieAttributeValue(value, attributeName) {
|
|
466
|
-
for (let i = 0; i < value.length; i++) {
|
|
467
|
-
const code = value.charCodeAt(i);
|
|
468
|
-
if (code <= 31 || code === 127 || value[i] === ";") throw new Error(`Invalid cookie ${attributeName} value: ${JSON.stringify(value)}`);
|
|
469
|
-
}
|
|
470
|
-
}
|
|
471
458
|
var ResponseCookies = class {
|
|
472
459
|
_headers;
|
|
473
460
|
/** Internal map keyed by cookie name — single source of truth. */
|
|
@@ -498,21 +485,9 @@ var ResponseCookies = class {
|
|
|
498
485
|
set(...args) {
|
|
499
486
|
const [name, value, opts] = parseCookieSetArgs(args);
|
|
500
487
|
validateCookieName(name);
|
|
501
|
-
const
|
|
502
|
-
const path = opts?.path ?? "/";
|
|
503
|
-
validateCookieAttributeValue(path, "Path");
|
|
504
|
-
parts.push(`Path=${path}`);
|
|
505
|
-
if (opts?.domain) {
|
|
506
|
-
validateCookieAttributeValue(opts.domain, "Domain");
|
|
507
|
-
parts.push(`Domain=${opts.domain}`);
|
|
508
|
-
}
|
|
509
|
-
if (opts?.maxAge !== void 0) parts.push(`Max-Age=${opts.maxAge}`);
|
|
510
|
-
if (opts?.expires) parts.push(`Expires=${opts.expires.toUTCString()}`);
|
|
511
|
-
if (opts?.httpOnly) parts.push("HttpOnly");
|
|
512
|
-
if (opts?.secure) parts.push("Secure");
|
|
513
|
-
if (opts?.sameSite) parts.push(`SameSite=${opts.sameSite}`);
|
|
488
|
+
const serialized = serializeSetCookie(name, value, opts);
|
|
514
489
|
this._parsed.set(name, {
|
|
515
|
-
serialized
|
|
490
|
+
serialized,
|
|
516
491
|
entry: {
|
|
517
492
|
name,
|
|
518
493
|
value
|
package/dist/shims/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","names":[],"sources":["../../src/shims/server.ts"],"sourcesContent":["/**\n * next/server shim\n *\n * Provides NextRequest, NextResponse, and related types that work with\n * standard Web APIs (Request/Response). This means they work on Node,\n * Cloudflare Workers, Deno, and any WinterCG-compatible runtime.\n *\n * This is a pragmatic subset — we implement the most commonly used APIs\n * rather than bug-for-bug parity with Next.js internals.\n */\n\nimport { encodeMiddlewareRequestHeaders } from \"../server/middleware-request-headers.js\";\nimport { parseCookieHeader } from \"./internal/parse-cookie-header.js\";\nimport { getRequestExecutionContext } from \"./request-context.js\";\nimport { assertSafeNavigationUrl } from \"./url-safety.js\";\n\n// ---------------------------------------------------------------------------\n// Inlined cache-scope guard for after()\n//\n// We cannot statically import throwIfInsideCacheScope from headers.ts here\n// because headers.ts contains the \"use cache\" directive string in its error\n// message, which causes Vite's use-cache transform to include it in the module\n// graph. If headers.ts is pulled in via static import from server.ts, the\n// transform fires on it in Pages Router fixtures that lack @vitejs/plugin-rsc.\n//\n// The connection() function in this file avoids the same problem by using\n// `await import(\"./headers.js\")` (dynamic import, async function). after()\n// must remain synchronous, so we inline the check using the same Symbol.for\n// keys that cache-runtime.ts and cache.ts register their ALS instances with.\n// ---------------------------------------------------------------------------\n\nconst _USE_CACHE_ALS_KEY = Symbol.for(\"vinext.cacheRuntime.contextAls\");\nconst _UNSTABLE_CACHE_ALS_KEY = Symbol.for(\"vinext.unstableCache.als\");\nconst _g = globalThis as unknown as Record<PropertyKey, unknown>;\n\n/**\n * Record an invalid dynamic usage error on the request context so it survives\n * user try/catch and can be forwarded to the dev overlay on client-side navigations.\n */\nfunction _recordInvalidDynamicUsageError(error: Error): void {\n try {\n const _unifiedAls = _g[Symbol.for(\"vinext.unifiedRequestContext.als\")] as\n | { getStore(): unknown }\n | undefined;\n const ctx = _unifiedAls?.getStore() as Record<string, unknown> | undefined;\n if (ctx) ctx.invalidDynamicUsageError = error;\n } catch {\n // Ignore — best-effort recording for dev diagnostics\n }\n}\n\nfunction _throwIfInsideCacheScope(apiName: string): void {\n const cacheAls = _g[_USE_CACHE_ALS_KEY] as { getStore(): unknown } | undefined;\n if (cacheAls?.getStore() != null) {\n const error = new Error(\n `\\`${apiName}\\` cannot be called inside \"use cache\". ` +\n `If you need this data inside a cached function, call \\`${apiName}\\` ` +\n \"outside and pass the required data as an argument.\",\n );\n _recordInvalidDynamicUsageError(error);\n throw error;\n }\n const unstableAls = _g[_UNSTABLE_CACHE_ALS_KEY] as { getStore(): unknown } | undefined;\n if (unstableAls?.getStore() === true) {\n const error = new Error(\n `\\`${apiName}\\` cannot be called inside a function cached with \\`unstable_cache()\\`. ` +\n `If you need this data inside a cached function, call \\`${apiName}\\` ` +\n \"outside and pass the required data as an argument.\",\n );\n _recordInvalidDynamicUsageError(error);\n throw error;\n }\n}\n\n// ---------------------------------------------------------------------------\n// NextRequest\n// ---------------------------------------------------------------------------\n\nexport class NextRequest extends Request {\n private _nextUrl: NextURL;\n private _url: string;\n private _cookies: RequestCookies;\n\n constructor(\n input: URL | RequestInfo,\n init?: RequestInit & {\n nextConfig?: {\n basePath?: string;\n i18n?: { locales: string[]; defaultLocale: string };\n };\n },\n ) {\n // Strip nextConfig before passing to super() — it's vinext-internal,\n // not a valid RequestInit property.\n const { nextConfig: _nextConfig, ...requestInit } = init ?? {};\n // Handle the case where input is a Request object - we need to extract URL and init\n // to avoid Node.js undici issues with passing Request objects directly to super()\n if (input instanceof Request) {\n const req = input;\n super(req.url, {\n method: req.method,\n headers: req.headers,\n body: req.body,\n // @ts-expect-error - duplex is not in RequestInit type but needed for streams\n duplex: req.body ? \"half\" : undefined,\n ...requestInit,\n });\n } else {\n super(input, requestInit);\n }\n const url =\n typeof input === \"string\"\n ? new URL(input, \"http://localhost\")\n : input instanceof URL\n ? input\n : new URL(input.url, \"http://localhost\");\n const urlConfig: NextURLConfig | undefined = _nextConfig\n ? { basePath: _nextConfig.basePath, nextConfig: { i18n: _nextConfig.i18n } }\n : undefined;\n this._nextUrl = new NextURL(url, undefined, urlConfig);\n this._url = process.env.__NEXT_NO_MIDDLEWARE_URL_NORMALIZE\n ? url.toString()\n : this._nextUrl.toString();\n this._cookies = new RequestCookies(this.headers);\n }\n\n get nextUrl(): NextURL {\n return this._nextUrl;\n }\n\n get url(): string {\n return this._url;\n }\n\n get cookies(): RequestCookies {\n return this._cookies;\n }\n\n /**\n * Client IP address. Prefers Cloudflare's trusted CF-Connecting-IP header\n * over the spoofable X-Forwarded-For. Returns undefined if unavailable.\n */\n get ip(): string | undefined {\n return (\n this.headers.get(\"cf-connecting-ip\") ??\n this.headers.get(\"x-real-ip\") ??\n this.headers.get(\"x-forwarded-for\")?.split(\",\")[0]?.trim() ??\n undefined\n );\n }\n\n /**\n * Geolocation data. Platform-dependent (e.g., Cloudflare, Vercel).\n * Returns undefined if not available.\n */\n get geo():\n | { city?: string; country?: string; region?: string; latitude?: string; longitude?: string }\n | undefined {\n // Check Cloudflare-style headers, Vercel-style headers\n const country =\n this.headers.get(\"cf-ipcountry\") ?? this.headers.get(\"x-vercel-ip-country\") ?? undefined;\n if (!country) return undefined;\n return {\n country,\n city: this.headers.get(\"cf-ipcity\") ?? this.headers.get(\"x-vercel-ip-city\") ?? undefined,\n region:\n this.headers.get(\"cf-region\") ??\n this.headers.get(\"x-vercel-ip-country-region\") ??\n undefined,\n latitude:\n this.headers.get(\"cf-iplatitude\") ?? this.headers.get(\"x-vercel-ip-latitude\") ?? undefined,\n longitude:\n this.headers.get(\"cf-iplongitude\") ??\n this.headers.get(\"x-vercel-ip-longitude\") ??\n undefined,\n };\n }\n\n /**\n * The build ID of the Next.js application.\n * Delegates to `nextUrl.buildId` to match Next.js API surface.\n * Can be used in middleware to detect deployment skew between client and server.\n */\n get buildId(): string | undefined {\n return this._nextUrl.buildId;\n }\n}\n\n// ---------------------------------------------------------------------------\n// NextResponse\n// ---------------------------------------------------------------------------\n\n/** Valid HTTP redirect status codes, matching Next.js's REDIRECTS set. */\nconst REDIRECT_STATUSES = new Set([301, 302, 303, 307, 308]);\n\nfunction validateURL(url: string | URL): string {\n assertSafeNavigationUrl(String(url));\n try {\n return String(new URL(String(url)));\n } catch (error) {\n throw new Error(\n `URL is malformed \"${String(\n url,\n )}\". Please use only absolute URLs - https://nextjs.org/docs/messages/middleware-relative-urls`,\n { cause: error },\n );\n }\n}\n\nexport class NextResponse<_Body = unknown> extends Response {\n private _cookies: ResponseCookies;\n\n constructor(body?: BodyInit | null, init?: ResponseInit) {\n super(body, init);\n this._cookies = new MiddlewareResponseCookies(this.headers);\n }\n\n get cookies(): ResponseCookies {\n return this._cookies;\n }\n\n /**\n * Create a JSON response.\n */\n static json<JsonBody>(body: JsonBody, init?: ResponseInit): NextResponse<JsonBody> {\n const headers = new Headers(init?.headers);\n if (!headers.has(\"content-type\")) {\n headers.set(\"content-type\", \"application/json\");\n }\n return new NextResponse(JSON.stringify(body), {\n ...init,\n headers,\n }) as NextResponse<JsonBody>;\n }\n\n /**\n * Create a redirect response.\n */\n static redirect(url: string | URL, init?: number | ResponseInit): NextResponse {\n const status = typeof init === \"number\" ? init : (init?.status ?? 307);\n if (!REDIRECT_STATUSES.has(status)) {\n throw new RangeError(`Failed to execute \"redirect\" on \"response\": Invalid status code`);\n }\n const headers = new Headers(typeof init === \"object\" ? init?.headers : undefined);\n headers.set(\"Location\", validateURL(url));\n return new NextResponse(null, { status, headers });\n }\n\n /**\n * Create a rewrite response (middleware pattern).\n * Sets the x-middleware-rewrite header.\n */\n static rewrite(destination: string | URL, init?: MiddlewareResponseInit): NextResponse {\n const headers = new Headers(init?.headers);\n headers.set(\"x-middleware-rewrite\", validateURL(destination));\n if (init?.request?.headers) {\n encodeMiddlewareRequestHeaders(headers, init.request.headers);\n }\n return new NextResponse(null, { ...init, headers });\n }\n\n /**\n * Continue to the next handler (middleware pattern).\n * Sets the x-middleware-next header.\n */\n static next(init?: MiddlewareResponseInit): NextResponse {\n const headers = new Headers(init?.headers);\n headers.set(\"x-middleware-next\", \"1\");\n if (init?.request?.headers) {\n encodeMiddlewareRequestHeaders(headers, init.request.headers);\n }\n return new NextResponse(null, { ...init, headers });\n }\n}\n\n// ---------------------------------------------------------------------------\n// NextURL — lightweight URL wrapper with pathname helpers\n// ---------------------------------------------------------------------------\n\nexport type NextURLConfig = {\n basePath?: string;\n nextConfig?: {\n i18n?: {\n locales: string[];\n defaultLocale: string;\n };\n };\n};\n\nexport class NextURL {\n /** Internal URL stores the pathname WITHOUT basePath or locale prefix. */\n private _url: URL;\n private _basePath: string;\n private _locale: string | undefined;\n private _defaultLocale: string | undefined;\n private _locales: string[] | undefined;\n\n constructor(input: string | URL, base?: string | URL, config?: NextURLConfig) {\n this._url = new URL(input.toString(), base);\n this._basePath = config?.basePath ?? \"\";\n this._stripBasePath();\n const i18n = config?.nextConfig?.i18n;\n if (i18n) {\n this._locales = [...i18n.locales];\n this._defaultLocale = i18n.defaultLocale;\n this._analyzeLocale(this._locales);\n }\n }\n\n /** Strip basePath prefix from the internal pathname. */\n private _stripBasePath(): void {\n if (!this._basePath) return;\n const { pathname } = this._url;\n if (pathname === this._basePath || pathname.startsWith(this._basePath + \"/\")) {\n this._url.pathname = pathname.slice(this._basePath.length) || \"/\";\n }\n }\n\n /** Extract locale from pathname, stripping it from the internal URL. */\n private _analyzeLocale(locales: string[]): void {\n const segments = this._url.pathname.split(\"/\");\n const candidate = segments[1]?.toLowerCase();\n const match = locales.find((l) => l.toLowerCase() === candidate);\n if (match) {\n this._locale = match;\n this._url.pathname = \"/\" + segments.slice(2).join(\"/\");\n } else {\n this._locale = this._defaultLocale;\n }\n }\n\n /**\n * Reconstruct the full pathname with basePath + locale prefix.\n * Mirrors Next.js's internal formatPathname().\n */\n private _formatPathname(): string {\n // Build prefix: basePath + locale (skip defaultLocale — Next.js omits it)\n let prefix = this._basePath;\n if (this._locale && this._locale !== this._defaultLocale) {\n prefix += \"/\" + this._locale;\n }\n if (!prefix) return this._url.pathname;\n const inner = this._url.pathname;\n return inner === \"/\" ? prefix : prefix + inner;\n }\n\n get href(): string {\n const formatted = this._formatPathname();\n if (formatted === this._url.pathname) return this._url.href;\n // Replace pathname in href via string slicing — avoids URL allocation.\n // URL.href is always <origin+auth><pathname><search><hash>.\n const { href, pathname, search, hash } = this._url;\n const baseEnd = href.length - pathname.length - search.length - hash.length;\n return href.slice(0, baseEnd) + formatted + search + hash;\n }\n set href(value: string) {\n this._url.href = value;\n this._stripBasePath();\n if (this._locales) this._analyzeLocale(this._locales);\n }\n\n get origin(): string {\n return this._url.origin;\n }\n\n get protocol(): string {\n return this._url.protocol;\n }\n set protocol(value: string) {\n this._url.protocol = value;\n }\n\n get username(): string {\n return this._url.username;\n }\n set username(value: string) {\n this._url.username = value;\n }\n\n get password(): string {\n return this._url.password;\n }\n set password(value: string) {\n this._url.password = value;\n }\n\n get host(): string {\n return this._url.host;\n }\n set host(value: string) {\n this._url.host = value;\n }\n\n get hostname(): string {\n return this._url.hostname;\n }\n set hostname(value: string) {\n this._url.hostname = value;\n }\n\n get port(): string {\n return this._url.port;\n }\n set port(value: string) {\n this._url.port = value;\n }\n\n /** Returns the pathname WITHOUT basePath or locale prefix. */\n get pathname(): string {\n return this._url.pathname;\n }\n set pathname(value: string) {\n this._url.pathname = value;\n }\n\n get search(): string {\n return this._url.search;\n }\n set search(value: string) {\n this._url.search = value;\n }\n\n get searchParams(): URLSearchParams {\n return this._url.searchParams;\n }\n\n get hash(): string {\n return this._url.hash;\n }\n set hash(value: string) {\n this._url.hash = value;\n }\n\n get basePath(): string {\n return this._basePath;\n }\n set basePath(value: string) {\n this._basePath = value === \"\" ? \"\" : value.startsWith(\"/\") ? value : \"/\" + value;\n }\n\n get locale(): string {\n return this._locale ?? \"\";\n }\n set locale(value: string | undefined) {\n if (this._locales) {\n if (!value) {\n this._locale = this._defaultLocale;\n return;\n }\n if (!this._locales.includes(value)) {\n throw new TypeError(\n `The locale \"${value}\" is not in the configured locales: ${this._locales.join(\", \")}`,\n );\n }\n }\n this._locale = this._locales ? value : this._locale;\n }\n\n get defaultLocale(): string | undefined {\n return this._defaultLocale;\n }\n\n get locales(): string[] | undefined {\n return this._locales ? [...this._locales] : undefined;\n }\n\n clone(): NextURL {\n const config: NextURLConfig = {\n basePath: this._basePath,\n nextConfig: this._locales\n ? { i18n: { locales: [...this._locales], defaultLocale: this._defaultLocale! } }\n : undefined,\n };\n // Pass the full href (with locale/basePath re-added) so the constructor\n // can re-analyze and extract locale correctly.\n return new NextURL(this.href, undefined, config);\n }\n\n toString(): string {\n return this.href;\n }\n\n /**\n * The build ID of the Next.js application.\n * Set from `generateBuildId` in next.config.js, or a random UUID if not configured.\n * Can be used in middleware to detect deployment skew between client and server.\n * Matches the Next.js API: `request.nextUrl.buildId`.\n */\n get buildId(): string | undefined {\n return process.env.__VINEXT_BUILD_ID ?? undefined;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Cookie helpers (minimal implementations)\n// ---------------------------------------------------------------------------\n\ntype CookieEntry = {\n name: string;\n value: string;\n};\n\nexport class RequestCookies {\n private _headers: Headers;\n private _parsed: Map<string, string>;\n\n constructor(headers: Headers) {\n this._headers = headers;\n this._parsed = parseCookieHeader(headers.get(\"cookie\") ?? \"\");\n }\n\n get(name: string): CookieEntry | undefined {\n const value = this._parsed.get(name);\n return value !== undefined ? { name, value } : undefined;\n }\n\n getAll(nameOrOptions?: string | CookieEntry): CookieEntry[] {\n const name = typeof nameOrOptions === \"string\" ? nameOrOptions : nameOrOptions?.name;\n return [...this._parsed.entries()]\n .filter(([cookieName]) => name === undefined || cookieName === name)\n .map(([cookieName, value]) => ({ name: cookieName, value }));\n }\n\n has(name: string): boolean {\n return this._parsed.has(name);\n }\n\n set(nameOrOptions: string | CookieEntry, value?: string): this {\n let cookieName: string;\n let cookieValue: string;\n if (typeof nameOrOptions === \"string\") {\n cookieName = nameOrOptions;\n cookieValue = value ?? \"\";\n } else {\n cookieName = nameOrOptions.name;\n cookieValue = nameOrOptions.value;\n }\n validateCookieName(cookieName);\n this._parsed.set(cookieName, cookieValue);\n this._syncHeader();\n return this;\n }\n\n delete(names: string | string[]): boolean | boolean[] {\n if (Array.isArray(names)) {\n const results = names.map((name) => {\n validateCookieName(name);\n return this._parsed.delete(name);\n });\n this._syncHeader();\n return results;\n }\n validateCookieName(names);\n const result = this._parsed.delete(names);\n this._syncHeader();\n return result;\n }\n\n clear(): this {\n this._parsed.clear();\n this._syncHeader();\n return this;\n }\n\n get size(): number {\n return this._parsed.size;\n }\n\n toString(): string {\n return this._serialize();\n }\n\n private _serialize(): string {\n return [...this._parsed.entries()].map(([n, v]) => `${n}=${encodeURIComponent(v)}`).join(\"; \");\n }\n\n private _syncHeader(): void {\n if (this._parsed.size === 0) {\n this._headers.delete(\"cookie\");\n } else {\n this._headers.set(\"cookie\", this._serialize());\n }\n }\n\n [Symbol.iterator](): IterableIterator<[string, CookieEntry]> {\n const entries = this.getAll().map((c) => [c.name, c] as [string, CookieEntry]);\n return entries[Symbol.iterator]();\n }\n}\n\n// Keep this error message in sync with headers.ts. This adapter backs\n// NextRequest cookies, while headers.ts owns the next/headers cookies object.\nclass ReadonlyRequestCookiesError extends Error {\n constructor() {\n super(\n \"Cookies can only be modified in a Server Action or Route Handler. Read more: https://nextjs.org/docs/app/api-reference/functions/cookies#options\",\n );\n }\n\n static callable(this: void): never {\n throw new ReadonlyRequestCookiesError();\n }\n}\n\nconst REQUEST_HEADERS_MUTATING_METHODS = new Set([\"set\", \"delete\", \"append\"]);\n\n// Keep this error message in sync with headers.ts. This adapter backs\n// NextRequest headers in force-static route handlers, while headers.ts owns the\n// next/headers object.\nclass ReadonlyRequestHeadersError extends Error {\n constructor() {\n super(\n \"Headers cannot be modified. Read more: https://nextjs.org/docs/app/api-reference/functions/headers\",\n );\n }\n\n static callable(this: void): never {\n throw new ReadonlyRequestHeadersError();\n }\n}\n\nexport function sealRequestHeaders(headers: Headers): Headers {\n return new Proxy<Headers>(headers, {\n get(target, prop) {\n if (typeof prop === \"string\" && REQUEST_HEADERS_MUTATING_METHODS.has(prop)) {\n return ReadonlyRequestHeadersError.callable;\n }\n\n const value = Reflect.get(target, prop, target);\n return typeof value === \"function\" ? value.bind(target) : value;\n },\n });\n}\n\nexport function sealRequestCookies(cookies: RequestCookies): RequestCookies {\n return new Proxy<RequestCookies>(cookies, {\n get(target, prop) {\n if (prop === \"set\" || prop === \"delete\" || prop === \"clear\") {\n return ReadonlyRequestCookiesError.callable;\n }\n\n const value = Reflect.get(target, prop, target);\n return typeof value === \"function\" ? value.bind(target) : value;\n },\n });\n}\n\n/**\n * RFC 6265 §4.1.1: cookie-name is a token (RFC 2616 §2.2).\n * Allowed: any visible ASCII (0x21-0x7E) except separators: ()<>@,;:\\\"/[]?={}\n */\nconst VALID_COOKIE_NAME_RE =\n /^[\\x21\\x23-\\x27\\x2A\\x2B\\x2D\\x2E\\x30-\\x39\\x41-\\x5A\\x5E-\\x7A\\x7C\\x7E]+$/;\n\nfunction validateCookieName(name: string): void {\n if (!name || !VALID_COOKIE_NAME_RE.test(name)) {\n throw new Error(`Invalid cookie name: ${JSON.stringify(name)}`);\n }\n}\n\nfunction validateCookieAttributeValue(value: string, attributeName: string): void {\n for (let i = 0; i < value.length; i++) {\n const code = value.charCodeAt(i);\n if (code <= 0x1f || code === 0x7f || value[i] === \";\") {\n throw new Error(`Invalid cookie ${attributeName} value: ${JSON.stringify(value)}`);\n }\n }\n}\n\nexport class ResponseCookies {\n private _headers: Headers;\n /** Internal map keyed by cookie name — single source of truth. */\n private _parsed: Map<string, { serialized: string; entry: CookieEntry }> = new Map();\n\n constructor(headers: Headers) {\n this._headers = headers;\n\n // Hydrate internal map from any existing Set-Cookie headers\n for (const header of headers.getSetCookie()) {\n const eq = header.indexOf(\"=\");\n if (eq === -1) continue;\n const cookieName = header.slice(0, eq);\n const semi = header.indexOf(\";\", eq);\n const raw = header.slice(eq + 1, semi === -1 ? undefined : semi);\n let value: string;\n try {\n value = decodeURIComponent(raw);\n } catch {\n value = raw;\n }\n this._parsed.set(cookieName, { serialized: header, entry: { name: cookieName, value } });\n }\n }\n\n set(\n ...args:\n | [name: string, value: string, options?: CookieOptions]\n | [options: CookieOptions & { name: string; value: string }]\n ): this {\n const [name, value, opts] = parseCookieSetArgs(args);\n validateCookieName(name);\n\n const parts = [`${name}=${encodeURIComponent(value)}`];\n const path = opts?.path ?? \"/\";\n validateCookieAttributeValue(path, \"Path\");\n parts.push(`Path=${path}`);\n if (opts?.domain) {\n validateCookieAttributeValue(opts.domain, \"Domain\");\n parts.push(`Domain=${opts.domain}`);\n }\n if (opts?.maxAge !== undefined) parts.push(`Max-Age=${opts.maxAge}`);\n if (opts?.expires) parts.push(`Expires=${opts.expires.toUTCString()}`);\n if (opts?.httpOnly) parts.push(\"HttpOnly\");\n if (opts?.secure) parts.push(\"Secure\");\n if (opts?.sameSite) parts.push(`SameSite=${opts.sameSite}`);\n\n this._parsed.set(name, { serialized: parts.join(\"; \"), entry: { name, value } });\n this._syncHeaders();\n return this;\n }\n\n get(...args: [name: string] | [options: { name: string }]): CookieEntry | undefined {\n const key = typeof args[0] === \"string\" ? args[0] : args[0].name;\n return this._parsed.get(key)?.entry;\n }\n\n has(name: string): boolean {\n return this._parsed.has(name);\n }\n\n getAll(...args: [name: string] | [options: { name: string }] | []): CookieEntry[] {\n const all = [...this._parsed.values()].map((v) => v.entry);\n if (args.length === 0) return all;\n const key = typeof args[0] === \"string\" ? args[0] : args[0].name;\n return all.filter((c) => c.name === key);\n }\n\n delete(\n ...args:\n | [name: string]\n | [options: Omit<CookieOptions & { name: string }, \"maxAge\" | \"expires\">]\n ): this {\n const [name, opts] =\n typeof args[0] === \"string\" ? [args[0], undefined] : [args[0].name, args[0]];\n return this.set({\n name,\n value: \"\",\n expires: new Date(0),\n path: opts?.path,\n domain: opts?.domain,\n httpOnly: opts?.httpOnly,\n secure: opts?.secure,\n sameSite: opts?.sameSite,\n });\n }\n\n [Symbol.iterator](): IterableIterator<[string, CookieEntry]> {\n const entries: [string, CookieEntry][] = [...this._parsed.values()].map((v) => [\n v.entry.name,\n v.entry,\n ]);\n return entries[Symbol.iterator]();\n }\n\n /** Delete all Set-Cookie headers and re-append from the internal map. */\n private _syncHeaders(): void {\n this._headers.delete(\"Set-Cookie\");\n for (const { serialized } of this._parsed.values()) {\n this._headers.append(\"Set-Cookie\", serialized);\n }\n }\n}\n\nclass MiddlewareResponseCookies extends ResponseCookies {\n private _responseHeaders: Headers;\n\n constructor(headers: Headers) {\n super(headers);\n this._responseHeaders = headers;\n }\n\n override set(\n ...args:\n | [name: string, value: string, options?: CookieOptions]\n | [options: CookieOptions & { name: string; value: string }]\n ): this {\n super.set(...args);\n this._syncMiddlewareCookieHeader();\n return this;\n }\n\n override delete(\n ...args:\n | [name: string]\n | [options: Omit<CookieOptions & { name: string }, \"maxAge\" | \"expires\">]\n ): this {\n super.delete(...args);\n this._syncMiddlewareCookieHeader();\n return this;\n }\n\n private _syncMiddlewareCookieHeader(): void {\n const cookies = this._responseHeaders.getSetCookie();\n if (cookies.length === 0) {\n this._responseHeaders.delete(\"x-middleware-set-cookie\");\n return;\n }\n\n this._responseHeaders.set(\"x-middleware-set-cookie\", cookies.join(\",\"));\n }\n}\n\ntype CookieOptions = {\n path?: string;\n domain?: string;\n maxAge?: number;\n expires?: Date;\n httpOnly?: boolean;\n secure?: boolean;\n sameSite?: \"Strict\" | \"Lax\" | \"None\";\n};\n\n/**\n * Parse the overloaded arguments for ResponseCookies.set():\n * - (name, value, options?) — positional form\n * - ({ name, value, ...options }) — object form\n */\nfunction parseCookieSetArgs(\n args:\n | [name: string, value: string, options?: CookieOptions]\n | [options: CookieOptions & { name: string; value: string }],\n): [string, string, CookieOptions | undefined] {\n if (typeof args[0] === \"string\") {\n return [args[0], args[1] as string, args[2] as CookieOptions | undefined];\n }\n const { name, value, ...opts } = args[0];\n return [name, value, opts as CookieOptions];\n}\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type MiddlewareResponseInit = {\n request?: {\n headers?: Headers;\n };\n} & ResponseInit;\n\nexport type NextMiddlewareResult = NextResponse | Response | null | undefined | void;\n\nexport type NextMiddleware = (\n request: NextRequest,\n event: NextFetchEvent,\n) => NextMiddlewareResult | Promise<NextMiddlewareResult>;\n\n/**\n * Minimal NextFetchEvent — extends FetchEvent where available,\n * otherwise provides the waitUntil pattern standalone.\n */\nexport class NextFetchEvent {\n sourcePage: string;\n private _waitUntilPromises: Promise<unknown>[] = [];\n\n constructor(params: { page: string }) {\n this.sourcePage = params.page;\n }\n\n waitUntil(promise: Promise<unknown>): void {\n this._waitUntilPromises.push(promise);\n }\n\n get waitUntilPromises(): Promise<unknown>[] {\n return this._waitUntilPromises;\n }\n\n /** Drain all waitUntil promises. Returns a single promise that settles when all are done. */\n drainWaitUntil(): Promise<PromiseSettledResult<unknown>[]> {\n return Promise.allSettled(this._waitUntilPromises);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Utility exports\n// ---------------------------------------------------------------------------\n\n/**\n * Parse user agent string. Minimal implementation — for full UA parsing,\n * apps should use a dedicated library like `ua-parser-js`.\n */\nexport function userAgentFromString(ua: string | undefined): UserAgent {\n const input = ua ?? \"\";\n return {\n isBot: /bot|crawler|spider|crawling/i.test(input),\n ua: input,\n browser: {},\n device: {},\n engine: {},\n os: {},\n cpu: {},\n };\n}\n\nexport function userAgent({ headers }: { headers: Headers }): UserAgent {\n return userAgentFromString(headers.get(\"user-agent\") ?? undefined);\n}\n\nexport type UserAgent = {\n isBot: boolean;\n ua: string;\n browser: { name?: string; version?: string; major?: string };\n device: { model?: string; type?: string; vendor?: string };\n engine: { name?: string; version?: string };\n os: { name?: string; version?: string };\n cpu: { architecture?: string };\n};\n\n/**\n * after() — schedule work after the response is sent.\n *\n * Uses the platform's `waitUntil` (via the per-request ExecutionContext) when\n * available so the task survives past the response on Cloudflare Workers.\n * Falls back to a fire-and-forget microtask on runtimes without an execution\n * context (e.g. Node.js dev server).\n *\n * Throws when called inside a cached scope — request-specific\n * side-effects must not leak into cached results.\n */\nexport function after<T>(task: Promise<T> | (() => T | Promise<T>)): void {\n _throwIfInsideCacheScope(\"after()\");\n\n const promise = typeof task === \"function\" ? Promise.resolve().then(task) : task;\n // NOTE: vinext runs function tasks concurrently with response streaming (next microtask),\n // whereas Next.js queues them to run strictly after the response is sent via onClose.\n // This is a known simplification — function tasks here are not guaranteed to run\n // after the response completes, only after the current synchronous execution.\n //\n // `.catch()` is attached synchronously in the same tick as `promise` is created, so\n // there is no window where a pre-rejected `task` promise could trigger an\n // `unhandledrejection` event before the handler is in place.\n const guarded = promise.catch((err) => {\n console.error(\"[vinext] after() task failed:\", err);\n });\n\n // TODO: Next.js throws when after() is called outside a request context or when\n // waitUntil is unavailable, preventing silent task loss. vinext falls back to\n // fire-and-forget here, which is correct for the Node.js dev server (where\n // getRequestExecutionContext() always returns null). On Workers, a misconfigured\n // entry that omits runWithExecutionContext would silently drop tasks — consider\n // a one-time console.warn on the fallback path, gated to production only (e.g.\n // `process.env.NODE_ENV === 'production'` or `typeof caches !== 'undefined'` for\n // a Workers runtime check) with a module-level `let _warned = false` guard so it\n // fires at most once and doesn't spam the dev-server console.\n getRequestExecutionContext()?.waitUntil(guarded);\n}\n\n/**\n * connection() — signals that the response requires a live connection\n * (not a static/cached response). Opts the page out of ISR caching\n * and sets Cache-Control: no-store on the response.\n */\nexport async function connection(): Promise<void> {\n const { markDynamicUsage, throwIfInsideCacheScope } = await import(\"./headers.js\");\n throwIfInsideCacheScope(\"connection()\");\n markDynamicUsage();\n}\n\n/**\n * URLPattern re-export — used in middleware for route matching.\n * Available natively in Node 20+, Cloudflare Workers, Deno.\n * Falls back to urlpattern-polyfill if the global is not available.\n */\nexport const URLPattern: typeof globalThis.URLPattern =\n globalThis.URLPattern ??\n (() => {\n throw new Error(\n \"URLPattern is not available in this runtime. \" +\n \"Install the `urlpattern-polyfill` package or upgrade to Node 20+.\",\n );\n });\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"server.js","names":[],"sources":["../../src/shims/server.ts"],"sourcesContent":["/**\n * next/server shim\n *\n * Provides NextRequest, NextResponse, and related types that work with\n * standard Web APIs (Request/Response). This means they work on Node,\n * Cloudflare Workers, Deno, and any WinterCG-compatible runtime.\n *\n * This is a pragmatic subset — we implement the most commonly used APIs\n * rather than bug-for-bug parity with Next.js internals.\n */\n\nimport { encodeMiddlewareRequestHeaders } from \"../server/middleware-request-headers.js\";\nimport { serializeSetCookie, validateCookieName } from \"./internal/cookie-serialize.js\";\nimport { parseCookieHeader } from \"./internal/parse-cookie-header.js\";\nimport { getRequestExecutionContext } from \"./request-context.js\";\nimport { assertSafeNavigationUrl } from \"./url-safety.js\";\nimport { stripBasePath } from \"../utils/base-path.js\";\n\n// ---------------------------------------------------------------------------\n// Inlined cache-scope guard for after()\n//\n// We cannot statically import throwIfInsideCacheScope from headers.ts here\n// because headers.ts contains the \"use cache\" directive string in its error\n// message, which causes Vite's use-cache transform to include it in the module\n// graph. If headers.ts is pulled in via static import from server.ts, the\n// transform fires on it in Pages Router fixtures that lack @vitejs/plugin-rsc.\n//\n// The connection() function in this file avoids the same problem by using\n// `await import(\"./headers.js\")` (dynamic import, async function). after()\n// must remain synchronous, so we inline the check using the same Symbol.for\n// keys that cache-runtime.ts and cache.ts register their ALS instances with.\n// ---------------------------------------------------------------------------\n\nconst _USE_CACHE_ALS_KEY = Symbol.for(\"vinext.cacheRuntime.contextAls\");\nconst _UNSTABLE_CACHE_ALS_KEY = Symbol.for(\"vinext.unstableCache.als\");\nconst _g = globalThis as unknown as Record<PropertyKey, unknown>;\n\n/**\n * Record an invalid dynamic usage error on the request context so it survives\n * user try/catch and can be forwarded to the dev overlay on client-side navigations.\n */\nfunction _recordInvalidDynamicUsageError(error: Error): void {\n try {\n const _unifiedAls = _g[Symbol.for(\"vinext.unifiedRequestContext.als\")] as\n | { getStore(): unknown }\n | undefined;\n const ctx = _unifiedAls?.getStore() as Record<string, unknown> | undefined;\n if (ctx) ctx.invalidDynamicUsageError = error;\n } catch {\n // Ignore — best-effort recording for dev diagnostics\n }\n}\n\nfunction _throwIfInsideCacheScope(apiName: string): void {\n const cacheAls = _g[_USE_CACHE_ALS_KEY] as { getStore(): unknown } | undefined;\n if (cacheAls?.getStore() != null) {\n const error = new Error(\n `\\`${apiName}\\` cannot be called inside \"use cache\". ` +\n `If you need this data inside a cached function, call \\`${apiName}\\` ` +\n \"outside and pass the required data as an argument.\",\n );\n _recordInvalidDynamicUsageError(error);\n throw error;\n }\n const unstableAls = _g[_UNSTABLE_CACHE_ALS_KEY] as { getStore(): unknown } | undefined;\n if (unstableAls?.getStore() === true) {\n const error = new Error(\n `\\`${apiName}\\` cannot be called inside a function cached with \\`unstable_cache()\\`. ` +\n `If you need this data inside a cached function, call \\`${apiName}\\` ` +\n \"outside and pass the required data as an argument.\",\n );\n _recordInvalidDynamicUsageError(error);\n throw error;\n }\n}\n\n// ---------------------------------------------------------------------------\n// NextRequest\n// ---------------------------------------------------------------------------\n\nexport class NextRequest extends Request {\n private _nextUrl: NextURL;\n private _url: string;\n private _cookies: RequestCookies;\n\n constructor(\n input: URL | RequestInfo,\n init?: RequestInit & {\n nextConfig?: {\n basePath?: string;\n i18n?: { locales: string[]; defaultLocale: string };\n };\n },\n ) {\n // Strip nextConfig before passing to super() — it's vinext-internal,\n // not a valid RequestInit property.\n const { nextConfig: _nextConfig, ...requestInit } = init ?? {};\n // Handle the case where input is a Request object - we need to extract URL and init\n // to avoid Node.js undici issues with passing Request objects directly to super()\n if (input instanceof Request) {\n const req = input;\n super(req.url, {\n method: req.method,\n headers: req.headers,\n body: req.body,\n // @ts-expect-error - duplex is not in RequestInit type but needed for streams\n duplex: req.body ? \"half\" : undefined,\n ...requestInit,\n });\n } else {\n super(input, requestInit);\n }\n const url =\n typeof input === \"string\"\n ? new URL(input, \"http://localhost\")\n : input instanceof URL\n ? input\n : new URL(input.url, \"http://localhost\");\n const urlConfig: NextURLConfig | undefined = _nextConfig\n ? { basePath: _nextConfig.basePath, nextConfig: { i18n: _nextConfig.i18n } }\n : undefined;\n this._nextUrl = new NextURL(url, undefined, urlConfig);\n this._url = process.env.__NEXT_NO_MIDDLEWARE_URL_NORMALIZE\n ? url.toString()\n : this._nextUrl.toString();\n this._cookies = new RequestCookies(this.headers);\n }\n\n get nextUrl(): NextURL {\n return this._nextUrl;\n }\n\n get url(): string {\n return this._url;\n }\n\n get cookies(): RequestCookies {\n return this._cookies;\n }\n\n /**\n * Client IP address. Prefers Cloudflare's trusted CF-Connecting-IP header\n * over the spoofable X-Forwarded-For. Returns undefined if unavailable.\n */\n get ip(): string | undefined {\n return (\n this.headers.get(\"cf-connecting-ip\") ??\n this.headers.get(\"x-real-ip\") ??\n this.headers.get(\"x-forwarded-for\")?.split(\",\")[0]?.trim() ??\n undefined\n );\n }\n\n /**\n * Geolocation data. Platform-dependent (e.g., Cloudflare, Vercel).\n * Returns undefined if not available.\n */\n get geo():\n | { city?: string; country?: string; region?: string; latitude?: string; longitude?: string }\n | undefined {\n // Check Cloudflare-style headers, Vercel-style headers\n const country =\n this.headers.get(\"cf-ipcountry\") ?? this.headers.get(\"x-vercel-ip-country\") ?? undefined;\n if (!country) return undefined;\n return {\n country,\n city: this.headers.get(\"cf-ipcity\") ?? this.headers.get(\"x-vercel-ip-city\") ?? undefined,\n region:\n this.headers.get(\"cf-region\") ??\n this.headers.get(\"x-vercel-ip-country-region\") ??\n undefined,\n latitude:\n this.headers.get(\"cf-iplatitude\") ?? this.headers.get(\"x-vercel-ip-latitude\") ?? undefined,\n longitude:\n this.headers.get(\"cf-iplongitude\") ??\n this.headers.get(\"x-vercel-ip-longitude\") ??\n undefined,\n };\n }\n\n /**\n * The build ID of the Next.js application.\n * Delegates to `nextUrl.buildId` to match Next.js API surface.\n * Can be used in middleware to detect deployment skew between client and server.\n */\n get buildId(): string | undefined {\n return this._nextUrl.buildId;\n }\n}\n\n// ---------------------------------------------------------------------------\n// NextResponse\n// ---------------------------------------------------------------------------\n\n/** Valid HTTP redirect status codes, matching Next.js's REDIRECTS set. */\nconst REDIRECT_STATUSES = new Set([301, 302, 303, 307, 308]);\n\nfunction validateURL(url: string | URL): string {\n assertSafeNavigationUrl(String(url));\n try {\n return String(new URL(String(url)));\n } catch (error) {\n throw new Error(\n `URL is malformed \"${String(\n url,\n )}\". Please use only absolute URLs - https://nextjs.org/docs/messages/middleware-relative-urls`,\n { cause: error },\n );\n }\n}\n\nexport class NextResponse<_Body = unknown> extends Response {\n private _cookies: ResponseCookies;\n\n constructor(body?: BodyInit | null, init?: ResponseInit) {\n super(body, init);\n this._cookies = new MiddlewareResponseCookies(this.headers);\n }\n\n get cookies(): ResponseCookies {\n return this._cookies;\n }\n\n /**\n * Create a JSON response.\n */\n static json<JsonBody>(body: JsonBody, init?: ResponseInit): NextResponse<JsonBody> {\n const headers = new Headers(init?.headers);\n if (!headers.has(\"content-type\")) {\n headers.set(\"content-type\", \"application/json\");\n }\n return new NextResponse(JSON.stringify(body), {\n ...init,\n headers,\n }) as NextResponse<JsonBody>;\n }\n\n /**\n * Create a redirect response.\n */\n static redirect(url: string | URL, init?: number | ResponseInit): NextResponse {\n const status = typeof init === \"number\" ? init : (init?.status ?? 307);\n if (!REDIRECT_STATUSES.has(status)) {\n throw new RangeError(`Failed to execute \"redirect\" on \"response\": Invalid status code`);\n }\n const headers = new Headers(typeof init === \"object\" ? init?.headers : undefined);\n headers.set(\"Location\", validateURL(url));\n return new NextResponse(null, { status, headers });\n }\n\n /**\n * Create a rewrite response (middleware pattern).\n * Sets the x-middleware-rewrite header.\n */\n static rewrite(destination: string | URL, init?: MiddlewareResponseInit): NextResponse {\n const headers = new Headers(init?.headers);\n headers.set(\"x-middleware-rewrite\", validateURL(destination));\n if (init?.request?.headers) {\n encodeMiddlewareRequestHeaders(headers, init.request.headers);\n }\n return new NextResponse(null, { ...init, headers });\n }\n\n /**\n * Continue to the next handler (middleware pattern).\n * Sets the x-middleware-next header.\n */\n static next(init?: MiddlewareResponseInit): NextResponse {\n const headers = new Headers(init?.headers);\n headers.set(\"x-middleware-next\", \"1\");\n if (init?.request?.headers) {\n encodeMiddlewareRequestHeaders(headers, init.request.headers);\n }\n return new NextResponse(null, { ...init, headers });\n }\n}\n\n// ---------------------------------------------------------------------------\n// NextURL — lightweight URL wrapper with pathname helpers\n// ---------------------------------------------------------------------------\n\nexport type NextURLConfig = {\n basePath?: string;\n nextConfig?: {\n i18n?: {\n locales: string[];\n defaultLocale: string;\n };\n };\n};\n\nexport class NextURL {\n /** Internal URL stores the pathname WITHOUT basePath or locale prefix. */\n private _url: URL;\n private _basePath: string;\n private _locale: string | undefined;\n private _defaultLocale: string | undefined;\n private _locales: string[] | undefined;\n\n constructor(input: string | URL, base?: string | URL, config?: NextURLConfig) {\n this._url = new URL(input.toString(), base);\n this._basePath = config?.basePath ?? \"\";\n this._stripBasePath();\n const i18n = config?.nextConfig?.i18n;\n if (i18n) {\n this._locales = [...i18n.locales];\n this._defaultLocale = i18n.defaultLocale;\n this._analyzeLocale(this._locales);\n }\n }\n\n /** Strip basePath prefix from the internal pathname. */\n private _stripBasePath(): void {\n if (!this._basePath) return;\n this._url.pathname = stripBasePath(this._url.pathname, this._basePath);\n }\n\n /** Extract locale from pathname, stripping it from the internal URL. */\n private _analyzeLocale(locales: string[]): void {\n const segments = this._url.pathname.split(\"/\");\n const candidate = segments[1]?.toLowerCase();\n const match = locales.find((l) => l.toLowerCase() === candidate);\n if (match) {\n this._locale = match;\n this._url.pathname = \"/\" + segments.slice(2).join(\"/\");\n } else {\n this._locale = this._defaultLocale;\n }\n }\n\n /**\n * Reconstruct the full pathname with basePath + locale prefix.\n * Mirrors Next.js's internal formatPathname().\n */\n private _formatPathname(): string {\n // Build prefix: basePath + locale (skip defaultLocale — Next.js omits it)\n let prefix = this._basePath;\n if (this._locale && this._locale !== this._defaultLocale) {\n prefix += \"/\" + this._locale;\n }\n if (!prefix) return this._url.pathname;\n const inner = this._url.pathname;\n return inner === \"/\" ? prefix : prefix + inner;\n }\n\n get href(): string {\n const formatted = this._formatPathname();\n if (formatted === this._url.pathname) return this._url.href;\n // Replace pathname in href via string slicing — avoids URL allocation.\n // URL.href is always <origin+auth><pathname><search><hash>.\n const { href, pathname, search, hash } = this._url;\n const baseEnd = href.length - pathname.length - search.length - hash.length;\n return href.slice(0, baseEnd) + formatted + search + hash;\n }\n set href(value: string) {\n this._url.href = value;\n this._stripBasePath();\n if (this._locales) this._analyzeLocale(this._locales);\n }\n\n get origin(): string {\n return this._url.origin;\n }\n\n get protocol(): string {\n return this._url.protocol;\n }\n set protocol(value: string) {\n this._url.protocol = value;\n }\n\n get username(): string {\n return this._url.username;\n }\n set username(value: string) {\n this._url.username = value;\n }\n\n get password(): string {\n return this._url.password;\n }\n set password(value: string) {\n this._url.password = value;\n }\n\n get host(): string {\n return this._url.host;\n }\n set host(value: string) {\n this._url.host = value;\n }\n\n get hostname(): string {\n return this._url.hostname;\n }\n set hostname(value: string) {\n this._url.hostname = value;\n }\n\n get port(): string {\n return this._url.port;\n }\n set port(value: string) {\n this._url.port = value;\n }\n\n /** Returns the pathname WITHOUT basePath or locale prefix. */\n get pathname(): string {\n return this._url.pathname;\n }\n set pathname(value: string) {\n this._url.pathname = value;\n }\n\n get search(): string {\n return this._url.search;\n }\n set search(value: string) {\n this._url.search = value;\n }\n\n get searchParams(): URLSearchParams {\n return this._url.searchParams;\n }\n\n get hash(): string {\n return this._url.hash;\n }\n set hash(value: string) {\n this._url.hash = value;\n }\n\n get basePath(): string {\n return this._basePath;\n }\n set basePath(value: string) {\n this._basePath = value === \"\" ? \"\" : value.startsWith(\"/\") ? value : \"/\" + value;\n }\n\n get locale(): string {\n return this._locale ?? \"\";\n }\n set locale(value: string | undefined) {\n if (this._locales) {\n if (!value) {\n this._locale = this._defaultLocale;\n return;\n }\n if (!this._locales.includes(value)) {\n throw new TypeError(\n `The locale \"${value}\" is not in the configured locales: ${this._locales.join(\", \")}`,\n );\n }\n }\n this._locale = this._locales ? value : this._locale;\n }\n\n get defaultLocale(): string | undefined {\n return this._defaultLocale;\n }\n\n get locales(): string[] | undefined {\n return this._locales ? [...this._locales] : undefined;\n }\n\n clone(): NextURL {\n const config: NextURLConfig = {\n basePath: this._basePath,\n nextConfig: this._locales\n ? { i18n: { locales: [...this._locales], defaultLocale: this._defaultLocale! } }\n : undefined,\n };\n // Pass the full href (with locale/basePath re-added) so the constructor\n // can re-analyze and extract locale correctly.\n return new NextURL(this.href, undefined, config);\n }\n\n toString(): string {\n return this.href;\n }\n\n /**\n * The build ID of the Next.js application.\n * Set from `generateBuildId` in next.config.js, or a random UUID if not configured.\n * Can be used in middleware to detect deployment skew between client and server.\n * Matches the Next.js API: `request.nextUrl.buildId`.\n */\n get buildId(): string | undefined {\n return process.env.__VINEXT_BUILD_ID ?? undefined;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Cookie helpers (minimal implementations)\n// ---------------------------------------------------------------------------\n\ntype CookieEntry = {\n name: string;\n value: string;\n};\n\nexport class RequestCookies {\n private _headers: Headers;\n private _parsed: Map<string, string>;\n\n constructor(headers: Headers) {\n this._headers = headers;\n this._parsed = parseCookieHeader(headers.get(\"cookie\") ?? \"\");\n }\n\n get(name: string): CookieEntry | undefined {\n const value = this._parsed.get(name);\n return value !== undefined ? { name, value } : undefined;\n }\n\n getAll(nameOrOptions?: string | CookieEntry): CookieEntry[] {\n const name = typeof nameOrOptions === \"string\" ? nameOrOptions : nameOrOptions?.name;\n return [...this._parsed.entries()]\n .filter(([cookieName]) => name === undefined || cookieName === name)\n .map(([cookieName, value]) => ({ name: cookieName, value }));\n }\n\n has(name: string): boolean {\n return this._parsed.has(name);\n }\n\n set(nameOrOptions: string | CookieEntry, value?: string): this {\n let cookieName: string;\n let cookieValue: string;\n if (typeof nameOrOptions === \"string\") {\n cookieName = nameOrOptions;\n cookieValue = value ?? \"\";\n } else {\n cookieName = nameOrOptions.name;\n cookieValue = nameOrOptions.value;\n }\n validateCookieName(cookieName);\n this._parsed.set(cookieName, cookieValue);\n this._syncHeader();\n return this;\n }\n\n delete(names: string | string[]): boolean | boolean[] {\n if (Array.isArray(names)) {\n const results = names.map((name) => {\n validateCookieName(name);\n return this._parsed.delete(name);\n });\n this._syncHeader();\n return results;\n }\n validateCookieName(names);\n const result = this._parsed.delete(names);\n this._syncHeader();\n return result;\n }\n\n clear(): this {\n this._parsed.clear();\n this._syncHeader();\n return this;\n }\n\n get size(): number {\n return this._parsed.size;\n }\n\n toString(): string {\n return this._serialize();\n }\n\n private _serialize(): string {\n return [...this._parsed.entries()].map(([n, v]) => `${n}=${encodeURIComponent(v)}`).join(\"; \");\n }\n\n private _syncHeader(): void {\n if (this._parsed.size === 0) {\n this._headers.delete(\"cookie\");\n } else {\n this._headers.set(\"cookie\", this._serialize());\n }\n }\n\n [Symbol.iterator](): IterableIterator<[string, CookieEntry]> {\n const entries = this.getAll().map((c) => [c.name, c] as [string, CookieEntry]);\n return entries[Symbol.iterator]();\n }\n}\n\n// Keep this error message in sync with headers.ts. This adapter backs\n// NextRequest cookies, while headers.ts owns the next/headers cookies object.\nclass ReadonlyRequestCookiesError extends Error {\n constructor() {\n super(\n \"Cookies can only be modified in a Server Action or Route Handler. Read more: https://nextjs.org/docs/app/api-reference/functions/cookies#options\",\n );\n }\n\n static callable(this: void): never {\n throw new ReadonlyRequestCookiesError();\n }\n}\n\nconst REQUEST_HEADERS_MUTATING_METHODS = new Set([\"set\", \"delete\", \"append\"]);\n\n// Keep this error message in sync with headers.ts. This adapter backs\n// NextRequest headers in force-static route handlers, while headers.ts owns the\n// next/headers object.\nclass ReadonlyRequestHeadersError extends Error {\n constructor() {\n super(\n \"Headers cannot be modified. Read more: https://nextjs.org/docs/app/api-reference/functions/headers\",\n );\n }\n\n static callable(this: void): never {\n throw new ReadonlyRequestHeadersError();\n }\n}\n\nexport function sealRequestHeaders(headers: Headers): Headers {\n return new Proxy<Headers>(headers, {\n get(target, prop) {\n if (typeof prop === \"string\" && REQUEST_HEADERS_MUTATING_METHODS.has(prop)) {\n return ReadonlyRequestHeadersError.callable;\n }\n\n const value = Reflect.get(target, prop, target);\n return typeof value === \"function\" ? value.bind(target) : value;\n },\n });\n}\n\nexport function sealRequestCookies(cookies: RequestCookies): RequestCookies {\n return new Proxy<RequestCookies>(cookies, {\n get(target, prop) {\n if (prop === \"set\" || prop === \"delete\" || prop === \"clear\") {\n return ReadonlyRequestCookiesError.callable;\n }\n\n const value = Reflect.get(target, prop, target);\n return typeof value === \"function\" ? value.bind(target) : value;\n },\n });\n}\n\nexport class ResponseCookies {\n private _headers: Headers;\n /** Internal map keyed by cookie name — single source of truth. */\n private _parsed: Map<string, { serialized: string; entry: CookieEntry }> = new Map();\n\n constructor(headers: Headers) {\n this._headers = headers;\n\n // Hydrate internal map from any existing Set-Cookie headers\n for (const header of headers.getSetCookie()) {\n const eq = header.indexOf(\"=\");\n if (eq === -1) continue;\n const cookieName = header.slice(0, eq);\n const semi = header.indexOf(\";\", eq);\n const raw = header.slice(eq + 1, semi === -1 ? undefined : semi);\n let value: string;\n try {\n value = decodeURIComponent(raw);\n } catch {\n value = raw;\n }\n this._parsed.set(cookieName, { serialized: header, entry: { name: cookieName, value } });\n }\n }\n\n set(\n ...args:\n | [name: string, value: string, options?: CookieOptions]\n | [options: CookieOptions & { name: string; value: string }]\n ): this {\n const [name, value, opts] = parseCookieSetArgs(args);\n validateCookieName(name);\n\n const serialized = serializeSetCookie(name, value, opts);\n this._parsed.set(name, { serialized, entry: { name, value } });\n this._syncHeaders();\n return this;\n }\n\n get(...args: [name: string] | [options: { name: string }]): CookieEntry | undefined {\n const key = typeof args[0] === \"string\" ? args[0] : args[0].name;\n return this._parsed.get(key)?.entry;\n }\n\n has(name: string): boolean {\n return this._parsed.has(name);\n }\n\n getAll(...args: [name: string] | [options: { name: string }] | []): CookieEntry[] {\n const all = [...this._parsed.values()].map((v) => v.entry);\n if (args.length === 0) return all;\n const key = typeof args[0] === \"string\" ? args[0] : args[0].name;\n return all.filter((c) => c.name === key);\n }\n\n delete(\n ...args:\n | [name: string]\n | [options: Omit<CookieOptions & { name: string }, \"maxAge\" | \"expires\">]\n ): this {\n const [name, opts] =\n typeof args[0] === \"string\" ? [args[0], undefined] : [args[0].name, args[0]];\n return this.set({\n name,\n value: \"\",\n expires: new Date(0),\n path: opts?.path,\n domain: opts?.domain,\n httpOnly: opts?.httpOnly,\n secure: opts?.secure,\n sameSite: opts?.sameSite,\n });\n }\n\n [Symbol.iterator](): IterableIterator<[string, CookieEntry]> {\n const entries: [string, CookieEntry][] = [...this._parsed.values()].map((v) => [\n v.entry.name,\n v.entry,\n ]);\n return entries[Symbol.iterator]();\n }\n\n /** Delete all Set-Cookie headers and re-append from the internal map. */\n private _syncHeaders(): void {\n this._headers.delete(\"Set-Cookie\");\n for (const { serialized } of this._parsed.values()) {\n this._headers.append(\"Set-Cookie\", serialized);\n }\n }\n}\n\nclass MiddlewareResponseCookies extends ResponseCookies {\n private _responseHeaders: Headers;\n\n constructor(headers: Headers) {\n super(headers);\n this._responseHeaders = headers;\n }\n\n override set(\n ...args:\n | [name: string, value: string, options?: CookieOptions]\n | [options: CookieOptions & { name: string; value: string }]\n ): this {\n super.set(...args);\n this._syncMiddlewareCookieHeader();\n return this;\n }\n\n override delete(\n ...args:\n | [name: string]\n | [options: Omit<CookieOptions & { name: string }, \"maxAge\" | \"expires\">]\n ): this {\n super.delete(...args);\n this._syncMiddlewareCookieHeader();\n return this;\n }\n\n private _syncMiddlewareCookieHeader(): void {\n const cookies = this._responseHeaders.getSetCookie();\n if (cookies.length === 0) {\n this._responseHeaders.delete(\"x-middleware-set-cookie\");\n return;\n }\n\n this._responseHeaders.set(\"x-middleware-set-cookie\", cookies.join(\",\"));\n }\n}\n\ntype CookieOptions = {\n path?: string;\n domain?: string;\n maxAge?: number;\n expires?: Date;\n httpOnly?: boolean;\n secure?: boolean;\n sameSite?: \"Strict\" | \"Lax\" | \"None\";\n};\n\n/**\n * Parse the overloaded arguments for ResponseCookies.set():\n * - (name, value, options?) — positional form\n * - ({ name, value, ...options }) — object form\n */\nfunction parseCookieSetArgs(\n args:\n | [name: string, value: string, options?: CookieOptions]\n | [options: CookieOptions & { name: string; value: string }],\n): [string, string, CookieOptions | undefined] {\n if (typeof args[0] === \"string\") {\n return [args[0], args[1] as string, args[2] as CookieOptions | undefined];\n }\n const { name, value, ...opts } = args[0];\n return [name, value, opts as CookieOptions];\n}\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type MiddlewareResponseInit = {\n request?: {\n headers?: Headers;\n };\n} & ResponseInit;\n\nexport type NextMiddlewareResult = NextResponse | Response | null | undefined | void;\n\nexport type NextMiddleware = (\n request: NextRequest,\n event: NextFetchEvent,\n) => NextMiddlewareResult | Promise<NextMiddlewareResult>;\n\n/**\n * Minimal NextFetchEvent — extends FetchEvent where available,\n * otherwise provides the waitUntil pattern standalone.\n */\nexport class NextFetchEvent {\n sourcePage: string;\n private _waitUntilPromises: Promise<unknown>[] = [];\n\n constructor(params: { page: string }) {\n this.sourcePage = params.page;\n }\n\n waitUntil(promise: Promise<unknown>): void {\n this._waitUntilPromises.push(promise);\n }\n\n get waitUntilPromises(): Promise<unknown>[] {\n return this._waitUntilPromises;\n }\n\n /** Drain all waitUntil promises. Returns a single promise that settles when all are done. */\n drainWaitUntil(): Promise<PromiseSettledResult<unknown>[]> {\n return Promise.allSettled(this._waitUntilPromises);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Utility exports\n// ---------------------------------------------------------------------------\n\n/**\n * Parse user agent string. Minimal implementation — for full UA parsing,\n * apps should use a dedicated library like `ua-parser-js`.\n */\nexport function userAgentFromString(ua: string | undefined): UserAgent {\n const input = ua ?? \"\";\n return {\n isBot: /bot|crawler|spider|crawling/i.test(input),\n ua: input,\n browser: {},\n device: {},\n engine: {},\n os: {},\n cpu: {},\n };\n}\n\nexport function userAgent({ headers }: { headers: Headers }): UserAgent {\n return userAgentFromString(headers.get(\"user-agent\") ?? undefined);\n}\n\nexport type UserAgent = {\n isBot: boolean;\n ua: string;\n browser: { name?: string; version?: string; major?: string };\n device: { model?: string; type?: string; vendor?: string };\n engine: { name?: string; version?: string };\n os: { name?: string; version?: string };\n cpu: { architecture?: string };\n};\n\n/**\n * after() — schedule work after the response is sent.\n *\n * Uses the platform's `waitUntil` (via the per-request ExecutionContext) when\n * available so the task survives past the response on Cloudflare Workers.\n * Falls back to a fire-and-forget microtask on runtimes without an execution\n * context (e.g. Node.js dev server).\n *\n * Throws when called inside a cached scope — request-specific\n * side-effects must not leak into cached results.\n */\nexport function after<T>(task: Promise<T> | (() => T | Promise<T>)): void {\n _throwIfInsideCacheScope(\"after()\");\n\n const promise = typeof task === \"function\" ? Promise.resolve().then(task) : task;\n // NOTE: vinext runs function tasks concurrently with response streaming (next microtask),\n // whereas Next.js queues them to run strictly after the response is sent via onClose.\n // This is a known simplification — function tasks here are not guaranteed to run\n // after the response completes, only after the current synchronous execution.\n //\n // `.catch()` is attached synchronously in the same tick as `promise` is created, so\n // there is no window where a pre-rejected `task` promise could trigger an\n // `unhandledrejection` event before the handler is in place.\n const guarded = promise.catch((err) => {\n console.error(\"[vinext] after() task failed:\", err);\n });\n\n // TODO: Next.js throws when after() is called outside a request context or when\n // waitUntil is unavailable, preventing silent task loss. vinext falls back to\n // fire-and-forget here, which is correct for the Node.js dev server (where\n // getRequestExecutionContext() always returns null). On Workers, a misconfigured\n // entry that omits runWithExecutionContext would silently drop tasks — consider\n // a one-time console.warn on the fallback path, gated to production only (e.g.\n // `process.env.NODE_ENV === 'production'` or `typeof caches !== 'undefined'` for\n // a Workers runtime check) with a module-level `let _warned = false` guard so it\n // fires at most once and doesn't spam the dev-server console.\n getRequestExecutionContext()?.waitUntil(guarded);\n}\n\n/**\n * connection() — signals that the response requires a live connection\n * (not a static/cached response). Opts the page out of ISR caching\n * and sets Cache-Control: no-store on the response.\n */\nexport async function connection(): Promise<void> {\n const { markDynamicUsage, throwIfInsideCacheScope } = await import(\"./headers.js\");\n throwIfInsideCacheScope(\"connection()\");\n markDynamicUsage();\n}\n\n/**\n * URLPattern re-export — used in middleware for route matching.\n * Available natively in Node 20+, Cloudflare Workers, Deno.\n * Falls back to urlpattern-polyfill if the global is not available.\n */\nexport const URLPattern: typeof globalThis.URLPattern =\n globalThis.URLPattern ??\n (() => {\n throw new Error(\n \"URLPattern is not available in this runtime. \" +\n \"Install the `urlpattern-polyfill` package or upgrade to Node 20+.\",\n );\n });\n"],"mappings":"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"}
|
package/dist/shims/slot.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AppElementValue, AppElements, UNMATCHED_SLOT } from "../server/app-elements.js";
|
|
1
|
+
import { AppElementValue, AppElements, UNMATCHED_SLOT } from "../server/app-elements-wire.js";
|
|
2
2
|
import * as React$1 from "react";
|
|
3
3
|
import * as _$react_jsx_runtime0 from "react/jsx-runtime";
|
|
4
4
|
|
package/dist/shims/slot.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { UNMATCHED_SLOT } from "../server/app-elements.js";
|
|
2
|
+
import { AppElementsWire, UNMATCHED_SLOT } from "../server/app-elements-wire.js";
|
|
3
|
+
import "../server/app-elements.js";
|
|
3
4
|
import { notFound } from "./navigation.js";
|
|
4
5
|
import * as React$1 from "react";
|
|
5
6
|
import { jsx } from "react/jsx-runtime";
|
|
@@ -19,16 +20,16 @@ function mergeElements(prev, next, clearAbsentSlots = false) {
|
|
|
19
20
|
...prev,
|
|
20
21
|
...next
|
|
21
22
|
};
|
|
22
|
-
for (const key of Object.keys(merged)) if (
|
|
23
|
+
for (const key of Object.keys(merged)) if (AppElementsWire.isSlotId(key) && merged[key] === UNMATCHED_SLOT && Object.hasOwn(prev, key)) merged[key] = prev[key];
|
|
23
24
|
if (clearAbsentSlots) {
|
|
24
|
-
for (const key of Object.keys(merged)) if (
|
|
25
|
+
for (const key of Object.keys(merged)) if (AppElementsWire.isSlotId(key) && !Object.hasOwn(next, key)) delete merged[key];
|
|
25
26
|
}
|
|
26
27
|
return merged;
|
|
27
28
|
}
|
|
28
29
|
function Slot({ id, children, parallelSlots }) {
|
|
29
30
|
const elements = React$1.useContext(ElementsContext);
|
|
30
31
|
if (!Object.hasOwn(elements, id)) {
|
|
31
|
-
if (process.env.NODE_ENV !== "production" && !
|
|
32
|
+
if (process.env.NODE_ENV !== "production" && !AppElementsWire.isSlotId(id)) {
|
|
32
33
|
if (!warnedMissingEntryIds.has(id)) {
|
|
33
34
|
warnedMissingEntryIds.add(id);
|
|
34
35
|
console.warn("[vinext] Missing App Router element entry during render: " + id);
|