@tanstack/solid-query 5.0.0-alpha.4 → 5.0.0-alpha.6
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.
- package/build/source/__tests__/QueryClientProvider.test.jsx +2 -1
- package/build/source/__tests__/createInfiniteQuery.test.jsx +11 -10
- package/build/source/__tests__/createMutation.test.jsx +19 -18
- package/build/source/__tests__/createQueries.test.jsx +2 -17
- package/build/source/__tests__/createQuery.test.jsx +26 -25
- package/build/source/__tests__/suspense.test.jsx +6 -5
- package/build/source/__tests__/useIsMutating.test.jsx +23 -22
- package/build/source/__tests__/utils.jsx +3 -2
- package/build/types/__tests__/utils.d.ts +2 -3
- package/build/umd/index.js.map +1 -1
- package/package.json +4 -4
- package/src/__tests__/QueryClientProvider.test.tsx +2 -1
- package/src/__tests__/createInfiniteQuery.test.tsx +20 -18
- package/src/__tests__/createMutation.test.tsx +19 -18
- package/src/__tests__/createQueries.test.tsx +2 -26
- package/src/__tests__/createQuery.test.tsx +27 -25
- package/src/__tests__/suspense.test.tsx +6 -5
- package/src/__tests__/useIsMutating.test.tsx +29 -33
- package/src/__tests__/utils.tsx +3 -2
package/build/umd/index.js.map
CHANGED
|
@@ -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?: Accessor<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 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 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'\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 QueryClient,\n QueryFunction,\n QueryKey,\n DefaultError,\n} from '@tanstack/query-core'\nimport { notifyManager, QueriesObserver } from '@tanstack/query-core'\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 { QueryClient, QueryKey, DefaultError } from '@tanstack/query-core'\nimport { QueryObserver } from '@tanstack/query-core'\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 { QueryClient, QueryFilters } from '@tanstack/query-core'\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, QueryClient } from '@tanstack/query-core'\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","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","filters","queryCache","getQueryCache","fetches","setFetches","createSignal","mutationCache","getMutationCache","mutations","setMutations","isMutating","_result"],"mappings":"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"}
|
|
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?: Accessor<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 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 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'\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 QueryClient,\n QueryFunction,\n QueryKey,\n DefaultError,\n} from '@tanstack/query-core'\nimport { notifyManager, QueriesObserver } from '@tanstack/query-core'\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 { QueryClient, QueryKey, DefaultError } from '@tanstack/query-core'\nimport { QueryObserver } from '@tanstack/query-core'\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 { QueryClient, QueryFilters } from '@tanstack/query-core'\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, QueryClient } from '@tanstack/query-core'\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","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","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.
|
|
3
|
+
"version": "5.0.0-alpha.6",
|
|
4
4
|
"description": "Primitives for managing, caching and syncing asynchronous and remote data in Solid",
|
|
5
5
|
"author": "tannerlinsley",
|
|
6
6
|
"license": "MIT",
|
|
@@ -40,10 +40,10 @@
|
|
|
40
40
|
"src"
|
|
41
41
|
],
|
|
42
42
|
"devDependencies": {
|
|
43
|
-
"solid
|
|
43
|
+
"vite-plugin-solid": "^2.3.9"
|
|
44
44
|
},
|
|
45
45
|
"dependencies": {
|
|
46
|
-
"@tanstack/query-core": "5.0.0-alpha.
|
|
46
|
+
"@tanstack/query-core": "5.0.0-alpha.6"
|
|
47
47
|
},
|
|
48
48
|
"peerDependencies": {
|
|
49
49
|
"solid-js": "^1.6.2"
|
|
@@ -53,7 +53,7 @@
|
|
|
53
53
|
"clean": "rimraf ./build",
|
|
54
54
|
"test:eslint": "eslint --ext .ts,.tsx ./src",
|
|
55
55
|
"test:types": "tsc",
|
|
56
|
-
"test:lib": "
|
|
56
|
+
"test:lib": "vitest run --coverage",
|
|
57
57
|
"test:lib:dev": "pnpm run test:lib --watch",
|
|
58
58
|
"build:types": "tsc --build"
|
|
59
59
|
}
|
|
@@ -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 =
|
|
149
|
+
const consoleMock = vi
|
|
149
150
|
.spyOn(console, 'error')
|
|
150
151
|
.mockImplementation(() => undefined)
|
|
151
152
|
|
|
@@ -23,6 +23,8 @@ import {
|
|
|
23
23
|
keepPreviousData,
|
|
24
24
|
} from '..'
|
|
25
25
|
import { Blink, queryKey, setActTimeout } from './utils'
|
|
26
|
+
import { vi } from 'vitest'
|
|
27
|
+
import type { Mock } from 'vitest'
|
|
26
28
|
|
|
27
29
|
interface Result {
|
|
28
30
|
items: number[]
|
|
@@ -712,14 +714,14 @@ describe('useInfiniteQuery', () => {
|
|
|
712
714
|
it('should silently cancel an ongoing fetchNextPage request when another fetchNextPage is invoked', async () => {
|
|
713
715
|
const key = queryKey()
|
|
714
716
|
const start = 10
|
|
715
|
-
const onAborts:
|
|
716
|
-
const abortListeners:
|
|
717
|
-
const fetchPage =
|
|
718
|
-
|
|
719
|
-
|
|
717
|
+
const onAborts: Mock<any, any>[] = []
|
|
718
|
+
const abortListeners: Mock<any, any>[] = []
|
|
719
|
+
const fetchPage = vi.fn<
|
|
720
|
+
[QueryFunctionContext<typeof key, number>],
|
|
721
|
+
Promise<number>
|
|
720
722
|
>(async ({ pageParam, signal }) => {
|
|
721
|
-
const onAbort =
|
|
722
|
-
const abortListener =
|
|
723
|
+
const onAbort = vi.fn()
|
|
724
|
+
const abortListener = vi.fn()
|
|
723
725
|
onAborts.push(onAbort)
|
|
724
726
|
abortListeners.push(abortListener)
|
|
725
727
|
signal.onabort = onAbort
|
|
@@ -794,14 +796,14 @@ describe('useInfiniteQuery', () => {
|
|
|
794
796
|
it('should not cancel an ongoing fetchNextPage request when another fetchNextPage is invoked if `cancelRefetch: false` is used ', async () => {
|
|
795
797
|
const key = queryKey()
|
|
796
798
|
const start = 10
|
|
797
|
-
const onAborts:
|
|
798
|
-
const abortListeners:
|
|
799
|
-
const fetchPage =
|
|
800
|
-
|
|
801
|
-
|
|
799
|
+
const onAborts: Mock<any, any>[] = []
|
|
800
|
+
const abortListeners: Mock<any, any>[] = []
|
|
801
|
+
const fetchPage = vi.fn<
|
|
802
|
+
[QueryFunctionContext<typeof key, number>],
|
|
803
|
+
Promise<number>
|
|
802
804
|
>(async ({ pageParam, signal }) => {
|
|
803
|
-
const onAbort =
|
|
804
|
-
const abortListener =
|
|
805
|
+
const onAbort = vi.fn()
|
|
806
|
+
const abortListener = vi.fn()
|
|
805
807
|
onAborts.push(onAbort)
|
|
806
808
|
abortListeners.push(abortListener)
|
|
807
809
|
signal.onabort = onAbort
|
|
@@ -1396,7 +1398,7 @@ describe('useInfiniteQuery', () => {
|
|
|
1396
1398
|
>
|
|
1397
1399
|
<Match when={state.status === 'pending'}>Loading...</Match>
|
|
1398
1400
|
<Match when={state.status === 'error'}>
|
|
1399
|
-
<span>Error: {state.error
|
|
1401
|
+
<span>Error: {state.error?.message}</span>
|
|
1400
1402
|
</Match>
|
|
1401
1403
|
</Switch>
|
|
1402
1404
|
</div>
|
|
@@ -1523,7 +1525,7 @@ describe('useInfiniteQuery', () => {
|
|
|
1523
1525
|
>
|
|
1524
1526
|
<Match when={state.status === 'pending'}>Loading...</Match>
|
|
1525
1527
|
<Match when={state.status === 'error'}>
|
|
1526
|
-
<span>Error: {state.error
|
|
1528
|
+
<span>Error: {state.error?.message}</span>
|
|
1527
1529
|
</Match>
|
|
1528
1530
|
</Switch>
|
|
1529
1531
|
</div>
|
|
@@ -1587,11 +1589,11 @@ describe('useInfiniteQuery', () => {
|
|
|
1587
1589
|
|
|
1588
1590
|
it('should cancel the query function when there are no more subscriptions', async () => {
|
|
1589
1591
|
const key = queryKey()
|
|
1590
|
-
let cancelFn:
|
|
1592
|
+
let cancelFn: Mock = vi.fn()
|
|
1591
1593
|
|
|
1592
1594
|
const queryFn = ({ signal }: { signal?: AbortSignal }) => {
|
|
1593
1595
|
const promise = new Promise<string>((resolve, reject) => {
|
|
1594
|
-
cancelFn =
|
|
1596
|
+
cancelFn = vi.fn(() => reject('Cancelled'))
|
|
1595
1597
|
signal?.addEventListener('abort', cancelFn)
|
|
1596
1598
|
sleep(20).then(() => resolve('OK'))
|
|
1597
1599
|
})
|
|
@@ -20,6 +20,7 @@ import {
|
|
|
20
20
|
setActTimeout,
|
|
21
21
|
sleep,
|
|
22
22
|
} from './utils'
|
|
23
|
+
import { vi } from 'vitest'
|
|
23
24
|
|
|
24
25
|
describe('createMutation', () => {
|
|
25
26
|
const queryCache = new QueryCache()
|
|
@@ -108,8 +109,8 @@ describe('createMutation', () => {
|
|
|
108
109
|
|
|
109
110
|
it('should be able to call `onSuccess` and `onSettled` after each successful mutate', async () => {
|
|
110
111
|
const [count, setCount] = createSignal(0)
|
|
111
|
-
const onSuccessMock =
|
|
112
|
-
const onSettledMock =
|
|
112
|
+
const onSuccessMock = vi.fn()
|
|
113
|
+
const onSettledMock = vi.fn()
|
|
113
114
|
|
|
114
115
|
function Page() {
|
|
115
116
|
const mutation = createMutation(() => ({
|
|
@@ -174,7 +175,7 @@ describe('createMutation', () => {
|
|
|
174
175
|
const [count, setCount] = createSignal(0)
|
|
175
176
|
type Value = { count: number }
|
|
176
177
|
|
|
177
|
-
const mutateFn =
|
|
178
|
+
const mutateFn = vi.fn<[value: Value], Promise<Value>>()
|
|
178
179
|
|
|
179
180
|
mutateFn.mockImplementationOnce(() => {
|
|
180
181
|
return Promise.reject(new Error('Error test Jonas'))
|
|
@@ -231,8 +232,8 @@ describe('createMutation', () => {
|
|
|
231
232
|
})
|
|
232
233
|
|
|
233
234
|
it('should be able to call `onError` and `onSettled` after each failed mutate', async () => {
|
|
234
|
-
const onErrorMock =
|
|
235
|
-
const onSettledMock =
|
|
235
|
+
const onErrorMock = vi.fn()
|
|
236
|
+
const onSettledMock = vi.fn()
|
|
236
237
|
const [count, setCount] = createSignal(0)
|
|
237
238
|
|
|
238
239
|
function Page() {
|
|
@@ -562,7 +563,7 @@ describe('createMutation', () => {
|
|
|
562
563
|
|
|
563
564
|
it('should call onMutate even if paused', async () => {
|
|
564
565
|
const onlineMock = mockNavigatorOnLine(false)
|
|
565
|
-
const onMutate =
|
|
566
|
+
const onMutate = vi.fn()
|
|
566
567
|
let count = 0
|
|
567
568
|
|
|
568
569
|
function Page() {
|
|
@@ -870,8 +871,8 @@ describe('createMutation', () => {
|
|
|
870
871
|
})
|
|
871
872
|
|
|
872
873
|
it('should pass meta to mutation', async () => {
|
|
873
|
-
const errorMock =
|
|
874
|
-
const successMock =
|
|
874
|
+
const errorMock = vi.fn()
|
|
875
|
+
const successMock = vi.fn()
|
|
875
876
|
|
|
876
877
|
const queryClientMutationMeta = createQueryClient({
|
|
877
878
|
mutationCache: new MutationCache({
|
|
@@ -930,10 +931,10 @@ describe('createMutation', () => {
|
|
|
930
931
|
})
|
|
931
932
|
|
|
932
933
|
it('should call cache callbacks when unmounted', async () => {
|
|
933
|
-
const onSuccess =
|
|
934
|
-
const onSuccessMutate =
|
|
935
|
-
const onSettled =
|
|
936
|
-
const onSettledMutate =
|
|
934
|
+
const onSuccess = vi.fn()
|
|
935
|
+
const onSuccessMutate = vi.fn()
|
|
936
|
+
const onSettled = vi.fn()
|
|
937
|
+
const onSettledMutate = vi.fn()
|
|
937
938
|
const mutationKey = queryKey()
|
|
938
939
|
let count = 0
|
|
939
940
|
|
|
@@ -1006,10 +1007,10 @@ describe('createMutation', () => {
|
|
|
1006
1007
|
})
|
|
1007
1008
|
|
|
1008
1009
|
it('should call mutate callbacks only for the last observer', async () => {
|
|
1009
|
-
const onSuccess =
|
|
1010
|
-
const onSuccessMutate =
|
|
1011
|
-
const onSettled =
|
|
1012
|
-
const onSettledMutate =
|
|
1010
|
+
const onSuccess = vi.fn()
|
|
1011
|
+
const onSuccessMutate = vi.fn()
|
|
1012
|
+
const onSettled = vi.fn()
|
|
1013
|
+
const onSettledMutate = vi.fn()
|
|
1013
1014
|
let count = 0
|
|
1014
1015
|
|
|
1015
1016
|
function Page() {
|
|
@@ -1072,7 +1073,7 @@ describe('createMutation', () => {
|
|
|
1072
1073
|
|
|
1073
1074
|
it('should go to error state if onSuccess callback errors', async () => {
|
|
1074
1075
|
const error = new Error('error from onSuccess')
|
|
1075
|
-
const onError =
|
|
1076
|
+
const onError = vi.fn()
|
|
1076
1077
|
|
|
1077
1078
|
function Page() {
|
|
1078
1079
|
const mutation = createMutation(() => ({
|
|
@@ -1148,7 +1149,7 @@ describe('createMutation', () => {
|
|
|
1148
1149
|
it('should go to error state if onSettled callback errors', async () => {
|
|
1149
1150
|
const error = new Error('error from onSettled')
|
|
1150
1151
|
const mutateFnError = new Error('mutateFnError')
|
|
1151
|
-
const onError =
|
|
1152
|
+
const onError = vi.fn()
|
|
1152
1153
|
|
|
1153
1154
|
function Page() {
|
|
1154
1155
|
const mutation = createMutation(() => ({
|
|
@@ -23,6 +23,7 @@ import {
|
|
|
23
23
|
queryKey,
|
|
24
24
|
sleep,
|
|
25
25
|
} from './utils'
|
|
26
|
+
import { vi } from 'vitest'
|
|
26
27
|
|
|
27
28
|
describe('useQueries', () => {
|
|
28
29
|
const queryCache = new QueryCache()
|
|
@@ -739,7 +740,7 @@ describe('useQueries', () => {
|
|
|
739
740
|
}
|
|
740
741
|
}
|
|
741
742
|
|
|
742
|
-
const QueriesObserverSpy =
|
|
743
|
+
const QueriesObserverSpy = vi
|
|
743
744
|
.spyOn(QueriesObserverModule, 'QueriesObserver')
|
|
744
745
|
.mockImplementation((fn) => {
|
|
745
746
|
return new QueriesObserverMock(fn)
|
|
@@ -789,29 +790,4 @@ describe('useQueries', () => {
|
|
|
789
790
|
await sleep(20)
|
|
790
791
|
QueriesObserverSpy.mockRestore()
|
|
791
792
|
})
|
|
792
|
-
|
|
793
|
-
it('should use provided custom queryClient', async () => {
|
|
794
|
-
const key = queryKey()
|
|
795
|
-
const queryFn = () => {
|
|
796
|
-
return Promise.resolve('custom client')
|
|
797
|
-
}
|
|
798
|
-
|
|
799
|
-
function Page() {
|
|
800
|
-
const state = createQueries(
|
|
801
|
-
() => ({
|
|
802
|
-
queries: [{ queryKey: key, queryFn }],
|
|
803
|
-
}),
|
|
804
|
-
() => queryClient,
|
|
805
|
-
)
|
|
806
|
-
return (
|
|
807
|
-
<div>
|
|
808
|
-
<h1>Status: {state[0].data}</h1>
|
|
809
|
-
</div>
|
|
810
|
-
)
|
|
811
|
-
}
|
|
812
|
-
|
|
813
|
-
render(() => <Page />)
|
|
814
|
-
|
|
815
|
-
await waitFor(() => screen.getByText('Status: custom client'))
|
|
816
|
-
})
|
|
817
793
|
})
|
|
@@ -33,6 +33,8 @@ import {
|
|
|
33
33
|
setActTimeout,
|
|
34
34
|
sleep,
|
|
35
35
|
} from './utils'
|
|
36
|
+
import { vi } from 'vitest'
|
|
37
|
+
import type { Mock } from 'vitest'
|
|
36
38
|
|
|
37
39
|
describe('createQuery', () => {
|
|
38
40
|
const queryCache = new QueryCache()
|
|
@@ -491,7 +493,7 @@ describe('createQuery', () => {
|
|
|
491
493
|
it('should call onSuccess after a query has been fetched', async () => {
|
|
492
494
|
const key = queryKey()
|
|
493
495
|
const states: CreateQueryResult<string>[] = []
|
|
494
|
-
const onSuccess =
|
|
496
|
+
const onSuccess = vi.fn()
|
|
495
497
|
|
|
496
498
|
function Page() {
|
|
497
499
|
const state = createQuery(() => ({
|
|
@@ -523,7 +525,7 @@ describe('createQuery', () => {
|
|
|
523
525
|
it('should call onSuccess after a disabled query has been fetched', async () => {
|
|
524
526
|
const key = queryKey()
|
|
525
527
|
const states: CreateQueryResult<string>[] = []
|
|
526
|
-
const onSuccess =
|
|
528
|
+
const onSuccess = vi.fn()
|
|
527
529
|
|
|
528
530
|
function Page() {
|
|
529
531
|
const state = createQuery(() => ({
|
|
@@ -561,7 +563,7 @@ describe('createQuery', () => {
|
|
|
561
563
|
it('should not call onSuccess if a component has unmounted', async () => {
|
|
562
564
|
const key = queryKey()
|
|
563
565
|
const states: CreateQueryResult<string>[] = []
|
|
564
|
-
const onSuccess =
|
|
566
|
+
const onSuccess = vi.fn()
|
|
565
567
|
|
|
566
568
|
function Page() {
|
|
567
569
|
const [show, setShow] = createSignal(true)
|
|
@@ -601,7 +603,7 @@ describe('createQuery', () => {
|
|
|
601
603
|
it('should call onError after a query has been fetched with an error', async () => {
|
|
602
604
|
const key = queryKey()
|
|
603
605
|
const states: CreateQueryResult<unknown>[] = []
|
|
604
|
-
const onError =
|
|
606
|
+
const onError = vi.fn()
|
|
605
607
|
|
|
606
608
|
function Page() {
|
|
607
609
|
const state = createQuery(() => ({
|
|
@@ -632,7 +634,7 @@ describe('createQuery', () => {
|
|
|
632
634
|
|
|
633
635
|
it('should not call onError when receiving a CancelledError', async () => {
|
|
634
636
|
const key = queryKey()
|
|
635
|
-
const onError =
|
|
637
|
+
const onError = vi.fn()
|
|
636
638
|
|
|
637
639
|
function Page() {
|
|
638
640
|
const state = createQuery(() => ({
|
|
@@ -666,7 +668,7 @@ describe('createQuery', () => {
|
|
|
666
668
|
it('should call onSettled after a query has been fetched', async () => {
|
|
667
669
|
const key = queryKey()
|
|
668
670
|
const states: CreateQueryResult<string>[] = []
|
|
669
|
-
const onSettled =
|
|
671
|
+
const onSettled = vi.fn()
|
|
670
672
|
|
|
671
673
|
function Page() {
|
|
672
674
|
const state = createQuery(() => ({
|
|
@@ -696,7 +698,7 @@ describe('createQuery', () => {
|
|
|
696
698
|
it('should call onSettled after a query has been fetched with an error', async () => {
|
|
697
699
|
const key = queryKey()
|
|
698
700
|
const states: CreateQueryResult<string>[] = []
|
|
699
|
-
const onSettled =
|
|
701
|
+
const onSettled = vi.fn()
|
|
700
702
|
|
|
701
703
|
function Page() {
|
|
702
704
|
const state = createQuery(() => ({
|
|
@@ -2452,7 +2454,7 @@ describe('createQuery', () => {
|
|
|
2452
2454
|
|
|
2453
2455
|
it('should not refetch query on focus when `enabled` is set to `false`', async () => {
|
|
2454
2456
|
const key = queryKey()
|
|
2455
|
-
const queryFn =
|
|
2457
|
+
const queryFn = vi.fn<unknown[], string>().mockReturnValue('data')
|
|
2456
2458
|
|
|
2457
2459
|
function Page() {
|
|
2458
2460
|
const { data = 'default' } = createQuery(() => ({
|
|
@@ -3296,7 +3298,7 @@ describe('createQuery', () => {
|
|
|
3296
3298
|
it('should retry specified number of times', async () => {
|
|
3297
3299
|
const key = queryKey()
|
|
3298
3300
|
|
|
3299
|
-
const queryFn =
|
|
3301
|
+
const queryFn = vi.fn<unknown[], unknown>()
|
|
3300
3302
|
queryFn.mockImplementation(() => {
|
|
3301
3303
|
return Promise.reject(new Error('Error test Barrett'))
|
|
3302
3304
|
})
|
|
@@ -3337,7 +3339,7 @@ describe('createQuery', () => {
|
|
|
3337
3339
|
it('should not retry if retry function `false`', async () => {
|
|
3338
3340
|
const key = queryKey()
|
|
3339
3341
|
|
|
3340
|
-
const queryFn =
|
|
3342
|
+
const queryFn = vi.fn<unknown[], unknown>()
|
|
3341
3343
|
|
|
3342
3344
|
queryFn.mockImplementationOnce(() => {
|
|
3343
3345
|
return Promise.reject(new Error('Error test Tanner'))
|
|
@@ -3385,7 +3387,7 @@ describe('createQuery', () => {
|
|
|
3385
3387
|
|
|
3386
3388
|
type DelayError = { delay: number }
|
|
3387
3389
|
|
|
3388
|
-
const queryFn =
|
|
3390
|
+
const queryFn = vi.fn<unknown[], unknown>()
|
|
3389
3391
|
queryFn.mockImplementation(() => {
|
|
3390
3392
|
return Promise.reject({ delay: 50 })
|
|
3391
3393
|
})
|
|
@@ -3596,10 +3598,10 @@ describe('createQuery', () => {
|
|
|
3596
3598
|
const key = queryKey()
|
|
3597
3599
|
const states: CreateQueryResult<string>[] = []
|
|
3598
3600
|
|
|
3599
|
-
const queryFn =
|
|
3601
|
+
const queryFn = vi.fn<unknown[], string>()
|
|
3600
3602
|
queryFn.mockImplementation(() => 'data')
|
|
3601
3603
|
|
|
3602
|
-
const prefetchQueryFn =
|
|
3604
|
+
const prefetchQueryFn = vi.fn<unknown[], string>()
|
|
3603
3605
|
prefetchQueryFn.mockImplementation(() => 'not yet...')
|
|
3604
3606
|
|
|
3605
3607
|
await queryClient.prefetchQuery({
|
|
@@ -3633,10 +3635,10 @@ describe('createQuery', () => {
|
|
|
3633
3635
|
it('should not refetch if not stale after a prefetch', async () => {
|
|
3634
3636
|
const key = queryKey()
|
|
3635
3637
|
|
|
3636
|
-
const queryFn =
|
|
3638
|
+
const queryFn = vi.fn<unknown[], string>()
|
|
3637
3639
|
queryFn.mockImplementation(() => 'data')
|
|
3638
3640
|
|
|
3639
|
-
const prefetchQueryFn =
|
|
3641
|
+
const prefetchQueryFn = vi.fn<unknown[], Promise<string>>()
|
|
3640
3642
|
prefetchQueryFn.mockImplementation(async () => {
|
|
3641
3643
|
await sleep(10)
|
|
3642
3644
|
return 'not yet...'
|
|
@@ -3909,7 +3911,7 @@ describe('createQuery', () => {
|
|
|
3909
3911
|
|
|
3910
3912
|
it('it should support enabled:false in query object syntax', async () => {
|
|
3911
3913
|
const key = queryKey()
|
|
3912
|
-
const queryFn =
|
|
3914
|
+
const queryFn = vi.fn<unknown[], string>()
|
|
3913
3915
|
queryFn.mockImplementation(() => 'data')
|
|
3914
3916
|
|
|
3915
3917
|
function Page() {
|
|
@@ -3981,7 +3983,7 @@ describe('createQuery', () => {
|
|
|
3981
3983
|
))
|
|
3982
3984
|
|
|
3983
3985
|
await waitFor(() => screen.getByText('fetched data'))
|
|
3984
|
-
const setTimeoutSpy =
|
|
3986
|
+
const setTimeoutSpy = vi.spyOn(window, 'setTimeout')
|
|
3985
3987
|
|
|
3986
3988
|
result.unmount()
|
|
3987
3989
|
|
|
@@ -4007,7 +4009,7 @@ describe('createQuery', () => {
|
|
|
4007
4009
|
))
|
|
4008
4010
|
|
|
4009
4011
|
await waitFor(() => screen.getByText('fetched data'))
|
|
4010
|
-
const setTimeoutSpy =
|
|
4012
|
+
const setTimeoutSpy = vi.spyOn(window, 'setTimeout')
|
|
4011
4013
|
|
|
4012
4014
|
result.unmount()
|
|
4013
4015
|
|
|
@@ -4019,8 +4021,8 @@ describe('createQuery', () => {
|
|
|
4019
4021
|
|
|
4020
4022
|
it('should not cause memo churn when data does not change', async () => {
|
|
4021
4023
|
const key = queryKey()
|
|
4022
|
-
const queryFn =
|
|
4023
|
-
const memoFn =
|
|
4024
|
+
const queryFn = vi.fn<unknown[], string>().mockReturnValue('data')
|
|
4025
|
+
const memoFn = vi.fn()
|
|
4024
4026
|
|
|
4025
4027
|
function Page() {
|
|
4026
4028
|
const result = createQuery(() => ({
|
|
@@ -4255,7 +4257,7 @@ describe('createQuery', () => {
|
|
|
4255
4257
|
it('should refetch if any query instance becomes enabled', async () => {
|
|
4256
4258
|
const key = queryKey()
|
|
4257
4259
|
|
|
4258
|
-
const queryFn =
|
|
4260
|
+
const queryFn = vi.fn<unknown[], string>().mockReturnValue('data')
|
|
4259
4261
|
|
|
4260
4262
|
function Disabled() {
|
|
4261
4263
|
createQuery(() => ({ queryKey: key, queryFn, enabled: false }))
|
|
@@ -4610,11 +4612,11 @@ describe('createQuery', () => {
|
|
|
4610
4612
|
|
|
4611
4613
|
it('should cancel the query function when there are no more subscriptions', async () => {
|
|
4612
4614
|
const key = queryKey()
|
|
4613
|
-
let cancelFn:
|
|
4615
|
+
let cancelFn: Mock = vi.fn()
|
|
4614
4616
|
|
|
4615
4617
|
const queryFn = ({ signal }: { signal?: AbortSignal }) => {
|
|
4616
4618
|
const promise = new Promise<string>((resolve, reject) => {
|
|
4617
|
-
cancelFn =
|
|
4619
|
+
cancelFn = vi.fn(() => reject('Cancelled'))
|
|
4618
4620
|
signal?.addEventListener('abort', cancelFn)
|
|
4619
4621
|
sleep(20).then(() => resolve('OK'))
|
|
4620
4622
|
})
|
|
@@ -4958,7 +4960,7 @@ describe('createQuery', () => {
|
|
|
4958
4960
|
})
|
|
4959
4961
|
|
|
4960
4962
|
it('should refetch when changed enabled to true in error state', async () => {
|
|
4961
|
-
const queryFn =
|
|
4963
|
+
const queryFn = vi.fn<unknown[], unknown>()
|
|
4962
4964
|
queryFn.mockImplementation(async () => {
|
|
4963
4965
|
await sleep(10)
|
|
4964
4966
|
return Promise.reject(new Error('Suspense Error Bingo'))
|
|
@@ -6052,7 +6054,7 @@ describe('createQuery', () => {
|
|
|
6052
6054
|
|
|
6053
6055
|
it('setQueryData - should not call onSuccess callback of active observers', async () => {
|
|
6054
6056
|
const key = queryKey()
|
|
6055
|
-
const onSuccess =
|
|
6057
|
+
const onSuccess = vi.fn()
|
|
6056
6058
|
|
|
6057
6059
|
function Page() {
|
|
6058
6060
|
const state = createQuery(() => ({
|