{"version":3,"file":"infiniteQueryBehavior.mjs","sources":["../../../src/vanilla/infiniteQueryBehavior.ts"],"sourcesContent":["import { QueryBehavior } from './queryInfo'\nimport { QueryFunctionContext } from './typeUtils'\nimport { InfiniteData } from './types'\nimport { addToEnd, addToStart } from './utils'\n\nexport type GetPreviousPageParamFunction<TFetcherData = unknown> = (\n  firstPage: TFetcherData,\n  allPages: TFetcherData[],\n  firstPageParam: number,\n  allPageParams: number[]\n) => number | undefined | null\n\nexport type GetNextPageParamFunction<TFetcherData = unknown> = (\n  lastPage: TFetcherData,\n  allPages: TFetcherData[],\n  lastPageParam: number,\n  allPageParams: number[]\n) => number | undefined | null\n\nexport interface InfiniteQueryPageParamsOptions<TFetcherData = unknown> {\n  /**\n   * This function can be set to automatically get the previous cursor for infinite queries.\n   * The result will also be used to determine the value of `hasPreviousPage`.\n   */\n  getPreviousPageParam?: GetPreviousPageParamFunction<TFetcherData>\n  /**\n   * This function can be set to automatically get the next cursor for infinite queries.\n   * The result will also be used to determine the value of `hasNextPage`.\n   */\n  getNextPageParam: GetNextPageParamFunction<TFetcherData>\n\n  initialPageParam: number\n}\n\nexport const createInfiniteQueryBehavior = <TFetcherData, TVars, TError, TData>(\n  pages?: number\n): QueryBehavior<TFetcherData, TVars, TError, InfiniteData<TData>> => {\n  return {\n    onFetch: context => {\n      context.fetchFn = async () => {\n        const options =\n          context.options as unknown as InfiniteQueryPageParamsOptions<TFetcherData>\n        const direction = context.fetchOptions?.meta?.fetchMore?.direction\n        const oldPages = context.state.data?.pages || []\n        const oldPageParams = context.state.data?.pageParams || []\n        const empty = { pages: [], pageParams: [] }\n        let cancelled = false\n\n        const addSignalProperty = (object: unknown) => {\n          Object.defineProperty(object, 'signal', {\n            enumerable: true,\n            get: () => {\n              if (context.signal.aborted) {\n                cancelled = true\n              } else {\n                context.signal.addEventListener('abort', () => {\n                  cancelled = true\n                })\n              }\n              return context.signal\n            },\n          })\n        }\n\n        // Get query function\n        const fetcher =\n          context.query.fetcher ||\n          (() =>\n            Promise.reject(\n              new Error(`Missing fetcher: '${context.options.queryHash}'`)\n            ))\n\n        // Create function to fetch a page\n        const fetchPage = async (\n          data: InfiniteData<unknown>,\n          param: number,\n          previous?: boolean\n        ): Promise<InfiniteData<unknown>> => {\n          if (cancelled) {\n            return Promise.reject()\n          }\n\n          if (param == null && data.pages.length) {\n            return Promise.resolve(data)\n          }\n\n          const queryFnContext: Omit<QueryFunctionContext<number>, 'signal'> = {\n            pageParam: param,\n            direction: previous ? 'backward' : 'forward',\n            meta: context.options.meta,\n          }\n\n          addSignalProperty(queryFnContext)\n\n          const page = await fetcher(\n            context.variables,\n            queryFnContext as QueryFunctionContext<number>\n          )\n\n          const { maxPages } = context.options\n          const addTo = previous ? addToStart : addToEnd\n\n          return {\n            pages: addTo(data.pages, page, maxPages),\n            pageParams: addTo(data.pageParams, param, maxPages),\n          }\n        }\n\n        let result: InfiniteData<unknown>\n\n        // fetch next / previous page?\n        if (direction && oldPages.length) {\n          const previous = direction === 'backward'\n          const pageParamFn = previous ? getPreviousPageParam : getNextPageParam\n          const oldData = {\n            pages: oldPages,\n            pageParams: oldPageParams,\n          }\n          const param = pageParamFn(options, oldData)\n\n          result = await fetchPage(oldData, param!, previous)\n        } else {\n          // Fetch first page\n          result = await fetchPage(\n            empty,\n            oldPageParams[0] ?? options.initialPageParam\n          )\n\n          const remainingPages = pages ?? oldPages.length\n\n          // Fetch remaining pages\n          for (let i = 1; i < remainingPages; i++) {\n            const param = getNextPageParam(options, result)\n            result = await fetchPage(result, param!)\n          }\n        }\n\n        return result\n      }\n    },\n  }\n}\n\nconst getNextPageParam = (\n  options: InfiniteQueryPageParamsOptions<any>,\n  { pages, pageParams }: InfiniteData<unknown>\n): number | undefined | null => {\n  const lastIndex = pages.length - 1\n  return options.getNextPageParam(\n    pages[lastIndex],\n    pages,\n    pageParams[lastIndex]!,\n    pageParams\n  )\n}\n\nconst getPreviousPageParam = (\n  options: InfiniteQueryPageParamsOptions<any>,\n  { pages, pageParams }: InfiniteData<unknown>\n): number | undefined | null => {\n  return options.getPreviousPageParam?.(\n    pages[0],\n    pages,\n    pageParams[0]!,\n    pageParams\n  )\n}\n\n/**\n * Checks if there is a next page.\n */\nexport const hasNextPage = (\n  options: InfiniteQueryPageParamsOptions<any>,\n  data?: InfiniteData<unknown>\n): boolean => {\n  if (!data) return false\n  return getNextPageParam(options, data) != null\n}\n\n/**\n * Checks if there is a previous page.\n */\nexport const hasPreviousPage = (\n  options: InfiniteQueryPageParamsOptions<any>,\n  data?: InfiniteData<unknown>\n): boolean => {\n  if (!data || !options.getPreviousPageParam) return false\n  return getPreviousPageParam(options, data) != null\n}\n"],"names":["createInfiniteQueryBehavior","pages","onFetch","context","fetchFn","_context$fetchOptions","_context$state$data","_context$state$data2","options","direction","fetchOptions","meta","fetchMore","oldPages","state","data","oldPageParams","pageParams","empty","cancelled","addSignalProperty","object","Object","defineProperty","enumerable","get","signal","aborted","addEventListener","fetcher","query","Promise","reject","Error","queryHash","fetchPage","param","previous","length","resolve","queryFnContext","pageParam","page","variables","maxPages","addTo","addToStart","addToEnd","result","pageParamFn","getPreviousPageParam","getNextPageParam","oldData","_oldPageParams$","initialPageParam","remainingPages","i","lastIndex","hasNextPage","hasPreviousPage"],"mappings":"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"}