{"version":3,"file":"queryInfo.mjs","sources":["../../../src/vanilla/queryInfo.ts"],"sourcesContent":["import { createGcManager } from './gcManager'\nimport { createInfiniteQueryBehavior } from './infiniteQueryBehavior'\nimport { ObservableQuery } from './observableQuery'\nimport { PrimitiveQuery, isInfiniteQuery } from './primitiveQuery'\nimport { QueryCache } from './queryCache'\nimport {\n  CancelOptions,\n  NetworkMode,\n  RetryDelayValue,\n  RetryValue,\n  Retryer,\n  canFetch,\n  createRetryer,\n  isCancelledError,\n} from './retryer'\nimport { createSubscribable } from './subscribable'\nimport {\n  FetchMeta,\n  QueryFunctionContext,\n  QueryMeta,\n  Updater,\n  WithPatrial,\n} from './typeUtils'\nimport {\n  findSet,\n  functionalUpdate,\n  isFunction,\n  isServer,\n  isUndefined,\n  noop,\n  replaceData,\n  timeUntilStale,\n} from './utils'\n\nexport type QueryStatus = 'pending' | 'error' | 'success'\nexport type FetchStatus = 'fetching' | 'paused' | 'idle'\n\nexport type InitialDataFunction<T> = () => T | undefined\n\nexport interface QueryBehavior<\n  TFetcherData = unknown,\n  TVars = unknown,\n  TError = Error,\n  TQueryData = TFetcherData\n> {\n  onFetch: (\n    context: FetchContext<TFetcherData, TVars, TError, TQueryData>\n  ) => void\n}\n\nexport type QueryKeyHashFunction<TVars> = (queryKey: [string, TVars]) => string\n\nexport interface QueryInfoOptions<\n  TFetcherData = unknown,\n  TVars = unknown,\n  TError = Error,\n  TQueryData = TFetcherData\n> {\n  query: PrimitiveQuery<TFetcherData, TVars, TError, TQueryData>\n  variables?: TVars\n  /**\n   * If `false`, failed queries will not retry by default.\n   * If `true`, failed queries will retry infinitely., failureCount: num\n   * If set to an integer number, e.g. 3, failed queries will retry until the failed query count meets that number.\n   * If set to a function `(failureCount, error) => boolean` failed queries will retry until the function returns false.\n   */\n  retry?: RetryValue<TError>\n  retryDelay?: RetryDelayValue<TError>\n  networkMode?: NetworkMode\n  gcTime?: number\n  queryHash?: string\n  queryKeyHashFn?: QueryKeyHashFunction<TVars>\n  initialData?: TQueryData | InitialDataFunction<TQueryData>\n  initialDataUpdatedAt?: number | (() => number | undefined)\n  /**\n   * Set this to `false` to disable structural sharing between query results.\n   * Set this to a function which accepts the old and new data and returns resolved data of the same type to implement custom structural sharing logic.\n   * Defaults to `true`.\n   */\n  structuralSharing?:\n    | boolean\n    | ((oldData: TQueryData | undefined, newData: TQueryData) => TQueryData)\n  _defaulted?: boolean\n  /**\n   * Additional payload to be stored on each query.\n   * Use this property to pass information that can be used in other places.\n   */\n  meta?: QueryMeta\n  /**\n   * Maximum number of pages to store in the data of an infinite query.\n   */\n  maxPages?: number\n  pages?: number\n}\n\nexport interface QueryInfoConfig<\n  TFetcherData = unknown,\n  TVars = unknown,\n  TError = Error,\n  TQueryData = TFetcherData\n> {\n  options: QueryInfoOptions<TFetcherData, TVars, TError, TQueryData>\n  cache: QueryCache\n  state?: QueryInfoState<TQueryData, TError>\n  queryHash: string\n  query: PrimitiveQuery<TFetcherData, TVars, TError, TQueryData>\n  variables: TVars\n}\n\nexport interface FetchContext<\n  TFetcherData = unknown,\n  TVars = unknown,\n  TError = Error,\n  TQueryData = TFetcherData\n> {\n  query: PrimitiveQuery<TFetcherData, TVars, TError, TQueryData>\n  variables: TVars\n  fetchOptions?: FetchOptions\n  options: QueryInfoOptions<TFetcherData, TVars, TError, TQueryData>\n  state: QueryInfoState<TQueryData, TError>\n  fetchFn: () => unknown | Promise<unknown>\n  signal: AbortSignal\n}\n\nexport interface SetDataOptions {\n  updatedAt?: number\n}\n\nexport interface QueryInfoState<TQueryData, TError> {\n  data: TQueryData | undefined\n  dataUpdatedAt: number\n  error: TError | null\n  errorUpdatedAt: number\n  fetchMeta: FetchMeta | null\n  isInvalidated: boolean\n  status: QueryStatus\n  fetchStatus: FetchStatus\n}\n\nexport interface FetchOptions {\n  cancelRefetch?: boolean\n  meta?: FetchMeta\n}\n\ninterface FetchAction {\n  type: 'fetch'\n  meta?: FetchMeta\n}\n\ninterface SuccessAction<TQueryData> {\n  data: TQueryData | undefined\n  type: 'success'\n  dataUpdatedAt?: number\n  manual?: boolean\n}\n\ninterface ErrorAction {\n  type: 'error'\n  error: unknown\n}\n\ninterface InvalidateAction {\n  type: 'invalidate'\n}\n\ninterface PauseAction {\n  type: 'pause'\n}\n\ninterface ContinueAction {\n  type: 'continue'\n}\n\ninterface SetStateAction<TQueryData, TError> {\n  type: 'setState'\n  state: Partial<QueryInfoState<TQueryData, TError>>\n  setStateOptions?: SetStateOptions\n}\n\nexport interface SetStateOptions {\n  meta?: any\n}\n\nexport type Action<TQueryData, TError> =\n  | ContinueAction\n  | ErrorAction\n  | FetchAction\n  | InvalidateAction\n  | PauseAction\n  | SetStateAction<TQueryData, TError>\n  | SuccessAction<TQueryData>\n\nexport interface QueryInfo<\n  TFetcherData = unknown,\n  TVars = unknown,\n  TError = Error,\n  TQueryData = TFetcherData\n> extends ReturnType<\n    typeof createQueryInfo<TFetcherData, TVars, TError, TQueryData>\n  > {}\n\nexport function createQueryInfo<\n  TFetcherData = unknown,\n  TVars = unknown,\n  TError = Error,\n  TQueryData = TFetcherData\n>(config: QueryInfoConfig<TFetcherData, TVars, TError, TQueryData>) {\n  const { cache, queryHash, variables } = config\n\n  const [updateGcTime, scheduleGc, clearGcTimeout] = createGcManager(\n    function onRemove() {\n      if (!hasListeners() && state.fetchStatus === 'idle') {\n        cache.remove(queryInfo)\n      }\n    }\n  )\n\n  let options = {} as QueryInfoOptions<TFetcherData, TVars, TError, TQueryData>\n\n  const setOptions = (\n    newOptions: WithPatrial<\n      QueryInfoOptions<TFetcherData, TVars, TError, TQueryData>,\n      'query'\n    >\n  ) => {\n    options = {\n      ...options.query,\n      ...newOptions,\n    } as QueryInfoOptions<TFetcherData, TVars, TError, TQueryData>\n\n    updateGcTime(options.gcTime)\n  }\n\n  // initialize\n  setOptions(config.options)\n  scheduleGc()\n\n  let state = config.state || getDefaultState(options)\n\n  let revertState: QueryInfoState<TQueryData, TError>\n\n  const setState = (\n    state: Partial<QueryInfoState<TQueryData, TError>>,\n    setStateOptions?: SetStateOptions\n  ): void => {\n    dispatch({ type: 'setState', state, setStateOptions })\n  }\n\n  let abortSignalConsumed = false\n\n  let retryer: Retryer<TQueryData> | undefined\n\n  const [listeners, subscribe, hasListeners] = createSubscribable<\n    ObservableQuery<TFetcherData, TVars, TError, TQueryData, any>\n  >(\n    function onSubscribe() {\n      clearGcTimeout()\n    },\n    function onUnsubscribe() {\n      if (!hasListeners()) {\n        // If the transport layer does not support cancellation\n        // we'll let the query continue so the result can be cached\n        if (retryer) {\n          if (abortSignalConsumed) {\n            retryer.cancel({ revert: true })\n          } else {\n            retryer.cancelRetry()\n          }\n        }\n\n        scheduleGc()\n      }\n    }\n  )\n\n  let promise: Promise<TQueryData> | undefined\n  let isFetchingOptimistic: boolean | undefined\n  const setIsFetchingOptimistic = (value: boolean) => {\n    isFetchingOptimistic = value\n  }\n\n  const fetch = (\n    newOptions?: QueryInfoOptions<TFetcherData, TVars, TError, TQueryData>,\n    fetchOptions?: FetchOptions\n  ): Promise<TQueryData> => {\n    if (state.fetchStatus !== 'idle') {\n      if (state.dataUpdatedAt && fetchOptions?.cancelRefetch) {\n        // Silently cancel current fetch if the user wants to cancel refetches\n        cancel({ silent: true })\n      } else if (promise) {\n        // make sure that retries that were potentially cancelled due to unmounts can continue\n        retryer?.continueRetry()\n        // Return current promise if we are already fetching\n        return promise\n      }\n    }\n\n    // Update config if passed, otherwise the config from the last execution is used\n    if (newOptions) {\n      setOptions(newOptions)\n    }\n\n    const abortController = new AbortController()\n\n    // Create query function context\n    const queryFunctionContext: Omit<QueryFunctionContext, 'signal'> = {\n      meta: options.meta,\n    }\n\n    // Adds an enumerable signal property to the object that\n    // which sets abortSignalConsumed to true when the signal\n    // is read.\n    const addSignalProperty = (object: unknown) => {\n      Object.defineProperty(object, 'signal', {\n        enumerable: true,\n        get: () => {\n          if (abortController) {\n            abortSignalConsumed = true\n            return abortController.signal\n          }\n        },\n      })\n    }\n\n    addSignalProperty(queryFunctionContext)\n\n    // Create fetch function\n    const fetchFn = () => {\n      if (process.env.NODE_ENV !== 'production') {\n        if (isServer && !config.query.key) {\n          return Promise.reject(\n            new Error(\n              `Missing key: If making a request on the server-side, please ensure that the 'key' option has been passed.`\n            )\n          )\n        }\n      }\n\n      if (!options.query.fetcher) {\n        return Promise.reject(new Error(`Missing fetcher: '${queryHash}'`))\n      }\n\n      abortSignalConsumed = false\n      return options.query.fetcher(\n        variables,\n        queryFunctionContext as QueryFunctionContext<any>\n      )\n    }\n\n    // Trigger behavior hook\n    const context: Omit<\n      FetchContext<TFetcherData, TVars, TError, TQueryData>,\n      'signal'\n    > = {\n      query: options.query,\n      variables,\n      fetchOptions,\n      options,\n      state,\n      fetchFn,\n    }\n\n    addSignalProperty(context)\n\n    if (isInfiniteQuery(options.query)) {\n      createInfiniteQueryBehavior(newOptions?.pages).onFetch(\n        context as FetchContext<any, any, any, any>\n      )\n    }\n\n    // Store state in case the current fetch needs to be reverted\n    revertState = state\n\n    // Set to fetching state if not already in it\n    if (\n      state.fetchStatus === 'idle' ||\n      state.fetchMeta !== context.fetchOptions?.meta\n    ) {\n      dispatch({ type: 'fetch', meta: context.fetchOptions?.meta })\n    }\n\n    const onError = (error: TError | { silent?: boolean }) => {\n      // Optimistically update state if needed\n      if (!(isCancelledError(error) && error.silent)) {\n        dispatch({\n          type: 'error',\n          error: error,\n        })\n      }\n\n      if (!isCancelledError(error)) {\n        // Notify cache callback\n        cache.config.onError?.(\n          error as any,\n          queryInfo as QueryInfo<any, any, any>\n        )\n        cache.config.onSettled?.(\n          state.data,\n          error as any,\n          queryInfo as QueryInfo<any, any, any>\n        )\n      }\n\n      if (!isFetchingOptimistic) {\n        // Schedule query gc after fetching\n        scheduleGc()\n      }\n      setIsFetchingOptimistic(false)\n    }\n\n    // Try to fetch the data\n    retryer = createRetryer({\n      fn: context.fetchFn as () => Promise<TQueryData>,\n      abort: abortController?.abort.bind(abortController),\n      onSuccess: data => {\n        if (isUndefined(data)) {\n          if (process.env.NODE_ENV !== 'production') {\n            console.error(\n              `Query data cannot be undefined. Please make sure to return a value other than undefined from your query function. Affected query key: ${queryHash}`\n            )\n          }\n          onError(new Error(`${queryHash} data is undefined`) as any)\n          return\n        }\n\n        setData(data)\n\n        // Notify cache callback\n        cache.config.onSuccess?.(data, queryInfo as QueryInfo<any, any, any>)\n        cache.config.onSettled?.(\n          data,\n          state.error as any,\n          queryInfo as QueryInfo<any, any, any>\n        )\n\n        if (!isFetchingOptimistic) {\n          // Schedule query gc after fetching\n          scheduleGc()\n        }\n        setIsFetchingOptimistic(false)\n      },\n      onError,\n      onPause: () => {\n        dispatch({ type: 'pause' })\n      },\n      onContinue: () => {\n        dispatch({ type: 'continue' })\n      },\n      retry: context.options.retry,\n      retryDelay: context.options.retryDelay,\n      networkMode: context.options.networkMode,\n    })\n\n    promise = retryer.promise\n\n    return promise\n  }\n\n  const cancel = (cancelOptions?: CancelOptions): Promise<void> => {\n    retryer?.cancel(cancelOptions)\n    return promise ? promise.then(noop).catch(noop) : Promise.resolve()\n  }\n\n  const destroy = () => {\n    clearGcTimeout()\n    cancel({ silent: true })\n  }\n\n  const reset = () => {\n    destroy()\n    setState(getDefaultState(options))\n  }\n\n  const setData = (\n    updater: Updater<TQueryData | undefined, TQueryData | undefined>,\n    setDataoptions?: SetDataOptions & { manual: boolean }\n  ) => {\n    const newData = functionalUpdate(updater, state.data)\n    const data = replaceData(state.data, newData, options)\n\n    // Set data and mark it as cached\n    dispatch({\n      data,\n      type: 'success',\n      dataUpdatedAt: setDataoptions?.updatedAt,\n      manual: setDataoptions?.manual,\n    })\n\n    return data\n  }\n\n  const invalidate = () => {\n    if (!state.isInvalidated) {\n      dispatch({ type: 'invalidate' })\n    }\n  }\n\n  const dispatch = (action: Action<TQueryData, TError>): void => {\n    const reducer = (): QueryInfoState<TQueryData, TError> => {\n      switch (action.type) {\n        case 'pause':\n          return {\n            ...state,\n            fetchStatus: 'paused',\n          }\n        case 'continue':\n          return {\n            ...state,\n            fetchStatus: 'fetching',\n          }\n        case 'fetch':\n          return {\n            ...state,\n            fetchMeta: action.meta ?? null,\n            fetchStatus: canFetch(options.networkMode) ? 'fetching' : 'paused',\n            ...(!state.dataUpdatedAt && {\n              error: null,\n              status: 'pending',\n            }),\n          }\n        case 'success':\n          return {\n            ...state,\n            data: action.data,\n            dataUpdatedAt: action.dataUpdatedAt ?? Date.now(),\n            error: null,\n            isInvalidated: false,\n            status: 'success',\n            ...(!action.manual && {\n              fetchStatus: 'idle',\n            }),\n          }\n        case 'error': {\n          const error = action.error as TError\n\n          if (isCancelledError(error) && error.revert && revertState) {\n            return { ...revertState }\n          }\n\n          return {\n            ...state,\n            error,\n            errorUpdatedAt: Date.now(),\n            fetchStatus: 'idle',\n            status: 'error',\n          }\n        }\n        case 'invalidate':\n          return {\n            ...state,\n            isInvalidated: true,\n          }\n        case 'setState':\n          return {\n            ...state,\n            ...action.state,\n          }\n      }\n    }\n    state = reducer()\n\n    listeners.forEach(l => l.onQueryUpdate())\n\n    cache.notify({ queryInfo, type: 'updated', action })\n  }\n\n  const isStaleByTime = (staleTime = 0): boolean => {\n    return (\n      state.isInvalidated ||\n      !state.dataUpdatedAt ||\n      !timeUntilStale(state.dataUpdatedAt, staleTime)\n    )\n  }\n\n  const isStale = (): boolean => {\n    return (\n      state.isInvalidated ||\n      !state.dataUpdatedAt ||\n      !!findSet(listeners, l => l.getCurrentResult().isStale)\n    )\n  }\n\n  const onOnline = (): void => {\n    const listener = findSet(listeners, l => l.shouldFetchOnReconnect())\n\n    listener?.refetch?.({ cancelRefetch: false })\n\n    // Continue fetch if currently paused\n    retryer?.continue()\n  }\n\n  const onFocus = (): void => {\n    const listener = findSet(listeners, l => l.shouldFetchOnWindowFocus())\n\n    listener?.refetch?.({ cancelRefetch: false })\n\n    // Continue fetch if currently paused\n    retryer?.continue()\n  }\n\n  const isActive = (): boolean => {\n    return !!findSet(listeners, l => l.options.enabled !== false)\n  }\n\n  const queryInfo = {\n    subscribe,\n    scheduleGc,\n    setState,\n    setIsFetchingOptimistic,\n    fetch,\n    reset,\n    cancel,\n    destroy,\n    invalidate,\n    queryHash,\n    variables,\n    isStaleByTime,\n    isStale,\n    onOnline,\n    onFocus,\n    isActive,\n\n    isDisabled: (): boolean => hasListeners() && !isActive(),\n\n    setData: (\n      updater: Updater<TQueryData | undefined, TQueryData | undefined>,\n      options?: SetDataOptions\n    ) => setData(updater, { ...options, manual: true }),\n\n    getObserversCount: () => listeners.size,\n\n    get meta() {\n      return options.meta\n    },\n\n    get options() {\n      return options\n    },\n    get state() {\n      return state\n    },\n    get query() {\n      return options.query\n    },\n  }\n\n  return queryInfo\n}\n\nconst getDefaultState = <TFetcherData, TVars, TError, TQueryData>(\n  options: QueryInfoOptions<TFetcherData, TVars, TError, TQueryData>\n): QueryInfoState<TQueryData, TError> => {\n  const data = isFunction(options.initialData)\n    ? (options.initialData as InitialDataFunction<TQueryData>)()\n    : options.initialData\n\n  const hasData = !isUndefined(data)\n\n  const initialDataUpdatedAt = hasData\n    ? isFunction(options.initialDataUpdatedAt)\n      ? (options.initialDataUpdatedAt as () => number | undefined)()\n      : options.initialDataUpdatedAt\n    : 0\n\n  return {\n    data,\n    dataUpdatedAt: hasData ? initialDataUpdatedAt ?? Date.now() : 0,\n    error: null,\n    errorUpdatedAt: 0,\n    fetchMeta: null,\n    isInvalidated: false,\n    status: hasData ? 'success' : 'pending',\n    fetchStatus: 'idle',\n  }\n}\n"],"names":["createQueryInfo","config","cache","queryHash","variables","updateGcTime","scheduleGc","clearGcTimeout","createGcManager","onRemove","hasListeners","state","fetchStatus","remove","queryInfo","options","setOptions","newOptions","query","gcTime","getDefaultState","revertState","setState","setStateOptions","dispatch","type","abortSignalConsumed","retryer","listeners","subscribe","createSubscribable","onSubscribe","onUnsubscribe","cancel","revert","cancelRetry","promise","isFetchingOptimistic","setIsFetchingOptimistic","value","fetch","fetchOptions","_context$fetchOptions","dataUpdatedAt","cancelRefetch","silent","_retryer","continueRetry","abortController","AbortController","queryFunctionContext","meta","addSignalProperty","object","Object","defineProperty","enumerable","get","signal","fetchFn","process","env","NODE_ENV","isServer","key","Promise","reject","Error","fetcher","context","isInfiniteQuery","createInfiniteQueryBehavior","pages","onFetch","fetchMeta","_context$fetchOptions2","onError","error","isCancelledError","onSettled","data","createRetryer","fn","abort","bind","onSuccess","isUndefined","console","setData","onPause","onContinue","retry","retryDelay","networkMode","cancelOptions","_retryer2","then","noop","catch","resolve","destroy","reset","updater","setDataoptions","newData","functionalUpdate","replaceData","updatedAt","manual","invalidate","isInvalidated","action","reducer","_action$meta","_action$dataUpdatedAt","canFetch","status","Date","now","errorUpdatedAt","forEach","l","onQueryUpdate","notify","isStaleByTime","staleTime","timeUntilStale","isStale","findSet","getCurrentResult","onOnline","_retryer3","listener","shouldFetchOnReconnect","refetch","continue","onFocus","_retryer4","shouldFetchOnWindowFocus","isActive","enabled","isDisabled","getObserversCount","size","isFunction","initialData","hasData","initialDataUpdatedAt"],"mappings":"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"}