{"version":3,"sources":["../src/client/metadata-reconciler.ts","../src/client/spa-router.ts","../src/client/history-sync.ts"],"sourcesContent":["import { renderMetadataHead, resolveMetadataTitle } from \"../metadata\";\nimport type { Metadata } from \"../types\";\n\nexport type NavigationMetadata = (Metadata & Record<string, any>) | undefined;\n\n/** Marks head elements this reconciler inserted, so they can be replaced. */\nconst MANAGED_ATTRIBUTE = \"data-farm-metadata\";\n\n/**\n * Head tags the metadata system owns outright. These are swept on every\n * navigation whether or not they carry the managed marker, because the tags\n * rendered by the server for the first page have no marker and must not\n * survive into the next page's head.\n */\nconst OWNED_SELECTORS = [\n  'meta[name=\"description\"]',\n  'meta[name=\"keywords\"]',\n  'meta[name=\"author\"]',\n  'meta[name=\"creator\"]',\n  'meta[name=\"publisher\"]',\n  'meta[name=\"robots\"]',\n  'link[rel=\"author\"]',\n  'link[rel=\"canonical\"]',\n  'link[rel=\"alternate\"]',\n  'meta[property^=\"og:\"]',\n  'meta[name^=\"twitter:\"]',\n].join(\", \");\n\n/**\n * Icons and the web-app manifest have document-level defaults that exist\n * outside page metadata (the default favicon, a discovered manifest route), so\n * an absent value means \"keep what the document has\", not \"remove it\". They\n * are only swept when the next page defines its own.\n */\nconst ICON_SELECTORS = [\n  'link[rel=\"icon\"]',\n  'link[rel=\"shortcut icon\"]',\n  'link[rel=\"apple-touch-icon\"]',\n].join(\", \");\nconst MANIFEST_SELECTOR = 'link[rel=\"manifest\"]';\n\nfunction removeAll(selector: string): void {\n  for (const element of Array.from(document.head.querySelectorAll(selector))) {\n    element.remove();\n  }\n}\n\n/**\n * Make the document head for a client-side navigation match what a full-page\n * load of the target route renders: same title resolution and the same managed\n * tag set, produced by the same `renderMetadataHead` the server uses.\n *\n * JSON-LD is deliberately untouched: the agent JSON-LD script is site identity\n * rather than page metadata, and sweeping ld+json scripts could remove ones the\n * application authored itself.\n */\nexport function applyFarmMetadataToDocument(metadata: NavigationMetadata, pathname: string): void {\n  document.title = resolveMetadataTitle(metadata?.title) || \"Farm.js App\";\n\n  const rendered = renderMetadataHead(metadata, { pathname });\n  const template = document.createElement(\"template\");\n  template.innerHTML = rendered.tags;\n\n  removeAll(OWNED_SELECTORS);\n  if (metadata?.icons) removeAll(ICON_SELECTORS);\n  if (metadata?.manifest) removeAll(MANIFEST_SELECTOR);\n\n  for (const element of Array.from(template.content.children)) {\n    element.setAttribute(MANAGED_ATTRIBUTE, \"\");\n    document.head.appendChild(element);\n  }\n}\n","\"use client\";\n\nimport { readDeferredDataResponse } from \"../deferred\";\nimport { notifyHistoryChange, notifyRouterHistoryChange } from \"./history-sync\";\nimport {\n  createFarmDeploymentMismatchError,\n  createFarmDeploymentRequestHeaders,\n  isFarmDeploymentMismatchResponse,\n} from \"../deployment\";\nimport { getHashTargetElement } from \"./hash-target\";\nimport { isFarmExternalNavigationURL, resolveFarmNavigationURL } from \"./navigation-url\";\nimport { applyFarmMetadataToDocument, type NavigationMetadata } from \"./metadata-reconciler\";\nimport type { FarmClientNavigationSession, FarmClientPluginManager } from \"./plugin\";\nimport { _hydrateFarmI18n, isFarmLocaleChangeHref } from \"../i18n/client-runtime\";\nimport type { FarmI18nClientSnapshot } from \"../i18n/types\";\nimport type { FarmIslandStrategy } from \"../island\";\nimport type { FarmRouteRenderPlan } from \"../navigation/render-plan\";\n\nexport { getHashTargetElement } from \"./hash-target\";\nexport { isFarmExternalNavigationURL } from \"./navigation-url\";\n\n/**\n * Farm.js SPA Router\n *\n * Provides client-side navigation without full page reloads.\n * Features:\n * - Prefetch on viewport intersection\n * - Prefetch on hover\n * - Page caching\n * - History API integration\n * - Scroll restoration\n */\n\ninterface PageData {\n  props: Record<string, any>;\n  modulePath: string;\n  loadingModulePath?: string | null;\n  canonicalPath?: string;\n  isClientComponent?: boolean;\n  shouldHydrate?: boolean;\n  islandStrategy?: FarmIslandStrategy | null;\n  renderPlan?: FarmRouteRenderPlan;\n  fragment?: {\n    html: string;\n    layoutPatterns: string[];\n  };\n  metadata?: NavigationMetadata;\n  layoutModules?: string[];\n  routeSlots?: RouteSlotPageData[];\n  interception?: {\n    from?: string;\n    slots: string[];\n  };\n  i18n?: FarmI18nClientSnapshot;\n}\n\ninterface RouteSlotPageData {\n  name: string;\n  ownerPattern: string;\n  containerId: string;\n  interception: boolean;\n  fallback: boolean;\n  modulePath: string;\n  isClientComponent: boolean;\n  shouldHydrate: boolean;\n  props: Record<string, any>;\n}\n\nexport interface RouterOptions {\n  prefetchTimeout?: number;\n  cacheMaxAge?: number;\n  scrollRestoration?: boolean;\n  shouldUseDocumentNavigation?: (pathname: string) => boolean;\n  deploymentId?: string;\n}\n\ninterface CacheEntry {\n  data: PageData;\n  timestamp: number;\n}\n\nexport interface FarmNavigationBlockerContext {\n  from: string;\n  to: string;\n  action: \"push\" | \"replace\" | \"pop\";\n}\n\nexport type FarmNavigationBlocker = (\n  context: FarmNavigationBlockerContext,\n) => boolean | void | Promise<boolean | void>;\n\nexport type FarmViewTransitionMode = boolean | \"auto\";\n\nexport interface FarmNavigateOptions {\n  replace?: boolean;\n  scroll?: boolean;\n  state?: unknown;\n  viewTransition?: FarmViewTransitionMode;\n  /** Re-fetch the current route even when its URL has not changed. */\n  refresh?: boolean;\n}\n\nexport interface FarmNavigationLocation {\n  href: string;\n  pathname: string;\n  search: string;\n  hash: string;\n}\n\nexport interface FarmNavigationState {\n  state: \"idle\" | \"loading\";\n  pending: boolean;\n  from: string | null;\n  to: FarmNavigationLocation | null;\n  action: FarmNavigationBlockerContext[\"action\"] | null;\n  startedAt: number | null;\n}\n\nexport type FarmNavigationListener = (state: FarmNavigationState) => void;\n\nconst FARM_PAGE_STATE_KEY = \"__farmPageState\";\nconst FARM_INTERCEPT_FROM_KEY = \"__farmInterceptFrom\";\nconst FARM_HISTORY_INDEX_KEY = \"__farmHistoryIndex\";\n\nfunction readHistoryIndex(state: unknown): number | null {\n  if (!state || typeof state !== \"object\") return null;\n  const value = (state as Record<string, unknown>)[FARM_HISTORY_INDEX_KEY];\n  return typeof value === \"number\" && Number.isFinite(value) ? value : null;\n}\nconst IDLE_NAVIGATION_STATE: FarmNavigationState = {\n  state: \"idle\",\n  pending: false,\n  from: null,\n  to: null,\n  action: null,\n  startedAt: null,\n};\n\nfunction getActiveLayoutChainHeader(): string | undefined {\n  if (typeof document === \"undefined\") return undefined;\n  const patterns = Array.from(\n    document.querySelectorAll<HTMLElement>('[data-farm-layout-boundary=\"true\"]'),\n  )\n    .map((element) => element.dataset.farmLayoutPattern)\n    .filter((pattern): pattern is string => Boolean(pattern));\n  return patterns.length > 0 ? JSON.stringify(patterns) : undefined;\n}\n\n// Global router instance\nlet routerInstance: SPARouter | null = null;\n\nexport class SPARouter {\n  private cache: Map<string, CacheEntry> = new Map();\n  private prefetchingUrls: Set<string> = new Set();\n  private observers: Map<Element, IntersectionObserver> = new Map();\n  private prefetchTimers: Map<Element, ReturnType<typeof setTimeout>> = new Map();\n  private blockers: Set<FarmNavigationBlocker> = new Set();\n  private unloadBlockers: Map<FarmNavigationBlocker, () => boolean> = new Map();\n  private navigationListeners: Set<FarmNavigationListener> = new Set();\n  private navigationState: FarmNavigationState = IDLE_NAVIGATION_STATE;\n  private currentHistoryPath: string | null = null;\n  private currentHistoryIndex: number | null = null;\n  private suppressNextPopState = false;\n  private navigationSequence = 0;\n  private activeNavigation?: {\n    id: number;\n    controller: AbortController;\n  };\n  private scrollElements: Map<string, HTMLElement> = new Map();\n  private options: Required<Omit<RouterOptions, \"deploymentId\">> &\n    Pick<RouterOptions, \"deploymentId\">;\n  private onNavigate?: (data: PageData) => Promise<void>;\n  private clientPlugins?: Pick<\n    FarmClientPluginManager,\n    | \"beginNavigation\"\n    | \"markNavigationLoaded\"\n    | \"resolveNavigation\"\n    | \"scheduleNavigationRendered\"\n    | \"failNavigation\"\n  >;\n\n  private readonly onPopState = (event: PopStateEvent) => {\n    void this.handlePopState(event);\n  };\n\n  private readonly onBeforeUnload = (event: BeforeUnloadEvent) => {\n    if (this.shouldBlockUnload()) {\n      event.preventDefault();\n      event.returnValue = \"\";\n    }\n    this.saveScrollPosition(window.location.pathname + window.location.search);\n  };\n\n  constructor(options: RouterOptions = {}) {\n    this.options = {\n      prefetchTimeout: options.prefetchTimeout ?? 100,\n      cacheMaxAge: options.cacheMaxAge ?? 30000, // 30 seconds\n      scrollRestoration: options.scrollRestoration ?? true,\n      shouldUseDocumentNavigation: options.shouldUseDocumentNavigation ?? (() => false),\n      deploymentId: options.deploymentId ?? readBrowserDeploymentId(),\n    };\n\n    if (typeof window !== \"undefined\") {\n      // Listen for popstate (back/forward navigation)\n      window.addEventListener(\"popstate\", this.onPopState);\n\n      // Save scroll position before unload\n      window.addEventListener(\"beforeunload\", this.onBeforeUnload);\n\n      // Track the rendered location and its position in the history stack so\n      // popstate can report a real `from` and revert blocked traversals.\n      this.currentHistoryPath = window.location.pathname + window.location.search;\n      const existingIndex = readHistoryIndex(window.history.state);\n      if (existingIndex == null) {\n        try {\n          window.history.replaceState(\n            {\n              ...((window.history.state as object | null) ?? {}),\n              [FARM_HISTORY_INDEX_KEY]: 0,\n            },\n            \"\",\n            window.location.href,\n          );\n          this.currentHistoryIndex = 0;\n        } catch {\n          this.currentHistoryIndex = null;\n        }\n      } else {\n        this.currentHistoryIndex = existingIndex;\n      }\n    }\n  }\n\n  /** Remove global listeners. Intended for tests and teardown. */\n  destroy(): void {\n    if (typeof window === \"undefined\") return;\n    this.cancelActiveNavigation();\n    for (const observer of this.observers.values()) observer.disconnect();\n    for (const timer of this.prefetchTimers.values()) clearTimeout(timer);\n    this.observers.clear();\n    this.prefetchTimers.clear();\n    window.removeEventListener(\"popstate\", this.onPopState);\n    window.removeEventListener(\"beforeunload\", this.onBeforeUnload);\n  }\n\n  /**\n   * Set the navigation handler that updates React\n   */\n  setNavigationHandler(handler: (data: PageData) => Promise<void>) {\n    this.onNavigate = handler;\n  }\n\n  /**\n   * Connect Farm's browser plugin lifecycle to SPA navigation.\n   */\n  setClientPluginManager(manager: FarmClientPluginManager) {\n    this.clientPlugins = manager;\n  }\n\n  /**\n   * Navigate to a new URL\n   */\n  async navigate(href: string, options: FarmNavigateOptions = {}): Promise<void> {\n    const {\n      replace = false,\n      scroll = true,\n      state,\n      viewTransition = false,\n      refresh = false,\n    } = options;\n\n    // Relative targets resolve against the current document, not the origin.\n    const url = resolveFarmNavigationURL(href, window.location.href);\n    const pathname = url.pathname;\n    const search = url.search;\n    const fullPath = pathname + search;\n\n    if (\n      isFarmExternalNavigationURL(url, window.location.origin) ||\n      isFarmLocaleChangeHref(url.toString()) ||\n      this.options.shouldUseDocumentNavigation(pathname)\n    ) {\n      this.cancelActiveNavigation();\n      if (replace) window.location.replace(url.toString());\n      else window.location.assign(url.toString());\n      return;\n    }\n\n    // Same page navigation - update fragment history without fetching route data.\n    if (!refresh && pathname === window.location.pathname && search === window.location.search) {\n      this.cancelActiveNavigation();\n      if (url.hash === window.location.hash) return;\n\n      this.writePageState(\n        replace ? \"replace\" : \"push\",\n        state === undefined ? readPageState() : state,\n        url.toString(),\n      );\n      if (scroll) {\n        if (url.hash) {\n          getHashTargetElement(url.hash)?.scrollIntoView();\n        } else {\n          window.scrollTo(0, 0);\n        }\n      }\n      return;\n    }\n\n    const from = window.location.pathname + window.location.search;\n    if (\n      await this.shouldBlockNavigation({\n        from,\n        to: fullPath,\n        action: replace ? \"replace\" : \"push\",\n      })\n    ) {\n      return;\n    }\n\n    // Save current scroll position\n    if (this.options.scrollRestoration) {\n      this.saveScrollPosition(window.location.pathname + window.location.search);\n    }\n\n    const navigation = this.startNavigation({\n      from,\n      to: createNavigationLocation(url),\n      action: replace ? \"replace\" : \"push\",\n    });\n\n    let clientNavigation: FarmClientNavigationSession | undefined;\n    try {\n      clientNavigation = await this.clientPlugins?.beginNavigation({\n        from,\n        to: url,\n        action: replace ? \"replace\" : \"push\",\n      });\n      if (!this.isCurrentNavigation(navigation, clientNavigation)) return;\n\n      // Fetch page data (from cache or server)\n      const pageData = await this.fetchPageData(\n        fullPath,\n        true,\n        from,\n        refresh,\n        navigation.controller.signal,\n      );\n      if (!this.isCurrentNavigation(navigation, clientNavigation)) return;\n      if (clientNavigation) {\n        await this.clientPlugins?.markNavigationLoaded(clientNavigation, pageData);\n      }\n      if (!this.isCurrentNavigation(navigation, clientNavigation)) return;\n\n      await this.runViewTransition(viewTransition, () =>\n        this.isCurrentNavigation(navigation, clientNavigation)\n          ? this.commitNavigation({\n              fullPath,\n              pageData,\n              pathname,\n              replace,\n              scroll,\n              state,\n              url,\n            })\n          : Promise.resolve(),\n      );\n      if (!this.isCurrentNavigation(navigation, clientNavigation)) return;\n\n      if (clientNavigation) {\n        await this.clientPlugins?.resolveNavigation(clientNavigation);\n        void this.clientPlugins?.scheduleNavigationRendered(clientNavigation);\n      }\n      this.finishNavigation(navigation);\n    } catch (error) {\n      if (!this.isCurrentNavigation(navigation, clientNavigation)) return;\n      if (clientNavigation) {\n        await this.clientPlugins?.failNavigation(clientNavigation, error);\n      }\n      this.finishNavigation(navigation);\n      console.error(\"[Farm.js] Navigation error:\", error);\n      // Fall back to full page navigation\n      window.location.href = href;\n    }\n  }\n\n  /**\n   * Re-render the active route from the server while preserving the document,\n   * shared layouts, client runtime, and browser history entry.\n   */\n  refresh(options: Omit<FarmNavigateOptions, \"replace\" | \"refresh\"> = {}): Promise<void> {\n    return this.navigate(window.location.href, {\n      ...options,\n      replace: true,\n      refresh: true,\n      scroll: options.scroll ?? false,\n    });\n  }\n\n  /**\n   * Prefetch a URL\n   */\n  async prefetch(href: string): Promise<void> {\n    if (isFarmLocaleChangeHref(href)) return;\n    const url = resolveFarmNavigationURL(href, window.location.href);\n    if (isFarmExternalNavigationURL(url, window.location.origin)) return;\n    if (this.options.shouldUseDocumentNavigation(url.pathname)) return;\n    const fullPath = url.pathname + url.search;\n    const interceptFrom = window.location.pathname + window.location.search;\n\n    // Skip if already prefetching or cached\n    if (this.prefetchingUrls.has(fullPath)) return;\n    if (this.isCached(fullPath, interceptFrom)) return;\n\n    this.prefetchingUrls.add(fullPath);\n\n    try {\n      await this.fetchPageData(fullPath, false, interceptFrom);\n    } catch (error) {\n      console.warn(\"[Farm.js] Prefetch failed:\", href, error);\n    } finally {\n      this.prefetchingUrls.delete(fullPath);\n    }\n  }\n\n  /**\n   * Observe an element for viewport intersection (prefetch when visible)\n   */\n  observeForPrefetch(element: HTMLAnchorElement): void {\n    if (typeof IntersectionObserver === \"undefined\") return;\n\n    const href = element.getAttribute(\"href\");\n    if (!href || this.isExternalUrl(href)) return;\n    this.unobserveForPrefetch(element);\n\n    const observer = new IntersectionObserver(\n      (entries) => {\n        for (const entry of entries) {\n          if (entry.isIntersecting) {\n            if (this.observers.get(element) !== observer) continue;\n            // Delay prefetch slightly to avoid prefetching during scroll\n            const timer = setTimeout(() => {\n              if (this.prefetchTimers.get(element) !== timer) return;\n              this.prefetchTimers.delete(element);\n              void this.prefetch(href);\n            }, this.options.prefetchTimeout);\n            this.prefetchTimers.set(element, timer);\n\n            // Stop observing after first intersection\n            observer.unobserve(element);\n            this.observers.delete(element);\n          }\n        }\n      },\n      { rootMargin: \"200px\" }, // Start prefetching when 200px from viewport\n    );\n\n    observer.observe(element);\n    this.observers.set(element, observer);\n  }\n\n  /**\n   * Stop observing an element\n   */\n  unobserveForPrefetch(element: HTMLAnchorElement): void {\n    const observer = this.observers.get(element);\n    if (observer) {\n      observer.unobserve(element);\n      this.observers.delete(element);\n    }\n    const timer = this.prefetchTimers.get(element);\n    if (timer !== undefined) {\n      clearTimeout(timer);\n      this.prefetchTimers.delete(element);\n    }\n  }\n\n  addBlocker(blocker: FarmNavigationBlocker, shouldBlockUnload?: () => boolean): () => void {\n    this.blockers.add(blocker);\n    this.unloadBlockers.set(\n      blocker,\n      shouldBlockUnload ?? (() => this.evaluateBlockerForUnload(blocker)),\n    );\n    return () => {\n      this.blockers.delete(blocker);\n      this.unloadBlockers.delete(blocker);\n    };\n  }\n\n  getNavigationState(): FarmNavigationState {\n    return this.navigationState;\n  }\n\n  subscribeNavigation(listener: FarmNavigationListener): () => void {\n    this.navigationListeners.add(listener);\n    listener(this.navigationState);\n    return () => {\n      this.navigationListeners.delete(listener);\n    };\n  }\n\n  registerScrollElement(key: string, element: HTMLElement): () => void {\n    this.scrollElements.set(key, element);\n    this.restoreScrollElement(window.location.pathname + window.location.search, key, element);\n    return () => {\n      if (this.scrollElements.get(key) === element) {\n        this.scrollElements.delete(key);\n      }\n    };\n  }\n\n  pushState(state: unknown, href?: string): void {\n    this.writePageState(\"push\", state, href);\n  }\n\n  replaceState(state: unknown, href?: string): void {\n    this.writePageState(\"replace\", state, href);\n  }\n\n  /** @internal Keep shallow URL-search writes inside the router's history bookkeeping. */\n  writeURLSearch(action: \"push\" | \"replace\", href: string): void {\n    this.writePageState(action, readPageState(), href, false);\n  }\n\n  private async commitNavigation(options: {\n    fullPath: string;\n    pageData: PageData;\n    pathname: string;\n    replace: boolean;\n    scroll: boolean;\n    state: unknown;\n    url: URL;\n  }): Promise<void> {\n    const historyUrl = resolveFarmNavigationURL(\n      options.pageData.canonicalPath || options.fullPath,\n      window.location.href,\n    );\n    historyUrl.hash = options.url.hash;\n    const historyPath = historyUrl.pathname + historyUrl.search + historyUrl.hash;\n    const historyState = createHistoryState(\n      historyPath,\n      options.state,\n      options.replace ? window.history.state : undefined,\n      options.pageData.interception?.from ?? null,\n    ) as Record<string, unknown>;\n    const nextHistoryIndex =\n      this.currentHistoryIndex == null\n        ? null\n        : options.replace\n          ? this.currentHistoryIndex\n          : this.currentHistoryIndex + 1;\n    if (nextHistoryIndex != null) {\n      historyState[FARM_HISTORY_INDEX_KEY] = nextHistoryIndex;\n    }\n    if (options.replace) {\n      window.history.replaceState(historyState, \"\", historyPath);\n    } else {\n      window.history.pushState(historyState, \"\", historyPath);\n    }\n    this.currentHistoryIndex = nextHistoryIndex;\n    const resolvedHistoryUrl = resolveFarmNavigationURL(historyPath, window.location.href);\n    this.currentHistoryPath = resolvedHistoryUrl.pathname + resolvedHistoryUrl.search;\n    notifyRouterHistoryChange();\n\n    this.updateDocumentMetadata(options.pageData.metadata);\n\n    _hydrateFarmI18n(options.pageData.i18n);\n\n    if (this.onNavigate) {\n      await this.onNavigate(options.pageData);\n    }\n\n    if (options.scroll) {\n      if (options.url.hash) {\n        const element = getHashTargetElement(options.url.hash);\n        if (element) {\n          element.scrollIntoView();\n        }\n      } else {\n        window.scrollTo(0, 0);\n      }\n    } else if (this.options.scrollRestoration) {\n      const restorePath = this.currentHistoryPath ?? options.fullPath;\n      this.restoreWindowScroll(restorePath);\n      this.restoreScrollElements(restorePath);\n    }\n  }\n\n  private async runViewTransition(\n    mode: FarmViewTransitionMode,\n    callback: () => Promise<void>,\n  ): Promise<void> {\n    if (!mode || typeof document === \"undefined\") {\n      await callback();\n      return;\n    }\n\n    const startViewTransition = (document as any).startViewTransition;\n    if (typeof startViewTransition !== \"function\") {\n      await callback();\n      return;\n    }\n\n    const transition = startViewTransition.call(document, () => callback());\n    const updateDone = transition?.updateCallbackDone || transition?.ready;\n    if (updateDone && typeof updateDone.then === \"function\") {\n      await updateDone;\n    }\n    transition?.finished?.catch?.(() => undefined);\n  }\n\n  /**\n   * Fetch page data from cache or server\n   */\n  private async fetchPageData(\n    path: string,\n    recover = true,\n    interceptFrom?: string,\n    fresh = false,\n    signal?: AbortSignal,\n  ): Promise<PageData> {\n    const cacheKey = getPageDataCacheKey(path, interceptFrom);\n    // Check cache first\n    const cached = fresh ? undefined : this.cache.get(cacheKey);\n    if (cached && Date.now() - cached.timestamp < this.options.cacheMaxAge) {\n      return cached.data;\n    }\n\n    // Fetch from server. The active layout chain lets the server omit shared\n    // shell HTML from the fragment without inspecting component source.\n    const activeLayoutChain = getActiveLayoutChainHeader();\n    const response = await fetch(`/__farm/page-data?path=${encodeURIComponent(path)}`, {\n      signal,\n      headers: createFarmDeploymentRequestHeaders(this.options.deploymentId, {\n        Accept: \"application/x-farm-deferred+json, application/json\",\n        \"X-Farm-SPA\": \"1\",\n        ...(activeLayoutChain ? { \"X-Farm-Layout-Chain\": activeLayoutChain } : {}),\n        ...(interceptFrom ? { \"X-Farm-Intercept-From\": interceptFrom } : {}),\n      }),\n    });\n\n    if (isFarmDeploymentMismatchResponse(response, this.options.deploymentId)) {\n      const error = createFarmDeploymentMismatchError(\n        response,\n        this.options.deploymentId || \"unknown\",\n      );\n      dispatchDeploymentMismatch(error);\n      if (recover) {\n        window.location.assign(path);\n      }\n      throw error;\n    }\n\n    if (!response.ok) {\n      throw new Error(`Failed to fetch page data: ${response.status}`);\n    }\n\n    const data = await readDeferredDataResponse<PageData>(response);\n\n    // Cache the result. Expiry was previously only consulted on read, so a\n    // long-lived tab that navigates or prefetches many distinct routes grew\n    // this map without bound; sweeping on write bounds it to entries touched\n    // within the cacheMaxAge window.\n    const now = Date.now();\n    for (const [key, entry] of this.cache) {\n      if (now - entry.timestamp >= this.options.cacheMaxAge) this.cache.delete(key);\n    }\n    this.cache.set(cacheKey, {\n      data,\n      timestamp: now,\n    });\n\n    return data;\n  }\n\n  /**\n   * Put the browser URL back on the rendered page after a blocked pop. When\n   * both entries carry a Farm history index the traversal is reversed\n   * exactly; otherwise the current path is pushed again, which restores the\n   * address bar at the cost of one extra history entry.\n   */\n  private revertBlockedPopState(event: PopStateEvent, from: string): void {\n    const eventIndex = readHistoryIndex(event.state);\n    if (eventIndex != null && this.currentHistoryIndex != null) {\n      const delta = eventIndex - this.currentHistoryIndex;\n      if (delta !== 0) {\n        this.suppressNextPopState = true;\n        window.history.go(-delta);\n        return;\n      }\n    }\n\n    try {\n      const restoredState: Record<string, unknown> = {\n        path: from,\n      };\n      if (this.currentHistoryIndex != null && eventIndex != null) {\n        restoredState[FARM_HISTORY_INDEX_KEY] = eventIndex + 1;\n        this.currentHistoryIndex = eventIndex + 1;\n      }\n      window.history.pushState(restoredState, \"\", from);\n    } catch {\n      // Leave the URL as-is if the history API rejects the write; the\n      // rendered page is still the blocked-from page.\n    }\n  }\n\n  /**\n   * Handle browser back/forward navigation\n   */\n  private async handlePopState(event: PopStateEvent): Promise<void> {\n    if (document.documentElement.dataset.farmDocsRuntime === \"true\") return;\n\n    if (this.suppressNextPopState) {\n      // This traversal is our own revert of a blocked pop; the rendered page\n      // never changed.\n      this.suppressNextPopState = false;\n      return;\n    }\n\n    const path = window.location.pathname + window.location.search;\n    // The browser has already moved to the destination entry, so its state\n    // describes `to`; the page still rendered is the tracked current path.\n    const from = this.currentHistoryPath ?? path;\n\n    if (\n      await this.shouldBlockNavigation({\n        from,\n        to: path,\n        action: \"pop\",\n      })\n    ) {\n      this.revertBlockedPopState(event, from);\n      return;\n    }\n\n    this.currentHistoryPath = path;\n    this.currentHistoryIndex = readHistoryIndex(event.state);\n\n    const navigation = this.startNavigation({\n      from,\n      to: createNavigationLocation(new URL(window.location.href)),\n      action: \"pop\",\n    });\n\n    let clientNavigation: FarmClientNavigationSession | undefined;\n    try {\n      clientNavigation = await this.clientPlugins?.beginNavigation({\n        from: null,\n        to: window.location.href,\n        action: \"pop\",\n      });\n      if (!this.isCurrentNavigation(navigation, clientNavigation)) return;\n      const interceptFrom =\n        typeof event.state?.[FARM_INTERCEPT_FROM_KEY] === \"string\"\n          ? event.state[FARM_INTERCEPT_FROM_KEY]\n          : undefined;\n      const pageData = await this.fetchPageData(\n        path,\n        true,\n        interceptFrom,\n        false,\n        navigation.controller.signal,\n      );\n      if (!this.isCurrentNavigation(navigation, clientNavigation)) return;\n      if (clientNavigation) {\n        await this.clientPlugins?.markNavigationLoaded(clientNavigation, pageData);\n      }\n      if (!this.isCurrentNavigation(navigation, clientNavigation)) return;\n\n      this.updateDocumentMetadata(pageData.metadata);\n\n      _hydrateFarmI18n(pageData.i18n);\n\n      // Call the navigation handler to update React\n      if (this.onNavigate) {\n        await this.onNavigate(pageData);\n      }\n\n      // A fragment in the destination URL is an explicit scroll target for the\n      // window and takes precedence over the saved *window* scroll position,\n      // matching forward navigation and native browser back/forward. Element\n      // scroll positions are keyed without the hash (see\n      // getScrollElementStorageKey), so registered scroll containers are\n      // restored regardless of whether a fragment is present, even when the\n      // anchor resolves, so a persistent-layout scroll element is not left at\n      // the prior route's offset on a hash-destination popstate.\n      const destinationPath = window.location.pathname + window.location.search;\n      if (window.location.hash) {\n        const target = getHashTargetElement(window.location.hash);\n        if (target) {\n          target.scrollIntoView();\n        } else if (this.options.scrollRestoration) {\n          this.restoreWindowScroll(destinationPath);\n        }\n      } else if (this.options.scrollRestoration) {\n        this.restoreWindowScroll(destinationPath);\n      }\n      if (this.options.scrollRestoration) {\n        this.restoreScrollElements(destinationPath);\n      }\n\n      if (clientNavigation) {\n        await this.clientPlugins?.resolveNavigation(clientNavigation);\n        void this.clientPlugins?.scheduleNavigationRendered(clientNavigation);\n      }\n      this.finishNavigation(navigation);\n    } catch (error) {\n      if (!this.isCurrentNavigation(navigation, clientNavigation)) return;\n      if (clientNavigation) {\n        await this.clientPlugins?.failNavigation(clientNavigation, error);\n      }\n      this.finishNavigation(navigation);\n      console.error(\"[Farm.js] Popstate navigation error:\", error);\n      // Reload the page as fallback\n      window.location.reload();\n    }\n  }\n\n  /**\n   * Check if URL is cached\n   */\n  private isCached(path: string, interceptFrom?: string): boolean {\n    const cached = this.cache.get(getPageDataCacheKey(path, interceptFrom));\n    return cached !== undefined && Date.now() - cached.timestamp < this.options.cacheMaxAge;\n  }\n\n  /**\n   * Check if URL is external\n   */\n  private isExternalUrl(href: string): boolean {\n    return href.startsWith(\"http://\") || href.startsWith(\"https://\") || href.startsWith(\"//\");\n  }\n\n  private async shouldBlockNavigation(context: FarmNavigationBlockerContext): Promise<boolean> {\n    for (const blocker of this.blockers) {\n      if (await blocker(context)) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  private evaluateBlockerForUnload(blocker: FarmNavigationBlocker): boolean {\n    const path = window.location.pathname + window.location.search;\n    const result = blocker({ from: path, to: path, action: \"replace\" });\n    if (result && typeof result !== \"boolean\") {\n      void result.catch(() => undefined);\n      return true;\n    }\n    return result === true;\n  }\n\n  private shouldBlockUnload(): boolean {\n    for (const blocker of this.blockers) {\n      try {\n        if (this.unloadBlockers.get(blocker)?.()) return true;\n      } catch {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  private updateDocumentMetadata(metadata: PageData[\"metadata\"]): void {\n    // Both call sites run after the history entry is committed, so the current\n    // pathname is the navigated-to page and drives the default canonical.\n    applyFarmMetadataToDocument(metadata, window.location.pathname);\n  }\n\n  private startNavigation(options: {\n    from: string;\n    to: FarmNavigationLocation;\n    action: FarmNavigationBlockerContext[\"action\"];\n  }): { id: number; controller: AbortController } {\n    this.activeNavigation?.controller.abort(\"superseded\");\n    const navigation = {\n      id: ++this.navigationSequence,\n      controller: new AbortController(),\n    };\n    this.activeNavigation = navigation;\n    this.setNavigationState({\n      state: \"loading\",\n      pending: true,\n      from: options.from,\n      to: options.to,\n      action: options.action,\n      startedAt: Date.now(),\n    });\n    return navigation;\n  }\n\n  private isCurrentNavigation(\n    navigation: { id: number; controller: AbortController },\n    clientNavigation?: FarmClientNavigationSession,\n  ): boolean {\n    return (\n      this.activeNavigation?.id === navigation.id &&\n      !navigation.controller.signal.aborted &&\n      !clientNavigation?.signal.aborted\n    );\n  }\n\n  private finishNavigation(navigation: { id: number; controller: AbortController }): void {\n    if (this.activeNavigation?.id !== navigation.id) return;\n    this.activeNavigation = undefined;\n    this.setNavigationState(IDLE_NAVIGATION_STATE);\n  }\n\n  private cancelActiveNavigation(): void {\n    if (!this.activeNavigation) return;\n    this.activeNavigation.controller.abort(\"superseded\");\n    this.activeNavigation = undefined;\n    this.setNavigationState(IDLE_NAVIGATION_STATE);\n  }\n\n  private setNavigationState(state: FarmNavigationState): void {\n    this.navigationState = state;\n    for (const listener of this.navigationListeners) {\n      listener(state);\n    }\n  }\n\n  private writePageState(\n    action: \"push\" | \"replace\",\n    state: unknown,\n    href?: string,\n    notify = true,\n  ): void {\n    if (typeof window === \"undefined\") return;\n\n    const url = href\n      ? resolveFarmNavigationURL(href, window.location.href).toString()\n      : window.location.href;\n    const parsedUrl = new URL(url);\n    const nextPath = parsedUrl.pathname + parsedUrl.search;\n    const historyPath = nextPath + parsedUrl.hash;\n    const nextState = createHistoryState(historyPath, state, window.history.state) as Record<\n      string,\n      unknown\n    >;\n\n    if (action === \"replace\") {\n      window.history.replaceState(nextState, \"\", url);\n    } else {\n      if (this.currentHistoryIndex != null) {\n        nextState[FARM_HISTORY_INDEX_KEY] = this.currentHistoryIndex + 1;\n      }\n      window.history.pushState(nextState, \"\", url);\n      this.currentHistoryIndex =\n        this.currentHistoryIndex == null ? null : this.currentHistoryIndex + 1;\n    }\n    this.currentHistoryPath = nextPath;\n\n    if (notify) notifyHistoryChange(\"page-state\");\n  }\n\n  /**\n   * Save scroll position for a path\n   */\n  private saveScrollPosition(path: string): void {\n    try {\n      sessionStorage.setItem(\n        `farm-scroll-${path}`,\n        JSON.stringify({ x: window.scrollX, y: window.scrollY }),\n      );\n      for (const [key, element] of this.scrollElements) {\n        sessionStorage.setItem(\n          getScrollElementStorageKey(path, key),\n          JSON.stringify({ x: element.scrollLeft, y: element.scrollTop }),\n        );\n      }\n    } catch {\n      // Ignore storage errors\n    }\n  }\n\n  /**\n   * Restore the saved window scroll position for a path.\n   */\n  private restoreWindowScroll(path: string): void {\n    try {\n      const saved = sessionStorage.getItem(`farm-scroll-${path}`);\n      if (saved) {\n        const { x, y } = JSON.parse(saved);\n        setTimeout(() => window.scrollTo(x, y), 0);\n      }\n    } catch {\n      // Ignore storage errors\n    }\n  }\n\n  /**\n   * Restore saved scroll positions for every registered scroll element. Keys\n   * are hash-stripped (see getScrollElementStorageKey), so this runs regardless\n   * of whether the destination URL carries a fragment.\n   */\n  private restoreScrollElements(path: string): void {\n    try {\n      for (const [key, element] of this.scrollElements) {\n        this.restoreScrollElement(path, key, element);\n      }\n    } catch {\n      // Ignore storage errors\n    }\n  }\n\n  private restoreScrollElement(path: string, key: string, element: HTMLElement): void {\n    try {\n      const saved = sessionStorage.getItem(getScrollElementStorageKey(path, key));\n      if (!saved) return;\n      const { x, y } = JSON.parse(saved);\n      setTimeout(() => {\n        element.scrollLeft = x;\n        element.scrollTop = y;\n      }, 0);\n    } catch {\n      // Ignore storage errors\n    }\n  }\n\n  /**\n   * Clear the page cache\n   */\n  clearCache(): void {\n    this.cache.clear();\n  }\n}\n\nfunction readBrowserDeploymentId(): string | undefined {\n  if (typeof window === \"undefined\") return undefined;\n\n  const runtimeId = (window as Window & { __FARM_DEPLOYMENT_ID__?: unknown })\n    .__FARM_DEPLOYMENT_ID__;\n  if (typeof runtimeId === \"string\" && runtimeId) return runtimeId;\n\n  return document.querySelector<HTMLMetaElement>('meta[name=\"farm-deployment-id\"]')?.content;\n}\n\nfunction dispatchDeploymentMismatch(error: Error): void {\n  if (typeof window === \"undefined\" || typeof CustomEvent === \"undefined\") return;\n  window.dispatchEvent(new CustomEvent(\"farm:deployment-mismatch\", { detail: error }));\n}\n\n/**\n * Get or create the global router instance\n */\nexport function getInstalledFarmSPARouter(): SPARouter | undefined {\n  if (typeof window === \"undefined\") return undefined;\n  return (window as Window & { __FARM_SPA_ROUTER__?: SPARouter }).__FARM_SPA_ROUTER__;\n}\n\nexport function getRouter(): SPARouter {\n  if (typeof window === \"undefined\") {\n    // Return a no-op router for SSR\n    return new SPARouter();\n  }\n\n  const installedRouter = getInstalledFarmSPARouter();\n  if (installedRouter) {\n    routerInstance = installedRouter;\n    return installedRouter;\n  }\n\n  if (!routerInstance) {\n    routerInstance = new SPARouter();\n  }\n\n  return routerInstance;\n}\n\n/**\n * Navigate to a URL using the SPA router\n */\nexport function navigateTo(href: string, options?: FarmNavigateOptions): Promise<void> {\n  return getRouter().navigate(href, options);\n}\n\n/**\n * Prefetch a URL\n */\nexport function prefetch(href: string): Promise<void> {\n  return getRouter().prefetch(href);\n}\n\nexport function pushState(state: unknown, href?: string): void {\n  getRouter().pushState(state, href);\n}\n\nexport function replaceState(state: unknown, href?: string): void {\n  getRouter().replaceState(state, href);\n}\n\nexport function readPageState<TState = unknown>(): TState | null {\n  if (typeof window === \"undefined\") return null;\n  const state = window.history.state;\n  if (!state || typeof state !== \"object\") return null;\n  return ((state as Record<string, unknown>)[FARM_PAGE_STATE_KEY] as TState | undefined) ?? null;\n}\n\nfunction createHistoryState(\n  path: string,\n  pageState: unknown,\n  currentState?: unknown,\n  interceptFrom?: string | null,\n) {\n  const base =\n    currentState && typeof currentState === \"object\" ? { ...(currentState as object) } : {};\n  const nextState: Record<string, unknown> = {\n    ...base,\n    path,\n    [FARM_PAGE_STATE_KEY]: pageState,\n  };\n  if (interceptFrom === null) {\n    delete nextState[FARM_INTERCEPT_FROM_KEY];\n  } else if (interceptFrom) {\n    nextState[FARM_INTERCEPT_FROM_KEY] = interceptFrom;\n  }\n  return nextState;\n}\n\nfunction getPageDataCacheKey(path: string, interceptFrom?: string): string {\n  return interceptFrom ? `${path}\\nintercept:${interceptFrom}` : path;\n}\n\nfunction createNavigationLocation(url: URL): FarmNavigationLocation {\n  return {\n    href: url.href,\n    pathname: url.pathname,\n    search: url.search,\n    hash: url.hash,\n  };\n}\n\nfunction getScrollElementStorageKey(path: string, key: string): string {\n  return `farm-scroll-${path}:${key}`;\n}\n","import { getInstalledFarmSPARouter, type SPARouter } from \"./spa-router\";\n\n/** Fired after programmatic history writes that must not start a navigation. */\nexport const FARM_HISTORY_CHANGE_EVENT = \"farm:historychange\";\n\nexport type FarmHistoryChangeKind = \"url-search\" | \"page-state\";\n\nexport interface FarmHistoryChangeDetail {\n  kind: FarmHistoryChangeKind;\n}\n\n/** Write shallow URL history through the installed SPA router when available. */\nexport function writeFarmURLSearchHistory(action: \"push\" | \"replace\", href: string): boolean {\n  const router = getInstalledFarmSPARouter();\n  if (!router) return false;\n  const writeURLSearch = (router as { writeURLSearch?: SPARouter[\"writeURLSearch\"] })\n    .writeURLSearch;\n  if (typeof writeURLSearch !== \"function\") return false;\n  if (window.history.state !== null && typeof window.history.state !== \"object\") return false;\n  writeURLSearch.call(router, action, href);\n  return true;\n}\n\nfunction dispatchHistoryChange(kind: FarmHistoryChangeKind): void {\n  window.dispatchEvent(\n    new CustomEvent<FarmHistoryChangeDetail>(FARM_HISTORY_CHANGE_EVENT, {\n      detail: { kind },\n    }),\n  );\n}\n\n/**\n * Notify history observers after pushState/replaceState.\n *\n * Farm's SPA router treats `popstate` as real back/forward navigation, so a\n * dedicated event is used instead. `url-search` keeps the nuqs-style synthetic\n * `popstate` when no Farm router is installed, so standalone `useQueryState`\n * consumers still resync; `page-state` is Farm-internal and never falls back.\n */\nexport function notifyHistoryChange(kind: FarmHistoryChangeKind): void {\n  if (typeof window === \"undefined\") return;\n\n  setTimeout(() => {\n    if (kind === \"url-search\" && !getInstalledFarmSPARouter()) {\n      window.dispatchEvent(new PopStateEvent(\"popstate\"));\n      return;\n    }\n\n    dispatchHistoryChange(kind);\n  }, 0);\n}\n\n/** Notify observers after a Farm router commit without simulating traversal. */\nexport function notifyRouterHistoryChange(): void {\n  if (typeof window === \"undefined\") return;\n  setTimeout(() => dispatchHistoryChange(\"url-search\"), 0);\n}\n\nexport function subscribeHistoryChange(listener: () => void): () => void {\n  if (typeof window === \"undefined\") return () => {};\n\n  window.addEventListener(\"popstate\", listener);\n  window.addEventListener(FARM_HISTORY_CHANGE_EVENT, listener);\n\n  return () => {\n    window.removeEventListener(\"popstate\", listener);\n    window.removeEventListener(FARM_HISTORY_CHANGE_EVENT, listener);\n  };\n}\n"],"mappings":"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","names":[]}