@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.
Files changed (43) hide show
  1. package/README.md +12 -11
  2. package/dist/index.d.ts +2 -1
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/internals/Context.d.ts +15 -8
  5. package/dist/internals/Context.d.ts.map +1 -1
  6. package/dist/internals/Context.js +19 -4
  7. package/dist/internals/Context.mjs +19 -4
  8. package/dist/internals/createOptionsProxy.d.ts +105 -41
  9. package/dist/internals/createOptionsProxy.d.ts.map +1 -1
  10. package/dist/internals/createOptionsProxy.js +43 -32
  11. package/dist/internals/createOptionsProxy.mjs +45 -34
  12. package/dist/internals/infiniteQueryOptions.d.ts +37 -28
  13. package/dist/internals/infiniteQueryOptions.d.ts.map +1 -1
  14. package/dist/internals/infiniteQueryOptions.js +3 -3
  15. package/dist/internals/infiniteQueryOptions.mjs +4 -4
  16. package/dist/internals/mutationOptions.d.ts +8 -3
  17. package/dist/internals/mutationOptions.d.ts.map +1 -1
  18. package/dist/internals/mutationOptions.js +3 -1
  19. package/dist/internals/mutationOptions.mjs +3 -1
  20. package/dist/internals/queryOptions.d.ts +9 -15
  21. package/dist/internals/queryOptions.d.ts.map +1 -1
  22. package/dist/internals/queryOptions.js +5 -3
  23. package/dist/internals/queryOptions.mjs +6 -4
  24. package/dist/internals/subscriptionOptions.d.ts +13 -17
  25. package/dist/internals/subscriptionOptions.d.ts.map +1 -1
  26. package/dist/internals/subscriptionOptions.js +44 -38
  27. package/dist/internals/subscriptionOptions.mjs +44 -38
  28. package/dist/internals/types.d.ts +44 -2
  29. package/dist/internals/types.d.ts.map +1 -1
  30. package/dist/internals/utils.d.ts +10 -2
  31. package/dist/internals/utils.d.ts.map +1 -1
  32. package/dist/internals/utils.js +10 -4
  33. package/dist/internals/utils.mjs +10 -4
  34. package/package.json +30 -27
  35. package/src/index.ts +4 -3
  36. package/src/internals/Context.tsx +41 -12
  37. package/src/internals/createOptionsProxy.ts +250 -117
  38. package/src/internals/infiniteQueryOptions.ts +53 -27
  39. package/src/internals/mutationOptions.ts +23 -6
  40. package/src/internals/queryOptions.ts +20 -5
  41. package/src/internals/subscriptionOptions.ts +62 -46
  42. package/src/internals/types.ts +48 -1
  43. package/src/internals/utils.ts +15 -4
@@ -1,22 +1,19 @@
1
1
  import type {
2
2
  DataTag,
3
3
  DefinedInitialDataInfiniteOptions,
4
- InfiniteData,
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
- InfiniteData<TData, NonNullable<ExtractCursorType<TInput>> | null>,
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
- InfiniteData<TData, NonNullable<ExtractCursorType<TInput>> | null>,
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, TData, TError>;
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
- InfiniteData<TData, NonNullable<ExtractCursorType<TInput>> | null>,
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
- InfiniteData<TData, NonNullable<ExtractCursorType<TInput>> | null>,
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, TData, TError>;
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
- InfiniteData<TData, NonNullable<ExtractCursorType<TInput>> | null>,
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
- InfiniteData<TData, NonNullable<ExtractCursorType<TInput>> | null>,
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, TData, TError>;
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<TDef>
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<TDef>
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<TDef>
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<TDef>
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<TDef>
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<TDef>
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: UndefinedTRPCInfiniteQueryOptionsIn<unknown, unknown, unknown, unknown>;
197
- }) {
198
- const { query, path, queryKey, opts } = args;
199
- const inputIsSkipToken = queryKey[1]?.input === skipToken;
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 ?? null,
255
+ initialPageParam: opts?.initialCursor ?? (input as any)?.cursor,
230
256
  }),
231
257
  { trpc: createTRPCOptionsResult({ path }) },
232
258
  );
@@ -1,7 +1,7 @@
1
- import type { MutationFunction } from '@tanstack/react-query';
2
- import {
3
- type QueryClient,
4
- type UseMutationOptions,
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: TRPCMutationOptionsIn<unknown, unknown, unknown, unknown> | undefined;
93
+ opts: AnyTRPCMutationOptionsIn;
77
94
  overrides: MutationOptionsOverride | undefined;
78
- }): TRPCMutationOptionsOut<unknown, unknown, unknown, unknown> {
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, type SkipToken } from '@tanstack/react-query';
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: UndefinedTRPCQueryOptionsIn<unknown, unknown, unknown>;
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 = queryKey[1]?.input === skipToken;
182
+ const inputIsSkipToken = input === skipToken;
168
183
 
169
184
  const queryFn: QueryFunction<unknown, TRPCQueryKey> = async (
170
185
  queryFnContext,
@@ -1,4 +1,5 @@
1
- import { hashKey, skipToken, type SkipToken } from '@tanstack/react-query';
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: (data: inferAsyncIterableYield<TOutput>) => void;
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: (data: inferAsyncIterableYield<TOutput>) => void;
25
+ onData?: (data: inferAsyncIterableYield<TOutput>) => void;
24
26
  onError?: (err: TError) => void;
25
- onConnectionStateChange: (state: TRPCConnectionState<TError>) => void;
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: BaseTRPCSubscriptionOptionsIn<unknown, unknown> | undefined;
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?.enabled ?? input !== skipToken;
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
- if (!isStopped) {
165
- optsRef.current.onStarted?.();
166
- updateState((prev) => ({
167
- ...(prev as any),
168
- status: 'pending',
169
- error: null,
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
- if (!isStopped) {
175
- optsRef.current.onData?.(data);
176
- updateState((prev) => ({
177
- ...(prev as any),
178
- status: 'pending',
179
- data,
180
- error: null,
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
- if (!isStopped) {
186
- optsRef.current.onError?.(error);
187
- updateState((prev) => ({
188
- ...(prev as any),
189
- status: 'error',
190
- error,
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
- return {
202
- ...prev,
203
- ...delta,
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
 
@@ -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
- export type ExtractCursorType<TInput> = TInput extends { cursor?: any }
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]]
@@ -36,7 +36,9 @@ export function getClientArgs<TOptions>(
36
36
  if (infiniteParams) {
37
37
  input = {
38
38
  ...(input ?? {}),
39
- ...(infiniteParams.pageParam ? { cursor: 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: unknown,
84
- type: QueryType,
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
  }