@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
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { QueryObserver, parseQueryArgs } from '@tanstack/query-core'
|
|
2
|
+
import type { QueryFunction, QueryKey } from '@tanstack/query-core'
|
|
3
|
+
import { createBaseQuery } from './createBaseQuery'
|
|
4
|
+
import type {
|
|
5
|
+
DefinedCreateQueryResult,
|
|
6
|
+
CreateQueryOptions,
|
|
7
|
+
CreateQueryStoreResult,
|
|
8
|
+
} from './types'
|
|
9
|
+
|
|
10
|
+
export function createQuery<
|
|
11
|
+
TQueryFnData = unknown,
|
|
12
|
+
TError = unknown,
|
|
13
|
+
TData = TQueryFnData,
|
|
14
|
+
TQueryKey extends QueryKey = QueryKey,
|
|
15
|
+
>(
|
|
16
|
+
options: Omit<
|
|
17
|
+
CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
|
|
18
|
+
'initialData'
|
|
19
|
+
> & {
|
|
20
|
+
initialData?: () => undefined
|
|
21
|
+
},
|
|
22
|
+
): CreateQueryStoreResult<TData, TError>
|
|
23
|
+
|
|
24
|
+
export function createQuery<
|
|
25
|
+
TQueryFnData = unknown,
|
|
26
|
+
TError = unknown,
|
|
27
|
+
TData = TQueryFnData,
|
|
28
|
+
TQueryKey extends QueryKey = QueryKey,
|
|
29
|
+
>(
|
|
30
|
+
options: Omit<
|
|
31
|
+
CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
|
|
32
|
+
'initialData'
|
|
33
|
+
> & {
|
|
34
|
+
initialData: TQueryFnData | (() => TQueryFnData)
|
|
35
|
+
},
|
|
36
|
+
): DefinedCreateQueryResult<TData, TError>
|
|
37
|
+
|
|
38
|
+
export function createQuery<
|
|
39
|
+
TQueryFnData = unknown,
|
|
40
|
+
TError = unknown,
|
|
41
|
+
TData = TQueryFnData,
|
|
42
|
+
TQueryKey extends QueryKey = QueryKey,
|
|
43
|
+
>(
|
|
44
|
+
options: CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
|
|
45
|
+
): CreateQueryStoreResult<TData, TError>
|
|
46
|
+
|
|
47
|
+
export function createQuery<
|
|
48
|
+
TQueryFnData = unknown,
|
|
49
|
+
TError = unknown,
|
|
50
|
+
TData = TQueryFnData,
|
|
51
|
+
TQueryKey extends QueryKey = QueryKey,
|
|
52
|
+
>(
|
|
53
|
+
queryKey: TQueryKey,
|
|
54
|
+
options?: Omit<
|
|
55
|
+
CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
|
|
56
|
+
'queryKey' | 'initialData'
|
|
57
|
+
> & { initialData?: () => undefined },
|
|
58
|
+
): CreateQueryStoreResult<TData, TError>
|
|
59
|
+
|
|
60
|
+
export function createQuery<
|
|
61
|
+
TQueryFnData = unknown,
|
|
62
|
+
TError = unknown,
|
|
63
|
+
TData = TQueryFnData,
|
|
64
|
+
TQueryKey extends QueryKey = QueryKey,
|
|
65
|
+
>(
|
|
66
|
+
queryKey: TQueryKey,
|
|
67
|
+
options?: Omit<
|
|
68
|
+
CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
|
|
69
|
+
'queryKey' | 'initialData'
|
|
70
|
+
> & { initialData: TQueryFnData | (() => TQueryFnData) },
|
|
71
|
+
): DefinedCreateQueryResult<TData, TError>
|
|
72
|
+
|
|
73
|
+
export function createQuery<
|
|
74
|
+
TQueryFnData = unknown,
|
|
75
|
+
TError = unknown,
|
|
76
|
+
TData = TQueryFnData,
|
|
77
|
+
TQueryKey extends QueryKey = QueryKey,
|
|
78
|
+
>(
|
|
79
|
+
queryKey: TQueryKey,
|
|
80
|
+
options?: Omit<
|
|
81
|
+
CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
|
|
82
|
+
'queryKey'
|
|
83
|
+
>,
|
|
84
|
+
): CreateQueryStoreResult<TData, TError>
|
|
85
|
+
|
|
86
|
+
export function createQuery<
|
|
87
|
+
TQueryFnData = unknown,
|
|
88
|
+
TError = unknown,
|
|
89
|
+
TData = TQueryFnData,
|
|
90
|
+
TQueryKey extends QueryKey = QueryKey,
|
|
91
|
+
>(
|
|
92
|
+
queryKey: TQueryKey,
|
|
93
|
+
queryFn: QueryFunction<TQueryFnData, TQueryKey>,
|
|
94
|
+
options?: Omit<
|
|
95
|
+
CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
|
|
96
|
+
'queryKey' | 'queryFn' | 'initialData'
|
|
97
|
+
> & { initialData?: () => undefined },
|
|
98
|
+
): CreateQueryStoreResult<TData, TError>
|
|
99
|
+
|
|
100
|
+
export function createQuery<
|
|
101
|
+
TQueryFnData = unknown,
|
|
102
|
+
TError = unknown,
|
|
103
|
+
TData = TQueryFnData,
|
|
104
|
+
TQueryKey extends QueryKey = QueryKey,
|
|
105
|
+
>(
|
|
106
|
+
queryKey: TQueryKey,
|
|
107
|
+
queryFn: QueryFunction<TQueryFnData, TQueryKey>,
|
|
108
|
+
options?: Omit<
|
|
109
|
+
CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
|
|
110
|
+
'queryKey' | 'queryFn' | 'initialData'
|
|
111
|
+
> & { initialData: TQueryFnData | (() => TQueryFnData) },
|
|
112
|
+
): DefinedCreateQueryResult<TData, TError>
|
|
113
|
+
|
|
114
|
+
export function createQuery<
|
|
115
|
+
TQueryFnData = unknown,
|
|
116
|
+
TError = unknown,
|
|
117
|
+
TData = TQueryFnData,
|
|
118
|
+
TQueryKey extends QueryKey = QueryKey,
|
|
119
|
+
>(
|
|
120
|
+
queryKey: TQueryKey,
|
|
121
|
+
queryFn: QueryFunction<TQueryFnData, TQueryKey>,
|
|
122
|
+
options?: Omit<
|
|
123
|
+
CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
|
|
124
|
+
'queryKey' | 'queryFn'
|
|
125
|
+
>,
|
|
126
|
+
): CreateQueryStoreResult<TData, TError>
|
|
127
|
+
|
|
128
|
+
export function createQuery<
|
|
129
|
+
TQueryFnData,
|
|
130
|
+
TError,
|
|
131
|
+
TData = TQueryFnData,
|
|
132
|
+
TQueryKey extends QueryKey = QueryKey,
|
|
133
|
+
>(
|
|
134
|
+
arg1: TQueryKey | CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
|
|
135
|
+
arg2?:
|
|
136
|
+
| QueryFunction<TQueryFnData, TQueryKey>
|
|
137
|
+
| CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
|
|
138
|
+
arg3?: CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
|
|
139
|
+
): CreateQueryStoreResult<TData, TError> {
|
|
140
|
+
const parsedOptions = parseQueryArgs(arg1, arg2, arg3)
|
|
141
|
+
const result = createBaseQuery(parsedOptions, QueryObserver)
|
|
142
|
+
return result
|
|
143
|
+
}
|
package/src/lib/index.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/* istanbul ignore file */
|
|
2
|
+
|
|
3
|
+
// Re-export core
|
|
4
|
+
export * from '@tanstack/query-core'
|
|
5
|
+
|
|
6
|
+
// Svelte Query
|
|
7
|
+
export * from './types'
|
|
8
|
+
export { createQuery } from './createQuery'
|
|
9
|
+
export { createQueries } from './createQueries'
|
|
10
|
+
export { createInfiniteQuery } from './createInfiniteQuery'
|
|
11
|
+
export { createMutation } from './createMutation'
|
|
12
|
+
export { useQueryClient } from './useQueryClient'
|
|
13
|
+
export { useIsFetching } from './useIsFetching'
|
|
14
|
+
export { useIsMutating } from './useIsMutating'
|
|
15
|
+
export { useHydrate } from './useHydrate'
|
|
16
|
+
export { default as Hydrate } from './Hydrate.svelte'
|
|
17
|
+
export { default as QueryClientProvider } from './QueryClientProvider.svelte'
|
package/src/lib/types.ts
ADDED
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
InfiniteQueryObserverOptions,
|
|
3
|
+
InfiniteQueryObserverResult,
|
|
4
|
+
MutationObserverResult,
|
|
5
|
+
QueryObserverOptions,
|
|
6
|
+
QueryObserverResult,
|
|
7
|
+
QueryKey,
|
|
8
|
+
MutationObserverOptions,
|
|
9
|
+
MutateFunction,
|
|
10
|
+
DefinedQueryObserverResult,
|
|
11
|
+
} from '@tanstack/query-core'
|
|
12
|
+
import type { QueryClient } from '@tanstack/query-core'
|
|
13
|
+
import type { Readable } from 'svelte/store'
|
|
14
|
+
|
|
15
|
+
export interface ContextOptions {
|
|
16
|
+
/**
|
|
17
|
+
* Use this to pass your Svelte Query context. Otherwise, `defaultContext` will be used.
|
|
18
|
+
*/
|
|
19
|
+
context?: QueryClient | undefined
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface CreateBaseQueryOptions<
|
|
23
|
+
TQueryFnData = unknown,
|
|
24
|
+
TError = unknown,
|
|
25
|
+
TData = TQueryFnData,
|
|
26
|
+
TQueryData = TQueryFnData,
|
|
27
|
+
TQueryKey extends QueryKey = QueryKey,
|
|
28
|
+
> extends ContextOptions,
|
|
29
|
+
QueryObserverOptions<TQueryFnData, TError, TData, TQueryData, TQueryKey> {}
|
|
30
|
+
|
|
31
|
+
export interface CreateQueryOptions<
|
|
32
|
+
TQueryFnData = unknown,
|
|
33
|
+
TError = unknown,
|
|
34
|
+
TData = TQueryFnData,
|
|
35
|
+
TQueryKey extends QueryKey = QueryKey,
|
|
36
|
+
> extends CreateBaseQueryOptions<
|
|
37
|
+
TQueryFnData,
|
|
38
|
+
TError,
|
|
39
|
+
TData,
|
|
40
|
+
TQueryFnData,
|
|
41
|
+
TQueryKey
|
|
42
|
+
> {}
|
|
43
|
+
|
|
44
|
+
export interface CreateInfiniteQueryOptions<
|
|
45
|
+
TQueryFnData = unknown,
|
|
46
|
+
TError = unknown,
|
|
47
|
+
TData = TQueryFnData,
|
|
48
|
+
TQueryData = TQueryFnData,
|
|
49
|
+
TQueryKey extends QueryKey = QueryKey,
|
|
50
|
+
> extends InfiniteQueryObserverOptions<
|
|
51
|
+
TQueryFnData,
|
|
52
|
+
TError,
|
|
53
|
+
TData,
|
|
54
|
+
TQueryData,
|
|
55
|
+
TQueryKey
|
|
56
|
+
> {}
|
|
57
|
+
|
|
58
|
+
export type CreateInfiniteQueryResult<
|
|
59
|
+
TData = unknown,
|
|
60
|
+
TError = unknown,
|
|
61
|
+
> = Readable<InfiniteQueryObserverResult<TData, TError>>
|
|
62
|
+
|
|
63
|
+
export interface CreateInfiniteQueryStoreResult<
|
|
64
|
+
TQueryFnData = unknown,
|
|
65
|
+
TError = unknown,
|
|
66
|
+
TData = TQueryFnData,
|
|
67
|
+
> extends Readable<CreateInfiniteQueryResult<TData, TError>> {}
|
|
68
|
+
|
|
69
|
+
export type CreateBaseQueryResult<
|
|
70
|
+
TData = unknown,
|
|
71
|
+
TError = unknown,
|
|
72
|
+
> = QueryObserverResult<TData, TError>
|
|
73
|
+
|
|
74
|
+
export type CreateQueryResult<
|
|
75
|
+
TData = unknown,
|
|
76
|
+
TError = unknown,
|
|
77
|
+
> = CreateBaseQueryResult<TData, TError>
|
|
78
|
+
|
|
79
|
+
export interface CreateQueryStoreResult<
|
|
80
|
+
TQueryFnData = unknown,
|
|
81
|
+
TError = unknown,
|
|
82
|
+
TData = TQueryFnData,
|
|
83
|
+
> extends Readable<CreateQueryResult<TData, TError>> {}
|
|
84
|
+
|
|
85
|
+
export type DefinedCreateBaseQueryResult<
|
|
86
|
+
TData = unknown,
|
|
87
|
+
TError = unknown,
|
|
88
|
+
> = Readable<DefinedQueryObserverResult<TData, TError>>
|
|
89
|
+
|
|
90
|
+
export type DefinedCreateQueryResult<
|
|
91
|
+
TData = unknown,
|
|
92
|
+
TError = unknown,
|
|
93
|
+
> = DefinedCreateBaseQueryResult<TData, TError>
|
|
94
|
+
|
|
95
|
+
export interface CreateMutationOptions<
|
|
96
|
+
TData = unknown,
|
|
97
|
+
TError = unknown,
|
|
98
|
+
TVariables = void,
|
|
99
|
+
TContext = unknown,
|
|
100
|
+
> extends ContextOptions,
|
|
101
|
+
Omit<
|
|
102
|
+
MutationObserverOptions<TData, TError, TVariables, TContext>,
|
|
103
|
+
'_defaulted' | 'variables'
|
|
104
|
+
> {}
|
|
105
|
+
|
|
106
|
+
export type UseMutateFunction<
|
|
107
|
+
TData = unknown,
|
|
108
|
+
TError = unknown,
|
|
109
|
+
TVariables = void,
|
|
110
|
+
TContext = unknown,
|
|
111
|
+
> = (
|
|
112
|
+
...args: Parameters<MutateFunction<TData, TError, TVariables, TContext>>
|
|
113
|
+
) => void
|
|
114
|
+
|
|
115
|
+
export type UseMutateAsyncFunction<
|
|
116
|
+
TData = unknown,
|
|
117
|
+
TError = unknown,
|
|
118
|
+
TVariables = void,
|
|
119
|
+
TContext = unknown,
|
|
120
|
+
> = MutateFunction<TData, TError, TVariables, TContext>
|
|
121
|
+
|
|
122
|
+
export type UseBaseMutationResult<
|
|
123
|
+
TData = unknown,
|
|
124
|
+
TError = unknown,
|
|
125
|
+
TVariables = unknown,
|
|
126
|
+
TContext = unknown,
|
|
127
|
+
> = Override<
|
|
128
|
+
MutationObserverResult<TData, TError, TVariables, TContext>,
|
|
129
|
+
{ mutate: UseMutateFunction<TData, TError, TVariables, TContext> }
|
|
130
|
+
> & { mutateAsync: UseMutateAsyncFunction<TData, TError, TVariables, TContext> }
|
|
131
|
+
|
|
132
|
+
export type CreateMutationResult<
|
|
133
|
+
TData = unknown,
|
|
134
|
+
TError = unknown,
|
|
135
|
+
TVariables = unknown,
|
|
136
|
+
TContext = unknown,
|
|
137
|
+
> = UseBaseMutationResult<TData, TError, TVariables, TContext>
|
|
138
|
+
|
|
139
|
+
export interface MutationStoreResult<
|
|
140
|
+
TData = unknown,
|
|
141
|
+
TError = unknown,
|
|
142
|
+
TVariables = unknown,
|
|
143
|
+
TContext = unknown,
|
|
144
|
+
> extends Readable<CreateMutationResult<TData, TError, TVariables, TContext>> {}
|
|
145
|
+
|
|
146
|
+
type Override<A, B> = { [K in keyof A]: K extends keyof B ? B[K] : A[K] }
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type HydrateOptions,
|
|
3
|
+
type QueryClient,
|
|
4
|
+
hydrate,
|
|
5
|
+
} from '@tanstack/query-core'
|
|
6
|
+
import { useQueryClient } from './useQueryClient'
|
|
7
|
+
|
|
8
|
+
export function useHydrate(state?: unknown, options?: HydrateOptions) {
|
|
9
|
+
const client: QueryClient = useQueryClient()
|
|
10
|
+
|
|
11
|
+
if (state) {
|
|
12
|
+
hydrate(client, state, options)
|
|
13
|
+
}
|
|
14
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type QueryFilters,
|
|
3
|
+
type QueryKey,
|
|
4
|
+
type QueryClient,
|
|
5
|
+
parseFilterArgs,
|
|
6
|
+
notifyManager,
|
|
7
|
+
} from '@tanstack/query-core'
|
|
8
|
+
import { type Readable, readable } from 'svelte/store'
|
|
9
|
+
import { useQueryClient } from './useQueryClient'
|
|
10
|
+
|
|
11
|
+
export function useIsFetching(filters?: QueryFilters): Readable<number>
|
|
12
|
+
export function useIsFetching(
|
|
13
|
+
queryKey?: QueryKey,
|
|
14
|
+
filters?: QueryFilters,
|
|
15
|
+
): Readable<number>
|
|
16
|
+
|
|
17
|
+
export function useIsFetching(
|
|
18
|
+
arg1?: QueryKey | QueryFilters,
|
|
19
|
+
arg2?: QueryFilters,
|
|
20
|
+
): Readable<number> {
|
|
21
|
+
const [filters] = parseFilterArgs(arg1, arg2)
|
|
22
|
+
const client: QueryClient = useQueryClient()
|
|
23
|
+
const cache = client.getQueryCache()
|
|
24
|
+
// isFetching is the prev value initialized on mount *
|
|
25
|
+
let isFetching = client.isFetching(filters)
|
|
26
|
+
|
|
27
|
+
const { subscribe } = readable(isFetching, (set) => {
|
|
28
|
+
return cache.subscribe(
|
|
29
|
+
notifyManager.batchCalls(() => {
|
|
30
|
+
const newIsFetching = client.isFetching(filters)
|
|
31
|
+
if (isFetching !== newIsFetching) {
|
|
32
|
+
// * and update with each change
|
|
33
|
+
isFetching = newIsFetching
|
|
34
|
+
set(isFetching)
|
|
35
|
+
}
|
|
36
|
+
}),
|
|
37
|
+
)
|
|
38
|
+
})
|
|
39
|
+
|
|
40
|
+
return { subscribe }
|
|
41
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type MutationFilters,
|
|
3
|
+
type MutationKey,
|
|
4
|
+
type QueryClient,
|
|
5
|
+
notifyManager,
|
|
6
|
+
parseMutationFilterArgs,
|
|
7
|
+
} from '@tanstack/query-core'
|
|
8
|
+
import { type Readable, readable } from 'svelte/store'
|
|
9
|
+
import { useQueryClient } from './useQueryClient'
|
|
10
|
+
|
|
11
|
+
export function useIsMutating(filters?: MutationFilters): Readable<number>
|
|
12
|
+
export function useIsMutating(
|
|
13
|
+
mutationKey?: MutationKey,
|
|
14
|
+
filters?: Omit<MutationFilters, 'mutationKey'>,
|
|
15
|
+
): Readable<number>
|
|
16
|
+
|
|
17
|
+
export function useIsMutating(
|
|
18
|
+
arg1?: MutationKey | MutationFilters,
|
|
19
|
+
arg2?: Omit<MutationFilters, 'mutationKey'>,
|
|
20
|
+
): Readable<number> {
|
|
21
|
+
const [filters] = parseMutationFilterArgs(arg1, arg2)
|
|
22
|
+
const client: QueryClient = useQueryClient()
|
|
23
|
+
const cache = client.getMutationCache()
|
|
24
|
+
// isMutating is the prev value initialized on mount *
|
|
25
|
+
let isMutating = client.isMutating(filters)
|
|
26
|
+
|
|
27
|
+
const { subscribe } = readable(isMutating, (set) => {
|
|
28
|
+
return cache.subscribe(
|
|
29
|
+
notifyManager.batchCalls(() => {
|
|
30
|
+
const newIisMutating = client.isMutating(filters)
|
|
31
|
+
if (isMutating !== newIisMutating) {
|
|
32
|
+
// * and update with each change
|
|
33
|
+
isMutating = newIisMutating
|
|
34
|
+
set(isMutating)
|
|
35
|
+
}
|
|
36
|
+
}),
|
|
37
|
+
)
|
|
38
|
+
})
|
|
39
|
+
|
|
40
|
+
return { subscribe }
|
|
41
|
+
}
|