| Server IP : 159.203.156.69 / Your IP : 216.73.217.172 Web Server : nginx/1.24.0 System : Linux main-ubuntu 6.8.0-71-generic #71-Ubuntu SMP PREEMPT_DYNAMIC Tue Jul 22 16:52:38 UTC 2025 x86_64 User : root ( 0) PHP Version : 8.3.6 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : OFF Directory : /var/www/tanviranik.com/node_modules/vinext/dist/shims/ |
Upload File : |
{"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 {\n useState,\n useEffect,\n useCallback,\n useMemo,\n createElement,\n type ReactElement,\n type ComponentType,\n} 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 { installWindowNext, type PagesRouterPublicInstance } from \"../client/window-next.js\";\nimport {\n isHashOnlyBrowserUrlChange,\n toBrowserNavigationHref,\n toSameOriginAppPath,\n} 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 return isHashOnlyBrowserUrlChange(href, window.location.href, __basePath);\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(full)) {\n const eventUrl = resolveHashUrl(full);\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(full)) {\n const eventUrl = resolveHashUrl(full);\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/**\n * Props injected by `withRouter` into the wrapped component.\n *\n * Ported from Next.js: packages/next/src/client/with-router.tsx\n * https://github.com/vercel/next.js/blob/canary/packages/next/src/client/with-router.tsx\n */\nexport type WithRouterProps = {\n router: NextRouter;\n};\n\n/**\n * Pick<P, Exclude<keyof P, keyof WithRouterProps>> — the props of the\n * composed component minus the `router` prop that `withRouter` injects.\n *\n * Ported from Next.js: packages/next/src/client/with-router.tsx\n */\nexport type ExcludeRouterProps<P> = Pick<P, Exclude<keyof P, keyof WithRouterProps>>;\n\n/**\n * Higher-order component that injects the Pages Router `router` instance as\n * a `router` prop into a wrapped component. Primarily used by class\n * components (which cannot call hooks) to access the router. The wrapped\n * component receives the same props as the original, minus `router`, which\n * is filled in by the HOC.\n *\n * Ported from Next.js: packages/next/src/client/with-router.tsx\n * https://github.com/vercel/next.js/blob/canary/packages/next/src/client/with-router.tsx\n *\n * Differences from Next.js:\n * - We type the composed component as `ComponentType<P>` instead of\n * `NextComponentType<C, any, P>` because vinext does not expose\n * `NextComponentType` from this shim. The runtime shape (and the props\n * the wrapper forwards) is identical.\n * - We forward `getInitialProps` and `origGetInitialProps` from the\n * composed component so `_app` parity holds for class components that\n * define `getInitialProps`.\n */\nexport function withRouter<P extends WithRouterProps>(\n ComposedComponent: ComponentType<P>,\n): ComponentType<ExcludeRouterProps<P>> {\n function WithRouterWrapper(props: ExcludeRouterProps<P>): ReactElement {\n const router = useRouter();\n // Match Next.js spread order:\n // `<ComposedComponent router={useRouter()} {...props} />`\n // The injected `router` is placed first, and `{...props}` is spread\n // after, so a user-passed `router` prop overrides the HOC-injected\n // one (last-spread wins). Mirrors\n // packages/next/src/client/with-router.tsx. At the type level\n // `props: ExcludeRouterProps<P>` has no `router` key, but TS still\n // sees `P` as `WithRouterProps`-extending when checking the literal,\n // so we widen to a `Record` for the final prop bag.\n const merged: Record<string, unknown> = { router, ...(props as Record<string, unknown>) };\n return createElement(ComposedComponent, merged as unknown as P);\n }\n\n // Forward getInitialProps so class-component pages that define it keep\n // working when wrapped. Mirrors Next.js's with-router.tsx.\n const composed = ComposedComponent as ComponentType<P> & {\n getInitialProps?: unknown;\n origGetInitialProps?: unknown;\n };\n (WithRouterWrapper as unknown as { getInitialProps?: unknown }).getInitialProps =\n composed.getInitialProps;\n (WithRouterWrapper as unknown as { origGetInitialProps?: unknown }).origGetInitialProps =\n composed.origGetInitialProps;\n\n if (process.env.NODE_ENV !== \"production\") {\n const name = composed.displayName || composed.name || \"Unknown\";\n WithRouterWrapper.displayName = `withRouter(${name})`;\n }\n\n return WithRouterWrapper;\n}\n\n// Note: `withRouter` is exposed only as a named export from `next/router`.\n// The default export of that module is the Router singleton declared below.\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(full)) {\n const eventUrl = resolveHashUrl(full);\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(full)) {\n const eventUrl = resolveHashUrl(full);\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\n// Expose `window.next.router` for Next.js parity. Pages Router test suites,\n// userland scripts, and third-party libraries reach for this global directly\n// (e.g. `window.next.router.push(...)`, `window.next.router.events.on(...)`).\n// Without this assignment, those callers crash with\n// `TypeError: Cannot read properties of undefined (reading 'router')`.\n//\n// Ported from Next.js: `packages/next/src/client/next.ts` (line 13). We do\n// NOT use a live-binding getter like Next.js does because vinext's Router\n// singleton is constructed synchronously here, so by the time this module\n// finishes loading the value is final.\nif (typeof window !== \"undefined\") {\n // Cast: `NextRouter.push`/`replace` are typed with narrow parameters\n // (UrlObject | string) while `PagesRouterPublicInstance` accepts unknown\n // args. The two are structurally compatible at runtime; TypeScript flags\n // the narrowing of contravariant function params, which is benign here\n // because callers reading off `window.next.router` are tests/userland\n // and treat the surface as opaque.\n installWindowNext({ router: Router as unknown as PagesRouterPublicInstance });\n}\n\nexport default Router;\n"],"mappings":"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"}