@veloxts/client 0.4.8 → 0.4.10
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/dist/client.d.ts.map +1 -1
- package/dist/client.js +14 -1
- package/dist/client.js.map +1 -1
- package/dist/react/__tests__/hooks.test.js +1 -1
- package/dist/react/__tests__/hooks.test.js.map +1 -1
- package/dist/react/index.d.ts +22 -39
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +25 -40
- package/dist/react/index.js.map +1 -1
- package/dist/react/proxy-hooks.d.ts +88 -0
- package/dist/react/proxy-hooks.d.ts.map +1 -0
- package/dist/react/proxy-hooks.js +396 -0
- package/dist/react/proxy-hooks.js.map +1 -0
- package/dist/react/proxy-types.d.ts +401 -0
- package/dist/react/proxy-types.d.ts.map +1 -0
- package/dist/react/proxy-types.js +10 -0
- package/dist/react/proxy-types.js.map +1 -0
- package/dist/types.d.ts +43 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,401 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type definitions for tRPC-style proxy hooks
|
|
3
|
+
*
|
|
4
|
+
* Provides type utilities for the new `createVeloxHooks` API that enables
|
|
5
|
+
* full IDE autocomplete through a proxy-based hook system.
|
|
6
|
+
*
|
|
7
|
+
* @module @veloxts/client/react/proxy-types
|
|
8
|
+
*/
|
|
9
|
+
import type { QueryClient, UseMutationOptions, UseMutationResult, UseQueryOptions, UseQueryResult, UseSuspenseQueryOptions, UseSuspenseQueryResult } from '@tanstack/react-query';
|
|
10
|
+
import type { ClientFromRouter, ClientProcedure, ProcedureCollection, ProcedureRecord, ProcedureType } from '../types.js';
|
|
11
|
+
import type { VeloxQueryKey } from './types.js';
|
|
12
|
+
/**
|
|
13
|
+
* Extracts the procedure type ('query' or 'mutation') from a ClientProcedure
|
|
14
|
+
*
|
|
15
|
+
* @internal
|
|
16
|
+
*/
|
|
17
|
+
type ExtractProcedureType<T> = T extends ClientProcedure<unknown, unknown> ? T extends {
|
|
18
|
+
readonly type: infer TType;
|
|
19
|
+
} ? TType extends ProcedureType ? TType : 'query' : 'query' : never;
|
|
20
|
+
/**
|
|
21
|
+
* Hook methods available for query procedures
|
|
22
|
+
*
|
|
23
|
+
* Query procedures (get*, list*, find*) get these methods:
|
|
24
|
+
* - useQuery - Main hook for fetching data
|
|
25
|
+
* - useSuspenseQuery - Suspense-enabled variant
|
|
26
|
+
* - getQueryKey - Get the query key for manual cache operations
|
|
27
|
+
* - invalidate - Invalidate cached queries
|
|
28
|
+
* - prefetch - Prefetch data into cache
|
|
29
|
+
* - getData - Read from cache
|
|
30
|
+
* - setData - Write to cache
|
|
31
|
+
*
|
|
32
|
+
* @template TInput - The procedure input type
|
|
33
|
+
* @template TOutput - The procedure output type
|
|
34
|
+
*/
|
|
35
|
+
export interface VeloxQueryProcedure<TInput, TOutput> {
|
|
36
|
+
/**
|
|
37
|
+
* React Query hook for fetching data
|
|
38
|
+
*
|
|
39
|
+
* @param input - Procedure input (fully typed)
|
|
40
|
+
* @param options - React Query options (queryKey and queryFn auto-provided)
|
|
41
|
+
* @returns UseQueryResult with typed data
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* ```tsx
|
|
45
|
+
* const { data, isLoading, error } = api.users.getUser.useQuery(
|
|
46
|
+
* { id: userId },
|
|
47
|
+
* { staleTime: 60_000 }
|
|
48
|
+
* );
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
useQuery(input: TInput, options?: Omit<UseQueryOptions<TOutput, Error>, 'queryKey' | 'queryFn'>): UseQueryResult<TOutput, Error>;
|
|
52
|
+
/**
|
|
53
|
+
* Suspense-enabled query hook
|
|
54
|
+
*
|
|
55
|
+
* Throws a promise for Suspense boundaries to catch.
|
|
56
|
+
* Data is guaranteed to be available when component renders.
|
|
57
|
+
*
|
|
58
|
+
* @example
|
|
59
|
+
* ```tsx
|
|
60
|
+
* function UserProfile({ userId }: { userId: string }) {
|
|
61
|
+
* // Component only renders when data is available
|
|
62
|
+
* const { data: user } = api.users.getUser.useSuspenseQuery({ id: userId });
|
|
63
|
+
* return <h1>{user.name}</h1>;
|
|
64
|
+
* }
|
|
65
|
+
*
|
|
66
|
+
* // Usage with Suspense boundary
|
|
67
|
+
* <Suspense fallback={<Spinner />}>
|
|
68
|
+
* <UserProfile userId="123" />
|
|
69
|
+
* </Suspense>
|
|
70
|
+
* ```
|
|
71
|
+
*/
|
|
72
|
+
useSuspenseQuery(input: TInput, options?: Omit<UseSuspenseQueryOptions<TOutput, Error>, 'queryKey' | 'queryFn'>): UseSuspenseQueryResult<TOutput, Error>;
|
|
73
|
+
/**
|
|
74
|
+
* Get the query key for this procedure + input
|
|
75
|
+
*
|
|
76
|
+
* Useful for manual cache operations with QueryClient.
|
|
77
|
+
*
|
|
78
|
+
* @param input - Optional input to include in the key
|
|
79
|
+
* @returns Query key tuple: [namespace, procedureName, input?]
|
|
80
|
+
*
|
|
81
|
+
* @example
|
|
82
|
+
* ```tsx
|
|
83
|
+
* const key = api.users.getUser.getQueryKey({ id: '123' });
|
|
84
|
+
* // key = ['users', 'getUser', { id: '123' }]
|
|
85
|
+
* ```
|
|
86
|
+
*/
|
|
87
|
+
getQueryKey(input?: TInput): VeloxQueryKey;
|
|
88
|
+
/**
|
|
89
|
+
* Invalidate queries for this procedure
|
|
90
|
+
*
|
|
91
|
+
* When called without input, invalidates all queries for this procedure.
|
|
92
|
+
* When called with input, invalidates only the specific query.
|
|
93
|
+
*
|
|
94
|
+
* @param input - Optional input to narrow invalidation (unique data first)
|
|
95
|
+
* @param queryClient - QueryClient instance from useQueryClient()
|
|
96
|
+
*
|
|
97
|
+
* @example
|
|
98
|
+
* ```tsx
|
|
99
|
+
* function UserProfile({ userId }: { userId: string }) {
|
|
100
|
+
* const queryClient = useQueryClient();
|
|
101
|
+
*
|
|
102
|
+
* const { mutate } = api.users.updateUser.useMutation({
|
|
103
|
+
* onSuccess: () => {
|
|
104
|
+
* api.users.getUser.invalidate({ id: userId }, queryClient);
|
|
105
|
+
* },
|
|
106
|
+
* });
|
|
107
|
+
*
|
|
108
|
+
* // Invalidate all queries for this procedure
|
|
109
|
+
* api.users.listUsers.invalidate(undefined, queryClient);
|
|
110
|
+
* }
|
|
111
|
+
* ```
|
|
112
|
+
*/
|
|
113
|
+
invalidate(input: TInput | undefined, queryClient: QueryClient): Promise<void>;
|
|
114
|
+
/**
|
|
115
|
+
* Prefetch data for this procedure
|
|
116
|
+
*
|
|
117
|
+
* Fetches data and stores it in the cache without rendering.
|
|
118
|
+
* Useful for hover-to-prefetch patterns.
|
|
119
|
+
*
|
|
120
|
+
* @param input - Procedure input (unique data first)
|
|
121
|
+
* @param queryClient - QueryClient instance from useQueryClient()
|
|
122
|
+
*
|
|
123
|
+
* @example
|
|
124
|
+
* ```tsx
|
|
125
|
+
* function UserList() {
|
|
126
|
+
* const queryClient = useQueryClient();
|
|
127
|
+
*
|
|
128
|
+
* return (
|
|
129
|
+
* <li onMouseEnter={() => api.users.getUser.prefetch({ id: user.id }, queryClient)}>
|
|
130
|
+
* {user.name}
|
|
131
|
+
* </li>
|
|
132
|
+
* );
|
|
133
|
+
* }
|
|
134
|
+
* ```
|
|
135
|
+
*/
|
|
136
|
+
prefetch(input: TInput, queryClient: QueryClient): Promise<void>;
|
|
137
|
+
/**
|
|
138
|
+
* Manually set cached data
|
|
139
|
+
*
|
|
140
|
+
* Useful for optimistic updates in mutation callbacks.
|
|
141
|
+
*
|
|
142
|
+
* @param input - Procedure input to identify the cache entry
|
|
143
|
+
* @param data - Data to store in cache (or null to clear)
|
|
144
|
+
* @param queryClient - QueryClient instance from useQueryClient()
|
|
145
|
+
*
|
|
146
|
+
* @example
|
|
147
|
+
* ```tsx
|
|
148
|
+
* function UserProfile() {
|
|
149
|
+
* const queryClient = useQueryClient();
|
|
150
|
+
*
|
|
151
|
+
* const { mutate } = api.users.updateUser.useMutation({
|
|
152
|
+
* onSuccess: (updatedUser) => {
|
|
153
|
+
* api.users.getUser.setData({ id: updatedUser.id }, updatedUser, queryClient);
|
|
154
|
+
* },
|
|
155
|
+
* });
|
|
156
|
+
*
|
|
157
|
+
* // Clear cache entry
|
|
158
|
+
* api.auth.getMe.setData({}, null, queryClient);
|
|
159
|
+
* }
|
|
160
|
+
* ```
|
|
161
|
+
*/
|
|
162
|
+
setData(input: TInput, data: TOutput | null, queryClient: QueryClient): void;
|
|
163
|
+
/**
|
|
164
|
+
* Get cached data if available
|
|
165
|
+
*
|
|
166
|
+
* Returns undefined if not in cache.
|
|
167
|
+
*
|
|
168
|
+
* @param input - Procedure input to identify the cache entry
|
|
169
|
+
* @param queryClient - QueryClient instance from useQueryClient()
|
|
170
|
+
*
|
|
171
|
+
* @example
|
|
172
|
+
* ```tsx
|
|
173
|
+
* function UserProfile({ userId }: { userId: string }) {
|
|
174
|
+
* const queryClient = useQueryClient();
|
|
175
|
+
*
|
|
176
|
+
* const cachedUser = api.users.getUser.getData({ id: userId }, queryClient);
|
|
177
|
+
* }
|
|
178
|
+
* ```
|
|
179
|
+
*/
|
|
180
|
+
getData(input: TInput, queryClient: QueryClient): TOutput | undefined;
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Hook methods available for mutation procedures
|
|
184
|
+
*
|
|
185
|
+
* Mutation procedures (create*, update*, delete*, etc.) get this method:
|
|
186
|
+
* - useMutation - Hook for mutating data
|
|
187
|
+
*
|
|
188
|
+
* @template TInput - The procedure input type
|
|
189
|
+
* @template TOutput - The procedure output type
|
|
190
|
+
*/
|
|
191
|
+
export interface VeloxMutationProcedure<TInput, TOutput> {
|
|
192
|
+
/**
|
|
193
|
+
* React Query mutation hook
|
|
194
|
+
*
|
|
195
|
+
* @param options - React Query mutation options (mutationFn auto-provided)
|
|
196
|
+
* @returns UseMutationResult with typed variables and data
|
|
197
|
+
*
|
|
198
|
+
* @example
|
|
199
|
+
* ```tsx
|
|
200
|
+
* const { mutate, isPending } = api.users.createUser.useMutation({
|
|
201
|
+
* onSuccess: (newUser) => {
|
|
202
|
+
* api.users.listUsers.invalidate();
|
|
203
|
+
* },
|
|
204
|
+
* });
|
|
205
|
+
*
|
|
206
|
+
* // Later
|
|
207
|
+
* mutate({ name: 'Alice', email: 'alice@example.com' });
|
|
208
|
+
* ```
|
|
209
|
+
*/
|
|
210
|
+
useMutation<TContext = unknown>(options?: VeloxMutationOptions<TOutput, TInput, TContext>): UseMutationResult<TOutput, Error, TInput, TContext>;
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Configuration for automatic cache invalidation after mutations
|
|
214
|
+
*
|
|
215
|
+
* VeloxTS automatically invalidates related queries after mutations succeed,
|
|
216
|
+
* following naming conventions:
|
|
217
|
+
*
|
|
218
|
+
* - `create*`, `add*` → invalidates `list*`, `find*` queries
|
|
219
|
+
* - `update*`, `edit*`, `patch*` → invalidates `get*` (matching ID), `list*`, `find*`
|
|
220
|
+
* - `delete*`, `remove*` → invalidates `get*` (matching ID), `list*`, `find*`
|
|
221
|
+
*
|
|
222
|
+
* This behavior is opt-out (enabled by default) and can be customized.
|
|
223
|
+
*
|
|
224
|
+
* @example
|
|
225
|
+
* ```tsx
|
|
226
|
+
* // Auto-invalidation happens by default
|
|
227
|
+
* const { mutate } = api.users.createUser.useMutation();
|
|
228
|
+
*
|
|
229
|
+
* // Disable auto-invalidation
|
|
230
|
+
* const { mutate } = api.users.createUser.useMutation({
|
|
231
|
+
* autoInvalidate: false,
|
|
232
|
+
* });
|
|
233
|
+
*
|
|
234
|
+
* // Customize auto-invalidation
|
|
235
|
+
* const { mutate } = api.users.updateUser.useMutation({
|
|
236
|
+
* autoInvalidate: {
|
|
237
|
+
* additional: [['posts', 'listPosts']], // Also invalidate posts
|
|
238
|
+
* exclude: ['findUsers'], // Don't invalidate findUsers
|
|
239
|
+
* },
|
|
240
|
+
* });
|
|
241
|
+
* ```
|
|
242
|
+
*/
|
|
243
|
+
export interface AutoInvalidationConfig {
|
|
244
|
+
/**
|
|
245
|
+
* Enable/disable auto-invalidation
|
|
246
|
+
* @default true
|
|
247
|
+
*/
|
|
248
|
+
enabled?: boolean;
|
|
249
|
+
/**
|
|
250
|
+
* Additional queries to invalidate beyond convention-based rules
|
|
251
|
+
*
|
|
252
|
+
* Each tuple is [namespace, procedureName, input?]
|
|
253
|
+
*
|
|
254
|
+
* @example
|
|
255
|
+
* ```tsx
|
|
256
|
+
* autoInvalidate: {
|
|
257
|
+
* additional: [
|
|
258
|
+
* ['posts', 'listPosts'], // Invalidate all listPosts
|
|
259
|
+
* ['posts', 'getPost', { id: '1' }] // Invalidate specific post
|
|
260
|
+
* ],
|
|
261
|
+
* }
|
|
262
|
+
* ```
|
|
263
|
+
*/
|
|
264
|
+
additional?: Array<readonly [string, string, unknown?]>;
|
|
265
|
+
/**
|
|
266
|
+
* Procedure names to exclude from auto-invalidation
|
|
267
|
+
*
|
|
268
|
+
* @example
|
|
269
|
+
* ```tsx
|
|
270
|
+
* autoInvalidate: {
|
|
271
|
+
* exclude: ['findUsers', 'getUserStats'],
|
|
272
|
+
* }
|
|
273
|
+
* ```
|
|
274
|
+
*/
|
|
275
|
+
exclude?: string[];
|
|
276
|
+
/**
|
|
277
|
+
* Custom invalidation logic called after convention-based invalidation
|
|
278
|
+
*
|
|
279
|
+
* @example
|
|
280
|
+
* ```tsx
|
|
281
|
+
* autoInvalidate: {
|
|
282
|
+
* custom: async ({ namespace, input, invalidate }) => {
|
|
283
|
+
* await invalidate('getUserStats', input);
|
|
284
|
+
* },
|
|
285
|
+
* }
|
|
286
|
+
* ```
|
|
287
|
+
*/
|
|
288
|
+
custom?: (context: InvalidationContext) => void | Promise<void>;
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Context passed to custom invalidation handlers
|
|
292
|
+
*/
|
|
293
|
+
export interface InvalidationContext {
|
|
294
|
+
/** The namespace of the mutation (e.g., 'users') */
|
|
295
|
+
namespace: string;
|
|
296
|
+
/** The mutation procedure name (e.g., 'createUser') */
|
|
297
|
+
procedureName: string;
|
|
298
|
+
/** The input passed to the mutation */
|
|
299
|
+
input: unknown;
|
|
300
|
+
/** The mutation result/output */
|
|
301
|
+
data: unknown;
|
|
302
|
+
/** QueryClient for manual operations */
|
|
303
|
+
queryClient: QueryClient;
|
|
304
|
+
/** Helper to invalidate a specific query in the same namespace */
|
|
305
|
+
invalidate: (procedureName: string, input?: unknown) => Promise<void>;
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Extended mutation options with auto-invalidation support
|
|
309
|
+
*
|
|
310
|
+
* Extends React Query's UseMutationOptions with VeloxTS-specific features.
|
|
311
|
+
*
|
|
312
|
+
* @template TOutput - The mutation output type
|
|
313
|
+
* @template TInput - The mutation input type
|
|
314
|
+
* @template TContext - The mutation context type (for optimistic updates)
|
|
315
|
+
*/
|
|
316
|
+
export interface VeloxMutationOptions<TOutput, TInput, TContext = unknown> extends Omit<UseMutationOptions<TOutput, Error, TInput, TContext>, 'mutationFn'> {
|
|
317
|
+
/**
|
|
318
|
+
* Configure automatic cache invalidation
|
|
319
|
+
*
|
|
320
|
+
* - `true` (default): Enable convention-based invalidation
|
|
321
|
+
* - `false`: Disable auto-invalidation entirely
|
|
322
|
+
* - `AutoInvalidationConfig`: Customize invalidation behavior
|
|
323
|
+
*
|
|
324
|
+
* @default true
|
|
325
|
+
*/
|
|
326
|
+
autoInvalidate?: boolean | AutoInvalidationConfig;
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Resolves a procedure to its appropriate hook interface
|
|
330
|
+
* based on whether it's a query or mutation
|
|
331
|
+
*
|
|
332
|
+
* @internal
|
|
333
|
+
*/
|
|
334
|
+
type VeloxProcedureHooks<TProcedure> = TProcedure extends ClientProcedure<infer TInput, infer TOutput> ? ExtractProcedureType<TProcedure> extends 'query' ? VeloxQueryProcedure<TInput, TOutput> : ExtractProcedureType<TProcedure> extends 'mutation' ? VeloxMutationProcedure<TInput, TOutput> : never : never;
|
|
335
|
+
/**
|
|
336
|
+
* Maps a procedures record to hook interfaces
|
|
337
|
+
*
|
|
338
|
+
* Each procedure becomes a VeloxQueryProcedure or VeloxMutationProcedure
|
|
339
|
+
* based on its type.
|
|
340
|
+
*
|
|
341
|
+
* @template TProcedures - The procedures record type
|
|
342
|
+
*/
|
|
343
|
+
export type VeloxNamespace<TProcedures extends ProcedureRecord> = {
|
|
344
|
+
[K in keyof TProcedures]: VeloxProcedureHooks<TProcedures[K]>;
|
|
345
|
+
};
|
|
346
|
+
/**
|
|
347
|
+
* Maps router namespaces to their namespace hook interfaces
|
|
348
|
+
*
|
|
349
|
+
* This is the top-level type returned by `createVeloxHooks`.
|
|
350
|
+
*
|
|
351
|
+
* @template TRouter - The router type (collection of procedure collections)
|
|
352
|
+
*
|
|
353
|
+
* @example
|
|
354
|
+
* ```typescript
|
|
355
|
+
* type AppRouter = {
|
|
356
|
+
* users: typeof userProcedures;
|
|
357
|
+
* posts: typeof postProcedures;
|
|
358
|
+
* };
|
|
359
|
+
*
|
|
360
|
+
* const api: VeloxHooks<AppRouter> = createVeloxHooks<AppRouter>();
|
|
361
|
+
* // api.users.getUser is VeloxQueryProcedure<{id: string}, User>
|
|
362
|
+
* // api.users.createUser is VeloxMutationProcedure<CreateUserInput, User>
|
|
363
|
+
* ```
|
|
364
|
+
*/
|
|
365
|
+
export type VeloxHooks<TRouter> = {
|
|
366
|
+
[K in keyof TRouter]: TRouter[K] extends ProcedureCollection<infer TProcedures> ? VeloxNamespace<TProcedures> : never;
|
|
367
|
+
};
|
|
368
|
+
/**
|
|
369
|
+
* Configuration for createVeloxHooks
|
|
370
|
+
*/
|
|
371
|
+
export interface VeloxHooksConfig<TRouter = unknown> {
|
|
372
|
+
/**
|
|
373
|
+
* Optional: provide client directly instead of using context
|
|
374
|
+
*
|
|
375
|
+
* This is useful for:
|
|
376
|
+
* - Server-side rendering (SSR) where context isn't available
|
|
377
|
+
* - Testing scenarios
|
|
378
|
+
* - Using hooks outside VeloxProvider
|
|
379
|
+
*
|
|
380
|
+
* @example
|
|
381
|
+
* ```typescript
|
|
382
|
+
* // For SSR
|
|
383
|
+
* const client = createClient<AppRouter>({ baseUrl: '/api' });
|
|
384
|
+
* const api = createVeloxHooks<AppRouter>({ client });
|
|
385
|
+
* ```
|
|
386
|
+
*/
|
|
387
|
+
client?: ClientFromRouter<TRouter>;
|
|
388
|
+
}
|
|
389
|
+
/**
|
|
390
|
+
* Generic client type for internal use
|
|
391
|
+
* @internal
|
|
392
|
+
*/
|
|
393
|
+
export type GenericClient = Record<string, Record<string, (input: unknown) => Promise<unknown>>>;
|
|
394
|
+
/**
|
|
395
|
+
* Function to get client instance
|
|
396
|
+
* Can either use context (returns undefined if not in component) or direct client
|
|
397
|
+
* @internal
|
|
398
|
+
*/
|
|
399
|
+
export type ClientGetter<TRouter> = () => ClientFromRouter<TRouter>;
|
|
400
|
+
export {};
|
|
401
|
+
//# sourceMappingURL=proxy-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxy-types.d.ts","sourceRoot":"","sources":["../../src/react/proxy-types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type definitions for tRPC-style proxy hooks
|
|
3
|
+
*
|
|
4
|
+
* Provides type utilities for the new `createVeloxHooks` API that enables
|
|
5
|
+
* full IDE autocomplete through a proxy-based hook system.
|
|
6
|
+
*
|
|
7
|
+
* @module @veloxts/client/react/proxy-types
|
|
8
|
+
*/
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=proxy-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxy-types.js","sourceRoot":"","sources":["../../src/react/proxy-types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
|
package/dist/types.d.ts
CHANGED
|
@@ -182,6 +182,49 @@ export interface ClientConfig {
|
|
|
182
182
|
* Called when a request fails or returns an error response
|
|
183
183
|
*/
|
|
184
184
|
onError?: (error: ClientError) => void | Promise<void>;
|
|
185
|
+
/**
|
|
186
|
+
* Unauthorized handler for automatic token refresh
|
|
187
|
+
*
|
|
188
|
+
* Called when a request receives a 401 Unauthorized response.
|
|
189
|
+
* Return `true` to retry the request with fresh headers.
|
|
190
|
+
* Return `false` to propagate the original error.
|
|
191
|
+
*
|
|
192
|
+
* The headers function is called fresh for the retry, so update your
|
|
193
|
+
* token storage before returning `true`.
|
|
194
|
+
*
|
|
195
|
+
* @example
|
|
196
|
+
* ```typescript
|
|
197
|
+
* const client = createClient<AppRouter>({
|
|
198
|
+
* baseUrl: '/api',
|
|
199
|
+
* headers: () => {
|
|
200
|
+
* const token = localStorage.getItem('token');
|
|
201
|
+
* return token ? { Authorization: `Bearer ${token}` } : {};
|
|
202
|
+
* },
|
|
203
|
+
* onUnauthorized: async () => {
|
|
204
|
+
* const refreshToken = localStorage.getItem('refreshToken');
|
|
205
|
+
* if (!refreshToken) return false;
|
|
206
|
+
*
|
|
207
|
+
* const res = await fetch('/api/auth/refresh', {
|
|
208
|
+
* method: 'POST',
|
|
209
|
+
* headers: { 'Content-Type': 'application/json' },
|
|
210
|
+
* body: JSON.stringify({ refreshToken }),
|
|
211
|
+
* });
|
|
212
|
+
*
|
|
213
|
+
* if (!res.ok) {
|
|
214
|
+
* localStorage.removeItem('token');
|
|
215
|
+
* localStorage.removeItem('refreshToken');
|
|
216
|
+
* return false;
|
|
217
|
+
* }
|
|
218
|
+
*
|
|
219
|
+
* const data = await res.json();
|
|
220
|
+
* localStorage.setItem('token', data.accessToken);
|
|
221
|
+
* localStorage.setItem('refreshToken', data.refreshToken);
|
|
222
|
+
* return true; // Retry the original request
|
|
223
|
+
* },
|
|
224
|
+
* });
|
|
225
|
+
* ```
|
|
226
|
+
*/
|
|
227
|
+
onUnauthorized?: () => boolean | Promise<boolean>;
|
|
185
228
|
/**
|
|
186
229
|
* Optional custom fetch implementation
|
|
187
230
|
* Defaults to global fetch
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|