vinext 0.0.53 → 0.0.54

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.
Files changed (188) hide show
  1. package/dist/build/inline-css.d.ts +7 -0
  2. package/dist/build/inline-css.js +50 -0
  3. package/dist/build/inline-css.js.map +1 -0
  4. package/dist/build/prerender.js +2 -1
  5. package/dist/build/prerender.js.map +1 -1
  6. package/dist/check.js +4 -0
  7. package/dist/check.js.map +1 -1
  8. package/dist/client/navigation-runtime.d.ts +2 -1
  9. package/dist/client/navigation-runtime.js.map +1 -1
  10. package/dist/client/window-next.d.ts +7 -0
  11. package/dist/client/window-next.js.map +1 -1
  12. package/dist/config/next-config.d.ts +83 -1
  13. package/dist/config/next-config.js +131 -2
  14. package/dist/config/next-config.js.map +1 -1
  15. package/dist/deploy.js +13 -0
  16. package/dist/deploy.js.map +1 -1
  17. package/dist/entries/app-browser-entry.d.ts +11 -1
  18. package/dist/entries/app-browser-entry.js +16 -6
  19. package/dist/entries/app-browser-entry.js.map +1 -1
  20. package/dist/entries/app-rsc-entry.d.ts +8 -1
  21. package/dist/entries/app-rsc-entry.js +18 -5
  22. package/dist/entries/app-rsc-entry.js.map +1 -1
  23. package/dist/entries/app-rsc-manifest.d.ts +21 -1
  24. package/dist/entries/app-rsc-manifest.js +6 -4
  25. package/dist/entries/app-rsc-manifest.js.map +1 -1
  26. package/dist/entries/pages-client-entry.d.ts +4 -1
  27. package/dist/entries/pages-client-entry.js +18 -2
  28. package/dist/entries/pages-client-entry.js.map +1 -1
  29. package/dist/entries/pages-server-entry.js +82 -4
  30. package/dist/entries/pages-server-entry.js.map +1 -1
  31. package/dist/entries/runtime-entry-module.d.ts +1 -10
  32. package/dist/entries/runtime-entry-module.js +2 -12
  33. package/dist/entries/runtime-entry-module.js.map +1 -1
  34. package/dist/index.js +63 -5
  35. package/dist/index.js.map +1 -1
  36. package/dist/plugins/remove-console.d.ts +16 -0
  37. package/dist/plugins/remove-console.js +176 -0
  38. package/dist/plugins/remove-console.js.map +1 -0
  39. package/dist/routing/app-route-graph.d.ts +24 -1
  40. package/dist/routing/app-route-graph.js +52 -4
  41. package/dist/routing/app-route-graph.js.map +1 -1
  42. package/dist/routing/app-router.d.ts +2 -2
  43. package/dist/routing/app-router.js +2 -2
  44. package/dist/routing/app-router.js.map +1 -1
  45. package/dist/routing/file-matcher.d.ts +21 -1
  46. package/dist/routing/file-matcher.js +39 -1
  47. package/dist/routing/file-matcher.js.map +1 -1
  48. package/dist/routing/pages-router.d.ts +1 -1
  49. package/dist/routing/pages-router.js +10 -3
  50. package/dist/routing/pages-router.js.map +1 -1
  51. package/dist/server/api-handler.js +1 -1
  52. package/dist/server/app-browser-entry.js +25 -16
  53. package/dist/server/app-browser-entry.js.map +1 -1
  54. package/dist/server/app-browser-navigation-controller.d.ts +2 -0
  55. package/dist/server/app-browser-navigation-controller.js +4 -0
  56. package/dist/server/app-browser-navigation-controller.js.map +1 -1
  57. package/dist/server/app-elements-wire.d.ts +13 -4
  58. package/dist/server/app-elements-wire.js +10 -1
  59. package/dist/server/app-elements-wire.js.map +1 -1
  60. package/dist/server/app-elements.d.ts +2 -2
  61. package/dist/server/app-elements.js +2 -2
  62. package/dist/server/app-elements.js.map +1 -1
  63. package/dist/server/app-fallback-renderer.d.ts +15 -5
  64. package/dist/server/app-fallback-renderer.js +10 -4
  65. package/dist/server/app-fallback-renderer.js.map +1 -1
  66. package/dist/server/app-inline-css-client.d.ts +7 -0
  67. package/dist/server/app-inline-css-client.js +37 -0
  68. package/dist/server/app-inline-css-client.js.map +1 -0
  69. package/dist/server/app-page-boundary.d.ts +21 -1
  70. package/dist/server/app-page-boundary.js +28 -3
  71. package/dist/server/app-page-boundary.js.map +1 -1
  72. package/dist/server/app-page-cache.d.ts +7 -3
  73. package/dist/server/app-page-cache.js +7 -7
  74. package/dist/server/app-page-cache.js.map +1 -1
  75. package/dist/server/app-page-dispatch.d.ts +10 -1
  76. package/dist/server/app-page-dispatch.js +126 -79
  77. package/dist/server/app-page-dispatch.js.map +1 -1
  78. package/dist/server/app-page-element-builder.js +12 -28
  79. package/dist/server/app-page-element-builder.js.map +1 -1
  80. package/dist/server/app-page-render-identity.d.ts +22 -0
  81. package/dist/server/app-page-render-identity.js +42 -0
  82. package/dist/server/app-page-render-identity.js.map +1 -0
  83. package/dist/server/app-page-render.d.ts +8 -1
  84. package/dist/server/app-page-render.js +4 -1
  85. package/dist/server/app-page-render.js.map +1 -1
  86. package/dist/server/app-page-request.d.ts +6 -3
  87. package/dist/server/app-page-request.js +5 -2
  88. package/dist/server/app-page-request.js.map +1 -1
  89. package/dist/server/app-page-response.js +2 -2
  90. package/dist/server/app-page-response.js.map +1 -1
  91. package/dist/server/app-page-route-wiring.d.ts +15 -0
  92. package/dist/server/app-page-route-wiring.js +7 -5
  93. package/dist/server/app-page-route-wiring.js.map +1 -1
  94. package/dist/server/app-page-stream.d.ts +11 -0
  95. package/dist/server/app-page-stream.js +1 -0
  96. package/dist/server/app-page-stream.js.map +1 -1
  97. package/dist/server/app-route-handler-response.js +37 -5
  98. package/dist/server/app-route-handler-response.js.map +1 -1
  99. package/dist/server/app-rsc-handler.d.ts +14 -3
  100. package/dist/server/app-rsc-handler.js +45 -5
  101. package/dist/server/app-rsc-handler.js.map +1 -1
  102. package/dist/server/app-rsc-request-normalization.d.ts +2 -1
  103. package/dist/server/app-rsc-request-normalization.js +3 -2
  104. package/dist/server/app-rsc-request-normalization.js.map +1 -1
  105. package/dist/server/app-server-action-execution.d.ts +21 -3
  106. package/dist/server/app-server-action-execution.js +42 -7
  107. package/dist/server/app-server-action-execution.js.map +1 -1
  108. package/dist/server/app-ssr-entry.d.ts +6 -0
  109. package/dist/server/app-ssr-entry.js +22 -7
  110. package/dist/server/app-ssr-entry.js.map +1 -1
  111. package/dist/server/app-ssr-error-meta.js +3 -3
  112. package/dist/server/app-ssr-error-meta.js.map +1 -1
  113. package/dist/server/app-ssr-stream.d.ts +2 -1
  114. package/dist/server/app-ssr-stream.js +176 -31
  115. package/dist/server/app-ssr-stream.js.map +1 -1
  116. package/dist/server/client-trace-metadata.d.ts +31 -0
  117. package/dist/server/client-trace-metadata.js +83 -0
  118. package/dist/server/client-trace-metadata.js.map +1 -0
  119. package/dist/server/cookie-utils.d.ts +13 -0
  120. package/dist/server/cookie-utils.js +20 -0
  121. package/dist/server/cookie-utils.js.map +1 -0
  122. package/dist/server/dev-server.d.ts +8 -1
  123. package/dist/server/dev-server.js +34 -5
  124. package/dist/server/dev-server.js.map +1 -1
  125. package/dist/server/html.d.ts +2 -1
  126. package/dist/server/html.js +6 -1
  127. package/dist/server/html.js.map +1 -1
  128. package/dist/server/isr-cache.d.ts +7 -5
  129. package/dist/server/isr-cache.js +17 -6
  130. package/dist/server/isr-cache.js.map +1 -1
  131. package/dist/server/middleware-runtime.js +1 -2
  132. package/dist/server/middleware-runtime.js.map +1 -1
  133. package/dist/server/pages-document-initial-props.d.ts +7 -0
  134. package/dist/server/pages-document-initial-props.js +14 -0
  135. package/dist/server/pages-document-initial-props.js.map +1 -0
  136. package/dist/server/pages-page-data.js +3 -0
  137. package/dist/server/pages-page-data.js.map +1 -1
  138. package/dist/server/pages-page-method.d.ts +48 -0
  139. package/dist/server/pages-page-method.js +19 -0
  140. package/dist/server/pages-page-method.js.map +1 -0
  141. package/dist/server/pages-page-response.d.ts +6 -0
  142. package/dist/server/pages-page-response.js +10 -3
  143. package/dist/server/pages-page-response.js.map +1 -1
  144. package/dist/server/pages-serializable-props.d.ts +25 -0
  145. package/dist/server/pages-serializable-props.js +69 -0
  146. package/dist/server/pages-serializable-props.js.map +1 -0
  147. package/dist/server/prod-server.js +3 -0
  148. package/dist/server/prod-server.js.map +1 -1
  149. package/dist/server/server-action-not-found.js +3 -2
  150. package/dist/server/server-action-not-found.js.map +1 -1
  151. package/dist/server/static-file-cache.js +2 -1
  152. package/dist/server/static-file-cache.js.map +1 -1
  153. package/dist/shims/app-router-scroll-state.d.ts +4 -2
  154. package/dist/shims/app-router-scroll-state.js +16 -3
  155. package/dist/shims/app-router-scroll-state.js.map +1 -1
  156. package/dist/shims/app-router-scroll.d.ts +16 -2
  157. package/dist/shims/app-router-scroll.js +18 -3
  158. package/dist/shims/app-router-scroll.js.map +1 -1
  159. package/dist/shims/cache.d.ts +6 -0
  160. package/dist/shims/cache.js +7 -0
  161. package/dist/shims/cache.js.map +1 -1
  162. package/dist/shims/error.js +3 -0
  163. package/dist/shims/error.js.map +1 -1
  164. package/dist/shims/headers.d.ts +7 -0
  165. package/dist/shims/headers.js +9 -1
  166. package/dist/shims/headers.js.map +1 -1
  167. package/dist/shims/internal/app-route-detection.d.ts +37 -0
  168. package/dist/shims/internal/app-route-detection.js +69 -0
  169. package/dist/shims/internal/app-route-detection.js.map +1 -0
  170. package/dist/shims/link.d.ts +18 -2
  171. package/dist/shims/link.js +70 -6
  172. package/dist/shims/link.js.map +1 -1
  173. package/dist/shims/metadata.d.ts +7 -6
  174. package/dist/shims/metadata.js +9 -5
  175. package/dist/shims/metadata.js.map +1 -1
  176. package/dist/shims/navigation.d.ts +1 -2
  177. package/dist/shims/navigation.js +63 -12
  178. package/dist/shims/navigation.js.map +1 -1
  179. package/dist/shims/router.d.ts +5 -0
  180. package/dist/shims/router.js +14 -4
  181. package/dist/shims/router.js.map +1 -1
  182. package/dist/shims/script.d.ts +11 -1
  183. package/dist/shims/script.js +75 -6
  184. package/dist/shims/script.js.map +1 -1
  185. package/dist/utils/path.d.ts +13 -0
  186. package/dist/utils/path.js +16 -0
  187. package/dist/utils/path.js.map +1 -0
  188. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"link.js","names":[],"sources":["../../src/shims/link.tsx"],"sourcesContent":["\"use client\";\n\n/**\n * next/link shim\n *\n * Renders an <a> tag with client-side navigation support.\n * On click, prevents full page reload and triggers client-side\n * page swap via the router's navigation system.\n */\nimport React, {\n forwardRef,\n useRef,\n useEffect,\n useCallback,\n useContext,\n createContext,\n useState,\n type AnchorHTMLAttributes,\n type MouseEvent,\n type TouchEvent,\n} from \"react\";\nimport {\n getNavigationRuntime,\n hasAppNavigationRuntime,\n registerNavigationRuntimeFunctions,\n} from \"../client/navigation-runtime.js\";\n// Import shared RSC prefetch utilities from navigation shim (relative path\n// so this resolves both via the Vite plugin and in direct vitest imports)\nimport {\n getPrefetchInterceptionContext,\n getPrefetchCache,\n getPrefetchedUrls,\n getMountedSlotsHeader,\n navigateClientSide,\n prefetchRscResponse,\n} from \"./navigation.js\";\nimport { AppElementsWire } from \"../server/app-elements.js\";\nimport {\n createRscRequestHeaders,\n createRscRequestUrl,\n stripRscCacheBustingSearchParam,\n stripRscSuffix,\n} from \"../server/app-rsc-cache-busting.js\";\nimport { APP_RSC_RENDER_MODE_PREFETCH_LOADING_SHELL } from \"../server/app-rsc-render-mode.js\";\nimport { VINEXT_MOUNTED_SLOTS_HEADER } from \"../server/headers.js\";\nimport { isDangerousScheme, reportBlockedDangerousNavigation } from \"./url-safety.js\";\nimport {\n canLinkIntentPrefetch,\n canLinkPrefetch,\n getLinkPrefetchHref,\n type LinkPrefetchRouterMode,\n} from \"./link-prefetch.js\";\nimport {\n isAbsoluteOrProtocolRelativeUrl,\n normalizePathTrailingSlash,\n resolveRelativeHref,\n toBrowserNavigationHref,\n toSameOriginAppPath,\n withBasePath,\n} from \"./url-utils.js\";\nimport { appendSearchParamsToUrl, type UrlQuery, urlQueryToSearchParams } from \"../utils/query.js\";\nimport { addLocalePrefix, getDomainLocaleUrl, type DomainLocale } from \"../utils/domain-locale.js\";\nimport { getI18nContext } from \"./i18n-context.js\";\nimport type { VinextLinkPrefetchRoute, VinextNextData } from \"../client/vinext-next-data.js\";\nimport { navigatePagesRouterLink } from \"../client/pages-router-link-navigation.js\";\nimport { createRouteTrieCache, matchRouteWithTrie } from \"../routing/route-matching.js\";\nimport { stripBasePath } from \"../utils/base-path.js\";\nimport {\n prefetchPagesData,\n resolvePagesDataNavigationTarget,\n} from \"./internal/pages-data-target.js\";\nimport { getCurrentBrowserLocale } from \"./client-locale.js\";\n\ntype NavigateEvent = {\n url: URL;\n /** Call to prevent the Link's default navigation (e.g. for View Transitions). */\n preventDefault(): void;\n /** Whether preventDefault() has been called. */\n defaultPrevented: boolean;\n};\n\ntype LinkProps = {\n href: string | { pathname?: string; query?: UrlQuery };\n /** URL displayed in the browser (when href is a route pattern like /user/[id]) */\n as?: string;\n /** Replace the current history entry instead of pushing */\n replace?: boolean;\n /** Prefetch the page in the background (App Router default: auto, Pages Router default: true) */\n prefetch?: boolean | \"auto\" | null;\n /**\n * Unstable App Router option matching Next.js canary: an automatic prefetch\n * is upgraded to a full prefetch when the user shows navigation intent.\n */\n unstable_dynamicOnHover?: boolean;\n /** Whether to pass the href to the child element */\n passHref?: boolean;\n /** Scroll to top on navigation (default: true) */\n scroll?: boolean;\n /**\n * Pages Router: update the URL without re-running data fetching methods\n * (getServerSideProps / getStaticProps / getInitialProps). The shallow change\n * still triggers the route change events and updates `router.query`. Only\n * applies to navigations within the same page. No-op on the App Router.\n */\n shallow?: boolean;\n /** Locale for i18n (used for locale-prefixed URLs) */\n locale?: string | false;\n /** Called before navigation happens (Next.js 16). Return value is ignored. */\n onNavigate?: (event: NavigateEvent) => void;\n children?: React.ReactNode;\n} & Omit<AnchorHTMLAttributes<HTMLAnchorElement>, \"href\">;\n\ntype LinkPrefetchMode = \"disabled\" | \"auto\" | \"full\";\n\ndeclare global {\n // Window is an ambient interface from lib.dom; interface merging is required\n // for this global browser hook.\n // oxlint-disable-next-line typescript-eslint/consistent-type-definitions\n interface Window {\n __VINEXT_LINK_PREFETCH_ROUTES__?: VinextLinkPrefetchRoute[];\n }\n}\n\n// ---------------------------------------------------------------------------\n// useLinkStatus — reports the pending state of a parent <Link> navigation\n// ---------------------------------------------------------------------------\n\ntype LinkStatusContextValue = {\n pending: boolean;\n};\n\nconst LinkStatusContext = createContext<LinkStatusContextValue>({ pending: false });\n\n/**\n * useLinkStatus returns the pending state of the enclosing <Link>.\n * In Next.js, this is used to show loading indicators while a\n * prefetch-triggered navigation is in progress.\n */\nexport function useLinkStatus(): LinkStatusContextValue {\n return useContext(LinkStatusContext);\n}\n\n/** basePath from next.config.js, injected by the plugin at build time */\nconst __basePath: string = process.env.__NEXT_ROUTER_BASEPATH ?? \"\";\n/** trailingSlash from next.config.js, injected by the plugin at build time */\nconst __trailingSlash: boolean = process.env.__VINEXT_TRAILING_SLASH === \"true\";\nconst linkPrefetchRouteTrieCache = createRouteTrieCache<VinextLinkPrefetchRoute>();\n\nfunction resolveHref(href: LinkProps[\"href\"]): string {\n if (typeof href === \"string\") return href;\n let url = href.pathname ?? \"/\";\n if (href.query) {\n const params = urlQueryToSearchParams(href.query);\n url = appendSearchParamsToUrl(url, params);\n }\n return url;\n}\n\n/**\n * Collapse repeated forward-slashes (and convert backslashes to forward-slashes)\n * in the path portion of a URL, preserving any query string.\n *\n * Ported from Next.js: packages/next/src/shared/lib/utils/normalize-repeated-slashes.ts\n * https://github.com/vercel/next.js/blob/canary/packages/next/src/shared/lib/utils/normalize-repeated-slashes.ts\n */\nfunction normalizeRepeatedSlashes(url: string): string {\n const urlParts = url.split(\"?\");\n const urlNoQueryString = urlParts.shift() ?? \"\";\n const queryString = urlParts.join(\"?\");\n return (\n urlNoQueryString.replace(/\\\\/g, \"/\").replace(/\\/\\/+/g, \"/\") +\n (queryString ? `?${queryString}` : \"\")\n );\n}\n\n/**\n * Emit Next.js's \"Invalid href\" `console.error` when `href` contains repeated\n * forward slashes or backslashes in its path portion, and return the\n * normalized URL (with `\\\\` converted to `/` and runs of `/` collapsed). If\n * the href is already well-formed, the original string is returned unchanged.\n *\n * Ported from Next.js: packages/next/src/client/resolve-href.ts\n * https://github.com/vercel/next.js/blob/canary/packages/next/src/client/resolve-href.ts\n *\n * Matches the message asserted by:\n * test/e2e/repeated-forward-slashes-error/repeated-forward-slashes-error.test.ts\n *\n * Note: Next.js fires this warning unconditionally on every call to\n * `resolveHref`. We mirror that behaviour (no dedup) for exact parity.\n *\n * Note: Next.js uses `router.pathname` (the route pattern, e.g.\n * `/posts/[id]`) for the \"in page\" segment of the message. We do not have\n * cheap access to the route pattern from inside the Link shim, so we\n * fall back to `window.location.pathname` (or `\"/\"` during SSR). The text\n * is cosmetic and is not asserted by the Next.js compat test.\n */\nfunction warnAndNormalizeRepeatedSlashesInHref(urlAsString: string): string {\n // Protocol-relative URLs (e.g. \"//example.com/path\") are treated by vinext\n // as external — see `isAbsoluteOrProtocolRelativeUrl` in url-utils. We\n // intentionally skip the repeated-slash warning and normalization for them\n // so that locale prefixing and same-origin detection elsewhere in this\n // shim continue to receive the original href. (Next.js itself does flag\n // these, but our external-URL handling supersedes that behaviour.)\n if (urlAsString.startsWith(\"//\")) return urlAsString;\n\n // Strip any protocol prefix (e.g. \"https://\") so we do not flag the\n // legitimate `//` that separates the scheme from the authority.\n const urlProtoMatch = urlAsString.match(/^[a-z][a-z0-9+.-]*:\\/\\//i);\n const urlAsStringNoProto = urlProtoMatch\n ? urlAsString.slice(urlProtoMatch[0].length)\n : urlAsString;\n const urlParts = urlAsStringNoProto.split(\"?\", 1);\n if (!(urlParts[0] || \"\").match(/(\\/\\/|\\\\)/)) return urlAsString;\n\n const pathname =\n typeof window !== \"undefined\" && window.location ? window.location.pathname : \"/\";\n console.error(\n `Invalid href '${urlAsString}' passed to next/router in page: '${pathname}'. Repeated forward-slashes (//) or backslashes \\\\ are not valid in the href.`,\n );\n\n const normalizedNoProto = normalizeRepeatedSlashes(urlAsStringNoProto);\n return (urlProtoMatch ? urlProtoMatch[0] : \"\") + normalizedNoProto;\n}\n\nexport function resolveLinkPrefetchMode(\n prefetchProp: LinkProps[\"prefetch\"],\n isDangerous: boolean,\n): LinkPrefetchMode {\n if (isDangerous || prefetchProp === false) return \"disabled\";\n if (prefetchProp === true) return \"full\";\n return \"auto\";\n}\n\nfunction toSameOriginRouteHref(href: string): string | null {\n if (typeof window === \"undefined\") return null;\n\n let url: URL;\n try {\n url = new URL(href, window.location.href);\n } catch {\n return null;\n }\n\n if (url.origin !== window.location.origin) return null;\n\n return `${stripBasePath(url.pathname, __basePath)}${url.search}`;\n}\n\nfunction getLinkPrefetchRouterMode(): LinkPrefetchRouterMode {\n return hasAppNavigationRuntime() ? \"app\" : \"pages\";\n}\n\nexport function canAutoPrefetchFullAppRoute(href: string): boolean {\n if (typeof window === \"undefined\") return false;\n\n const routes = window.__VINEXT_LINK_PREFETCH_ROUTES__;\n if (!routes) return false;\n\n const routeHref = toSameOriginRouteHref(href);\n if (routeHref === null) return false;\n\n const match = matchRouteWithTrie(routeHref, routes, linkPrefetchRouteTrieCache);\n if (!match) return false;\n\n return !match.route.isDynamic;\n}\n\nexport function resolveAutoAppRoutePrefetch(href: string): {\n cacheForNavigation: boolean;\n shouldPrefetch: boolean;\n} {\n if (typeof window === \"undefined\") {\n return { cacheForNavigation: false, shouldPrefetch: false };\n }\n\n const routes = window.__VINEXT_LINK_PREFETCH_ROUTES__;\n if (!routes) {\n return { cacheForNavigation: false, shouldPrefetch: false };\n }\n\n const routeHref = toSameOriginRouteHref(href);\n if (routeHref === null) {\n return { cacheForNavigation: false, shouldPrefetch: false };\n }\n\n const match = matchRouteWithTrie(routeHref, routes, linkPrefetchRouteTrieCache);\n if (!match) {\n return { cacheForNavigation: false, shouldPrefetch: false };\n }\n\n return {\n cacheForNavigation: !match.route.isDynamic,\n shouldPrefetch: !match.route.isDynamic || match.route.canPrefetchLoadingShell,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Prefetching infrastructure\n// ---------------------------------------------------------------------------\n\n/**\n * Prefetch a URL for faster navigation.\n *\n * For App Router (RSC): fetches the .rsc payload in the background and\n * stores it in an in-memory cache for instant use during navigation.\n * For Pages Router: injects a <link rel=\"prefetch\"> for the page module.\n *\n * Uses `requestIdleCallback` (or `setTimeout` fallback) to avoid blocking\n * the main thread during initial page load.\n */\nfunction prefetchUrl(href: string, mode: LinkPrefetchMode, priority: \"low\" | \"high\" = \"low\"): void {\n if (typeof window === \"undefined\") return;\n\n const prefetchHref = getLinkPrefetchHref({\n href,\n basePath: __basePath,\n currentOrigin: window.location.origin,\n });\n if (prefetchHref == null) return;\n\n const fullHref = toBrowserNavigationHref(prefetchHref, window.location.href, __basePath);\n\n const schedule = window.requestIdleCallback ?? ((fn: () => void) => setTimeout(fn, 100));\n\n schedule(() => {\n void (async () => {\n if (hasAppNavigationRuntime()) {\n const autoPrefetch =\n mode === \"auto\"\n ? resolveAutoAppRoutePrefetch(prefetchHref)\n : { cacheForNavigation: true, shouldPrefetch: true };\n if (!autoPrefetch.shouldPrefetch) return;\n\n const interceptionContext = getPrefetchInterceptionContext(fullHref);\n const mountedSlotsHeader = getMountedSlotsHeader();\n const isOptimisticRouteShellPrefetch = !autoPrefetch.cacheForNavigation;\n if (isOptimisticRouteShellPrefetch && interceptionContext !== null) return;\n const headers = createRscRequestHeaders({\n interceptionContext,\n renderMode: isOptimisticRouteShellPrefetch\n ? APP_RSC_RENDER_MODE_PREFETCH_LOADING_SHELL\n : undefined,\n });\n if (mountedSlotsHeader) {\n headers.set(VINEXT_MOUNTED_SLOTS_HEADER, mountedSlotsHeader);\n }\n // Distinguish the same visible URL when it is prefetched from different\n // request contexts such as /feed vs /gallery or different mounted slots.\n const rscUrl = await createRscRequestUrl(fullHref, headers);\n const cacheKey = AppElementsWire.encodeCacheKey(rscUrl, interceptionContext);\n const prefetched = getPrefetchedUrls();\n if (prefetched.has(cacheKey)) {\n if (autoPrefetch.cacheForNavigation) {\n const existing = getPrefetchCache().get(cacheKey);\n if (existing?.cacheForNavigation === false) {\n existing.cacheForNavigation = true;\n }\n }\n return;\n }\n prefetched.add(cacheKey);\n prefetchRscResponse(\n rscUrl,\n fetch(rscUrl, {\n headers,\n credentials: \"include\",\n priority,\n // @ts-expect-error — purpose is a valid fetch option in some browsers\n purpose: \"prefetch\",\n }),\n interceptionContext,\n mountedSlotsHeader,\n undefined,\n {\n cacheForNavigation: autoPrefetch.cacheForNavigation,\n optimisticRouteShell: isOptimisticRouteShellPrefetch,\n },\n );\n } else if (window.__NEXT_DATA__) {\n // Pages Router prefetch. When a code-split loader is registered for\n // the target route (prod builds expose them on window via the\n // generated client entry), prefetch the data JSON + warm the page\n // chunk in parallel — matching the actual navigation, so the click\n // is a double cache hit. Otherwise (dev, or unmapped route) fall\n // back to the legacy `<link rel=\"prefetch\" as=\"document\">` so the\n // browser still preloads the HTML.\n //\n // The decision helper + prefetch action live in shims/internal/ so\n // this file does not pull in the router shim at module init time,\n // which would create a circular import and grow the SSR module graph.\n const dataTarget = resolvePagesDataNavigationTarget(fullHref, __basePath);\n if (dataTarget) {\n prefetchPagesData(dataTarget);\n } else {\n // Legacy fallback: hint the browser to preload the HTML document.\n // Used in dev (no loader map populated) and for routes not in the\n // client loader map.\n const link = document.createElement(\"link\");\n link.rel = \"prefetch\";\n link.href = fullHref;\n link.as = \"document\";\n document.head.appendChild(link);\n }\n }\n })().catch((error) => {\n console.error(\"[vinext] RSC prefetch setup error:\", error);\n });\n });\n}\n\nfunction promotePrefetchEntriesForNavigation(href: string): void {\n if (typeof window === \"undefined\") return;\n\n let target: URL;\n try {\n target = new URL(\n toBrowserNavigationHref(href, window.location.href, __basePath),\n window.location.href,\n );\n } catch {\n return;\n }\n\n for (const [cacheKey, entry] of getPrefetchCache()) {\n if (entry.optimisticRouteShell === true) continue;\n\n const [rscUrl] = cacheKey.split(\"\\0\", 1);\n let cached: URL;\n try {\n cached = new URL(rscUrl, window.location.href);\n } catch {\n continue;\n }\n stripRscCacheBustingSearchParam(cached);\n if (stripRscSuffix(cached.pathname) === target.pathname && cached.search === target.search) {\n entry.cacheForNavigation = true;\n }\n }\n}\n\n/**\n * Shared IntersectionObserver for viewport-based prefetching.\n * All Link elements use the same observer to minimize resource usage.\n */\nlet sharedObserver: IntersectionObserver | null = null;\ntype LinkPrefetchInstance = {\n href: string;\n isVisible: boolean;\n mode: LinkPrefetchMode;\n routerMode: LinkPrefetchRouterMode;\n viewportPrefetched: boolean;\n};\n\nconst observedLinkPrefetches = new WeakMap<Element, LinkPrefetchInstance>();\nconst visibleLinkPrefetches = new Set<LinkPrefetchInstance>();\n\nfunction setVisibleLinkPrefetch(instance: LinkPrefetchInstance, isVisible: boolean): void {\n instance.isVisible = isVisible;\n if (isVisible) {\n visibleLinkPrefetches.add(instance);\n if (instance.routerMode === \"pages\" && instance.viewportPrefetched) return;\n prefetchUrl(instance.href, instance.mode, \"low\");\n instance.viewportPrefetched = true;\n } else {\n visibleLinkPrefetches.delete(instance);\n }\n}\n\nfunction registerVisibleLinkPing(): void {\n if (typeof window === \"undefined\") return;\n registerNavigationRuntimeFunctions({ pingVisibleLinks: pingVisibleLinkPrefetches });\n}\n\nfunction pingVisibleLinkPrefetches(): void {\n for (const instance of visibleLinkPrefetches) {\n if (instance.isVisible && instance.routerMode === \"app\") {\n prefetchUrl(instance.href, instance.mode, \"low\");\n }\n }\n}\n\nfunction getSharedObserver(): IntersectionObserver | null {\n if (typeof window === \"undefined\" || typeof IntersectionObserver === \"undefined\") return null;\n if (sharedObserver) return sharedObserver;\n\n sharedObserver = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n const instance = observedLinkPrefetches.get(entry.target);\n if (!instance) continue;\n setVisibleLinkPrefetch(instance, entry.isIntersecting || entry.intersectionRatio > 0);\n }\n },\n {\n // Start prefetching when the link is within 250px of the viewport.\n // This gives the browser a head start before the user scrolls to it.\n rootMargin: \"250px\",\n },\n );\n\n return sharedObserver;\n}\n\nfunction getDefaultLocale(): string | undefined {\n if (typeof window !== \"undefined\") {\n return window.__VINEXT_DEFAULT_LOCALE__;\n }\n return getI18nContext()?.defaultLocale;\n}\n\nfunction getCurrentLocale(): string | undefined {\n if (typeof window !== \"undefined\") {\n return getCurrentBrowserLocale({\n basePath: __basePath,\n domainLocales: getDomainLocales(),\n hostname: getCurrentHostname(),\n });\n }\n return getI18nContext()?.locale;\n}\n\nfunction getDomainLocales(): readonly DomainLocale[] | undefined {\n if (typeof window !== \"undefined\") {\n return (window.__NEXT_DATA__ as VinextNextData | undefined)?.domainLocales;\n }\n return getI18nContext()?.domainLocales;\n}\n\nfunction getCurrentHostname(): string | undefined {\n if (typeof window !== \"undefined\") return window.location.hostname;\n return getI18nContext()?.hostname;\n}\n\nfunction getDomainLocaleHref(href: string, locale: string): string | undefined {\n // Only cross-domain locale switches need a special absolute URL here.\n // Same-domain cases fall back to the standard locale-prefix logic below.\n return getDomainLocaleUrl(href, locale, {\n basePath: __basePath,\n currentHostname: getCurrentHostname(),\n domainItems: getDomainLocales(),\n });\n}\n\nfunction addLocalePrefixForRoot(href: string, locale: string): string | undefined {\n if (href !== \"/\" && !href.startsWith(\"/?\") && !href.startsWith(\"/#\")) {\n return undefined;\n }\n\n let parsed: URL;\n try {\n parsed = new URL(href, \"http://vinext.local\");\n } catch {\n return undefined;\n }\n\n if (parsed.origin !== \"http://vinext.local\" || parsed.pathname !== \"/\") {\n return undefined;\n }\n\n return `/${locale}${parsed.search}${parsed.hash}`;\n}\n\n/**\n * Apply locale prefix to a URL path based on the locale prop.\n * - locale=\"fr\" → prepend /fr (unless it already has a locale prefix)\n * - locale={false} → use the href as-is (no locale prefix, link to default)\n * - locale=undefined → use current locale (href as-is in most cases)\n */\nfunction applyLocaleToHref(href: string, locale: string | false | undefined): string {\n if (locale === false) {\n // Explicit false: no locale prefix\n return href;\n }\n\n const resolvedLocale = locale ?? getCurrentLocale();\n if (resolvedLocale === undefined) {\n return href;\n }\n\n // Absolute and protocol-relative URLs must not be prefixed — locale\n // only applies to local paths.\n if (isAbsoluteOrProtocolRelativeUrl(href)) {\n return href;\n }\n\n const domainLocaleHref = getDomainLocaleHref(href, resolvedLocale);\n if (domainLocaleHref) {\n return domainLocaleHref;\n }\n\n const defaultLocale = getDefaultLocale() ?? \"\";\n if (resolvedLocale.toLowerCase() === defaultLocale.toLowerCase()) {\n const localeRootHref = addLocalePrefixForRoot(href, resolvedLocale);\n if (localeRootHref) return localeRootHref;\n }\n\n return addLocalePrefix(href, resolvedLocale, defaultLocale);\n}\n\nconst Link = forwardRef<HTMLAnchorElement, LinkProps>(function Link(\n {\n href,\n as,\n replace = false,\n prefetch: prefetchProp,\n scroll = true,\n shallow = false,\n children,\n onClick,\n onMouseEnter,\n onTouchStart,\n onNavigate,\n unstable_dynamicOnHover = false,\n ...rest\n },\n forwardedRef,\n) {\n // Extract locale from rest props\n const { locale, ...restWithoutLocale } = rest;\n\n // If `as` is provided, use it as the actual URL (legacy Next.js pattern\n // where href is a route pattern like \"/user/[id]\" and as is \"/user/1\")\n const rawResolvedHref = as ?? resolveHref(href);\n\n // Mirror Next.js: emit a console.error when the href contains repeated\n // forward-slashes (e.g. \"/foo//bar\") or backslashes, and then normalize the\n // href so navigation targets the collapsed path rather than the raw one.\n // See packages/next/src/client/resolve-href.ts.\n const resolvedHref =\n typeof rawResolvedHref === \"string\"\n ? warnAndNormalizeRepeatedSlashesInHref(rawResolvedHref)\n : rawResolvedHref;\n\n const isDangerous = typeof resolvedHref === \"string\" && isDangerousScheme(resolvedHref);\n\n // Apply locale prefix if specified (safe even for dangerous hrefs since we\n // won't use the result when isDangerous is true)\n const localizedHref = applyLocaleToHref(isDangerous ? \"/\" : resolvedHref, locale);\n // Normalise trailing slash to match `trailingSlash` config so that rendered\n // hrefs avoid the redirect bounce. Mirrors Next.js's `addLocale`/`addBasePath`,\n // both of which run `normalizePathTrailingSlash` after prefixing — we apply\n // it once after locale prefixing (for prefetch/navigation paths that bypass\n // basePath) and again after `withBasePath` for the rendered `href` attribute.\n const normalizedHref = normalizePathTrailingSlash(localizedHref, __trailingSlash);\n // Full href with basePath for browser URLs and fetches, normalised again so\n // that combining a non-empty basePath with the bare root (`/`) still\n // produces a canonical href under `trailingSlash: false` (e.g. `/foo`\n // rather than `/foo/`).\n const fullHref = normalizePathTrailingSlash(\n withBasePath(normalizedHref, __basePath),\n __trailingSlash,\n );\n\n // Track pending state for useLinkStatus()\n const [pending, setPending] = useState(false);\n const mountedRef = useRef(true);\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n };\n }, []);\n\n // Prefetching: observe the element when it enters the viewport.\n // In App Router, null/undefined/\"auto\" is automatic prefetch and true opts\n // into a full RSC prefetch, matching Next.js's public prefetch contract.\n const internalRef = useRef<HTMLAnchorElement | null>(null);\n const prefetchMode = resolveLinkPrefetchMode(prefetchProp, isDangerous);\n const shouldViewportPrefetch = canLinkPrefetch({\n nodeEnv: process.env.NODE_ENV,\n prefetch: prefetchProp,\n isDangerous,\n });\n\n const setRefs = useCallback(\n (node: HTMLAnchorElement | null) => {\n internalRef.current = node;\n if (typeof forwardedRef === \"function\") forwardedRef(node);\n else if (forwardedRef)\n (forwardedRef as React.MutableRefObject<HTMLAnchorElement | null>).current = node;\n },\n [forwardedRef],\n );\n\n useEffect(() => {\n if (!shouldViewportPrefetch || typeof window === \"undefined\") return;\n const node = internalRef.current;\n if (!node) return;\n\n const hrefToPrefetch = getLinkPrefetchHref({\n href: normalizedHref,\n basePath: __basePath,\n currentOrigin: window.location.origin,\n });\n if (hrefToPrefetch == null) return;\n\n const observer = getSharedObserver();\n if (!observer) return;\n\n registerVisibleLinkPing();\n const instance: LinkPrefetchInstance = {\n href: hrefToPrefetch,\n isVisible: false,\n mode: prefetchMode,\n routerMode: getLinkPrefetchRouterMode(),\n viewportPrefetched: false,\n };\n observedLinkPrefetches.set(node, instance);\n observer.observe(node);\n\n return () => {\n observer.unobserve(node);\n observedLinkPrefetches.delete(node);\n visibleLinkPrefetches.delete(instance);\n };\n }, [shouldViewportPrefetch, prefetchMode, normalizedHref]);\n\n const prefetchOnIntent = useCallback(() => {\n if (\n !canLinkIntentPrefetch({\n nodeEnv: process.env.NODE_ENV,\n prefetch: prefetchProp,\n isDangerous,\n routerMode: getLinkPrefetchRouterMode(),\n })\n ) {\n return;\n }\n const intentMode = unstable_dynamicOnHover ? \"full\" : prefetchMode;\n if (unstable_dynamicOnHover && internalRef.current) {\n const instance = observedLinkPrefetches.get(internalRef.current);\n if (instance) {\n instance.mode = \"full\";\n }\n promotePrefetchEntriesForNavigation(normalizedHref);\n }\n prefetchUrl(normalizedHref, intentMode, \"high\");\n }, [prefetchProp, isDangerous, prefetchMode, normalizedHref, unstable_dynamicOnHover]);\n\n const handleMouseEnter = useCallback(\n (e: MouseEvent<HTMLAnchorElement>) => {\n onMouseEnter?.(e);\n prefetchOnIntent();\n },\n [onMouseEnter, prefetchOnIntent],\n );\n\n const handleTouchStart = useCallback(\n (e: TouchEvent<HTMLAnchorElement>) => {\n onTouchStart?.(e);\n prefetchOnIntent();\n },\n [onTouchStart, prefetchOnIntent],\n );\n\n const handleClick = async (e: MouseEvent<HTMLAnchorElement>) => {\n if (onClick) onClick(e);\n if (e.defaultPrevented) return;\n\n // Native download links must keep the browser's default behavior.\n if (e.currentTarget.hasAttribute(\"download\")) {\n return;\n }\n\n // Only intercept left clicks without modifiers (standard link behavior)\n if (e.button !== 0 || e.metaKey || e.ctrlKey || e.shiftKey || e.altKey) {\n return;\n }\n\n // Don't intercept links with target (e.g. target=\"_blank\")\n if (e.currentTarget.target && e.currentTarget.target !== \"_self\") {\n return;\n }\n\n // External links: let the browser handle it.\n // Same-origin absolute URLs (e.g. http://localhost:3000/about) are\n // normalized to local paths so they get client-side navigation.\n let navigateHref = normalizedHref;\n if (isAbsoluteOrProtocolRelativeUrl(resolvedHref)) {\n const localPath = toSameOriginAppPath(resolvedHref, __basePath);\n if (localPath == null) {\n // Truly external. Mirror Next.js `linkClicked`: when `replace` is set\n // we have to take over because the browser's default click navigation\n // pushes to history rather than replacing the current entry.\n // See `.nextjs-ref/packages/next/src/client/link.tsx` `linkClicked`.\n if (replace) {\n e.preventDefault();\n window.location.replace(resolvedHref);\n }\n return;\n }\n navigateHref = localPath;\n }\n\n e.preventDefault();\n\n // Resolve relative hrefs (#hash, ?query) against the current URL once so\n // onNavigate and the actual navigation target stay in sync.\n const absoluteHref = resolveRelativeHref(navigateHref, window.location.href, __basePath);\n const absoluteFullHref = toBrowserNavigationHref(\n navigateHref,\n window.location.href,\n __basePath,\n );\n\n // Call onNavigate callback if provided (Next.js 16 View Transitions support)\n if (onNavigate) {\n try {\n const navUrl = new URL(absoluteFullHref, window.location.origin);\n let prevented = false;\n const navEvent: NavigateEvent = {\n url: navUrl,\n preventDefault() {\n prevented = true;\n },\n get defaultPrevented() {\n return prevented;\n },\n };\n onNavigate(navEvent);\n // If the callback called preventDefault(), skip Link's default navigation.\n // The callback is responsible for its own navigation (e.g. via View Transitions API).\n if (navEvent.defaultPrevented) {\n return;\n }\n } catch {\n // Ignore URL parsing errors for relative/hash hrefs\n }\n }\n\n // App Router: delegate to navigateClientSide which handles scroll save,\n // hash-only changes, RSC fetch, and two-phase URL commit.\n if (getNavigationRuntime()?.functions.navigate) {\n setPending(true);\n React.startTransition(() => {\n void navigateClientSide(navigateHref, replace ? \"replace\" : \"push\", scroll, true).finally(\n () => {\n if (mountedRef.current) setPending(false);\n },\n );\n });\n return;\n } else {\n // Next.js only consumes onRouterTransitionStart in the App Router.\n // Pages Router still executes instrumentation-client side effects\n // during startup, but it does not invoke the named export on navigation.\n // Pages Router: use the Router singleton\n try {\n const routerModule = await import(\"next/router\");\n const Router = routerModule.default;\n await navigatePagesRouterLink(Router, {\n href: absoluteHref,\n replace,\n scroll,\n shallow,\n locale,\n });\n } catch {\n // Fallback to hard navigation if router fails\n if (replace) {\n window.history.replaceState({}, \"\", absoluteFullHref);\n } else {\n window.history.pushState({}, \"\", absoluteFullHref);\n }\n window.dispatchEvent(new PopStateEvent(\"popstate\"));\n }\n }\n };\n\n // Remove props that shouldn't be on <a>\n const { passHref: _p, ...anchorProps } = restWithoutLocale;\n\n const linkStatusValue = React.useMemo(() => ({ pending }), [pending]);\n\n // Block dangerous URI schemes (javascript:, data:, vbscript:).\n // Render an inert <a> without href to prevent XSS while preserving\n // styling, refs, and developer event handlers like onClick.\n // This check is placed after all hooks to satisfy the Rules of Hooks.\n if (isDangerous) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(`<Link> blocked dangerous href: ${resolvedHref}`);\n }\n // Match Next.js parity: when a user clicks a Link whose href has a\n // dangerous scheme, emit the same `console.error` that Next.js surfaces\n // via React's event-handler runtime when `router.push` throws.\n // Ported from Next.js: test/e2e/app-dir/javascript-urls/javascript-urls.test.ts\n // https://github.com/vercel/next.js/blob/canary/test/e2e/app-dir/javascript-urls/javascript-urls.test.ts\n const handleDangerousClick = (event: MouseEvent<HTMLAnchorElement>) => {\n if (onClick) onClick(event);\n reportBlockedDangerousNavigation();\n };\n return (\n <LinkStatusContext.Provider value={linkStatusValue}>\n <a\n ref={setRefs}\n onClick={handleDangerousClick}\n onMouseEnter={handleMouseEnter}\n onTouchStart={handleTouchStart}\n {...anchorProps}\n >\n {children}\n </a>\n </LinkStatusContext.Provider>\n );\n }\n\n return (\n <LinkStatusContext.Provider value={linkStatusValue}>\n <a\n ref={setRefs}\n href={fullHref}\n onClick={(event) => {\n void handleClick(event);\n }}\n onMouseEnter={handleMouseEnter}\n onTouchStart={handleTouchStart}\n {...anchorProps}\n >\n {children}\n </a>\n </LinkStatusContext.Provider>\n );\n});\n\nexport default Link;\n"],"mappings":"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"}
1
+ {"version":3,"file":"link.js","names":[],"sources":["../../src/shims/link.tsx"],"sourcesContent":["\"use client\";\n\n/**\n * next/link shim\n *\n * Renders an <a> tag with client-side navigation support.\n * On click, prevents full page reload and triggers client-side\n * page swap via the router's navigation system.\n */\nimport React, {\n forwardRef,\n useRef,\n useEffect,\n useCallback,\n useContext,\n createContext,\n useState,\n type AnchorHTMLAttributes,\n type MouseEvent,\n type TouchEvent,\n} from \"react\";\nimport {\n getNavigationRuntime,\n hasAppNavigationRuntime,\n registerNavigationRuntimeFunctions,\n} from \"../client/navigation-runtime.js\";\n// Import shared RSC prefetch utilities from navigation shim (relative path\n// so this resolves both via the Vite plugin and in direct vitest imports)\nimport {\n getPrefetchInterceptionContext,\n getPrefetchCache,\n getPrefetchedUrls,\n getMountedSlotsHeader,\n navigateClientSide,\n prefetchRscResponse,\n} from \"./navigation.js\";\nimport { AppElementsWire } from \"../server/app-elements.js\";\nimport {\n createRscRequestHeaders,\n createRscRequestUrl,\n stripRscCacheBustingSearchParam,\n stripRscSuffix,\n} from \"../server/app-rsc-cache-busting.js\";\nimport { APP_RSC_RENDER_MODE_PREFETCH_LOADING_SHELL } from \"../server/app-rsc-render-mode.js\";\nimport { VINEXT_MOUNTED_SLOTS_HEADER } from \"../server/headers.js\";\nimport { isDangerousScheme, reportBlockedDangerousNavigation } from \"./url-safety.js\";\nimport {\n canLinkIntentPrefetch,\n canLinkPrefetch,\n getLinkPrefetchHref,\n type LinkPrefetchRouterMode,\n} from \"./link-prefetch.js\";\nimport {\n isAbsoluteOrProtocolRelativeUrl,\n normalizePathTrailingSlash,\n resolveRelativeHref,\n toBrowserNavigationHref,\n toSameOriginAppPath,\n withBasePath,\n} from \"./url-utils.js\";\nimport { appendSearchParamsToUrl, type UrlQuery, urlQueryToSearchParams } from \"../utils/query.js\";\nimport { addLocalePrefix, getDomainLocaleUrl, type DomainLocale } from \"../utils/domain-locale.js\";\nimport { getI18nContext } from \"./i18n-context.js\";\nimport type { VinextLinkPrefetchRoute, VinextNextData } from \"../client/vinext-next-data.js\";\nimport { navigatePagesRouterLink } from \"../client/pages-router-link-navigation.js\";\nimport { createRouteTrieCache, matchRouteWithTrie } from \"../routing/route-matching.js\";\nimport { stripBasePath } from \"../utils/base-path.js\";\nimport {\n prefetchPagesData,\n resolvePagesDataNavigationTarget,\n} from \"./internal/pages-data-target.js\";\nimport { markAppRouteDetectedOnPrefetch } from \"./internal/app-route-detection.js\";\nimport { getCurrentBrowserLocale } from \"./client-locale.js\";\n\ntype NavigateEvent = {\n url: URL;\n /** Call to prevent the Link's default navigation (e.g. for View Transitions). */\n preventDefault(): void;\n /** Whether preventDefault() has been called. */\n defaultPrevented: boolean;\n};\n\ntype LinkProps = {\n href: string | { pathname?: string; query?: UrlQuery };\n /** URL displayed in the browser (when href is a route pattern like /user/[id]) */\n as?: string;\n /** Replace the current history entry instead of pushing */\n replace?: boolean;\n /** Prefetch the page in the background (App Router default: auto, Pages Router default: true) */\n prefetch?: boolean | \"auto\" | null;\n /**\n * Unstable App Router option matching Next.js canary: an automatic prefetch\n * is upgraded to a full prefetch when the user shows navigation intent.\n */\n unstable_dynamicOnHover?: boolean;\n /** Whether to pass the href to the child element */\n passHref?: boolean;\n /**\n * Pre-Next.js-13 link behaviour. When true, <Link> expects its child to be\n * an `<a>` (or a component that renders one) and forwards `href`, click,\n * and prefetch handlers to the child via `React.cloneElement` instead of\n * rendering its own wrapping `<a>`. Required when the user wants to\n * style/instrument the anchor themselves.\n */\n legacyBehavior?: boolean;\n /** Scroll to top on navigation (default: true) */\n scroll?: boolean;\n /**\n * Pages Router: update the URL without re-running data fetching methods\n * (getServerSideProps / getStaticProps / getInitialProps). The shallow change\n * still triggers the route change events and updates `router.query`. Only\n * applies to navigations within the same page. No-op on the App Router.\n */\n shallow?: boolean;\n /** Locale for i18n (used for locale-prefixed URLs) */\n locale?: string | false;\n /** Called before navigation happens (Next.js 16). Return value is ignored. */\n onNavigate?: (event: NavigateEvent) => void;\n children?: React.ReactNode;\n} & Omit<AnchorHTMLAttributes<HTMLAnchorElement>, \"href\">;\n\ntype LinkPrefetchMode = \"disabled\" | \"auto\" | \"full\";\n\ndeclare global {\n // Window is an ambient interface from lib.dom; interface merging is required\n // for this global browser hook.\n // oxlint-disable-next-line typescript-eslint/consistent-type-definitions\n interface Window {\n __VINEXT_LINK_PREFETCH_ROUTES__?: VinextLinkPrefetchRoute[];\n }\n}\n\n// ---------------------------------------------------------------------------\n// useLinkStatus — reports the pending state of a parent <Link> navigation\n// ---------------------------------------------------------------------------\n\ntype LinkStatusContextValue = {\n pending: boolean;\n};\n\nconst LinkStatusContext = createContext<LinkStatusContextValue>({ pending: false });\n\n/**\n * useLinkStatus returns the pending state of the enclosing <Link>.\n * In Next.js, this is used to show loading indicators while a\n * prefetch-triggered navigation is in progress.\n */\nexport function useLinkStatus(): LinkStatusContextValue {\n return useContext(LinkStatusContext);\n}\n\n/** basePath from next.config.js, injected by the plugin at build time */\nconst __basePath: string = process.env.__NEXT_ROUTER_BASEPATH ?? \"\";\n/** trailingSlash from next.config.js, injected by the plugin at build time */\nconst __trailingSlash: boolean = process.env.__VINEXT_TRAILING_SLASH === \"true\";\nconst linkPrefetchRouteTrieCache = createRouteTrieCache<VinextLinkPrefetchRoute>();\n\nfunction resolveHref(href: LinkProps[\"href\"]): string {\n if (typeof href === \"string\") return href;\n let url = href.pathname ?? \"/\";\n if (href.query) {\n const params = urlQueryToSearchParams(href.query);\n url = appendSearchParamsToUrl(url, params);\n }\n return url;\n}\n\n/**\n * Collapse repeated forward-slashes (and convert backslashes to forward-slashes)\n * in the path portion of a URL, preserving any query string.\n *\n * Ported from Next.js: packages/next/src/shared/lib/utils/normalize-repeated-slashes.ts\n * https://github.com/vercel/next.js/blob/canary/packages/next/src/shared/lib/utils/normalize-repeated-slashes.ts\n */\nfunction normalizeRepeatedSlashes(url: string): string {\n const urlParts = url.split(\"?\");\n const urlNoQueryString = urlParts.shift() ?? \"\";\n const queryString = urlParts.join(\"?\");\n return (\n urlNoQueryString.replace(/\\\\/g, \"/\").replace(/\\/\\/+/g, \"/\") +\n (queryString ? `?${queryString}` : \"\")\n );\n}\n\n/**\n * Emit Next.js's \"Invalid href\" `console.error` when `href` contains repeated\n * forward slashes or backslashes in its path portion, and return the\n * normalized URL (with `\\\\` converted to `/` and runs of `/` collapsed). If\n * the href is already well-formed, the original string is returned unchanged.\n *\n * Ported from Next.js: packages/next/src/client/resolve-href.ts\n * https://github.com/vercel/next.js/blob/canary/packages/next/src/client/resolve-href.ts\n *\n * Matches the message asserted by:\n * test/e2e/repeated-forward-slashes-error/repeated-forward-slashes-error.test.ts\n *\n * Note: Next.js fires this warning unconditionally on every call to\n * `resolveHref`. We mirror that behaviour (no dedup) for exact parity.\n *\n * Note: Next.js uses `router.pathname` (the route pattern, e.g.\n * `/posts/[id]`) for the \"in page\" segment of the message. We do not have\n * cheap access to the route pattern from inside the Link shim, so we\n * fall back to `window.location.pathname` (or `\"/\"` during SSR). The text\n * is cosmetic and is not asserted by the Next.js compat test.\n */\nfunction warnAndNormalizeRepeatedSlashesInHref(urlAsString: string): string {\n // Protocol-relative URLs (e.g. \"//example.com/path\") are treated by vinext\n // as external — see `isAbsoluteOrProtocolRelativeUrl` in url-utils. We\n // intentionally skip the repeated-slash warning and normalization for them\n // so that locale prefixing and same-origin detection elsewhere in this\n // shim continue to receive the original href. (Next.js itself does flag\n // these, but our external-URL handling supersedes that behaviour.)\n if (urlAsString.startsWith(\"//\")) return urlAsString;\n\n // Strip any protocol prefix (e.g. \"https://\") so we do not flag the\n // legitimate `//` that separates the scheme from the authority.\n const urlProtoMatch = urlAsString.match(/^[a-z][a-z0-9+.-]*:\\/\\//i);\n const urlAsStringNoProto = urlProtoMatch\n ? urlAsString.slice(urlProtoMatch[0].length)\n : urlAsString;\n const urlParts = urlAsStringNoProto.split(\"?\", 1);\n if (!(urlParts[0] || \"\").match(/(\\/\\/|\\\\)/)) return urlAsString;\n\n const pathname =\n typeof window !== \"undefined\" && window.location ? window.location.pathname : \"/\";\n console.error(\n `Invalid href '${urlAsString}' passed to next/router in page: '${pathname}'. Repeated forward-slashes (//) or backslashes \\\\ are not valid in the href.`,\n );\n\n const normalizedNoProto = normalizeRepeatedSlashes(urlAsStringNoProto);\n return (urlProtoMatch ? urlProtoMatch[0] : \"\") + normalizedNoProto;\n}\n\nexport function resolveLinkPrefetchMode(\n prefetchProp: LinkProps[\"prefetch\"],\n isDangerous: boolean,\n): LinkPrefetchMode {\n if (isDangerous || prefetchProp === false) return \"disabled\";\n if (prefetchProp === true) return \"full\";\n return \"auto\";\n}\n\nfunction toSameOriginRouteHref(href: string): string | null {\n if (typeof window === \"undefined\") return null;\n\n let url: URL;\n try {\n url = new URL(href, window.location.href);\n } catch {\n return null;\n }\n\n if (url.origin !== window.location.origin) return null;\n\n return `${stripBasePath(url.pathname, __basePath)}${url.search}`;\n}\n\nfunction getLinkPrefetchRouterMode(): LinkPrefetchRouterMode {\n return hasAppNavigationRuntime() ? \"app\" : \"pages\";\n}\n\nexport function canAutoPrefetchFullAppRoute(href: string): boolean {\n if (typeof window === \"undefined\") return false;\n\n const routes = window.__VINEXT_LINK_PREFETCH_ROUTES__;\n if (!routes) return false;\n\n const routeHref = toSameOriginRouteHref(href);\n if (routeHref === null) return false;\n\n const match = matchRouteWithTrie(routeHref, routes, linkPrefetchRouteTrieCache);\n if (!match) return false;\n\n return !match.route.isDynamic;\n}\n\nexport function resolveAutoAppRoutePrefetch(href: string): {\n cacheForNavigation: boolean;\n shouldPrefetch: boolean;\n} {\n if (typeof window === \"undefined\") {\n return { cacheForNavigation: false, shouldPrefetch: false };\n }\n\n const routes = window.__VINEXT_LINK_PREFETCH_ROUTES__;\n if (!routes) {\n return { cacheForNavigation: false, shouldPrefetch: false };\n }\n\n const routeHref = toSameOriginRouteHref(href);\n if (routeHref === null) {\n return { cacheForNavigation: false, shouldPrefetch: false };\n }\n\n const match = matchRouteWithTrie(routeHref, routes, linkPrefetchRouteTrieCache);\n if (!match) {\n return { cacheForNavigation: false, shouldPrefetch: false };\n }\n\n return {\n cacheForNavigation: !match.route.isDynamic,\n shouldPrefetch: !match.route.isDynamic || match.route.canPrefetchLoadingShell,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Prefetching infrastructure\n// ---------------------------------------------------------------------------\n\n/**\n * Prefetch a URL for faster navigation.\n *\n * For App Router (RSC): fetches the .rsc payload in the background and\n * stores it in an in-memory cache for instant use during navigation.\n * For Pages Router: injects a <link rel=\"prefetch\"> for the page module.\n *\n * Uses `requestIdleCallback` (or `setTimeout` fallback) to avoid blocking\n * the main thread during initial page load.\n */\nfunction prefetchUrl(href: string, mode: LinkPrefetchMode, priority: \"low\" | \"high\" = \"low\"): void {\n if (typeof window === \"undefined\") return;\n\n const prefetchHref = getLinkPrefetchHref({\n href,\n basePath: __basePath,\n currentOrigin: window.location.origin,\n });\n if (prefetchHref == null) return;\n\n const fullHref = toBrowserNavigationHref(prefetchHref, window.location.href, __basePath);\n\n const schedule = window.requestIdleCallback ?? ((fn: () => void) => setTimeout(fn, 100));\n\n schedule(() => {\n void (async () => {\n if (hasAppNavigationRuntime()) {\n const autoPrefetch =\n mode === \"auto\"\n ? resolveAutoAppRoutePrefetch(prefetchHref)\n : { cacheForNavigation: true, shouldPrefetch: true };\n if (!autoPrefetch.shouldPrefetch) return;\n\n const interceptionContext = getPrefetchInterceptionContext(fullHref);\n const mountedSlotsHeader = getMountedSlotsHeader();\n const isOptimisticRouteShellPrefetch = !autoPrefetch.cacheForNavigation;\n if (isOptimisticRouteShellPrefetch && interceptionContext !== null) return;\n const headers = createRscRequestHeaders({\n interceptionContext,\n renderMode: isOptimisticRouteShellPrefetch\n ? APP_RSC_RENDER_MODE_PREFETCH_LOADING_SHELL\n : undefined,\n });\n if (mountedSlotsHeader) {\n headers.set(VINEXT_MOUNTED_SLOTS_HEADER, mountedSlotsHeader);\n }\n // Distinguish the same visible URL when it is prefetched from different\n // request contexts such as /feed vs /gallery or different mounted slots.\n const rscUrl = await createRscRequestUrl(fullHref, headers);\n const cacheKey = AppElementsWire.encodeCacheKey(rscUrl, interceptionContext);\n const prefetched = getPrefetchedUrls();\n if (prefetched.has(cacheKey)) {\n if (autoPrefetch.cacheForNavigation) {\n const existing = getPrefetchCache().get(cacheKey);\n if (existing?.cacheForNavigation === false) {\n existing.cacheForNavigation = true;\n }\n }\n return;\n }\n prefetched.add(cacheKey);\n prefetchRscResponse(\n rscUrl,\n fetch(rscUrl, {\n headers,\n credentials: \"include\",\n priority,\n // @ts-expect-error — purpose is a valid fetch option in some browsers\n purpose: \"prefetch\",\n }),\n interceptionContext,\n mountedSlotsHeader,\n undefined,\n {\n cacheForNavigation: autoPrefetch.cacheForNavigation,\n optimisticRouteShell: isOptimisticRouteShellPrefetch,\n },\n );\n } else if (window.__NEXT_DATA__) {\n // Pages Router prefetch. When a code-split loader is registered for\n // the target route (prod builds expose them on window via the\n // generated client entry), prefetch the data JSON + warm the page\n // chunk in parallel — matching the actual navigation, so the click\n // is a double cache hit. Otherwise (dev, or unmapped route) fall\n // back to the legacy `<link rel=\"prefetch\" as=\"document\">` so the\n // browser still preloads the HTML.\n //\n // The decision helper + prefetch action live in shims/internal/ so\n // this file does not pull in the router shim at module init time,\n // which would create a circular import and grow the SSR module graph.\n const dataTarget = resolvePagesDataNavigationTarget(fullHref, __basePath);\n if (dataTarget) {\n prefetchPagesData(dataTarget);\n } else {\n // The target is not a Pages Router route — mark it on the Pages\n // Router `components` map if it matches an App Router route in the\n // shared prefetch manifest. Mirrors Next.js's `_bfl` marker write at\n // `packages/next/src/shared/lib/router/router.ts:2525`; the Next.js\n // deploy test reads `window.next.router.components[<path>]` to\n // assert prefetch detection. See issue #1526.\n markAppRouteDetectedOnPrefetch(fullHref, __basePath);\n\n // Legacy fallback: hint the browser to preload the HTML document.\n // Used in dev (no loader map populated) and for routes not in the\n // client loader map.\n const link = document.createElement(\"link\");\n link.rel = \"prefetch\";\n link.href = fullHref;\n link.as = \"document\";\n document.head.appendChild(link);\n }\n }\n })().catch((error) => {\n console.error(\"[vinext] RSC prefetch setup error:\", error);\n });\n });\n}\n\nfunction promotePrefetchEntriesForNavigation(href: string): void {\n if (typeof window === \"undefined\") return;\n\n let target: URL;\n try {\n target = new URL(\n toBrowserNavigationHref(href, window.location.href, __basePath),\n window.location.href,\n );\n } catch {\n return;\n }\n\n for (const [cacheKey, entry] of getPrefetchCache()) {\n if (entry.optimisticRouteShell === true) continue;\n\n const [rscUrl] = cacheKey.split(\"\\0\", 1);\n let cached: URL;\n try {\n cached = new URL(rscUrl, window.location.href);\n } catch {\n continue;\n }\n stripRscCacheBustingSearchParam(cached);\n if (stripRscSuffix(cached.pathname) === target.pathname && cached.search === target.search) {\n entry.cacheForNavigation = true;\n }\n }\n}\n\n/**\n * Shared IntersectionObserver for viewport-based prefetching.\n * All Link elements use the same observer to minimize resource usage.\n */\nlet sharedObserver: IntersectionObserver | null = null;\ntype LinkPrefetchInstance = {\n href: string;\n isVisible: boolean;\n mode: LinkPrefetchMode;\n routerMode: LinkPrefetchRouterMode;\n viewportPrefetched: boolean;\n};\n\nconst observedLinkPrefetches = new WeakMap<Element, LinkPrefetchInstance>();\nconst visibleLinkPrefetches = new Set<LinkPrefetchInstance>();\n\nfunction setVisibleLinkPrefetch(instance: LinkPrefetchInstance, isVisible: boolean): void {\n instance.isVisible = isVisible;\n if (isVisible) {\n visibleLinkPrefetches.add(instance);\n if (instance.routerMode === \"pages\" && instance.viewportPrefetched) return;\n prefetchUrl(instance.href, instance.mode, \"low\");\n instance.viewportPrefetched = true;\n } else {\n visibleLinkPrefetches.delete(instance);\n }\n}\n\nfunction registerVisibleLinkPing(): void {\n if (typeof window === \"undefined\") return;\n registerNavigationRuntimeFunctions({ pingVisibleLinks: pingVisibleLinkPrefetches });\n}\n\nfunction pingVisibleLinkPrefetches(): void {\n for (const instance of visibleLinkPrefetches) {\n if (instance.isVisible && instance.routerMode === \"app\") {\n prefetchUrl(instance.href, instance.mode, \"low\");\n }\n }\n}\n\nfunction getSharedObserver(): IntersectionObserver | null {\n if (typeof window === \"undefined\" || typeof IntersectionObserver === \"undefined\") return null;\n if (sharedObserver) return sharedObserver;\n\n sharedObserver = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n const instance = observedLinkPrefetches.get(entry.target);\n if (!instance) continue;\n setVisibleLinkPrefetch(instance, entry.isIntersecting || entry.intersectionRatio > 0);\n }\n },\n {\n // Start prefetching when the link is within 250px of the viewport.\n // This gives the browser a head start before the user scrolls to it.\n rootMargin: \"250px\",\n },\n );\n\n return sharedObserver;\n}\n\nfunction getDefaultLocale(): string | undefined {\n if (typeof window !== \"undefined\") {\n return window.__VINEXT_DEFAULT_LOCALE__;\n }\n return getI18nContext()?.defaultLocale;\n}\n\nfunction getCurrentLocale(): string | undefined {\n if (typeof window !== \"undefined\") {\n return getCurrentBrowserLocale({\n basePath: __basePath,\n domainLocales: getDomainLocales(),\n hostname: getCurrentHostname(),\n });\n }\n return getI18nContext()?.locale;\n}\n\nfunction getDomainLocales(): readonly DomainLocale[] | undefined {\n if (typeof window !== \"undefined\") {\n return (window.__NEXT_DATA__ as VinextNextData | undefined)?.domainLocales;\n }\n return getI18nContext()?.domainLocales;\n}\n\nfunction getCurrentHostname(): string | undefined {\n if (typeof window !== \"undefined\") return window.location.hostname;\n return getI18nContext()?.hostname;\n}\n\nfunction getDomainLocaleHref(href: string, locale: string): string | undefined {\n // Only cross-domain locale switches need a special absolute URL here.\n // Same-domain cases fall back to the standard locale-prefix logic below.\n return getDomainLocaleUrl(href, locale, {\n basePath: __basePath,\n currentHostname: getCurrentHostname(),\n domainItems: getDomainLocales(),\n });\n}\n\nfunction addLocalePrefixForRoot(href: string, locale: string): string | undefined {\n if (href !== \"/\" && !href.startsWith(\"/?\") && !href.startsWith(\"/#\")) {\n return undefined;\n }\n\n let parsed: URL;\n try {\n parsed = new URL(href, \"http://vinext.local\");\n } catch {\n return undefined;\n }\n\n if (parsed.origin !== \"http://vinext.local\" || parsed.pathname !== \"/\") {\n return undefined;\n }\n\n return `/${locale}${parsed.search}${parsed.hash}`;\n}\n\n/**\n * Apply locale prefix to a URL path based on the locale prop.\n * - locale=\"fr\" → prepend /fr (unless it already has a locale prefix)\n * - locale={false} → use the href as-is (no locale prefix, link to default)\n * - locale=undefined → use current locale (href as-is in most cases)\n */\nfunction applyLocaleToHref(href: string, locale: string | false | undefined): string {\n if (locale === false) {\n // Explicit false: no locale prefix\n return href;\n }\n\n const resolvedLocale = locale ?? getCurrentLocale();\n if (resolvedLocale === undefined) {\n return href;\n }\n\n // Absolute and protocol-relative URLs must not be prefixed — locale\n // only applies to local paths.\n if (isAbsoluteOrProtocolRelativeUrl(href)) {\n return href;\n }\n\n const domainLocaleHref = getDomainLocaleHref(href, resolvedLocale);\n if (domainLocaleHref) {\n return domainLocaleHref;\n }\n\n const defaultLocale = getDefaultLocale() ?? \"\";\n if (resolvedLocale.toLowerCase() === defaultLocale.toLowerCase()) {\n const localeRootHref = addLocalePrefixForRoot(href, resolvedLocale);\n if (localeRootHref) return localeRootHref;\n }\n\n return addLocalePrefix(href, resolvedLocale, defaultLocale);\n}\n\nconst Link = forwardRef<HTMLAnchorElement, LinkProps>(function Link(\n {\n href,\n as,\n replace = false,\n prefetch: prefetchProp,\n scroll = true,\n shallow = false,\n children: childrenProp,\n onClick,\n onMouseEnter,\n onTouchStart,\n onNavigate,\n unstable_dynamicOnHover = false,\n legacyBehavior = false,\n passHref = false,\n ...rest\n },\n forwardedRef,\n) {\n // Extract locale from rest props\n const { locale, ...restWithoutLocale } = rest;\n\n // Next.js parity: in legacyBehavior, a string or number child is wrapped in\n // a plain <a> so the cloneElement path below has an element to clone. The\n // wrapper anchor receives the forwarded href + handlers from Link.\n // Ported from Next.js: packages/next/src/client/link.tsx (around line 334)\n // https://github.com/vercel/next.js/blob/canary/packages/next/src/client/link.tsx\n let children: React.ReactNode = childrenProp;\n if (legacyBehavior && (typeof childrenProp === \"string\" || typeof childrenProp === \"number\")) {\n children = React.createElement(\"a\", null, childrenProp);\n }\n\n // If `as` is provided, use it as the actual URL (legacy Next.js pattern\n // where href is a route pattern like \"/user/[id]\" and as is \"/user/1\")\n const rawResolvedHref = as ?? resolveHref(href);\n\n // Mirror Next.js: emit a console.error when the href contains repeated\n // forward-slashes (e.g. \"/foo//bar\") or backslashes, and then normalize the\n // href so navigation targets the collapsed path rather than the raw one.\n // See packages/next/src/client/resolve-href.ts.\n const resolvedHref =\n typeof rawResolvedHref === \"string\"\n ? warnAndNormalizeRepeatedSlashesInHref(rawResolvedHref)\n : rawResolvedHref;\n\n const isDangerous = typeof resolvedHref === \"string\" && isDangerousScheme(resolvedHref);\n\n // Apply locale prefix if specified (safe even for dangerous hrefs since we\n // won't use the result when isDangerous is true)\n const localizedHref = applyLocaleToHref(isDangerous ? \"/\" : resolvedHref, locale);\n // Normalise trailing slash to match `trailingSlash` config so that rendered\n // hrefs avoid the redirect bounce. Mirrors Next.js's `addLocale`/`addBasePath`,\n // both of which run `normalizePathTrailingSlash` after prefixing — we apply\n // it once after locale prefixing (for prefetch/navigation paths that bypass\n // basePath) and again after `withBasePath` for the rendered `href` attribute.\n const normalizedHref = normalizePathTrailingSlash(localizedHref, __trailingSlash);\n // Full href with basePath for browser URLs and fetches, normalised again so\n // that combining a non-empty basePath with the bare root (`/`) still\n // produces a canonical href under `trailingSlash: false` (e.g. `/foo`\n // rather than `/foo/`).\n const fullHref = normalizePathTrailingSlash(\n withBasePath(normalizedHref, __basePath),\n __trailingSlash,\n );\n\n // Track pending state for useLinkStatus()\n const [pending, setPending] = useState(false);\n const mountedRef = useRef(true);\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n };\n }, []);\n\n // Prefetching: observe the element when it enters the viewport.\n // In App Router, null/undefined/\"auto\" is automatic prefetch and true opts\n // into a full RSC prefetch, matching Next.js's public prefetch contract.\n const internalRef = useRef<HTMLAnchorElement | null>(null);\n const prefetchMode = resolveLinkPrefetchMode(prefetchProp, isDangerous);\n const shouldViewportPrefetch = canLinkPrefetch({\n nodeEnv: process.env.NODE_ENV,\n prefetch: prefetchProp,\n isDangerous,\n });\n\n const setRefs = useCallback(\n (node: HTMLAnchorElement | null) => {\n internalRef.current = node;\n if (typeof forwardedRef === \"function\") forwardedRef(node);\n else if (forwardedRef)\n (forwardedRef as React.MutableRefObject<HTMLAnchorElement | null>).current = node;\n },\n [forwardedRef],\n );\n\n useEffect(() => {\n if (!shouldViewportPrefetch || typeof window === \"undefined\") return;\n const node = internalRef.current;\n if (!node) return;\n\n const hrefToPrefetch = getLinkPrefetchHref({\n href: normalizedHref,\n basePath: __basePath,\n currentOrigin: window.location.origin,\n });\n if (hrefToPrefetch == null) return;\n\n const observer = getSharedObserver();\n if (!observer) return;\n\n registerVisibleLinkPing();\n const instance: LinkPrefetchInstance = {\n href: hrefToPrefetch,\n isVisible: false,\n mode: prefetchMode,\n routerMode: getLinkPrefetchRouterMode(),\n viewportPrefetched: false,\n };\n observedLinkPrefetches.set(node, instance);\n observer.observe(node);\n\n return () => {\n observer.unobserve(node);\n observedLinkPrefetches.delete(node);\n visibleLinkPrefetches.delete(instance);\n };\n }, [shouldViewportPrefetch, prefetchMode, normalizedHref]);\n\n const prefetchOnIntent = useCallback(() => {\n if (\n !canLinkIntentPrefetch({\n nodeEnv: process.env.NODE_ENV,\n prefetch: prefetchProp,\n isDangerous,\n routerMode: getLinkPrefetchRouterMode(),\n })\n ) {\n return;\n }\n const intentMode = unstable_dynamicOnHover ? \"full\" : prefetchMode;\n if (unstable_dynamicOnHover && internalRef.current) {\n const instance = observedLinkPrefetches.get(internalRef.current);\n if (instance) {\n instance.mode = \"full\";\n }\n promotePrefetchEntriesForNavigation(normalizedHref);\n }\n prefetchUrl(normalizedHref, intentMode, \"high\");\n }, [prefetchProp, isDangerous, prefetchMode, normalizedHref, unstable_dynamicOnHover]);\n\n const handleMouseEnter = useCallback(\n (e: MouseEvent<HTMLAnchorElement>) => {\n onMouseEnter?.(e);\n prefetchOnIntent();\n },\n [onMouseEnter, prefetchOnIntent],\n );\n\n const handleTouchStart = useCallback(\n (e: TouchEvent<HTMLAnchorElement>) => {\n onTouchStart?.(e);\n prefetchOnIntent();\n },\n [onTouchStart, prefetchOnIntent],\n );\n\n const handleClick = async (\n e: MouseEvent<HTMLAnchorElement>,\n options: { skipLinkOnClick?: boolean } = {},\n ) => {\n // In legacyBehavior, the onClick prop on <Link> itself is ignored — the\n // child's onClick is the one that runs (and Next.js even warns when\n // `onClick` is passed to <Link> alongside `legacyBehavior`). Skip the\n // preamble that calls Link's own onClick when invoked from that path.\n // See: .nextjs-ref/packages/next/src/client/link.tsx (legacyBehavior branch).\n if (!options.skipLinkOnClick && onClick) onClick(e);\n if (e.defaultPrevented) return;\n\n // Native download links must keep the browser's default behavior.\n if (e.currentTarget.hasAttribute(\"download\")) {\n return;\n }\n\n // Only intercept left clicks without modifiers (standard link behavior)\n if (e.button !== 0 || e.metaKey || e.ctrlKey || e.shiftKey || e.altKey) {\n return;\n }\n\n // Don't intercept links with target (e.g. target=\"_blank\")\n if (e.currentTarget.target && e.currentTarget.target !== \"_self\") {\n return;\n }\n\n // External links: let the browser handle it.\n // Same-origin absolute URLs (e.g. http://localhost:3000/about) are\n // normalized to local paths so they get client-side navigation.\n let navigateHref = normalizedHref;\n if (isAbsoluteOrProtocolRelativeUrl(resolvedHref)) {\n const localPath = toSameOriginAppPath(resolvedHref, __basePath);\n if (localPath == null) {\n // Truly external. Mirror Next.js `linkClicked`: when `replace` is set\n // we have to take over because the browser's default click navigation\n // pushes to history rather than replacing the current entry.\n // See `.nextjs-ref/packages/next/src/client/link.tsx` `linkClicked`.\n if (replace) {\n e.preventDefault();\n window.location.replace(resolvedHref);\n }\n return;\n }\n navigateHref = localPath;\n }\n\n e.preventDefault();\n\n // Resolve relative hrefs (#hash, ?query) against the current URL once so\n // onNavigate and the actual navigation target stay in sync.\n const absoluteHref = resolveRelativeHref(navigateHref, window.location.href, __basePath);\n const absoluteFullHref = toBrowserNavigationHref(\n navigateHref,\n window.location.href,\n __basePath,\n );\n\n // Call onNavigate callback if provided (Next.js 16 View Transitions support)\n if (onNavigate) {\n try {\n const navUrl = new URL(absoluteFullHref, window.location.origin);\n let prevented = false;\n const navEvent: NavigateEvent = {\n url: navUrl,\n preventDefault() {\n prevented = true;\n },\n get defaultPrevented() {\n return prevented;\n },\n };\n onNavigate(navEvent);\n // If the callback called preventDefault(), skip Link's default navigation.\n // The callback is responsible for its own navigation (e.g. via View Transitions API).\n if (navEvent.defaultPrevented) {\n return;\n }\n } catch {\n // Ignore URL parsing errors for relative/hash hrefs\n }\n }\n\n // App Router: delegate to navigateClientSide which handles scroll save,\n // hash-only changes, RSC fetch, and two-phase URL commit.\n if (getNavigationRuntime()?.functions.navigate) {\n setPending(true);\n React.startTransition(() => {\n void navigateClientSide(navigateHref, replace ? \"replace\" : \"push\", scroll, true).finally(\n () => {\n if (mountedRef.current) setPending(false);\n },\n );\n });\n return;\n } else {\n // Next.js only consumes onRouterTransitionStart in the App Router.\n // Pages Router still executes instrumentation-client side effects\n // during startup, but it does not invoke the named export on navigation.\n // Pages Router: use the Router singleton\n try {\n const routerModule = await import(\"next/router\");\n const Router = routerModule.default;\n await navigatePagesRouterLink(Router, {\n href: absoluteHref,\n replace,\n scroll,\n shallow,\n locale,\n });\n } catch {\n // Fallback to hard navigation if router fails\n if (replace) {\n window.history.replaceState({}, \"\", absoluteFullHref);\n } else {\n window.history.pushState({}, \"\", absoluteFullHref);\n }\n window.dispatchEvent(new PopStateEvent(\"popstate\"));\n }\n }\n };\n\n const anchorProps = restWithoutLocale;\n\n const linkStatusValue = React.useMemo(() => ({ pending }), [pending]);\n\n // Block dangerous URI schemes (javascript:, data:, vbscript:).\n // Render an inert <a> without href to prevent XSS while preserving\n // styling, refs, and developer event handlers like onClick.\n // This check is placed after all hooks to satisfy the Rules of Hooks.\n if (isDangerous) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(`<Link> blocked dangerous href: ${resolvedHref}`);\n }\n // Match Next.js parity: when a user clicks a Link whose href has a\n // dangerous scheme, emit the same `console.error` that Next.js surfaces\n // via React's event-handler runtime when `router.push` throws.\n // Ported from Next.js: test/e2e/app-dir/javascript-urls/javascript-urls.test.ts\n // https://github.com/vercel/next.js/blob/canary/test/e2e/app-dir/javascript-urls/javascript-urls.test.ts\n const handleDangerousClick = (event: MouseEvent<HTMLAnchorElement>): void => {\n if (onClick) onClick(event);\n reportBlockedDangerousNavigation();\n };\n // In legacyBehavior, clone the child instead of wrapping it in our own\n // <a>. Otherwise the dangerous-href branch would still produce nested\n // anchors. We do not forward the dangerous href to the child — Next.js's\n // safety guarantee is that the navigation never happens; the child can\n // keep its own (sanitized) href if it wants.\n if (legacyBehavior) {\n const child = React.Children.only(children) as React.ReactElement<{\n onClick?: (event: MouseEvent<HTMLAnchorElement>) => void;\n ref?: React.Ref<HTMLAnchorElement>;\n }>;\n const childOnClick = child.props.onClick;\n const childRef = child.props.ref;\n const setDangerousRefs = (node: HTMLAnchorElement | null): void => {\n internalRef.current = node;\n if (typeof childRef === \"function\") {\n childRef(node);\n } else if (childRef) {\n (childRef as React.MutableRefObject<HTMLAnchorElement | null>).current = node;\n }\n };\n return (\n <LinkStatusContext.Provider value={linkStatusValue}>\n {React.cloneElement(child, {\n ref: setDangerousRefs,\n onClick: (event: MouseEvent<HTMLAnchorElement>) => {\n if (childOnClick) childOnClick(event);\n reportBlockedDangerousNavigation();\n },\n })}\n </LinkStatusContext.Provider>\n );\n }\n return (\n <LinkStatusContext.Provider value={linkStatusValue}>\n <a\n ref={setRefs}\n onClick={handleDangerousClick}\n onMouseEnter={handleMouseEnter}\n onTouchStart={handleTouchStart}\n {...anchorProps}\n >\n {children}\n </a>\n </LinkStatusContext.Provider>\n );\n }\n\n // Next.js parity: in legacyBehavior, forward href/handlers to the single\n // child via React.cloneElement instead of wrapping in our own <a>. This\n // avoids the nested-anchor markup that broke onClick propagation and\n // produced duplicated/hidden child content (issue #1469).\n //\n // Ported from Next.js: packages/next/src/client/link.tsx (around line 499)\n // https://github.com/vercel/next.js/blob/canary/packages/next/src/client/link.tsx\n if (legacyBehavior) {\n const child = React.Children.only(children) as React.ReactElement<{\n href?: string;\n ref?: React.Ref<HTMLAnchorElement>;\n onClick?: (event: MouseEvent<HTMLAnchorElement>) => void;\n onMouseEnter?: (event: MouseEvent<HTMLAnchorElement>) => void;\n onTouchStart?: (event: TouchEvent<HTMLAnchorElement>) => void;\n }>;\n if (process.env.NODE_ENV !== \"production\") {\n if (onClick) {\n console.warn(\n `\"onClick\" was passed to <Link> with \\`href\\` of \\`${resolveHref(href)}\\` but \"legacyBehavior\" was set. The legacy behavior requires onClick be set on the child of next/link`,\n );\n }\n if (onMouseEnter) {\n console.warn(\n `\"onMouseEnter\" was passed to <Link> with \\`href\\` of \\`${resolveHref(href)}\\` but \"legacyBehavior\" was set. The legacy behavior requires onMouseEnter be set on the child of next/link`,\n );\n }\n }\n const childPropsExisting = child.props;\n // Use `'href' in props` (matches Next.js) so `href={undefined}` on the\n // child is treated as \"the child owns its href\" — we won't overwrite it.\n const childHasOwnHref = child.type === \"a\" ? \"href\" in childPropsExisting : false;\n // Match Next.js: forward href when `passHref` is set OR the child is a\n // plain <a> that does not already have an href. Otherwise, leave the\n // child's href alone.\n const shouldForwardHref = passHref || (child.type === \"a\" && !childHasOwnHref);\n const childOnClick = childPropsExisting.onClick;\n const childOnMouseEnter = childPropsExisting.onMouseEnter;\n const childOnTouchStart = childPropsExisting.onTouchStart;\n // Mirror Next.js: in legacy mode, the ref source is the child's own\n // ref (e.g. `<a ref={myRef}>`), not Link's `forwardedRef`. In React 19\n // `ref` is a regular prop on the element. Merge with our intersection\n // observer ref via `setRefs` so prefetching still works.\n const childRef = childPropsExisting.ref;\n const setLegacyRefs = (node: HTMLAnchorElement | null): void => {\n internalRef.current = node;\n if (typeof childRef === \"function\") {\n childRef(node);\n } else if (childRef) {\n (childRef as React.MutableRefObject<HTMLAnchorElement | null>).current = node;\n }\n };\n const clonedProps: Record<string, unknown> = {\n ref: setLegacyRefs,\n onClick: (event: MouseEvent<HTMLAnchorElement>) => {\n // Next.js parity: only the child's onClick runs in legacy mode. The\n // onClick prop on <Link> is intentionally ignored (and a dev warning\n // surfaces it above).\n if (childOnClick) childOnClick(event);\n if (event.defaultPrevented) return;\n void handleClick(event, { skipLinkOnClick: true });\n },\n onMouseEnter: (event: MouseEvent<HTMLAnchorElement>) => {\n if (childOnMouseEnter) childOnMouseEnter(event);\n prefetchOnIntent();\n },\n onTouchStart: (event: TouchEvent<HTMLAnchorElement>) => {\n if (childOnTouchStart) childOnTouchStart(event);\n prefetchOnIntent();\n },\n };\n if (shouldForwardHref) {\n clonedProps.href = fullHref;\n }\n return (\n <LinkStatusContext.Provider value={linkStatusValue}>\n {React.cloneElement(child, clonedProps)}\n </LinkStatusContext.Provider>\n );\n }\n\n return (\n <LinkStatusContext.Provider value={linkStatusValue}>\n <a\n ref={setRefs}\n href={fullHref}\n onClick={(event) => {\n void handleClick(event);\n }}\n onMouseEnter={handleMouseEnter}\n onTouchStart={handleTouchStart}\n {...anchorProps}\n >\n {children}\n </a>\n </LinkStatusContext.Provider>\n );\n});\n\nexport default Link;\n"],"mappings":"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"}
@@ -201,16 +201,17 @@ type AppleIconDescriptor = {
201
201
  };
202
202
  type IconInput = string | URL | IconDescriptor;
203
203
  type AppleIconInput = string | URL | AppleIconDescriptor;
204
+ type OtherIconDescriptor = {
205
+ rel: string;
206
+ url: string | URL;
207
+ sizes?: string;
208
+ type?: string;
209
+ };
204
210
  type IconsMap = {
205
211
  icon?: IconInput | IconInput[];
206
212
  shortcut?: string | URL | Array<string | URL>;
207
213
  apple?: AppleIconInput | AppleIconInput[];
208
- other?: Array<{
209
- rel: string;
210
- url: string | URL;
211
- sizes?: string;
212
- type?: string;
213
- }>;
214
+ other?: OtherIconDescriptor | OtherIconDescriptor[];
214
215
  };
215
216
  type IconsMetadata = IconInput | IconInput[] | IconsMap;
216
217
  type MetadataMergeEntry = {
@@ -673,11 +673,15 @@ function MetadataHead({ metadata, pathname = "/" }) {
673
673
  ...a.sizes ? { sizes: a.sizes } : {},
674
674
  ...a.type ? { type: a.type } : {}
675
675
  }, key++));
676
- if (isIconsMap(metadata.icons) && metadata.icons.other) for (const o of metadata.icons.other) elements.push(/* @__PURE__ */ jsx("link", {
677
- rel: o.rel,
678
- href: stringifyUrl(o.url),
679
- ...o.sizes ? { sizes: o.sizes } : {}
680
- }, key++));
676
+ if (isIconsMap(metadata.icons) && metadata.icons.other) {
677
+ const others = Array.isArray(metadata.icons.other) ? metadata.icons.other : [metadata.icons.other];
678
+ for (const o of others) elements.push(/* @__PURE__ */ jsx("link", {
679
+ rel: o.rel,
680
+ href: stringifyUrl(o.url),
681
+ ...o.sizes ? { sizes: o.sizes } : {},
682
+ ...o.type ? { type: o.type } : {}
683
+ }, key++));
684
+ }
681
685
  }
682
686
  if (metadata.manifest) elements.push(/* @__PURE__ */ jsx("link", {
683
687
  rel: "manifest",
@@ -1 +1 @@
1
- {"version":3,"file":"metadata.js","names":[],"sources":["../../src/shims/metadata.tsx"],"sourcesContent":["/**\n * Metadata support for App Router.\n *\n * Handles `export const metadata` and `export async function generateMetadata()`.\n * Resolves metadata from layouts and pages (pages override layouts).\n */\nimport React from \"react\";\nimport { makeThenableParams } from \"./thenable-params.js\";\nimport { isAbsoluteOrProtocolRelativeUrl } from \"./url-utils.js\";\n\n// ---------------------------------------------------------------------------\n// Viewport types and resolution\n// ---------------------------------------------------------------------------\n\nexport type Viewport = {\n /** Viewport width (default: \"device-width\") */\n width?: string | number;\n /** Viewport height */\n height?: string | number;\n /** Initial scale */\n initialScale?: number;\n /** Minimum scale */\n minimumScale?: number;\n /** Maximum scale */\n maximumScale?: number;\n /** Whether user can scale */\n userScalable?: boolean;\n /** Theme color — single color or array of { media, color } */\n themeColor?: string | Array<{ media?: string; color: string }>;\n /** Color scheme: 'light' | 'dark' | 'light dark' | 'normal' */\n colorScheme?: string;\n};\n\n/**\n * Resolve viewport config from a module. Handles both static `viewport` export\n * and async `generateViewport()` function.\n */\nexport async function resolveModuleViewport(\n mod: Record<string, unknown>,\n params: Record<string, string | string[]>,\n): Promise<Viewport | null> {\n if (typeof mod.generateViewport === \"function\") {\n const asyncParams = makeThenableParams(params);\n return await mod.generateViewport({ params: asyncParams });\n }\n if (mod.viewport && typeof mod.viewport === \"object\") {\n return mod.viewport as Viewport;\n }\n return null;\n}\n\n/**\n * Merge viewport configs from multiple sources (layouts + page).\n * Later entries override earlier ones.\n */\nexport const DEFAULT_VIEWPORT: Viewport = {\n width: \"device-width\",\n initialScale: 1,\n};\n\nexport function mergeViewport(viewportList: Viewport[]): Viewport {\n const merged: Viewport = { ...DEFAULT_VIEWPORT };\n for (const vp of viewportList) {\n Object.assign(merged, vp);\n }\n return merged;\n}\n\n/**\n * React component that renders viewport meta tags into <head>.\n */\nexport function ViewportHead({ viewport }: { viewport: Viewport }) {\n const elements: React.ReactElement[] = [];\n let key = 0;\n\n // Build viewport content string\n const parts: string[] = [];\n if (viewport.width !== undefined) parts.push(`width=${viewport.width}`);\n if (viewport.height !== undefined) parts.push(`height=${viewport.height}`);\n if (viewport.initialScale !== undefined) parts.push(`initial-scale=${viewport.initialScale}`);\n if (viewport.minimumScale !== undefined) parts.push(`minimum-scale=${viewport.minimumScale}`);\n if (viewport.maximumScale !== undefined) parts.push(`maximum-scale=${viewport.maximumScale}`);\n if (viewport.userScalable !== undefined)\n parts.push(`user-scalable=${viewport.userScalable ? \"yes\" : \"no\"}`);\n\n if (parts.length > 0) {\n elements.push(<meta key={key++} name=\"viewport\" content={parts.join(\", \")} />);\n }\n\n // Theme color\n if (viewport.themeColor) {\n if (typeof viewport.themeColor === \"string\") {\n elements.push(<meta key={key++} name=\"theme-color\" content={viewport.themeColor} />);\n } else if (Array.isArray(viewport.themeColor)) {\n for (const entry of viewport.themeColor) {\n elements.push(\n <meta\n key={key++}\n name=\"theme-color\"\n content={entry.color}\n {...(entry.media ? { media: entry.media } : {})}\n />,\n );\n }\n }\n }\n\n // Color scheme\n if (viewport.colorScheme) {\n elements.push(<meta key={key++} name=\"color-scheme\" content={viewport.colorScheme} />);\n }\n\n return <>{elements}</>;\n}\n\n// ---------------------------------------------------------------------------\n// Metadata types and resolution\n// ---------------------------------------------------------------------------\n\nexport type Metadata = {\n title?: string | { default?: string; template?: string; absolute?: string };\n description?: string;\n generator?: string;\n applicationName?: string;\n referrer?: string;\n keywords?: string | string[];\n authors?: Array<{ name?: string; url?: string }> | { name?: string; url?: string };\n creator?: string;\n publisher?: string;\n robots?:\n | string\n | {\n index?: boolean;\n follow?: boolean;\n googleBot?: string | { index?: boolean; follow?: boolean; [key: string]: unknown };\n [key: string]: unknown;\n };\n openGraph?: {\n title?: string;\n description?: string;\n url?: string | URL;\n siteName?: string;\n images?: string | URL | SocialImageDescriptor | Array<string | URL | SocialImageDescriptor>;\n videos?: Array<{ url: string | URL; width?: number; height?: number }>;\n audio?: Array<{ url: string | URL }>;\n locale?: string;\n type?: string;\n publishedTime?: string;\n modifiedTime?: string;\n authors?: string[];\n };\n twitter?: {\n card?: string;\n site?: string;\n siteId?: string;\n title?: string;\n description?: string;\n images?: string | URL | SocialImageDescriptor | Array<string | URL | SocialImageDescriptor>;\n creator?: string;\n creatorId?: string;\n players?: TwitterPlayerDescriptor | TwitterPlayerDescriptor[];\n app?: TwitterAppDescriptor;\n };\n icons?: IconsMetadata;\n manifest?: string | URL;\n alternates?: {\n canonical?: string | URL;\n languages?: Record<string, string | URL>;\n media?: Record<string, string | URL>;\n types?: Record<string, string | URL>;\n };\n verification?: {\n google?: string;\n yahoo?: string;\n yandex?: string;\n other?: Record<string, string | string[]>;\n };\n metadataBase?: URL | null;\n appleWebApp?: {\n capable?: boolean;\n title?: string;\n statusBarStyle?: string;\n startupImage?: string | Array<{ url: string; media?: string }>;\n };\n formatDetection?: {\n email?: boolean;\n address?: boolean;\n telephone?: boolean;\n };\n category?: string;\n itunes?: {\n appId: string;\n appArgument?: string;\n };\n appLinks?: {\n ios?: AppLinksApple | AppLinksApple[];\n iphone?: AppLinksApple | AppLinksApple[];\n ipad?: AppLinksApple | AppLinksApple[];\n android?: AppLinksAndroid | AppLinksAndroid[];\n windows_phone?: AppLinksWindows | AppLinksWindows[];\n windows?: AppLinksWindows | AppLinksWindows[];\n windows_universal?: AppLinksWindows | AppLinksWindows[];\n web?: AppLinksWeb | AppLinksWeb[];\n };\n other?: Record<string, string | string[]>;\n [key: string]: unknown;\n};\n\ntype AppLinksApple = {\n url: string | URL;\n app_store_id?: string | number;\n app_name?: string;\n};\n\ntype AppLinksAndroid = {\n package: string;\n url?: string | URL;\n class?: string;\n app_name?: string;\n};\n\ntype AppLinksWindows = {\n url: string | URL;\n app_id?: string;\n app_name?: string;\n};\n\ntype AppLinksWeb = {\n url: string | URL;\n should_fallback?: boolean;\n};\n\ntype TwitterPlayerDescriptor = {\n playerUrl: string | URL;\n streamUrl: string | URL;\n width: number;\n height: number;\n};\n\ntype TwitterAppDescriptor = {\n id: {\n iphone?: string | number;\n ipad?: string | number;\n googleplay?: string;\n };\n url?: {\n iphone?: string | URL;\n ipad?: string | URL;\n googleplay?: string | URL;\n };\n name?: string;\n};\n\ntype SocialImageDescriptor = {\n url: string | URL;\n alt?: string;\n width?: number;\n height?: number;\n type?: string;\n};\n\ntype IconDescriptor = {\n url: string | URL;\n sizes?: string;\n type?: string;\n media?: string;\n};\n\ntype AppleIconDescriptor = {\n url: string | URL;\n sizes?: string;\n type?: string;\n};\n\ntype IconInput = string | URL | IconDescriptor;\ntype AppleIconInput = string | URL | AppleIconDescriptor;\n\ntype IconsMap = {\n icon?: IconInput | IconInput[];\n shortcut?: string | URL | Array<string | URL>;\n apple?: AppleIconInput | AppleIconInput[];\n other?: Array<{ rel: string; url: string | URL; sizes?: string; type?: string }>;\n};\n\ntype IconsMetadata = IconInput | IconInput[] | IconsMap;\n\nexport type MetadataMergeEntry = {\n contributesTitle?: boolean;\n isPage?: boolean;\n metadata: Metadata;\n};\n\n/**\n * Merge metadata from multiple sources (layouts + page).\n *\n * The list is ordered [rootLayout, nestedLayout, ..., page].\n * Title template from layouts applies to the page title but NOT to\n * the segment that defines the template itself. `title.absolute`\n * skips all templates. `title.default` is the fallback when no\n * child provides a title.\n *\n * Shallow merge: later entries override earlier ones (per Next.js docs).\n */\nexport function mergeMetadata(metadataList: Metadata[]): Metadata {\n const merged = mergeMetadataEntries(\n metadataList.map((metadata, index) => ({\n isPage: index === metadataList.length - 1,\n metadata,\n })),\n );\n return postProcessMetadata(merged);\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return (\n typeof value === \"object\" && value !== null && !Array.isArray(value) && !(value instanceof URL)\n );\n}\n\nfunction isOtherMetadata(value: unknown): value is NonNullable<Metadata[\"other\"]> {\n if (!isPlainObject(value)) return false;\n return Object.values(value).every((item) => {\n if (typeof item === \"string\") return true;\n return Array.isArray(item) && item.every((nestedItem) => typeof nestedItem === \"string\");\n });\n}\n\n/**\n * Extract a plain string title from a metadata title value.\n */\nfunction resolveStringTitle(title: Metadata[\"title\"]): string | undefined {\n if (typeof title === \"string\") return title;\n if (title && typeof title === \"object\") {\n return title.absolute ?? title.default ?? undefined;\n }\n return undefined;\n}\n\nfunction applyTitleTemplate(template: string | undefined, title: string): string {\n return template ? template.replace(/%s/g, title) : title;\n}\n\nfunction resolveTitle(title: Metadata[\"title\"], stashedTemplate: string | undefined) {\n if (typeof title === \"string\") {\n return applyTitleTemplate(stashedTemplate, title);\n }\n\n if (title && typeof title === \"object\") {\n let resolved =\n title.default === undefined ? undefined : applyTitleTemplate(stashedTemplate, title.default);\n\n if (title.absolute) {\n resolved = title.absolute;\n }\n\n return resolved;\n }\n\n return undefined;\n}\n\n/**\n * Post-process merged metadata to cross-fill openGraph and Twitter fields.\n *\n * Next.js runs this once after all layouts/pages and file-based metadata\n * have been resolved. When openGraph exists, it auto-fills missing\n * twitter:title/description/images from openGraph (falling back to root\n * metadata title/description). Existing openGraph/twitter objects also inherit\n * missing title/description from root metadata.\n *\n * Ported from Next.js:\n * https://github.com/vercel/next.js/blob/canary/packages/next/src/lib/metadata/resolve-metadata.ts\n */\nexport function postProcessMetadata(merged: Metadata): Metadata {\n // Shallow-clone to avoid mutating the caller's object.\n // Both current call sites (mergeMetadata, resolveAppPageHead) pass\n // freshly-constructed objects, but this guards against future misuse.\n const result = { ...merged };\n\n const resolvedTitle = resolveStringTitle(result.title);\n\n // openGraph inherits title/description from root metadata when absent\n if (result.openGraph) {\n const og = { ...result.openGraph };\n if (!og.title && resolvedTitle) {\n og.title = resolvedTitle;\n }\n if (!og.description && result.description) {\n og.description = result.description;\n }\n result.openGraph = og;\n }\n\n if (result.openGraph) {\n const autoFill: {\n title?: string;\n description?: string;\n images?: NonNullable<Metadata[\"twitter\"]>[\"images\"];\n } = {};\n\n const existingTwitter = result.twitter;\n const hasTwTitle = existingTwitter ? Boolean(existingTwitter.title) : false;\n const hasTwDescription = existingTwitter ? Boolean(existingTwitter.description) : false;\n const hasTwImages = existingTwitter\n ? Object.prototype.hasOwnProperty.call(existingTwitter, \"images\") &&\n Boolean(existingTwitter.images)\n : false;\n\n if (!hasTwTitle) {\n if (result.openGraph.title) {\n autoFill.title = result.openGraph.title;\n } else if (resolvedTitle) {\n autoFill.title = resolvedTitle;\n }\n }\n if (!hasTwDescription) {\n autoFill.description = result.openGraph.description || result.description || undefined;\n }\n if (!hasTwImages && result.openGraph.images !== undefined) {\n autoFill.images = result.openGraph.images;\n }\n\n if (Object.keys(autoFill).length > 0) {\n if (existingTwitter) {\n result.twitter = { ...existingTwitter, ...autoFill };\n } else {\n result.twitter = autoFill;\n }\n }\n }\n\n if (result.twitter) {\n const tw = { ...result.twitter };\n if (!tw.title && resolvedTitle) {\n tw.title = resolvedTitle;\n }\n if (!tw.description && result.description) {\n tw.description = result.description;\n }\n result.twitter = tw;\n }\n\n // If twitter exists (either originally or via auto-fill), ensure card type is set.\n // Next.js resolveTwitter defaults: summary_large_image when images present, else summary.\n if (result.twitter) {\n const tw = { ...result.twitter };\n if (!tw.card) {\n const images = tw.images;\n const hasImages = Array.isArray(images) ? images.length > 0 : Boolean(images);\n tw.card = hasImages ? \"summary_large_image\" : \"summary\";\n }\n result.twitter = tw;\n }\n\n return result;\n}\n\n/**\n * Merge metadata from multiple sources (layouts + page).\n *\n * The list is ordered [rootLayout, nestedLayout, ..., page].\n * Title template from layouts applies to the page title but NOT to\n * the segment that defines the template itself. `title.absolute`\n * skips all templates. `title.default` is the fallback when no\n * child provides a title.\n *\n * For top-level keys, later entries override earlier ones. `other` custom meta\n * tags are the exception: Next.js merges those across segments.\n */\nexport function mergeMetadataEntries(entries: readonly MetadataMergeEntry[]): Metadata {\n if (entries.length === 0) return {};\n\n const merged: Metadata = {};\n\n // Track the most recent ancestor title template from layouts (not from page).\n let parentTemplate: string | undefined;\n\n for (const entry of entries) {\n const meta = entry.metadata;\n const isPage = Boolean(entry.isPage);\n const contributesTitle = entry.contributesTitle !== false;\n\n // Merge non-title keys\n for (const key of Object.keys(meta)) {\n if (key === \"title\") continue; // Handle title separately below\n\n const incoming = meta[key];\n const existing = merged[key];\n\n if (key === \"other\" && isOtherMetadata(existing) && isOtherMetadata(incoming)) {\n merged.other = { ...existing, ...incoming };\n } else {\n // Plain replacement for everything else\n merged[key] = incoming;\n }\n }\n\n // Title resolution\n if (contributesTitle && meta.title !== undefined) {\n merged.title = resolveTitle(meta.title, parentTemplate);\n }\n\n // Collect the current layout template after resolving its own title so\n // title.default is wrapped by the ancestor template, not by its own template.\n if (\n contributesTitle &&\n !isPage &&\n meta.title &&\n typeof meta.title === \"object\" &&\n meta.title.template\n ) {\n parentTemplate = meta.title.template;\n }\n }\n\n return merged;\n}\n\n/**\n * Resolve metadata from a module. Handles both static `metadata` export\n * and async `generateMetadata()` function.\n *\n * @param parent - A Promise that resolves to the accumulated (merged) metadata\n * from all ancestor segments. Passed as the second argument to\n * `generateMetadata()`, matching Next.js's eager-execution-with-serial-\n * resolution approach. If not provided, defaults to a promise that resolves\n * to an empty object (so `await parent` never throws).\n */\nexport async function resolveModuleMetadata(\n mod: Record<string, unknown>,\n params: Record<string, string | string[]> = {},\n searchParams?: Record<string, string | string[]>,\n parent: Promise<Metadata> = Promise.resolve({}),\n): Promise<Metadata | null> {\n if (typeof mod.generateMetadata === \"function\") {\n // Next.js 16 passes params/searchParams as Promises (async pattern).\n // makeThenableParams() normalises null-prototype + preserves sync access.\n const asyncParams = makeThenableParams(params);\n const props =\n searchParams === undefined\n ? { params: asyncParams }\n : { params: asyncParams, searchParams: makeThenableParams(searchParams) };\n return await mod.generateMetadata(props, parent);\n }\n if (mod.metadata && typeof mod.metadata === \"object\") {\n return mod.metadata as Metadata;\n }\n return null;\n}\n\n/**\n * React component that renders metadata as HTML head elements.\n * Used by the RSC entry to inject into the <head>.\n */\nfunction isIconDescriptor(value: unknown): value is IconDescriptor {\n if (typeof value !== \"object\" || value === null || value instanceof URL || Array.isArray(value)) {\n return false;\n }\n const urlValue = Reflect.get(value, \"url\");\n return typeof urlValue === \"string\" || urlValue instanceof URL;\n}\n\nfunction isIconsMap(value: IconsMetadata): value is IconsMap {\n return (\n typeof value === \"object\" &&\n !(value instanceof URL) &&\n !Array.isArray(value) &&\n !isIconDescriptor(value)\n );\n}\n\nfunction normalizeUrlDescriptor<T extends { url: string | URL }>(\n value: string | URL | T,\n createDescriptor: (url: string | URL) => T,\n): T {\n if (typeof value === \"string\" || value instanceof URL) {\n return createDescriptor(value);\n }\n return value;\n}\n\nfunction normalizeUrlDescriptorEntries<T extends { url: string | URL }>(\n value: string | URL | T | Array<string | URL | T> | undefined,\n createDescriptor: (url: string | URL) => T,\n): T[] {\n if (!value) {\n return [];\n }\n\n if (Array.isArray(value)) {\n return value.map((entry) => normalizeUrlDescriptor(entry, createDescriptor));\n }\n\n return [normalizeUrlDescriptor(value, createDescriptor)];\n}\n\nfunction stringifyUrl(url: string | URL): string {\n return typeof url === \"string\" ? url : url.toString();\n}\n\nfunction createLocalMetadataBase(): URL {\n const protocol = process.env.__NEXT_EXPERIMENTAL_HTTPS ? \"https\" : \"http\";\n return new URL(`${protocol}://localhost:${process.env.PORT || 3000}`);\n}\n\nfunction getPreviewDeploymentUrl(): URL | null {\n const origin = process.env.VERCEL_BRANCH_URL || process.env.VERCEL_URL;\n return origin ? new URL(`https://${origin}`) : null;\n}\n\nfunction getProductionDeploymentUrl(): URL | null {\n const origin = process.env.VERCEL_PROJECT_PRODUCTION_URL;\n return origin ? new URL(`https://${origin}`) : null;\n}\n\nfunction getSocialImageMetadataBaseFallback(metadataBase: URL | null | undefined): URL {\n const defaultMetadataBase = createLocalMetadataBase();\n const previewDeploymentUrl = getPreviewDeploymentUrl();\n const productionDeploymentUrl = getProductionDeploymentUrl();\n\n if (process.env.NODE_ENV === \"development\") {\n return defaultMetadataBase;\n }\n\n if (\n process.env.NODE_ENV === \"production\" &&\n process.env.VERCEL_ENV === \"preview\" &&\n previewDeploymentUrl\n ) {\n return previewDeploymentUrl;\n }\n\n return metadataBase || productionDeploymentUrl || defaultMetadataBase;\n}\n\nfunction trimSlashes(value: string): string {\n return value.replace(/^\\/+|\\/+$/g, \"\");\n}\n\nfunction joinMetadataPath(basePathname: string, pathname: string): string {\n if (!basePathname || basePathname === \"/\") {\n return pathname;\n }\n\n const base = trimSlashes(basePathname);\n const path = trimSlashes(pathname);\n return path ? `/${base}/${path}` : `/${base}`;\n}\n\nfunction resolveRelativeMetadataUrl(url: string, pathname: string): string {\n if (url === \".\" || url === \"./\") {\n return pathname || \"/\";\n }\n if (!url.startsWith(\"./\")) {\n return url;\n }\n\n const base = pathname === \"/\" ? \"\" : pathname.replace(/\\/+$/g, \"\");\n return `${base}/${url.slice(2)}`;\n}\n\nfunction formatResolvedMetadataUrl(url: URL): string {\n if (url.pathname === \"/\" && url.search === \"\" && url.hash === \"\") {\n return url.origin;\n }\n return url.href;\n}\n\nfunction resolveMetadataUrl(url: string | URL, metadataBase: URL | null | undefined): string {\n const value = stringifyUrl(url);\n if (isAbsoluteOrProtocolRelativeUrl(value) || !metadataBase) {\n return value;\n }\n\n try {\n return formatResolvedMetadataUrl(\n new URL(joinMetadataPath(metadataBase.pathname, value), metadataBase),\n );\n } catch {\n return value;\n }\n}\n\nfunction resolveCanonicalUrl(\n url: string | URL,\n metadataBase: URL | null | undefined,\n pathname: string,\n): string {\n if (url instanceof URL) {\n return resolveMetadataUrl(url, metadataBase);\n }\n return resolveMetadataUrl(resolveRelativeMetadataUrl(url, pathname), metadataBase);\n}\n\nfunction isSocialImageDescriptor(\n value: string | URL | SocialImageDescriptor,\n): value is SocialImageDescriptor {\n return typeof value === \"object\" && !(value instanceof URL);\n}\n\nfunction isMetadataRouteSocialImage(value: SocialImageDescriptor): boolean {\n return Reflect.get(value, \"metadataRoute\") === true;\n}\n\nfunction resolveSocialImageUrl(\n image: string | URL | SocialImageDescriptor,\n metadataBase: URL | null | undefined,\n): string {\n const imageUrl = isSocialImageDescriptor(image) ? image.url : image;\n const metadataRoute = isSocialImageDescriptor(image) && isMetadataRouteSocialImage(image);\n if (\n typeof imageUrl === \"string\" &&\n !isAbsoluteOrProtocolRelativeUrl(imageUrl) &&\n (!metadataBase || metadataRoute)\n ) {\n return resolveMetadataUrl(imageUrl, getSocialImageMetadataBaseFallback(metadataBase));\n }\n return resolveMetadataUrl(imageUrl, metadataBase);\n}\n\ntype MetadataHeadProps = {\n metadata: Metadata;\n pathname?: string;\n};\n\nfunction escapeHtmlText(value: string): string {\n return value.replaceAll(\"&\", \"&amp;\").replaceAll(\"<\", \"&lt;\").replaceAll(\">\", \"&gt;\");\n}\n\nfunction escapeHtmlAttribute(value: string): string {\n return escapeHtmlText(value).replaceAll('\"', \"&quot;\");\n}\n\nfunction renderMetadataText(node: unknown): string {\n if (node === null || node === undefined || typeof node === \"boolean\") return \"\";\n if (Array.isArray(node)) return node.map(renderMetadataText).join(\"\");\n if (typeof node === \"string\" || typeof node === \"number\" || typeof node === \"bigint\") {\n return escapeHtmlText(String(node));\n }\n return \"\";\n}\n\nfunction renderMetadataAttributes(props: object, names: readonly string[]): string {\n const attributes: string[] = [];\n for (const name of names) {\n const value = Reflect.get(props, name);\n if (value === null || value === undefined || typeof value === \"boolean\") continue;\n const htmlName = name === \"hrefLang\" ? \"hreflang\" : name;\n attributes.push(`${htmlName}=\"${escapeHtmlAttribute(String(value))}\"`);\n }\n return attributes.length > 0 ? ` ${attributes.join(\" \")}` : \"\";\n}\n\nfunction renderMetadataElementToHtml(node: unknown): string {\n if (node === null || node === undefined || typeof node === \"boolean\") return \"\";\n if (Array.isArray(node)) return node.map(renderMetadataElementToHtml).join(\"\");\n if (!React.isValidElement(node)) return renderMetadataText(node);\n\n const props = typeof node.props === \"object\" && node.props !== null ? node.props : {};\n if (node.type === React.Fragment) {\n return renderMetadataElementToHtml(Reflect.get(props, \"children\"));\n }\n if (typeof node.type !== \"string\") return \"\";\n\n switch (node.type) {\n case \"title\":\n return `<title>${renderMetadataText(Reflect.get(props, \"children\"))}</title>`;\n case \"meta\":\n return `<meta${renderMetadataAttributes(props, [\"name\", \"property\", \"content\"])}>`;\n case \"link\":\n return `<link${renderMetadataAttributes(props, [\n \"rel\",\n \"href\",\n \"hrefLang\",\n \"media\",\n \"type\",\n \"sizes\",\n ])}>`;\n default:\n return \"\";\n }\n}\n\nexport function renderMetadataToHtml(metadata: Metadata, pathname = \"/\"): string {\n return renderMetadataElementToHtml(MetadataHead({ metadata, pathname }));\n}\n\nexport function MetadataHead({ metadata, pathname = \"/\" }: MetadataHeadProps) {\n const elements: React.ReactElement[] = [];\n let key = 0;\n\n // Resolve metadataBase for URL composition\n const base = metadata.metadataBase;\n function resolveUrl(url: string | URL): string;\n function resolveUrl(url: string | URL | undefined): string | undefined;\n function resolveUrl(url: string | URL | undefined): string | undefined {\n if (!url) return undefined;\n return resolveMetadataUrl(url, base);\n }\n\n // Title\n const title =\n typeof metadata.title === \"string\"\n ? metadata.title\n : typeof metadata.title === \"object\"\n ? metadata.title.absolute || metadata.title.default\n : undefined;\n if (title) {\n elements.push(<title key={key++}>{title}</title>);\n }\n\n // Description\n if (metadata.description) {\n elements.push(<meta key={key++} name=\"description\" content={metadata.description} />);\n }\n\n // Generator\n if (metadata.generator) {\n elements.push(<meta key={key++} name=\"generator\" content={metadata.generator} />);\n }\n\n // Application name\n if (metadata.applicationName) {\n elements.push(<meta key={key++} name=\"application-name\" content={metadata.applicationName} />);\n }\n\n // Referrer\n if (metadata.referrer) {\n elements.push(<meta key={key++} name=\"referrer\" content={metadata.referrer} />);\n }\n\n // Keywords\n if (metadata.keywords) {\n const kw = Array.isArray(metadata.keywords) ? metadata.keywords.join(\",\") : metadata.keywords;\n elements.push(<meta key={key++} name=\"keywords\" content={kw} />);\n }\n\n // Authors\n if (metadata.authors) {\n const authorList = Array.isArray(metadata.authors) ? metadata.authors : [metadata.authors];\n for (const author of authorList) {\n if (author.name) {\n elements.push(<meta key={key++} name=\"author\" content={author.name} />);\n }\n if (author.url) {\n elements.push(<link key={key++} rel=\"author\" href={author.url} />);\n }\n }\n }\n\n // Creator\n if (metadata.creator) {\n elements.push(<meta key={key++} name=\"creator\" content={metadata.creator} />);\n }\n\n // Publisher\n if (metadata.publisher) {\n elements.push(<meta key={key++} name=\"publisher\" content={metadata.publisher} />);\n }\n\n // Format detection\n if (metadata.formatDetection) {\n const parts: string[] = [];\n if (metadata.formatDetection.telephone === false) parts.push(\"telephone=no\");\n if (metadata.formatDetection.address === false) parts.push(\"address=no\");\n if (metadata.formatDetection.email === false) parts.push(\"email=no\");\n if (parts.length > 0) {\n elements.push(<meta key={key++} name=\"format-detection\" content={parts.join(\", \")} />);\n }\n }\n\n // Category\n if (metadata.category) {\n elements.push(<meta key={key++} name=\"category\" content={metadata.category} />);\n }\n\n // Robots\n if (metadata.robots) {\n if (typeof metadata.robots === \"string\") {\n elements.push(<meta key={key++} name=\"robots\" content={metadata.robots} />);\n } else {\n const { googleBot, ...robotsRest } = metadata.robots;\n const robotParts: string[] = [];\n for (const [k, v] of Object.entries(robotsRest)) {\n if (v === true) robotParts.push(k);\n else if (v === false) robotParts.push(`no${k}`);\n else if (typeof v === \"string\" || typeof v === \"number\") robotParts.push(`${k}:${v}`);\n }\n if (robotParts.length > 0) {\n elements.push(<meta key={key++} name=\"robots\" content={robotParts.join(\", \")} />);\n }\n // googlebot\n if (googleBot) {\n if (typeof googleBot === \"string\") {\n elements.push(<meta key={key++} name=\"googlebot\" content={googleBot} />);\n } else {\n const gbParts: string[] = [];\n for (const [k, v] of Object.entries(googleBot)) {\n if (v === true) gbParts.push(k);\n else if (v === false) gbParts.push(`no${k}`);\n else if (typeof v === \"string\" || typeof v === \"number\") gbParts.push(`${k}:${v}`);\n }\n if (gbParts.length > 0) {\n elements.push(<meta key={key++} name=\"googlebot\" content={gbParts.join(\", \")} />);\n }\n }\n }\n }\n }\n\n // Open Graph\n if (metadata.openGraph) {\n const og = metadata.openGraph;\n if (og.title) elements.push(<meta key={key++} property=\"og:title\" content={og.title} />);\n if (og.description)\n elements.push(<meta key={key++} property=\"og:description\" content={og.description} />);\n if (og.url) elements.push(<meta key={key++} property=\"og:url\" content={resolveUrl(og.url)} />);\n if (og.siteName)\n elements.push(<meta key={key++} property=\"og:site_name\" content={og.siteName} />);\n if (og.type) elements.push(<meta key={key++} property=\"og:type\" content={og.type} />);\n if (og.locale) elements.push(<meta key={key++} property=\"og:locale\" content={og.locale} />);\n if (og.publishedTime)\n elements.push(\n <meta key={key++} property=\"article:published_time\" content={og.publishedTime} />,\n );\n if (og.modifiedTime)\n elements.push(\n <meta key={key++} property=\"article:modified_time\" content={og.modifiedTime} />,\n );\n if (og.authors) {\n for (const author of og.authors) {\n elements.push(<meta key={key++} property=\"article:author\" content={author} />);\n }\n }\n if (og.images) {\n const imgList =\n typeof og.images === \"string\" || og.images instanceof URL\n ? [{ url: og.images }]\n : Array.isArray(og.images)\n ? og.images\n : [og.images];\n for (const img of imgList) {\n elements.push(\n <meta key={key++} property=\"og:image\" content={resolveSocialImageUrl(img, base)} />,\n );\n if (typeof img !== \"string\" && !(img instanceof URL)) {\n if (img.width)\n elements.push(\n <meta key={key++} property=\"og:image:width\" content={String(img.width)} />,\n );\n if (img.height)\n elements.push(\n <meta key={key++} property=\"og:image:height\" content={String(img.height)} />,\n );\n if (img.type)\n elements.push(<meta key={key++} property=\"og:image:type\" content={img.type} />);\n if (img.alt)\n elements.push(<meta key={key++} property=\"og:image:alt\" content={img.alt} />);\n }\n }\n }\n if (og.videos) {\n for (const video of og.videos) {\n elements.push(<meta key={key++} property=\"og:video\" content={resolveUrl(video.url)} />);\n if (video.width)\n elements.push(\n <meta key={key++} property=\"og:video:width\" content={String(video.width)} />,\n );\n if (video.height)\n elements.push(\n <meta key={key++} property=\"og:video:height\" content={String(video.height)} />,\n );\n }\n }\n if (og.audio) {\n for (const audio of og.audio) {\n elements.push(<meta key={key++} property=\"og:audio\" content={resolveUrl(audio.url)} />);\n }\n }\n }\n\n // Twitter\n if (metadata.twitter) {\n const tw = metadata.twitter;\n if (tw.card) elements.push(<meta key={key++} name=\"twitter:card\" content={tw.card} />);\n if (tw.site) elements.push(<meta key={key++} name=\"twitter:site\" content={tw.site} />);\n if (tw.siteId) elements.push(<meta key={key++} name=\"twitter:site:id\" content={tw.siteId} />);\n if (tw.title) elements.push(<meta key={key++} name=\"twitter:title\" content={tw.title} />);\n if (tw.description)\n elements.push(<meta key={key++} name=\"twitter:description\" content={tw.description} />);\n if (tw.creator) elements.push(<meta key={key++} name=\"twitter:creator\" content={tw.creator} />);\n if (tw.creatorId)\n elements.push(<meta key={key++} name=\"twitter:creator:id\" content={tw.creatorId} />);\n if (tw.images) {\n const imgList =\n typeof tw.images === \"string\" || tw.images instanceof URL\n ? [tw.images]\n : Array.isArray(tw.images)\n ? tw.images\n : [tw.images];\n for (const img of imgList) {\n elements.push(\n <meta key={key++} name=\"twitter:image\" content={resolveSocialImageUrl(img, base)} />,\n );\n if (typeof img !== \"string\" && !(img instanceof URL)) {\n if (img.type) {\n elements.push(<meta key={key++} name=\"twitter:image:type\" content={img.type} />);\n }\n if (img.width) {\n elements.push(\n <meta key={key++} name=\"twitter:image:width\" content={String(img.width)} />,\n );\n }\n if (img.height) {\n elements.push(\n <meta key={key++} name=\"twitter:image:height\" content={String(img.height)} />,\n );\n }\n if (img.alt) {\n elements.push(<meta key={key++} name=\"twitter:image:alt\" content={img.alt} />);\n }\n }\n }\n }\n // Twitter player cards\n if (tw.players) {\n const players = Array.isArray(tw.players) ? tw.players : [tw.players];\n for (const player of players) {\n const playerUrl = player.playerUrl.toString();\n const streamUrl = player.streamUrl.toString();\n elements.push(<meta key={key++} name=\"twitter:player\" content={resolveUrl(playerUrl)} />);\n elements.push(\n <meta key={key++} name=\"twitter:player:stream\" content={resolveUrl(streamUrl)} />,\n );\n elements.push(\n <meta key={key++} name=\"twitter:player:width\" content={String(player.width)} />,\n );\n elements.push(\n <meta key={key++} name=\"twitter:player:height\" content={String(player.height)} />,\n );\n }\n }\n // Twitter app cards\n if (tw.app) {\n const { app } = tw;\n for (const platform of [\"iphone\", \"ipad\", \"googleplay\"] as const) {\n if (app.name) {\n elements.push(\n <meta key={key++} name={`twitter:app:name:${platform}`} content={app.name} />,\n );\n }\n if (app.id[platform] !== undefined) {\n elements.push(\n <meta\n key={key++}\n name={`twitter:app:id:${platform}`}\n content={String(app.id[platform])}\n />,\n );\n }\n if (app.url?.[platform] !== undefined) {\n const appUrl = app.url[platform]!.toString();\n elements.push(\n <meta key={key++} name={`twitter:app:url:${platform}`} content={resolveUrl(appUrl)} />,\n );\n }\n }\n }\n }\n\n // Icons\n if (metadata.icons) {\n const iconEntries = isIconsMap(metadata.icons)\n ? normalizeUrlDescriptorEntries(metadata.icons.icon, (url): IconDescriptor => ({ url }))\n : normalizeUrlDescriptorEntries(metadata.icons, (url): IconDescriptor => ({ url }));\n\n // Shortcut icon\n if (isIconsMap(metadata.icons) && metadata.icons.shortcut) {\n const shortcuts = Array.isArray(metadata.icons.shortcut)\n ? metadata.icons.shortcut\n : [metadata.icons.shortcut];\n for (const s of shortcuts) {\n elements.push(<link key={key++} rel=\"shortcut icon\" href={stringifyUrl(s)} />);\n }\n }\n // Icon\n if (iconEntries.length > 0) {\n for (const i of iconEntries) {\n elements.push(\n <link\n key={key++}\n rel=\"icon\"\n href={stringifyUrl(i.url)}\n {...(i.sizes ? { sizes: i.sizes } : {})}\n {...(i.type ? { type: i.type } : {})}\n {...(i.media ? { media: i.media } : {})}\n />,\n );\n }\n }\n // Apple touch icon\n if (isIconsMap(metadata.icons) && metadata.icons.apple) {\n for (const a of normalizeUrlDescriptorEntries(\n metadata.icons.apple,\n (url): AppleIconDescriptor => ({ url }),\n )) {\n elements.push(\n <link\n key={key++}\n rel=\"apple-touch-icon\"\n href={stringifyUrl(a.url)}\n {...(a.sizes ? { sizes: a.sizes } : {})}\n {...(a.type ? { type: a.type } : {})}\n />,\n );\n }\n }\n // Other custom icon relations\n if (isIconsMap(metadata.icons) && metadata.icons.other) {\n for (const o of metadata.icons.other) {\n elements.push(\n <link\n key={key++}\n rel={o.rel}\n href={stringifyUrl(o.url)}\n {...(o.sizes ? { sizes: o.sizes } : {})}\n />,\n );\n }\n }\n }\n\n // Manifest\n if (metadata.manifest) {\n elements.push(<link key={key++} rel=\"manifest\" href={stringifyUrl(metadata.manifest)} />);\n }\n\n // Alternates\n if (metadata.alternates) {\n const alt = metadata.alternates;\n if (alt.canonical) {\n elements.push(\n <link\n key={key++}\n rel=\"canonical\"\n href={resolveCanonicalUrl(alt.canonical, base, pathname)}\n />,\n );\n }\n if (alt.languages) {\n for (const [lang, href] of Object.entries(alt.languages)) {\n elements.push(<link key={key++} rel=\"alternate\" hrefLang={lang} href={resolveUrl(href)} />);\n }\n }\n if (alt.media) {\n for (const [media, href] of Object.entries(alt.media)) {\n elements.push(<link key={key++} rel=\"alternate\" media={media} href={resolveUrl(href)} />);\n }\n }\n if (alt.types) {\n for (const [type, href] of Object.entries(alt.types)) {\n elements.push(<link key={key++} rel=\"alternate\" type={type} href={resolveUrl(href)} />);\n }\n }\n }\n\n // Verification\n if (metadata.verification) {\n const v = metadata.verification;\n if (v.google)\n elements.push(<meta key={key++} name=\"google-site-verification\" content={v.google} />);\n if (v.yahoo) elements.push(<meta key={key++} name=\"y_key\" content={v.yahoo} />);\n if (v.yandex) elements.push(<meta key={key++} name=\"yandex-verification\" content={v.yandex} />);\n if (v.other) {\n for (const [name, content] of Object.entries(v.other)) {\n const values = Array.isArray(content) ? content : [content];\n for (const val of values) {\n elements.push(<meta key={key++} name={name} content={val} />);\n }\n }\n }\n }\n\n // Apple Web App\n if (metadata.appleWebApp) {\n const awa = metadata.appleWebApp;\n if (awa.capable !== false) {\n elements.push(<meta key={key++} name=\"mobile-web-app-capable\" content=\"yes\" />);\n }\n if (awa.title) {\n elements.push(<meta key={key++} name=\"apple-mobile-web-app-title\" content={awa.title} />);\n }\n if (awa.statusBarStyle) {\n elements.push(\n <meta\n key={key++}\n name=\"apple-mobile-web-app-status-bar-style\"\n content={awa.statusBarStyle}\n />,\n );\n }\n if (awa.startupImage) {\n const imgs =\n typeof awa.startupImage === \"string\" ? [{ url: awa.startupImage }] : awa.startupImage;\n for (const img of imgs) {\n elements.push(\n <link\n key={key++}\n rel=\"apple-touch-startup-image\"\n href={resolveUrl(img.url)}\n {...(img.media ? { media: img.media } : {})}\n />,\n );\n }\n }\n }\n\n // iTunes\n if (metadata.itunes) {\n const { appId, appArgument } = metadata.itunes;\n let content = `app-id=${appId}`;\n if (appArgument) {\n content += `, app-argument=${appArgument}`;\n }\n elements.push(<meta key={key++} name=\"apple-itunes-app\" content={content} />);\n }\n\n // App Links\n if (metadata.appLinks) {\n const al = metadata.appLinks;\n const platforms = [\n \"ios\",\n \"iphone\",\n \"ipad\",\n \"android\",\n \"windows_phone\",\n \"windows\",\n \"windows_universal\",\n \"web\",\n ] as const;\n for (const platform of platforms) {\n const entries = al[platform];\n if (!entries) continue;\n const list = Array.isArray(entries) ? entries : [entries];\n for (const entry of list) {\n for (const [k, v] of Object.entries(entry)) {\n if (v === undefined || v === null) continue;\n const str = String(v);\n const content = k === \"url\" ? resolveUrl(str) : str;\n elements.push(<meta key={key++} property={`al:${platform}:${k}`} content={content} />);\n }\n }\n }\n }\n\n // Other custom meta tags\n if (metadata.other) {\n for (const [name, content] of Object.entries(metadata.other)) {\n const values = Array.isArray(content) ? content : [content];\n for (const val of values) {\n elements.push(<meta key={key++} name={name} content={val} />);\n }\n }\n }\n\n return <>{elements}</>;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"metadata.js","names":[],"sources":["../../src/shims/metadata.tsx"],"sourcesContent":["/**\n * Metadata support for App Router.\n *\n * Handles `export const metadata` and `export async function generateMetadata()`.\n * Resolves metadata from layouts and pages (pages override layouts).\n */\nimport React from \"react\";\nimport { makeThenableParams } from \"./thenable-params.js\";\nimport { isAbsoluteOrProtocolRelativeUrl } from \"./url-utils.js\";\n\n// ---------------------------------------------------------------------------\n// Viewport types and resolution\n// ---------------------------------------------------------------------------\n\nexport type Viewport = {\n /** Viewport width (default: \"device-width\") */\n width?: string | number;\n /** Viewport height */\n height?: string | number;\n /** Initial scale */\n initialScale?: number;\n /** Minimum scale */\n minimumScale?: number;\n /** Maximum scale */\n maximumScale?: number;\n /** Whether user can scale */\n userScalable?: boolean;\n /** Theme color — single color or array of { media, color } */\n themeColor?: string | Array<{ media?: string; color: string }>;\n /** Color scheme: 'light' | 'dark' | 'light dark' | 'normal' */\n colorScheme?: string;\n};\n\n/**\n * Resolve viewport config from a module. Handles both static `viewport` export\n * and async `generateViewport()` function.\n */\nexport async function resolveModuleViewport(\n mod: Record<string, unknown>,\n params: Record<string, string | string[]>,\n): Promise<Viewport | null> {\n if (typeof mod.generateViewport === \"function\") {\n const asyncParams = makeThenableParams(params);\n return await mod.generateViewport({ params: asyncParams });\n }\n if (mod.viewport && typeof mod.viewport === \"object\") {\n return mod.viewport as Viewport;\n }\n return null;\n}\n\n/**\n * Merge viewport configs from multiple sources (layouts + page).\n * Later entries override earlier ones.\n */\nexport const DEFAULT_VIEWPORT: Viewport = {\n width: \"device-width\",\n initialScale: 1,\n};\n\nexport function mergeViewport(viewportList: Viewport[]): Viewport {\n const merged: Viewport = { ...DEFAULT_VIEWPORT };\n for (const vp of viewportList) {\n Object.assign(merged, vp);\n }\n return merged;\n}\n\n/**\n * React component that renders viewport meta tags into <head>.\n */\nexport function ViewportHead({ viewport }: { viewport: Viewport }) {\n const elements: React.ReactElement[] = [];\n let key = 0;\n\n // Build viewport content string\n const parts: string[] = [];\n if (viewport.width !== undefined) parts.push(`width=${viewport.width}`);\n if (viewport.height !== undefined) parts.push(`height=${viewport.height}`);\n if (viewport.initialScale !== undefined) parts.push(`initial-scale=${viewport.initialScale}`);\n if (viewport.minimumScale !== undefined) parts.push(`minimum-scale=${viewport.minimumScale}`);\n if (viewport.maximumScale !== undefined) parts.push(`maximum-scale=${viewport.maximumScale}`);\n if (viewport.userScalable !== undefined)\n parts.push(`user-scalable=${viewport.userScalable ? \"yes\" : \"no\"}`);\n\n if (parts.length > 0) {\n elements.push(<meta key={key++} name=\"viewport\" content={parts.join(\", \")} />);\n }\n\n // Theme color\n if (viewport.themeColor) {\n if (typeof viewport.themeColor === \"string\") {\n elements.push(<meta key={key++} name=\"theme-color\" content={viewport.themeColor} />);\n } else if (Array.isArray(viewport.themeColor)) {\n for (const entry of viewport.themeColor) {\n elements.push(\n <meta\n key={key++}\n name=\"theme-color\"\n content={entry.color}\n {...(entry.media ? { media: entry.media } : {})}\n />,\n );\n }\n }\n }\n\n // Color scheme\n if (viewport.colorScheme) {\n elements.push(<meta key={key++} name=\"color-scheme\" content={viewport.colorScheme} />);\n }\n\n return <>{elements}</>;\n}\n\n// ---------------------------------------------------------------------------\n// Metadata types and resolution\n// ---------------------------------------------------------------------------\n\nexport type Metadata = {\n title?: string | { default?: string; template?: string; absolute?: string };\n description?: string;\n generator?: string;\n applicationName?: string;\n referrer?: string;\n keywords?: string | string[];\n authors?: Array<{ name?: string; url?: string }> | { name?: string; url?: string };\n creator?: string;\n publisher?: string;\n robots?:\n | string\n | {\n index?: boolean;\n follow?: boolean;\n googleBot?: string | { index?: boolean; follow?: boolean; [key: string]: unknown };\n [key: string]: unknown;\n };\n openGraph?: {\n title?: string;\n description?: string;\n url?: string | URL;\n siteName?: string;\n images?: string | URL | SocialImageDescriptor | Array<string | URL | SocialImageDescriptor>;\n videos?: Array<{ url: string | URL; width?: number; height?: number }>;\n audio?: Array<{ url: string | URL }>;\n locale?: string;\n type?: string;\n publishedTime?: string;\n modifiedTime?: string;\n authors?: string[];\n };\n twitter?: {\n card?: string;\n site?: string;\n siteId?: string;\n title?: string;\n description?: string;\n images?: string | URL | SocialImageDescriptor | Array<string | URL | SocialImageDescriptor>;\n creator?: string;\n creatorId?: string;\n players?: TwitterPlayerDescriptor | TwitterPlayerDescriptor[];\n app?: TwitterAppDescriptor;\n };\n icons?: IconsMetadata;\n manifest?: string | URL;\n alternates?: {\n canonical?: string | URL;\n languages?: Record<string, string | URL>;\n media?: Record<string, string | URL>;\n types?: Record<string, string | URL>;\n };\n verification?: {\n google?: string;\n yahoo?: string;\n yandex?: string;\n other?: Record<string, string | string[]>;\n };\n metadataBase?: URL | null;\n appleWebApp?: {\n capable?: boolean;\n title?: string;\n statusBarStyle?: string;\n startupImage?: string | Array<{ url: string; media?: string }>;\n };\n formatDetection?: {\n email?: boolean;\n address?: boolean;\n telephone?: boolean;\n };\n category?: string;\n itunes?: {\n appId: string;\n appArgument?: string;\n };\n appLinks?: {\n ios?: AppLinksApple | AppLinksApple[];\n iphone?: AppLinksApple | AppLinksApple[];\n ipad?: AppLinksApple | AppLinksApple[];\n android?: AppLinksAndroid | AppLinksAndroid[];\n windows_phone?: AppLinksWindows | AppLinksWindows[];\n windows?: AppLinksWindows | AppLinksWindows[];\n windows_universal?: AppLinksWindows | AppLinksWindows[];\n web?: AppLinksWeb | AppLinksWeb[];\n };\n other?: Record<string, string | string[]>;\n [key: string]: unknown;\n};\n\ntype AppLinksApple = {\n url: string | URL;\n app_store_id?: string | number;\n app_name?: string;\n};\n\ntype AppLinksAndroid = {\n package: string;\n url?: string | URL;\n class?: string;\n app_name?: string;\n};\n\ntype AppLinksWindows = {\n url: string | URL;\n app_id?: string;\n app_name?: string;\n};\n\ntype AppLinksWeb = {\n url: string | URL;\n should_fallback?: boolean;\n};\n\ntype TwitterPlayerDescriptor = {\n playerUrl: string | URL;\n streamUrl: string | URL;\n width: number;\n height: number;\n};\n\ntype TwitterAppDescriptor = {\n id: {\n iphone?: string | number;\n ipad?: string | number;\n googleplay?: string;\n };\n url?: {\n iphone?: string | URL;\n ipad?: string | URL;\n googleplay?: string | URL;\n };\n name?: string;\n};\n\ntype SocialImageDescriptor = {\n url: string | URL;\n alt?: string;\n width?: number;\n height?: number;\n type?: string;\n};\n\ntype IconDescriptor = {\n url: string | URL;\n sizes?: string;\n type?: string;\n media?: string;\n};\n\ntype AppleIconDescriptor = {\n url: string | URL;\n sizes?: string;\n type?: string;\n};\n\ntype IconInput = string | URL | IconDescriptor;\ntype AppleIconInput = string | URL | AppleIconDescriptor;\n\ntype OtherIconDescriptor = { rel: string; url: string | URL; sizes?: string; type?: string };\n\ntype IconsMap = {\n icon?: IconInput | IconInput[];\n shortcut?: string | URL | Array<string | URL>;\n apple?: AppleIconInput | AppleIconInput[];\n // Next.js accepts a single descriptor or an array (see resolveIcons in\n // .nextjs-ref/packages/next/src/lib/metadata/resolvers/resolve-icons.ts —\n // values pass through resolveAsArrayOrUndefined before iteration).\n other?: OtherIconDescriptor | OtherIconDescriptor[];\n};\n\ntype IconsMetadata = IconInput | IconInput[] | IconsMap;\n\nexport type MetadataMergeEntry = {\n contributesTitle?: boolean;\n isPage?: boolean;\n metadata: Metadata;\n};\n\n/**\n * Merge metadata from multiple sources (layouts + page).\n *\n * The list is ordered [rootLayout, nestedLayout, ..., page].\n * Title template from layouts applies to the page title but NOT to\n * the segment that defines the template itself. `title.absolute`\n * skips all templates. `title.default` is the fallback when no\n * child provides a title.\n *\n * Shallow merge: later entries override earlier ones (per Next.js docs).\n */\nexport function mergeMetadata(metadataList: Metadata[]): Metadata {\n const merged = mergeMetadataEntries(\n metadataList.map((metadata, index) => ({\n isPage: index === metadataList.length - 1,\n metadata,\n })),\n );\n return postProcessMetadata(merged);\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return (\n typeof value === \"object\" && value !== null && !Array.isArray(value) && !(value instanceof URL)\n );\n}\n\nfunction isOtherMetadata(value: unknown): value is NonNullable<Metadata[\"other\"]> {\n if (!isPlainObject(value)) return false;\n return Object.values(value).every((item) => {\n if (typeof item === \"string\") return true;\n return Array.isArray(item) && item.every((nestedItem) => typeof nestedItem === \"string\");\n });\n}\n\n/**\n * Extract a plain string title from a metadata title value.\n */\nfunction resolveStringTitle(title: Metadata[\"title\"]): string | undefined {\n if (typeof title === \"string\") return title;\n if (title && typeof title === \"object\") {\n return title.absolute ?? title.default ?? undefined;\n }\n return undefined;\n}\n\nfunction applyTitleTemplate(template: string | undefined, title: string): string {\n return template ? template.replace(/%s/g, title) : title;\n}\n\nfunction resolveTitle(title: Metadata[\"title\"], stashedTemplate: string | undefined) {\n if (typeof title === \"string\") {\n return applyTitleTemplate(stashedTemplate, title);\n }\n\n if (title && typeof title === \"object\") {\n let resolved =\n title.default === undefined ? undefined : applyTitleTemplate(stashedTemplate, title.default);\n\n if (title.absolute) {\n resolved = title.absolute;\n }\n\n return resolved;\n }\n\n return undefined;\n}\n\n/**\n * Post-process merged metadata to cross-fill openGraph and Twitter fields.\n *\n * Next.js runs this once after all layouts/pages and file-based metadata\n * have been resolved. When openGraph exists, it auto-fills missing\n * twitter:title/description/images from openGraph (falling back to root\n * metadata title/description). Existing openGraph/twitter objects also inherit\n * missing title/description from root metadata.\n *\n * Ported from Next.js:\n * https://github.com/vercel/next.js/blob/canary/packages/next/src/lib/metadata/resolve-metadata.ts\n */\nexport function postProcessMetadata(merged: Metadata): Metadata {\n // Shallow-clone to avoid mutating the caller's object.\n // Both current call sites (mergeMetadata, resolveAppPageHead) pass\n // freshly-constructed objects, but this guards against future misuse.\n const result = { ...merged };\n\n const resolvedTitle = resolveStringTitle(result.title);\n\n // openGraph inherits title/description from root metadata when absent\n if (result.openGraph) {\n const og = { ...result.openGraph };\n if (!og.title && resolvedTitle) {\n og.title = resolvedTitle;\n }\n if (!og.description && result.description) {\n og.description = result.description;\n }\n result.openGraph = og;\n }\n\n if (result.openGraph) {\n const autoFill: {\n title?: string;\n description?: string;\n images?: NonNullable<Metadata[\"twitter\"]>[\"images\"];\n } = {};\n\n const existingTwitter = result.twitter;\n const hasTwTitle = existingTwitter ? Boolean(existingTwitter.title) : false;\n const hasTwDescription = existingTwitter ? Boolean(existingTwitter.description) : false;\n const hasTwImages = existingTwitter\n ? Object.prototype.hasOwnProperty.call(existingTwitter, \"images\") &&\n Boolean(existingTwitter.images)\n : false;\n\n if (!hasTwTitle) {\n if (result.openGraph.title) {\n autoFill.title = result.openGraph.title;\n } else if (resolvedTitle) {\n autoFill.title = resolvedTitle;\n }\n }\n if (!hasTwDescription) {\n autoFill.description = result.openGraph.description || result.description || undefined;\n }\n if (!hasTwImages && result.openGraph.images !== undefined) {\n autoFill.images = result.openGraph.images;\n }\n\n if (Object.keys(autoFill).length > 0) {\n if (existingTwitter) {\n result.twitter = { ...existingTwitter, ...autoFill };\n } else {\n result.twitter = autoFill;\n }\n }\n }\n\n if (result.twitter) {\n const tw = { ...result.twitter };\n if (!tw.title && resolvedTitle) {\n tw.title = resolvedTitle;\n }\n if (!tw.description && result.description) {\n tw.description = result.description;\n }\n result.twitter = tw;\n }\n\n // If twitter exists (either originally or via auto-fill), ensure card type is set.\n // Next.js resolveTwitter defaults: summary_large_image when images present, else summary.\n if (result.twitter) {\n const tw = { ...result.twitter };\n if (!tw.card) {\n const images = tw.images;\n const hasImages = Array.isArray(images) ? images.length > 0 : Boolean(images);\n tw.card = hasImages ? \"summary_large_image\" : \"summary\";\n }\n result.twitter = tw;\n }\n\n return result;\n}\n\n/**\n * Merge metadata from multiple sources (layouts + page).\n *\n * The list is ordered [rootLayout, nestedLayout, ..., page].\n * Title template from layouts applies to the page title but NOT to\n * the segment that defines the template itself. `title.absolute`\n * skips all templates. `title.default` is the fallback when no\n * child provides a title.\n *\n * For top-level keys, later entries override earlier ones. `other` custom meta\n * tags are the exception: Next.js merges those across segments.\n */\nexport function mergeMetadataEntries(entries: readonly MetadataMergeEntry[]): Metadata {\n if (entries.length === 0) return {};\n\n const merged: Metadata = {};\n\n // Track the most recent ancestor title template from layouts (not from page).\n let parentTemplate: string | undefined;\n\n for (const entry of entries) {\n const meta = entry.metadata;\n const isPage = Boolean(entry.isPage);\n const contributesTitle = entry.contributesTitle !== false;\n\n // Merge non-title keys\n for (const key of Object.keys(meta)) {\n if (key === \"title\") continue; // Handle title separately below\n\n const incoming = meta[key];\n const existing = merged[key];\n\n if (key === \"other\" && isOtherMetadata(existing) && isOtherMetadata(incoming)) {\n merged.other = { ...existing, ...incoming };\n } else {\n // Plain replacement for everything else\n merged[key] = incoming;\n }\n }\n\n // Title resolution\n if (contributesTitle && meta.title !== undefined) {\n merged.title = resolveTitle(meta.title, parentTemplate);\n }\n\n // Collect the current layout template after resolving its own title so\n // title.default is wrapped by the ancestor template, not by its own template.\n if (\n contributesTitle &&\n !isPage &&\n meta.title &&\n typeof meta.title === \"object\" &&\n meta.title.template\n ) {\n parentTemplate = meta.title.template;\n }\n }\n\n return merged;\n}\n\n/**\n * Resolve metadata from a module. Handles both static `metadata` export\n * and async `generateMetadata()` function.\n *\n * @param parent - A Promise that resolves to the accumulated (merged) metadata\n * from all ancestor segments. Passed as the second argument to\n * `generateMetadata()`, matching Next.js's eager-execution-with-serial-\n * resolution approach. If not provided, defaults to a promise that resolves\n * to an empty object (so `await parent` never throws).\n */\nexport async function resolveModuleMetadata(\n mod: Record<string, unknown>,\n params: Record<string, string | string[]> = {},\n searchParams?: Record<string, string | string[]>,\n parent: Promise<Metadata> = Promise.resolve({}),\n): Promise<Metadata | null> {\n if (typeof mod.generateMetadata === \"function\") {\n // Next.js 16 passes params/searchParams as Promises (async pattern).\n // makeThenableParams() normalises null-prototype + preserves sync access.\n const asyncParams = makeThenableParams(params);\n const props =\n searchParams === undefined\n ? { params: asyncParams }\n : { params: asyncParams, searchParams: makeThenableParams(searchParams) };\n return await mod.generateMetadata(props, parent);\n }\n if (mod.metadata && typeof mod.metadata === \"object\") {\n return mod.metadata as Metadata;\n }\n return null;\n}\n\n/**\n * React component that renders metadata as HTML head elements.\n * Used by the RSC entry to inject into the <head>.\n */\nfunction isIconDescriptor(value: unknown): value is IconDescriptor {\n if (typeof value !== \"object\" || value === null || value instanceof URL || Array.isArray(value)) {\n return false;\n }\n const urlValue = Reflect.get(value, \"url\");\n return typeof urlValue === \"string\" || urlValue instanceof URL;\n}\n\nfunction isIconsMap(value: IconsMetadata): value is IconsMap {\n return (\n typeof value === \"object\" &&\n !(value instanceof URL) &&\n !Array.isArray(value) &&\n !isIconDescriptor(value)\n );\n}\n\nfunction normalizeUrlDescriptor<T extends { url: string | URL }>(\n value: string | URL | T,\n createDescriptor: (url: string | URL) => T,\n): T {\n if (typeof value === \"string\" || value instanceof URL) {\n return createDescriptor(value);\n }\n return value;\n}\n\nfunction normalizeUrlDescriptorEntries<T extends { url: string | URL }>(\n value: string | URL | T | Array<string | URL | T> | undefined,\n createDescriptor: (url: string | URL) => T,\n): T[] {\n if (!value) {\n return [];\n }\n\n if (Array.isArray(value)) {\n return value.map((entry) => normalizeUrlDescriptor(entry, createDescriptor));\n }\n\n return [normalizeUrlDescriptor(value, createDescriptor)];\n}\n\nfunction stringifyUrl(url: string | URL): string {\n return typeof url === \"string\" ? url : url.toString();\n}\n\nfunction createLocalMetadataBase(): URL {\n const protocol = process.env.__NEXT_EXPERIMENTAL_HTTPS ? \"https\" : \"http\";\n return new URL(`${protocol}://localhost:${process.env.PORT || 3000}`);\n}\n\nfunction getPreviewDeploymentUrl(): URL | null {\n const origin = process.env.VERCEL_BRANCH_URL || process.env.VERCEL_URL;\n return origin ? new URL(`https://${origin}`) : null;\n}\n\nfunction getProductionDeploymentUrl(): URL | null {\n const origin = process.env.VERCEL_PROJECT_PRODUCTION_URL;\n return origin ? new URL(`https://${origin}`) : null;\n}\n\nfunction getSocialImageMetadataBaseFallback(metadataBase: URL | null | undefined): URL {\n const defaultMetadataBase = createLocalMetadataBase();\n const previewDeploymentUrl = getPreviewDeploymentUrl();\n const productionDeploymentUrl = getProductionDeploymentUrl();\n\n if (process.env.NODE_ENV === \"development\") {\n return defaultMetadataBase;\n }\n\n if (\n process.env.NODE_ENV === \"production\" &&\n process.env.VERCEL_ENV === \"preview\" &&\n previewDeploymentUrl\n ) {\n return previewDeploymentUrl;\n }\n\n return metadataBase || productionDeploymentUrl || defaultMetadataBase;\n}\n\nfunction trimSlashes(value: string): string {\n return value.replace(/^\\/+|\\/+$/g, \"\");\n}\n\nfunction joinMetadataPath(basePathname: string, pathname: string): string {\n if (!basePathname || basePathname === \"/\") {\n return pathname;\n }\n\n const base = trimSlashes(basePathname);\n const path = trimSlashes(pathname);\n return path ? `/${base}/${path}` : `/${base}`;\n}\n\nfunction resolveRelativeMetadataUrl(url: string, pathname: string): string {\n if (url === \".\" || url === \"./\") {\n return pathname || \"/\";\n }\n if (!url.startsWith(\"./\")) {\n return url;\n }\n\n const base = pathname === \"/\" ? \"\" : pathname.replace(/\\/+$/g, \"\");\n return `${base}/${url.slice(2)}`;\n}\n\nfunction formatResolvedMetadataUrl(url: URL): string {\n if (url.pathname === \"/\" && url.search === \"\" && url.hash === \"\") {\n return url.origin;\n }\n return url.href;\n}\n\nfunction resolveMetadataUrl(url: string | URL, metadataBase: URL | null | undefined): string {\n const value = stringifyUrl(url);\n if (isAbsoluteOrProtocolRelativeUrl(value) || !metadataBase) {\n return value;\n }\n\n try {\n return formatResolvedMetadataUrl(\n new URL(joinMetadataPath(metadataBase.pathname, value), metadataBase),\n );\n } catch {\n return value;\n }\n}\n\nfunction resolveCanonicalUrl(\n url: string | URL,\n metadataBase: URL | null | undefined,\n pathname: string,\n): string {\n if (url instanceof URL) {\n return resolveMetadataUrl(url, metadataBase);\n }\n return resolveMetadataUrl(resolveRelativeMetadataUrl(url, pathname), metadataBase);\n}\n\nfunction isSocialImageDescriptor(\n value: string | URL | SocialImageDescriptor,\n): value is SocialImageDescriptor {\n return typeof value === \"object\" && !(value instanceof URL);\n}\n\nfunction isMetadataRouteSocialImage(value: SocialImageDescriptor): boolean {\n return Reflect.get(value, \"metadataRoute\") === true;\n}\n\nfunction resolveSocialImageUrl(\n image: string | URL | SocialImageDescriptor,\n metadataBase: URL | null | undefined,\n): string {\n const imageUrl = isSocialImageDescriptor(image) ? image.url : image;\n const metadataRoute = isSocialImageDescriptor(image) && isMetadataRouteSocialImage(image);\n if (\n typeof imageUrl === \"string\" &&\n !isAbsoluteOrProtocolRelativeUrl(imageUrl) &&\n (!metadataBase || metadataRoute)\n ) {\n return resolveMetadataUrl(imageUrl, getSocialImageMetadataBaseFallback(metadataBase));\n }\n return resolveMetadataUrl(imageUrl, metadataBase);\n}\n\ntype MetadataHeadProps = {\n metadata: Metadata;\n pathname?: string;\n};\n\nfunction escapeHtmlText(value: string): string {\n return value.replaceAll(\"&\", \"&amp;\").replaceAll(\"<\", \"&lt;\").replaceAll(\">\", \"&gt;\");\n}\n\nfunction escapeHtmlAttribute(value: string): string {\n return escapeHtmlText(value).replaceAll('\"', \"&quot;\");\n}\n\nfunction renderMetadataText(node: unknown): string {\n if (node === null || node === undefined || typeof node === \"boolean\") return \"\";\n if (Array.isArray(node)) return node.map(renderMetadataText).join(\"\");\n if (typeof node === \"string\" || typeof node === \"number\" || typeof node === \"bigint\") {\n return escapeHtmlText(String(node));\n }\n return \"\";\n}\n\nfunction renderMetadataAttributes(props: object, names: readonly string[]): string {\n const attributes: string[] = [];\n for (const name of names) {\n const value = Reflect.get(props, name);\n if (value === null || value === undefined || typeof value === \"boolean\") continue;\n const htmlName = name === \"hrefLang\" ? \"hreflang\" : name;\n attributes.push(`${htmlName}=\"${escapeHtmlAttribute(String(value))}\"`);\n }\n return attributes.length > 0 ? ` ${attributes.join(\" \")}` : \"\";\n}\n\nfunction renderMetadataElementToHtml(node: unknown): string {\n if (node === null || node === undefined || typeof node === \"boolean\") return \"\";\n if (Array.isArray(node)) return node.map(renderMetadataElementToHtml).join(\"\");\n if (!React.isValidElement(node)) return renderMetadataText(node);\n\n const props = typeof node.props === \"object\" && node.props !== null ? node.props : {};\n if (node.type === React.Fragment) {\n return renderMetadataElementToHtml(Reflect.get(props, \"children\"));\n }\n if (typeof node.type !== \"string\") return \"\";\n\n switch (node.type) {\n case \"title\":\n return `<title>${renderMetadataText(Reflect.get(props, \"children\"))}</title>`;\n case \"meta\":\n return `<meta${renderMetadataAttributes(props, [\"name\", \"property\", \"content\"])}>`;\n case \"link\":\n return `<link${renderMetadataAttributes(props, [\n \"rel\",\n \"href\",\n \"hrefLang\",\n \"media\",\n \"type\",\n \"sizes\",\n ])}>`;\n default:\n return \"\";\n }\n}\n\nexport function renderMetadataToHtml(metadata: Metadata, pathname = \"/\"): string {\n return renderMetadataElementToHtml(MetadataHead({ metadata, pathname }));\n}\n\nexport function MetadataHead({ metadata, pathname = \"/\" }: MetadataHeadProps) {\n const elements: React.ReactElement[] = [];\n let key = 0;\n\n // Resolve metadataBase for URL composition\n const base = metadata.metadataBase;\n function resolveUrl(url: string | URL): string;\n function resolveUrl(url: string | URL | undefined): string | undefined;\n function resolveUrl(url: string | URL | undefined): string | undefined {\n if (!url) return undefined;\n return resolveMetadataUrl(url, base);\n }\n\n // Title\n const title =\n typeof metadata.title === \"string\"\n ? metadata.title\n : typeof metadata.title === \"object\"\n ? metadata.title.absolute || metadata.title.default\n : undefined;\n if (title) {\n elements.push(<title key={key++}>{title}</title>);\n }\n\n // Description\n if (metadata.description) {\n elements.push(<meta key={key++} name=\"description\" content={metadata.description} />);\n }\n\n // Generator\n if (metadata.generator) {\n elements.push(<meta key={key++} name=\"generator\" content={metadata.generator} />);\n }\n\n // Application name\n if (metadata.applicationName) {\n elements.push(<meta key={key++} name=\"application-name\" content={metadata.applicationName} />);\n }\n\n // Referrer\n if (metadata.referrer) {\n elements.push(<meta key={key++} name=\"referrer\" content={metadata.referrer} />);\n }\n\n // Keywords\n if (metadata.keywords) {\n const kw = Array.isArray(metadata.keywords) ? metadata.keywords.join(\",\") : metadata.keywords;\n elements.push(<meta key={key++} name=\"keywords\" content={kw} />);\n }\n\n // Authors\n if (metadata.authors) {\n const authorList = Array.isArray(metadata.authors) ? metadata.authors : [metadata.authors];\n for (const author of authorList) {\n if (author.name) {\n elements.push(<meta key={key++} name=\"author\" content={author.name} />);\n }\n if (author.url) {\n elements.push(<link key={key++} rel=\"author\" href={author.url} />);\n }\n }\n }\n\n // Creator\n if (metadata.creator) {\n elements.push(<meta key={key++} name=\"creator\" content={metadata.creator} />);\n }\n\n // Publisher\n if (metadata.publisher) {\n elements.push(<meta key={key++} name=\"publisher\" content={metadata.publisher} />);\n }\n\n // Format detection\n if (metadata.formatDetection) {\n const parts: string[] = [];\n if (metadata.formatDetection.telephone === false) parts.push(\"telephone=no\");\n if (metadata.formatDetection.address === false) parts.push(\"address=no\");\n if (metadata.formatDetection.email === false) parts.push(\"email=no\");\n if (parts.length > 0) {\n elements.push(<meta key={key++} name=\"format-detection\" content={parts.join(\", \")} />);\n }\n }\n\n // Category\n if (metadata.category) {\n elements.push(<meta key={key++} name=\"category\" content={metadata.category} />);\n }\n\n // Robots\n if (metadata.robots) {\n if (typeof metadata.robots === \"string\") {\n elements.push(<meta key={key++} name=\"robots\" content={metadata.robots} />);\n } else {\n const { googleBot, ...robotsRest } = metadata.robots;\n const robotParts: string[] = [];\n for (const [k, v] of Object.entries(robotsRest)) {\n if (v === true) robotParts.push(k);\n else if (v === false) robotParts.push(`no${k}`);\n else if (typeof v === \"string\" || typeof v === \"number\") robotParts.push(`${k}:${v}`);\n }\n if (robotParts.length > 0) {\n elements.push(<meta key={key++} name=\"robots\" content={robotParts.join(\", \")} />);\n }\n // googlebot\n if (googleBot) {\n if (typeof googleBot === \"string\") {\n elements.push(<meta key={key++} name=\"googlebot\" content={googleBot} />);\n } else {\n const gbParts: string[] = [];\n for (const [k, v] of Object.entries(googleBot)) {\n if (v === true) gbParts.push(k);\n else if (v === false) gbParts.push(`no${k}`);\n else if (typeof v === \"string\" || typeof v === \"number\") gbParts.push(`${k}:${v}`);\n }\n if (gbParts.length > 0) {\n elements.push(<meta key={key++} name=\"googlebot\" content={gbParts.join(\", \")} />);\n }\n }\n }\n }\n }\n\n // Open Graph\n if (metadata.openGraph) {\n const og = metadata.openGraph;\n if (og.title) elements.push(<meta key={key++} property=\"og:title\" content={og.title} />);\n if (og.description)\n elements.push(<meta key={key++} property=\"og:description\" content={og.description} />);\n if (og.url) elements.push(<meta key={key++} property=\"og:url\" content={resolveUrl(og.url)} />);\n if (og.siteName)\n elements.push(<meta key={key++} property=\"og:site_name\" content={og.siteName} />);\n if (og.type) elements.push(<meta key={key++} property=\"og:type\" content={og.type} />);\n if (og.locale) elements.push(<meta key={key++} property=\"og:locale\" content={og.locale} />);\n if (og.publishedTime)\n elements.push(\n <meta key={key++} property=\"article:published_time\" content={og.publishedTime} />,\n );\n if (og.modifiedTime)\n elements.push(\n <meta key={key++} property=\"article:modified_time\" content={og.modifiedTime} />,\n );\n if (og.authors) {\n for (const author of og.authors) {\n elements.push(<meta key={key++} property=\"article:author\" content={author} />);\n }\n }\n if (og.images) {\n const imgList =\n typeof og.images === \"string\" || og.images instanceof URL\n ? [{ url: og.images }]\n : Array.isArray(og.images)\n ? og.images\n : [og.images];\n for (const img of imgList) {\n elements.push(\n <meta key={key++} property=\"og:image\" content={resolveSocialImageUrl(img, base)} />,\n );\n if (typeof img !== \"string\" && !(img instanceof URL)) {\n if (img.width)\n elements.push(\n <meta key={key++} property=\"og:image:width\" content={String(img.width)} />,\n );\n if (img.height)\n elements.push(\n <meta key={key++} property=\"og:image:height\" content={String(img.height)} />,\n );\n if (img.type)\n elements.push(<meta key={key++} property=\"og:image:type\" content={img.type} />);\n if (img.alt)\n elements.push(<meta key={key++} property=\"og:image:alt\" content={img.alt} />);\n }\n }\n }\n if (og.videos) {\n for (const video of og.videos) {\n elements.push(<meta key={key++} property=\"og:video\" content={resolveUrl(video.url)} />);\n if (video.width)\n elements.push(\n <meta key={key++} property=\"og:video:width\" content={String(video.width)} />,\n );\n if (video.height)\n elements.push(\n <meta key={key++} property=\"og:video:height\" content={String(video.height)} />,\n );\n }\n }\n if (og.audio) {\n for (const audio of og.audio) {\n elements.push(<meta key={key++} property=\"og:audio\" content={resolveUrl(audio.url)} />);\n }\n }\n }\n\n // Twitter\n if (metadata.twitter) {\n const tw = metadata.twitter;\n if (tw.card) elements.push(<meta key={key++} name=\"twitter:card\" content={tw.card} />);\n if (tw.site) elements.push(<meta key={key++} name=\"twitter:site\" content={tw.site} />);\n if (tw.siteId) elements.push(<meta key={key++} name=\"twitter:site:id\" content={tw.siteId} />);\n if (tw.title) elements.push(<meta key={key++} name=\"twitter:title\" content={tw.title} />);\n if (tw.description)\n elements.push(<meta key={key++} name=\"twitter:description\" content={tw.description} />);\n if (tw.creator) elements.push(<meta key={key++} name=\"twitter:creator\" content={tw.creator} />);\n if (tw.creatorId)\n elements.push(<meta key={key++} name=\"twitter:creator:id\" content={tw.creatorId} />);\n if (tw.images) {\n const imgList =\n typeof tw.images === \"string\" || tw.images instanceof URL\n ? [tw.images]\n : Array.isArray(tw.images)\n ? tw.images\n : [tw.images];\n for (const img of imgList) {\n elements.push(\n <meta key={key++} name=\"twitter:image\" content={resolveSocialImageUrl(img, base)} />,\n );\n if (typeof img !== \"string\" && !(img instanceof URL)) {\n if (img.type) {\n elements.push(<meta key={key++} name=\"twitter:image:type\" content={img.type} />);\n }\n if (img.width) {\n elements.push(\n <meta key={key++} name=\"twitter:image:width\" content={String(img.width)} />,\n );\n }\n if (img.height) {\n elements.push(\n <meta key={key++} name=\"twitter:image:height\" content={String(img.height)} />,\n );\n }\n if (img.alt) {\n elements.push(<meta key={key++} name=\"twitter:image:alt\" content={img.alt} />);\n }\n }\n }\n }\n // Twitter player cards\n if (tw.players) {\n const players = Array.isArray(tw.players) ? tw.players : [tw.players];\n for (const player of players) {\n const playerUrl = player.playerUrl.toString();\n const streamUrl = player.streamUrl.toString();\n elements.push(<meta key={key++} name=\"twitter:player\" content={resolveUrl(playerUrl)} />);\n elements.push(\n <meta key={key++} name=\"twitter:player:stream\" content={resolveUrl(streamUrl)} />,\n );\n elements.push(\n <meta key={key++} name=\"twitter:player:width\" content={String(player.width)} />,\n );\n elements.push(\n <meta key={key++} name=\"twitter:player:height\" content={String(player.height)} />,\n );\n }\n }\n // Twitter app cards\n if (tw.app) {\n const { app } = tw;\n for (const platform of [\"iphone\", \"ipad\", \"googleplay\"] as const) {\n if (app.name) {\n elements.push(\n <meta key={key++} name={`twitter:app:name:${platform}`} content={app.name} />,\n );\n }\n if (app.id[platform] !== undefined) {\n elements.push(\n <meta\n key={key++}\n name={`twitter:app:id:${platform}`}\n content={String(app.id[platform])}\n />,\n );\n }\n if (app.url?.[platform] !== undefined) {\n const appUrl = app.url[platform]!.toString();\n elements.push(\n <meta key={key++} name={`twitter:app:url:${platform}`} content={resolveUrl(appUrl)} />,\n );\n }\n }\n }\n }\n\n // Icons\n if (metadata.icons) {\n const iconEntries = isIconsMap(metadata.icons)\n ? normalizeUrlDescriptorEntries(metadata.icons.icon, (url): IconDescriptor => ({ url }))\n : normalizeUrlDescriptorEntries(metadata.icons, (url): IconDescriptor => ({ url }));\n\n // Shortcut icon\n if (isIconsMap(metadata.icons) && metadata.icons.shortcut) {\n const shortcuts = Array.isArray(metadata.icons.shortcut)\n ? metadata.icons.shortcut\n : [metadata.icons.shortcut];\n for (const s of shortcuts) {\n elements.push(<link key={key++} rel=\"shortcut icon\" href={stringifyUrl(s)} />);\n }\n }\n // Icon\n if (iconEntries.length > 0) {\n for (const i of iconEntries) {\n elements.push(\n <link\n key={key++}\n rel=\"icon\"\n href={stringifyUrl(i.url)}\n {...(i.sizes ? { sizes: i.sizes } : {})}\n {...(i.type ? { type: i.type } : {})}\n {...(i.media ? { media: i.media } : {})}\n />,\n );\n }\n }\n // Apple touch icon\n if (isIconsMap(metadata.icons) && metadata.icons.apple) {\n for (const a of normalizeUrlDescriptorEntries(\n metadata.icons.apple,\n (url): AppleIconDescriptor => ({ url }),\n )) {\n elements.push(\n <link\n key={key++}\n rel=\"apple-touch-icon\"\n href={stringifyUrl(a.url)}\n {...(a.sizes ? { sizes: a.sizes } : {})}\n {...(a.type ? { type: a.type } : {})}\n />,\n );\n }\n }\n // Other custom icon relations. Next.js accepts a single descriptor or an\n // array; normalize before iterating.\n if (isIconsMap(metadata.icons) && metadata.icons.other) {\n const others = Array.isArray(metadata.icons.other)\n ? metadata.icons.other\n : [metadata.icons.other];\n for (const o of others) {\n elements.push(\n <link\n key={key++}\n rel={o.rel}\n href={stringifyUrl(o.url)}\n {...(o.sizes ? { sizes: o.sizes } : {})}\n {...(o.type ? { type: o.type } : {})}\n />,\n );\n }\n }\n }\n\n // Manifest\n if (metadata.manifest) {\n elements.push(<link key={key++} rel=\"manifest\" href={stringifyUrl(metadata.manifest)} />);\n }\n\n // Alternates\n if (metadata.alternates) {\n const alt = metadata.alternates;\n if (alt.canonical) {\n elements.push(\n <link\n key={key++}\n rel=\"canonical\"\n href={resolveCanonicalUrl(alt.canonical, base, pathname)}\n />,\n );\n }\n if (alt.languages) {\n for (const [lang, href] of Object.entries(alt.languages)) {\n elements.push(<link key={key++} rel=\"alternate\" hrefLang={lang} href={resolveUrl(href)} />);\n }\n }\n if (alt.media) {\n for (const [media, href] of Object.entries(alt.media)) {\n elements.push(<link key={key++} rel=\"alternate\" media={media} href={resolveUrl(href)} />);\n }\n }\n if (alt.types) {\n for (const [type, href] of Object.entries(alt.types)) {\n elements.push(<link key={key++} rel=\"alternate\" type={type} href={resolveUrl(href)} />);\n }\n }\n }\n\n // Verification\n if (metadata.verification) {\n const v = metadata.verification;\n if (v.google)\n elements.push(<meta key={key++} name=\"google-site-verification\" content={v.google} />);\n if (v.yahoo) elements.push(<meta key={key++} name=\"y_key\" content={v.yahoo} />);\n if (v.yandex) elements.push(<meta key={key++} name=\"yandex-verification\" content={v.yandex} />);\n if (v.other) {\n for (const [name, content] of Object.entries(v.other)) {\n const values = Array.isArray(content) ? content : [content];\n for (const val of values) {\n elements.push(<meta key={key++} name={name} content={val} />);\n }\n }\n }\n }\n\n // Apple Web App\n if (metadata.appleWebApp) {\n const awa = metadata.appleWebApp;\n if (awa.capable !== false) {\n elements.push(<meta key={key++} name=\"mobile-web-app-capable\" content=\"yes\" />);\n }\n if (awa.title) {\n elements.push(<meta key={key++} name=\"apple-mobile-web-app-title\" content={awa.title} />);\n }\n if (awa.statusBarStyle) {\n elements.push(\n <meta\n key={key++}\n name=\"apple-mobile-web-app-status-bar-style\"\n content={awa.statusBarStyle}\n />,\n );\n }\n if (awa.startupImage) {\n const imgs =\n typeof awa.startupImage === \"string\" ? [{ url: awa.startupImage }] : awa.startupImage;\n for (const img of imgs) {\n elements.push(\n <link\n key={key++}\n rel=\"apple-touch-startup-image\"\n href={resolveUrl(img.url)}\n {...(img.media ? { media: img.media } : {})}\n />,\n );\n }\n }\n }\n\n // iTunes\n if (metadata.itunes) {\n const { appId, appArgument } = metadata.itunes;\n let content = `app-id=${appId}`;\n if (appArgument) {\n content += `, app-argument=${appArgument}`;\n }\n elements.push(<meta key={key++} name=\"apple-itunes-app\" content={content} />);\n }\n\n // App Links\n if (metadata.appLinks) {\n const al = metadata.appLinks;\n const platforms = [\n \"ios\",\n \"iphone\",\n \"ipad\",\n \"android\",\n \"windows_phone\",\n \"windows\",\n \"windows_universal\",\n \"web\",\n ] as const;\n for (const platform of platforms) {\n const entries = al[platform];\n if (!entries) continue;\n const list = Array.isArray(entries) ? entries : [entries];\n for (const entry of list) {\n for (const [k, v] of Object.entries(entry)) {\n if (v === undefined || v === null) continue;\n const str = String(v);\n const content = k === \"url\" ? resolveUrl(str) : str;\n elements.push(<meta key={key++} property={`al:${platform}:${k}`} content={content} />);\n }\n }\n }\n }\n\n // Other custom meta tags\n if (metadata.other) {\n for (const [name, content] of Object.entries(metadata.other)) {\n const values = Array.isArray(content) ? content : [content];\n for (const val of values) {\n elements.push(<meta key={key++} name={name} content={val} />);\n }\n }\n }\n\n return <>{elements}</>;\n}\n"],"mappings":";;;;;;;;;;;;;;;AAqCA,eAAsB,sBACpB,KACA,QAC0B;CAC1B,IAAI,OAAO,IAAI,qBAAqB,YAAY;EAC9C,MAAM,cAAc,mBAAmB,OAAO;EAC9C,OAAO,MAAM,IAAI,iBAAiB,EAAE,QAAQ,aAAa,CAAC;;CAE5D,IAAI,IAAI,YAAY,OAAO,IAAI,aAAa,UAC1C,OAAO,IAAI;CAEb,OAAO;;;;;;AAOT,MAAa,mBAA6B;CACxC,OAAO;CACP,cAAc;CACf;AAED,SAAgB,cAAc,cAAoC;CAChE,MAAM,SAAmB,EAAE,GAAG,kBAAkB;CAChD,KAAK,MAAM,MAAM,cACf,OAAO,OAAO,QAAQ,GAAG;CAE3B,OAAO;;;;;AAMT,SAAgB,aAAa,EAAE,YAAoC;CACjE,MAAM,WAAiC,EAAE;CACzC,IAAI,MAAM;CAGV,MAAM,QAAkB,EAAE;CAC1B,IAAI,SAAS,UAAU,KAAA,GAAW,MAAM,KAAK,SAAS,SAAS,QAAQ;CACvE,IAAI,SAAS,WAAW,KAAA,GAAW,MAAM,KAAK,UAAU,SAAS,SAAS;CAC1E,IAAI,SAAS,iBAAiB,KAAA,GAAW,MAAM,KAAK,iBAAiB,SAAS,eAAe;CAC7F,IAAI,SAAS,iBAAiB,KAAA,GAAW,MAAM,KAAK,iBAAiB,SAAS,eAAe;CAC7F,IAAI,SAAS,iBAAiB,KAAA,GAAW,MAAM,KAAK,iBAAiB,SAAS,eAAe;CAC7F,IAAI,SAAS,iBAAiB,KAAA,GAC5B,MAAM,KAAK,iBAAiB,SAAS,eAAe,QAAQ,OAAO;CAErE,IAAI,MAAM,SAAS,GACjB,SAAS,KAAK,oBAAC,QAAD;EAAkB,MAAK;EAAW,SAAS,MAAM,KAAK,KAAK;EAAI,EAApD,MAAoD,CAAC;CAIhF,IAAI,SAAS;MACP,OAAO,SAAS,eAAe,UACjC,SAAS,KAAK,oBAAC,QAAD;GAAkB,MAAK;GAAc,SAAS,SAAS;GAAc,EAA1D,MAA0D,CAAC;OAC/E,IAAI,MAAM,QAAQ,SAAS,WAAW,EAC3C,KAAK,MAAM,SAAS,SAAS,YAC3B,SAAS,KACP,oBAAC,QAAD;GAEE,MAAK;GACL,SAAS,MAAM;GACf,GAAK,MAAM,QAAQ,EAAE,OAAO,MAAM,OAAO,GAAG,EAAE;GAC9C,EAJK,MAIL,CACH;;CAMP,IAAI,SAAS,aACX,SAAS,KAAK,oBAAC,QAAD;EAAkB,MAAK;EAAe,SAAS,SAAS;EAAe,EAA5D,MAA4D,CAAC;CAGxF,OAAO,oBAAA,YAAA,EAAA,UAAG,UAAY,CAAA;;;;;;;;;;;;;AAoMxB,SAAgB,cAAc,cAAoC;CAOhE,OAAO,oBANQ,qBACb,aAAa,KAAK,UAAU,WAAW;EACrC,QAAQ,UAAU,aAAa,SAAS;EACxC;EACD,EAAE,CAE4B,CAAC;;AAGpC,SAAS,cAAc,OAAkD;CACvE,OACE,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,MAAM,IAAI,EAAE,iBAAiB;;AAI/F,SAAS,gBAAgB,OAAyD;CAChF,IAAI,CAAC,cAAc,MAAM,EAAE,OAAO;CAClC,OAAO,OAAO,OAAO,MAAM,CAAC,OAAO,SAAS;EAC1C,IAAI,OAAO,SAAS,UAAU,OAAO;EACrC,OAAO,MAAM,QAAQ,KAAK,IAAI,KAAK,OAAO,eAAe,OAAO,eAAe,SAAS;GACxF;;;;;AAMJ,SAAS,mBAAmB,OAA8C;CACxE,IAAI,OAAO,UAAU,UAAU,OAAO;CACtC,IAAI,SAAS,OAAO,UAAU,UAC5B,OAAO,MAAM,YAAY,MAAM,WAAW,KAAA;;AAK9C,SAAS,mBAAmB,UAA8B,OAAuB;CAC/E,OAAO,WAAW,SAAS,QAAQ,OAAO,MAAM,GAAG;;AAGrD,SAAS,aAAa,OAA0B,iBAAqC;CACnF,IAAI,OAAO,UAAU,UACnB,OAAO,mBAAmB,iBAAiB,MAAM;CAGnD,IAAI,SAAS,OAAO,UAAU,UAAU;EACtC,IAAI,WACF,MAAM,YAAY,KAAA,IAAY,KAAA,IAAY,mBAAmB,iBAAiB,MAAM,QAAQ;EAE9F,IAAI,MAAM,UACR,WAAW,MAAM;EAGnB,OAAO;;;;;;;;;;;;;;;AAkBX,SAAgB,oBAAoB,QAA4B;CAI9D,MAAM,SAAS,EAAE,GAAG,QAAQ;CAE5B,MAAM,gBAAgB,mBAAmB,OAAO,MAAM;CAGtD,IAAI,OAAO,WAAW;EACpB,MAAM,KAAK,EAAE,GAAG,OAAO,WAAW;EAClC,IAAI,CAAC,GAAG,SAAS,eACf,GAAG,QAAQ;EAEb,IAAI,CAAC,GAAG,eAAe,OAAO,aAC5B,GAAG,cAAc,OAAO;EAE1B,OAAO,YAAY;;CAGrB,IAAI,OAAO,WAAW;EACpB,MAAM,WAIF,EAAE;EAEN,MAAM,kBAAkB,OAAO;EAC/B,MAAM,aAAa,kBAAkB,QAAQ,gBAAgB,MAAM,GAAG;EACtE,MAAM,mBAAmB,kBAAkB,QAAQ,gBAAgB,YAAY,GAAG;EAClF,MAAM,cAAc,kBAChB,OAAO,UAAU,eAAe,KAAK,iBAAiB,SAAS,IAC/D,QAAQ,gBAAgB,OAAO,GAC/B;EAEJ,IAAI,CAAC;OACC,OAAO,UAAU,OACnB,SAAS,QAAQ,OAAO,UAAU;QAC7B,IAAI,eACT,SAAS,QAAQ;;EAGrB,IAAI,CAAC,kBACH,SAAS,cAAc,OAAO,UAAU,eAAe,OAAO,eAAe,KAAA;EAE/E,IAAI,CAAC,eAAe,OAAO,UAAU,WAAW,KAAA,GAC9C,SAAS,SAAS,OAAO,UAAU;EAGrC,IAAI,OAAO,KAAK,SAAS,CAAC,SAAS,GACjC,IAAI,iBACF,OAAO,UAAU;GAAE,GAAG;GAAiB,GAAG;GAAU;OAEpD,OAAO,UAAU;;CAKvB,IAAI,OAAO,SAAS;EAClB,MAAM,KAAK,EAAE,GAAG,OAAO,SAAS;EAChC,IAAI,CAAC,GAAG,SAAS,eACf,GAAG,QAAQ;EAEb,IAAI,CAAC,GAAG,eAAe,OAAO,aAC5B,GAAG,cAAc,OAAO;EAE1B,OAAO,UAAU;;CAKnB,IAAI,OAAO,SAAS;EAClB,MAAM,KAAK,EAAE,GAAG,OAAO,SAAS;EAChC,IAAI,CAAC,GAAG,MAAM;GACZ,MAAM,SAAS,GAAG;GAElB,GAAG,QADe,MAAM,QAAQ,OAAO,GAAG,OAAO,SAAS,IAAI,QAAQ,OAAO,IACvD,wBAAwB;;EAEhD,OAAO,UAAU;;CAGnB,OAAO;;;;;;;;;;;;;;AAeT,SAAgB,qBAAqB,SAAkD;CACrF,IAAI,QAAQ,WAAW,GAAG,OAAO,EAAE;CAEnC,MAAM,SAAmB,EAAE;CAG3B,IAAI;CAEJ,KAAK,MAAM,SAAS,SAAS;EAC3B,MAAM,OAAO,MAAM;EACnB,MAAM,SAAS,QAAQ,MAAM,OAAO;EACpC,MAAM,mBAAmB,MAAM,qBAAqB;EAGpD,KAAK,MAAM,OAAO,OAAO,KAAK,KAAK,EAAE;GACnC,IAAI,QAAQ,SAAS;GAErB,MAAM,WAAW,KAAK;GACtB,MAAM,WAAW,OAAO;GAExB,IAAI,QAAQ,WAAW,gBAAgB,SAAS,IAAI,gBAAgB,SAAS,EAC3E,OAAO,QAAQ;IAAE,GAAG;IAAU,GAAG;IAAU;QAG3C,OAAO,OAAO;;EAKlB,IAAI,oBAAoB,KAAK,UAAU,KAAA,GACrC,OAAO,QAAQ,aAAa,KAAK,OAAO,eAAe;EAKzD,IACE,oBACA,CAAC,UACD,KAAK,SACL,OAAO,KAAK,UAAU,YACtB,KAAK,MAAM,UAEX,iBAAiB,KAAK,MAAM;;CAIhC,OAAO;;;;;;;;;;;;AAaT,eAAsB,sBACpB,KACA,SAA4C,EAAE,EAC9C,cACA,SAA4B,QAAQ,QAAQ,EAAE,CAAC,EACrB;CAC1B,IAAI,OAAO,IAAI,qBAAqB,YAAY;EAG9C,MAAM,cAAc,mBAAmB,OAAO;EAC9C,MAAM,QACJ,iBAAiB,KAAA,IACb,EAAE,QAAQ,aAAa,GACvB;GAAE,QAAQ;GAAa,cAAc,mBAAmB,aAAa;GAAE;EAC7E,OAAO,MAAM,IAAI,iBAAiB,OAAO,OAAO;;CAElD,IAAI,IAAI,YAAY,OAAO,IAAI,aAAa,UAC1C,OAAO,IAAI;CAEb,OAAO;;;;;;AAOT,SAAS,iBAAiB,OAAyC;CACjE,IAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,iBAAiB,OAAO,MAAM,QAAQ,MAAM,EAC7F,OAAO;CAET,MAAM,WAAW,QAAQ,IAAI,OAAO,MAAM;CAC1C,OAAO,OAAO,aAAa,YAAY,oBAAoB;;AAG7D,SAAS,WAAW,OAAyC;CAC3D,OACE,OAAO,UAAU,YACjB,EAAE,iBAAiB,QACnB,CAAC,MAAM,QAAQ,MAAM,IACrB,CAAC,iBAAiB,MAAM;;AAI5B,SAAS,uBACP,OACA,kBACG;CACH,IAAI,OAAO,UAAU,YAAY,iBAAiB,KAChD,OAAO,iBAAiB,MAAM;CAEhC,OAAO;;AAGT,SAAS,8BACP,OACA,kBACK;CACL,IAAI,CAAC,OACH,OAAO,EAAE;CAGX,IAAI,MAAM,QAAQ,MAAM,EACtB,OAAO,MAAM,KAAK,UAAU,uBAAuB,OAAO,iBAAiB,CAAC;CAG9E,OAAO,CAAC,uBAAuB,OAAO,iBAAiB,CAAC;;AAG1D,SAAS,aAAa,KAA2B;CAC/C,OAAO,OAAO,QAAQ,WAAW,MAAM,IAAI,UAAU;;AAGvD,SAAS,0BAA+B;CACtC,MAAM,WAAW,QAAQ,IAAI,4BAA4B,UAAU;CACnE,OAAO,IAAI,IAAI,GAAG,SAAS,eAAe,QAAQ,IAAI,QAAQ,MAAO;;AAGvE,SAAS,0BAAsC;CAC7C,MAAM,SAAS,QAAQ,IAAI,qBAAqB,QAAQ,IAAI;CAC5D,OAAO,SAAS,IAAI,IAAI,WAAW,SAAS,GAAG;;AAGjD,SAAS,6BAAyC;CAChD,MAAM,SAAS,QAAQ,IAAI;CAC3B,OAAO,SAAS,IAAI,IAAI,WAAW,SAAS,GAAG;;AAGjD,SAAS,mCAAmC,cAA2C;CACrF,MAAM,sBAAsB,yBAAyB;CACrD,MAAM,uBAAuB,yBAAyB;CACtD,MAAM,0BAA0B,4BAA4B;CAE5D,IAAI,QAAQ,IAAI,aAAa,eAC3B,OAAO;CAGT,IACE,QAAQ,IAAI,aAAa,gBACzB,QAAQ,IAAI,eAAe,aAC3B,sBAEA,OAAO;CAGT,OAAO,gBAAgB,2BAA2B;;AAGpD,SAAS,YAAY,OAAuB;CAC1C,OAAO,MAAM,QAAQ,cAAc,GAAG;;AAGxC,SAAS,iBAAiB,cAAsB,UAA0B;CACxE,IAAI,CAAC,gBAAgB,iBAAiB,KACpC,OAAO;CAGT,MAAM,OAAO,YAAY,aAAa;CACtC,MAAM,OAAO,YAAY,SAAS;CAClC,OAAO,OAAO,IAAI,KAAK,GAAG,SAAS,IAAI;;AAGzC,SAAS,2BAA2B,KAAa,UAA0B;CACzE,IAAI,QAAQ,OAAO,QAAQ,MACzB,OAAO,YAAY;CAErB,IAAI,CAAC,IAAI,WAAW,KAAK,EACvB,OAAO;CAIT,OAAO,GADM,aAAa,MAAM,KAAK,SAAS,QAAQ,SAAS,GAAG,CACnD,GAAG,IAAI,MAAM,EAAE;;AAGhC,SAAS,0BAA0B,KAAkB;CACnD,IAAI,IAAI,aAAa,OAAO,IAAI,WAAW,MAAM,IAAI,SAAS,IAC5D,OAAO,IAAI;CAEb,OAAO,IAAI;;AAGb,SAAS,mBAAmB,KAAmB,cAA8C;CAC3F,MAAM,QAAQ,aAAa,IAAI;CAC/B,IAAI,gCAAgC,MAAM,IAAI,CAAC,cAC7C,OAAO;CAGT,IAAI;EACF,OAAO,0BACL,IAAI,IAAI,iBAAiB,aAAa,UAAU,MAAM,EAAE,aAAa,CACtE;SACK;EACN,OAAO;;;AAIX,SAAS,oBACP,KACA,cACA,UACQ;CACR,IAAI,eAAe,KACjB,OAAO,mBAAmB,KAAK,aAAa;CAE9C,OAAO,mBAAmB,2BAA2B,KAAK,SAAS,EAAE,aAAa;;AAGpF,SAAS,wBACP,OACgC;CAChC,OAAO,OAAO,UAAU,YAAY,EAAE,iBAAiB;;AAGzD,SAAS,2BAA2B,OAAuC;CACzE,OAAO,QAAQ,IAAI,OAAO,gBAAgB,KAAK;;AAGjD,SAAS,sBACP,OACA,cACQ;CACR,MAAM,WAAW,wBAAwB,MAAM,GAAG,MAAM,MAAM;CAC9D,MAAM,gBAAgB,wBAAwB,MAAM,IAAI,2BAA2B,MAAM;CACzF,IACE,OAAO,aAAa,YACpB,CAAC,gCAAgC,SAAS,KACzC,CAAC,gBAAgB,gBAElB,OAAO,mBAAmB,UAAU,mCAAmC,aAAa,CAAC;CAEvF,OAAO,mBAAmB,UAAU,aAAa;;AAQnD,SAAS,eAAe,OAAuB;CAC7C,OAAO,MAAM,WAAW,KAAK,QAAQ,CAAC,WAAW,KAAK,OAAO,CAAC,WAAW,KAAK,OAAO;;AAGvF,SAAS,oBAAoB,OAAuB;CAClD,OAAO,eAAe,MAAM,CAAC,WAAW,MAAK,SAAS;;AAGxD,SAAS,mBAAmB,MAAuB;CACjD,IAAI,SAAS,QAAQ,SAAS,KAAA,KAAa,OAAO,SAAS,WAAW,OAAO;CAC7E,IAAI,MAAM,QAAQ,KAAK,EAAE,OAAO,KAAK,IAAI,mBAAmB,CAAC,KAAK,GAAG;CACrE,IAAI,OAAO,SAAS,YAAY,OAAO,SAAS,YAAY,OAAO,SAAS,UAC1E,OAAO,eAAe,OAAO,KAAK,CAAC;CAErC,OAAO;;AAGT,SAAS,yBAAyB,OAAe,OAAkC;CACjF,MAAM,aAAuB,EAAE;CAC/B,KAAK,MAAM,QAAQ,OAAO;EACxB,MAAM,QAAQ,QAAQ,IAAI,OAAO,KAAK;EACtC,IAAI,UAAU,QAAQ,UAAU,KAAA,KAAa,OAAO,UAAU,WAAW;EACzE,MAAM,WAAW,SAAS,aAAa,aAAa;EACpD,WAAW,KAAK,GAAG,SAAS,IAAI,oBAAoB,OAAO,MAAM,CAAC,CAAC,GAAG;;CAExE,OAAO,WAAW,SAAS,IAAI,IAAI,WAAW,KAAK,IAAI,KAAK;;AAG9D,SAAS,4BAA4B,MAAuB;CAC1D,IAAI,SAAS,QAAQ,SAAS,KAAA,KAAa,OAAO,SAAS,WAAW,OAAO;CAC7E,IAAI,MAAM,QAAQ,KAAK,EAAE,OAAO,KAAK,IAAI,4BAA4B,CAAC,KAAK,GAAG;CAC9E,IAAI,CAAC,MAAM,eAAe,KAAK,EAAE,OAAO,mBAAmB,KAAK;CAEhE,MAAM,QAAQ,OAAO,KAAK,UAAU,YAAY,KAAK,UAAU,OAAO,KAAK,QAAQ,EAAE;CACrF,IAAI,KAAK,SAAS,MAAM,UACtB,OAAO,4BAA4B,QAAQ,IAAI,OAAO,WAAW,CAAC;CAEpE,IAAI,OAAO,KAAK,SAAS,UAAU,OAAO;CAE1C,QAAQ,KAAK,MAAb;EACE,KAAK,SACH,OAAO,UAAU,mBAAmB,QAAQ,IAAI,OAAO,WAAW,CAAC,CAAC;EACtE,KAAK,QACH,OAAO,QAAQ,yBAAyB,OAAO;GAAC;GAAQ;GAAY;GAAU,CAAC,CAAC;EAClF,KAAK,QACH,OAAO,QAAQ,yBAAyB,OAAO;GAC7C;GACA;GACA;GACA;GACA;GACA;GACD,CAAC,CAAC;EACL,SACE,OAAO;;;AAIb,SAAgB,qBAAqB,UAAoB,WAAW,KAAa;CAC/E,OAAO,4BAA4B,aAAa;EAAE;EAAU;EAAU,CAAC,CAAC;;AAG1E,SAAgB,aAAa,EAAE,UAAU,WAAW,OAA0B;CAC5E,MAAM,WAAiC,EAAE;CACzC,IAAI,MAAM;CAGV,MAAM,OAAO,SAAS;CAGtB,SAAS,WAAW,KAAmD;EACrE,IAAI,CAAC,KAAK,OAAO,KAAA;EACjB,OAAO,mBAAmB,KAAK,KAAK;;CAItC,MAAM,QACJ,OAAO,SAAS,UAAU,WACtB,SAAS,QACT,OAAO,SAAS,UAAU,WACxB,SAAS,MAAM,YAAY,SAAS,MAAM,UAC1C,KAAA;CACR,IAAI,OACF,SAAS,KAAK,oBAAC,SAAD,EAAA,UAAoB,OAAc,EAAtB,MAAsB,CAAC;CAInD,IAAI,SAAS,aACX,SAAS,KAAK,oBAAC,QAAD;EAAkB,MAAK;EAAc,SAAS,SAAS;EAAe,EAA3D,MAA2D,CAAC;CAIvF,IAAI,SAAS,WACX,SAAS,KAAK,oBAAC,QAAD;EAAkB,MAAK;EAAY,SAAS,SAAS;EAAa,EAAvD,MAAuD,CAAC;CAInF,IAAI,SAAS,iBACX,SAAS,KAAK,oBAAC,QAAD;EAAkB,MAAK;EAAmB,SAAS,SAAS;EAAmB,EAApE,MAAoE,CAAC;CAIhG,IAAI,SAAS,UACX,SAAS,KAAK,oBAAC,QAAD;EAAkB,MAAK;EAAW,SAAS,SAAS;EAAY,EAArD,MAAqD,CAAC;CAIjF,IAAI,SAAS,UAAU;EACrB,MAAM,KAAK,MAAM,QAAQ,SAAS,SAAS,GAAG,SAAS,SAAS,KAAK,IAAI,GAAG,SAAS;EACrF,SAAS,KAAK,oBAAC,QAAD;GAAkB,MAAK;GAAW,SAAS;GAAM,EAAtC,MAAsC,CAAC;;CAIlE,IAAI,SAAS,SAAS;EACpB,MAAM,aAAa,MAAM,QAAQ,SAAS,QAAQ,GAAG,SAAS,UAAU,CAAC,SAAS,QAAQ;EAC1F,KAAK,MAAM,UAAU,YAAY;GAC/B,IAAI,OAAO,MACT,SAAS,KAAK,oBAAC,QAAD;IAAkB,MAAK;IAAS,SAAS,OAAO;IAAQ,EAA7C,MAA6C,CAAC;GAEzE,IAAI,OAAO,KACT,SAAS,KAAK,oBAAC,QAAD;IAAkB,KAAI;IAAS,MAAM,OAAO;IAAO,EAAxC,MAAwC,CAAC;;;CAMxE,IAAI,SAAS,SACX,SAAS,KAAK,oBAAC,QAAD;EAAkB,MAAK;EAAU,SAAS,SAAS;EAAW,EAAnD,MAAmD,CAAC;CAI/E,IAAI,SAAS,WACX,SAAS,KAAK,oBAAC,QAAD;EAAkB,MAAK;EAAY,SAAS,SAAS;EAAa,EAAvD,MAAuD,CAAC;CAInF,IAAI,SAAS,iBAAiB;EAC5B,MAAM,QAAkB,EAAE;EAC1B,IAAI,SAAS,gBAAgB,cAAc,OAAO,MAAM,KAAK,eAAe;EAC5E,IAAI,SAAS,gBAAgB,YAAY,OAAO,MAAM,KAAK,aAAa;EACxE,IAAI,SAAS,gBAAgB,UAAU,OAAO,MAAM,KAAK,WAAW;EACpE,IAAI,MAAM,SAAS,GACjB,SAAS,KAAK,oBAAC,QAAD;GAAkB,MAAK;GAAmB,SAAS,MAAM,KAAK,KAAK;GAAI,EAA5D,MAA4D,CAAC;;CAK1F,IAAI,SAAS,UACX,SAAS,KAAK,oBAAC,QAAD;EAAkB,MAAK;EAAW,SAAS,SAAS;EAAY,EAArD,MAAqD,CAAC;CAIjF,IAAI,SAAS,QACX,IAAI,OAAO,SAAS,WAAW,UAC7B,SAAS,KAAK,oBAAC,QAAD;EAAkB,MAAK;EAAS,SAAS,SAAS;EAAU,EAAjD,MAAiD,CAAC;MACtE;EACL,MAAM,EAAE,WAAW,GAAG,eAAe,SAAS;EAC9C,MAAM,aAAuB,EAAE;EAC/B,KAAK,MAAM,CAAC,GAAG,MAAM,OAAO,QAAQ,WAAW,EAC7C,IAAI,MAAM,MAAM,WAAW,KAAK,EAAE;OAC7B,IAAI,MAAM,OAAO,WAAW,KAAK,KAAK,IAAI;OAC1C,IAAI,OAAO,MAAM,YAAY,OAAO,MAAM,UAAU,WAAW,KAAK,GAAG,EAAE,GAAG,IAAI;EAEvF,IAAI,WAAW,SAAS,GACtB,SAAS,KAAK,oBAAC,QAAD;GAAkB,MAAK;GAAS,SAAS,WAAW,KAAK,KAAK;GAAI,EAAvD,MAAuD,CAAC;EAGnF,IAAI,WACF,IAAI,OAAO,cAAc,UACvB,SAAS,KAAK,oBAAC,QAAD;GAAkB,MAAK;GAAY,SAAS;GAAa,EAA9C,MAA8C,CAAC;OACnE;GACL,MAAM,UAAoB,EAAE;GAC5B,KAAK,MAAM,CAAC,GAAG,MAAM,OAAO,QAAQ,UAAU,EAC5C,IAAI,MAAM,MAAM,QAAQ,KAAK,EAAE;QAC1B,IAAI,MAAM,OAAO,QAAQ,KAAK,KAAK,IAAI;QACvC,IAAI,OAAO,MAAM,YAAY,OAAO,MAAM,UAAU,QAAQ,KAAK,GAAG,EAAE,GAAG,IAAI;GAEpF,IAAI,QAAQ,SAAS,GACnB,SAAS,KAAK,oBAAC,QAAD;IAAkB,MAAK;IAAY,SAAS,QAAQ,KAAK,KAAK;IAAI,EAAvD,MAAuD,CAAC;;;CAQ3F,IAAI,SAAS,WAAW;EACtB,MAAM,KAAK,SAAS;EACpB,IAAI,GAAG,OAAO,SAAS,KAAK,oBAAC,QAAD;GAAkB,UAAS;GAAW,SAAS,GAAG;GAAS,EAAhD,MAAgD,CAAC;EACxF,IAAI,GAAG,aACL,SAAS,KAAK,oBAAC,QAAD;GAAkB,UAAS;GAAiB,SAAS,GAAG;GAAe,EAA5D,MAA4D,CAAC;EACxF,IAAI,GAAG,KAAK,SAAS,KAAK,oBAAC,QAAD;GAAkB,UAAS;GAAS,SAAS,WAAW,GAAG,IAAI;GAAI,EAAxD,MAAwD,CAAC;EAC9F,IAAI,GAAG,UACL,SAAS,KAAK,oBAAC,QAAD;GAAkB,UAAS;GAAe,SAAS,GAAG;GAAY,EAAvD,MAAuD,CAAC;EACnF,IAAI,GAAG,MAAM,SAAS,KAAK,oBAAC,QAAD;GAAkB,UAAS;GAAU,SAAS,GAAG;GAAQ,EAA9C,MAA8C,CAAC;EACrF,IAAI,GAAG,QAAQ,SAAS,KAAK,oBAAC,QAAD;GAAkB,UAAS;GAAY,SAAS,GAAG;GAAU,EAAlD,MAAkD,CAAC;EAC3F,IAAI,GAAG,eACL,SAAS,KACP,oBAAC,QAAD;GAAkB,UAAS;GAAyB,SAAS,GAAG;GAAiB,EAAtE,MAAsE,CAClF;EACH,IAAI,GAAG,cACL,SAAS,KACP,oBAAC,QAAD;GAAkB,UAAS;GAAwB,SAAS,GAAG;GAAgB,EAApE,MAAoE,CAChF;EACH,IAAI,GAAG,SACL,KAAK,MAAM,UAAU,GAAG,SACtB,SAAS,KAAK,oBAAC,QAAD;GAAkB,UAAS;GAAiB,SAAS;GAAU,EAApD,MAAoD,CAAC;EAGlF,IAAI,GAAG,QAAQ;GACb,MAAM,UACJ,OAAO,GAAG,WAAW,YAAY,GAAG,kBAAkB,MAClD,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC,GACpB,MAAM,QAAQ,GAAG,OAAO,GACtB,GAAG,SACH,CAAC,GAAG,OAAO;GACnB,KAAK,MAAM,OAAO,SAAS;IACzB,SAAS,KACP,oBAAC,QAAD;KAAkB,UAAS;KAAW,SAAS,sBAAsB,KAAK,KAAK;KAAI,EAAxE,MAAwE,CACpF;IACD,IAAI,OAAO,QAAQ,YAAY,EAAE,eAAe,MAAM;KACpD,IAAI,IAAI,OACN,SAAS,KACP,oBAAC,QAAD;MAAkB,UAAS;MAAiB,SAAS,OAAO,IAAI,MAAM;MAAI,EAA/D,MAA+D,CAC3E;KACH,IAAI,IAAI,QACN,SAAS,KACP,oBAAC,QAAD;MAAkB,UAAS;MAAkB,SAAS,OAAO,IAAI,OAAO;MAAI,EAAjE,MAAiE,CAC7E;KACH,IAAI,IAAI,MACN,SAAS,KAAK,oBAAC,QAAD;MAAkB,UAAS;MAAgB,SAAS,IAAI;MAAQ,EAArD,MAAqD,CAAC;KACjF,IAAI,IAAI,KACN,SAAS,KAAK,oBAAC,QAAD;MAAkB,UAAS;MAAe,SAAS,IAAI;MAAO,EAAnD,MAAmD,CAAC;;;;EAIrF,IAAI,GAAG,QACL,KAAK,MAAM,SAAS,GAAG,QAAQ;GAC7B,SAAS,KAAK,oBAAC,QAAD;IAAkB,UAAS;IAAW,SAAS,WAAW,MAAM,IAAI;IAAI,EAA7D,MAA6D,CAAC;GACvF,IAAI,MAAM,OACR,SAAS,KACP,oBAAC,QAAD;IAAkB,UAAS;IAAiB,SAAS,OAAO,MAAM,MAAM;IAAI,EAAjE,MAAiE,CAC7E;GACH,IAAI,MAAM,QACR,SAAS,KACP,oBAAC,QAAD;IAAkB,UAAS;IAAkB,SAAS,OAAO,MAAM,OAAO;IAAI,EAAnE,MAAmE,CAC/E;;EAGP,IAAI,GAAG,OACL,KAAK,MAAM,SAAS,GAAG,OACrB,SAAS,KAAK,oBAAC,QAAD;GAAkB,UAAS;GAAW,SAAS,WAAW,MAAM,IAAI;GAAI,EAA7D,MAA6D,CAAC;;CAM7F,IAAI,SAAS,SAAS;EACpB,MAAM,KAAK,SAAS;EACpB,IAAI,GAAG,MAAM,SAAS,KAAK,oBAAC,QAAD;GAAkB,MAAK;GAAe,SAAS,GAAG;GAAQ,EAA/C,MAA+C,CAAC;EACtF,IAAI,GAAG,MAAM,SAAS,KAAK,oBAAC,QAAD;GAAkB,MAAK;GAAe,SAAS,GAAG;GAAQ,EAA/C,MAA+C,CAAC;EACtF,IAAI,GAAG,QAAQ,SAAS,KAAK,oBAAC,QAAD;GAAkB,MAAK;GAAkB,SAAS,GAAG;GAAU,EAApD,MAAoD,CAAC;EAC7F,IAAI,GAAG,OAAO,SAAS,KAAK,oBAAC,QAAD;GAAkB,MAAK;GAAgB,SAAS,GAAG;GAAS,EAAjD,MAAiD,CAAC;EACzF,IAAI,GAAG,aACL,SAAS,KAAK,oBAAC,QAAD;GAAkB,MAAK;GAAsB,SAAS,GAAG;GAAe,EAA7D,MAA6D,CAAC;EACzF,IAAI,GAAG,SAAS,SAAS,KAAK,oBAAC,QAAD;GAAkB,MAAK;GAAkB,SAAS,GAAG;GAAW,EAArD,MAAqD,CAAC;EAC/F,IAAI,GAAG,WACL,SAAS,KAAK,oBAAC,QAAD;GAAkB,MAAK;GAAqB,SAAS,GAAG;GAAa,EAA1D,MAA0D,CAAC;EACtF,IAAI,GAAG,QAAQ;GACb,MAAM,UACJ,OAAO,GAAG,WAAW,YAAY,GAAG,kBAAkB,MAClD,CAAC,GAAG,OAAO,GACX,MAAM,QAAQ,GAAG,OAAO,GACtB,GAAG,SACH,CAAC,GAAG,OAAO;GACnB,KAAK,MAAM,OAAO,SAAS;IACzB,SAAS,KACP,oBAAC,QAAD;KAAkB,MAAK;KAAgB,SAAS,sBAAsB,KAAK,KAAK;KAAI,EAAzE,MAAyE,CACrF;IACD,IAAI,OAAO,QAAQ,YAAY,EAAE,eAAe,MAAM;KACpD,IAAI,IAAI,MACN,SAAS,KAAK,oBAAC,QAAD;MAAkB,MAAK;MAAqB,SAAS,IAAI;MAAQ,EAAtD,MAAsD,CAAC;KAElF,IAAI,IAAI,OACN,SAAS,KACP,oBAAC,QAAD;MAAkB,MAAK;MAAsB,SAAS,OAAO,IAAI,MAAM;MAAI,EAAhE,MAAgE,CAC5E;KAEH,IAAI,IAAI,QACN,SAAS,KACP,oBAAC,QAAD;MAAkB,MAAK;MAAuB,SAAS,OAAO,IAAI,OAAO;MAAI,EAAlE,MAAkE,CAC9E;KAEH,IAAI,IAAI,KACN,SAAS,KAAK,oBAAC,QAAD;MAAkB,MAAK;MAAoB,SAAS,IAAI;MAAO,EAApD,MAAoD,CAAC;;;;EAMtF,IAAI,GAAG,SAAS;GACd,MAAM,UAAU,MAAM,QAAQ,GAAG,QAAQ,GAAG,GAAG,UAAU,CAAC,GAAG,QAAQ;GACrE,KAAK,MAAM,UAAU,SAAS;IAC5B,MAAM,YAAY,OAAO,UAAU,UAAU;IAC7C,MAAM,YAAY,OAAO,UAAU,UAAU;IAC7C,SAAS,KAAK,oBAAC,QAAD;KAAkB,MAAK;KAAiB,SAAS,WAAW,UAAU;KAAI,EAA/D,MAA+D,CAAC;IACzF,SAAS,KACP,oBAAC,QAAD;KAAkB,MAAK;KAAwB,SAAS,WAAW,UAAU;KAAI,EAAtE,MAAsE,CAClF;IACD,SAAS,KACP,oBAAC,QAAD;KAAkB,MAAK;KAAuB,SAAS,OAAO,OAAO,MAAM;KAAI,EAApE,MAAoE,CAChF;IACD,SAAS,KACP,oBAAC,QAAD;KAAkB,MAAK;KAAwB,SAAS,OAAO,OAAO,OAAO;KAAI,EAAtE,MAAsE,CAClF;;;EAIL,IAAI,GAAG,KAAK;GACV,MAAM,EAAE,QAAQ;GAChB,KAAK,MAAM,YAAY;IAAC;IAAU;IAAQ;IAAa,EAAW;IAChE,IAAI,IAAI,MACN,SAAS,KACP,oBAAC,QAAD;KAAkB,MAAM,oBAAoB;KAAY,SAAS,IAAI;KAAQ,EAAlE,MAAkE,CAC9E;IAEH,IAAI,IAAI,GAAG,cAAc,KAAA,GACvB,SAAS,KACP,oBAAC,QAAD;KAEE,MAAM,kBAAkB;KACxB,SAAS,OAAO,IAAI,GAAG,UAAU;KACjC,EAHK,MAGL,CACH;IAEH,IAAI,IAAI,MAAM,cAAc,KAAA,GAAW;KACrC,MAAM,SAAS,IAAI,IAAI,UAAW,UAAU;KAC5C,SAAS,KACP,oBAAC,QAAD;MAAkB,MAAM,mBAAmB;MAAY,SAAS,WAAW,OAAO;MAAI,EAA3E,MAA2E,CACvF;;;;;CAOT,IAAI,SAAS,OAAO;EAClB,MAAM,cAAc,WAAW,SAAS,MAAM,GAC1C,8BAA8B,SAAS,MAAM,OAAO,SAAyB,EAAE,KAAK,EAAE,GACtF,8BAA8B,SAAS,QAAQ,SAAyB,EAAE,KAAK,EAAE;EAGrF,IAAI,WAAW,SAAS,MAAM,IAAI,SAAS,MAAM,UAAU;GACzD,MAAM,YAAY,MAAM,QAAQ,SAAS,MAAM,SAAS,GACpD,SAAS,MAAM,WACf,CAAC,SAAS,MAAM,SAAS;GAC7B,KAAK,MAAM,KAAK,WACd,SAAS,KAAK,oBAAC,QAAD;IAAkB,KAAI;IAAgB,MAAM,aAAa,EAAE;IAAI,EAApD,MAAoD,CAAC;;EAIlF,IAAI,YAAY,SAAS,GACvB,KAAK,MAAM,KAAK,aACd,SAAS,KACP,oBAAC,QAAD;GAEE,KAAI;GACJ,MAAM,aAAa,EAAE,IAAI;GACzB,GAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE;GACtC,GAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,EAAE;GACnC,GAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE;GACtC,EANK,MAML,CACH;EAIL,IAAI,WAAW,SAAS,MAAM,IAAI,SAAS,MAAM,OAC/C,KAAK,MAAM,KAAK,8BACd,SAAS,MAAM,QACd,SAA8B,EAAE,KAAK,EACvC,EACC,SAAS,KACP,oBAAC,QAAD;GAEE,KAAI;GACJ,MAAM,aAAa,EAAE,IAAI;GACzB,GAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE;GACtC,GAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,EAAE;GACnC,EALK,MAKL,CACH;EAKL,IAAI,WAAW,SAAS,MAAM,IAAI,SAAS,MAAM,OAAO;GACtD,MAAM,SAAS,MAAM,QAAQ,SAAS,MAAM,MAAM,GAC9C,SAAS,MAAM,QACf,CAAC,SAAS,MAAM,MAAM;GAC1B,KAAK,MAAM,KAAK,QACd,SAAS,KACP,oBAAC,QAAD;IAEE,KAAK,EAAE;IACP,MAAM,aAAa,EAAE,IAAI;IACzB,GAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE;IACtC,GAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,EAAE;IACnC,EALK,MAKL,CACH;;;CAMP,IAAI,SAAS,UACX,SAAS,KAAK,oBAAC,QAAD;EAAkB,KAAI;EAAW,MAAM,aAAa,SAAS,SAAS;EAAI,EAA/D,MAA+D,CAAC;CAI3F,IAAI,SAAS,YAAY;EACvB,MAAM,MAAM,SAAS;EACrB,IAAI,IAAI,WACN,SAAS,KACP,oBAAC,QAAD;GAEE,KAAI;GACJ,MAAM,oBAAoB,IAAI,WAAW,MAAM,SAAS;GACxD,EAHK,MAGL,CACH;EAEH,IAAI,IAAI,WACN,KAAK,MAAM,CAAC,MAAM,SAAS,OAAO,QAAQ,IAAI,UAAU,EACtD,SAAS,KAAK,oBAAC,QAAD;GAAkB,KAAI;GAAY,UAAU;GAAM,MAAM,WAAW,KAAK;GAAI,EAAjE,MAAiE,CAAC;EAG/F,IAAI,IAAI,OACN,KAAK,MAAM,CAAC,OAAO,SAAS,OAAO,QAAQ,IAAI,MAAM,EACnD,SAAS,KAAK,oBAAC,QAAD;GAAkB,KAAI;GAAmB;GAAO,MAAM,WAAW,KAAK;GAAI,EAA/D,MAA+D,CAAC;EAG7F,IAAI,IAAI,OACN,KAAK,MAAM,CAAC,MAAM,SAAS,OAAO,QAAQ,IAAI,MAAM,EAClD,SAAS,KAAK,oBAAC,QAAD;GAAkB,KAAI;GAAkB;GAAM,MAAM,WAAW,KAAK;GAAI,EAA7D,MAA6D,CAAC;;CAM7F,IAAI,SAAS,cAAc;EACzB,MAAM,IAAI,SAAS;EACnB,IAAI,EAAE,QACJ,SAAS,KAAK,oBAAC,QAAD;GAAkB,MAAK;GAA2B,SAAS,EAAE;GAAU,EAA5D,MAA4D,CAAC;EACxF,IAAI,EAAE,OAAO,SAAS,KAAK,oBAAC,QAAD;GAAkB,MAAK;GAAQ,SAAS,EAAE;GAAS,EAAxC,MAAwC,CAAC;EAC/E,IAAI,EAAE,QAAQ,SAAS,KAAK,oBAAC,QAAD;GAAkB,MAAK;GAAsB,SAAS,EAAE;GAAU,EAAvD,MAAuD,CAAC;EAC/F,IAAI,EAAE,OACJ,KAAK,MAAM,CAAC,MAAM,YAAY,OAAO,QAAQ,EAAE,MAAM,EAAE;GACrD,MAAM,SAAS,MAAM,QAAQ,QAAQ,GAAG,UAAU,CAAC,QAAQ;GAC3D,KAAK,MAAM,OAAO,QAChB,SAAS,KAAK,oBAAC,QAAD;IAAwB;IAAM,SAAS;IAAO,EAAnC,MAAmC,CAAC;;;CAOrE,IAAI,SAAS,aAAa;EACxB,MAAM,MAAM,SAAS;EACrB,IAAI,IAAI,YAAY,OAClB,SAAS,KAAK,oBAAC,QAAD;GAAkB,MAAK;GAAyB,SAAQ;GAAQ,EAArD,MAAqD,CAAC;EAEjF,IAAI,IAAI,OACN,SAAS,KAAK,oBAAC,QAAD;GAAkB,MAAK;GAA6B,SAAS,IAAI;GAAS,EAA/D,MAA+D,CAAC;EAE3F,IAAI,IAAI,gBACN,SAAS,KACP,oBAAC,QAAD;GAEE,MAAK;GACL,SAAS,IAAI;GACb,EAHK,MAGL,CACH;EAEH,IAAI,IAAI,cAAc;GACpB,MAAM,OACJ,OAAO,IAAI,iBAAiB,WAAW,CAAC,EAAE,KAAK,IAAI,cAAc,CAAC,GAAG,IAAI;GAC3E,KAAK,MAAM,OAAO,MAChB,SAAS,KACP,oBAAC,QAAD;IAEE,KAAI;IACJ,MAAM,WAAW,IAAI,IAAI;IACzB,GAAK,IAAI,QAAQ,EAAE,OAAO,IAAI,OAAO,GAAG,EAAE;IAC1C,EAJK,MAIL,CACH;;;CAMP,IAAI,SAAS,QAAQ;EACnB,MAAM,EAAE,OAAO,gBAAgB,SAAS;EACxC,IAAI,UAAU,UAAU;EACxB,IAAI,aACF,WAAW,kBAAkB;EAE/B,SAAS,KAAK,oBAAC,QAAD;GAAkB,MAAK;GAA4B;GAAW,EAAnD,MAAmD,CAAC;;CAI/E,IAAI,SAAS,UAAU;EACrB,MAAM,KAAK,SAAS;EAWpB,KAAK,MAAM,YAAY;GATrB;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GAE8B,EAAE;GAChC,MAAM,UAAU,GAAG;GACnB,IAAI,CAAC,SAAS;GACd,MAAM,OAAO,MAAM,QAAQ,QAAQ,GAAG,UAAU,CAAC,QAAQ;GACzD,KAAK,MAAM,SAAS,MAClB,KAAK,MAAM,CAAC,GAAG,MAAM,OAAO,QAAQ,MAAM,EAAE;IAC1C,IAAI,MAAM,KAAA,KAAa,MAAM,MAAM;IACnC,MAAM,MAAM,OAAO,EAAE;IACrB,MAAM,UAAU,MAAM,QAAQ,WAAW,IAAI,GAAG;IAChD,SAAS,KAAK,oBAAC,QAAD;KAAkB,UAAU,MAAM,SAAS,GAAG;KAAc;KAAW,EAA5D,MAA4D,CAAC;;;;CAO9F,IAAI,SAAS,OACX,KAAK,MAAM,CAAC,MAAM,YAAY,OAAO,QAAQ,SAAS,MAAM,EAAE;EAC5D,MAAM,SAAS,MAAM,QAAQ,QAAQ,GAAG,UAAU,CAAC,QAAQ;EAC3D,KAAK,MAAM,OAAO,QAChB,SAAS,KAAK,oBAAC,QAAD;GAAwB;GAAM,SAAS;GAAO,EAAnC,MAAmC,CAAC;;CAKnE,OAAO,oBAAA,YAAA,EAAA,UAAG,UAAY,CAAA"}