{"version":3,"file":"mutationCache.mjs","sources":["../../../src/vanilla/mutationCache.ts"],"sourcesContent":["import { Mutation } from './mutation'\nimport {\n  Action,\n  MutationInfo,\n  MutationInfoOptions,\n  MutationStatus,\n  createMutationInfo,\n} from './mutationInfo'\nimport { QueryClient } from './queryClient'\nimport { DeepPartial, NotifyEvent } from './typeUtils'\nimport { UNDEFINED, getFullKey, hashKey, partialMatchKey } from './utils'\n\nexport interface MutationCache extends ReturnType<typeof createMutationCache> {}\n\nexport interface MutationCacheConfig {\n  onSuccess?: (\n    data: unknown,\n    variables: unknown,\n    mutationInfo: MutationInfo\n  ) => Promise<unknown> | unknown\n  onError?: (\n    error: unknown,\n    variables: unknown,\n    mutationInfo: MutationInfo\n  ) => Promise<unknown> | unknown\n  onSettled?: (\n    data: unknown,\n    error: unknown | null,\n    variables: unknown,\n    mutationInfo: MutationInfo\n  ) => Promise<unknown> | unknown\n}\n\ninterface NotifyEventMutationAdded<TData, TVars, TError> extends NotifyEvent {\n  type: 'added'\n  mutationInfo: MutationInfo<TData, TVars, TError>\n}\ninterface NotifyEventMutationRemoved<TData, TVars, TError> extends NotifyEvent {\n  type: 'removed'\n  mutationInfo: MutationInfo<TData, TVars, TError>\n}\n\ninterface NotifyEventMutationUpdated<TData, TVars, TError> extends NotifyEvent {\n  type: 'updated'\n  mutationInfo: MutationInfo<TData, TVars, TError>\n  action: Action<TData, TVars, TError>\n}\n\nexport type MutationCacheNotifyEvent<TData, TVars, TError> =\n  | NotifyEventMutationAdded<TData, TVars, TError>\n  | NotifyEventMutationRemoved<TData, TVars, TError>\n  | NotifyEventMutationUpdated<TData, TVars, TError>\n\nexport type MutationCacheListener<TData, TVars, TError> = (\n  event: MutationCacheNotifyEvent<TData, TVars, TError>\n) => void\n\nexport const createMutationCache = (config: MutationCacheConfig = {}) => {\n  let mutations: MutationInfo<any, any, any>[] = []\n  let lastUpdated = 0\n\n  const listeners = new Set<MutationCacheListener<any, any, any>>()\n\n  function subscribe<TData = unknown, TVars = unknown, TError = Error>(\n    filters: MutationInfoFilters<TData, TVars, TError>,\n    listener: MutationCacheListener<TData, TVars, TError>\n  ): () => void\n  function subscribe<TData = unknown, TVars = unknown, TError = Error>(\n    listener: MutationCacheListener<TData, TVars, TError>\n  ): () => void\n  function subscribe(...args: any) {\n    const [filters, listener] = args.length === 2 ? args : [UNDEFINED, args[0]]\n\n    const wrappedListener = (\n      event: MutationCacheNotifyEvent<any, any, any>\n    ) => {\n      if (!filters || matchMutationInfo(filters, event.mutationInfo)) {\n        listener(event)\n      }\n    }\n\n    listeners.add(wrappedListener)\n\n    return () => {\n      listeners.delete(wrappedListener)\n    }\n  }\n\n  const notify = <TData, TVars, TError>(\n    event: MutationCacheNotifyEvent<TData, TVars, TError>\n  ) => {\n    lastUpdated = Date.now()\n    listeners.forEach(listener => listener(event))\n  }\n\n  const build = <TData = unknown, TVars = unknown, TError = Error>(\n    client: QueryClient,\n    options: MutationInfoOptions<TData, TVars, TError>\n  ): MutationInfo<TData, TVars, TError> => {\n    const mutationInfo = createMutationInfo({\n      cache,\n      options: client.defaultMutationOptions(options),\n    })\n\n    mutations.push(mutationInfo)\n\n    notify({\n      type: 'added',\n      mutationInfo,\n    })\n\n    return mutationInfo\n  }\n\n  const remove = (mutationInfo: MutationInfo<any, any, any>): void => {\n    mutations = mutations.filter(x => x !== mutationInfo)\n    notify({\n      type: 'removed',\n      mutationInfo,\n    })\n  }\n\n  const clear = (): void => {\n    mutations.forEach(mutationInfo => {\n      notify({\n        type: 'removed',\n        mutationInfo,\n      })\n    })\n    mutations = []\n  }\n\n  const getAll = (): MutationInfo[] => {\n    return mutations\n  }\n\n  const find = <TData = unknown, TVars = unknown, TError = Error>(\n    filters: MutationInfoFilters<TData, TVars, TError>\n  ): MutationInfo<TData, TVars, TError> | undefined => {\n    return mutations.find(mutationInfo =>\n      matchMutationInfo(filters, mutationInfo)\n    ) as MutationInfo<TData, TVars, TError> | undefined\n  }\n\n  const findAll = <TData = unknown, TVars = unknown, TError = Error>(\n    filters: MutationInfoFilters<TData, TVars, TError> = {}\n  ): MutationInfo<TData, TVars, TError>[] => {\n    return mutations.filter(mutation =>\n      matchMutationInfo(filters, mutation)\n    ) as unknown as MutationInfo<TData, TVars, TError>[]\n  }\n\n  const cache = {\n    build,\n    remove,\n    clear,\n    getAll,\n    find,\n    findAll,\n    subscribe,\n    notify,\n    config,\n    get lastUpdated() {\n      return lastUpdated\n    },\n  }\n\n  return cache\n}\n\nexport interface MutationInfoFilters<\n  TData = unknown,\n  TVars = unknown,\n  TError = Error\n> {\n  /**\n   * Include mutations matching this predicate function\n   */\n  predicate?: (mutationInfo: MutationInfo<TData, TVars, TError>) => boolean\n  /**\n   * Include mutations matching this mutation key\n   */\n  mutation?: Mutation<TData, TVars, TError>\n  /**\n   * Filter by mutation status\n   */\n  status?: MutationStatus\n  /**\n   * Filter by mutation variables\n   */\n  variables?: DeepPartial<TVars>\n  /**\n   * Match mutation key exactly\n   */\n  exact?: boolean\n}\n\nconst matchMutationInfo = (\n  filters: MutationInfoFilters<any, any, any>,\n  mutationInfo: MutationInfo<any, any, any>\n): boolean => {\n  const { status, variables, predicate, mutation, exact } = filters\n\n  if (mutation) {\n    if (exact) {\n      if (\n        hashKey(getFullKey(mutation.key, variables)) !==\n        hashKey(\n          getFullKey(mutationInfo.mutation.key, mutationInfo.state.variables)\n        )\n      ) {\n        return false\n      }\n    } else if (\n      !partialMatchKey(\n        getFullKey(mutationInfo.mutation.key, mutationInfo.state.variables),\n        getFullKey(mutation.key, variables)\n      )\n    ) {\n      return false\n    }\n  }\n\n  if (status && mutationInfo.state.status !== status) {\n    return false\n  }\n\n  if (predicate && !predicate(mutationInfo)) {\n    return false\n  }\n\n  return true\n}\n"],"names":["createMutationCache","config","mutations","lastUpdated","listeners","Set","subscribe","args","filters","listener","length","UNDEFINED","wrappedListener","event","matchMutationInfo","mutationInfo","add","delete","notify","Date","now","forEach","build","client","options","createMutationInfo","cache","defaultMutationOptions","push","type","remove","filter","x","clear","getAll","find","findAll","mutation","status","variables","predicate","exact","hashKey","getFullKey","key","state","partialMatchKey"],"mappings":"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"}