{"version":3,"file":"mutationInfo.mjs","sources":["../../../src/vanilla/mutationInfo.ts"],"sourcesContent":["import { createGcManager } from './gcManager'\nimport { Mutation } from './mutation'\nimport { MutationCache } from './mutationCache'\nimport {\n  NetworkMode,\n  RetryDelayValue,\n  RetryValue,\n  Retryer,\n  createRetryer,\n} from './retryer'\nimport { createSubscribable } from './subscribable'\nimport { QueryMeta } from './typeUtils'\nimport { UNDEFINED } from './utils'\n\nexport type MutationFunctionContext = {\n  meta: QueryMeta | undefined\n}\n\nexport interface MutationInfoConfig<\n  TData = unknown,\n  TVars = unknown,\n  TError = Error\n> {\n  options: MutationInfoOptions<TData, TVars, TError>\n  cache: MutationCache\n}\n\nexport type MutationStatus = 'idle' | 'mutating' | 'success' | 'error'\n\nexport interface MutationInfoState<\n  TData = unknown,\n  TVars = unknown,\n  TError = Error\n> {\n  data?: TData\n  error: TError | null\n  status: MutationStatus\n  variables?: TVars\n}\n\nexport interface MutationInfoOptions<\n  TData = unknown,\n  TVars = unknown,\n  TError = Error\n> {\n  mutation: Mutation<TData, TVars, TError>\n  onSuccess?: (\n    data: TData,\n    variables: TVars,\n    mutationInfo: MutationInfo<TData, TVars, TError>\n  ) => Promise<unknown> | unknown\n  onError?: (\n    error: unknown,\n    variables: TVars,\n    mutationInfo: MutationInfo<TData, TVars, TError>\n  ) => Promise<unknown> | unknown\n  onSettled?: (\n    data: TData | undefined,\n    error: unknown | null,\n    variables: TVars,\n    mutationInfo: MutationInfo<TData, TVars, TError>\n  ) => Promise<unknown> | unknown\n  retry?: RetryValue<TError>\n  retryDelay?: RetryDelayValue<TError>\n  networkMode?: NetworkMode\n  gcTime?: number\n  _defaulted?: boolean\n  meta?: QueryMeta\n}\n\ninterface MutatingAction<TVars> {\n  type: 'mutating'\n  variables?: TVars\n}\n\ninterface SuccessAction<TData> {\n  type: 'success'\n  data: TData\n}\n\ninterface ErrorAction<TError> {\n  type: 'error'\n  error: TError\n}\n\nexport type Action<TData, TVars, TError> =\n  | ErrorAction<TError>\n  | MutatingAction<TVars>\n  | SuccessAction<TData>\n\nexport interface MutationInfo<TData = unknown, TVars = unknown, TError = Error>\n  extends ReturnType<typeof createMutationInfo<TData, TVars, TError>> {}\n\ntype MutationInfoListener<TData, TVars, TError> = (\n  state: MutationInfoState<TData, TVars, TError>\n) => void\n\nexport function createMutationInfo<\n  TData = unknown,\n  TVars = unknown,\n  TError = Error\n>(config: MutationInfoConfig<TData, TVars, TError>) {\n  const { cache } = config\n\n  let state = getDefaultState<TData, TVars, TError>()\n\n  const [updateGcTime, scheduleGc, clearGcTimeout] = createGcManager(\n    function onRemove() {\n      if (!hasListeners()) {\n        if (state.status === 'mutating') {\n          scheduleGc()\n        } else {\n          cache.remove(mutationInfo)\n        }\n      }\n    }\n  )\n\n  const [listeners, subscribe, hasListeners] = createSubscribable<\n    MutationInfoListener<TData, TVars, TError>\n  >(\n    function onSubscribe() {\n      // Stop the mutation from being garbage collected\n      clearGcTimeout()\n    },\n    function onUnsubscribe() {\n      scheduleGc()\n    }\n  )\n\n  let options = {} as Mutation<TData, TVars, TError> & {\n    mutation?: Mutation<TData, TVars, TError>\n  }\n  const setOptions = (\n    newOptions?: MutationInfoOptions<TData, TVars, TError>\n  ) => {\n    options = {\n      ...config.options.mutation,\n      ...newOptions,\n    }\n\n    updateGcTime(options.gcTime)\n  }\n  setOptions(config.options)\n  scheduleGc()\n\n  const dispatch = (action: Action<TData, TVars, TError>): void => {\n    const reducer = (): MutationInfoState<TData, TVars, TError> => {\n      switch (action.type) {\n        case 'mutating':\n          return {\n            ...state,\n            data: UNDEFINED,\n            error: null,\n            status: 'mutating',\n            variables: action.variables,\n          }\n        case 'success':\n          return {\n            ...state,\n            data: action.data,\n            error: null,\n            status: 'success',\n          }\n        case 'error':\n          return {\n            ...state,\n            data: UNDEFINED,\n            error: action.error,\n            status: 'error',\n          }\n      }\n    }\n    state = reducer()\n\n    listeners.forEach(l => l(state))\n\n    cache.notify({\n      mutationInfo,\n      type: 'updated',\n      action,\n    })\n  }\n\n  let retryer: Retryer | undefined\n\n  const trigger = async (variables: TVars): Promise<TData> => {\n    const executeMutation = () => {\n      retryer = createRetryer({\n        fn: () => {\n          if (process.env.NODE_ENV !== 'production') {\n            if (!options.fetcher) {\n              return Promise.reject(new Error('No fetcher found'))\n            }\n          }\n\n          const mutationFunctionContext: MutationFunctionContext = {\n            meta: options.meta,\n          }\n\n          return options.fetcher(variables, mutationFunctionContext)\n        },\n        retry: options.retry ?? 0,\n        retryDelay: options.retryDelay,\n        networkMode: options.networkMode,\n      })\n\n      return retryer.promise\n    }\n\n    const restored = state.status === 'mutating'\n\n    try {\n      if (!restored) {\n        dispatch({ type: 'mutating', variables })\n      }\n      const data = (await executeMutation()) as TData\n\n      await cache.config.onSuccess?.(data, variables, mutationInfo as any)\n      await options.onSuccess?.(data, variables, mutationInfo)\n      await cache.config.onSettled?.(data, null, variables, mutationInfo as any)\n      await options.onSettled?.(data, null, variables, mutationInfo)\n\n      dispatch({ type: 'success', data })\n      return data\n    } catch (error) {\n      try {\n        await cache.config.onError?.(error, variables, mutationInfo as any)\n        await options.onError?.(error, variables, mutationInfo)\n        await cache.config.onSettled?.(\n          UNDEFINED,\n          error,\n          variables,\n          mutationInfo as any\n        )\n        await options.onSettled?.(UNDEFINED, error, variables, mutationInfo)\n\n        throw error\n      } finally {\n        dispatch({ type: 'error', error: error as TError })\n      }\n    }\n  }\n\n  const mutationInfo = {\n    subscribe,\n    trigger,\n    setOptions,\n    get state() {\n      return state\n    },\n    get meta() {\n      return options.meta\n    },\n    get mutation() {\n      return options.mutation!\n    },\n  }\n\n  return mutationInfo\n}\n\nexport const getDefaultState = <TData, TVars, TError>(): MutationInfoState<\n  TData,\n  TVars,\n  TError\n> => {\n  return {\n    data: UNDEFINED,\n    error: null,\n    status: 'idle',\n    variables: UNDEFINED,\n  }\n}\n"],"names":["createMutationInfo","config","cache","state","getDefaultState","updateGcTime","scheduleGc","clearGcTimeout","createGcManager","onRemove","hasListeners","status","remove","mutationInfo","listeners","subscribe","createSubscribable","onSubscribe","onUnsubscribe","options","setOptions","newOptions","mutation","gcTime","dispatch","action","reducer","type","data","UNDEFINED","error","variables","forEach","l","notify","retryer","trigger","executeMutation","_options$retry","createRetryer","fn","process","env","NODE_ENV","fetcher","Promise","reject","Error","mutationFunctionContext","meta","retry","retryDelay","networkMode","promise","restored","onSuccess","onSettled","onError"],"mappings":"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"}