@codeleap/query 6.8.0 → 7.0.1

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 (45) hide show
  1. package/dist/factors/createQueryManager.js +37 -0
  2. package/dist/factors/createQueryManager.js.map +1 -0
  3. package/dist/factors/createQueryOperations.js +36 -0
  4. package/dist/factors/createQueryOperations.js.map +1 -0
  5. package/dist/factors/index.js +3 -0
  6. package/dist/factors/index.js.map +1 -0
  7. package/dist/index.js +4 -0
  8. package/dist/index.js.map +1 -0
  9. package/dist/lib/Mutations.js +235 -0
  10. package/dist/lib/Mutations.js.map +1 -0
  11. package/dist/lib/QueryClientEnhanced/index.js +195 -0
  12. package/dist/lib/QueryClientEnhanced/index.js.map +1 -0
  13. package/dist/lib/QueryClientEnhanced/types.js +2 -0
  14. package/dist/lib/QueryClientEnhanced/types.js.map +1 -0
  15. package/dist/lib/QueryKeys.js +313 -0
  16. package/dist/lib/QueryKeys.js.map +1 -0
  17. package/dist/lib/QueryManager.js +400 -0
  18. package/dist/lib/QueryManager.js.map +1 -0
  19. package/dist/lib/QueryOperations/index.js +284 -0
  20. package/dist/lib/QueryOperations/index.js.map +1 -0
  21. package/dist/lib/QueryOperations/types.js +2 -0
  22. package/dist/lib/QueryOperations/types.js.map +1 -0
  23. package/dist/lib/index.js +6 -0
  24. package/dist/lib/index.js.map +1 -0
  25. package/dist/types/core.js +2 -0
  26. package/dist/types/core.js.map +1 -0
  27. package/dist/types/create.js +2 -0
  28. package/dist/types/create.js.map +1 -0
  29. package/dist/types/delete.js +2 -0
  30. package/dist/types/delete.js.map +1 -0
  31. package/dist/types/index.js +8 -0
  32. package/dist/types/index.js.map +1 -0
  33. package/dist/types/list.js +2 -0
  34. package/dist/types/list.js.map +1 -0
  35. package/dist/types/retrieve.js +2 -0
  36. package/dist/types/retrieve.js.map +1 -0
  37. package/dist/types/update.js +2 -0
  38. package/dist/types/update.js.map +1 -0
  39. package/dist/types/utility.js +2 -0
  40. package/dist/types/utility.js.map +1 -0
  41. package/dist/utils/index.js +2 -0
  42. package/dist/utils/index.js.map +1 -0
  43. package/dist/utils/misc.js +35 -0
  44. package/dist/utils/misc.js.map +1 -0
  45. package/package.json +6 -6
@@ -0,0 +1,400 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ var __rest = (this && this.__rest) || function (s, e) {
11
+ var t = {};
12
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
13
+ t[p] = s[p];
14
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
15
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
16
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
17
+ t[p[i]] = s[p[i]];
18
+ }
19
+ return t;
20
+ };
21
+ import { useInfiniteQuery, useMutation, useQuery } from '@tanstack/react-query';
22
+ import { useCallback } from 'react';
23
+ import { createQueryKeys } from './QueryKeys';
24
+ import { createMutations } from './Mutations';
25
+ import { generateTempId } from '../utils';
26
+ import { TypeGuards } from '@codeleap/types';
27
+ import { QueryClientEnhanced } from './QueryClientEnhanced';
28
+ /**
29
+ * Comprehensive query manager class that provides hooks and utilities for managing CRUD operations with React Query
30
+ * @template T - The query item type that extends QueryItem
31
+ * @template F - The filter type used for list queries
32
+ *
33
+ * @description
34
+ * QueryManager provides a complete solution for managing list and individual item queries with:
35
+ * - Infinite scroll pagination for lists
36
+ * - Optimistic updates for create, update, and delete operations
37
+ * - Automatic cache synchronization between list and individual queries
38
+ * - Built-in error handling and rollback mechanisms
39
+ */
40
+ export class QueryManager {
41
+ /**
42
+ * Creates a new QueryManager instance
43
+ * @param options - Configuration options for the query manager
44
+ */
45
+ constructor(options) {
46
+ this.options = options;
47
+ this.queryClient = options.queryClient instanceof QueryClientEnhanced ? options.queryClient.client : options.queryClient;
48
+ this.queryKeys = createQueryKeys(options.name, this.queryClient);
49
+ this.mutations = createMutations(this.queryKeys, this.queryClient, options.name);
50
+ }
51
+ /**
52
+ * Gets the name of this query manager
53
+ * @returns The query name used for identification
54
+ */
55
+ get name() {
56
+ return this.options.name;
57
+ }
58
+ /**
59
+ * Gets the configured CRUD functions
60
+ * @returns Object containing all configured function handlers
61
+ */
62
+ get functions() {
63
+ return {
64
+ list: this.options.listFn,
65
+ retrieve: this.options.retrieveFn,
66
+ create: this.options.createFn,
67
+ update: this.options.updateFn,
68
+ delete: this.options.deleteFn,
69
+ };
70
+ }
71
+ /**
72
+ * React hook for infinite scroll list queries with pagination
73
+ * @param options - Configuration options for the list query
74
+ * @returns Object containing items array, query key, and query object
75
+ *
76
+ * @example
77
+ * ```typescript
78
+ * const { items, query } = queryManager.useList({
79
+ * filters: { status: 'active' },
80
+ * limit: 20
81
+ * })
82
+ * ```
83
+ */
84
+ useList(options = {}) {
85
+ var _a, _b, _c, _d, _e;
86
+ const { limit, filters } = options, queryOptions = __rest(options, ["limit", "filters"]);
87
+ const listLimit = (_b = limit !== null && limit !== void 0 ? limit : (_a = this.options) === null || _a === void 0 ? void 0 : _a.listLimit) !== null && _b !== void 0 ? _b : 10;
88
+ const queryKey = this.queryKeys.useListKeyWithFilters(filters);
89
+ const onSelect = useCallback((data) => {
90
+ var _a;
91
+ const pages = (_a = data === null || data === void 0 ? void 0 : data.pages) !== null && _a !== void 0 ? _a : [];
92
+ return {
93
+ pageParams: data === null || data === void 0 ? void 0 : data.pageParams,
94
+ pages,
95
+ allItems: pages.flat(),
96
+ };
97
+ }, []);
98
+ const query = useInfiniteQuery(Object.assign({ queryKey, queryFn: (query) => __awaiter(this, void 0, void 0, function* () {
99
+ var _a, _b, _c;
100
+ const listOffset = (_a = query === null || query === void 0 ? void 0 : query.pageParam) !== null && _a !== void 0 ? _a : 0;
101
+ const data = yield ((_c = (_b = this.options) === null || _b === void 0 ? void 0 : _b.listFn) === null || _c === void 0 ? void 0 : _c.call(_b, listLimit, listOffset, filters));
102
+ return TypeGuards.isArray(data) ? data : [];
103
+ }), initialPageParam: 0, getNextPageParam: (lastPage, allPages, lastPageParam, allPageParams) => {
104
+ if (!(lastPage === null || lastPage === void 0 ? void 0 : lastPage.length) || lastPage.length < listLimit) {
105
+ return undefined;
106
+ }
107
+ return (lastPageParam !== null && lastPageParam !== void 0 ? lastPageParam : 0) + lastPage.length;
108
+ }, getPreviousPageParam: (firstPage, allPages, firstPageParam, allPageParams) => {
109
+ if ((firstPageParam !== null && firstPageParam !== void 0 ? firstPageParam : 0) <= 0) {
110
+ return undefined;
111
+ }
112
+ return (firstPageParam !== null && firstPageParam !== void 0 ? firstPageParam : 0) - listLimit;
113
+ }, select(data) {
114
+ return onSelect(data);
115
+ } }, queryOptions));
116
+ const useListEffect = ((_c = this.options.useListEffect) !== null && _c !== void 0 ? _c : ((args) => null));
117
+ useListEffect(query);
118
+ const items = (_e = (_d = query.data) === null || _d === void 0 ? void 0 : _d.allItems) !== null && _e !== void 0 ? _e : [];
119
+ return {
120
+ items,
121
+ queryKey,
122
+ query,
123
+ };
124
+ }
125
+ /**
126
+ * React hook for retrieving a single item by ID
127
+ * @param id - The ID of the item to retrieve
128
+ * @param options - Configuration options for the retrieve query
129
+ * @returns Object containing the item data, query key, and query object
130
+ *
131
+ * @description
132
+ * This hook automatically:
133
+ * - Uses list cache as initial data if available
134
+ * - Updates list cache when retrieve data changes
135
+ * - Synchronizes data between list and individual caches
136
+ *
137
+ * @example
138
+ * ```typescript
139
+ * const { item, query } = queryManager.useRetrieve('user-123', {
140
+ * enabled: !!userId
141
+ * })
142
+ * ```
143
+ */
144
+ useRetrieve(id, options = {}) {
145
+ const { select } = options, queryOptions = __rest(options, ["select"]);
146
+ const onSelect = useCallback((data) => {
147
+ this.mutations.updateItems(data);
148
+ if (select)
149
+ select === null || select === void 0 ? void 0 : select(data);
150
+ return data;
151
+ }, [select]);
152
+ const getInitialData = useCallback(() => {
153
+ const { itemMap } = this.queryKeys.getListData();
154
+ return itemMap === null || itemMap === void 0 ? void 0 : itemMap[id];
155
+ }, [id]);
156
+ const queryKey = this.queryKeys.useRetrieveKey(id);
157
+ const query = useQuery(Object.assign(Object.assign({ initialData: getInitialData }, queryOptions), { queryKey, queryFn: () => {
158
+ return this.options.retrieveFn(id);
159
+ }, select: (data) => {
160
+ return onSelect(data);
161
+ } }));
162
+ return {
163
+ item: query.data,
164
+ queryKey,
165
+ query,
166
+ };
167
+ }
168
+ /**
169
+ * React hook for creating new items with optimistic updates
170
+ * @param options - Configuration options for the create mutation
171
+ * @returns React Query mutation object for create operations
172
+ *
173
+ * @description
174
+ * This hook supports optimistic updates by:
175
+ * - Immediately adding a temporary item to the cache
176
+ * - Rolling back on error by removing the temporary item
177
+ * - Replacing temporary item with real data on success
178
+ *
179
+ * @example
180
+ * ```typescript
181
+ * const createMutation = queryManager.useCreate({
182
+ * optimistic: true,
183
+ * appendTo: 'start',
184
+ * listFilters: { status: 'active' }
185
+ * })
186
+ *
187
+ * // Usage
188
+ * createMutation.mutate({ name: 'New User', email: 'user@example.com' })
189
+ * ```
190
+ */
191
+ useCreate(options = {}) {
192
+ const { optimistic, listFilters, appendTo, onMutate: providedOnMutate, onError: providedOnError, onSuccess: providedOnSuccess } = options, mutationOptions = __rest(options, ["optimistic", "listFilters", "appendTo", "onMutate", "onError", "onSuccess"]);
193
+ const onMutate = useCallback((data, context) => __awaiter(this, void 0, void 0, function* () {
194
+ if (providedOnMutate)
195
+ providedOnMutate === null || providedOnMutate === void 0 ? void 0 : providedOnMutate(data, context);
196
+ if (optimistic) {
197
+ yield this.queryKeys.cancelListQueries(listFilters);
198
+ const tempId = generateTempId();
199
+ const newItem = Object.assign(Object.assign({}, data), { id: tempId });
200
+ this.mutations.addItem(newItem, appendTo, listFilters);
201
+ return {
202
+ tempId,
203
+ };
204
+ }
205
+ }), [providedOnMutate, optimistic, listFilters]);
206
+ const onError = useCallback((error, variables, onMutateResult, context) => {
207
+ if (providedOnError && onMutateResult)
208
+ providedOnError === null || providedOnError === void 0 ? void 0 : providedOnError(error, variables, onMutateResult, context);
209
+ if (!TypeGuards.isNil(onMutateResult === null || onMutateResult === void 0 ? void 0 : onMutateResult.tempId)) {
210
+ this.mutations.removeItem(onMutateResult === null || onMutateResult === void 0 ? void 0 : onMutateResult.tempId);
211
+ }
212
+ }, [providedOnError]);
213
+ const onSuccess = useCallback((data, variables, onMutateResult, context) => {
214
+ if (providedOnSuccess)
215
+ providedOnSuccess === null || providedOnSuccess === void 0 ? void 0 : providedOnSuccess(data, variables, onMutateResult, context);
216
+ if (TypeGuards.isNil(onMutateResult === null || onMutateResult === void 0 ? void 0 : onMutateResult.tempId)) {
217
+ this.mutations.addItem(data, appendTo, listFilters);
218
+ }
219
+ else {
220
+ this.mutations.updateItems(Object.assign(Object.assign({}, data), { tempId: onMutateResult === null || onMutateResult === void 0 ? void 0 : onMutateResult.tempId }));
221
+ }
222
+ }, [providedOnSuccess, listFilters]);
223
+ const mutation = useMutation(Object.assign(Object.assign({}, mutationOptions), { mutationKey: this.queryKeys.keys.create, mutationFn: (data) => {
224
+ return this.options.createFn(data);
225
+ }, onMutate,
226
+ onError,
227
+ onSuccess }));
228
+ return mutation;
229
+ }
230
+ /**
231
+ * React hook for updating existing items with optimistic updates
232
+ * @param options - Configuration options for the update mutation
233
+ * @returns React Query mutation object for update operations
234
+ *
235
+ * @description
236
+ * This hook supports optimistic updates by:
237
+ * - Immediately updating the item in cache with new data
238
+ * - Rolling back to previous data on error
239
+ * - Confirming updates with server response on success
240
+ *
241
+ * @example
242
+ * ```typescript
243
+ * const updateMutation = queryManager.useUpdate({
244
+ * optimistic: true,
245
+ * onSuccess: (data) => console.log('Updated:', data)
246
+ * })
247
+ *
248
+ * // Usage
249
+ * updateMutation.mutate({ id: 'user-123', name: 'Updated Name' })
250
+ * ```
251
+ */
252
+ useUpdate(options = {}) {
253
+ const { optimistic, onMutate: providedOnMutate, onError: providedOnError, onSuccess: providedOnSuccess } = options, mutationOptions = __rest(options, ["optimistic", "onMutate", "onError", "onSuccess"]);
254
+ const onMutate = useCallback((data, context) => __awaiter(this, void 0, void 0, function* () {
255
+ if (providedOnMutate)
256
+ providedOnMutate === null || providedOnMutate === void 0 ? void 0 : providedOnMutate(data, context);
257
+ if (optimistic) {
258
+ if ((data === null || data === void 0 ? void 0 : data.id) == null)
259
+ return;
260
+ const previousItem = this.queryKeys.getRetrieveData(data.id);
261
+ if (!previousItem)
262
+ return;
263
+ const optimisticItem = Object.assign(Object.assign({}, previousItem), data);
264
+ this.mutations.updateItems(optimisticItem);
265
+ return {
266
+ previousItem,
267
+ optimisticItem,
268
+ };
269
+ }
270
+ }), [providedOnMutate, optimistic]);
271
+ const onError = useCallback((error, variables, onMutateResult, context) => {
272
+ var _a;
273
+ if (providedOnError && onMutateResult)
274
+ providedOnError === null || providedOnError === void 0 ? void 0 : providedOnError(error, variables, onMutateResult, context);
275
+ if (!TypeGuards.isNil((_a = onMutateResult === null || onMutateResult === void 0 ? void 0 : onMutateResult.previousItem) === null || _a === void 0 ? void 0 : _a.id)) {
276
+ this.mutations.updateItems(onMutateResult === null || onMutateResult === void 0 ? void 0 : onMutateResult.previousItem);
277
+ }
278
+ }, [providedOnError]);
279
+ const onSuccess = useCallback((data, variables, onMutateResult, context) => {
280
+ if (providedOnSuccess && onMutateResult)
281
+ providedOnSuccess === null || providedOnSuccess === void 0 ? void 0 : providedOnSuccess(data, variables, onMutateResult, context);
282
+ this.mutations.updateItems(data);
283
+ }, [providedOnSuccess]);
284
+ const mutation = useMutation(Object.assign(Object.assign({}, mutationOptions), { mutationKey: this.queryKeys.keys.update, mutationFn: (data) => {
285
+ return this.options.updateFn(data);
286
+ }, onMutate,
287
+ onError,
288
+ onSuccess }));
289
+ return mutation;
290
+ }
291
+ /**
292
+ * React hook for deleting items with optimistic updates
293
+ * @param options - Configuration options for the delete mutation
294
+ * @returns React Query mutation object for delete operations
295
+ *
296
+ * @description
297
+ * This hook supports optimistic updates by:
298
+ * - Immediately removing the item from cache
299
+ * - Storing the removal positions for potential rollback
300
+ * - Restoring the item to original positions on error
301
+ * - Confirming deletion on success
302
+ *
303
+ * @example
304
+ * ```typescript
305
+ * const deleteMutation = queryManager.useDelete({
306
+ * optimistic: true,
307
+ * onSuccess: () => console.log('Item deleted successfully')
308
+ * })
309
+ *
310
+ * // Usage
311
+ * deleteMutation.mutate('user-123')
312
+ * ```
313
+ */
314
+ useDelete(options = {}) {
315
+ const { optimistic, onMutate: providedOnMutate, onError: providedOnError, onSuccess: providedOnSuccess } = options, mutationOptions = __rest(options, ["optimistic", "onMutate", "onError", "onSuccess"]);
316
+ const onMutate = useCallback((id, context) => __awaiter(this, void 0, void 0, function* () {
317
+ if (providedOnMutate)
318
+ providedOnMutate === null || providedOnMutate === void 0 ? void 0 : providedOnMutate(id, context);
319
+ if (optimistic) {
320
+ const previousItem = this.queryKeys.getRetrieveData(id);
321
+ if (!previousItem)
322
+ return;
323
+ const removedAt = this.mutations.removeItem(id);
324
+ return {
325
+ previousItem,
326
+ removedAt,
327
+ };
328
+ }
329
+ }), [providedOnMutate, optimistic]);
330
+ const onError = useCallback((error, variables, onMutateResult, context) => {
331
+ var _a, _b;
332
+ if (providedOnError && onMutateResult)
333
+ providedOnError === null || providedOnError === void 0 ? void 0 : providedOnError(error, variables, onMutateResult, context);
334
+ if (!TypeGuards.isNil((_a = onMutateResult === null || onMutateResult === void 0 ? void 0 : onMutateResult.previousItem) === null || _a === void 0 ? void 0 : _a.id)) {
335
+ this.mutations.addItem(onMutateResult === null || onMutateResult === void 0 ? void 0 : onMutateResult.previousItem, (_b = onMutateResult === null || onMutateResult === void 0 ? void 0 : onMutateResult.removedAt) !== null && _b !== void 0 ? _b : undefined);
336
+ }
337
+ }, [providedOnError]);
338
+ const onSuccess = useCallback((data, variables, onMutateResult, context) => {
339
+ var _a;
340
+ if (providedOnSuccess && onMutateResult)
341
+ providedOnSuccess === null || providedOnSuccess === void 0 ? void 0 : providedOnSuccess(data, variables, onMutateResult, context);
342
+ if (TypeGuards.isNil((_a = onMutateResult === null || onMutateResult === void 0 ? void 0 : onMutateResult.previousItem) === null || _a === void 0 ? void 0 : _a.id)) {
343
+ this.mutations.removeItem(data);
344
+ }
345
+ }, [providedOnSuccess]);
346
+ const mutation = useMutation(Object.assign(Object.assign({}, mutationOptions), { mutationKey: this.queryKeys.keys.delete, mutationFn: (id) => __awaiter(this, void 0, void 0, function* () {
347
+ return this.options.deleteFn(id);
348
+ }), onMutate,
349
+ onError,
350
+ onSuccess }));
351
+ return mutation;
352
+ }
353
+ /**
354
+ * Prefetches a single item by ID for improved performance
355
+ * @param id - The ID of the item to prefetch
356
+ * @param options - Prefetch options compatible with React Query
357
+ * @returns Promise that resolves when prefetch is complete
358
+ *
359
+ * @description
360
+ * Use this method to preload data that users are likely to need soon,
361
+ * such as when hovering over links or preparing for navigation.
362
+ *
363
+ * @example
364
+ * ```typescript
365
+ * // Prefetch on hover
366
+ * const handleHover = (userId: string) => {
367
+ * queryManager.prefetchRetrieve(userId, { staleTime: 5 * 60 * 1000 })
368
+ * }
369
+ * ```
370
+ */
371
+ prefetchRetrieve(id, options = {}) {
372
+ return this.queryClient.prefetchQuery(Object.assign(Object.assign({}, options), { queryKey: this.queryKeys.keys.retrieve(id), queryFn: () => this.options.retrieveFn(id) }));
373
+ }
374
+ /**
375
+ * Prefetches a paginated list with filters for improved performance
376
+ * @param filters - Filter parameters to apply to the list query
377
+ * @param options - Prefetch options compatible with React Query's infinite queries
378
+ * @param options.initialOffset - Starting offset for pagination (default: 0)
379
+ * @returns Promise that resolves when prefetch is complete
380
+ *
381
+ * @description
382
+ * Use this method to preload paginated list data that users are likely to need soon.
383
+ *
384
+ * @example
385
+ * ```typescript
386
+ * const handle = () => {
387
+ * queryManager.prefetchList(
388
+ * { category: 'electronics' },
389
+ * { staleTime: 5 * 60 * 1000 }
390
+ * )
391
+ * }
392
+ *
393
+ * ```
394
+ */
395
+ prefetchList(filters, options = {}) {
396
+ const { initialOffset = 0 } = options, prefetchOptions = __rest(options, ["initialOffset"]);
397
+ return this.queryClient.prefetchInfiniteQuery(Object.assign(Object.assign({}, prefetchOptions), { initialPageParam: initialOffset, queryKey: this.queryKeys.listKeyWithFilters(filters), queryFn: () => { var _a; return this.options.listFn((_a = this.options.listLimit) !== null && _a !== void 0 ? _a : 10, initialOffset, filters); } }));
398
+ }
399
+ }
400
+ //# sourceMappingURL=QueryManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QueryManager.js","sourceRoot":"","sources":["../../src/lib/QueryManager.ts"],"names":[],"mappings":"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"}