@orpc/react 0.0.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.
Files changed (71) hide show
  1. package/dist/index.js +635 -0
  2. package/dist/src/general-hooks.d.ts +24 -0
  3. package/dist/src/general-hooks.d.ts.map +1 -0
  4. package/dist/src/general-utils.d.ts +41 -0
  5. package/dist/src/general-utils.d.ts.map +1 -0
  6. package/dist/src/index.d.ts +9 -0
  7. package/dist/src/index.d.ts.map +1 -0
  8. package/dist/src/orpc-path.d.ts +5 -0
  9. package/dist/src/orpc-path.d.ts.map +1 -0
  10. package/dist/src/procedure-hooks.d.ts +31 -0
  11. package/dist/src/procedure-hooks.d.ts.map +1 -0
  12. package/dist/src/procedure-utils.d.ts +35 -0
  13. package/dist/src/procedure-utils.d.ts.map +1 -0
  14. package/dist/src/react-context.d.ts +13 -0
  15. package/dist/src/react-context.d.ts.map +1 -0
  16. package/dist/src/react-hooks.d.ts +22 -0
  17. package/dist/src/react-hooks.d.ts.map +1 -0
  18. package/dist/src/react-utils.d.ts +22 -0
  19. package/dist/src/react-utils.d.ts.map +1 -0
  20. package/dist/src/react.d.ts +21 -0
  21. package/dist/src/react.d.ts.map +1 -0
  22. package/dist/src/tanstack-key.d.ts +15 -0
  23. package/dist/src/tanstack-key.d.ts.map +1 -0
  24. package/dist/src/tanstack-query.d.ts +19 -0
  25. package/dist/src/tanstack-query.d.ts.map +1 -0
  26. package/dist/src/types.d.ts +5 -0
  27. package/dist/src/types.d.ts.map +1 -0
  28. package/dist/src/use-queries/builder.d.ts +20 -0
  29. package/dist/src/use-queries/builder.d.ts.map +1 -0
  30. package/dist/src/use-queries/builders.d.ts +19 -0
  31. package/dist/src/use-queries/builders.d.ts.map +1 -0
  32. package/dist/src/use-queries/hook.d.ts +16 -0
  33. package/dist/src/use-queries/hook.d.ts.map +1 -0
  34. package/dist/tsconfig.tsbuildinfo +1 -0
  35. package/package.json +56 -0
  36. package/src/general-hooks.test-d.ts +151 -0
  37. package/src/general-hooks.test.tsx +232 -0
  38. package/src/general-hooks.ts +100 -0
  39. package/src/general-utils.test-d.ts +454 -0
  40. package/src/general-utils.test.tsx +818 -0
  41. package/src/general-utils.ts +397 -0
  42. package/src/index.ts +8 -0
  43. package/src/orpc-path.test-d.ts +13 -0
  44. package/src/orpc-path.test.ts +12 -0
  45. package/src/orpc-path.ts +24 -0
  46. package/src/procedure-hooks.test-d.ts +321 -0
  47. package/src/procedure-hooks.test.tsx +388 -0
  48. package/src/procedure-hooks.ts +271 -0
  49. package/src/procedure-utils.test-d.ts +476 -0
  50. package/src/procedure-utils.test.tsx +330 -0
  51. package/src/procedure-utils.ts +315 -0
  52. package/src/react-context.ts +43 -0
  53. package/src/react-hooks.ts +102 -0
  54. package/src/react-utils.ts +110 -0
  55. package/src/react.test-d.ts +89 -0
  56. package/src/react.test.tsx +102 -0
  57. package/src/react.tsx +80 -0
  58. package/src/tanstack-key.test-d.ts +35 -0
  59. package/src/tanstack-key.test.ts +62 -0
  60. package/src/tanstack-key.ts +64 -0
  61. package/src/tanstack-query.ts +27 -0
  62. package/src/types.ts +7 -0
  63. package/src/use-queries/builder.test-d.ts +29 -0
  64. package/src/use-queries/builder.test.ts +25 -0
  65. package/src/use-queries/builder.ts +72 -0
  66. package/src/use-queries/builders.test-d.ts +30 -0
  67. package/src/use-queries/builders.test.tsx +29 -0
  68. package/src/use-queries/builders.ts +101 -0
  69. package/src/use-queries/hook.test-d.ts +64 -0
  70. package/src/use-queries/hook.test.tsx +89 -0
  71. package/src/use-queries/hook.ts +57 -0
@@ -0,0 +1,818 @@
1
+ import type { SchemaOutput } from '@orpc/contract'
2
+ import {
3
+ QueryClient,
4
+ useInfiniteQuery,
5
+ useMutation,
6
+ useQuery,
7
+ } from '@tanstack/react-query'
8
+ import { renderHook } from '@testing-library/react'
9
+ import type {
10
+ UserCreateInputSchema,
11
+ UserFindInputSchema,
12
+ UserListInputSchema,
13
+ UserListOutputSchema,
14
+ UserSchema,
15
+ } from '../tests/orpc'
16
+ import { createGeneralUtils } from './general-utils'
17
+
18
+ let qc = new QueryClient()
19
+
20
+ let user_utils = createGeneralUtils({
21
+ queryClient: qc,
22
+ path: ['user'],
23
+ })
24
+
25
+ let user_find_utils = createGeneralUtils<
26
+ typeof UserFindInputSchema,
27
+ typeof UserSchema,
28
+ SchemaOutput<typeof UserSchema>
29
+ >({
30
+ queryClient: qc,
31
+ path: ['user', 'find'],
32
+ })
33
+
34
+ let user_list_utils = createGeneralUtils<
35
+ typeof UserListInputSchema,
36
+ typeof UserListOutputSchema,
37
+ SchemaOutput<typeof UserListOutputSchema>
38
+ >({
39
+ queryClient: qc,
40
+ path: ['user', 'list'],
41
+ })
42
+
43
+ let user_create_utils = createGeneralUtils<
44
+ typeof UserCreateInputSchema,
45
+ typeof UserSchema,
46
+ SchemaOutput<typeof UserSchema>
47
+ >({
48
+ queryClient: qc,
49
+ path: ['user', 'create'],
50
+ })
51
+
52
+ beforeEach(() => {
53
+ qc = new QueryClient()
54
+ user_utils = createGeneralUtils({
55
+ queryClient: qc,
56
+ path: ['user'],
57
+ })
58
+
59
+ user_find_utils = createGeneralUtils<
60
+ typeof UserFindInputSchema,
61
+ typeof UserSchema,
62
+ SchemaOutput<typeof UserSchema>
63
+ >({
64
+ queryClient: qc,
65
+ path: ['user', 'find'],
66
+ })
67
+
68
+ user_list_utils = createGeneralUtils<
69
+ typeof UserListInputSchema,
70
+ typeof UserListOutputSchema,
71
+ SchemaOutput<typeof UserListOutputSchema>
72
+ >({
73
+ queryClient: qc,
74
+ path: ['user', 'list'],
75
+ })
76
+
77
+ user_create_utils = createGeneralUtils<
78
+ typeof UserCreateInputSchema,
79
+ typeof UserSchema,
80
+ SchemaOutput<typeof UserSchema>
81
+ >({
82
+ queryClient: qc,
83
+ path: ['user', 'create'],
84
+ })
85
+ })
86
+
87
+ it('getQueriesData', () => {
88
+ const user = {
89
+ id: '123',
90
+ name: '123-4',
91
+ }
92
+
93
+ qc.setQueryData(
94
+ [['user', 'find'], { input: { id: user.id }, type: 'infinite' }],
95
+ 'never get this',
96
+ )
97
+ qc.setQueryData(
98
+ [['user', 'find'], { input: { id: user.id }, type: 'query' }],
99
+ user,
100
+ )
101
+
102
+ expect(user_utils.getQueriesData().length).toEqual(1)
103
+ expect(user_utils.getQueriesData()[0]?.[1]).toEqual(user)
104
+
105
+ expect(user_find_utils.getQueriesData().length).toEqual(1)
106
+ expect(user_find_utils.getQueriesData()[0]?.[1]).toEqual(user)
107
+ expect(
108
+ user_find_utils.getQueriesData({ input: { id: user.id } }).length,
109
+ ).toEqual(1)
110
+
111
+ expect(
112
+ user_find_utils.getQueriesData({ input: { id: 'diff' } }).length,
113
+ ).toEqual(0)
114
+ expect(user_list_utils.getQueriesData().length).toEqual(0)
115
+ })
116
+
117
+ it('getInfiniteQueriesData', () => {
118
+ const page = {
119
+ nextCursor: 1,
120
+ users: [],
121
+ }
122
+
123
+ qc.setQueryData([['user', 'list'], { type: 'infinite' }], page)
124
+ qc.setQueryData([['user', 'list'], { type: 'query' }], 'never get this')
125
+
126
+ expect(user_utils.getInfiniteQueriesData().length).toEqual(1)
127
+ expect(user_utils.getInfiniteQueriesData()[0]?.[1]).toEqual(page)
128
+
129
+ expect(user_list_utils.getInfiniteQueriesData().length).toEqual(1)
130
+ expect(user_list_utils.getInfiniteQueriesData()[0]?.[1]).toEqual(page)
131
+
132
+ expect(
133
+ user_list_utils.getInfiniteQueriesData({ input: { keyword: 'invalid' } })
134
+ .length,
135
+ ).toEqual(0)
136
+ expect(user_find_utils.getInfiniteQueriesData().length).toEqual(0)
137
+ })
138
+
139
+ it('setQueriesData', () => {
140
+ const page = {
141
+ nextCursor: 1,
142
+ users: [],
143
+ }
144
+
145
+ const user = {
146
+ id: '123',
147
+ name: '123-4',
148
+ }
149
+
150
+ qc.setQueryData(
151
+ [['user', 'find'], { input: { id: user.id }, type: 'infinite' }],
152
+ page,
153
+ )
154
+ qc.setQueryData(
155
+ [['user', 'find'], { input: { id: user.id }, type: 'query' }],
156
+ user,
157
+ )
158
+
159
+ const user2 = {
160
+ ...user,
161
+ id: 'user-2',
162
+ }
163
+
164
+ user_utils.setQueriesData({}, (old: any) => {
165
+ expect(old).toBe(user)
166
+
167
+ return user2
168
+ })
169
+
170
+ const user3 = {
171
+ ...user2,
172
+ id: 'user-2',
173
+ }
174
+
175
+ user_find_utils.setQueriesData({}, (old: any) => {
176
+ expect(old).toEqual(user2)
177
+
178
+ return user3
179
+ })
180
+
181
+ const fn = vi.fn()
182
+ user_list_utils.setQueriesData({}, fn)
183
+ expect(fn).not.toHaveBeenCalled()
184
+
185
+ expect(
186
+ qc.getQueryData([
187
+ ['user', 'find'],
188
+ { input: { id: user.id }, type: 'query' },
189
+ ]),
190
+ ).toEqual(user3)
191
+ })
192
+
193
+ it('setInfiniteQueriesData', () => {
194
+ const page = {
195
+ pageParams: [undefined],
196
+ pages: [
197
+ {
198
+ nextCursor: 1,
199
+ users: [],
200
+ },
201
+ ],
202
+ }
203
+
204
+ const user = {
205
+ id: '123',
206
+ name: '123-4',
207
+ }
208
+
209
+ qc.setQueryData([['user', 'list'], { type: 'infinite' }], page)
210
+ qc.setQueryData([['user', 'list'], { type: 'query' }], user)
211
+
212
+ const page2 = {
213
+ ...page,
214
+ page: 2,
215
+ }
216
+
217
+ user_utils.setInfiniteQueriesData({}, (old) => {
218
+ expect(old).toBe(page)
219
+
220
+ return page2
221
+ })
222
+
223
+ const page3 = {
224
+ ...page,
225
+ page: 3,
226
+ }
227
+
228
+ user_list_utils.setInfiniteQueriesData({}, (old) => {
229
+ expect(old).toEqual(page2)
230
+
231
+ return page3
232
+ })
233
+
234
+ const fn = vi.fn()
235
+ user_find_utils.setQueriesData({}, fn)
236
+ expect(fn).not.toHaveBeenCalled()
237
+
238
+ expect(qc.getQueryData([['user', 'list'], { type: 'infinite' }])).toEqual(
239
+ page3,
240
+ )
241
+ })
242
+
243
+ describe('invalidate', () => {
244
+ const infiniteQueryKey = [['user', 'list'], { type: 'infinite' }]
245
+ const queryKey = [['user', 'list'], { type: 'query' }]
246
+
247
+ const reset = () => {
248
+ qc.setQueryData(infiniteQueryKey, 'page')
249
+ qc.setQueryData(queryKey, 'user')
250
+ }
251
+
252
+ beforeEach(() => {
253
+ reset()
254
+
255
+ expect(qc.getQueryState(infiniteQueryKey)?.isInvalidated).toBe(false)
256
+ expect(qc.getQueryState(queryKey)?.isInvalidated).toBe(false)
257
+ })
258
+
259
+ it('root level', () => {
260
+ user_utils.invalidate()
261
+
262
+ expect(qc.getQueryState(infiniteQueryKey)?.isInvalidated).toBe(true)
263
+ expect(qc.getQueryState(queryKey)?.isInvalidated).toBe(true)
264
+
265
+ reset()
266
+ user_utils.invalidate({ queryType: 'query' })
267
+
268
+ expect(qc.getQueryState(infiniteQueryKey)?.isInvalidated).toBe(false)
269
+ expect(qc.getQueryState(queryKey)?.isInvalidated).toBe(true)
270
+ })
271
+
272
+ it('procedure level', () => {
273
+ user_list_utils.invalidate()
274
+
275
+ expect(qc.getQueryState(infiniteQueryKey)?.isInvalidated).toBe(true)
276
+ expect(qc.getQueryState(queryKey)?.isInvalidated).toBe(true)
277
+ })
278
+
279
+ it('procedure level with filters', () => {
280
+ user_list_utils.invalidate({ queryType: 'query' })
281
+ expect(qc.getQueryState(infiniteQueryKey)?.isInvalidated).toBe(false)
282
+ expect(qc.getQueryState(queryKey)?.isInvalidated).toBe(true)
283
+
284
+ reset()
285
+
286
+ user_list_utils.invalidate({ queryType: 'infinite' })
287
+ expect(qc.getQueryState(infiniteQueryKey)?.isInvalidated).toBe(true)
288
+ expect(qc.getQueryState(queryKey)?.isInvalidated).toBe(false)
289
+ })
290
+
291
+ it('on mismatched procedure level', () => {
292
+ user_find_utils.invalidate()
293
+ expect(qc.getQueryState(infiniteQueryKey)?.isInvalidated).toBe(false)
294
+ expect(qc.getQueryState(queryKey)?.isInvalidated).toBe(false)
295
+ })
296
+ })
297
+
298
+ describe('refetch', () => {
299
+ const infiniteQueryKey = [['user', 'list'], { type: 'infinite' }]
300
+ const queryKey = [['user', 'list'], { type: 'query' }]
301
+
302
+ const fn1 = vi.fn(() => new Promise((resolve) => setTimeout(resolve, 100)))
303
+ const fn2 = vi.fn(() => new Promise((resolve) => setTimeout(resolve, 100)))
304
+
305
+ beforeEach(() => {
306
+ fn1.mockClear()
307
+ fn2.mockClear()
308
+
309
+ renderHook(() =>
310
+ useInfiniteQuery(
311
+ {
312
+ queryKey: infiniteQueryKey,
313
+ queryFn: fn1,
314
+ getNextPageParam: () => 2,
315
+ initialPageParam: 1,
316
+ },
317
+ qc,
318
+ ),
319
+ )
320
+
321
+ renderHook(() =>
322
+ useQuery(
323
+ {
324
+ queryKey: queryKey,
325
+ queryFn: fn2,
326
+ },
327
+ qc,
328
+ ),
329
+ )
330
+
331
+ expect(fn1).toHaveBeenCalledTimes(1)
332
+ expect(fn2).toHaveBeenCalledTimes(1)
333
+ })
334
+
335
+ it('root level', async () => {
336
+ user_utils.refetch()
337
+
338
+ expect(fn1).toHaveBeenCalledTimes(1)
339
+ expect(fn2).toHaveBeenCalledTimes(1)
340
+
341
+ await new Promise((resolve) => setTimeout(resolve, 101))
342
+ user_utils.refetch()
343
+
344
+ expect(fn1).toHaveBeenCalledTimes(2)
345
+ expect(fn2).toHaveBeenCalledTimes(2)
346
+ })
347
+
348
+ it('root level with filters', async () => {
349
+ user_utils.refetch({ queryType: 'query' })
350
+ expect(fn1).toHaveBeenCalledTimes(1)
351
+ expect(fn2).toHaveBeenCalledTimes(1)
352
+
353
+ await new Promise((resolve) => setTimeout(resolve, 101))
354
+ user_utils.refetch({ queryType: 'query' })
355
+
356
+ expect(fn1).toHaveBeenCalledTimes(1)
357
+ expect(fn2).toHaveBeenCalledTimes(2)
358
+ })
359
+
360
+ it('procedure level', async () => {
361
+ user_list_utils.refetch()
362
+
363
+ expect(fn1).toHaveBeenCalledTimes(1)
364
+ expect(fn2).toHaveBeenCalledTimes(1)
365
+
366
+ await new Promise((resolve) => setTimeout(resolve, 101))
367
+ user_list_utils.refetch()
368
+
369
+ expect(fn1).toHaveBeenCalledTimes(2)
370
+ expect(fn2).toHaveBeenCalledTimes(2)
371
+ })
372
+
373
+ it('procedure level with filters', async () => {
374
+ user_list_utils.refetch({ queryType: 'infinite' })
375
+
376
+ expect(fn1).toHaveBeenCalledTimes(1)
377
+ expect(fn2).toHaveBeenCalledTimes(1)
378
+
379
+ await new Promise((resolve) => setTimeout(resolve, 101))
380
+ user_list_utils.refetch({ queryType: 'infinite' })
381
+
382
+ expect(fn1).toHaveBeenCalledTimes(2)
383
+ expect(fn2).toHaveBeenCalledTimes(1)
384
+ })
385
+
386
+ it('on mismatched procedure level', async () => {
387
+ user_find_utils.refetch()
388
+
389
+ expect(fn1).toHaveBeenCalledTimes(1)
390
+ expect(fn2).toHaveBeenCalledTimes(1)
391
+
392
+ await new Promise((resolve) => setTimeout(resolve, 101))
393
+ user_find_utils.refetch()
394
+
395
+ expect(fn1).toHaveBeenCalledTimes(1)
396
+ expect(fn2).toHaveBeenCalledTimes(1)
397
+ })
398
+ })
399
+
400
+ describe('cancel', () => {
401
+ const infiniteQueryKey = [['user', 'list'], { type: 'infinite' }]
402
+ const queryKey = [['user', 'list'], { type: 'query' }]
403
+
404
+ beforeEach(() => {
405
+ renderHook(() =>
406
+ useInfiniteQuery(
407
+ {
408
+ queryKey: infiniteQueryKey,
409
+ queryFn: async () =>
410
+ await new Promise((resolve) => setTimeout(resolve, 100)),
411
+ getNextPageParam: () => 2,
412
+ initialPageParam: 1,
413
+ },
414
+ qc,
415
+ ),
416
+ )
417
+
418
+ renderHook(() =>
419
+ useQuery(
420
+ {
421
+ queryKey: queryKey,
422
+ queryFn: async () =>
423
+ await new Promise((resolve) => setTimeout(resolve, 100)),
424
+ },
425
+ qc,
426
+ ),
427
+ )
428
+
429
+ expect(qc.getQueryState(infiniteQueryKey)?.fetchStatus).toBe('fetching')
430
+ expect(qc.getQueryState(queryKey)?.fetchStatus).toBe('fetching')
431
+ })
432
+
433
+ it('root level', () => {
434
+ user_utils.cancel()
435
+
436
+ expect(qc.getQueryState(infiniteQueryKey)?.fetchStatus).toBe('idle')
437
+ expect(qc.getQueryState(queryKey)?.fetchStatus).toBe('idle')
438
+ })
439
+
440
+ it('root level with filters', () => {
441
+ user_utils.cancel({ queryType: 'query' })
442
+
443
+ expect(qc.getQueryState(infiniteQueryKey)?.fetchStatus).toBe('fetching')
444
+ expect(qc.getQueryState(queryKey)?.fetchStatus).toBe('idle')
445
+ })
446
+
447
+ it('procedure level', () => {
448
+ user_list_utils.cancel()
449
+
450
+ expect(qc.getQueryState(infiniteQueryKey)?.fetchStatus).toBe('idle')
451
+ expect(qc.getQueryState(queryKey)?.fetchStatus).toBe('idle')
452
+ })
453
+
454
+ it('procedure level with filters', () => {
455
+ user_list_utils.cancel({ queryType: 'infinite' })
456
+
457
+ expect(qc.getQueryState(infiniteQueryKey)?.fetchStatus).toBe('idle')
458
+ expect(qc.getQueryState(queryKey)?.fetchStatus).toBe('fetching')
459
+ })
460
+
461
+ it('on mismatched procedure level', () => {
462
+ user_find_utils.cancel()
463
+ expect(qc.getQueryState(infiniteQueryKey)?.fetchStatus).toBe('fetching')
464
+ expect(qc.getQueryState(queryKey)?.fetchStatus).toBe('fetching')
465
+ })
466
+ })
467
+
468
+ describe('remove', () => {
469
+ const infiniteQueryKey = [['user', 'list'], { type: 'infinite' }]
470
+ const queryKey = [['user', 'list'], { type: 'query' }]
471
+
472
+ beforeEach(() => {
473
+ qc.setQueryData(infiniteQueryKey, 'page')
474
+ qc.setQueryData(queryKey, 'user')
475
+
476
+ expect(qc.getQueryState(infiniteQueryKey)).not.toBe(undefined)
477
+ expect(qc.getQueryState(queryKey)).not.toBe(undefined)
478
+ })
479
+
480
+ it('root level', () => {
481
+ user_utils.remove()
482
+
483
+ expect(qc.getQueryState(infiniteQueryKey)).toBe(undefined)
484
+ expect(qc.getQueryState(queryKey)).toBe(undefined)
485
+ })
486
+
487
+ it('root level with filters', () => {
488
+ user_utils.remove({ queryType: 'query' })
489
+
490
+ expect(qc.getQueryState(infiniteQueryKey)).not.toBe(undefined)
491
+ expect(qc.getQueryState(queryKey)).toBe(undefined)
492
+ })
493
+
494
+ it('procedure level', () => {
495
+ user_list_utils.remove()
496
+
497
+ expect(qc.getQueryState(infiniteQueryKey)).toBe(undefined)
498
+ expect(qc.getQueryState(queryKey)).toBe(undefined)
499
+ })
500
+
501
+ it('procedure level with filters', () => {
502
+ user_list_utils.remove({ queryType: 'infinite' })
503
+
504
+ expect(qc.getQueryState(infiniteQueryKey)).toBe(undefined)
505
+ expect(qc.getQueryState(queryKey)).not.toBe(undefined)
506
+ })
507
+
508
+ it('on mismatched procedure level', () => {
509
+ user_find_utils.remove()
510
+ expect(qc.getQueryState(infiniteQueryKey)).not.toBe(undefined)
511
+ expect(qc.getQueryState(queryKey)).not.toBe(undefined)
512
+ })
513
+ })
514
+
515
+ describe('reset', () => {
516
+ const infiniteQueryKey = [['user', 'list'], { type: 'infinite' }]
517
+ const queryKey = [['user', 'list'], { type: 'query' }]
518
+
519
+ const fn1 = vi.fn(() => new Promise((resolve) => setTimeout(resolve, 100)))
520
+ const fn2 = vi.fn(() => new Promise((resolve) => setTimeout(resolve, 100)))
521
+
522
+ beforeEach(() => {
523
+ fn1.mockClear()
524
+ fn2.mockClear()
525
+
526
+ renderHook(() =>
527
+ useInfiniteQuery(
528
+ {
529
+ queryKey: infiniteQueryKey,
530
+ queryFn: fn1,
531
+ getNextPageParam: () => 2,
532
+ initialPageParam: 1,
533
+ },
534
+ qc,
535
+ ),
536
+ )
537
+
538
+ renderHook(() =>
539
+ useQuery(
540
+ {
541
+ queryKey: queryKey,
542
+ queryFn: fn2,
543
+ },
544
+ qc,
545
+ ),
546
+ )
547
+
548
+ expect(fn1).toHaveBeenCalledTimes(1)
549
+ expect(fn2).toHaveBeenCalledTimes(1)
550
+ })
551
+
552
+ it('root level', () => {
553
+ user_utils.reset()
554
+
555
+ expect(fn1).toHaveBeenCalledTimes(2)
556
+ expect(fn2).toHaveBeenCalledTimes(2)
557
+ })
558
+
559
+ it('root level with filters', () => {
560
+ user_utils.reset({ queryType: 'query' })
561
+
562
+ expect(fn1).toHaveBeenCalledTimes(1)
563
+ expect(fn2).toHaveBeenCalledTimes(2)
564
+ })
565
+
566
+ it('procedure level', () => {
567
+ user_list_utils.reset()
568
+
569
+ expect(fn1).toHaveBeenCalledTimes(2)
570
+ expect(fn2).toHaveBeenCalledTimes(2)
571
+ })
572
+
573
+ it('procedure level with filters', () => {
574
+ user_list_utils.reset({ queryType: 'infinite' })
575
+
576
+ expect(fn1).toHaveBeenCalledTimes(2)
577
+ expect(fn2).toHaveBeenCalledTimes(1)
578
+ })
579
+
580
+ it('on mismatched procedure level', () => {
581
+ user_find_utils.reset()
582
+
583
+ expect(fn1).toHaveBeenCalledTimes(1)
584
+ expect(fn2).toHaveBeenCalledTimes(1)
585
+ })
586
+ })
587
+
588
+ it('isFetching', () => {
589
+ const infiniteQueryKey = [['user', 'list'], { type: 'infinite' }]
590
+ const queryKey = [['user', 'list'], { type: 'query' }]
591
+
592
+ renderHook(() =>
593
+ useInfiniteQuery(
594
+ {
595
+ queryKey: infiniteQueryKey,
596
+ queryFn: async () =>
597
+ await new Promise((resolve) => setTimeout(resolve, 100)),
598
+ getNextPageParam: () => 2,
599
+ initialPageParam: 1,
600
+ },
601
+ qc,
602
+ ),
603
+ )
604
+
605
+ renderHook(() =>
606
+ useQuery(
607
+ {
608
+ queryKey: queryKey,
609
+ queryFn: async () =>
610
+ await new Promise((resolve) => setTimeout(resolve, 100)),
611
+ },
612
+ qc,
613
+ ),
614
+ )
615
+
616
+ expect(qc.getQueryState(infiniteQueryKey)?.fetchStatus).toBe('fetching')
617
+ expect(qc.getQueryState(queryKey)?.fetchStatus).toBe('fetching')
618
+
619
+ expect(user_utils.isFetching()).toBe(2)
620
+ expect(user_utils.isFetching({ queryType: 'infinite' })).toBe(1)
621
+ expect(user_utils.isFetching({ queryType: 'query' })).toBe(1)
622
+ expect(user_list_utils.isFetching()).toBe(2)
623
+ expect(user_list_utils.isFetching({ queryType: 'infinite' })).toBe(1)
624
+ expect(user_list_utils.isFetching({ queryType: 'query' })).toBe(1)
625
+ expect(user_find_utils.isFetching()).toBe(0)
626
+ })
627
+
628
+ it('isMutating', async () => {
629
+ const { result } = renderHook(() =>
630
+ useMutation(
631
+ {
632
+ mutationKey: [['user', 'create']],
633
+ mutationFn: () => new Promise((resolve) => setTimeout(resolve, 100)),
634
+ },
635
+ qc,
636
+ ),
637
+ )
638
+
639
+ expect(user_utils.isMutating()).toBe(0)
640
+
641
+ result.current.mutate()
642
+
643
+ expect(user_utils.isMutating()).toBe(1)
644
+ expect(user_create_utils.isMutating()).toBe(1)
645
+ expect(user_list_utils.isMutating()).toBe(0)
646
+ expect(user_find_utils.isMutating()).toBe(0)
647
+ })
648
+
649
+ describe('getQueryDefaults', () => {
650
+ it('on router level', () => {
651
+ const fn = vi.fn()
652
+
653
+ qc.setQueryDefaults([['user'], { type: 'query' }], {
654
+ queryFn: fn,
655
+ })
656
+
657
+ expect(user_utils.getQueryDefaults()?.queryFn).toBe(fn)
658
+ expect(user_find_utils.getQueryDefaults()?.queryFn).toBe(fn)
659
+ expect(user_list_utils.getQueryDefaults()?.queryFn).toBe(fn)
660
+ })
661
+
662
+ it('on procedure level', () => {
663
+ const fn = vi.fn()
664
+
665
+ qc.setQueryDefaults([['user', 'list'], { type: 'query' }], {
666
+ queryFn: fn,
667
+ })
668
+
669
+ expect(user_utils.getQueryDefaults()?.queryFn).toBe(undefined)
670
+ expect(user_find_utils.getQueryDefaults()?.queryFn).toBe(undefined)
671
+ expect(user_list_utils.getQueryDefaults()?.queryFn).toBe(fn)
672
+ })
673
+ })
674
+
675
+ describe('getInfiniteQueryDefaults', () => {
676
+ it('on router level', () => {
677
+ const fn = vi.fn()
678
+
679
+ qc.setQueryDefaults([['user'], { type: 'infinite' }], {
680
+ queryFn: fn,
681
+ })
682
+
683
+ expect(user_utils.getInfiniteQueryDefaults()?.queryFn).toBe(fn)
684
+ expect(user_find_utils.getInfiniteQueryDefaults()?.queryFn).toBe(fn)
685
+ expect(user_list_utils.getInfiniteQueryDefaults()?.queryFn).toBe(fn)
686
+ })
687
+
688
+ it('on procedure level', () => {
689
+ const fn = vi.fn()
690
+
691
+ qc.setQueryDefaults([['user', 'list'], { type: 'infinite' }], {
692
+ queryFn: fn,
693
+ })
694
+
695
+ expect(user_utils.getInfiniteQueryDefaults()?.queryFn).toBe(undefined)
696
+ expect(user_find_utils.getInfiniteQueryDefaults()?.queryFn).toBe(undefined)
697
+ expect(user_list_utils.getInfiniteQueryDefaults()?.queryFn).toBe(fn)
698
+ })
699
+ })
700
+
701
+ describe('setQueryDefaults', () => {
702
+ it('on router level', () => {
703
+ const fn = vi.fn()
704
+
705
+ user_utils.setQueryDefaults({
706
+ queryFn: fn,
707
+ })
708
+
709
+ expect(qc.getQueryDefaults([['user'], { type: 'query' }])?.queryFn).toBe(fn)
710
+ expect(
711
+ qc.getQueryDefaults([['user', 'find'], { type: 'query' }])?.queryFn,
712
+ ).toBe(fn)
713
+ expect(
714
+ qc.getQueryDefaults([['user', 'find'], { type: 'infinite' }])?.queryFn,
715
+ ).toBe(undefined)
716
+ })
717
+
718
+ it('on procedure level', () => {
719
+ const fn = vi.fn()
720
+
721
+ user_list_utils.setQueryDefaults({
722
+ queryFn: fn,
723
+ })
724
+
725
+ expect(qc.getQueryDefaults([['user'], { type: 'query' }])?.queryFn).toBe(
726
+ undefined,
727
+ )
728
+ expect(
729
+ qc.getQueryDefaults([['user', 'list'], { type: 'query' }])?.queryFn,
730
+ ).toBe(fn)
731
+ })
732
+ })
733
+
734
+ describe('setInfiniteQueryDefaults', () => {
735
+ it('on router level', () => {
736
+ const fn = vi.fn()
737
+
738
+ user_utils.setInfiniteQueryDefaults({
739
+ queryFn: fn,
740
+ })
741
+
742
+ expect(qc.getQueryDefaults([['user'], { type: 'infinite' }])?.queryFn).toBe(
743
+ fn,
744
+ )
745
+ expect(
746
+ qc.getQueryDefaults([['user', 'find'], { type: 'infinite' }])?.queryFn,
747
+ ).toBe(fn)
748
+ expect(
749
+ qc.getQueryDefaults([['user', 'find'], { type: 'query' }])?.queryFn,
750
+ ).toBe(undefined)
751
+ })
752
+
753
+ it('on procedure level', () => {
754
+ const fn = vi.fn()
755
+
756
+ user_list_utils.setInfiniteQueryDefaults({
757
+ queryFn: fn,
758
+ })
759
+
760
+ expect(qc.getQueryDefaults([['user'], { type: 'infinite' }])?.queryFn).toBe(
761
+ undefined,
762
+ )
763
+ expect(
764
+ qc.getQueryDefaults([['user', 'list'], { type: 'infinite' }])?.queryFn,
765
+ ).toBe(fn)
766
+ })
767
+ })
768
+
769
+ describe('getMutationDefaults', () => {
770
+ it('on router level', () => {
771
+ const fn = vi.fn()
772
+
773
+ qc.setMutationDefaults([['user']], {
774
+ mutationFn: fn,
775
+ })
776
+
777
+ expect(user_utils.getMutationDefaults()?.mutationFn).toBe(fn)
778
+ expect(user_find_utils.getMutationDefaults()?.mutationFn).toBe(fn)
779
+ expect(user_list_utils.getMutationDefaults()?.mutationFn).toBe(fn)
780
+ })
781
+
782
+ it('on procedure level', () => {
783
+ const fn = vi.fn()
784
+
785
+ qc.setMutationDefaults([['user', 'create']], {
786
+ mutationFn: fn,
787
+ })
788
+
789
+ expect(user_utils.getMutationDefaults()?.mutationFn).toBe(undefined)
790
+ expect(user_find_utils.getMutationDefaults()?.mutationFn).toBe(undefined)
791
+ expect(user_create_utils.getMutationDefaults()?.mutationFn).toBe(fn)
792
+ })
793
+ })
794
+
795
+ describe('setMutationDefaults', () => {
796
+ it('on router level', () => {
797
+ const fn = vi.fn()
798
+
799
+ user_utils.setMutationDefaults({
800
+ mutationFn: fn,
801
+ })
802
+
803
+ expect(qc.getMutationDefaults([['user']])?.mutationFn).toBe(fn)
804
+ expect(qc.getMutationDefaults([['user', 'create']])?.mutationFn).toBe(fn)
805
+ expect(qc.getMutationDefaults([['ping']])?.mutationFn).toBe(undefined)
806
+ })
807
+
808
+ it('on procedure level', () => {
809
+ const fn = vi.fn()
810
+
811
+ user_create_utils.setMutationDefaults({
812
+ mutationFn: fn,
813
+ })
814
+
815
+ expect(qc.getMutationDefaults([['user']])?.mutationFn).toBe(undefined)
816
+ expect(qc.getMutationDefaults([['user', 'create']])?.mutationFn).toBe(fn)
817
+ })
818
+ })