@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.
@@ -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.4",
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-jest": "^0.2.0"
43
+ "vite-plugin-solid": "^2.3.9"
44
44
  },
45
45
  "dependencies": {
46
- "@tanstack/query-core": "5.0.0-alpha.3"
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": "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
  }
@@ -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
 
@@ -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: jest.Mock<any, any>[] = []
716
- const abortListeners: jest.Mock<any, any>[] = []
717
- const fetchPage = jest.fn<
718
- Promise<number>,
719
- [QueryFunctionContext<typeof key, number>]
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 = jest.fn()
722
- const abortListener = jest.fn()
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: jest.Mock<any, any>[] = []
798
- const abortListeners: jest.Mock<any, any>[] = []
799
- const fetchPage = jest.fn<
800
- Promise<number>,
801
- [QueryFunctionContext<typeof key, number>]
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 = jest.fn()
804
- const abortListener = jest.fn()
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!.message}</span>
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!.message}</span>
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: jest.Mock = jest.fn()
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 = jest.fn(() => reject('Cancelled'))
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 = jest.fn()
112
- const onSettledMock = jest.fn()
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 = jest.fn<Promise<Value>, [value: Value]>()
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 = jest.fn()
235
- const onSettledMock = jest.fn()
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 = jest.fn()
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 = jest.fn()
874
- const successMock = jest.fn()
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 = jest.fn()
934
- const onSuccessMutate = jest.fn()
935
- const onSettled = jest.fn()
936
- const onSettledMutate = jest.fn()
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 = jest.fn()
1010
- const onSuccessMutate = jest.fn()
1011
- const onSettled = jest.fn()
1012
- const onSettledMutate = jest.fn()
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 = jest.fn()
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 = jest.fn()
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 = jest
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 = jest.fn()
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 = jest.fn()
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 = jest.fn()
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 = jest.fn()
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 = jest.fn()
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 = jest.fn()
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 = jest.fn()
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 = jest.fn<string, unknown[]>().mockReturnValue('data')
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 = jest.fn<unknown, unknown[]>()
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 = jest.fn<unknown, unknown[]>()
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 = jest.fn<unknown, unknown[]>()
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 = jest.fn<string, unknown[]>()
3601
+ const queryFn = vi.fn<unknown[], string>()
3600
3602
  queryFn.mockImplementation(() => 'data')
3601
3603
 
3602
- const prefetchQueryFn = jest.fn<string, unknown[]>()
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 = jest.fn<string, unknown[]>()
3638
+ const queryFn = vi.fn<unknown[], string>()
3637
3639
  queryFn.mockImplementation(() => 'data')
3638
3640
 
3639
- const prefetchQueryFn = jest.fn<Promise<string>, unknown[]>()
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 = jest.fn<string, unknown[]>()
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 = jest.spyOn(window, 'setTimeout')
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 = jest.spyOn(window, 'setTimeout')
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 = jest.fn<string, unknown[]>().mockReturnValue('data')
4023
- const memoFn = jest.fn()
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 = jest.fn<string, unknown[]>().mockReturnValue('data')
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: jest.Mock = jest.fn()
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 = jest.fn(() => reject('Cancelled'))
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 = jest.fn<unknown, unknown[]>()
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 = jest.fn()
6057
+ const onSuccess = vi.fn()
6056
6058
 
6057
6059
  function Page() {
6058
6060
  const state = createQuery(() => ({