{"version":3,"sources":["../../src/query/client.ts","../../src/query/sync.ts"],"sourcesContent":["/**\n * Farm.js Client-Side Query State Management\n *\n * Type-safe URL search parameter state management - Like useState, but stored in the URL query string.\n * Client-only hooks for managing query parameters in the browser.\n * Inspired by nuqs implementation patterns.\n */\n\nimport { useState, useEffect, useCallback, useRef } from \"react\";\nimport {\n  notifyHistoryChange,\n  subscribeHistoryChange,\n  writeFarmURLSearchHistory,\n} from \"../client/history-sync\";\nimport { _resolveCurrentRequest } from \"../server/request-bridge\";\nimport { emitter, type KeyUpdate } from \"./sync\";\nexport { parseRouteParams, loadRouteParams, type RouteParamsInput } from \"./params\";\n\nimport { asString as asStringClient, asInteger as asIntegerClient, type Parser } from \"./parsers\";\n\nexport {\n  asString,\n  asInteger,\n  asFloat,\n  asBoolean,\n  asArrayOf,\n  asJson,\n  asIsoDate,\n  asIsoDateTime,\n  createParser,\n  type ArrayParserOptions,\n  type Parser,\n  type inferParserType,\n} from \"./parsers\";\n\nexport type UrlUpdateType = \"push\" | \"replace\";\nexport type HistoryMethod = \"pushState\" | \"replaceState\";\n\nexport interface Options {\n  history?: HistoryMethod;\n  shallow?: boolean;\n  scroll?: boolean;\n  throttleMs?: number;\n}\n\nconst getCurrentSearchParams = (): URLSearchParams => {\n  if (typeof window !== \"undefined\") {\n    discardDepartedURLUpdates();\n    let params = new URLSearchParams(window.location.search);\n    // Draft values belong to the existing throttle queue, not to a parser's\n    // identity. Inline parsers and newly mounted consumers see the same draft.\n    for (const pending of throttleTimers.values()) {\n      if (pending.href === window.location.href) params = applyChange(params, pending.updates);\n    }\n    return params;\n  }\n\n  // Server rendering used to see an empty query string here, so a hook read one\n  // value on the server and another in the browser. React reports that as a\n  // hydration mismatch and discards the server rendered markup for the branch.\n  const request = _resolveCurrentRequest();\n  if (!request) return new URLSearchParams();\n  try {\n    return new URL(request.url).searchParams;\n  } catch {\n    return new URLSearchParams();\n  }\n};\n\nconst readSearchParam = (searchParams: URLSearchParams, key: string): string => {\n  const values = searchParams.getAll(key);\n  return values.length > 1 ? values.join(\",\") : (values[0] ?? \"\");\n};\n\nconst throttleTimers = new Map<\n  string,\n  {\n    timer: ReturnType<typeof setTimeout>;\n    updates: Record<string, string | null>;\n    href: string;\n  }\n>();\n\nfunction discardDepartedURLUpdates(): void {\n  for (const [key, pending] of throttleTimers) {\n    if (pending.href === window.location.href) continue;\n    clearTimeout(pending.timer);\n    throttleTimers.delete(key);\n  }\n}\n\nfunction getUpdateKey(updates: Record<string, unknown>): string {\n  return JSON.stringify(Object.keys(updates).sort());\n}\n\nfunction supersedeQueuedKeys(updates: Record<string, string | null>): void {\n  const keys = Object.keys(updates);\n  for (const [queueKey, pending] of throttleTimers) {\n    for (const key of keys) delete pending.updates[key];\n    if (Object.keys(pending.updates).length > 0) continue;\n    clearTimeout(pending.timer);\n    throttleTimers.delete(queueKey);\n  }\n}\n\nconst compareStructuredValues = (\n  current: unknown,\n  next: unknown,\n  seen = new WeakMap<object, object>(),\n): boolean | undefined => {\n  if (Object.is(current, next)) return true;\n  if (current === null || next === null || typeof current !== typeof next) return false;\n  if (typeof current !== \"object\" || typeof next !== \"object\") return false;\n  if (current instanceof Date || next instanceof Date) {\n    return current instanceof Date && next instanceof Date && current.getTime() === next.getTime();\n  }\n  if (Array.isArray(current) || Array.isArray(next)) {\n    if (!Array.isArray(current) || !Array.isArray(next) || current.length !== next.length) {\n      return false;\n    }\n    const knownNext = seen.get(current);\n    if (knownNext) return knownNext === next;\n    seen.set(current, next);\n    for (let index = 0; index < current.length; index++) {\n      const equal = compareStructuredValues(current[index], next[index], seen);\n      if (equal !== true) return equal;\n    }\n    return true;\n  }\n\n  const currentPrototype = Object.getPrototypeOf(current);\n  const nextPrototype = Object.getPrototypeOf(next);\n  if (currentPrototype !== nextPrototype) return false;\n  if (currentPrototype !== Object.prototype && currentPrototype !== null) return undefined;\n\n  const knownNext = seen.get(current);\n  if (knownNext) return knownNext === next;\n  seen.set(current, next);\n\n  const currentKeys = Object.keys(current);\n  const nextKeys = Object.keys(next);\n  if (\n    currentKeys.length !== nextKeys.length ||\n    currentKeys.some((key) => !Object.prototype.hasOwnProperty.call(next, key))\n  ) {\n    return false;\n  }\n  for (const key of currentKeys) {\n    const equal = compareStructuredValues(\n      (current as Record<string, unknown>)[key],\n      (next as Record<string, unknown>)[key],\n      seen,\n    );\n    if (equal !== true) return equal;\n  }\n  return true;\n};\n\nconst areParsedValuesEqual = <T>(parser: Parser<T>, current: T | null, next: T | null) => {\n  if (Object.is(current, next)) return true;\n  const structuredResult = compareStructuredValues(current, next);\n  if (structuredResult === false) return false;\n  if (current === null || next === null) return false;\n\n  try {\n    return parser.serialize(current) === parser.serialize(next);\n  } catch {\n    return structuredResult === true;\n  }\n};\n\nconst applyChange = (\n  searchParams: URLSearchParams,\n  updates: Record<string, string | null>,\n  keepExisting = true,\n): URLSearchParams => {\n  const newParams = keepExisting ? new URLSearchParams(searchParams) : new URLSearchParams();\n\n  Object.entries(updates).forEach(([key, value]) => {\n    if (value === null || value === undefined || value === \"\") {\n      newParams.delete(key);\n    } else {\n      newParams.set(key, value);\n    }\n  });\n\n  return newParams;\n};\n\nconst commitURLUpdate = (\n  updates: Record<string, string | null>,\n  options: Options,\n  emitUpdate: boolean,\n) => {\n  const { history = \"pushState\", shallow = true, scroll = false } = options;\n  const url = new URL(window.location.href);\n  const newSearchParams = applyChange(url.searchParams, updates);\n  const newSearch = newSearchParams.toString();\n  const newUrl = url.pathname + (newSearch ? `?${newSearch}` : \"\") + url.hash;\n  const currentUrl = url.pathname + url.search + url.hash;\n\n  if (newUrl === currentUrl) return;\n\n  const historyAction = history === \"replaceState\" ? \"replace\" : \"push\";\n  if (!writeFarmURLSearchHistory(historyAction, newUrl)) {\n    const historyState = window.history.state;\n    const nextHistoryState =\n      historyState && typeof historyState === \"object\" && \"path\" in historyState\n        ? { ...historyState, path: newUrl }\n        : historyState;\n    window.history[history](nextHistoryState, \"\", newUrl);\n  }\n\n  if (emitUpdate) {\n    // Composing one queued key must not discard drafts for other keys. Only\n    // carry drafts forward across this write, never across unrelated navigation.\n    for (const pending of throttleTimers.values()) {\n      if (pending.href === url.href) pending.href = window.location.href;\n    }\n    emitter.emitUpdate(getCurrentSearchParams());\n  }\n\n  if (shallow) notifyHistoryChange(\"url-search\");\n\n  if (scroll) {\n    window.scrollTo(0, 0);\n  }\n};\n\nconst updateURL = (\n  updates: Record<string, string | null>,\n  options: Options = {},\n  emitUpdate = true,\n): (() => boolean) | undefined => {\n  if (typeof window === \"undefined\") return;\n\n  discardDepartedURLUpdates();\n\n  const { throttleMs } = options;\n  // Latest intent owns each key, including immediate writes and URL no-ops.\n  // Keep unrelated keys in an older batch scheduled with their original owner.\n  supersedeQueuedKeys(updates);\n  if (!throttleMs || throttleMs <= 0) {\n    commitURLUpdate(updates, options, emitUpdate);\n    return;\n  }\n\n  const throttleKey = getUpdateKey(updates);\n\n  const currentUrl = new URL(window.location.href);\n  const nextSearch = applyChange(currentUrl.searchParams, updates).toString();\n  if (nextSearch === currentUrl.searchParams.toString()) return;\n\n  const timeout = setTimeout(() => {\n    const pending = throttleTimers.get(throttleKey);\n    if (pending?.timer !== timeout) return;\n    throttleTimers.delete(throttleKey);\n    if (pending.href !== window.location.href) return;\n    commitURLUpdate(updates, options, emitUpdate);\n  }, throttleMs);\n\n  throttleTimers.set(throttleKey, { timer: timeout, updates, href: currentUrl.href });\n  return () => {\n    if (throttleTimers.get(throttleKey)?.timer !== timeout) return false;\n    clearTimeout(timeout);\n    throttleTimers.delete(throttleKey);\n    return true;\n  };\n};\n\nexport function useQueryState<TParser extends Parser<any>>(\n  key: string,\n  parser: TParser,\n  options?: Options,\n): [\n  NonNullable<ReturnType<TParser[\"parse\"]>> | null,\n  (value: NonNullable<ReturnType<TParser[\"parse\"]>> | null) => void,\n];\nexport function useQueryState<T>(\n  key: string,\n  parser: Parser<T>,\n  options?: Options,\n): [T | null, (value: T | null) => void];\nexport function useQueryState<TParser extends Parser<any>>(\n  key: string,\n  parser: TParser,\n  options?: Options,\n): [\n  NonNullable<ReturnType<TParser[\"parse\"]>> | null,\n  (value: NonNullable<ReturnType<TParser[\"parse\"]>> | null) => void,\n] {\n  type T = NonNullable<ReturnType<TParser[\"parse\"]>>;\n  const [state, setState] = useState<T | null>(() => {\n    const searchParams = getCurrentSearchParams();\n    const parsed = parser.parse(readSearchParam(searchParams, key));\n    return parsed;\n  });\n\n  const stateRef = useRef(state);\n  const stateKeyRef = useRef(key);\n  const cancelPendingUpdateRef = useRef<(() => boolean) | undefined>(undefined);\n  stateRef.current = state;\n\n  const setValue = useCallback(\n    (value: T | null) => {\n      setState(value);\n      stateRef.current = value;\n\n      const serialized = value === null ? null : parser.serialize(value);\n\n      emitter.emitKey(key, { state: value, query: serialized, source: stateRef });\n\n      cancelPendingUpdateRef.current?.();\n      cancelPendingUpdateRef.current = updateURL({ [key]: serialized }, options, true);\n    },\n    [key, parser, options],\n  );\n\n  useEffect(() => {\n    if (typeof window === \"undefined\") return;\n\n    const onPopState = () => {\n      const searchParams = getCurrentSearchParams();\n      const parsed = parser.parse(readSearchParam(searchParams, key));\n      const sourceChanged = stateKeyRef.current !== key;\n      stateKeyRef.current = key;\n      if (sourceChanged || !areParsedValuesEqual(parser, stateRef.current, parsed)) {\n        setState(parsed);\n        stateRef.current = parsed;\n      }\n    };\n\n    const onEmitterUpdate = (searchParams: URLSearchParams) => {\n      const parsed = parser.parse(readSearchParam(searchParams, key));\n      if (!areParsedValuesEqual(parser, stateRef.current, parsed)) {\n        setState(parsed);\n        stateRef.current = parsed;\n      }\n    };\n\n    const onKeyUpdate = (payload: KeyUpdate) => {\n      // Skip only this hook's synchronous echo, never a peer's newer edit.\n      // The ref identity is stable across renders and is not serialized.\n      if (payload.source === stateRef) {\n        return;\n      }\n\n      // Consumers may use different parsers for the same URL key.\n      const parsed = parser.parse(payload.query ?? \"\");\n      if (!areParsedValuesEqual(parser, stateRef.current, parsed)) {\n        setState(parsed);\n        stateRef.current = parsed;\n      }\n    };\n\n    // Page-state writes with an href can change the query string without a\n    // popstate, so listen through the shared history channel (real\n    // back/forward events included). Self-updates no-op via the Object.is\n    // comparison above.\n    onPopState();\n    const unsubscribeHistory = subscribeHistoryChange(onPopState);\n    emitter.on(\"update\", onEmitterUpdate);\n    emitter.onKey(key, onKeyUpdate);\n\n    return () => {\n      unsubscribeHistory();\n      emitter.off(\"update\", onEmitterUpdate);\n      emitter.offKey(key, onKeyUpdate);\n    };\n  }, [key, parser]);\n\n  useEffect(\n    () => () => {\n      const canceledPendingWrite = cancelPendingUpdateRef.current?.() ?? false;\n      cancelPendingUpdateRef.current = undefined;\n      // A throttled write is discarded on unmount, but its value was already\n      // broadcast to peers via emitKey. Peers that adopted the optimistic draft\n      // get no other reconciliation signal (unmount fires no history event), so\n      // tell them to re-read the URL, which no longer carries this draft.\n      if (canceledPendingWrite && typeof window !== \"undefined\") {\n        emitter.emitUpdate(getCurrentSearchParams());\n      }\n    },\n    [key],\n  );\n\n  return [state, setValue];\n}\n\nexport function useQueryStates<T extends Record<string, Parser<any>>>(\n  parsers: T,\n  options: Options = {},\n): [\n  { [K in keyof T]: ReturnType<T[K][\"parse\"]> },\n  (updates: Partial<{ [K in keyof T]: ReturnType<T[K][\"parse\"]> | null }>) => void,\n] {\n  const keys = Object.keys(parsers);\n  const watchKeys = JSON.stringify(keys);\n\n  const [state, setState] = useState<{ [K in keyof T]: ReturnType<T[K][\"parse\"]> }>(() => {\n    const searchParams = getCurrentSearchParams();\n    const result = {} as { [K in keyof T]: ReturnType<T[K][\"parse\"]> };\n\n    Object.entries(parsers).forEach(([key, parser]) => {\n      result[key as keyof T] = parser.parse(readSearchParam(searchParams, key));\n    });\n\n    return result;\n  });\n\n  const stateRef = useRef(state);\n  const pendingUpdatesRef = useRef(new Map<string, () => boolean>());\n  stateRef.current = state;\n\n  const setValues = useCallback(\n    (updates: Partial<{ [K in keyof T]: ReturnType<T[K][\"parse\"]> | null }>) => {\n      const newState = { ...stateRef.current, ...updates };\n      setState(newState);\n      stateRef.current = newState;\n\n      Object.entries(updates).forEach(([key, value]) => {\n        const parser = parsers[key];\n        if (parser) {\n          const serialized = value === null ? null : parser.serialize(value);\n          emitter.emitKey(key, { state: value, query: serialized, source: stateRef });\n        }\n      });\n\n      const urlUpdates: Record<string, string | null> = {};\n      Object.entries(updates).forEach(([key, value]) => {\n        const parser = parsers[key];\n        if (parser) {\n          const serialized = value === null ? null : parser.serialize(value);\n          urlUpdates[key] = serialized;\n        }\n      });\n\n      const updateKey = getUpdateKey(urlUpdates);\n      pendingUpdatesRef.current.get(updateKey)?.();\n      const cancelPendingUpdate = updateURL(urlUpdates, options, true);\n      if (cancelPendingUpdate) {\n        pendingUpdatesRef.current.set(updateKey, cancelPendingUpdate);\n      } else {\n        pendingUpdatesRef.current.delete(updateKey);\n      }\n    },\n    [parsers, options],\n  );\n\n  useEffect(() => {\n    if (typeof window === \"undefined\") return;\n\n    const applyChange = (searchParams: URLSearchParams) => {\n      const result = {} as { [K in keyof T]: ReturnType<T[K][\"parse\"]> };\n      const currentKeys = Object.keys(stateRef.current);\n      let hasChanged =\n        currentKeys.length !== keys.length ||\n        currentKeys.some((key) => !Object.prototype.hasOwnProperty.call(parsers, key));\n\n      Object.entries(parsers).forEach(([key, parser]) => {\n        const parsed = parser.parse(readSearchParam(searchParams, key));\n        const currentValue = stateRef.current[key as keyof T];\n\n        if (!areParsedValuesEqual(parser, currentValue, parsed)) {\n          hasChanged = true;\n        }\n        result[key as keyof T] = parsed;\n      });\n\n      if (hasChanged) {\n        setState(result);\n        stateRef.current = result;\n      }\n    };\n\n    const onPopState = () => {\n      const searchParams = getCurrentSearchParams();\n      applyChange(searchParams);\n    };\n\n    const onEmitterUpdate = (searchParams: URLSearchParams) => {\n      applyChange(searchParams);\n    };\n\n    applyChange(getCurrentSearchParams());\n    const unsubscribeHistory = subscribeHistoryChange(onPopState);\n    emitter.on(\"update\", onEmitterUpdate);\n    const unsubscribeKeys = Object.entries(parsers).map(([key, parser]) => {\n      const onKeyUpdate = (payload: KeyUpdate) => {\n        if (payload.source === stateRef) return;\n        const parsed = parser.parse(payload.query ?? \"\");\n        if (areParsedValuesEqual(parser, stateRef.current[key as keyof T], parsed)) return;\n\n        // Update only this key, preserving local drafts for the other fields.\n        const next = { ...stateRef.current, [key]: parsed };\n        stateRef.current = next;\n        setState(next);\n      };\n      emitter.onKey(key, onKeyUpdate);\n      return () => emitter.offKey(key, onKeyUpdate);\n    });\n\n    return () => {\n      unsubscribeHistory();\n      emitter.off(\"update\", onEmitterUpdate);\n      for (const unsubscribe of unsubscribeKeys) unsubscribe();\n    };\n  }, [watchKeys, parsers]);\n\n  useEffect(\n    () => () => {\n      let canceledPendingWrite = false;\n      for (const cancelPendingUpdate of pendingUpdatesRef.current.values()) {\n        if (cancelPendingUpdate()) canceledPendingWrite = true;\n      }\n      pendingUpdatesRef.current.clear();\n      // Discarded throttled writes were already broadcast to peers via emitKey;\n      // reconcile any peer that adopted a now-cancelled draft (see useQueryState).\n      if (canceledPendingWrite && typeof window !== \"undefined\") {\n        emitter.emitUpdate(getCurrentSearchParams());\n      }\n    },\n    [watchKeys],\n  );\n\n  return [state, setValues];\n}\n\nexport function usePagination(options?: {\n  defaultPage?: number;\n  defaultLimit?: number;\n  pageKey?: string;\n  limitKey?: string;\n}) {\n  const {\n    defaultPage = 1,\n    defaultLimit = 10,\n    pageKey = \"page\",\n    limitKey = \"limit\",\n  } = options || {};\n\n  const [page, setPage] = useQueryState(pageKey, asIntegerClient.withDefault!(defaultPage));\n  const [limit, setLimit] = useQueryState(limitKey, asIntegerClient.withDefault!(defaultLimit));\n\n  const currentPage = page ?? defaultPage;\n  const currentLimit = limit ?? defaultLimit;\n  const offset = ((currentPage as number) - 1) * (currentLimit as number);\n\n  return {\n    page: currentPage,\n    setPage,\n    limit: currentLimit,\n    setLimit,\n    offset,\n    resetPagination: () => {\n      setPage(defaultPage);\n      setLimit(defaultLimit);\n    },\n  };\n}\n\nexport function useSearchFilters<T extends Record<string, any>>(options?: {\n  searchKey?: string;\n  defaultFilters?: T;\n  filterKeys?: (keyof T)[];\n}) {\n  const {\n    searchKey = \"search\",\n    defaultFilters = {} as T,\n    filterKeys = Object.keys(defaultFilters) as (keyof T)[],\n  } = options || {};\n\n  const [search, setSearch] = useQueryState(searchKey, asStringClient);\n\n  const filterParsers = filterKeys.reduce(\n    (acc, key) => {\n      acc[key as string] = asStringClient;\n      return acc;\n    },\n    {} as Record<string, Parser<string>>,\n  );\n\n  const [filters, setFilters] = useQueryStates(filterParsers);\n\n  const clearFilters = () => {\n    setSearch(null);\n    const clearedFilters = filterKeys.reduce(\n      (acc, key) => {\n        acc[key as string] = null;\n        return acc;\n      },\n      {} as Record<string, null>,\n    );\n    setFilters(clearedFilters);\n  };\n\n  return {\n    search,\n    setSearch,\n    filters: filters as T,\n    setFilters,\n    clearFilters,\n  };\n}\n","/**\n * Cross-hook synchronization system for query state\n * Inspired by nuqs implementation\n */\n\ntype Listener = (searchParams: URLSearchParams) => void;\nexport type KeyUpdate = { state: any; query: string | null; source?: object };\ntype KeyListener = (payload: KeyUpdate) => void;\n\nclass Emitter {\n  private listeners: Map<string, Set<Listener>> = new Map();\n  private keyListeners: Map<string, Set<KeyListener>> = new Map();\n\n  /**\n   * Emit a global update event (all hooks should sync)\n   */\n  emitUpdate(searchParams: URLSearchParams): void {\n    const listeners = this.listeners.get(\"update\") || new Set();\n    listeners.forEach((listener) => listener(searchParams));\n  }\n\n  /**\n   * Emit a key-specific update (for cross-hook sync)\n   */\n  emitKey(key: string, payload: KeyUpdate): void {\n    const listeners = this.keyListeners.get(key) || new Set();\n    listeners.forEach((listener) => listener(payload));\n  }\n\n  /**\n   * Subscribe to global updates\n   */\n  on(event: \"update\", listener: Listener): void {\n    if (!this.listeners.has(event)) {\n      this.listeners.set(event, new Set());\n    }\n    this.listeners.get(event)!.add(listener);\n  }\n\n  /**\n   * Subscribe to key-specific updates\n   */\n  onKey(key: string, listener: KeyListener): void {\n    if (!this.keyListeners.has(key)) {\n      this.keyListeners.set(key, new Set());\n    }\n    this.keyListeners.get(key)!.add(listener);\n  }\n\n  /**\n   * Unsubscribe from global updates\n   */\n  off(event: \"update\", listener: Listener): void {\n    const listeners = this.listeners.get(event);\n    if (listeners) {\n      listeners.delete(listener);\n    }\n  }\n\n  /**\n   * Unsubscribe from key-specific updates\n   */\n  offKey(key: string, listener: KeyListener): void {\n    const listeners = this.keyListeners.get(key);\n    if (listeners) {\n      listeners.delete(listener);\n    }\n  }\n}\n\nexport const emitter = new Emitter();\n"],"mappings":"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","names":["knownNext","applyChange"]}