{"version":3,"file":"queryCache.mjs","sources":["../../../src/vanilla/queryCache.ts"],"sourcesContent":["import { PrimitiveQuery } from './primitiveQuery'\nimport { QueryClient } from './queryClient'\nimport {\n  Action,\n  FetchStatus,\n  QueryInfo,\n  QueryInfoOptions,\n  QueryInfoState,\n  createQueryInfo,\n} from './queryInfo'\nimport type { DeepPartial, NotifyEvent, WithRequired } from './typeUtils'\nimport {\n  UNDEFINED,\n  getFullKey,\n  hashKeyByOptions,\n  isBoolean,\n  isUndefined,\n  partialMatchKey,\n} from './utils'\n\nexport interface QueryCache extends ReturnType<typeof createQueryCache> {}\n\ninterface NotifyEventQueryAdded<TFetcherData, TVars, TError, TQueryData>\n  extends NotifyEvent {\n  type: 'added'\n  queryInfo: QueryInfo<TFetcherData, TVars, TError, TQueryData>\n}\n\ninterface NotifyEventQueryRemoved<TFetcherData, TVars, TError, TQueryData>\n  extends NotifyEvent {\n  type: 'removed'\n  queryInfo: QueryInfo<TFetcherData, TVars, TError, TQueryData>\n}\n\nexport interface NotifyEventQueryUpdated<\n  TFetcherData,\n  TVars,\n  TError,\n  TQueryData\n> extends NotifyEvent {\n  type: 'updated'\n  queryInfo: QueryInfo<TFetcherData, TVars, TError, TQueryData>\n  action: Action<TQueryData, TError>\n}\n\nexport type QueryCacheNotifyEvent<TFetcherData, TVars, TError, TQueryData> =\n  | NotifyEventQueryAdded<TFetcherData, TVars, TError, TQueryData>\n  | NotifyEventQueryRemoved<TFetcherData, TVars, TError, TQueryData>\n  | NotifyEventQueryUpdated<TFetcherData, TVars, TError, TQueryData>\n\nexport interface QueryStore {\n  has: (queryKey: string) => boolean\n  set: (queryKey: string, queryInfo: QueryInfo<any, any, any>) => void\n  get: (queryKey: string) => QueryInfo<any, any, any> | undefined\n  delete: (queryKey: string) => void\n  values: () => IterableIterator<QueryInfo<any, any, any>>\n}\n\ntype QueryCacheListeners<TFetcherData, TVars, TError, TQueryData> = (\n  event: QueryCacheNotifyEvent<TFetcherData, TVars, TError, TQueryData>\n) => void\n\nexport const createQueryCache = (\n  config: {\n    onError?: (error: Error, queryInfo: QueryInfo) => void\n    onSuccess?: (data: unknown, query: QueryInfo) => void\n    onSettled?: (data: unknown, error: Error, query: QueryInfo) => void\n    createStore?: () => QueryStore\n  } = {}\n) => {\n  let lastUpdated = 0\n\n  const queries: QueryStore = config?.createStore?.() ?? new Map()\n\n  const listeners = new Set<QueryCacheListeners<any, any, any, any>>()\n\n  function subscribe<\n    TFetcherData = unknown,\n    TVars = unknown,\n    TError = Error,\n    TQueryData = TFetcherData\n  >(\n    filters: QueryInfoFilters<TFetcherData, TVars, TError, TQueryData>,\n    listener: QueryCacheListeners<TFetcherData, TVars, TError, TQueryData>\n  ): () => void\n  function subscribe<\n    TFetcherData = unknown,\n    TVars = unknown,\n    TError = Error,\n    TQueryData = TFetcherData\n  >(\n    listener: QueryCacheListeners<TFetcherData, TVars, TError, TQueryData>\n  ): () => void\n  function subscribe(...args: any) {\n    const [filters, listener] = args.length === 2 ? args : [UNDEFINED, args[0]]\n\n    const wrappedListener = (\n      event: QueryCacheNotifyEvent<any, any, any, any>\n    ) => {\n      if (!filters || matchQueryInfo(filters, event.queryInfo)) {\n        listener(event)\n      }\n    }\n\n    listeners.add(wrappedListener)\n\n    return () => {\n      listeners.delete(wrappedListener)\n    }\n  }\n\n  const getAll = (): QueryInfo<any, any, any, any>[] => {\n    return Array.from(queries.values())\n  }\n\n  const find = <TFetcherData, TVars, TError = Error, TQueryData = TFetcherData>(\n    filters: WithRequired<\n      QueryInfoFilters<TFetcherData, TVars, TError, TQueryData>,\n      'query'\n    >\n  ): QueryInfo<TFetcherData, TVars, TError, TQueryData> | undefined => {\n    const defaultedFilters = { exact: true, ...filters }\n    return getAll().find(queryInfo =>\n      matchQueryInfo(defaultedFilters, queryInfo)\n    )\n  }\n\n  const findAll = <\n    TFetcherData = unknown,\n    TVars = unknown,\n    TError = Error,\n    TQueryData = TFetcherData\n  >(\n    filters: QueryInfoFilters<TFetcherData, TVars, TError, TQueryData> = {}\n  ): QueryInfo<TFetcherData, TVars, TError, TQueryData>[] => {\n    return Object.keys(filters).length\n      ? getAll().filter(queryInfo => matchQueryInfo(filters, queryInfo))\n      : getAll()\n  }\n\n  const notify = <\n    TFetcherData = unknown,\n    TVars = unknown,\n    TError = Error,\n    TQueryData = TFetcherData\n  >(\n    event: QueryCacheNotifyEvent<TFetcherData, TVars, TError, TQueryData>\n  ) => {\n    lastUpdated = Date.now()\n    listeners.forEach(listener => listener(event))\n  }\n\n  const remove = (queryInfo: QueryInfo<any, any, any, any>) => {\n    const queryInfoInMap = queries.get(queryInfo.queryHash)\n\n    if (queryInfoInMap) {\n      queryInfoInMap.destroy()\n\n      if (queryInfoInMap === queryInfo) {\n        queries.delete(queryInfo.queryHash)\n      }\n\n      notify({ type: 'removed', queryInfo })\n    }\n  }\n\n  const build = <\n    TFetcherData = unknown,\n    TVars = unknown,\n    TError = Error,\n    TQueryData = TFetcherData\n  >(\n    client: QueryClient,\n    options: QueryInfoOptions<TFetcherData, TVars, TError, TQueryData>,\n    state?: QueryInfoState<TQueryData, TError>\n  ): QueryInfo<TFetcherData, TVars, TError, TQueryData> => {\n    const queryHash =\n      options.queryHash ??\n      hashKeyByOptions(\n        getFullKey(options.query.key, options.variables),\n        options\n      )\n    let queryInfo = get<TFetcherData, TVars, TError, TQueryData>(queryHash)\n\n    if (!queryInfo) {\n      queryInfo = createQueryInfo({\n        query: options.query,\n        variables: options.variables!,\n        options: client.defaultQueryOptions(options),\n        cache: queryCache,\n        queryHash,\n        state,\n      })\n      queries.set(queryHash, queryInfo)\n\n      notify({\n        type: 'added',\n        queryInfo,\n      })\n    }\n\n    return queryInfo\n  }\n\n  const get = <\n    TFetcherData = unknown,\n    TVars = unknown,\n    TError = Error,\n    TQueryData = TFetcherData\n  >(\n    queryHash: string\n  ): QueryInfo<TFetcherData, TVars, TError, TQueryData> | undefined => {\n    return queries.get(queryHash)\n  }\n\n  const onFocus = (): void => {\n    getAll().forEach(queryInfo => queryInfo.onFocus())\n  }\n\n  const onOnline = (): void => {\n    getAll().forEach(queryInfo => queryInfo.onOnline())\n  }\n\n  const clear = (): void => {\n    getAll().forEach(query => remove(query))\n  }\n\n  const queryCache = {\n    build,\n    getAll,\n    find,\n    findAll,\n    remove,\n    get,\n    onFocus,\n    onOnline,\n    subscribe,\n    notify,\n    clear,\n    config,\n    get lastUpdated() {\n      return lastUpdated\n    },\n  }\n\n  return queryCache\n}\n\nexport type QueryInfoTypeFilter = 'all' | 'active' | 'inactive'\n\nexport interface QueryInfoFilters<\n  TFetcherData = unknown,\n  TVars = unknown,\n  TError = Error,\n  TQueryData = TFetcherData\n> {\n  /**\n   * Filter to active queries, inactive queries or all queries\n   */\n  type?: QueryInfoTypeFilter\n  /**\n   * Match query key exactly\n   */\n  exact?: boolean\n  /**\n   * Include queries matching this predicate function\n   */\n  predicate?: (\n    queryInfo: QueryInfo<TFetcherData, TVars, TError, TQueryData>\n  ) => boolean\n  query?: PrimitiveQuery<TFetcherData, TVars, TError, TQueryData>\n  variables?: DeepPartial<TVars>\n  fetchStatus?: FetchStatus\n  stale?: boolean\n}\n\nconst matchQueryInfo = (\n  filters: QueryInfoFilters<any, any, any, any>,\n  queryInfo: QueryInfo<any, any, any, any>\n): boolean => {\n  const {\n    type = 'all',\n    exact,\n    predicate,\n    query,\n    variables,\n    stale,\n    fetchStatus,\n  } = filters\n\n  if (query) {\n    if (exact) {\n      if (\n        queryInfo.queryHash !==\n        hashKeyByOptions(getFullKey(query.key, variables), queryInfo.options)\n      ) {\n        return false\n      }\n    } else if (\n      !partialMatchKey(\n        getFullKey(queryInfo.query.key, queryInfo.variables),\n        getFullKey(query.key, variables)\n      )\n    ) {\n      return false\n    }\n  }\n\n  if (type !== 'all') {\n    const isActive = queryInfo.isActive()\n    if (type === 'active' && !isActive) {\n      return false\n    }\n    if (type === 'inactive' && isActive) {\n      return false\n    }\n  }\n\n  if (isBoolean(stale) && queryInfo.isStale() !== stale) {\n    return false\n  }\n\n  if (\n    !isUndefined(fetchStatus) &&\n    fetchStatus !== queryInfo.state.fetchStatus\n  ) {\n    return false\n  }\n\n  if (predicate && !predicate(queryInfo)) {\n    return false\n  }\n\n  return true\n}\n"],"names":["createQueryCache","config","_config$createStore","lastUpdated","queries","createStore","Map","listeners","Set","subscribe","args","filters","listener","length","UNDEFINED","wrappedListener","event","matchQueryInfo","queryInfo","add","delete","getAll","Array","from","values","find","defaultedFilters","exact","findAll","Object","keys","filter","notify","Date","now","forEach","remove","queryInfoInMap","get","queryHash","destroy","type","build","client","options","state","_options$queryHash","hashKeyByOptions","getFullKey","query","key","variables","createQueryInfo","defaultQueryOptions","cache","queryCache","set","onFocus","onOnline","clear","predicate","stale","fetchStatus","partialMatchKey","isActive","isBoolean","isStale","isUndefined"],"mappings":"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"}