@tanstack/svelte-query 4.22.4 → 4.24.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/lib/createQueries.d.ts +8 -8
- package/package.json +2 -3
- package/src/__tests__/CreateMutation.svelte +7 -5
- package/src/__tests__/CreateQueries.svelte +18 -0
- package/src/__tests__/CreateQuery.svelte +3 -7
- package/src/__tests__/createMutation.test.ts +4 -2
- package/src/__tests__/createQueries.test.ts +37 -0
- package/src/__tests__/createQuery.test.ts +14 -14
- package/src/createQueries.ts +19 -14
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { QueryKey, QueryFunction } from '@tanstack/query-core';
|
|
1
|
+
import type { QueryKey, QueryFunction, QueryObserverResult } from '@tanstack/query-core';
|
|
2
2
|
import { type Readable } from 'svelte/store';
|
|
3
|
-
import type { CreateQueryOptions
|
|
3
|
+
import type { CreateQueryOptions } from './types';
|
|
4
4
|
declare type CreateQueryOptionsForCreateQueries<TQueryFnData = unknown, TError = unknown, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey> = Omit<CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>, 'context'>;
|
|
5
5
|
declare type MAXIMUM_DEPTH = 20;
|
|
6
6
|
declare type GetOptions<T> = T extends {
|
|
@@ -23,18 +23,18 @@ declare type GetResults<T> = T extends {
|
|
|
23
23
|
queryFnData: any;
|
|
24
24
|
error?: infer TError;
|
|
25
25
|
data: infer TData;
|
|
26
|
-
} ?
|
|
26
|
+
} ? QueryObserverResult<TData, TError> : T extends {
|
|
27
27
|
queryFnData: infer TQueryFnData;
|
|
28
28
|
error?: infer TError;
|
|
29
|
-
} ?
|
|
29
|
+
} ? QueryObserverResult<TQueryFnData, TError> : T extends {
|
|
30
30
|
data: infer TData;
|
|
31
31
|
error?: infer TError;
|
|
32
|
-
} ?
|
|
32
|
+
} ? QueryObserverResult<TData, TError> : T extends [any, infer TError, infer TData] ? QueryObserverResult<TData, TError> : T extends [infer TQueryFnData, infer TError] ? QueryObserverResult<TQueryFnData, TError> : T extends [infer TQueryFnData] ? QueryObserverResult<TQueryFnData> : T extends {
|
|
33
33
|
queryFn?: QueryFunction<unknown, any>;
|
|
34
34
|
select: (data: any) => infer TData;
|
|
35
|
-
} ?
|
|
35
|
+
} ? QueryObserverResult<TData> : T extends {
|
|
36
36
|
queryFn?: QueryFunction<infer TQueryFnData, any>;
|
|
37
|
-
} ?
|
|
37
|
+
} ? QueryObserverResult<TQueryFnData> : QueryObserverResult;
|
|
38
38
|
/**
|
|
39
39
|
* QueriesOptions reducer recursively unwraps function arguments to infer/enforce type param
|
|
40
40
|
*/
|
|
@@ -42,7 +42,7 @@ export declare type QueriesOptions<T extends any[], Result extends any[] = [], D
|
|
|
42
42
|
/**
|
|
43
43
|
* QueriesResults reducer recursively maps type param to results
|
|
44
44
|
*/
|
|
45
|
-
export declare type QueriesResults<T extends any[], Result extends any[] = [], Depth extends ReadonlyArray<number> = []> = Depth['length'] extends MAXIMUM_DEPTH ?
|
|
45
|
+
export declare type QueriesResults<T extends any[], Result extends any[] = [], Depth extends ReadonlyArray<number> = []> = Depth['length'] extends MAXIMUM_DEPTH ? QueryObserverResult[] : 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>[] ? QueryObserverResult<unknown extends TData ? TQueryFnData : TData, TError>[] : QueryObserverResult[];
|
|
46
46
|
export declare type CreateQueriesResult<T extends any[]> = Readable<QueriesResults<T>>;
|
|
47
47
|
export declare function createQueries<T extends any[]>(queries: readonly [...QueriesOptions<T>]): CreateQueriesResult<T>;
|
|
48
48
|
export {};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tanstack/svelte-query",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.24.2",
|
|
4
4
|
"description": "Primitives for managing, caching and syncing asynchronous and remote data in Svelte",
|
|
5
5
|
"author": "Dre Johnson",
|
|
6
6
|
"license": "MIT",
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
"vitest": "^0.27.1"
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@tanstack/query-core": "4.
|
|
31
|
+
"@tanstack/query-core": "4.24.2"
|
|
32
32
|
},
|
|
33
33
|
"peerDependencies": {
|
|
34
34
|
"svelte": "^3.54.0"
|
|
@@ -48,7 +48,6 @@
|
|
|
48
48
|
"test:eslint": "eslint --ext .svelte,.ts ./src",
|
|
49
49
|
"test:lib": "vitest run --coverage true",
|
|
50
50
|
"test:lib:dev": "vitest watch",
|
|
51
|
-
"test:lib:publish": "vitest run --coverage false",
|
|
52
51
|
"build": "svelte-package && rimraf ./build/lib/package.json"
|
|
53
52
|
}
|
|
54
53
|
}
|
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
createMutation,
|
|
4
|
+
QueryClient,
|
|
5
|
+
type CreateMutationOptions,
|
|
6
|
+
} from '../index'
|
|
3
7
|
import { setQueryClientContext } from '../context'
|
|
4
8
|
|
|
5
|
-
export let
|
|
9
|
+
export let options: CreateMutationOptions
|
|
6
10
|
|
|
7
11
|
const queryClient = new QueryClient()
|
|
8
12
|
setQueryClientContext(queryClient)
|
|
9
13
|
|
|
10
|
-
const mutation = createMutation(
|
|
11
|
-
mutationFn,
|
|
12
|
-
})
|
|
14
|
+
const mutation = createMutation(options)
|
|
13
15
|
</script>
|
|
14
16
|
|
|
15
17
|
<button on:click={() => $mutation.mutate()}>Click</button>
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { createQueries, QueryClient } from '../index'
|
|
3
|
+
import { setQueryClientContext } from '../context'
|
|
4
|
+
import type { QueriesOptions } from '../createQueries'
|
|
5
|
+
|
|
6
|
+
export let options: readonly [...QueriesOptions<any>]
|
|
7
|
+
|
|
8
|
+
const queryClient = new QueryClient()
|
|
9
|
+
setQueryClientContext(queryClient)
|
|
10
|
+
|
|
11
|
+
const queries = createQueries(options)
|
|
12
|
+
</script>
|
|
13
|
+
|
|
14
|
+
{#each $queries as query}
|
|
15
|
+
{#if query.isSuccess}
|
|
16
|
+
<p>{query.data}</p>
|
|
17
|
+
{/if}
|
|
18
|
+
{/each}
|
|
@@ -1,17 +1,13 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import { createQuery, QueryClient } from '../index'
|
|
2
|
+
import { createQuery, QueryClient, type CreateQueryOptions } from '../index'
|
|
3
3
|
import { setQueryClientContext } from '../context'
|
|
4
4
|
|
|
5
|
-
export let
|
|
6
|
-
export let queryFn: () => Promise<string>
|
|
5
|
+
export let options: CreateQueryOptions
|
|
7
6
|
|
|
8
7
|
const queryClient = new QueryClient()
|
|
9
8
|
setQueryClientContext(queryClient)
|
|
10
9
|
|
|
11
|
-
const query = createQuery(
|
|
12
|
-
queryKey,
|
|
13
|
-
queryFn,
|
|
14
|
-
})
|
|
10
|
+
const query = createQuery(options)
|
|
15
11
|
</script>
|
|
16
12
|
|
|
17
13
|
{#if $query.isLoading}
|
|
@@ -9,13 +9,15 @@ describe('createMutation', () => {
|
|
|
9
9
|
|
|
10
10
|
render(CreateMutation, {
|
|
11
11
|
props: {
|
|
12
|
-
|
|
12
|
+
options: {
|
|
13
|
+
mutationFn,
|
|
14
|
+
},
|
|
13
15
|
},
|
|
14
16
|
})
|
|
15
17
|
|
|
16
18
|
fireEvent.click(screen.getByRole('button'))
|
|
17
19
|
|
|
18
|
-
await sleep(
|
|
20
|
+
await sleep(20)
|
|
19
21
|
|
|
20
22
|
expect(mutationFn).toHaveBeenCalledTimes(1)
|
|
21
23
|
})
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest'
|
|
2
|
+
import { render, screen } from '@testing-library/svelte'
|
|
3
|
+
import CreateQueries from './CreateQueries.svelte'
|
|
4
|
+
import { sleep } from './utils'
|
|
5
|
+
|
|
6
|
+
describe('createQueries', () => {
|
|
7
|
+
it('Render and wait for success', async () => {
|
|
8
|
+
render(CreateQueries, {
|
|
9
|
+
props: {
|
|
10
|
+
options: [
|
|
11
|
+
{
|
|
12
|
+
queryKey: ['key-1'],
|
|
13
|
+
queryFn: async () => {
|
|
14
|
+
await sleep(10)
|
|
15
|
+
return 'Success 1'
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
queryKey: ['key-2'],
|
|
20
|
+
queryFn: async () => {
|
|
21
|
+
await sleep(10)
|
|
22
|
+
return 'Success 2'
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
],
|
|
26
|
+
},
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
expect(screen.queryByText('Success 1')).not.toBeInTheDocument()
|
|
30
|
+
expect(screen.queryByText('Success 2')).not.toBeInTheDocument()
|
|
31
|
+
|
|
32
|
+
await sleep(20)
|
|
33
|
+
|
|
34
|
+
expect(screen.queryByText('Success 1')).toBeInTheDocument()
|
|
35
|
+
expect(screen.queryByText('Success 2')).toBeInTheDocument()
|
|
36
|
+
})
|
|
37
|
+
})
|
|
@@ -1,28 +1,28 @@
|
|
|
1
1
|
import { describe, it, expect } from 'vitest'
|
|
2
|
-
import { render,
|
|
2
|
+
import { render, waitFor } from '@testing-library/svelte'
|
|
3
3
|
import CreateQuery from './CreateQuery.svelte'
|
|
4
4
|
import { sleep } from './utils'
|
|
5
5
|
|
|
6
6
|
describe('createQuery', () => {
|
|
7
7
|
it('Render and wait for success', async () => {
|
|
8
|
-
render(CreateQuery, {
|
|
8
|
+
const rendered = render(CreateQuery, {
|
|
9
9
|
props: {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
10
|
+
options: {
|
|
11
|
+
queryKey: ['test'],
|
|
12
|
+
queryFn: async () => {
|
|
13
|
+
await sleep(10)
|
|
14
|
+
return 'Success'
|
|
15
|
+
},
|
|
14
16
|
},
|
|
15
17
|
},
|
|
16
18
|
})
|
|
17
19
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
await sleep(200)
|
|
20
|
+
await waitFor(() => {
|
|
21
|
+
expect(rendered.getByText('Loading')).toBeInTheDocument()
|
|
22
|
+
})
|
|
23
23
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
24
|
+
await waitFor(() => {
|
|
25
|
+
expect(rendered.getByText('Success')).toBeInTheDocument()
|
|
26
|
+
})
|
|
27
27
|
})
|
|
28
28
|
})
|
package/src/createQueries.ts
CHANGED
|
@@ -1,9 +1,14 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type {
|
|
2
|
+
QueryKey,
|
|
3
|
+
QueryFunction,
|
|
4
|
+
QueryClient,
|
|
5
|
+
QueryObserverResult,
|
|
6
|
+
} from '@tanstack/query-core'
|
|
2
7
|
|
|
3
8
|
import { notifyManager, QueriesObserver } from '@tanstack/query-core'
|
|
4
9
|
import { readable, type Readable } from 'svelte/store'
|
|
5
10
|
|
|
6
|
-
import type { CreateQueryOptions
|
|
11
|
+
import type { CreateQueryOptions } from './types'
|
|
7
12
|
import { useQueryClient } from './useQueryClient'
|
|
8
13
|
|
|
9
14
|
// This defines the `CreateQueryOptions` that are accepted in `QueriesOptions` & `GetOptions`.
|
|
@@ -61,28 +66,28 @@ type GetOptions<T> =
|
|
|
61
66
|
type GetResults<T> =
|
|
62
67
|
// Part 1: responsible for mapping explicit type parameter to function result, if object
|
|
63
68
|
T extends { queryFnData: any; error?: infer TError; data: infer TData }
|
|
64
|
-
?
|
|
69
|
+
? QueryObserverResult<TData, TError>
|
|
65
70
|
: T extends { queryFnData: infer TQueryFnData; error?: infer TError }
|
|
66
|
-
?
|
|
71
|
+
? QueryObserverResult<TQueryFnData, TError>
|
|
67
72
|
: T extends { data: infer TData; error?: infer TError }
|
|
68
|
-
?
|
|
73
|
+
? QueryObserverResult<TData, TError>
|
|
69
74
|
: // Part 2: responsible for mapping explicit type parameter to function result, if tuple
|
|
70
75
|
T extends [any, infer TError, infer TData]
|
|
71
|
-
?
|
|
76
|
+
? QueryObserverResult<TData, TError>
|
|
72
77
|
: T extends [infer TQueryFnData, infer TError]
|
|
73
|
-
?
|
|
78
|
+
? QueryObserverResult<TQueryFnData, TError>
|
|
74
79
|
: T extends [infer TQueryFnData]
|
|
75
|
-
?
|
|
80
|
+
? QueryObserverResult<TQueryFnData>
|
|
76
81
|
: // Part 3: responsible for mapping inferred type to results, if no explicit parameter was provided
|
|
77
82
|
T extends {
|
|
78
83
|
queryFn?: QueryFunction<unknown, any>
|
|
79
84
|
select: (data: any) => infer TData
|
|
80
85
|
}
|
|
81
|
-
?
|
|
86
|
+
? QueryObserverResult<TData>
|
|
82
87
|
: T extends { queryFn?: QueryFunction<infer TQueryFnData, any> }
|
|
83
|
-
?
|
|
88
|
+
? QueryObserverResult<TQueryFnData>
|
|
84
89
|
: // Fallback
|
|
85
|
-
|
|
90
|
+
QueryObserverResult
|
|
86
91
|
|
|
87
92
|
/**
|
|
88
93
|
* QueriesOptions reducer recursively unwraps function arguments to infer/enforce type param
|
|
@@ -121,7 +126,7 @@ export type QueriesResults<
|
|
|
121
126
|
Result extends any[] = [],
|
|
122
127
|
Depth extends ReadonlyArray<number> = [],
|
|
123
128
|
> = Depth['length'] extends MAXIMUM_DEPTH
|
|
124
|
-
?
|
|
129
|
+
? QueryObserverResult[]
|
|
125
130
|
: T extends []
|
|
126
131
|
? []
|
|
127
132
|
: T extends [infer Head]
|
|
@@ -135,9 +140,9 @@ export type QueriesResults<
|
|
|
135
140
|
any
|
|
136
141
|
>[]
|
|
137
142
|
? // Dynamic-size (homogenous) CreateQueryOptions array: map directly to array of results
|
|
138
|
-
|
|
143
|
+
QueryObserverResult<unknown extends TData ? TQueryFnData : TData, TError>[]
|
|
139
144
|
: // Fallback
|
|
140
|
-
|
|
145
|
+
QueryObserverResult[]
|
|
141
146
|
|
|
142
147
|
export type CreateQueriesResult<T extends any[]> = Readable<QueriesResults<T>>
|
|
143
148
|
|