@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.
@@ -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
@@ -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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@veloxts/client",
3
- "version": "0.4.8",
3
+ "version": "0.4.10",
4
4
  "description": "Type-safe frontend API client for VeloxTS framework",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",