@tanstack/svelte-query 4.21.0
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/LICENSE +21 -0
- package/build/lib/.gitignore +9 -0
- package/build/lib/Hydrate.svelte +7 -0
- package/build/lib/Hydrate.svelte.d.ts +20 -0
- package/build/lib/QueryClientProvider.svelte +14 -0
- package/build/lib/QueryClientProvider.svelte.d.ts +19 -0
- package/build/lib/context.d.ts +5 -0
- package/build/lib/context.js +14 -0
- package/build/lib/createBaseQuery.d.ts +5 -0
- package/build/lib/createBaseQuery.js +35 -0
- package/build/lib/createInfiniteQuery.d.ts +5 -0
- package/build/lib/createInfiniteQuery.js +6 -0
- package/build/lib/createMutation.d.ts +6 -0
- package/build/lib/createMutation.js +27 -0
- package/build/lib/createQueries.d.ts +48 -0
- package/build/lib/createQueries.js +27 -0
- package/build/lib/createQuery.d.ts +23 -0
- package/build/lib/createQuery.js +7 -0
- package/build/lib/index.d.ts +12 -0
- package/build/lib/index.js +15 -0
- package/build/lib/types.d.ts +40 -0
- package/build/lib/types.js +1 -0
- package/build/lib/useHydrate.d.ts +2 -0
- package/build/lib/useHydrate.js +8 -0
- package/build/lib/useIsFetching.d.ts +4 -0
- package/build/lib/useIsFetching.js +21 -0
- package/build/lib/useIsMutating.d.ts +4 -0
- package/build/lib/useIsMutating.js +21 -0
- package/build/lib/useQueryClient.d.ts +2 -0
- package/build/lib/useQueryClient.js +5 -0
- package/package.json +54 -0
- package/src/__tests__/CreateMutation.svelte +13 -0
- package/src/__tests__/CreateQuery.svelte +23 -0
- package/src/__tests__/createMutation.test.ts +22 -0
- package/src/__tests__/createQuery.test.ts +28 -0
- package/src/__tests__/utils.ts +72 -0
- package/src/lib/Hydrate.svelte +11 -0
- package/src/lib/QueryClientProvider.svelte +19 -0
- package/src/lib/context.ts +21 -0
- package/src/lib/createBaseQuery.ts +76 -0
- package/src/lib/createInfiniteQuery.ts +103 -0
- package/src/lib/createMutation.ts +110 -0
- package/src/lib/createQueries.ts +178 -0
- package/src/lib/createQuery.ts +143 -0
- package/src/lib/index.ts +17 -0
- package/src/lib/types.ts +146 -0
- package/src/lib/useHydrate.ts +14 -0
- package/src/lib/useIsFetching.ts +41 -0
- package/src/lib/useIsMutating.ts +41 -0
- package/src/lib/useQueryClient.ts +7 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2021-present Tanner Linsley
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { SvelteComponentTyped } from "svelte";
|
|
2
|
+
import type { DehydratedState, HydrateOptions } from '@tanstack/query-core';
|
|
3
|
+
declare const __propDef: {
|
|
4
|
+
props: {
|
|
5
|
+
state: DehydratedState;
|
|
6
|
+
options?: HydrateOptions | undefined;
|
|
7
|
+
};
|
|
8
|
+
events: {
|
|
9
|
+
[evt: string]: CustomEvent<any>;
|
|
10
|
+
};
|
|
11
|
+
slots: {
|
|
12
|
+
default: {};
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
export declare type HydrateProps = typeof __propDef.props;
|
|
16
|
+
export declare type HydrateEvents = typeof __propDef.events;
|
|
17
|
+
export declare type HydrateSlots = typeof __propDef.slots;
|
|
18
|
+
export default class Hydrate extends SvelteComponentTyped<HydrateProps, HydrateEvents, HydrateSlots> {
|
|
19
|
+
}
|
|
20
|
+
export {};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<script>import { onMount, onDestroy } from "svelte";
|
|
2
|
+
import { QueryClient } from "@tanstack/query-core";
|
|
3
|
+
import { setQueryClientContext } from "./context";
|
|
4
|
+
export let client = new QueryClient();
|
|
5
|
+
onMount(() => {
|
|
6
|
+
client.mount();
|
|
7
|
+
});
|
|
8
|
+
setQueryClientContext(client);
|
|
9
|
+
onDestroy(() => {
|
|
10
|
+
client.unmount();
|
|
11
|
+
});
|
|
12
|
+
</script>
|
|
13
|
+
|
|
14
|
+
<slot />
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { SvelteComponentTyped } from "svelte";
|
|
2
|
+
import { QueryClient } from '@tanstack/query-core';
|
|
3
|
+
declare const __propDef: {
|
|
4
|
+
props: {
|
|
5
|
+
client?: QueryClient | undefined;
|
|
6
|
+
};
|
|
7
|
+
events: {
|
|
8
|
+
[evt: string]: CustomEvent<any>;
|
|
9
|
+
};
|
|
10
|
+
slots: {
|
|
11
|
+
default: {};
|
|
12
|
+
};
|
|
13
|
+
};
|
|
14
|
+
export declare type QueryClientProviderProps = typeof __propDef.props;
|
|
15
|
+
export declare type QueryClientProviderEvents = typeof __propDef.events;
|
|
16
|
+
export declare type QueryClientProviderSlots = typeof __propDef.slots;
|
|
17
|
+
export default class QueryClientProvider extends SvelteComponentTyped<QueryClientProviderProps, QueryClientProviderEvents, QueryClientProviderSlots> {
|
|
18
|
+
}
|
|
19
|
+
export {};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { QueryClient } from '@tanstack/query-core';
|
|
2
|
+
/** Retrieves a Client from Svelte's context */
|
|
3
|
+
export declare const getQueryClientContext: () => QueryClient;
|
|
4
|
+
/** Sets a QueryClient on Svelte's context */
|
|
5
|
+
export declare const setQueryClientContext: (client: QueryClient) => void;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { setContext, getContext } from 'svelte';
|
|
2
|
+
const _contextKey = '$$_queryClient';
|
|
3
|
+
/** Retrieves a Client from Svelte's context */
|
|
4
|
+
export const getQueryClientContext = () => {
|
|
5
|
+
const client = getContext(_contextKey);
|
|
6
|
+
if (!client) {
|
|
7
|
+
throw new Error('No QueryClient was found in Svelte context. Did you forget to wrap your component with QueryClientProvider?');
|
|
8
|
+
}
|
|
9
|
+
return client;
|
|
10
|
+
};
|
|
11
|
+
/** Sets a QueryClient on Svelte's context */
|
|
12
|
+
export const setQueryClientContext = (client) => {
|
|
13
|
+
setContext(_contextKey, client);
|
|
14
|
+
};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { type QueryKey, type QueryObserver } from '@tanstack/query-core';
|
|
2
|
+
import type { CreateBaseQueryOptions } from './types';
|
|
3
|
+
export declare function createBaseQuery<TQueryFnData, TError, TData, TQueryData, TQueryKey extends QueryKey>(options: CreateBaseQueryOptions<TQueryFnData, TError, TData, TQueryData, TQueryKey>, Observer: typeof QueryObserver): {
|
|
4
|
+
subscribe: (this: void, run: import("svelte/store").Subscriber<import("@tanstack/query-core").QueryObserverResult<TData, TError>>, invalidate?: ((value?: import("@tanstack/query-core").QueryObserverResult<TData, TError> | undefined) => void) | undefined) => import("svelte/store").Unsubscriber;
|
|
5
|
+
};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { notifyManager, } from '@tanstack/query-core';
|
|
2
|
+
import { useQueryClient } from './useQueryClient';
|
|
3
|
+
import { derived, readable } from 'svelte/store';
|
|
4
|
+
export function createBaseQuery(options, Observer) {
|
|
5
|
+
const queryClient = useQueryClient();
|
|
6
|
+
const defaultedOptions = queryClient.defaultQueryOptions(options);
|
|
7
|
+
defaultedOptions._optimisticResults = 'optimistic';
|
|
8
|
+
let observer = new Observer(queryClient, defaultedOptions);
|
|
9
|
+
// Include callbacks in batch renders
|
|
10
|
+
if (defaultedOptions.onError) {
|
|
11
|
+
defaultedOptions.onError = notifyManager.batchCalls(defaultedOptions.onError);
|
|
12
|
+
}
|
|
13
|
+
if (defaultedOptions.onSuccess) {
|
|
14
|
+
defaultedOptions.onSuccess = notifyManager.batchCalls(defaultedOptions.onSuccess);
|
|
15
|
+
}
|
|
16
|
+
if (defaultedOptions.onSettled) {
|
|
17
|
+
defaultedOptions.onSettled = notifyManager.batchCalls(defaultedOptions.onSettled);
|
|
18
|
+
}
|
|
19
|
+
readable(observer).subscribe(($observer) => {
|
|
20
|
+
observer = $observer;
|
|
21
|
+
// Do not notify on updates because of changes in the options because
|
|
22
|
+
// these changes should already be reflected in the optimistic result.
|
|
23
|
+
observer.setOptions(defaultedOptions, { listeners: false });
|
|
24
|
+
});
|
|
25
|
+
const result = readable(observer.getCurrentResult(), (set) => {
|
|
26
|
+
return observer.subscribe(notifyManager.batchCalls(set));
|
|
27
|
+
});
|
|
28
|
+
const { subscribe } = derived(result, ($result) => {
|
|
29
|
+
$result = observer.getOptimisticResult(defaultedOptions);
|
|
30
|
+
return !defaultedOptions.notifyOnChangeProps
|
|
31
|
+
? observer.trackResult($result)
|
|
32
|
+
: $result;
|
|
33
|
+
});
|
|
34
|
+
return { subscribe };
|
|
35
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { type QueryFunction, type QueryKey } from '@tanstack/query-core';
|
|
2
|
+
import type { CreateInfiniteQueryOptions, CreateInfiniteQueryResult } from './types';
|
|
3
|
+
export declare function createInfiniteQuery<TQueryFnData = unknown, TError = unknown, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey>(options: CreateInfiniteQueryOptions<TQueryFnData, TError, TData, TQueryFnData, TQueryKey>): CreateInfiniteQueryResult<TData, TError>;
|
|
4
|
+
export declare function createInfiniteQuery<TQueryFnData = unknown, TError = unknown, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey>(queryKey: TQueryKey, options?: Omit<CreateInfiniteQueryOptions<TQueryFnData, TError, TData, TQueryFnData, TQueryKey>, 'queryKey'>): CreateInfiniteQueryResult<TData, TError>;
|
|
5
|
+
export declare function createInfiniteQuery<TQueryFnData = unknown, TError = unknown, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey>(queryKey: TQueryKey, queryFn: QueryFunction<TQueryFnData, TQueryKey>, options?: Omit<CreateInfiniteQueryOptions<TQueryFnData, TError, TData, TQueryFnData, TQueryKey>, 'queryKey' | 'queryFn'>): CreateInfiniteQueryResult<TData, TError>;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { InfiniteQueryObserver, parseQueryArgs, } from '@tanstack/query-core';
|
|
2
|
+
import { createBaseQuery } from './createBaseQuery';
|
|
3
|
+
export function createInfiniteQuery(arg1, arg2, arg3) {
|
|
4
|
+
const options = parseQueryArgs(arg1, arg2, arg3);
|
|
5
|
+
return createBaseQuery(options, InfiniteQueryObserver);
|
|
6
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type MutationFunction, type MutationKey } from '@tanstack/query-core';
|
|
2
|
+
import type { CreateMutationOptions, MutationStoreResult } from './types';
|
|
3
|
+
export declare function createMutation<TData = unknown, TError = unknown, TVariables = unknown, TContext = unknown>(options: CreateMutationOptions<TData, TError, TVariables, TContext>): MutationStoreResult<TData, TError, TVariables, TContext>;
|
|
4
|
+
export declare function createMutation<TData = unknown, TError = unknown, TVariables = unknown, TContext = unknown>(mutationFn: MutationFunction<TData, TVariables>, options?: Omit<CreateMutationOptions<TData, TError, TVariables, TContext>, 'mutationFn'>): MutationStoreResult<TData, TError, TVariables, TContext>;
|
|
5
|
+
export declare function createMutation<TData = unknown, TError = unknown, TVariables = unknown, TContext = unknown>(mutationKey: MutationKey, options?: Omit<CreateMutationOptions<TData, TError, TVariables, TContext>, 'mutationKey'>): MutationStoreResult<TData, TError, TVariables, TContext>;
|
|
6
|
+
export declare function createMutation<TData = unknown, TError = unknown, TVariables = unknown, TContext = unknown>(mutationKey: MutationKey, mutationFn?: MutationFunction<TData, TVariables>, options?: Omit<CreateMutationOptions<TData, TError, TVariables, TContext>, 'mutationKey' | 'mutationFn'>): MutationStoreResult<TData, TError, TVariables, TContext>;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { readable, derived } from 'svelte/store';
|
|
2
|
+
import { MutationObserver, notifyManager, parseMutationArgs, } from '@tanstack/query-core';
|
|
3
|
+
import { useQueryClient } from './useQueryClient';
|
|
4
|
+
export function createMutation(arg1, arg2, arg3) {
|
|
5
|
+
const options = parseMutationArgs(arg1, arg2, arg3);
|
|
6
|
+
const queryClient = useQueryClient();
|
|
7
|
+
let observer = new MutationObserver(queryClient, options);
|
|
8
|
+
let mutate;
|
|
9
|
+
readable(observer).subscribe(($observer) => {
|
|
10
|
+
observer = $observer;
|
|
11
|
+
mutate = (variables, mutateOptions) => {
|
|
12
|
+
observer.mutate(variables, mutateOptions).catch(noop);
|
|
13
|
+
};
|
|
14
|
+
observer.setOptions(options);
|
|
15
|
+
});
|
|
16
|
+
const result = readable(observer.getCurrentResult(), (set) => {
|
|
17
|
+
return observer.subscribe(notifyManager.batchCalls((val) => set(val)));
|
|
18
|
+
});
|
|
19
|
+
const { subscribe } = derived(result, ($result) => ({
|
|
20
|
+
...$result,
|
|
21
|
+
mutate,
|
|
22
|
+
mutateAsync: $result.mutate,
|
|
23
|
+
}));
|
|
24
|
+
return { subscribe };
|
|
25
|
+
}
|
|
26
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
27
|
+
function noop() { }
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { QueryKey, QueryFunction } from '@tanstack/query-core';
|
|
2
|
+
import { type Readable } from 'svelte/store';
|
|
3
|
+
import type { CreateQueryOptions, CreateQueryResult } from './types';
|
|
4
|
+
declare type CreateQueryOptionsForCreateQueries<TQueryFnData = unknown, TError = unknown, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey> = Omit<CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>, 'context'>;
|
|
5
|
+
declare type MAXIMUM_DEPTH = 20;
|
|
6
|
+
declare type GetOptions<T> = T extends {
|
|
7
|
+
queryFnData: infer TQueryFnData;
|
|
8
|
+
error?: infer TError;
|
|
9
|
+
data: infer TData;
|
|
10
|
+
} ? CreateQueryOptionsForCreateQueries<TQueryFnData, TError, TData> : T extends {
|
|
11
|
+
queryFnData: infer TQueryFnData;
|
|
12
|
+
error?: infer TError;
|
|
13
|
+
} ? CreateQueryOptionsForCreateQueries<TQueryFnData, TError> : T extends {
|
|
14
|
+
data: infer TData;
|
|
15
|
+
error?: infer TError;
|
|
16
|
+
} ? CreateQueryOptionsForCreateQueries<unknown, TError, TData> : T extends [infer TQueryFnData, infer TError, infer TData] ? CreateQueryOptionsForCreateQueries<TQueryFnData, TError, TData> : T extends [infer TQueryFnData, infer TError] ? CreateQueryOptionsForCreateQueries<TQueryFnData, TError> : T extends [infer TQueryFnData] ? CreateQueryOptionsForCreateQueries<TQueryFnData> : T extends {
|
|
17
|
+
queryFn?: QueryFunction<infer TQueryFnData, infer TQueryKey>;
|
|
18
|
+
select: (data: any) => infer TData;
|
|
19
|
+
} ? CreateQueryOptionsForCreateQueries<TQueryFnData, unknown, TData, TQueryKey> : T extends {
|
|
20
|
+
queryFn?: QueryFunction<infer TQueryFnData, infer TQueryKey>;
|
|
21
|
+
} ? CreateQueryOptionsForCreateQueries<TQueryFnData, unknown, TQueryFnData, TQueryKey> : CreateQueryOptionsForCreateQueries;
|
|
22
|
+
declare type GetResults<T> = T extends {
|
|
23
|
+
queryFnData: any;
|
|
24
|
+
error?: infer TError;
|
|
25
|
+
data: infer TData;
|
|
26
|
+
} ? CreateQueryResult<TData, TError> : T extends {
|
|
27
|
+
queryFnData: infer TQueryFnData;
|
|
28
|
+
error?: infer TError;
|
|
29
|
+
} ? CreateQueryResult<TQueryFnData, TError> : T extends {
|
|
30
|
+
data: infer TData;
|
|
31
|
+
error?: infer TError;
|
|
32
|
+
} ? CreateQueryResult<TData, TError> : T extends [any, infer TError, infer TData] ? CreateQueryResult<TData, TError> : T extends [infer TQueryFnData, infer TError] ? CreateQueryResult<TQueryFnData, TError> : T extends [infer TQueryFnData] ? CreateQueryResult<TQueryFnData> : T extends {
|
|
33
|
+
queryFn?: QueryFunction<unknown, any>;
|
|
34
|
+
select: (data: any) => infer TData;
|
|
35
|
+
} ? CreateQueryResult<TData> : T extends {
|
|
36
|
+
queryFn?: QueryFunction<infer TQueryFnData, any>;
|
|
37
|
+
} ? CreateQueryResult<TQueryFnData> : CreateQueryResult;
|
|
38
|
+
/**
|
|
39
|
+
* QueriesOptions reducer recursively unwraps function arguments to infer/enforce type param
|
|
40
|
+
*/
|
|
41
|
+
export declare type QueriesOptions<T extends any[], Result extends any[] = [], Depth extends ReadonlyArray<number> = []> = Depth['length'] extends MAXIMUM_DEPTH ? CreateQueryOptionsForCreateQueries[] : T extends [] ? [] : T extends [infer Head] ? [...Result, GetOptions<Head>] : T extends [infer Head, ...infer Tail] ? QueriesOptions<[...Tail], [...Result, GetOptions<Head>], [...Depth, 1]> : unknown[] extends T ? T : T extends CreateQueryOptionsForCreateQueries<infer TQueryFnData, infer TError, infer TData, infer TQueryKey>[] ? CreateQueryOptionsForCreateQueries<TQueryFnData, TError, TData, TQueryKey>[] : CreateQueryOptionsForCreateQueries[];
|
|
42
|
+
/**
|
|
43
|
+
* QueriesResults reducer recursively maps type param to results
|
|
44
|
+
*/
|
|
45
|
+
export declare type QueriesResults<T extends any[], Result extends any[] = [], Depth extends ReadonlyArray<number> = []> = Depth['length'] extends MAXIMUM_DEPTH ? CreateQueryResult[] : T extends [] ? [] : T extends [infer Head] ? [...Result, GetResults<Head>] : T extends [infer Head, ...infer Tail] ? QueriesResults<[...Tail], [...Result, GetResults<Head>], [...Depth, 1]> : T extends CreateQueryOptionsForCreateQueries<infer TQueryFnData, infer TError, infer TData, any>[] ? CreateQueryResult<unknown extends TData ? TQueryFnData : TData, TError>[] : CreateQueryResult[];
|
|
46
|
+
export declare type CreateQueriesResult<T extends any[]> = Readable<QueriesResults<T>>;
|
|
47
|
+
export declare function createQueries<T extends any[]>(queries: readonly [...QueriesOptions<T>]): CreateQueriesResult<T>;
|
|
48
|
+
export {};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { notifyManager, QueriesObserver } from '@tanstack/query-core';
|
|
2
|
+
import { readable } from 'svelte/store';
|
|
3
|
+
import { useQueryClient } from './useQueryClient';
|
|
4
|
+
export function createQueries(queries) {
|
|
5
|
+
const client = useQueryClient();
|
|
6
|
+
// const isRestoring = useIsRestoring()
|
|
7
|
+
function getDefaultQuery(newQueries) {
|
|
8
|
+
return newQueries.map((options) => {
|
|
9
|
+
const defaultedOptions = client.defaultQueryOptions(options);
|
|
10
|
+
// Make sure the results are already in fetching state before subscribing or updating options
|
|
11
|
+
defaultedOptions._optimisticResults = 'optimistic';
|
|
12
|
+
return defaultedOptions;
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
const defaultedQueries = getDefaultQuery(queries);
|
|
16
|
+
let observer = new QueriesObserver(client, defaultedQueries);
|
|
17
|
+
readable(observer).subscribe(($observer) => {
|
|
18
|
+
observer = $observer;
|
|
19
|
+
// Do not notify on updates because of changes in the options because
|
|
20
|
+
// these changes should already be reflected in the optimistic result.
|
|
21
|
+
observer.setQueries(defaultedQueries, { listeners: false });
|
|
22
|
+
});
|
|
23
|
+
const { subscribe } = readable(observer.getOptimisticResult(defaultedQueries), (set) => {
|
|
24
|
+
return observer.subscribe(notifyManager.batchCalls(set));
|
|
25
|
+
});
|
|
26
|
+
return { subscribe };
|
|
27
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { QueryFunction, QueryKey } from '@tanstack/query-core';
|
|
2
|
+
import type { DefinedCreateQueryResult, CreateQueryOptions, CreateQueryStoreResult } from './types';
|
|
3
|
+
export declare function createQuery<TQueryFnData = unknown, TError = unknown, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey>(options: Omit<CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>, 'initialData'> & {
|
|
4
|
+
initialData?: () => undefined;
|
|
5
|
+
}): CreateQueryStoreResult<TData, TError>;
|
|
6
|
+
export declare function createQuery<TQueryFnData = unknown, TError = unknown, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey>(options: Omit<CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>, 'initialData'> & {
|
|
7
|
+
initialData: TQueryFnData | (() => TQueryFnData);
|
|
8
|
+
}): DefinedCreateQueryResult<TData, TError>;
|
|
9
|
+
export declare function createQuery<TQueryFnData = unknown, TError = unknown, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey>(options: CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>): CreateQueryStoreResult<TData, TError>;
|
|
10
|
+
export declare function createQuery<TQueryFnData = unknown, TError = unknown, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey>(queryKey: TQueryKey, options?: Omit<CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>, 'queryKey' | 'initialData'> & {
|
|
11
|
+
initialData?: () => undefined;
|
|
12
|
+
}): CreateQueryStoreResult<TData, TError>;
|
|
13
|
+
export declare function createQuery<TQueryFnData = unknown, TError = unknown, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey>(queryKey: TQueryKey, options?: Omit<CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>, 'queryKey' | 'initialData'> & {
|
|
14
|
+
initialData: TQueryFnData | (() => TQueryFnData);
|
|
15
|
+
}): DefinedCreateQueryResult<TData, TError>;
|
|
16
|
+
export declare function createQuery<TQueryFnData = unknown, TError = unknown, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey>(queryKey: TQueryKey, options?: Omit<CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>, 'queryKey'>): CreateQueryStoreResult<TData, TError>;
|
|
17
|
+
export declare function createQuery<TQueryFnData = unknown, TError = unknown, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey>(queryKey: TQueryKey, queryFn: QueryFunction<TQueryFnData, TQueryKey>, options?: Omit<CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>, 'queryKey' | 'queryFn' | 'initialData'> & {
|
|
18
|
+
initialData?: () => undefined;
|
|
19
|
+
}): CreateQueryStoreResult<TData, TError>;
|
|
20
|
+
export declare function createQuery<TQueryFnData = unknown, TError = unknown, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey>(queryKey: TQueryKey, queryFn: QueryFunction<TQueryFnData, TQueryKey>, options?: Omit<CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>, 'queryKey' | 'queryFn' | 'initialData'> & {
|
|
21
|
+
initialData: TQueryFnData | (() => TQueryFnData);
|
|
22
|
+
}): DefinedCreateQueryResult<TData, TError>;
|
|
23
|
+
export declare function createQuery<TQueryFnData = unknown, TError = unknown, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey>(queryKey: TQueryKey, queryFn: QueryFunction<TQueryFnData, TQueryKey>, options?: Omit<CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>, 'queryKey' | 'queryFn'>): CreateQueryStoreResult<TData, TError>;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { QueryObserver, parseQueryArgs } from '@tanstack/query-core';
|
|
2
|
+
import { createBaseQuery } from './createBaseQuery';
|
|
3
|
+
export function createQuery(arg1, arg2, arg3) {
|
|
4
|
+
const parsedOptions = parseQueryArgs(arg1, arg2, arg3);
|
|
5
|
+
const result = createBaseQuery(parsedOptions, QueryObserver);
|
|
6
|
+
return result;
|
|
7
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export * from '@tanstack/query-core';
|
|
2
|
+
export * from './types';
|
|
3
|
+
export { createQuery } from './createQuery';
|
|
4
|
+
export { createQueries } from './createQueries';
|
|
5
|
+
export { createInfiniteQuery } from './createInfiniteQuery';
|
|
6
|
+
export { createMutation } from './createMutation';
|
|
7
|
+
export { useQueryClient } from './useQueryClient';
|
|
8
|
+
export { useIsFetching } from './useIsFetching';
|
|
9
|
+
export { useIsMutating } from './useIsMutating';
|
|
10
|
+
export { useHydrate } from './useHydrate';
|
|
11
|
+
export { default as Hydrate } from './Hydrate.svelte';
|
|
12
|
+
export { default as QueryClientProvider } from './QueryClientProvider.svelte';
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/* istanbul ignore file */
|
|
2
|
+
// Re-export core
|
|
3
|
+
export * from '@tanstack/query-core';
|
|
4
|
+
// Svelte Query
|
|
5
|
+
export * from './types';
|
|
6
|
+
export { createQuery } from './createQuery';
|
|
7
|
+
export { createQueries } from './createQueries';
|
|
8
|
+
export { createInfiniteQuery } from './createInfiniteQuery';
|
|
9
|
+
export { createMutation } from './createMutation';
|
|
10
|
+
export { useQueryClient } from './useQueryClient';
|
|
11
|
+
export { useIsFetching } from './useIsFetching';
|
|
12
|
+
export { useIsMutating } from './useIsMutating';
|
|
13
|
+
export { useHydrate } from './useHydrate';
|
|
14
|
+
export { default as Hydrate } from './Hydrate.svelte';
|
|
15
|
+
export { default as QueryClientProvider } from './QueryClientProvider.svelte';
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { InfiniteQueryObserverOptions, InfiniteQueryObserverResult, MutationObserverResult, QueryObserverOptions, QueryObserverResult, QueryKey, MutationObserverOptions, MutateFunction, DefinedQueryObserverResult } from '@tanstack/query-core';
|
|
2
|
+
import type { QueryClient } from '@tanstack/query-core';
|
|
3
|
+
import type { Readable } from 'svelte/store';
|
|
4
|
+
export interface ContextOptions {
|
|
5
|
+
/**
|
|
6
|
+
* Use this to pass your Svelte Query context. Otherwise, `defaultContext` will be used.
|
|
7
|
+
*/
|
|
8
|
+
context?: QueryClient | undefined;
|
|
9
|
+
}
|
|
10
|
+
export interface CreateBaseQueryOptions<TQueryFnData = unknown, TError = unknown, TData = TQueryFnData, TQueryData = TQueryFnData, TQueryKey extends QueryKey = QueryKey> extends ContextOptions, QueryObserverOptions<TQueryFnData, TError, TData, TQueryData, TQueryKey> {
|
|
11
|
+
}
|
|
12
|
+
export interface CreateQueryOptions<TQueryFnData = unknown, TError = unknown, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey> extends CreateBaseQueryOptions<TQueryFnData, TError, TData, TQueryFnData, TQueryKey> {
|
|
13
|
+
}
|
|
14
|
+
export interface CreateInfiniteQueryOptions<TQueryFnData = unknown, TError = unknown, TData = TQueryFnData, TQueryData = TQueryFnData, TQueryKey extends QueryKey = QueryKey> extends InfiniteQueryObserverOptions<TQueryFnData, TError, TData, TQueryData, TQueryKey> {
|
|
15
|
+
}
|
|
16
|
+
export declare type CreateInfiniteQueryResult<TData = unknown, TError = unknown> = Readable<InfiniteQueryObserverResult<TData, TError>>;
|
|
17
|
+
export interface CreateInfiniteQueryStoreResult<TQueryFnData = unknown, TError = unknown, TData = TQueryFnData> extends Readable<CreateInfiniteQueryResult<TData, TError>> {
|
|
18
|
+
}
|
|
19
|
+
export declare type CreateBaseQueryResult<TData = unknown, TError = unknown> = QueryObserverResult<TData, TError>;
|
|
20
|
+
export declare type CreateQueryResult<TData = unknown, TError = unknown> = CreateBaseQueryResult<TData, TError>;
|
|
21
|
+
export interface CreateQueryStoreResult<TQueryFnData = unknown, TError = unknown, TData = TQueryFnData> extends Readable<CreateQueryResult<TData, TError>> {
|
|
22
|
+
}
|
|
23
|
+
export declare type DefinedCreateBaseQueryResult<TData = unknown, TError = unknown> = Readable<DefinedQueryObserverResult<TData, TError>>;
|
|
24
|
+
export declare type DefinedCreateQueryResult<TData = unknown, TError = unknown> = DefinedCreateBaseQueryResult<TData, TError>;
|
|
25
|
+
export interface CreateMutationOptions<TData = unknown, TError = unknown, TVariables = void, TContext = unknown> extends ContextOptions, Omit<MutationObserverOptions<TData, TError, TVariables, TContext>, '_defaulted' | 'variables'> {
|
|
26
|
+
}
|
|
27
|
+
export declare type UseMutateFunction<TData = unknown, TError = unknown, TVariables = void, TContext = unknown> = (...args: Parameters<MutateFunction<TData, TError, TVariables, TContext>>) => void;
|
|
28
|
+
export declare type UseMutateAsyncFunction<TData = unknown, TError = unknown, TVariables = void, TContext = unknown> = MutateFunction<TData, TError, TVariables, TContext>;
|
|
29
|
+
export declare type UseBaseMutationResult<TData = unknown, TError = unknown, TVariables = unknown, TContext = unknown> = Override<MutationObserverResult<TData, TError, TVariables, TContext>, {
|
|
30
|
+
mutate: UseMutateFunction<TData, TError, TVariables, TContext>;
|
|
31
|
+
}> & {
|
|
32
|
+
mutateAsync: UseMutateAsyncFunction<TData, TError, TVariables, TContext>;
|
|
33
|
+
};
|
|
34
|
+
export declare type CreateMutationResult<TData = unknown, TError = unknown, TVariables = unknown, TContext = unknown> = UseBaseMutationResult<TData, TError, TVariables, TContext>;
|
|
35
|
+
export interface MutationStoreResult<TData = unknown, TError = unknown, TVariables = unknown, TContext = unknown> extends Readable<CreateMutationResult<TData, TError, TVariables, TContext>> {
|
|
36
|
+
}
|
|
37
|
+
declare type Override<A, B> = {
|
|
38
|
+
[K in keyof A]: K extends keyof B ? B[K] : A[K];
|
|
39
|
+
};
|
|
40
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type QueryFilters, type QueryKey } from '@tanstack/query-core';
|
|
2
|
+
import { type Readable } from 'svelte/store';
|
|
3
|
+
export declare function useIsFetching(filters?: QueryFilters): Readable<number>;
|
|
4
|
+
export declare function useIsFetching(queryKey?: QueryKey, filters?: QueryFilters): Readable<number>;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { parseFilterArgs, notifyManager, } from '@tanstack/query-core';
|
|
2
|
+
import { readable } from 'svelte/store';
|
|
3
|
+
import { useQueryClient } from './useQueryClient';
|
|
4
|
+
export function useIsFetching(arg1, arg2) {
|
|
5
|
+
const [filters] = parseFilterArgs(arg1, arg2);
|
|
6
|
+
const client = useQueryClient();
|
|
7
|
+
const cache = client.getQueryCache();
|
|
8
|
+
// isFetching is the prev value initialized on mount *
|
|
9
|
+
let isFetching = client.isFetching(filters);
|
|
10
|
+
const { subscribe } = readable(isFetching, (set) => {
|
|
11
|
+
return cache.subscribe(notifyManager.batchCalls(() => {
|
|
12
|
+
const newIsFetching = client.isFetching(filters);
|
|
13
|
+
if (isFetching !== newIsFetching) {
|
|
14
|
+
// * and update with each change
|
|
15
|
+
isFetching = newIsFetching;
|
|
16
|
+
set(isFetching);
|
|
17
|
+
}
|
|
18
|
+
}));
|
|
19
|
+
});
|
|
20
|
+
return { subscribe };
|
|
21
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type MutationFilters, type MutationKey } from '@tanstack/query-core';
|
|
2
|
+
import { type Readable } from 'svelte/store';
|
|
3
|
+
export declare function useIsMutating(filters?: MutationFilters): Readable<number>;
|
|
4
|
+
export declare function useIsMutating(mutationKey?: MutationKey, filters?: Omit<MutationFilters, 'mutationKey'>): Readable<number>;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { notifyManager, parseMutationFilterArgs, } from '@tanstack/query-core';
|
|
2
|
+
import { readable } from 'svelte/store';
|
|
3
|
+
import { useQueryClient } from './useQueryClient';
|
|
4
|
+
export function useIsMutating(arg1, arg2) {
|
|
5
|
+
const [filters] = parseMutationFilterArgs(arg1, arg2);
|
|
6
|
+
const client = useQueryClient();
|
|
7
|
+
const cache = client.getMutationCache();
|
|
8
|
+
// isMutating is the prev value initialized on mount *
|
|
9
|
+
let isMutating = client.isMutating(filters);
|
|
10
|
+
const { subscribe } = readable(isMutating, (set) => {
|
|
11
|
+
return cache.subscribe(notifyManager.batchCalls(() => {
|
|
12
|
+
const newIisMutating = client.isMutating(filters);
|
|
13
|
+
if (isMutating !== newIisMutating) {
|
|
14
|
+
// * and update with each change
|
|
15
|
+
isMutating = newIisMutating;
|
|
16
|
+
set(isMutating);
|
|
17
|
+
}
|
|
18
|
+
}));
|
|
19
|
+
});
|
|
20
|
+
return { subscribe };
|
|
21
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@tanstack/svelte-query",
|
|
3
|
+
"version": "4.21.0",
|
|
4
|
+
"description": "Primitives for managing, caching and syncing asynchronous and remote data in Svelte",
|
|
5
|
+
"author": "Dre Johnson",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"repository": "tanstack/query",
|
|
8
|
+
"homepage": "https://tanstack.com/query",
|
|
9
|
+
"funding": {
|
|
10
|
+
"type": "github",
|
|
11
|
+
"url": "https://github.com/sponsors/tannerlinsley"
|
|
12
|
+
},
|
|
13
|
+
"types": "build/lib/index.d.ts",
|
|
14
|
+
"module": "build/lib/index.js",
|
|
15
|
+
"type": "module",
|
|
16
|
+
"devDependencies": {
|
|
17
|
+
"@sveltejs/adapter-auto": "^1.0.0",
|
|
18
|
+
"@sveltejs/kit": "^1.0.0",
|
|
19
|
+
"@sveltejs/package": "^1.0.0",
|
|
20
|
+
"@testing-library/svelte": "^3.2.2",
|
|
21
|
+
"@vitest/coverage-istanbul": "^0.26.3",
|
|
22
|
+
"eslint-plugin-svelte": "^2.14.1",
|
|
23
|
+
"jsdom": "^20.0.3",
|
|
24
|
+
"rimraf": "^3.0.2",
|
|
25
|
+
"svelte": "^3.54.0",
|
|
26
|
+
"svelte-check": "^2.9.2",
|
|
27
|
+
"tslib": "^2.4.1",
|
|
28
|
+
"typescript": "^4.7.4",
|
|
29
|
+
"vite": "^4.0.0",
|
|
30
|
+
"vitest": "^0.26.3"
|
|
31
|
+
},
|
|
32
|
+
"dependencies": {
|
|
33
|
+
"@tanstack/query-core": "4.21.0"
|
|
34
|
+
},
|
|
35
|
+
"peerDependencies": {
|
|
36
|
+
"svelte": "^3.54.0"
|
|
37
|
+
},
|
|
38
|
+
"exports": {
|
|
39
|
+
"./package.json": "./package.json",
|
|
40
|
+
".": "./build/lib/index.js"
|
|
41
|
+
},
|
|
42
|
+
"svelte": "./build/lib/index.js",
|
|
43
|
+
"files": [
|
|
44
|
+
"build/lib/*",
|
|
45
|
+
"src"
|
|
46
|
+
],
|
|
47
|
+
"scripts": {
|
|
48
|
+
"clean": "rimraf ./build",
|
|
49
|
+
"build": "svelte-kit sync && svelte-package && rimraf ./build/lib/package.json",
|
|
50
|
+
"check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
|
|
51
|
+
"test:eslint": "svelte-kit sync && ../../node_modules/.bin/eslint --ext .svelte,.ts ./src",
|
|
52
|
+
"test:jest": "svelte-kit sync && vitest run --coverage"
|
|
53
|
+
}
|
|
54
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { createMutation, QueryClient } from '../lib'
|
|
3
|
+
import { setQueryClientContext } from '../lib/context'
|
|
4
|
+
|
|
5
|
+
export let queryFn: () => Promise<string>
|
|
6
|
+
|
|
7
|
+
const queryClient = new QueryClient()
|
|
8
|
+
setQueryClientContext(queryClient)
|
|
9
|
+
|
|
10
|
+
const mutation = createMutation(queryFn)
|
|
11
|
+
</script>
|
|
12
|
+
|
|
13
|
+
<button on:click={$mutation.mutate}>Click</button>
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { createQuery, QueryClient } from '../lib'
|
|
3
|
+
import { setQueryClientContext } from '../lib/context'
|
|
4
|
+
|
|
5
|
+
export let queryKey: Array<string>
|
|
6
|
+
export let queryFn: () => Promise<string>
|
|
7
|
+
|
|
8
|
+
const queryClient = new QueryClient()
|
|
9
|
+
setQueryClientContext(queryClient)
|
|
10
|
+
|
|
11
|
+
const query = createQuery({
|
|
12
|
+
queryKey,
|
|
13
|
+
queryFn,
|
|
14
|
+
})
|
|
15
|
+
</script>
|
|
16
|
+
|
|
17
|
+
{#if $query.isLoading}
|
|
18
|
+
<p>Loading</p>
|
|
19
|
+
{:else if $query.isError}
|
|
20
|
+
<p>Error</p>
|
|
21
|
+
{:else if $query.isSuccess}
|
|
22
|
+
<p>Success</p>
|
|
23
|
+
{/if}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { describe, it, expect, vi } from 'vitest'
|
|
2
|
+
import { fireEvent, render, screen } from '@testing-library/svelte'
|
|
3
|
+
import CreateMutation from './CreateMutation.svelte'
|
|
4
|
+
import { sleep } from './utils'
|
|
5
|
+
|
|
6
|
+
describe('createMutation', () => {
|
|
7
|
+
it('Call mutate and check function runs', async () => {
|
|
8
|
+
const queryFn = vi.fn()
|
|
9
|
+
|
|
10
|
+
render(CreateMutation, {
|
|
11
|
+
props: {
|
|
12
|
+
queryFn,
|
|
13
|
+
},
|
|
14
|
+
})
|
|
15
|
+
|
|
16
|
+
fireEvent.click(screen.getByRole('button'))
|
|
17
|
+
|
|
18
|
+
await sleep(200)
|
|
19
|
+
|
|
20
|
+
expect(queryFn).toHaveBeenCalledTimes(1)
|
|
21
|
+
})
|
|
22
|
+
})
|