@trpc/tanstack-react-query 0.0.0-alpha.3 → 10.8.0-alpha-tmp-02-12-response-types-idea.853
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/README.md +12 -11
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/internals/Context.d.ts +15 -8
- package/dist/internals/Context.d.ts.map +1 -1
- package/dist/internals/Context.js +19 -4
- package/dist/internals/Context.mjs +19 -4
- package/dist/internals/createOptionsProxy.d.ts +105 -41
- package/dist/internals/createOptionsProxy.d.ts.map +1 -1
- package/dist/internals/createOptionsProxy.js +43 -32
- package/dist/internals/createOptionsProxy.mjs +45 -34
- package/dist/internals/infiniteQueryOptions.d.ts +37 -28
- package/dist/internals/infiniteQueryOptions.d.ts.map +1 -1
- package/dist/internals/infiniteQueryOptions.js +3 -3
- package/dist/internals/infiniteQueryOptions.mjs +4 -4
- package/dist/internals/mutationOptions.d.ts +8 -3
- package/dist/internals/mutationOptions.d.ts.map +1 -1
- package/dist/internals/mutationOptions.js +3 -1
- package/dist/internals/mutationOptions.mjs +3 -1
- package/dist/internals/queryOptions.d.ts +9 -15
- package/dist/internals/queryOptions.d.ts.map +1 -1
- package/dist/internals/queryOptions.js +5 -3
- package/dist/internals/queryOptions.mjs +6 -4
- package/dist/internals/subscriptionOptions.d.ts +13 -17
- package/dist/internals/subscriptionOptions.d.ts.map +1 -1
- package/dist/internals/subscriptionOptions.js +44 -38
- package/dist/internals/subscriptionOptions.mjs +44 -38
- package/dist/internals/types.d.ts +44 -2
- package/dist/internals/types.d.ts.map +1 -1
- package/dist/internals/utils.d.ts +10 -2
- package/dist/internals/utils.d.ts.map +1 -1
- package/dist/internals/utils.js +10 -4
- package/dist/internals/utils.mjs +10 -4
- package/package.json +30 -27
- package/src/index.ts +4 -3
- package/src/internals/Context.tsx +41 -12
- package/src/internals/createOptionsProxy.ts +250 -117
- package/src/internals/infiniteQueryOptions.ts +53 -27
- package/src/internals/mutationOptions.ts +23 -6
- package/src/internals/queryOptions.ts +20 -5
- package/src/internals/subscriptionOptions.ts +62 -46
- package/src/internals/types.ts +48 -1
- package/src/internals/utils.ts +15 -4
|
@@ -1,22 +1,19 @@
|
|
|
1
1
|
import type {
|
|
2
2
|
DataTag,
|
|
3
3
|
DefinedInitialDataInfiniteOptions,
|
|
4
|
-
|
|
4
|
+
QueryClient,
|
|
5
5
|
QueryFunction,
|
|
6
|
+
SkipToken,
|
|
6
7
|
UndefinedInitialDataInfiniteOptions,
|
|
7
8
|
UnusedSkipTokenInfiniteOptions,
|
|
8
9
|
} from '@tanstack/react-query';
|
|
9
|
-
import {
|
|
10
|
-
infiniteQueryOptions,
|
|
11
|
-
skipToken,
|
|
12
|
-
type QueryClient,
|
|
13
|
-
type SkipToken,
|
|
14
|
-
} from '@tanstack/react-query';
|
|
10
|
+
import { infiniteQueryOptions, skipToken } from '@tanstack/react-query';
|
|
15
11
|
import type { TRPCClientErrorLike, TRPCUntypedClient } from '@trpc/client';
|
|
16
12
|
import type { DistributiveOmit } from '@trpc/server/unstable-core-do-not-import';
|
|
17
13
|
import type {
|
|
18
14
|
ExtractCursorType,
|
|
19
15
|
ResolverDef,
|
|
16
|
+
TRPCInfiniteData,
|
|
20
17
|
TRPCQueryBaseOptions,
|
|
21
18
|
TRPCQueryKey,
|
|
22
19
|
TRPCQueryOptionsResult,
|
|
@@ -39,7 +36,7 @@ interface UndefinedTRPCInfiniteQueryOptionsIn<
|
|
|
39
36
|
UndefinedInitialDataInfiniteOptions<
|
|
40
37
|
TQueryFnData,
|
|
41
38
|
TError,
|
|
42
|
-
|
|
39
|
+
TRPCInfiniteData<TInput, TData>,
|
|
43
40
|
TRPCQueryKey,
|
|
44
41
|
NonNullable<ExtractCursorType<TInput>> | null
|
|
45
42
|
>,
|
|
@@ -58,14 +55,14 @@ interface UndefinedTRPCInfiniteQueryOptionsOut<
|
|
|
58
55
|
UndefinedInitialDataInfiniteOptions<
|
|
59
56
|
TQueryFnData,
|
|
60
57
|
TError,
|
|
61
|
-
|
|
58
|
+
TRPCInfiniteData<TInput, TData>,
|
|
62
59
|
TRPCQueryKey,
|
|
63
60
|
NonNullable<ExtractCursorType<TInput>> | null
|
|
64
61
|
>,
|
|
65
62
|
'initialPageParam'
|
|
66
63
|
>,
|
|
67
64
|
TRPCQueryOptionsResult {
|
|
68
|
-
queryKey: DataTag<TRPCQueryKey,
|
|
65
|
+
queryKey: DataTag<TRPCQueryKey, TRPCInfiniteData<TInput, TData>, TError>;
|
|
69
66
|
initialPageParam: NonNullable<ExtractCursorType<TInput>> | null;
|
|
70
67
|
}
|
|
71
68
|
|
|
@@ -74,7 +71,7 @@ interface DefinedTRPCInfiniteQueryOptionsIn<TInput, TQueryFnData, TData, TError>
|
|
|
74
71
|
DefinedInitialDataInfiniteOptions<
|
|
75
72
|
TQueryFnData,
|
|
76
73
|
TError,
|
|
77
|
-
|
|
74
|
+
TRPCInfiniteData<TInput, TData>,
|
|
78
75
|
TRPCQueryKey,
|
|
79
76
|
NonNullable<ExtractCursorType<TInput>> | null
|
|
80
77
|
>,
|
|
@@ -93,14 +90,14 @@ interface DefinedTRPCInfiniteQueryOptionsOut<
|
|
|
93
90
|
DefinedInitialDataInfiniteOptions<
|
|
94
91
|
TQueryFnData,
|
|
95
92
|
TError,
|
|
96
|
-
|
|
93
|
+
TRPCInfiniteData<TInput, TData>,
|
|
97
94
|
TRPCQueryKey,
|
|
98
95
|
NonNullable<ExtractCursorType<TInput>> | null
|
|
99
96
|
>,
|
|
100
97
|
'initialPageParam'
|
|
101
98
|
>,
|
|
102
99
|
TRPCQueryOptionsResult {
|
|
103
|
-
queryKey: DataTag<TRPCQueryKey,
|
|
100
|
+
queryKey: DataTag<TRPCQueryKey, TRPCInfiniteData<TInput, TData>, TError>;
|
|
104
101
|
initialPageParam: NonNullable<ExtractCursorType<TInput>> | null;
|
|
105
102
|
}
|
|
106
103
|
|
|
@@ -113,7 +110,7 @@ interface UnusedSkipTokenTRPCInfiniteQueryOptionsIn<
|
|
|
113
110
|
UnusedSkipTokenInfiniteOptions<
|
|
114
111
|
TQueryFnData,
|
|
115
112
|
TError,
|
|
116
|
-
|
|
113
|
+
TRPCInfiniteData<TInput, TData>,
|
|
117
114
|
TRPCQueryKey,
|
|
118
115
|
NonNullable<ExtractCursorType<TInput>> | null
|
|
119
116
|
>,
|
|
@@ -132,14 +129,14 @@ interface UnusedSkipTokenTRPCInfiniteQueryOptionsOut<
|
|
|
132
129
|
UnusedSkipTokenInfiniteOptions<
|
|
133
130
|
TQueryFnData,
|
|
134
131
|
TError,
|
|
135
|
-
|
|
132
|
+
TRPCInfiniteData<TInput, TData>,
|
|
136
133
|
TRPCQueryKey,
|
|
137
134
|
NonNullable<ExtractCursorType<TInput>> | null
|
|
138
135
|
>,
|
|
139
136
|
'initialPageParam'
|
|
140
137
|
>,
|
|
141
138
|
TRPCQueryOptionsResult {
|
|
142
|
-
queryKey: DataTag<TRPCQueryKey,
|
|
139
|
+
queryKey: DataTag<TRPCQueryKey, TRPCInfiniteData<TInput, TData>, TError>;
|
|
143
140
|
initialPageParam: NonNullable<ExtractCursorType<TInput>> | null;
|
|
144
141
|
}
|
|
145
142
|
|
|
@@ -150,13 +147,19 @@ export interface TRPCInfiniteQueryOptions<TDef extends ResolverDef> {
|
|
|
150
147
|
TDef['input'],
|
|
151
148
|
TQueryFnData,
|
|
152
149
|
TData,
|
|
153
|
-
TRPCClientErrorLike<
|
|
150
|
+
TRPCClientErrorLike<{
|
|
151
|
+
transformer: TDef['transformer'];
|
|
152
|
+
errorShape: TDef['errorShape'];
|
|
153
|
+
}>
|
|
154
154
|
>,
|
|
155
155
|
): DefinedTRPCInfiniteQueryOptionsOut<
|
|
156
156
|
TDef['input'],
|
|
157
157
|
TQueryFnData,
|
|
158
158
|
TData,
|
|
159
|
-
TRPCClientErrorLike<
|
|
159
|
+
TRPCClientErrorLike<{
|
|
160
|
+
transformer: TDef['transformer'];
|
|
161
|
+
errorShape: TDef['errorShape'];
|
|
162
|
+
}>
|
|
160
163
|
>;
|
|
161
164
|
<TQueryFnData extends TDef['output'], TData = TQueryFnData>(
|
|
162
165
|
input: TDef['input'],
|
|
@@ -164,13 +167,19 @@ export interface TRPCInfiniteQueryOptions<TDef extends ResolverDef> {
|
|
|
164
167
|
TDef['input'],
|
|
165
168
|
TQueryFnData,
|
|
166
169
|
TData,
|
|
167
|
-
TRPCClientErrorLike<
|
|
170
|
+
TRPCClientErrorLike<{
|
|
171
|
+
transformer: TDef['transformer'];
|
|
172
|
+
errorShape: TDef['errorShape'];
|
|
173
|
+
}>
|
|
168
174
|
>,
|
|
169
175
|
): UnusedSkipTokenTRPCInfiniteQueryOptionsOut<
|
|
170
176
|
TDef['input'],
|
|
171
177
|
TQueryFnData,
|
|
172
178
|
TData,
|
|
173
|
-
TRPCClientErrorLike<
|
|
179
|
+
TRPCClientErrorLike<{
|
|
180
|
+
transformer: TDef['transformer'];
|
|
181
|
+
errorShape: TDef['errorShape'];
|
|
182
|
+
}>
|
|
174
183
|
>;
|
|
175
184
|
<TQueryFnData extends TDef['output'], TData = TQueryFnData>(
|
|
176
185
|
input: TDef['input'] | SkipToken,
|
|
@@ -178,25 +187,42 @@ export interface TRPCInfiniteQueryOptions<TDef extends ResolverDef> {
|
|
|
178
187
|
TDef['input'],
|
|
179
188
|
TQueryFnData,
|
|
180
189
|
TData,
|
|
181
|
-
TRPCClientErrorLike<
|
|
190
|
+
TRPCClientErrorLike<{
|
|
191
|
+
transformer: TDef['transformer'];
|
|
192
|
+
errorShape: TDef['errorShape'];
|
|
193
|
+
}>
|
|
182
194
|
>,
|
|
183
195
|
): UndefinedTRPCInfiniteQueryOptionsOut<
|
|
184
196
|
TDef['input'],
|
|
185
197
|
TQueryFnData,
|
|
186
198
|
TData,
|
|
187
|
-
TRPCClientErrorLike<
|
|
199
|
+
TRPCClientErrorLike<{
|
|
200
|
+
transformer: TDef['transformer'];
|
|
201
|
+
errorShape: TDef['errorShape'];
|
|
202
|
+
}>
|
|
188
203
|
>;
|
|
189
204
|
}
|
|
190
205
|
|
|
206
|
+
type AnyTRPCInfiniteQueryOptionsIn =
|
|
207
|
+
| DefinedTRPCInfiniteQueryOptionsIn<any, any, any, any>
|
|
208
|
+
| UnusedSkipTokenTRPCInfiniteQueryOptionsIn<any, any, any, any>
|
|
209
|
+
| UndefinedTRPCInfiniteQueryOptionsIn<any, any, any, any>;
|
|
210
|
+
|
|
211
|
+
type AnyTRPCInfiniteQueryOptionsOut =
|
|
212
|
+
| DefinedTRPCInfiniteQueryOptionsOut<any, any, any, any>
|
|
213
|
+
| UnusedSkipTokenTRPCInfiniteQueryOptionsOut<any, any, any, any>
|
|
214
|
+
| UndefinedTRPCInfiniteQueryOptionsOut<any, any, any, any>;
|
|
215
|
+
|
|
191
216
|
export function trpcInfiniteQueryOptions(args: {
|
|
217
|
+
input: unknown;
|
|
192
218
|
query: typeof TRPCUntypedClient.prototype.query;
|
|
193
219
|
queryClient: QueryClient | (() => QueryClient);
|
|
194
220
|
path: readonly string[];
|
|
195
221
|
queryKey: TRPCQueryKey;
|
|
196
|
-
opts:
|
|
197
|
-
}) {
|
|
198
|
-
const { query, path, queryKey, opts } = args;
|
|
199
|
-
const inputIsSkipToken =
|
|
222
|
+
opts: AnyTRPCInfiniteQueryOptionsIn;
|
|
223
|
+
}): AnyTRPCInfiniteQueryOptionsOut {
|
|
224
|
+
const { input, query, path, queryKey, opts } = args;
|
|
225
|
+
const inputIsSkipToken = input === skipToken;
|
|
200
226
|
|
|
201
227
|
const queryFn: QueryFunction<unknown, TRPCQueryKey, unknown> = async (
|
|
202
228
|
queryFnContext,
|
|
@@ -226,7 +252,7 @@ export function trpcInfiniteQueryOptions(args: {
|
|
|
226
252
|
...opts,
|
|
227
253
|
queryKey,
|
|
228
254
|
queryFn: inputIsSkipToken ? skipToken : queryFn,
|
|
229
|
-
initialPageParam: opts?.initialCursor ??
|
|
255
|
+
initialPageParam: opts?.initialCursor ?? (input as any)?.cursor,
|
|
230
256
|
}),
|
|
231
257
|
{ trpc: createTRPCOptionsResult({ path }) },
|
|
232
258
|
);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import type {
|
|
2
|
+
MutationFunction,
|
|
3
|
+
QueryClient,
|
|
4
|
+
UseMutationOptions,
|
|
5
5
|
} from '@tanstack/react-query';
|
|
6
6
|
import type { TRPCClientErrorLike, TRPCUntypedClient } from '@trpc/client';
|
|
7
7
|
import type {
|
|
@@ -69,13 +69,30 @@ export interface MutationOptionsOverride {
|
|
|
69
69
|
}) => MaybePromise<unknown>;
|
|
70
70
|
}
|
|
71
71
|
|
|
72
|
+
type AnyTRPCMutationOptionsIn = TRPCMutationOptionsIn<
|
|
73
|
+
unknown,
|
|
74
|
+
unknown,
|
|
75
|
+
unknown,
|
|
76
|
+
unknown
|
|
77
|
+
>;
|
|
78
|
+
|
|
79
|
+
type AnyTRPCMutationOptionsOut = TRPCMutationOptionsOut<
|
|
80
|
+
unknown,
|
|
81
|
+
unknown,
|
|
82
|
+
unknown,
|
|
83
|
+
unknown
|
|
84
|
+
>;
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* @internal
|
|
88
|
+
*/
|
|
72
89
|
export function trpcMutationOptions(args: {
|
|
73
90
|
mutate: typeof TRPCUntypedClient.prototype.mutation;
|
|
74
91
|
queryClient: QueryClient | (() => QueryClient);
|
|
75
92
|
path: readonly string[];
|
|
76
|
-
opts:
|
|
93
|
+
opts: AnyTRPCMutationOptionsIn;
|
|
77
94
|
overrides: MutationOptionsOverride | undefined;
|
|
78
|
-
}):
|
|
95
|
+
}): AnyTRPCMutationOptionsOut {
|
|
79
96
|
const { mutate, path, opts, overrides } = args;
|
|
80
97
|
const queryClient = unwrapLazyArg(args.queryClient);
|
|
81
98
|
|
|
@@ -3,10 +3,11 @@ import type {
|
|
|
3
3
|
DefinedInitialDataOptions,
|
|
4
4
|
QueryClient,
|
|
5
5
|
QueryFunction,
|
|
6
|
+
SkipToken,
|
|
6
7
|
UndefinedInitialDataOptions,
|
|
7
8
|
UnusedSkipTokenOptions,
|
|
8
9
|
} from '@tanstack/react-query';
|
|
9
|
-
import { queryOptions, skipToken
|
|
10
|
+
import { queryOptions, skipToken } from '@tanstack/react-query';
|
|
10
11
|
import type { TRPCClientErrorLike, TRPCUntypedClient } from '@trpc/client';
|
|
11
12
|
import type {
|
|
12
13
|
coerceAsyncIterableToArray,
|
|
@@ -154,17 +155,31 @@ export interface TRPCQueryOptions<TDef extends ResolverDef> {
|
|
|
154
155
|
>;
|
|
155
156
|
}
|
|
156
157
|
|
|
158
|
+
type AnyTRPCQueryOptionsIn =
|
|
159
|
+
| DefinedTRPCQueryOptionsIn<unknown, unknown, unknown>
|
|
160
|
+
| UnusedSkipTokenTRPCQueryOptionsIn<unknown, unknown, unknown>
|
|
161
|
+
| UndefinedTRPCQueryOptionsIn<unknown, unknown, unknown>;
|
|
162
|
+
|
|
163
|
+
type AnyTRPCQueryOptionsOut =
|
|
164
|
+
| DefinedTRPCQueryOptionsOut<unknown, unknown, unknown>
|
|
165
|
+
| UnusedSkipTokenTRPCQueryOptionsOut<unknown, unknown, unknown>
|
|
166
|
+
| UndefinedTRPCQueryOptionsOut<unknown, unknown, unknown>;
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* @internal
|
|
170
|
+
*/
|
|
157
171
|
export function trpcQueryOptions(args: {
|
|
172
|
+
input: unknown;
|
|
158
173
|
query: typeof TRPCUntypedClient.prototype.query;
|
|
159
174
|
queryClient: QueryClient | (() => QueryClient);
|
|
160
175
|
path: readonly string[];
|
|
161
176
|
queryKey: TRPCQueryKey;
|
|
162
|
-
opts:
|
|
163
|
-
}) {
|
|
164
|
-
const { query, path, queryKey, opts } = args;
|
|
177
|
+
opts: AnyTRPCQueryOptionsIn;
|
|
178
|
+
}): AnyTRPCQueryOptionsOut {
|
|
179
|
+
const { input, query, path, queryKey, opts } = args;
|
|
165
180
|
const queryClient = unwrapLazyArg(args.queryClient);
|
|
166
181
|
|
|
167
|
-
const inputIsSkipToken =
|
|
182
|
+
const inputIsSkipToken = input === skipToken;
|
|
168
183
|
|
|
169
184
|
const queryFn: QueryFunction<unknown, TRPCQueryKey> = async (
|
|
170
185
|
queryFnContext,
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { SkipToken } from '@tanstack/react-query';
|
|
2
|
+
import { hashKey, skipToken } from '@tanstack/react-query';
|
|
2
3
|
import type { TRPCClientErrorLike, TRPCUntypedClient } from '@trpc/client';
|
|
3
4
|
import type { TRPCConnectionState } from '@trpc/client/unstable-internals';
|
|
4
5
|
import type { Unsubscribable } from '@trpc/server/observable';
|
|
@@ -14,15 +15,16 @@ import { createTRPCOptionsResult } from './utils';
|
|
|
14
15
|
interface BaseTRPCSubscriptionOptionsIn<TOutput, TError> {
|
|
15
16
|
enabled?: boolean;
|
|
16
17
|
onStarted?: () => void;
|
|
17
|
-
onData
|
|
18
|
+
onData?: (data: inferAsyncIterableYield<TOutput>) => void;
|
|
18
19
|
onError?: (err: TError) => void;
|
|
20
|
+
onConnectionStateChange?: (state: TRPCConnectionState<TError>) => void;
|
|
19
21
|
}
|
|
20
22
|
|
|
21
23
|
interface UnusedSkipTokenTRPCSubscriptionOptionsIn<TOutput, TError> {
|
|
22
24
|
onStarted?: () => void;
|
|
23
|
-
onData
|
|
25
|
+
onData?: (data: inferAsyncIterableYield<TOutput>) => void;
|
|
24
26
|
onError?: (err: TError) => void;
|
|
25
|
-
onConnectionStateChange
|
|
27
|
+
onConnectionStateChange?: (state: TRPCConnectionState<TError>) => void;
|
|
26
28
|
}
|
|
27
29
|
|
|
28
30
|
interface TRPCSubscriptionOptionsOut<TOutput, TError>
|
|
@@ -90,7 +92,7 @@ export interface TRPCSubscriptionConnectingResult<TOutput, TError>
|
|
|
90
92
|
export interface TRPCSubscriptionPendingResult<TOutput>
|
|
91
93
|
extends TRPCSubscriptionBaseResult<TOutput, undefined> {
|
|
92
94
|
status: 'pending';
|
|
93
|
-
data: TOutput;
|
|
95
|
+
data: TOutput | undefined;
|
|
94
96
|
error: null;
|
|
95
97
|
}
|
|
96
98
|
|
|
@@ -107,15 +109,27 @@ export type TRPCSubscriptionResult<TOutput, TError> =
|
|
|
107
109
|
| TRPCSubscriptionErrorResult<TOutput, TError>
|
|
108
110
|
| TRPCSubscriptionPendingResult<TOutput>;
|
|
109
111
|
|
|
112
|
+
type AnyTRPCSubscriptionOptionsIn =
|
|
113
|
+
| BaseTRPCSubscriptionOptionsIn<unknown, unknown>
|
|
114
|
+
| UnusedSkipTokenTRPCSubscriptionOptionsIn<unknown, unknown>;
|
|
115
|
+
|
|
116
|
+
type AnyTRPCSubscriptionOptionsOut = TRPCSubscriptionOptionsOut<
|
|
117
|
+
unknown,
|
|
118
|
+
unknown
|
|
119
|
+
>;
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* @internal
|
|
123
|
+
*/
|
|
110
124
|
export const trpcSubscriptionOptions = (args: {
|
|
111
125
|
subscribe: typeof TRPCUntypedClient.prototype.subscription;
|
|
112
126
|
path: readonly string[];
|
|
113
127
|
queryKey: TRPCQueryKey;
|
|
114
|
-
opts:
|
|
115
|
-
}) => {
|
|
128
|
+
opts: AnyTRPCSubscriptionOptionsIn;
|
|
129
|
+
}): AnyTRPCSubscriptionOptionsOut => {
|
|
116
130
|
const { subscribe, path, queryKey, opts } = args;
|
|
117
131
|
const input = queryKey[1]?.input;
|
|
118
|
-
const enabled = opts
|
|
132
|
+
const enabled = 'enabled' in opts ? !!opts.enabled : input !== skipToken;
|
|
119
133
|
|
|
120
134
|
const _subscribe: ReturnType<TRPCSubscriptionOptions<any>>['subscribe'] = (
|
|
121
135
|
innerOpts,
|
|
@@ -147,7 +161,9 @@ export function useSubscription<TOutput, TError>(
|
|
|
147
161
|
}, []);
|
|
148
162
|
|
|
149
163
|
type Unsubscribe = () => void;
|
|
150
|
-
const currentSubscriptionRef = React.useRef<Unsubscribe>()
|
|
164
|
+
const currentSubscriptionRef = React.useRef<Unsubscribe>(() => {
|
|
165
|
+
// noop
|
|
166
|
+
});
|
|
151
167
|
|
|
152
168
|
const reset = React.useCallback((): void => {
|
|
153
169
|
// unsubscribe from the previous subscription
|
|
@@ -157,57 +173,57 @@ export function useSubscription<TOutput, TError>(
|
|
|
157
173
|
if (!opts.enabled) {
|
|
158
174
|
return;
|
|
159
175
|
}
|
|
160
|
-
|
|
161
|
-
let isStopped = false;
|
|
162
176
|
const subscription = opts.subscribe({
|
|
163
177
|
onStarted: () => {
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
}));
|
|
171
|
-
}
|
|
178
|
+
optsRef.current.onStarted?.();
|
|
179
|
+
updateState((prev) => ({
|
|
180
|
+
...(prev as any),
|
|
181
|
+
status: 'pending',
|
|
182
|
+
error: null,
|
|
183
|
+
}));
|
|
172
184
|
},
|
|
173
185
|
onData: (data) => {
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
}));
|
|
182
|
-
}
|
|
186
|
+
optsRef.current.onData?.(data);
|
|
187
|
+
updateState((prev) => ({
|
|
188
|
+
...(prev as any),
|
|
189
|
+
status: 'pending',
|
|
190
|
+
data,
|
|
191
|
+
error: null,
|
|
192
|
+
}));
|
|
183
193
|
},
|
|
184
194
|
onError: (error) => {
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
}));
|
|
192
|
-
}
|
|
195
|
+
optsRef.current.onError?.(error);
|
|
196
|
+
updateState((prev) => ({
|
|
197
|
+
...(prev as any),
|
|
198
|
+
status: 'error',
|
|
199
|
+
error,
|
|
200
|
+
}));
|
|
193
201
|
},
|
|
194
202
|
onConnectionStateChange: (result) => {
|
|
195
|
-
const delta = {
|
|
196
|
-
status: result.state,
|
|
197
|
-
error: result.error,
|
|
198
|
-
} as $Result;
|
|
199
|
-
|
|
200
203
|
updateState((prev) => {
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
204
|
+
switch (result.state) {
|
|
205
|
+
case 'connecting':
|
|
206
|
+
return {
|
|
207
|
+
...prev,
|
|
208
|
+
status: 'connecting',
|
|
209
|
+
error: result.error,
|
|
210
|
+
};
|
|
211
|
+
case 'pending':
|
|
212
|
+
// handled in onStarted
|
|
213
|
+
return prev;
|
|
214
|
+
case 'idle':
|
|
215
|
+
return {
|
|
216
|
+
...prev,
|
|
217
|
+
status: 'idle',
|
|
218
|
+
data: undefined,
|
|
219
|
+
error: null,
|
|
220
|
+
};
|
|
221
|
+
}
|
|
205
222
|
});
|
|
206
223
|
},
|
|
207
224
|
});
|
|
208
225
|
|
|
209
226
|
currentSubscriptionRef.current = () => {
|
|
210
|
-
isStopped = true;
|
|
211
227
|
subscription.unsubscribe();
|
|
212
228
|
};
|
|
213
229
|
|
package/src/internals/types.ts
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
|
+
import type { InfiniteData } from '@tanstack/react-query';
|
|
1
2
|
import type { TRPCRequestOptions } from '@trpc/client';
|
|
2
3
|
|
|
4
|
+
/**
|
|
5
|
+
* Turn a set of optional properties into required
|
|
6
|
+
* @internal
|
|
7
|
+
*/
|
|
8
|
+
export type WithRequired<TObj, TKey extends keyof TObj> = TObj & {
|
|
9
|
+
[P in TKey]-?: TObj[P];
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* @internal
|
|
14
|
+
*/
|
|
3
15
|
export type ResolverDef = {
|
|
4
16
|
input: any;
|
|
5
17
|
output: any;
|
|
@@ -7,10 +19,30 @@ export type ResolverDef = {
|
|
|
7
19
|
errorShape: any;
|
|
8
20
|
};
|
|
9
21
|
|
|
10
|
-
|
|
22
|
+
/**
|
|
23
|
+
* @remark `void` is here due to https://github.com/trpc/trpc/pull/4374
|
|
24
|
+
*/
|
|
25
|
+
type CursorInput = { cursor?: any };
|
|
26
|
+
export type OptionalCursorInput = CursorInput | void;
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* @internal
|
|
30
|
+
*/
|
|
31
|
+
export type ExtractCursorType<TInput> = TInput extends CursorInput
|
|
11
32
|
? TInput['cursor']
|
|
12
33
|
: unknown;
|
|
13
34
|
|
|
35
|
+
/**
|
|
36
|
+
* @internal
|
|
37
|
+
*/
|
|
38
|
+
export type TRPCInfiniteData<TInput, TOutput> = InfiniteData<
|
|
39
|
+
TOutput,
|
|
40
|
+
NonNullable<ExtractCursorType<TInput>> | null
|
|
41
|
+
>;
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* @public
|
|
45
|
+
*/
|
|
14
46
|
export interface TRPCReactRequestOptions
|
|
15
47
|
// For RQ, we use their internal AbortSignals instead of letting the user pass their own
|
|
16
48
|
extends Omit<TRPCRequestOptions, 'signal'> {
|
|
@@ -24,6 +56,9 @@ export interface TRPCReactRequestOptions
|
|
|
24
56
|
abortOnUnmount?: boolean;
|
|
25
57
|
}
|
|
26
58
|
|
|
59
|
+
/**
|
|
60
|
+
* @public
|
|
61
|
+
*/
|
|
27
62
|
export interface TRPCQueryBaseOptions {
|
|
28
63
|
/**
|
|
29
64
|
* tRPC-related options
|
|
@@ -31,17 +66,29 @@ export interface TRPCQueryBaseOptions {
|
|
|
31
66
|
trpc?: TRPCReactRequestOptions;
|
|
32
67
|
}
|
|
33
68
|
|
|
69
|
+
/**
|
|
70
|
+
* @public
|
|
71
|
+
*/
|
|
34
72
|
export interface TRPCQueryOptionsResult {
|
|
35
73
|
trpc: {
|
|
36
74
|
path: string;
|
|
37
75
|
};
|
|
38
76
|
}
|
|
39
77
|
|
|
78
|
+
/**
|
|
79
|
+
* @public
|
|
80
|
+
*/
|
|
40
81
|
export type QueryType = 'any' | 'infinite' | 'query';
|
|
41
82
|
|
|
83
|
+
/**
|
|
84
|
+
* @public
|
|
85
|
+
*/
|
|
42
86
|
export type TRPCQueryKey = [
|
|
43
87
|
readonly string[],
|
|
44
88
|
{ input?: unknown; type?: Exclude<QueryType, 'any'> }?,
|
|
45
89
|
];
|
|
46
90
|
|
|
91
|
+
/**
|
|
92
|
+
* @public
|
|
93
|
+
*/
|
|
47
94
|
export type TRPCMutationKey = [readonly string[]]; // = [TRPCQueryKey[0]]
|
package/src/internals/utils.ts
CHANGED
|
@@ -36,7 +36,9 @@ export function getClientArgs<TOptions>(
|
|
|
36
36
|
if (infiniteParams) {
|
|
37
37
|
input = {
|
|
38
38
|
...(input ?? {}),
|
|
39
|
-
...(infiniteParams.pageParam
|
|
39
|
+
...(infiniteParams.pageParam !== undefined
|
|
40
|
+
? { cursor: infiniteParams.pageParam }
|
|
41
|
+
: {}),
|
|
40
42
|
direction: infiniteParams.direction,
|
|
41
43
|
};
|
|
42
44
|
}
|
|
@@ -77,11 +79,13 @@ export async function buildQueryFromAsyncIterable(
|
|
|
77
79
|
* To allow easy interactions with groups of related queries, such as
|
|
78
80
|
* invalidating all queries of a router, we use an array as the path when
|
|
79
81
|
* storing in tanstack query.
|
|
80
|
-
|
|
82
|
+
*
|
|
83
|
+
* @internal
|
|
84
|
+
*/
|
|
81
85
|
export function getQueryKeyInternal(
|
|
82
86
|
path: readonly string[],
|
|
83
|
-
input
|
|
84
|
-
type
|
|
87
|
+
input?: unknown,
|
|
88
|
+
type?: QueryType,
|
|
85
89
|
): TRPCQueryKey {
|
|
86
90
|
// Construct a query key that is easy to destructure and flexible for
|
|
87
91
|
// partial selecting etc.
|
|
@@ -116,6 +120,7 @@ export function getQueryKeyInternal(
|
|
|
116
120
|
},
|
|
117
121
|
];
|
|
118
122
|
}
|
|
123
|
+
|
|
119
124
|
return [
|
|
120
125
|
splitPath,
|
|
121
126
|
{
|
|
@@ -126,6 +131,9 @@ export function getQueryKeyInternal(
|
|
|
126
131
|
];
|
|
127
132
|
}
|
|
128
133
|
|
|
134
|
+
/**
|
|
135
|
+
* @internal
|
|
136
|
+
*/
|
|
129
137
|
export function getMutationKeyInternal(
|
|
130
138
|
path: readonly string[],
|
|
131
139
|
): TRPCMutationKey {
|
|
@@ -135,6 +143,9 @@ export function getMutationKeyInternal(
|
|
|
135
143
|
return splitPath.length ? [splitPath] : ([] as unknown as TRPCMutationKey);
|
|
136
144
|
}
|
|
137
145
|
|
|
146
|
+
/**
|
|
147
|
+
* @internal
|
|
148
|
+
*/
|
|
138
149
|
export function unwrapLazyArg<T>(valueOrLazy: T | (() => T)): T {
|
|
139
150
|
return (isFunction(valueOrLazy) ? valueOrLazy() : valueOrLazy) as T;
|
|
140
151
|
}
|