@tanstack/solid-query 5.0.0-alpha.2 → 5.0.0-alpha.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/build/cjs/index.js +73 -34
  2. package/build/cjs/index.js.map +1 -1
  3. package/build/esm/index.js +75 -37
  4. package/build/esm/index.js.map +1 -1
  5. package/build/source/QueryClient.js +6 -0
  6. package/build/source/__tests__/QueryClientProvider.test.jsx +2 -1
  7. package/build/source/__tests__/createInfiniteQuery.test.jsx +67 -20
  8. package/build/source/__tests__/createMutation.test.jsx +19 -18
  9. package/build/source/__tests__/createQueries.test.jsx +4 -91
  10. package/build/source/__tests__/createQuery.test.jsx +62 -271
  11. package/build/source/__tests__/suspense.test.jsx +3 -64
  12. package/build/source/__tests__/useIsFetching.test.jsx +2 -4
  13. package/build/source/__tests__/useIsMutating.test.jsx +25 -28
  14. package/build/source/__tests__/utils.jsx +4 -3
  15. package/build/source/createBaseQuery.js +45 -19
  16. package/build/source/createQueries.js +5 -5
  17. package/build/source/index.js +1 -0
  18. package/build/source/useIsFetching.js +5 -5
  19. package/build/source/useIsMutating.js +5 -5
  20. package/build/types/QueryClient.d.ts +29 -0
  21. package/build/types/QueryClientProvider.d.ts +1 -1
  22. package/build/types/__tests__/utils.d.ts +3 -4
  23. package/build/types/createBaseQuery.d.ts +3 -2
  24. package/build/types/createInfiniteQuery.d.ts +4 -2
  25. package/build/types/createMutation.d.ts +4 -2
  26. package/build/types/createQueries.d.ts +5 -4
  27. package/build/types/createQuery.d.ts +2 -1
  28. package/build/types/index.d.ts +2 -0
  29. package/build/types/types.d.ts +2 -1
  30. package/build/types/useIsFetching.d.ts +3 -7
  31. package/build/types/useIsMutating.d.ts +3 -7
  32. package/build/umd/index.js +1 -1
  33. package/build/umd/index.js.map +1 -1
  34. package/package.json +5 -5
  35. package/src/QueryClient.ts +84 -0
  36. package/src/QueryClientProvider.tsx +1 -1
  37. package/src/__tests__/QueryClientProvider.test.tsx +2 -1
  38. package/src/__tests__/createInfiniteQuery.test.tsx +95 -34
  39. package/src/__tests__/createMutation.test.tsx +19 -18
  40. package/src/__tests__/createQueries.test.tsx +4 -97
  41. package/src/__tests__/createQuery.test.tsx +78 -344
  42. package/src/__tests__/suspense.test.tsx +3 -85
  43. package/src/__tests__/useIsFetching.test.tsx +2 -4
  44. package/src/__tests__/useIsMutating.test.tsx +32 -40
  45. package/src/__tests__/utils.tsx +4 -3
  46. package/src/createBaseQuery.ts +70 -25
  47. package/src/createInfiniteQuery.ts +3 -2
  48. package/src/createMutation.ts +4 -2
  49. package/src/createQueries.ts +9 -8
  50. package/src/createQuery.ts +4 -2
  51. package/src/index.ts +7 -0
  52. package/src/types.ts +4 -2
  53. package/src/useIsFetching.ts +10 -13
  54. package/src/useIsMutating.ts +10 -11
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/setBatchUpdatesFn.ts","../../src/QueryClientProvider.tsx","../../src/utils.ts","../../src/createBaseQuery.ts","../../src/createMutation.ts","../../src/createInfiniteQuery.ts","../../src/createQueries.ts","../../src/createQuery.ts","../../src/useIsFetching.ts","../../src/useIsMutating.ts"],"sourcesContent":["import { notifyManager } from '@tanstack/query-core'\nimport { batch } from 'solid-js'\n\nnotifyManager.setBatchNotifyFunction(batch)\n","import type { QueryClient } from '@tanstack/query-core'\nimport type { JSX } from 'solid-js'\nimport { createContext, useContext, onMount, onCleanup } from 'solid-js'\n\nexport const QueryClientContext = createContext<QueryClient | undefined>(\n undefined,\n)\n\nexport const useQueryClient = (queryClient?: QueryClient) => {\n const client = useContext(QueryClientContext)\n\n if (queryClient) {\n return queryClient\n }\n\n if (!client) {\n throw new Error('No QueryClient set, use QueryClientProvider to set one')\n }\n\n return client\n}\n\nexport type QueryClientProviderProps = {\n client: QueryClient\n children?: JSX.Element\n}\n\nexport const QueryClientProvider = (\n props: QueryClientProviderProps,\n): JSX.Element => {\n onMount(() => {\n props.client.mount()\n })\n onCleanup(() => props.client.unmount())\n\n return (\n <QueryClientContext.Provider value={props.client}>\n {props.children}\n </QueryClientContext.Provider>\n )\n}\n","export function shouldThrowError<T extends (...args: any[]) => boolean>(\n throwError: boolean | T | undefined,\n params: Parameters<T>,\n): boolean {\n // Allow throwError function to override throwing behavior on a per-error basis\n if (typeof throwError === 'function') {\n return throwError(...params)\n }\n\n return !!throwError\n}\n","/* eslint-disable @typescript-eslint/no-unnecessary-condition */\n// Had to disable the lint rule because isServer type is defined as false\n// in solid-js/web package. I'll create a GitHub issue with them to see\n// why that happens.\nimport type {\n QueryClient,\n QueryKey,\n QueryObserver,\n QueryObserverResult,\n} from '@tanstack/query-core'\nimport { hydrate } from '@tanstack/query-core'\nimport { notifyManager } from '@tanstack/query-core'\nimport type { Accessor } from 'solid-js'\nimport { isServer } from 'solid-js/web'\nimport {\n createComputed,\n createMemo,\n createResource,\n on,\n onCleanup,\n onMount,\n} from 'solid-js'\nimport { createStore, unwrap } from 'solid-js/store'\nimport { useQueryClient } from './QueryClientProvider'\nimport type { CreateBaseQueryOptions } from './types'\nimport { shouldThrowError } from './utils'\n\n// Base Query Function that is used to create the query.\nexport function createBaseQuery<\n TQueryFnData,\n TError,\n TData,\n TQueryData,\n TQueryKey extends QueryKey,\n>(\n options: Accessor<\n CreateBaseQueryOptions<TQueryFnData, TError, TData, TQueryData, TQueryKey>\n >,\n Observer: typeof QueryObserver,\n queryClient?: () => QueryClient,\n) {\n const client = createMemo(() => useQueryClient(queryClient?.()))\n\n const defaultedOptions = client().defaultQueryOptions(options())\n defaultedOptions._optimisticResults = 'optimistic'\n if (isServer) {\n defaultedOptions.retry = false\n defaultedOptions.throwErrors = true\n }\n const observer = new Observer(client(), defaultedOptions)\n\n const [state, setState] = createStore<QueryObserverResult<TData, TError>>(\n observer.getOptimisticResult(defaultedOptions),\n )\n\n const createServerSubscriber = (\n resolve: (\n data:\n | QueryObserverResult<TData, TError>\n | PromiseLike<QueryObserverResult<TData, TError> | undefined>\n | undefined,\n ) => void,\n reject: (reason?: any) => void,\n ) => {\n return observer.subscribe((result) => {\n notifyManager.batchCalls(() => {\n const unwrappedResult = { ...unwrap(result) }\n if (unwrappedResult.isError) {\n if (process.env['NODE_ENV'] === 'development') {\n console.error(unwrappedResult.error)\n }\n reject(unwrappedResult.error)\n }\n if (unwrappedResult.isSuccess) {\n resolve(unwrappedResult)\n }\n })()\n })\n }\n\n const createClientSubscriber = () => {\n return observer.subscribe((result) => {\n notifyManager.batchCalls(() => {\n const unwrappedResult = { ...unwrap(result) }\n // If the query has data we dont suspend but instead mutate the resource\n // This could happen when placeholderData/initialData is defined\n if (\n queryResource()?.data &&\n unwrappedResult.data &&\n !queryResource.loading\n ) {\n setState(unwrappedResult)\n mutate(state)\n } else {\n setState(unwrappedResult)\n refetch()\n }\n })()\n })\n }\n\n /**\n * Unsubscribe is set lazily, so that we can subscribe after hydration when needed.\n */\n let unsubscribe: (() => void) | null = null\n\n const [queryResource, { refetch, mutate }] = createResource<\n QueryObserverResult<TData, TError> | undefined\n >(\n () => {\n return new Promise((resolve, reject) => {\n if (isServer) {\n unsubscribe = createServerSubscriber(resolve, reject)\n } else {\n if (!unsubscribe) {\n unsubscribe = createClientSubscriber()\n }\n }\n if (!state.isLoading) {\n resolve(state)\n }\n })\n },\n {\n initialValue: state,\n\n // If initialData is provided, we resolve the resource immediately\n ssrLoadFrom: options().initialData ? 'initial' : 'server',\n\n get deferStream() {\n return options().deferStream\n },\n\n /**\n * If this resource was populated on the server (either sync render, or streamed in over time), onHydrated\n * will be called. This is the point at which we can hydrate the query cache state, and setup the query subscriber.\n *\n * Leveraging onHydrated allows us to plug into the async and streaming support that solidjs resources already support.\n *\n * Note that this is only invoked on the client, for queries that were originally run on the server.\n */\n onHydrated(_k, info) {\n if (info.value) {\n hydrate(client(), {\n queries: [\n {\n queryKey: defaultedOptions.queryKey,\n queryHash: defaultedOptions.queryHash,\n state: info.value,\n },\n ],\n })\n }\n\n if (!unsubscribe) {\n /**\n * Do not refetch query on mount if query was fetched on server,\n * even if `staleTime` is not set.\n */\n const newOptions = { ...defaultedOptions }\n if (defaultedOptions.staleTime || !defaultedOptions.initialData) {\n newOptions.refetchOnMount = false\n }\n // Setting the options as an immutable object to prevent\n // wonky behavior with observer subscriptions\n observer.setOptions(newOptions)\n setState(observer.getOptimisticResult(newOptions))\n unsubscribe = createClientSubscriber()\n }\n },\n },\n )\n\n onCleanup(() => {\n if (unsubscribe) {\n unsubscribe()\n unsubscribe = null\n }\n })\n\n onMount(() => {\n observer.setOptions(defaultedOptions, { listeners: false })\n })\n\n createComputed(() => {\n observer.setOptions(client().defaultQueryOptions(options()))\n })\n\n createComputed(\n on(\n () => state.status,\n () => {\n if (\n state.isError &&\n !state.isFetching &&\n shouldThrowError(observer.options.throwErrors, [\n state.error,\n observer.getCurrentQuery(),\n ])\n ) {\n throw state.error\n }\n },\n ),\n )\n\n const handler = {\n get(\n target: QueryObserverResult<TData, TError>,\n prop: keyof QueryObserverResult<TData, TError>,\n ): any {\n if (prop === 'data') {\n return queryResource()?.data\n }\n return Reflect.get(target, prop)\n },\n }\n\n return new Proxy(state, handler)\n}\n","import type { QueryClient, DefaultError } from '@tanstack/query-core'\nimport { MutationObserver } from '@tanstack/query-core'\nimport { useQueryClient } from './QueryClientProvider'\nimport type {\n CreateMutateFunction,\n CreateMutationOptions,\n CreateMutationResult,\n} from './types'\nimport { createComputed, onCleanup, on } from 'solid-js'\nimport { createStore } from 'solid-js/store'\nimport { shouldThrowError } from './utils'\n\n// HOOK\nexport function createMutation<\n TData = unknown,\n TError = DefaultError,\n TVariables = void,\n TContext = unknown,\n>(\n options: CreateMutationOptions<TData, TError, TVariables, TContext>,\n queryClient?: () => QueryClient,\n): CreateMutationResult<TData, TError, TVariables, TContext> {\n const client = useQueryClient(queryClient?.())\n\n const observer = new MutationObserver<TData, TError, TVariables, TContext>(\n client,\n options(),\n )\n\n const mutate: CreateMutateFunction<TData, TError, TVariables, TContext> = (\n variables,\n mutateOptions,\n ) => {\n observer.mutate(variables, mutateOptions).catch(noop)\n }\n\n const [state, setState] = createStore<\n CreateMutationResult<TData, TError, TVariables, TContext>\n >({\n ...observer.getCurrentResult(),\n mutate,\n mutateAsync: observer.getCurrentResult().mutate,\n })\n\n createComputed(() => {\n observer.setOptions(options())\n })\n\n createComputed(\n on(\n () => state.status,\n () => {\n if (\n state.isError &&\n shouldThrowError(observer.options.throwErrors, [state.error])\n ) {\n throw state.error\n }\n },\n ),\n )\n\n const unsubscribe = observer.subscribe((result) => {\n setState({\n ...result,\n mutate,\n mutateAsync: result.mutate,\n })\n })\n\n onCleanup(unsubscribe)\n\n return state\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nfunction noop() {}\n","import type {\n QueryObserver,\n QueryKey,\n QueryClient,\n DefaultError,\n InfiniteData,\n} from '@tanstack/query-core'\nimport { InfiniteQueryObserver } from '@tanstack/query-core'\nimport type {\n CreateInfiniteQueryOptions,\n CreateInfiniteQueryResult,\n} from './types'\nimport { createBaseQuery } from './createBaseQuery'\nimport { createMemo } from 'solid-js'\n\nexport function createInfiniteQuery<\n TQueryFnData,\n TError = DefaultError,\n TData = InfiniteData<TQueryFnData>,\n TQueryKey extends QueryKey = QueryKey,\n TPageParam = unknown,\n>(\n options: CreateInfiniteQueryOptions<\n TQueryFnData,\n TError,\n TData,\n TQueryKey,\n TPageParam\n >,\n queryClient?: () => QueryClient,\n): CreateInfiniteQueryResult<TData, TError> {\n return createBaseQuery(\n createMemo(() => options()),\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n InfiniteQueryObserver as typeof QueryObserver,\n queryClient,\n ) as CreateInfiniteQueryResult<TData, TError>\n}\n","import type {\n QueriesPlaceholderDataFunction,\n QueryClient,\n QueryFunction,\n QueryKey,\n DefaultError,\n} from '@tanstack/query-core'\nimport { notifyManager, QueriesObserver } from '@tanstack/query-core'\nimport { createComputed, onCleanup, onMount } from 'solid-js'\nimport { createStore, unwrap } from 'solid-js/store'\nimport { useQueryClient } from './QueryClientProvider'\nimport type { CreateQueryResult, SolidQueryOptions } from './types'\n\n// This defines the `UseQueryOptions` that are accepted in `QueriesOptions` & `GetOptions`.\n// `placeholderData` function does not have a parameter\ntype CreateQueryOptionsForCreateQueries<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n> = Omit<\n SolidQueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n 'placeholderData'\n> & {\n placeholderData?: TQueryFnData | QueriesPlaceholderDataFunction<TQueryFnData>\n}\n\n// Avoid TS depth-limit error in case of large array literal\ntype MAXIMUM_DEPTH = 20\n\ntype GetOptions<T> =\n // Part 1: responsible for applying explicit type parameter to function arguments, if object { queryFnData: TQueryFnData, error: TError, data: TData }\n T extends {\n queryFnData: infer TQueryFnData\n error?: infer TError\n data: infer TData\n }\n ? CreateQueryOptionsForCreateQueries<TQueryFnData, TError, TData>\n : T extends { queryFnData: infer TQueryFnData; error?: infer TError }\n ? CreateQueryOptionsForCreateQueries<TQueryFnData, TError>\n : T extends { data: infer TData; error?: infer TError }\n ? CreateQueryOptionsForCreateQueries<unknown, TError, TData>\n : // Part 2: responsible for applying explicit type parameter to function arguments, if tuple [TQueryFnData, TError, TData]\n T extends [infer TQueryFnData, infer TError, infer TData]\n ? CreateQueryOptionsForCreateQueries<TQueryFnData, TError, TData>\n : T extends [infer TQueryFnData, infer TError]\n ? CreateQueryOptionsForCreateQueries<TQueryFnData, TError>\n : T extends [infer TQueryFnData]\n ? CreateQueryOptionsForCreateQueries<TQueryFnData>\n : // Part 3: responsible for inferring and enforcing type if no explicit parameter was provided\n T extends {\n queryFn?: QueryFunction<infer TQueryFnData, infer TQueryKey>\n select: (data: any) => infer TData\n }\n ? CreateQueryOptionsForCreateQueries<TQueryFnData, Error, TData, TQueryKey>\n : T extends { queryFn?: QueryFunction<infer TQueryFnData, infer TQueryKey> }\n ? CreateQueryOptionsForCreateQueries<\n TQueryFnData,\n Error,\n TQueryFnData,\n TQueryKey\n >\n : // Fallback\n CreateQueryOptionsForCreateQueries\n\ntype GetResults<T> =\n // Part 1: responsible for mapping explicit type parameter to function result, if object\n T extends { queryFnData: any; error?: infer TError; data: infer TData }\n ? CreateQueryResult<TData, TError>\n : T extends { queryFnData: infer TQueryFnData; error?: infer TError }\n ? CreateQueryResult<TQueryFnData, TError>\n : T extends { data: infer TData; error?: infer TError }\n ? CreateQueryResult<TData, TError>\n : // Part 2: responsible for mapping explicit type parameter to function result, if tuple\n T extends [any, infer TError, infer TData]\n ? CreateQueryResult<TData, TError>\n : T extends [infer TQueryFnData, infer TError]\n ? CreateQueryResult<TQueryFnData, TError>\n : T extends [infer TQueryFnData]\n ? CreateQueryResult<TQueryFnData>\n : // Part 3: responsible for mapping inferred type to results, if no explicit parameter was provided\n T extends {\n queryFn?: QueryFunction<unknown, any>\n select: (data: any) => infer TData\n }\n ? CreateQueryResult<TData>\n : T extends { queryFn?: QueryFunction<infer TQueryFnData, any> }\n ? CreateQueryResult<TQueryFnData>\n : // Fallback\n CreateQueryResult\n\n/**\n * QueriesOptions reducer recursively unwraps function arguments to infer/enforce type param\n */\nexport type QueriesOptions<\n T extends any[],\n Result extends any[] = [],\n Depth extends ReadonlyArray<number> = [],\n> = Depth['length'] extends MAXIMUM_DEPTH\n ? CreateQueryOptionsForCreateQueries[]\n : T extends []\n ? []\n : T extends [infer Head]\n ? [...Result, GetOptions<Head>]\n : T extends [infer Head, ...infer Tail]\n ? QueriesOptions<[...Tail], [...Result, GetOptions<Head>], [...Depth, 1]>\n : unknown[] extends T\n ? T\n : // If T is *some* array but we couldn't assign unknown[] to it, then it must hold some known/homogenous type!\n // use this to infer the param types in the case of Array.map() argument\n T extends CreateQueryOptionsForCreateQueries<\n infer TQueryFnData,\n infer TError,\n infer TData,\n infer TQueryKey\n >[]\n ? CreateQueryOptionsForCreateQueries<TQueryFnData, TError, TData, TQueryKey>[]\n : // Fallback\n CreateQueryOptionsForCreateQueries[]\n\n/**\n * QueriesResults reducer recursively maps type param to results\n */\nexport type QueriesResults<\n T extends any[],\n Result extends any[] = [],\n Depth extends ReadonlyArray<number> = [],\n> = Depth['length'] extends MAXIMUM_DEPTH\n ? CreateQueryResult[]\n : T extends []\n ? []\n : T extends [infer Head]\n ? [...Result, GetResults<Head>]\n : T extends [infer Head, ...infer Tail]\n ? QueriesResults<[...Tail], [...Result, GetResults<Head>], [...Depth, 1]>\n : T extends CreateQueryOptionsForCreateQueries<\n infer TQueryFnData,\n infer TError,\n infer TData,\n any\n >[]\n ? // Dynamic-size (homogenous) UseQueryOptions array: map directly to array of results\n CreateQueryResult<\n unknown extends TData ? TQueryFnData : TData,\n unknown extends TError ? DefaultError : TError\n >[]\n : // Fallback\n CreateQueryResult[]\n\nexport function createQueries<T extends any[]>(\n queriesOptions: () => {\n queries: readonly [...QueriesOptions<T>]\n queryClient?: QueryClient\n },\n): QueriesResults<T> {\n const queryClient = useQueryClient(queriesOptions().queryClient)\n\n const defaultedQueries = queriesOptions().queries.map((options) => {\n const defaultedOptions = queryClient.defaultQueryOptions(options)\n defaultedOptions._optimisticResults = 'optimistic'\n return defaultedOptions\n })\n\n const observer = new QueriesObserver(queryClient, defaultedQueries)\n\n const [state, setState] = createStore(\n observer.getOptimisticResult(defaultedQueries),\n )\n\n const unsubscribe = observer.subscribe((result) => {\n notifyManager.batchCalls(() => {\n setState(unwrap(result))\n })()\n })\n\n onCleanup(unsubscribe)\n\n onMount(() => {\n observer.setQueries(defaultedQueries, { listeners: false })\n })\n\n createComputed(() => {\n const updatedQueries = queriesOptions().queries.map((options) => {\n const defaultedOptions = queryClient.defaultQueryOptions(options)\n defaultedOptions._optimisticResults = 'optimistic'\n return defaultedOptions\n })\n observer.setQueries(updatedQueries)\n })\n\n return state as QueriesResults<T>\n}\n","import type { QueryClient, QueryKey, DefaultError } from '@tanstack/query-core'\nimport { QueryObserver } from '@tanstack/query-core'\nimport { createMemo } from 'solid-js'\nimport { createBaseQuery } from './createBaseQuery'\nimport type {\n CreateQueryOptions,\n CreateQueryResult,\n DefinedCreateQueryResult,\n FunctionedParams,\n SolidQueryOptions,\n} from './types'\n\ntype UndefinedInitialDataOptions<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n> = FunctionedParams<\n SolidQueryOptions<TQueryFnData, TError, TData, TQueryKey> & {\n initialData?: undefined\n }\n>\n\ntype DefinedInitialDataOptions<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n> = FunctionedParams<\n SolidQueryOptions<TQueryFnData, TError, TData, TQueryKey> & {\n initialData: TQueryFnData | (() => TQueryFnData)\n }\n>\n\nexport function createQuery<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n>(\n options: UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>,\n queryClient?: () => QueryClient,\n): CreateQueryResult<TData, TError>\n\nexport function createQuery<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n>(\n options: DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>,\n queryClient?: () => QueryClient,\n): DefinedCreateQueryResult<TData, TError>\nexport function createQuery<\n TQueryFnData,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n>(\n options: CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n queryClient?: () => QueryClient,\n) {\n return createBaseQuery(\n createMemo(() => options()),\n QueryObserver,\n queryClient,\n )\n}\n","import type { QueryClient, QueryFilters } from '@tanstack/query-core'\nimport type { Accessor } from 'solid-js'\nimport { createMemo, createSignal, onCleanup } from 'solid-js'\nimport { useQueryClient } from './QueryClientProvider'\n\ntype Options = () => {\n filters?: QueryFilters\n queryClient?: QueryClient\n}\n\nexport function useIsFetching(options: Options = () => ({})): Accessor<number> {\n const queryClient = createMemo(() => useQueryClient(options().queryClient))\n const queryCache = createMemo(() => queryClient().getQueryCache())\n\n const [fetches, setFetches] = createSignal(\n queryClient().isFetching(options().filters),\n )\n\n const unsubscribe = queryCache().subscribe(() => {\n setFetches(queryClient().isFetching(options().filters))\n })\n\n onCleanup(unsubscribe)\n\n return fetches\n}\n","import type { MutationFilters, QueryClient } from '@tanstack/query-core'\nimport { useQueryClient } from './QueryClientProvider'\nimport type { Accessor } from 'solid-js'\nimport { createSignal, onCleanup, createMemo } from 'solid-js'\n\ntype Options = () => {\n filters?: MutationFilters\n queryClient?: QueryClient\n}\n\nexport function useIsMutating(options: Options = () => ({})): Accessor<number> {\n const queryClient = createMemo(() => useQueryClient(options().queryClient))\n const mutationCache = createMemo(() => queryClient().getMutationCache())\n\n const [mutations, setMutations] = createSignal(\n queryClient().isMutating(options().filters),\n )\n\n const unsubscribe = mutationCache().subscribe((_result) => {\n setMutations(queryClient().isMutating(options().filters))\n })\n\n onCleanup(unsubscribe)\n\n return mutations\n}\n"],"names":["notifyManager","setBatchNotifyFunction","batch","QueryClientContext","createContext","undefined","useQueryClient","queryClient","client","useContext","Error","shouldThrowError","throwError","params","createBaseQuery","options","Observer","createMemo","defaultedOptions","defaultQueryOptions","_optimisticResults","isServer","retry","throwErrors","observer","state","setState","createStore","getOptimisticResult","createClientSubscriber","subscribe","result","batchCalls","unwrappedResult","unwrap","queryResource","data","loading","mutate","refetch","unsubscribe","createResource","Promise","resolve","reject","isError","process","env","console","error","isSuccess","createServerSubscriber","isLoading","initialValue","ssrLoadFrom","initialData","deferStream","onHydrated","_k","info","value","hydrate","queries","queryKey","queryHash","newOptions","staleTime","refetchOnMount","setOptions","onCleanup","onMount","listeners","createComputed","on","status","isFetching","getCurrentQuery","Proxy","get","target","prop","Reflect","noop","props","mount","unmount","_$createComponent","createComponent","Provider","children","InfiniteQueryObserver","MutationObserver","variables","mutateOptions","catch","getCurrentResult","mutateAsync","queriesOptions","defaultedQueries","map","QueriesObserver","setQueries","updatedQueries","QueryObserver","queryCache","getQueryCache","fetches","setFetches","createSignal","filters","mutationCache","getMutationCache","mutations","setMutations","isMutating","_result"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/setBatchUpdatesFn.ts","../../src/QueryClient.ts","../../src/QueryClientProvider.tsx","../../src/utils.ts","../../src/createBaseQuery.ts","../../src/createMutation.ts","../../src/createInfiniteQuery.ts","../../src/createQueries.ts","../../src/createQuery.ts","../../src/useIsFetching.ts","../../src/useIsMutating.ts"],"sourcesContent":["import { notifyManager } from '@tanstack/query-core'\nimport { batch } from 'solid-js'\n\nnotifyManager.setBatchNotifyFunction(batch)\n","import type {\n QueryClientConfig as QueryCoreClientConfig,\n DefaultOptions as CoreDefaultOptions,\n QueryObserverOptions as QueryCoreObserverOptions,\n InfiniteQueryObserverOptions as QueryCoreInfiniteQueryObserverOptions,\n DefaultError,\n QueryKey,\n} from '@tanstack/query-core'\nimport { QueryClient as QueryCoreClient } from '@tanstack/query-core'\n\nexport interface QueryObserverOptions<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n TPageParam = never,\n> extends Omit<\n QueryCoreObserverOptions<\n TQueryFnData,\n TError,\n TData,\n TQueryData,\n TQueryKey,\n TPageParam\n >,\n 'structuralSharing'\n > {\n /**\n * Set this to a reconciliation key to enable reconciliation between query results.\n * Set this to `false` to disable reconciliation 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 reconciliation logic.\n * Defaults reconciliation key to `id`.\n */\n reconcile?:\n | string\n | false\n | ((oldData: TData | undefined, newData: TData) => TData)\n}\n\nexport interface InfiniteQueryObserverOptions<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n TPageParam = unknown,\n> extends Omit<\n QueryCoreInfiniteQueryObserverOptions<\n TQueryFnData,\n TError,\n TData,\n TQueryData,\n TQueryKey,\n TPageParam\n >,\n 'structuralSharing'\n > {\n /**\n * Set this to a reconciliation key to enable reconciliation between query results.\n * Set this to `false` to disable reconciliation 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 reconciliation logic.\n * Defaults reconciliation key to `id`.\n */\n reconcile?:\n | string\n | false\n | ((oldData: TData | undefined, newData: TData) => TData)\n}\n\nexport interface DefaultOptions<TError = DefaultError>\n extends CoreDefaultOptions<TError> {\n queries?: QueryObserverOptions<unknown, TError>\n}\n\nexport interface QueryClientConfig extends QueryCoreClientConfig {\n defaultOptions?: DefaultOptions\n}\n\nexport class QueryClient extends QueryCoreClient {\n constructor(config: QueryClientConfig = {}) {\n super(config)\n }\n}\n","import type { QueryClient } from './QueryClient'\nimport type { JSX } from 'solid-js'\nimport { createContext, useContext, onMount, onCleanup } from 'solid-js'\n\nexport const QueryClientContext = createContext<QueryClient | undefined>(\n undefined,\n)\n\nexport const useQueryClient = (queryClient?: QueryClient) => {\n const client = useContext(QueryClientContext)\n\n if (queryClient) {\n return queryClient\n }\n\n if (!client) {\n throw new Error('No QueryClient set, use QueryClientProvider to set one')\n }\n\n return client\n}\n\nexport type QueryClientProviderProps = {\n client: QueryClient\n children?: JSX.Element\n}\n\nexport const QueryClientProvider = (\n props: QueryClientProviderProps,\n): JSX.Element => {\n onMount(() => {\n props.client.mount()\n })\n onCleanup(() => props.client.unmount())\n\n return (\n <QueryClientContext.Provider value={props.client}>\n {props.children}\n </QueryClientContext.Provider>\n )\n}\n","export function shouldThrowError<T extends (...args: any[]) => boolean>(\n throwError: boolean | T | undefined,\n params: Parameters<T>,\n): boolean {\n // Allow throwError function to override throwing behavior on a per-error basis\n if (typeof throwError === 'function') {\n return throwError(...params)\n }\n\n return !!throwError\n}\n","/* eslint-disable @typescript-eslint/no-unnecessary-condition */\n// Had to disable the lint rule because isServer type is defined as false\n// in solid-js/web package. I'll create a GitHub issue with them to see\n// why that happens.\nimport type {\n QueryKey,\n QueryObserver,\n QueryObserverResult,\n} from '@tanstack/query-core'\nimport type { QueryClient } from './QueryClient'\nimport { hydrate } from '@tanstack/query-core'\nimport { notifyManager } from '@tanstack/query-core'\nimport type { Accessor } from 'solid-js'\nimport { isServer } from 'solid-js/web'\nimport {\n createComputed,\n createMemo,\n createResource,\n on,\n onCleanup,\n} from 'solid-js'\nimport { createStore, reconcile, unwrap } from 'solid-js/store'\nimport { useQueryClient } from './QueryClientProvider'\nimport type { CreateBaseQueryOptions } from './types'\nimport { shouldThrowError } from './utils'\n\nfunction reconcileFn<TData, TError>(\n store: QueryObserverResult<TData, TError>,\n result: QueryObserverResult<TData, TError>,\n reconcileOption:\n | string\n | false\n | ((oldData: TData | undefined, newData: TData) => TData),\n): QueryObserverResult<TData, TError> {\n if (reconcileOption === false) return result\n if (typeof reconcileOption === 'function') {\n const newData = reconcileOption(store.data, result.data as TData)\n return { ...result, data: newData } as typeof result\n }\n const newData = reconcile(result.data, { key: reconcileOption })(store.data)\n return { ...result, data: newData } as typeof result\n}\n\n// Base Query Function that is used to create the query.\nexport function createBaseQuery<\n TQueryFnData,\n TError,\n TData,\n TQueryData,\n TQueryKey extends QueryKey,\n>(\n options: Accessor<\n CreateBaseQueryOptions<TQueryFnData, TError, TData, TQueryData, TQueryKey>\n >,\n Observer: typeof QueryObserver,\n queryClient?: Accessor<QueryClient>,\n) {\n const client = createMemo(() => useQueryClient(queryClient?.()))\n\n const defaultedOptions = client().defaultQueryOptions(options())\n defaultedOptions._optimisticResults = 'optimistic'\n defaultedOptions.structuralSharing = false\n if (isServer) {\n defaultedOptions.retry = false\n defaultedOptions.throwErrors = true\n }\n const observer = new Observer(client(), defaultedOptions)\n\n const [state, setState] = createStore<QueryObserverResult<TData, TError>>(\n observer.getOptimisticResult(defaultedOptions),\n )\n\n const createServerSubscriber = (\n resolve: (\n data:\n | QueryObserverResult<TData, TError>\n | PromiseLike<QueryObserverResult<TData, TError> | undefined>\n | undefined,\n ) => void,\n reject: (reason?: any) => void,\n ) => {\n return observer.subscribe((result) => {\n notifyManager.batchCalls(() => {\n const query = observer.getCurrentQuery()\n const { refetch, ...rest } = unwrap(result)\n const unwrappedResult = {\n ...rest,\n\n // hydrate() expects a QueryState object, which is similar but not\n // quite the same as a QueryObserverResult object. Thus, for now, we're\n // copying over the missing properties from state in order to support hydration\n dataUpdateCount: query.state.dataUpdateCount,\n fetchFailureCount: query.state.fetchFailureCount,\n fetchFailureReason: query.state.fetchFailureReason,\n fetchMeta: query.state.fetchMeta,\n isInvalidated: query.state.isInvalidated,\n }\n\n if (unwrappedResult.isError) {\n if (process.env['NODE_ENV'] === 'development') {\n console.error(unwrappedResult.error)\n }\n reject(unwrappedResult.error)\n }\n if (unwrappedResult.isSuccess) {\n // Use of any here is fine\n // We cannot include refetch since it is not serializable\n resolve(unwrappedResult as any)\n }\n })()\n })\n }\n\n const createClientSubscriber = () => {\n return observer.subscribe((result) => {\n notifyManager.batchCalls(() => {\n // @ts-expect-error - This will error because the reconcile option does not\n // exist on the query-core QueryObserverResult type\n const reconcileOptions = observer.options.reconcile\n // If the query has data we dont suspend but instead mutate the resource\n // This could happen when placeholderData/initialData is defined\n if (queryResource()?.data && result.data && !queryResource.loading) {\n setState((store) => {\n return reconcileFn(\n store,\n result,\n reconcileOptions === undefined ? 'id' : reconcileOptions,\n )\n })\n mutate(state)\n } else {\n setState((store) => {\n return reconcileFn(\n store,\n result,\n reconcileOptions === undefined ? 'id' : reconcileOptions,\n )\n })\n refetch()\n }\n })()\n })\n }\n\n /**\n * Unsubscribe is set lazily, so that we can subscribe after hydration when needed.\n */\n let unsubscribe: (() => void) | null = null\n\n const [queryResource, { refetch, mutate }] = createResource<\n QueryObserverResult<TData, TError> | undefined\n >(\n () => {\n return new Promise((resolve, reject) => {\n if (isServer) {\n unsubscribe = createServerSubscriber(resolve, reject)\n } else {\n if (!unsubscribe) {\n unsubscribe = createClientSubscriber()\n }\n }\n if (!state.isLoading) {\n resolve(state)\n }\n })\n },\n {\n initialValue: state,\n\n // If initialData is provided, we resolve the resource immediately\n ssrLoadFrom: options().initialData ? 'initial' : 'server',\n\n get deferStream() {\n return options().deferStream\n },\n\n /**\n * If this resource was populated on the server (either sync render, or streamed in over time), onHydrated\n * will be called. This is the point at which we can hydrate the query cache state, and setup the query subscriber.\n *\n * Leveraging onHydrated allows us to plug into the async and streaming support that solidjs resources already support.\n *\n * Note that this is only invoked on the client, for queries that were originally run on the server.\n */\n onHydrated(_k, info) {\n if (info.value) {\n hydrate(client(), {\n queries: [\n {\n queryKey: defaultedOptions.queryKey,\n queryHash: defaultedOptions.queryHash,\n state: info.value,\n },\n ],\n })\n }\n\n if (!unsubscribe) {\n /**\n * Do not refetch query on mount if query was fetched on server,\n * even if `staleTime` is not set.\n */\n const newOptions = { ...defaultedOptions }\n if (defaultedOptions.staleTime || !defaultedOptions.initialData) {\n newOptions.refetchOnMount = false\n }\n // Setting the options as an immutable object to prevent\n // wonky behavior with observer subscriptions\n observer.setOptions(newOptions)\n setState(observer.getOptimisticResult(newOptions))\n unsubscribe = createClientSubscriber()\n }\n },\n },\n )\n\n onCleanup(() => {\n if (unsubscribe) {\n unsubscribe()\n unsubscribe = null\n }\n })\n\n createComputed(\n on(\n () => client().defaultQueryOptions(options()),\n () => observer.setOptions(client().defaultQueryOptions(options())),\n {\n // Defer because we don't need to trigger on first render\n // This only cares about changes to options after the observer is created\n defer: true,\n },\n ),\n )\n\n createComputed(\n on(\n () => state.status,\n () => {\n if (\n state.isError &&\n !state.isFetching &&\n shouldThrowError(observer.options.throwErrors, [\n state.error,\n observer.getCurrentQuery(),\n ])\n ) {\n throw state.error\n }\n },\n ),\n )\n\n const handler = {\n get(\n target: QueryObserverResult<TData, TError>,\n prop: keyof QueryObserverResult<TData, TError>,\n ): any {\n const val = queryResource()?.[prop]\n return val !== undefined ? val : Reflect.get(target, prop)\n },\n }\n\n return new Proxy(state, handler)\n}\n","import type { DefaultError } from '@tanstack/query-core'\nimport type { QueryClient } from './QueryClient'\nimport { MutationObserver } from '@tanstack/query-core'\nimport { useQueryClient } from './QueryClientProvider'\nimport type {\n CreateMutateFunction,\n CreateMutationOptions,\n CreateMutationResult,\n} from './types'\nimport type { Accessor } from 'solid-js'\nimport { createComputed, onCleanup, on } from 'solid-js'\nimport { createStore } from 'solid-js/store'\nimport { shouldThrowError } from './utils'\n\n// HOOK\nexport function createMutation<\n TData = unknown,\n TError = DefaultError,\n TVariables = void,\n TContext = unknown,\n>(\n options: CreateMutationOptions<TData, TError, TVariables, TContext>,\n queryClient?: Accessor<QueryClient>,\n): CreateMutationResult<TData, TError, TVariables, TContext> {\n const client = useQueryClient(queryClient?.())\n\n const observer = new MutationObserver<TData, TError, TVariables, TContext>(\n client,\n options(),\n )\n\n const mutate: CreateMutateFunction<TData, TError, TVariables, TContext> = (\n variables,\n mutateOptions,\n ) => {\n observer.mutate(variables, mutateOptions).catch(noop)\n }\n\n const [state, setState] = createStore<\n CreateMutationResult<TData, TError, TVariables, TContext>\n >({\n ...observer.getCurrentResult(),\n mutate,\n mutateAsync: observer.getCurrentResult().mutate,\n })\n\n createComputed(() => {\n observer.setOptions(options())\n })\n\n createComputed(\n on(\n () => state.status,\n () => {\n if (\n state.isError &&\n shouldThrowError(observer.options.throwErrors, [state.error])\n ) {\n throw state.error\n }\n },\n ),\n )\n\n const unsubscribe = observer.subscribe((result) => {\n setState({\n ...result,\n mutate,\n mutateAsync: result.mutate,\n })\n })\n\n onCleanup(unsubscribe)\n\n return state\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nfunction noop() {}\n","import type {\n QueryObserver,\n QueryKey,\n DefaultError,\n InfiniteData,\n} from '@tanstack/query-core'\nimport type { QueryClient } from './QueryClient'\nimport { InfiniteQueryObserver } from '@tanstack/query-core'\nimport type {\n CreateInfiniteQueryOptions,\n CreateInfiniteQueryResult,\n} from './types'\nimport { createBaseQuery } from './createBaseQuery'\nimport { createMemo } from 'solid-js'\nimport type { Accessor } from 'solid-js'\n\nexport function createInfiniteQuery<\n TQueryFnData,\n TError = DefaultError,\n TData = InfiniteData<TQueryFnData>,\n TQueryKey extends QueryKey = QueryKey,\n TPageParam = unknown,\n>(\n options: CreateInfiniteQueryOptions<\n TQueryFnData,\n TError,\n TData,\n TQueryKey,\n TPageParam\n >,\n queryClient?: Accessor<QueryClient>,\n): CreateInfiniteQueryResult<TData, TError> {\n return createBaseQuery(\n createMemo(() => options()),\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n InfiniteQueryObserver as typeof QueryObserver,\n queryClient,\n ) as CreateInfiniteQueryResult<TData, TError>\n}\n","import type {\n QueriesPlaceholderDataFunction,\n QueryFunction,\n QueryKey,\n DefaultError,\n} from '@tanstack/query-core'\nimport { notifyManager, QueriesObserver } from '@tanstack/query-core'\nimport type { QueryClient } from './QueryClient'\nimport type { Accessor } from 'solid-js'\nimport { createComputed, onCleanup, onMount } from 'solid-js'\nimport { createStore, unwrap } from 'solid-js/store'\nimport { useQueryClient } from './QueryClientProvider'\nimport type { CreateQueryResult, SolidQueryOptions } from './types'\n\n// This defines the `UseQueryOptions` that are accepted in `QueriesOptions` & `GetOptions`.\n// `placeholderData` function does not have a parameter\ntype CreateQueryOptionsForCreateQueries<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n> = Omit<\n SolidQueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n 'placeholderData'\n> & {\n placeholderData?: TQueryFnData | QueriesPlaceholderDataFunction<TQueryFnData>\n}\n\n// Avoid TS depth-limit error in case of large array literal\ntype MAXIMUM_DEPTH = 20\n\ntype GetOptions<T> =\n // Part 1: responsible for applying explicit type parameter to function arguments, if object { queryFnData: TQueryFnData, error: TError, data: TData }\n T extends {\n queryFnData: infer TQueryFnData\n error?: infer TError\n data: infer TData\n }\n ? CreateQueryOptionsForCreateQueries<TQueryFnData, TError, TData>\n : T extends { queryFnData: infer TQueryFnData; error?: infer TError }\n ? CreateQueryOptionsForCreateQueries<TQueryFnData, TError>\n : T extends { data: infer TData; error?: infer TError }\n ? CreateQueryOptionsForCreateQueries<unknown, TError, TData>\n : // Part 2: responsible for applying explicit type parameter to function arguments, if tuple [TQueryFnData, TError, TData]\n T extends [infer TQueryFnData, infer TError, infer TData]\n ? CreateQueryOptionsForCreateQueries<TQueryFnData, TError, TData>\n : T extends [infer TQueryFnData, infer TError]\n ? CreateQueryOptionsForCreateQueries<TQueryFnData, TError>\n : T extends [infer TQueryFnData]\n ? CreateQueryOptionsForCreateQueries<TQueryFnData>\n : // Part 3: responsible for inferring and enforcing type if no explicit parameter was provided\n T extends {\n queryFn?: QueryFunction<infer TQueryFnData, infer TQueryKey>\n select: (data: any) => infer TData\n }\n ? CreateQueryOptionsForCreateQueries<TQueryFnData, Error, TData, TQueryKey>\n : T extends { queryFn?: QueryFunction<infer TQueryFnData, infer TQueryKey> }\n ? CreateQueryOptionsForCreateQueries<\n TQueryFnData,\n Error,\n TQueryFnData,\n TQueryKey\n >\n : // Fallback\n CreateQueryOptionsForCreateQueries\n\ntype GetResults<T> =\n // Part 1: responsible for mapping explicit type parameter to function result, if object\n T extends { queryFnData: any; error?: infer TError; data: infer TData }\n ? CreateQueryResult<TData, TError>\n : T extends { queryFnData: infer TQueryFnData; error?: infer TError }\n ? CreateQueryResult<TQueryFnData, TError>\n : T extends { data: infer TData; error?: infer TError }\n ? CreateQueryResult<TData, TError>\n : // Part 2: responsible for mapping explicit type parameter to function result, if tuple\n T extends [any, infer TError, infer TData]\n ? CreateQueryResult<TData, TError>\n : T extends [infer TQueryFnData, infer TError]\n ? CreateQueryResult<TQueryFnData, TError>\n : T extends [infer TQueryFnData]\n ? CreateQueryResult<TQueryFnData>\n : // Part 3: responsible for mapping inferred type to results, if no explicit parameter was provided\n T extends {\n queryFn?: QueryFunction<unknown, any>\n select: (data: any) => infer TData\n }\n ? CreateQueryResult<TData>\n : T extends { queryFn?: QueryFunction<infer TQueryFnData, any> }\n ? CreateQueryResult<TQueryFnData>\n : // Fallback\n CreateQueryResult\n\n/**\n * QueriesOptions reducer recursively unwraps function arguments to infer/enforce type param\n */\nexport type QueriesOptions<\n T extends any[],\n Result extends any[] = [],\n Depth extends ReadonlyArray<number> = [],\n> = Depth['length'] extends MAXIMUM_DEPTH\n ? CreateQueryOptionsForCreateQueries[]\n : T extends []\n ? []\n : T extends [infer Head]\n ? [...Result, GetOptions<Head>]\n : T extends [infer Head, ...infer Tail]\n ? QueriesOptions<[...Tail], [...Result, GetOptions<Head>], [...Depth, 1]>\n : unknown[] extends T\n ? T\n : // If T is *some* array but we couldn't assign unknown[] to it, then it must hold some known/homogenous type!\n // use this to infer the param types in the case of Array.map() argument\n T extends CreateQueryOptionsForCreateQueries<\n infer TQueryFnData,\n infer TError,\n infer TData,\n infer TQueryKey\n >[]\n ? CreateQueryOptionsForCreateQueries<TQueryFnData, TError, TData, TQueryKey>[]\n : // Fallback\n CreateQueryOptionsForCreateQueries[]\n\n/**\n * QueriesResults reducer recursively maps type param to results\n */\nexport type QueriesResults<\n T extends any[],\n Result extends any[] = [],\n Depth extends ReadonlyArray<number> = [],\n> = Depth['length'] extends MAXIMUM_DEPTH\n ? CreateQueryResult[]\n : T extends []\n ? []\n : T extends [infer Head]\n ? [...Result, GetResults<Head>]\n : T extends [infer Head, ...infer Tail]\n ? QueriesResults<[...Tail], [...Result, GetResults<Head>], [...Depth, 1]>\n : T extends CreateQueryOptionsForCreateQueries<\n infer TQueryFnData,\n infer TError,\n infer TData,\n any\n >[]\n ? // Dynamic-size (homogenous) UseQueryOptions array: map directly to array of results\n CreateQueryResult<\n unknown extends TData ? TQueryFnData : TData,\n unknown extends TError ? DefaultError : TError\n >[]\n : // Fallback\n CreateQueryResult[]\n\nexport function createQueries<T extends any[]>(\n queriesOptions: Accessor<{\n queries: readonly [...QueriesOptions<T>]\n }>,\n queryClient?: Accessor<QueryClient>,\n): QueriesResults<T> {\n const client = useQueryClient(queryClient?.())\n\n const defaultedQueries = queriesOptions().queries.map((options) => {\n const defaultedOptions = client.defaultQueryOptions(options)\n defaultedOptions._optimisticResults = 'optimistic'\n return defaultedOptions\n })\n\n const observer = new QueriesObserver(client, defaultedQueries)\n\n const [state, setState] = createStore(\n observer.getOptimisticResult(defaultedQueries),\n )\n\n const unsubscribe = observer.subscribe((result) => {\n notifyManager.batchCalls(() => {\n setState(unwrap(result))\n })()\n })\n\n onCleanup(unsubscribe)\n\n onMount(() => {\n observer.setQueries(defaultedQueries, { listeners: false })\n })\n\n createComputed(() => {\n const updatedQueries = queriesOptions().queries.map((options) => {\n const defaultedOptions = client.defaultQueryOptions(options)\n defaultedOptions._optimisticResults = 'optimistic'\n return defaultedOptions\n })\n observer.setQueries(updatedQueries)\n })\n\n return state as QueriesResults<T>\n}\n","import type { QueryKey, DefaultError } from '@tanstack/query-core'\nimport { QueryObserver } from '@tanstack/query-core'\nimport type { QueryClient } from './QueryClient'\nimport type { Accessor } from 'solid-js'\nimport { createMemo } from 'solid-js'\nimport { createBaseQuery } from './createBaseQuery'\nimport type {\n CreateQueryOptions,\n CreateQueryResult,\n DefinedCreateQueryResult,\n FunctionedParams,\n SolidQueryOptions,\n} from './types'\n\ntype UndefinedInitialDataOptions<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n> = FunctionedParams<\n SolidQueryOptions<TQueryFnData, TError, TData, TQueryKey> & {\n initialData?: undefined\n }\n>\n\ntype DefinedInitialDataOptions<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n> = FunctionedParams<\n SolidQueryOptions<TQueryFnData, TError, TData, TQueryKey> & {\n initialData: TQueryFnData | (() => TQueryFnData)\n }\n>\n\nexport function createQuery<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n>(\n options: UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>,\n queryClient?: () => QueryClient,\n): CreateQueryResult<TData, TError>\n\nexport function createQuery<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n>(\n options: DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>,\n queryClient?: () => QueryClient,\n): DefinedCreateQueryResult<TData, TError>\nexport function createQuery<\n TQueryFnData,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n>(\n options: CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n queryClient?: Accessor<QueryClient>,\n) {\n return createBaseQuery(\n createMemo(() => options()),\n QueryObserver,\n queryClient,\n )\n}\n","import type { QueryFilters } from '@tanstack/query-core'\nimport type { QueryClient } from './QueryClient'\nimport type { Accessor } from 'solid-js'\nimport { createMemo, createSignal, onCleanup } from 'solid-js'\nimport { useQueryClient } from './QueryClientProvider'\n\nexport function useIsFetching(\n filters?: Accessor<QueryFilters>,\n queryClient?: Accessor<QueryClient>,\n): Accessor<number> {\n const client = createMemo(() => useQueryClient(queryClient?.()))\n const queryCache = createMemo(() => client().getQueryCache())\n\n const [fetches, setFetches] = createSignal(client().isFetching(filters?.()))\n\n const unsubscribe = queryCache().subscribe(() => {\n setFetches(client().isFetching(filters?.()))\n })\n\n onCleanup(unsubscribe)\n\n return fetches\n}\n","import type { MutationFilters } from '@tanstack/query-core'\nimport type { QueryClient } from './QueryClient'\nimport { useQueryClient } from './QueryClientProvider'\nimport type { Accessor } from 'solid-js'\nimport { createSignal, onCleanup, createMemo } from 'solid-js'\n\nexport function useIsMutating(\n filters?: Accessor<MutationFilters>,\n queryClient?: Accessor<QueryClient>,\n): Accessor<number> {\n const client = createMemo(() => useQueryClient(queryClient?.()))\n const mutationCache = createMemo(() => client().getMutationCache())\n\n const [mutations, setMutations] = createSignal(\n client().isMutating(filters?.()),\n )\n\n const unsubscribe = mutationCache().subscribe((_result) => {\n setMutations(client().isMutating(filters?.()))\n })\n\n onCleanup(unsubscribe)\n\n return mutations\n}\n"],"names":["notifyManager","setBatchNotifyFunction","batch","QueryClient","QueryCoreClient","constructor","config","super","QueryClientContext","createContext","undefined","useQueryClient","queryClient","client","useContext","Error","shouldThrowError","throwError","params","reconcileFn","store","result","reconcileOption","newData","data","reconcile","key","createBaseQuery","options","Observer","createMemo","defaultedOptions","defaultQueryOptions","_optimisticResults","structuralSharing","isServer","retry","throwErrors","observer","state","setState","createStore","getOptimisticResult","createClientSubscriber","subscribe","batchCalls","reconcileOptions","queryResource","loading","mutate","refetch","unsubscribe","createResource","Promise","resolve","reject","query","getCurrentQuery","rest","unwrap","unwrappedResult","dataUpdateCount","fetchFailureCount","fetchFailureReason","fetchMeta","isInvalidated","isError","process","env","console","error","isSuccess","createServerSubscriber","isLoading","initialValue","ssrLoadFrom","initialData","deferStream","onHydrated","_k","info","value","hydrate","queries","queryKey","queryHash","newOptions","staleTime","refetchOnMount","setOptions","onCleanup","createComputed","on","defer","status","isFetching","Proxy","get","target","prop","val","Reflect","noop","props","onMount","mount","unmount","_$createComponent","createComponent","Provider","children","InfiniteQueryObserver","MutationObserver","variables","mutateOptions","catch","getCurrentResult","mutateAsync","queriesOptions","defaultedQueries","map","QueriesObserver","setQueries","listeners","updatedQueries","QueryObserver","filters","queryCache","getQueryCache","fetches","setFetches","createSignal","mutationCache","getMutationCache","mutations","setMutations","isMutating","_result"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tanstack/solid-query",
3
- "version": "5.0.0-alpha.2",
3
+ "version": "5.0.0-alpha.21",
4
4
  "description": "Primitives for managing, caching and syncing asynchronous and remote data in Solid",
5
5
  "author": "tannerlinsley",
6
6
  "license": "MIT",
@@ -40,20 +40,20 @@
40
40
  "src"
41
41
  ],
42
42
  "devDependencies": {
43
- "solid-jest": "^0.2.0"
43
+ "vite-plugin-solid": "^2.3.9"
44
44
  },
45
45
  "dependencies": {
46
- "@tanstack/query-core": "5.0.0-alpha.2"
46
+ "@tanstack/query-core": "5.0.0-alpha.21"
47
47
  },
48
48
  "peerDependencies": {
49
- "solid-js": "^1.6.2"
49
+ "solid-js": "^1.6.13"
50
50
  },
51
51
  "peerDependenciesMeta": {},
52
52
  "scripts": {
53
53
  "clean": "rimraf ./build",
54
54
  "test:eslint": "eslint --ext .ts,.tsx ./src",
55
55
  "test:types": "tsc",
56
- "test:lib": "jest --config ./jest.config.ts",
56
+ "test:lib": "vitest run --coverage",
57
57
  "test:lib:dev": "pnpm run test:lib --watch",
58
58
  "build:types": "tsc --build"
59
59
  }
@@ -0,0 +1,84 @@
1
+ import type {
2
+ QueryClientConfig as QueryCoreClientConfig,
3
+ DefaultOptions as CoreDefaultOptions,
4
+ QueryObserverOptions as QueryCoreObserverOptions,
5
+ InfiniteQueryObserverOptions as QueryCoreInfiniteQueryObserverOptions,
6
+ DefaultError,
7
+ QueryKey,
8
+ } from '@tanstack/query-core'
9
+ import { QueryClient as QueryCoreClient } from '@tanstack/query-core'
10
+
11
+ export interface QueryObserverOptions<
12
+ TQueryFnData = unknown,
13
+ TError = DefaultError,
14
+ TData = TQueryFnData,
15
+ TQueryData = TQueryFnData,
16
+ TQueryKey extends QueryKey = QueryKey,
17
+ TPageParam = never,
18
+ > extends Omit<
19
+ QueryCoreObserverOptions<
20
+ TQueryFnData,
21
+ TError,
22
+ TData,
23
+ TQueryData,
24
+ TQueryKey,
25
+ TPageParam
26
+ >,
27
+ 'structuralSharing'
28
+ > {
29
+ /**
30
+ * Set this to a reconciliation key to enable reconciliation between query results.
31
+ * Set this to `false` to disable reconciliation between query results.
32
+ * Set this to a function which accepts the old and new data and returns resolved data of the same type to implement custom reconciliation logic.
33
+ * Defaults reconciliation key to `id`.
34
+ */
35
+ reconcile?:
36
+ | string
37
+ | false
38
+ | ((oldData: TData | undefined, newData: TData) => TData)
39
+ }
40
+
41
+ export interface InfiniteQueryObserverOptions<
42
+ TQueryFnData = unknown,
43
+ TError = DefaultError,
44
+ TData = TQueryFnData,
45
+ TQueryData = TQueryFnData,
46
+ TQueryKey extends QueryKey = QueryKey,
47
+ TPageParam = unknown,
48
+ > extends Omit<
49
+ QueryCoreInfiniteQueryObserverOptions<
50
+ TQueryFnData,
51
+ TError,
52
+ TData,
53
+ TQueryData,
54
+ TQueryKey,
55
+ TPageParam
56
+ >,
57
+ 'structuralSharing'
58
+ > {
59
+ /**
60
+ * Set this to a reconciliation key to enable reconciliation between query results.
61
+ * Set this to `false` to disable reconciliation between query results.
62
+ * Set this to a function which accepts the old and new data and returns resolved data of the same type to implement custom reconciliation logic.
63
+ * Defaults reconciliation key to `id`.
64
+ */
65
+ reconcile?:
66
+ | string
67
+ | false
68
+ | ((oldData: TData | undefined, newData: TData) => TData)
69
+ }
70
+
71
+ export interface DefaultOptions<TError = DefaultError>
72
+ extends CoreDefaultOptions<TError> {
73
+ queries?: QueryObserverOptions<unknown, TError>
74
+ }
75
+
76
+ export interface QueryClientConfig extends QueryCoreClientConfig {
77
+ defaultOptions?: DefaultOptions
78
+ }
79
+
80
+ export class QueryClient extends QueryCoreClient {
81
+ constructor(config: QueryClientConfig = {}) {
82
+ super(config)
83
+ }
84
+ }
@@ -1,4 +1,4 @@
1
- import type { QueryClient } from '@tanstack/query-core'
1
+ import type { QueryClient } from './QueryClient'
2
2
  import type { JSX } from 'solid-js'
3
3
  import { createContext, useContext, onMount, onCleanup } from 'solid-js'
4
4
 
@@ -4,6 +4,7 @@ import { queryKey } from './utils'
4
4
  import { QueryCache } from '@tanstack/query-core'
5
5
  import { createQuery, QueryClientProvider, useQueryClient } from '..'
6
6
  import { createQueryClient, sleep } from './utils'
7
+ import { vi } from 'vitest'
7
8
 
8
9
  describe('QueryClientProvider', () => {
9
10
  it('sets a specific cache for all queries to use', async () => {
@@ -145,7 +146,7 @@ describe('QueryClientProvider', () => {
145
146
 
146
147
  describe('useQueryClient', () => {
147
148
  it('should throw an error if no query client has been set', () => {
148
- const consoleMock = jest
149
+ const consoleMock = vi
149
150
  .spyOn(console, 'error')
150
151
  .mockImplementation(() => undefined)
151
152
 
@@ -10,6 +10,7 @@ import {
10
10
  Index,
11
11
  Match,
12
12
  Switch,
13
+ on,
13
14
  } from 'solid-js'
14
15
  import type {
15
16
  CreateInfiniteQueryResult,
@@ -23,6 +24,8 @@ import {
23
24
  keepPreviousData,
24
25
  } from '..'
25
26
  import { Blink, queryKey, setActTimeout } from './utils'
27
+ import { vi } from 'vitest'
28
+ import type { Mock } from 'vitest'
26
29
 
27
30
  interface Result {
28
31
  items: number[]
@@ -191,7 +194,8 @@ describe('useInfiniteQuery', () => {
191
194
 
192
195
  it('should keep the previous data when placeholderData is set', async () => {
193
196
  const key = queryKey()
194
- const states: CreateInfiniteQueryResult<InfiniteData<string>>[] = []
197
+ const states: Partial<CreateInfiniteQueryResult<InfiniteData<string>>>[] =
198
+ []
195
199
 
196
200
  function Page() {
197
201
  const [order, setOrder] = createSignal('desc')
@@ -210,7 +214,16 @@ describe('useInfiniteQuery', () => {
210
214
  }))
211
215
 
212
216
  createRenderEffect(() => {
213
- states.push({ ...state })
217
+ states.push({
218
+ data: state.data ? JSON.parse(JSON.stringify(state.data)) : undefined,
219
+ hasNextPage: state.hasNextPage,
220
+ hasPreviousPage: state.hasPreviousPage,
221
+ isFetching: state.isFetching,
222
+ isFetchingNextPage: state.isFetchingNextPage,
223
+ isFetchingPreviousPage: state.isFetchingPreviousPage,
224
+ isSuccess: state.isSuccess,
225
+ isPlaceholderData: state.isPlaceholderData,
226
+ })
214
227
  })
215
228
 
216
229
  return (
@@ -373,7 +386,8 @@ describe('useInfiniteQuery', () => {
373
386
 
374
387
  it('should be able to reverse the data', async () => {
375
388
  const key = queryKey()
376
- const states: CreateInfiniteQueryResult<InfiniteData<number>>[] = []
389
+ const states: Partial<CreateInfiniteQueryResult<InfiniteData<number>>>[] =
390
+ []
377
391
 
378
392
  function Page() {
379
393
  const state = createInfiniteQuery(() => ({
@@ -392,9 +406,19 @@ describe('useInfiniteQuery', () => {
392
406
  defaultPageParam: 0,
393
407
  }))
394
408
 
395
- createRenderEffect(() => {
396
- states.push({ ...state })
397
- })
409
+ createRenderEffect(
410
+ on(
411
+ () => ({ ...state }),
412
+ () => {
413
+ states.push({
414
+ data: state.data
415
+ ? JSON.parse(JSON.stringify(state.data))
416
+ : undefined,
417
+ isSuccess: state.isSuccess,
418
+ })
419
+ },
420
+ ),
421
+ )
398
422
 
399
423
  return (
400
424
  <div>
@@ -437,7 +461,8 @@ describe('useInfiniteQuery', () => {
437
461
 
438
462
  it('should be able to fetch a previous page', async () => {
439
463
  const key = queryKey()
440
- const states: CreateInfiniteQueryResult<InfiniteData<number>>[] = []
464
+ const states: Partial<CreateInfiniteQueryResult<InfiniteData<number>>>[] =
465
+ []
441
466
 
442
467
  function Page() {
443
468
  const start = 10
@@ -454,7 +479,15 @@ describe('useInfiniteQuery', () => {
454
479
  }))
455
480
 
456
481
  createRenderEffect(() => {
457
- states.push({ ...state })
482
+ states.push({
483
+ data: state.data ? JSON.parse(JSON.stringify(state.data)) : undefined,
484
+ hasNextPage: state.hasNextPage,
485
+ hasPreviousPage: state.hasPreviousPage,
486
+ isFetching: state.isFetching,
487
+ isFetchingNextPage: state.isFetchingNextPage,
488
+ isFetchingPreviousPage: state.isFetchingPreviousPage,
489
+ isSuccess: state.isSuccess,
490
+ })
458
491
  })
459
492
 
460
493
  createEffect(() => {
@@ -516,7 +549,8 @@ describe('useInfiniteQuery', () => {
516
549
 
517
550
  it('should be able to refetch when providing page params automatically', async () => {
518
551
  const key = queryKey()
519
- const states: CreateInfiniteQueryResult<InfiniteData<number>>[] = []
552
+ const states: Partial<CreateInfiniteQueryResult<InfiniteData<number>>>[] =
553
+ []
520
554
 
521
555
  function Page() {
522
556
  const state = createInfiniteQuery(() => ({
@@ -533,7 +567,13 @@ describe('useInfiniteQuery', () => {
533
567
  }))
534
568
 
535
569
  createRenderEffect(() => {
536
- states.push({ ...state })
570
+ states.push({
571
+ data: state.data ? JSON.parse(JSON.stringify(state.data)) : undefined,
572
+ isFetching: state.isFetching,
573
+ isFetchingNextPage: state.isFetchingNextPage,
574
+ isRefetching: state.isRefetching,
575
+ isFetchingPreviousPage: state.isFetchingPreviousPage,
576
+ })
537
577
  })
538
578
 
539
579
  return (
@@ -630,7 +670,8 @@ describe('useInfiniteQuery', () => {
630
670
 
631
671
  it('should silently cancel any ongoing fetch when fetching more', async () => {
632
672
  const key = queryKey()
633
- const states: CreateInfiniteQueryResult<InfiniteData<number>>[] = []
673
+ const states: Partial<CreateInfiniteQueryResult<InfiniteData<number>>>[] =
674
+ []
634
675
 
635
676
  function Page() {
636
677
  const start = 10
@@ -647,7 +688,13 @@ describe('useInfiniteQuery', () => {
647
688
  }))
648
689
 
649
690
  createRenderEffect(() => {
650
- states.push({ ...state })
691
+ states.push({
692
+ hasNextPage: state.hasNextPage,
693
+ data: state.data ? JSON.parse(JSON.stringify(state.data)) : undefined,
694
+ isFetching: state.isFetching,
695
+ isFetchingNextPage: state.isFetchingNextPage,
696
+ isSuccess: state.isSuccess,
697
+ })
651
698
  })
652
699
 
653
700
  createEffect(() => {
@@ -712,14 +759,14 @@ describe('useInfiniteQuery', () => {
712
759
  it('should silently cancel an ongoing fetchNextPage request when another fetchNextPage is invoked', async () => {
713
760
  const key = queryKey()
714
761
  const start = 10
715
- const onAborts: jest.Mock<any, any>[] = []
716
- const abortListeners: jest.Mock<any, any>[] = []
717
- const fetchPage = jest.fn<
718
- Promise<number>,
719
- [QueryFunctionContext<typeof key, number>]
762
+ const onAborts: Mock<any, any>[] = []
763
+ const abortListeners: Mock<any, any>[] = []
764
+ const fetchPage = vi.fn<
765
+ [QueryFunctionContext<typeof key, number>],
766
+ Promise<number>
720
767
  >(async ({ pageParam, signal }) => {
721
- const onAbort = jest.fn()
722
- const abortListener = jest.fn()
768
+ const onAbort = vi.fn()
769
+ const abortListener = vi.fn()
723
770
  onAborts.push(onAbort)
724
771
  abortListeners.push(abortListener)
725
772
  signal.onabort = onAbort
@@ -794,14 +841,14 @@ describe('useInfiniteQuery', () => {
794
841
  it('should not cancel an ongoing fetchNextPage request when another fetchNextPage is invoked if `cancelRefetch: false` is used ', async () => {
795
842
  const key = queryKey()
796
843
  const start = 10
797
- const onAborts: jest.Mock<any, any>[] = []
798
- const abortListeners: jest.Mock<any, any>[] = []
799
- const fetchPage = jest.fn<
800
- Promise<number>,
801
- [QueryFunctionContext<typeof key, number>]
844
+ const onAborts: Mock<any, any>[] = []
845
+ const abortListeners: Mock<any, any>[] = []
846
+ const fetchPage = vi.fn<
847
+ [QueryFunctionContext<typeof key, number>],
848
+ Promise<number>
802
849
  >(async ({ pageParam, signal }) => {
803
- const onAbort = jest.fn()
804
- const abortListener = jest.fn()
850
+ const onAbort = vi.fn()
851
+ const abortListener = vi.fn()
805
852
  onAborts.push(onAbort)
806
853
  abortListeners.push(abortListener)
807
854
  signal.onabort = onAbort
@@ -976,7 +1023,8 @@ describe('useInfiniteQuery', () => {
976
1023
 
977
1024
  it('should be able to set new pages with the query client', async () => {
978
1025
  const key = queryKey()
979
- const states: CreateInfiniteQueryResult<InfiniteData<number>>[] = []
1026
+ const states: Partial<CreateInfiniteQueryResult<InfiniteData<number>>>[] =
1027
+ []
980
1028
 
981
1029
  function Page() {
982
1030
  const [firstPage, setFirstPage] = createSignal(0)
@@ -994,7 +1042,13 @@ describe('useInfiniteQuery', () => {
994
1042
  }))
995
1043
 
996
1044
  createRenderEffect(() => {
997
- states.push({ ...state })
1045
+ states.push({
1046
+ hasNextPage: state.hasNextPage,
1047
+ data: state.data ? JSON.parse(JSON.stringify(state.data)) : undefined,
1048
+ isFetching: state.isFetching,
1049
+ isFetchingNextPage: state.isFetchingNextPage,
1050
+ isSuccess: state.isSuccess,
1051
+ })
998
1052
  })
999
1053
 
1000
1054
  createEffect(() => {
@@ -1064,7 +1118,8 @@ describe('useInfiniteQuery', () => {
1064
1118
 
1065
1119
  it('should only refetch the first page when initialData is provided', async () => {
1066
1120
  const key = queryKey()
1067
- const states: CreateInfiniteQueryResult<InfiniteData<number>>[] = []
1121
+ const states: Partial<CreateInfiniteQueryResult<InfiniteData<number>>>[] =
1122
+ []
1068
1123
 
1069
1124
  function Page() {
1070
1125
  const state = createInfiniteQuery(() => ({
@@ -1081,7 +1136,13 @@ describe('useInfiniteQuery', () => {
1081
1136
  }))
1082
1137
 
1083
1138
  createRenderEffect(() => {
1084
- states.push({ ...state })
1139
+ states.push({
1140
+ data: JSON.parse(JSON.stringify(state.data)),
1141
+ hasNextPage: state.hasNextPage,
1142
+ isFetching: state.isFetching,
1143
+ isFetchingNextPage: state.isFetchingNextPage,
1144
+ isSuccess: state.isSuccess,
1145
+ })
1085
1146
  })
1086
1147
 
1087
1148
  createEffect(() => {
@@ -1396,7 +1457,7 @@ describe('useInfiniteQuery', () => {
1396
1457
  >
1397
1458
  <Match when={state.status === 'pending'}>Loading...</Match>
1398
1459
  <Match when={state.status === 'error'}>
1399
- <span>Error: {state.error!.message}</span>
1460
+ <span>Error: {state.error?.message}</span>
1400
1461
  </Match>
1401
1462
  </Switch>
1402
1463
  </div>
@@ -1523,7 +1584,7 @@ describe('useInfiniteQuery', () => {
1523
1584
  >
1524
1585
  <Match when={state.status === 'pending'}>Loading...</Match>
1525
1586
  <Match when={state.status === 'error'}>
1526
- <span>Error: {state.error!.message}</span>
1587
+ <span>Error: {state.error?.message}</span>
1527
1588
  </Match>
1528
1589
  </Switch>
1529
1590
  </div>
@@ -1587,11 +1648,11 @@ describe('useInfiniteQuery', () => {
1587
1648
 
1588
1649
  it('should cancel the query function when there are no more subscriptions', async () => {
1589
1650
  const key = queryKey()
1590
- let cancelFn: jest.Mock = jest.fn()
1651
+ let cancelFn: Mock = vi.fn()
1591
1652
 
1592
1653
  const queryFn = ({ signal }: { signal?: AbortSignal }) => {
1593
1654
  const promise = new Promise<string>((resolve, reject) => {
1594
- cancelFn = jest.fn(() => reject('Cancelled'))
1655
+ cancelFn = vi.fn(() => reject('Cancelled'))
1595
1656
  signal?.addEventListener('abort', cancelFn)
1596
1657
  sleep(20).then(() => resolve('OK'))
1597
1658
  })