@gravity-ui/data-source 0.7.0 → 0.8.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 (122) hide show
  1. package/README.md +752 -15
  2. package/build/cjs/core/index.d.ts +1 -0
  3. package/build/cjs/core/index.js.map +1 -1
  4. package/build/cjs/core/types/DataManager.d.ts +5 -0
  5. package/build/cjs/core/types/DataManager.js.map +1 -1
  6. package/build/cjs/core/types/Normalizer.d.ts +29 -0
  7. package/build/cjs/core/types/Normalizer.js +6 -0
  8. package/build/cjs/core/types/Normalizer.js.map +1 -0
  9. package/build/cjs/react/DataManagerProvider.d.ts +7 -0
  10. package/build/cjs/react/DataManagerProvider.js +19 -0
  11. package/build/cjs/react/DataManagerProvider.js.map +1 -0
  12. package/build/cjs/react/__tests__/DataManagerContext.test.js +7 -6
  13. package/build/cjs/react/__tests__/DataManagerContext.test.js.map +1 -1
  14. package/build/cjs/react/__tests__/withDataManager.test.js +3 -0
  15. package/build/cjs/react/__tests__/withDataManager.test.js.map +1 -1
  16. package/build/cjs/react/index.d.ts +2 -0
  17. package/build/cjs/react/index.js +8 -0
  18. package/build/cjs/react/index.js.map +1 -1
  19. package/build/cjs/react-query/ClientDataManager.d.ts +11 -2
  20. package/build/cjs/react-query/ClientDataManager.js +76 -9
  21. package/build/cjs/react-query/ClientDataManager.js.map +1 -1
  22. package/build/cjs/react-query/DataSourceProvider.d.ts +7 -0
  23. package/build/cjs/react-query/DataSourceProvider.js +35 -0
  24. package/build/cjs/react-query/DataSourceProvider.js.map +1 -0
  25. package/build/cjs/react-query/__tests__/createQueryNormalizer.test.js +177 -0
  26. package/build/cjs/react-query/__tests__/createQueryNormalizer.test.js.map +1 -0
  27. package/build/cjs/react-query/__tests__/normalizationEdgeCases.test.js +100 -0
  28. package/build/cjs/react-query/__tests__/normalizationEdgeCases.test.js.map +1 -0
  29. package/build/cjs/react-query/__tests__/subscriptions.test.js +1180 -0
  30. package/build/cjs/react-query/__tests__/subscriptions.test.js.map +1 -0
  31. package/build/cjs/react-query/__tests__/threeLevelIntegration.test.js +514 -0
  32. package/build/cjs/react-query/__tests__/threeLevelIntegration.test.js.map +1 -0
  33. package/build/cjs/react-query/__tests__/updateQueriesFromMutationData.test.js +229 -0
  34. package/build/cjs/react-query/__tests__/updateQueriesFromMutationData.test.js.map +1 -0
  35. package/build/cjs/react-query/hooks/__tests__/useQueryData.refetch.test.js +195 -0
  36. package/build/cjs/react-query/hooks/__tests__/useQueryData.refetch.test.js.map +1 -0
  37. package/build/cjs/react-query/impl/infinite/hooks.js +4 -1
  38. package/build/cjs/react-query/impl/infinite/hooks.js.map +1 -1
  39. package/build/cjs/react-query/impl/infinite/types.d.ts +2 -2
  40. package/build/cjs/react-query/impl/infinite/types.js.map +1 -1
  41. package/build/cjs/react-query/impl/plain/hooks.js +4 -1
  42. package/build/cjs/react-query/impl/plain/hooks.js.map +1 -1
  43. package/build/cjs/react-query/impl/plain/types.d.ts +2 -2
  44. package/build/cjs/react-query/impl/plain/types.js.map +1 -1
  45. package/build/cjs/react-query/index.d.ts +2 -0
  46. package/build/cjs/react-query/index.js +7 -0
  47. package/build/cjs/react-query/index.js.map +1 -1
  48. package/build/cjs/react-query/types/normalizer.d.ts +21 -0
  49. package/build/cjs/react-query/types/normalizer.js +6 -0
  50. package/build/cjs/react-query/types/normalizer.js.map +1 -0
  51. package/build/cjs/react-query/types/options.d.ts +12 -0
  52. package/build/cjs/react-query/types/options.js.map +1 -1
  53. package/build/cjs/react-query/utils/normalize.d.ts +22 -0
  54. package/build/cjs/react-query/utils/normalize.js +150 -0
  55. package/build/cjs/react-query/utils/normalize.js.map +1 -0
  56. package/build/cjs/react-query/utils/warn.d.ts +1 -0
  57. package/build/cjs/react-query/utils/warn.js +15 -0
  58. package/build/cjs/react-query/utils/warn.js.map +1 -0
  59. package/build/cjs/react-query/utils/warnDisabledRefetch.d.ts +1 -0
  60. package/build/cjs/react-query/utils/warnDisabledRefetch.js +11 -0
  61. package/build/cjs/react-query/utils/warnDisabledRefetch.js.map +1 -0
  62. package/build/esm/core/index.d.ts +1 -0
  63. package/build/esm/core/index.js.map +1 -1
  64. package/build/esm/core/types/DataManager.d.ts +5 -0
  65. package/build/esm/core/types/DataManager.js.map +1 -1
  66. package/build/esm/core/types/Normalizer.d.ts +29 -0
  67. package/build/esm/core/types/Normalizer.js +2 -0
  68. package/build/esm/core/types/Normalizer.js.map +1 -0
  69. package/build/esm/react/DataManagerProvider.d.ts +7 -0
  70. package/build/esm/react/DataManagerProvider.js +12 -0
  71. package/build/esm/react/DataManagerProvider.js.map +1 -0
  72. package/build/esm/react/__tests__/DataManagerContext.test.js +7 -6
  73. package/build/esm/react/__tests__/DataManagerContext.test.js.map +1 -1
  74. package/build/esm/react/__tests__/withDataManager.test.js +3 -0
  75. package/build/esm/react/__tests__/withDataManager.test.js.map +1 -1
  76. package/build/esm/react/index.d.ts +2 -0
  77. package/build/esm/react/index.js +1 -0
  78. package/build/esm/react/index.js.map +1 -1
  79. package/build/esm/react-query/ClientDataManager.d.ts +11 -2
  80. package/build/esm/react-query/ClientDataManager.js +70 -3
  81. package/build/esm/react-query/ClientDataManager.js.map +1 -1
  82. package/build/esm/react-query/DataSourceProvider.d.ts +7 -0
  83. package/build/esm/react-query/DataSourceProvider.js +28 -0
  84. package/build/esm/react-query/DataSourceProvider.js.map +1 -0
  85. package/build/esm/react-query/__tests__/createQueryNormalizer.test.js +174 -0
  86. package/build/esm/react-query/__tests__/createQueryNormalizer.test.js.map +1 -0
  87. package/build/esm/react-query/__tests__/normalizationEdgeCases.test.js +98 -0
  88. package/build/esm/react-query/__tests__/normalizationEdgeCases.test.js.map +1 -0
  89. package/build/esm/react-query/__tests__/subscriptions.test.js +1176 -0
  90. package/build/esm/react-query/__tests__/subscriptions.test.js.map +1 -0
  91. package/build/esm/react-query/__tests__/threeLevelIntegration.test.js +511 -0
  92. package/build/esm/react-query/__tests__/threeLevelIntegration.test.js.map +1 -0
  93. package/build/esm/react-query/__tests__/updateQueriesFromMutationData.test.js +227 -0
  94. package/build/esm/react-query/__tests__/updateQueriesFromMutationData.test.js.map +1 -0
  95. package/build/esm/react-query/hooks/__tests__/useQueryData.refetch.test.js +192 -0
  96. package/build/esm/react-query/hooks/__tests__/useQueryData.refetch.test.js.map +1 -0
  97. package/build/esm/react-query/impl/infinite/hooks.js +5 -2
  98. package/build/esm/react-query/impl/infinite/hooks.js.map +1 -1
  99. package/build/esm/react-query/impl/infinite/types.d.ts +2 -2
  100. package/build/esm/react-query/impl/infinite/types.js.map +1 -1
  101. package/build/esm/react-query/impl/plain/hooks.js +5 -2
  102. package/build/esm/react-query/impl/plain/hooks.js.map +1 -1
  103. package/build/esm/react-query/impl/plain/types.d.ts +2 -2
  104. package/build/esm/react-query/impl/plain/types.js.map +1 -1
  105. package/build/esm/react-query/index.d.ts +2 -0
  106. package/build/esm/react-query/index.js +1 -0
  107. package/build/esm/react-query/index.js.map +1 -1
  108. package/build/esm/react-query/types/normalizer.d.ts +21 -0
  109. package/build/esm/react-query/types/normalizer.js +2 -0
  110. package/build/esm/react-query/types/normalizer.js.map +1 -0
  111. package/build/esm/react-query/types/options.d.ts +12 -0
  112. package/build/esm/react-query/types/options.js.map +1 -1
  113. package/build/esm/react-query/utils/normalize.d.ts +22 -0
  114. package/build/esm/react-query/utils/normalize.js +143 -0
  115. package/build/esm/react-query/utils/normalize.js.map +1 -0
  116. package/build/esm/react-query/utils/warn.d.ts +1 -0
  117. package/build/esm/react-query/utils/warn.js +9 -0
  118. package/build/esm/react-query/utils/warn.js.map +1 -0
  119. package/build/esm/react-query/utils/warnDisabledRefetch.d.ts +1 -0
  120. package/build/esm/react-query/utils/warnDisabledRefetch.js +5 -0
  121. package/build/esm/react-query/utils/warnDisabledRefetch.js.map +1 -0
  122. package/package.json +2 -1
@@ -0,0 +1,1176 @@
1
+ import _regeneratorRuntime from "@babel/runtime/helpers/regeneratorRuntime";
2
+ import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
3
+ import React from 'react';
4
+ import { useMutation } from '@tanstack/react-query';
5
+ import { renderHook, waitFor } from '@testing-library/react';
6
+ import { ClientDataManager } from '../ClientDataManager';
7
+ import { DataSourceProvider } from '../DataSourceProvider';
8
+ import { jsx as _jsx } from "react/jsx-runtime";
9
+ describe('subscriptions', function () {
10
+ var dataManager;
11
+ beforeEach(function () {
12
+ dataManager = new ClientDataManager({
13
+ defaultOptions: {
14
+ queries: {
15
+ retry: false
16
+ },
17
+ mutations: {
18
+ retry: false
19
+ }
20
+ },
21
+ normalizerConfig: {
22
+ devLogging: false
23
+ }
24
+ });
25
+ });
26
+ afterEach(function () {
27
+ var _dataManager$queryNor;
28
+ (_dataManager$queryNor = dataManager.queryNormalizer) === null || _dataManager$queryNor === void 0 || _dataManager$queryNor.unsubscribe();
29
+ dataManager.queryClient.clear();
30
+ });
31
+ describe('QueryCache subscription', function () {
32
+ it('should add query to normalizer when added to QueryCache', /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee2() {
33
+ var normalized;
34
+ return _regeneratorRuntime().wrap(function _callee2$(_context2) {
35
+ while (1) switch (_context2.prev = _context2.next) {
36
+ case 0:
37
+ expect(dataManager.queryNormalizer).toBeDefined();
38
+ dataManager.queryNormalizer.subscribe();
39
+
40
+ // Add query with normalize: true option
41
+ _context2.next = 4;
42
+ return dataManager.queryClient.fetchQuery({
43
+ queryKey: ['users'],
44
+ queryFn: function () {
45
+ var _queryFn = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
46
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
47
+ while (1) switch (_context.prev = _context.next) {
48
+ case 0:
49
+ return _context.abrupt("return", [{
50
+ id: '1',
51
+ name: 'User 1'
52
+ }]);
53
+ case 1:
54
+ case "end":
55
+ return _context.stop();
56
+ }
57
+ }, _callee);
58
+ }));
59
+ function queryFn() {
60
+ return _queryFn.apply(this, arguments);
61
+ }
62
+ return queryFn;
63
+ }(),
64
+ normalize: true
65
+ });
66
+ case 4:
67
+ normalized = dataManager.queryNormalizer.getNormalizedData();
68
+ expect(normalized.objects['@@1']).toBeDefined();
69
+ case 6:
70
+ case "end":
71
+ return _context2.stop();
72
+ }
73
+ }, _callee2);
74
+ })));
75
+ it('should update query in normalizer on update', /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee5() {
76
+ var queryKey, normalizedBefore, objectCountBefore, normalizedAfter;
77
+ return _regeneratorRuntime().wrap(function _callee5$(_context5) {
78
+ while (1) switch (_context5.prev = _context5.next) {
79
+ case 0:
80
+ expect(dataManager.queryNormalizer).toBeDefined();
81
+ dataManager.queryNormalizer.subscribe();
82
+ queryKey = ['users']; // Initial data with normalize: true
83
+ _context5.next = 5;
84
+ return dataManager.queryClient.fetchQuery({
85
+ queryKey: queryKey,
86
+ queryFn: function () {
87
+ var _queryFn2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee3() {
88
+ return _regeneratorRuntime().wrap(function _callee3$(_context3) {
89
+ while (1) switch (_context3.prev = _context3.next) {
90
+ case 0:
91
+ return _context3.abrupt("return", [{
92
+ id: '1',
93
+ name: 'Old'
94
+ }]);
95
+ case 1:
96
+ case "end":
97
+ return _context3.stop();
98
+ }
99
+ }, _callee3);
100
+ }));
101
+ function queryFn() {
102
+ return _queryFn2.apply(this, arguments);
103
+ }
104
+ return queryFn;
105
+ }(),
106
+ normalize: true
107
+ });
108
+ case 5:
109
+ normalizedBefore = dataManager.queryNormalizer.getNormalizedData();
110
+ objectCountBefore = Object.keys(normalizedBefore.objects).length; // Update data
111
+ _context5.next = 9;
112
+ return dataManager.queryClient.fetchQuery({
113
+ queryKey: queryKey,
114
+ queryFn: function () {
115
+ var _queryFn3 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee4() {
116
+ return _regeneratorRuntime().wrap(function _callee4$(_context4) {
117
+ while (1) switch (_context4.prev = _context4.next) {
118
+ case 0:
119
+ return _context4.abrupt("return", [{
120
+ id: '1',
121
+ name: 'New'
122
+ }]);
123
+ case 1:
124
+ case "end":
125
+ return _context4.stop();
126
+ }
127
+ }, _callee4);
128
+ }));
129
+ function queryFn() {
130
+ return _queryFn3.apply(this, arguments);
131
+ }
132
+ return queryFn;
133
+ }(),
134
+ normalize: true
135
+ });
136
+ case 9:
137
+ // Verify that normalized data was updated
138
+ normalizedAfter = dataManager.queryNormalizer.getNormalizedData();
139
+ expect(Object.keys(normalizedAfter.objects).length).toBe(objectCountBefore);
140
+ expect(normalizedAfter.queries[JSON.stringify(queryKey)]).toBeDefined();
141
+ case 12:
142
+ case "end":
143
+ return _context5.stop();
144
+ }
145
+ }, _callee5);
146
+ })));
147
+ it('should remove query from normalizer when removed from QueryCache', /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee7() {
148
+ var queryKey, normalized;
149
+ return _regeneratorRuntime().wrap(function _callee7$(_context7) {
150
+ while (1) switch (_context7.prev = _context7.next) {
151
+ case 0:
152
+ expect(dataManager.queryNormalizer).toBeDefined();
153
+ dataManager.queryNormalizer.subscribe();
154
+ queryKey = ['users']; // Add query
155
+ _context7.next = 5;
156
+ return dataManager.queryClient.fetchQuery({
157
+ queryKey: queryKey,
158
+ queryFn: function () {
159
+ var _queryFn4 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee6() {
160
+ return _regeneratorRuntime().wrap(function _callee6$(_context6) {
161
+ while (1) switch (_context6.prev = _context6.next) {
162
+ case 0:
163
+ return _context6.abrupt("return", [{
164
+ id: '1',
165
+ name: 'User 1'
166
+ }]);
167
+ case 1:
168
+ case "end":
169
+ return _context6.stop();
170
+ }
171
+ }, _callee6);
172
+ }));
173
+ function queryFn() {
174
+ return _queryFn4.apply(this, arguments);
175
+ }
176
+ return queryFn;
177
+ }(),
178
+ normalize: true
179
+ });
180
+ case 5:
181
+ // Remove query
182
+ dataManager.queryClient.removeQueries({
183
+ queryKey: queryKey
184
+ });
185
+
186
+ // Give time to process event
187
+ _context7.next = 8;
188
+ return new Promise(function (resolve) {
189
+ return setTimeout(resolve, 10);
190
+ });
191
+ case 8:
192
+ normalized = dataManager.queryNormalizer.getNormalizedData(); // Query should be removed from queries
193
+ expect(normalized.queries[JSON.stringify(queryKey)]).toBeUndefined();
194
+ case 10:
195
+ case "end":
196
+ return _context7.stop();
197
+ }
198
+ }, _callee7);
199
+ })));
200
+ it('should support meta configuration for queries', /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee8() {
201
+ var normalized;
202
+ return _regeneratorRuntime().wrap(function _callee8$(_context8) {
203
+ while (1) switch (_context8.prev = _context8.next) {
204
+ case 0:
205
+ expect(dataManager.queryNormalizer).toBeDefined();
206
+ dataManager.queryNormalizer.subscribe();
207
+
208
+ // Check that we can use meta for configuration
209
+ // Real check for disabling via meta is already tested in integration tests
210
+ normalized = dataManager.queryNormalizer.getNormalizedData();
211
+ expect(normalized).toBeDefined();
212
+ expect(normalized.objects).toBeDefined();
213
+ expect(normalized.queries).toBeDefined();
214
+ case 6:
215
+ case "end":
216
+ return _context8.stop();
217
+ }
218
+ }, _callee8);
219
+ })));
220
+ it('should unsubscribe correctly', /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee10() {
221
+ var normalized;
222
+ return _regeneratorRuntime().wrap(function _callee10$(_context10) {
223
+ while (1) switch (_context10.prev = _context10.next) {
224
+ case 0:
225
+ expect(dataManager.queryNormalizer).toBeDefined();
226
+ dataManager.queryNormalizer.subscribe();
227
+ dataManager.queryNormalizer.unsubscribe();
228
+
229
+ // After unsubscribing, adding query should not affect normalizer
230
+ _context10.next = 5;
231
+ return dataManager.queryClient.fetchQuery({
232
+ queryKey: ['users'],
233
+ queryFn: function () {
234
+ var _queryFn5 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee9() {
235
+ return _regeneratorRuntime().wrap(function _callee9$(_context9) {
236
+ while (1) switch (_context9.prev = _context9.next) {
237
+ case 0:
238
+ return _context9.abrupt("return", [{
239
+ id: '1',
240
+ name: 'User 1'
241
+ }]);
242
+ case 1:
243
+ case "end":
244
+ return _context9.stop();
245
+ }
246
+ }, _callee9);
247
+ }));
248
+ function queryFn() {
249
+ return _queryFn5.apply(this, arguments);
250
+ }
251
+ return queryFn;
252
+ }(),
253
+ normalize: true
254
+ });
255
+ case 5:
256
+ normalized = dataManager.queryNormalizer.getNormalizedData();
257
+ expect(Object.keys(normalized.objects)).toHaveLength(0);
258
+ case 7:
259
+ case "end":
260
+ return _context10.stop();
261
+ }
262
+ }, _callee10);
263
+ })));
264
+ it('should allow multiple unsubscribe calls', function () {
265
+ expect(dataManager.queryNormalizer).toBeDefined();
266
+ dataManager.queryNormalizer.subscribe();
267
+ dataManager.queryNormalizer.unsubscribe();
268
+
269
+ // Repeated call should not throw error
270
+ expect(function () {
271
+ return dataManager.queryNormalizer.unsubscribe();
272
+ }).not.toThrow();
273
+ });
274
+ });
275
+ describe('MutationCache subscription', function () {
276
+ var dataManagerWithOptimistic;
277
+ beforeEach(function () {
278
+ dataManagerWithOptimistic = new ClientDataManager({
279
+ defaultOptions: {
280
+ queries: {
281
+ retry: false
282
+ },
283
+ mutations: {
284
+ retry: false
285
+ }
286
+ },
287
+ normalizerConfig: {
288
+ devLogging: false,
289
+ optimistic: {
290
+ autoCalculateRollback: true
291
+ }
292
+ }
293
+ });
294
+ });
295
+ afterEach(function () {
296
+ var _dataManagerWithOptim;
297
+ (_dataManagerWithOptim = dataManagerWithOptimistic.queryNormalizer) === null || _dataManagerWithOptim === void 0 || _dataManagerWithOptim.unsubscribe();
298
+ dataManagerWithOptimistic.queryClient.clear();
299
+ });
300
+ it('should update queries on successful mutation', /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee13() {
301
+ var queryKey, wrapper, _renderHook, mutationResult, data;
302
+ return _regeneratorRuntime().wrap(function _callee13$(_context13) {
303
+ while (1) switch (_context13.prev = _context13.next) {
304
+ case 0:
305
+ expect(dataManagerWithOptimistic.queryNormalizer).toBeDefined();
306
+ dataManagerWithOptimistic.queryNormalizer.subscribe();
307
+ queryKey = ['users']; // Initial data
308
+ _context13.next = 5;
309
+ return dataManagerWithOptimistic.queryClient.fetchQuery({
310
+ queryKey: queryKey,
311
+ queryFn: function () {
312
+ var _queryFn6 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee11() {
313
+ return _regeneratorRuntime().wrap(function _callee11$(_context11) {
314
+ while (1) switch (_context11.prev = _context11.next) {
315
+ case 0:
316
+ return _context11.abrupt("return", [{
317
+ id: '1',
318
+ name: 'Old'
319
+ }]);
320
+ case 1:
321
+ case "end":
322
+ return _context11.stop();
323
+ }
324
+ }, _callee11);
325
+ }));
326
+ function queryFn() {
327
+ return _queryFn6.apply(this, arguments);
328
+ }
329
+ return queryFn;
330
+ }(),
331
+ normalize: true
332
+ });
333
+ case 5:
334
+ // Create wrapper for hooks
335
+ wrapper = function wrapper(_ref7) {
336
+ var children = _ref7.children;
337
+ return /*#__PURE__*/_jsx(DataSourceProvider, {
338
+ dataManager: dataManagerWithOptimistic,
339
+ children: children
340
+ });
341
+ }; // Mutation via useMutation
342
+ _renderHook = renderHook(function () {
343
+ return useMutation({
344
+ mutationFn: function () {
345
+ var _mutationFn = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee12() {
346
+ return _regeneratorRuntime().wrap(function _callee12$(_context12) {
347
+ while (1) switch (_context12.prev = _context12.next) {
348
+ case 0:
349
+ return _context12.abrupt("return", {
350
+ id: '1',
351
+ name: 'New'
352
+ });
353
+ case 1:
354
+ case "end":
355
+ return _context12.stop();
356
+ }
357
+ }, _callee12);
358
+ }));
359
+ function mutationFn() {
360
+ return _mutationFn.apply(this, arguments);
361
+ }
362
+ return mutationFn;
363
+ }(),
364
+ normalize: true,
365
+ optimistic: true
366
+ });
367
+ }, {
368
+ wrapper: wrapper
369
+ }), mutationResult = _renderHook.result;
370
+ mutationResult.current.mutate(undefined);
371
+ _context13.next = 10;
372
+ return waitFor(function () {
373
+ return expect(mutationResult.current.isSuccess).toBe(true);
374
+ });
375
+ case 10:
376
+ data = dataManagerWithOptimistic.queryClient.getQueryData(queryKey);
377
+ expect(data[0].name).toBe('New');
378
+ case 12:
379
+ case "end":
380
+ return _context13.stop();
381
+ }
382
+ }, _callee13);
383
+ })));
384
+ it('should apply optimistic updates', /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee16() {
385
+ var queryKey, wrapper, _renderHook2, mutationResult, dataFinal;
386
+ return _regeneratorRuntime().wrap(function _callee16$(_context16) {
387
+ while (1) switch (_context16.prev = _context16.next) {
388
+ case 0:
389
+ expect(dataManagerWithOptimistic.queryNormalizer).toBeDefined();
390
+ dataManagerWithOptimistic.queryNormalizer.subscribe();
391
+ queryKey = ['users']; // Initial data
392
+ _context16.next = 5;
393
+ return dataManagerWithOptimistic.queryClient.fetchQuery({
394
+ queryKey: queryKey,
395
+ queryFn: function () {
396
+ var _queryFn7 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee14() {
397
+ return _regeneratorRuntime().wrap(function _callee14$(_context14) {
398
+ while (1) switch (_context14.prev = _context14.next) {
399
+ case 0:
400
+ return _context14.abrupt("return", [{
401
+ id: '1',
402
+ name: 'Original'
403
+ }]);
404
+ case 1:
405
+ case "end":
406
+ return _context14.stop();
407
+ }
408
+ }, _callee14);
409
+ }));
410
+ function queryFn() {
411
+ return _queryFn7.apply(this, arguments);
412
+ }
413
+ return queryFn;
414
+ }(),
415
+ normalize: true
416
+ });
417
+ case 5:
418
+ wrapper = function wrapper(_ref9) {
419
+ var children = _ref9.children;
420
+ return /*#__PURE__*/_jsx(DataSourceProvider, {
421
+ dataManager: dataManagerWithOptimistic,
422
+ children: children
423
+ });
424
+ }; // Mutation with optimistic data
425
+ _renderHook2 = renderHook(function () {
426
+ return useMutation({
427
+ mutationFn: function () {
428
+ var _mutationFn2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee15() {
429
+ return _regeneratorRuntime().wrap(function _callee15$(_context15) {
430
+ while (1) switch (_context15.prev = _context15.next) {
431
+ case 0:
432
+ _context15.next = 2;
433
+ return new Promise(function (resolve) {
434
+ return setTimeout(resolve, 50);
435
+ });
436
+ case 2:
437
+ return _context15.abrupt("return", {
438
+ id: '1',
439
+ name: 'Final'
440
+ });
441
+ case 3:
442
+ case "end":
443
+ return _context15.stop();
444
+ }
445
+ }, _callee15);
446
+ }));
447
+ function mutationFn() {
448
+ return _mutationFn2.apply(this, arguments);
449
+ }
450
+ return mutationFn;
451
+ }(),
452
+ onMutate: function onMutate() {
453
+ return {
454
+ optimisticData: {
455
+ id: '1',
456
+ name: 'Optimistic'
457
+ }
458
+ };
459
+ },
460
+ normalize: true,
461
+ optimistic: true
462
+ });
463
+ }, {
464
+ wrapper: wrapper
465
+ }), mutationResult = _renderHook2.result;
466
+ mutationResult.current.mutate(undefined);
467
+
468
+ // Check optimistic data
469
+ _context16.next = 10;
470
+ return waitFor(function () {
471
+ var data = dataManagerWithOptimistic.queryClient.getQueryData(queryKey);
472
+ expect(data[0].name).toBe('Optimistic');
473
+ });
474
+ case 10:
475
+ _context16.next = 12;
476
+ return waitFor(function () {
477
+ return expect(mutationResult.current.isSuccess).toBe(true);
478
+ });
479
+ case 12:
480
+ dataFinal = dataManagerWithOptimistic.queryClient.getQueryData(queryKey);
481
+ expect(dataFinal[0].name).toBe('Final');
482
+ case 14:
483
+ case "end":
484
+ return _context16.stop();
485
+ }
486
+ }, _callee16);
487
+ })));
488
+ it('should automatically calculate rollbackData', /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee19() {
489
+ var queryKey, wrapper, _renderHook3, mutationResult, data;
490
+ return _regeneratorRuntime().wrap(function _callee19$(_context19) {
491
+ while (1) switch (_context19.prev = _context19.next) {
492
+ case 0:
493
+ expect(dataManagerWithOptimistic.queryNormalizer).toBeDefined();
494
+ dataManagerWithOptimistic.queryNormalizer.subscribe();
495
+ queryKey = ['users']; // Initial data
496
+ _context19.next = 5;
497
+ return dataManagerWithOptimistic.queryClient.fetchQuery({
498
+ queryKey: queryKey,
499
+ queryFn: function () {
500
+ var _queryFn8 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee17() {
501
+ return _regeneratorRuntime().wrap(function _callee17$(_context17) {
502
+ while (1) switch (_context17.prev = _context17.next) {
503
+ case 0:
504
+ return _context17.abrupt("return", [{
505
+ id: '1',
506
+ name: 'Original'
507
+ }]);
508
+ case 1:
509
+ case "end":
510
+ return _context17.stop();
511
+ }
512
+ }, _callee17);
513
+ }));
514
+ function queryFn() {
515
+ return _queryFn8.apply(this, arguments);
516
+ }
517
+ return queryFn;
518
+ }(),
519
+ normalize: true
520
+ });
521
+ case 5:
522
+ wrapper = function wrapper(_ref11) {
523
+ var children = _ref11.children;
524
+ return /*#__PURE__*/_jsx(DataSourceProvider, {
525
+ dataManager: dataManagerWithOptimistic,
526
+ children: children
527
+ });
528
+ }; // Mutation with optimistic data that will fail
529
+ _renderHook3 = renderHook(function () {
530
+ return useMutation({
531
+ mutationFn: function () {
532
+ var _mutationFn3 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee18() {
533
+ return _regeneratorRuntime().wrap(function _callee18$(_context18) {
534
+ while (1) switch (_context18.prev = _context18.next) {
535
+ case 0:
536
+ _context18.next = 2;
537
+ return new Promise(function (resolve) {
538
+ return setTimeout(resolve, 50);
539
+ });
540
+ case 2:
541
+ throw new Error('Mutation failed');
542
+ case 3:
543
+ case "end":
544
+ return _context18.stop();
545
+ }
546
+ }, _callee18);
547
+ }));
548
+ function mutationFn() {
549
+ return _mutationFn3.apply(this, arguments);
550
+ }
551
+ return mutationFn;
552
+ }(),
553
+ onMutate: function onMutate() {
554
+ return {
555
+ optimisticData: {
556
+ id: '1',
557
+ name: 'Optimistic'
558
+ }
559
+ };
560
+ },
561
+ normalize: true,
562
+ optimistic: true
563
+ });
564
+ }, {
565
+ wrapper: wrapper
566
+ }), mutationResult = _renderHook3.result;
567
+ mutationResult.current.mutate(undefined);
568
+ _context19.next = 10;
569
+ return waitFor(function () {
570
+ return expect(mutationResult.current.isError).toBe(true);
571
+ });
572
+ case 10:
573
+ // Data should be rolled back to original
574
+ data = dataManagerWithOptimistic.queryClient.getQueryData(queryKey);
575
+ expect(data[0].name).toBe('Original');
576
+ case 12:
577
+ case "end":
578
+ return _context19.stop();
579
+ }
580
+ }, _callee19);
581
+ })));
582
+ it('should rollback changes on mutation error', /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee22() {
583
+ var queryKey, wrapper, _renderHook4, mutationResult, data;
584
+ return _regeneratorRuntime().wrap(function _callee22$(_context22) {
585
+ while (1) switch (_context22.prev = _context22.next) {
586
+ case 0:
587
+ expect(dataManagerWithOptimistic.queryNormalizer).toBeDefined();
588
+ dataManagerWithOptimistic.queryNormalizer.subscribe();
589
+ queryKey = ['users']; // Initial data
590
+ _context22.next = 5;
591
+ return dataManagerWithOptimistic.queryClient.fetchQuery({
592
+ queryKey: queryKey,
593
+ queryFn: function () {
594
+ var _queryFn9 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee20() {
595
+ return _regeneratorRuntime().wrap(function _callee20$(_context20) {
596
+ while (1) switch (_context20.prev = _context20.next) {
597
+ case 0:
598
+ return _context20.abrupt("return", [{
599
+ id: '1',
600
+ name: 'Original'
601
+ }]);
602
+ case 1:
603
+ case "end":
604
+ return _context20.stop();
605
+ }
606
+ }, _callee20);
607
+ }));
608
+ function queryFn() {
609
+ return _queryFn9.apply(this, arguments);
610
+ }
611
+ return queryFn;
612
+ }(),
613
+ normalize: true
614
+ });
615
+ case 5:
616
+ wrapper = function wrapper(_ref13) {
617
+ var children = _ref13.children;
618
+ return /*#__PURE__*/_jsx(DataSourceProvider, {
619
+ dataManager: dataManagerWithOptimistic,
620
+ children: children
621
+ });
622
+ }; // Mutation with error
623
+ _renderHook4 = renderHook(function () {
624
+ return useMutation({
625
+ mutationFn: function () {
626
+ var _mutationFn4 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee21() {
627
+ return _regeneratorRuntime().wrap(function _callee21$(_context21) {
628
+ while (1) switch (_context21.prev = _context21.next) {
629
+ case 0:
630
+ _context21.next = 2;
631
+ return new Promise(function (resolve) {
632
+ return setTimeout(resolve, 50);
633
+ });
634
+ case 2:
635
+ throw new Error('Failed');
636
+ case 3:
637
+ case "end":
638
+ return _context21.stop();
639
+ }
640
+ }, _callee21);
641
+ }));
642
+ function mutationFn() {
643
+ return _mutationFn4.apply(this, arguments);
644
+ }
645
+ return mutationFn;
646
+ }(),
647
+ onMutate: function onMutate() {
648
+ return {
649
+ optimisticData: {
650
+ id: '1',
651
+ name: 'Optimistic'
652
+ }
653
+ };
654
+ },
655
+ normalize: true,
656
+ optimistic: true
657
+ });
658
+ }, {
659
+ wrapper: wrapper
660
+ }), mutationResult = _renderHook4.result;
661
+ mutationResult.current.mutate(undefined);
662
+ _context22.next = 10;
663
+ return waitFor(function () {
664
+ return expect(mutationResult.current.isError).toBe(true);
665
+ });
666
+ case 10:
667
+ data = dataManagerWithOptimistic.queryClient.getQueryData(queryKey);
668
+ expect(data[0].name).toBe('Original');
669
+ case 12:
670
+ case "end":
671
+ return _context22.stop();
672
+ }
673
+ }, _callee22);
674
+ })));
675
+ it('should ignore mutations with normalize: false', /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee24() {
676
+ var dmNoNormalize, queryKey, wrapper, _renderHook5, mutationResult, data;
677
+ return _regeneratorRuntime().wrap(function _callee24$(_context24) {
678
+ while (1) switch (_context24.prev = _context24.next) {
679
+ case 0:
680
+ dmNoNormalize = new ClientDataManager({
681
+ defaultOptions: {
682
+ queries: {
683
+ retry: false
684
+ },
685
+ mutations: {
686
+ retry: false
687
+ }
688
+ },
689
+ normalizerConfig: {
690
+ devLogging: false
691
+ }
692
+ });
693
+ expect(dmNoNormalize.queryNormalizer).toBeDefined();
694
+ queryKey = ['users'];
695
+ dmNoNormalize.queryClient.setQueryData(queryKey, [{
696
+ id: '1',
697
+ name: 'Original'
698
+ }]);
699
+ wrapper = function wrapper(_ref15) {
700
+ var children = _ref15.children;
701
+ return /*#__PURE__*/_jsx(DataSourceProvider, {
702
+ dataManager: dmNoNormalize,
703
+ children: children
704
+ });
705
+ }; // Mutation should not update data automatically (no normalize option)
706
+ _renderHook5 = renderHook(function () {
707
+ return useMutation({
708
+ mutationFn: function () {
709
+ var _mutationFn5 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee23() {
710
+ return _regeneratorRuntime().wrap(function _callee23$(_context23) {
711
+ while (1) switch (_context23.prev = _context23.next) {
712
+ case 0:
713
+ return _context23.abrupt("return", {
714
+ id: '1',
715
+ name: 'New'
716
+ });
717
+ case 1:
718
+ case "end":
719
+ return _context23.stop();
720
+ }
721
+ }, _callee23);
722
+ }));
723
+ function mutationFn() {
724
+ return _mutationFn5.apply(this, arguments);
725
+ }
726
+ return mutationFn;
727
+ }()
728
+ });
729
+ }, {
730
+ wrapper: wrapper
731
+ }), mutationResult = _renderHook5.result;
732
+ mutationResult.current.mutate(undefined);
733
+ _context24.next = 9;
734
+ return waitFor(function () {
735
+ return expect(mutationResult.current.isSuccess).toBe(true);
736
+ });
737
+ case 9:
738
+ data = dmNoNormalize.queryClient.getQueryData(queryKey);
739
+ expect(data[0].name).toBe('Original'); // Not changed
740
+ case 11:
741
+ case "end":
742
+ return _context24.stop();
743
+ }
744
+ }, _callee24);
745
+ })));
746
+ it('should support devLogging for optimistic updates', /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee27() {
747
+ var dmWithLogging, consoleSpy, queryKey, wrapper, _renderHook6, mutationResult;
748
+ return _regeneratorRuntime().wrap(function _callee27$(_context27) {
749
+ while (1) switch (_context27.prev = _context27.next) {
750
+ case 0:
751
+ dmWithLogging = new ClientDataManager({
752
+ defaultOptions: {
753
+ queries: {
754
+ retry: false
755
+ },
756
+ mutations: {
757
+ retry: false
758
+ }
759
+ },
760
+ normalizerConfig: {
761
+ devLogging: false,
762
+ optimistic: {
763
+ autoCalculateRollback: true,
764
+ devLogging: true
765
+ }
766
+ }
767
+ });
768
+ expect(dmWithLogging.queryNormalizer).toBeDefined();
769
+ consoleSpy = jest.spyOn(console, 'log').mockImplementation();
770
+ dmWithLogging.queryNormalizer.subscribe();
771
+ queryKey = ['users'];
772
+ _context27.next = 7;
773
+ return dmWithLogging.queryClient.fetchQuery({
774
+ queryKey: queryKey,
775
+ queryFn: function () {
776
+ var _queryFn10 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee25() {
777
+ return _regeneratorRuntime().wrap(function _callee25$(_context25) {
778
+ while (1) switch (_context25.prev = _context25.next) {
779
+ case 0:
780
+ return _context25.abrupt("return", [{
781
+ id: '1',
782
+ name: 'Original'
783
+ }]);
784
+ case 1:
785
+ case "end":
786
+ return _context25.stop();
787
+ }
788
+ }, _callee25);
789
+ }));
790
+ function queryFn() {
791
+ return _queryFn10.apply(this, arguments);
792
+ }
793
+ return queryFn;
794
+ }(),
795
+ normalize: true
796
+ });
797
+ case 7:
798
+ wrapper = function wrapper(_ref17) {
799
+ var children = _ref17.children;
800
+ return /*#__PURE__*/_jsx(DataSourceProvider, {
801
+ dataManager: dmWithLogging,
802
+ children: children
803
+ });
804
+ };
805
+ _renderHook6 = renderHook(function () {
806
+ return useMutation({
807
+ mutationFn: function () {
808
+ var _mutationFn6 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee26() {
809
+ return _regeneratorRuntime().wrap(function _callee26$(_context26) {
810
+ while (1) switch (_context26.prev = _context26.next) {
811
+ case 0:
812
+ _context26.next = 2;
813
+ return new Promise(function (resolve) {
814
+ return setTimeout(resolve, 50);
815
+ });
816
+ case 2:
817
+ throw new Error('Failed');
818
+ case 3:
819
+ case "end":
820
+ return _context26.stop();
821
+ }
822
+ }, _callee26);
823
+ }));
824
+ function mutationFn() {
825
+ return _mutationFn6.apply(this, arguments);
826
+ }
827
+ return mutationFn;
828
+ }(),
829
+ onMutate: function onMutate() {
830
+ return {
831
+ optimisticData: {
832
+ id: '1',
833
+ name: 'Optimistic'
834
+ }
835
+ };
836
+ },
837
+ normalize: true,
838
+ optimistic: true
839
+ });
840
+ }, {
841
+ wrapper: wrapper
842
+ }), mutationResult = _renderHook6.result;
843
+ mutationResult.current.mutate(undefined);
844
+ _context27.next = 12;
845
+ return waitFor(function () {
846
+ return expect(mutationResult.current.isError).toBe(true);
847
+ });
848
+ case 12:
849
+ // Verify that logging was called
850
+ expect(consoleSpy).toHaveBeenCalledWith('[OptimisticUpdate] Auto-calculated rollbackData:', expect.any(Object));
851
+ expect(consoleSpy).toHaveBeenCalledWith('[OptimisticUpdate] Rolling back changes');
852
+ consoleSpy.mockRestore();
853
+ case 15:
854
+ case "end":
855
+ return _context27.stop();
856
+ }
857
+ }, _callee27);
858
+ })));
859
+ it('should support manual rollbackData', /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee30() {
860
+ var dmNoAutoRollback, queryKey, wrapper, _renderHook7, mutationResult, data;
861
+ return _regeneratorRuntime().wrap(function _callee30$(_context30) {
862
+ while (1) switch (_context30.prev = _context30.next) {
863
+ case 0:
864
+ dmNoAutoRollback = new ClientDataManager({
865
+ defaultOptions: {
866
+ queries: {
867
+ retry: false
868
+ },
869
+ mutations: {
870
+ retry: false
871
+ }
872
+ },
873
+ normalizerConfig: {
874
+ devLogging: false,
875
+ optimistic: {
876
+ autoCalculateRollback: false
877
+ }
878
+ }
879
+ });
880
+ expect(dmNoAutoRollback.queryNormalizer).toBeDefined();
881
+ dmNoAutoRollback.queryNormalizer.subscribe();
882
+ queryKey = ['users'];
883
+ _context30.next = 6;
884
+ return dmNoAutoRollback.queryClient.fetchQuery({
885
+ queryKey: queryKey,
886
+ queryFn: function () {
887
+ var _queryFn11 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee28() {
888
+ return _regeneratorRuntime().wrap(function _callee28$(_context28) {
889
+ while (1) switch (_context28.prev = _context28.next) {
890
+ case 0:
891
+ return _context28.abrupt("return", [{
892
+ id: '1',
893
+ name: 'Original'
894
+ }]);
895
+ case 1:
896
+ case "end":
897
+ return _context28.stop();
898
+ }
899
+ }, _callee28);
900
+ }));
901
+ function queryFn() {
902
+ return _queryFn11.apply(this, arguments);
903
+ }
904
+ return queryFn;
905
+ }(),
906
+ normalize: true
907
+ });
908
+ case 6:
909
+ wrapper = function wrapper(_ref19) {
910
+ var children = _ref19.children;
911
+ return /*#__PURE__*/_jsx(DataSourceProvider, {
912
+ dataManager: dmNoAutoRollback,
913
+ children: children
914
+ });
915
+ };
916
+ _renderHook7 = renderHook(function () {
917
+ return useMutation({
918
+ mutationFn: function () {
919
+ var _mutationFn7 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee29() {
920
+ return _regeneratorRuntime().wrap(function _callee29$(_context29) {
921
+ while (1) switch (_context29.prev = _context29.next) {
922
+ case 0:
923
+ _context29.next = 2;
924
+ return new Promise(function (resolve) {
925
+ return setTimeout(resolve, 50);
926
+ });
927
+ case 2:
928
+ throw new Error('Failed');
929
+ case 3:
930
+ case "end":
931
+ return _context29.stop();
932
+ }
933
+ }, _callee29);
934
+ }));
935
+ function mutationFn() {
936
+ return _mutationFn7.apply(this, arguments);
937
+ }
938
+ return mutationFn;
939
+ }(),
940
+ onMutate: function onMutate() {
941
+ return {
942
+ optimisticData: {
943
+ id: '1',
944
+ name: 'Optimistic'
945
+ },
946
+ rollbackData: {
947
+ id: '1',
948
+ name: 'Manual Rollback'
949
+ }
950
+ };
951
+ },
952
+ normalize: true,
953
+ optimistic: true
954
+ });
955
+ }, {
956
+ wrapper: wrapper
957
+ }), mutationResult = _renderHook7.result;
958
+ mutationResult.current.mutate(undefined);
959
+ _context30.next = 11;
960
+ return waitFor(function () {
961
+ return expect(mutationResult.current.isError).toBe(true);
962
+ });
963
+ case 11:
964
+ data = dmNoAutoRollback.queryClient.getQueryData(queryKey);
965
+ expect(data[0].name).toBe('Manual Rollback');
966
+ dmNoAutoRollback.queryNormalizer.unsubscribe();
967
+ dmNoAutoRollback.queryClient.clear();
968
+ case 15:
969
+ case "end":
970
+ return _context30.stop();
971
+ }
972
+ }, _callee30);
973
+ })));
974
+ it('should invalidate queries when invalidate option is enabled', /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee33() {
975
+ var dmWithInvalidate, queryKey, invalidateSpy, wrapper, _renderHook8, mutationResult;
976
+ return _regeneratorRuntime().wrap(function _callee33$(_context33) {
977
+ while (1) switch (_context33.prev = _context33.next) {
978
+ case 0:
979
+ dmWithInvalidate = new ClientDataManager({
980
+ defaultOptions: {
981
+ queries: {
982
+ retry: false
983
+ },
984
+ mutations: {
985
+ retry: false
986
+ }
987
+ },
988
+ normalizerConfig: {
989
+ devLogging: false,
990
+ invalidate: true
991
+ }
992
+ });
993
+ expect(dmWithInvalidate.queryNormalizer).toBeDefined();
994
+ dmWithInvalidate.queryNormalizer.subscribe();
995
+ queryKey = ['users']; // Initial data
996
+ _context33.next = 6;
997
+ return dmWithInvalidate.queryClient.fetchQuery({
998
+ queryKey: queryKey,
999
+ queryFn: function () {
1000
+ var _queryFn12 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee31() {
1001
+ return _regeneratorRuntime().wrap(function _callee31$(_context31) {
1002
+ while (1) switch (_context31.prev = _context31.next) {
1003
+ case 0:
1004
+ return _context31.abrupt("return", [{
1005
+ id: '1',
1006
+ name: 'Original'
1007
+ }]);
1008
+ case 1:
1009
+ case "end":
1010
+ return _context31.stop();
1011
+ }
1012
+ }, _callee31);
1013
+ }));
1014
+ function queryFn() {
1015
+ return _queryFn12.apply(this, arguments);
1016
+ }
1017
+ return queryFn;
1018
+ }()
1019
+ });
1020
+ case 6:
1021
+ // Spy on invalidateQueries
1022
+ invalidateSpy = jest.spyOn(dmWithInvalidate.queryClient, 'invalidateQueries');
1023
+ wrapper = function wrapper(_ref21) {
1024
+ var children = _ref21.children;
1025
+ return /*#__PURE__*/_jsx(DataSourceProvider, {
1026
+ dataManager: dmWithInvalidate,
1027
+ children: children
1028
+ });
1029
+ };
1030
+ _renderHook8 = renderHook(function () {
1031
+ return useMutation({
1032
+ mutationFn: function () {
1033
+ var _mutationFn8 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee32() {
1034
+ return _regeneratorRuntime().wrap(function _callee32$(_context32) {
1035
+ while (1) switch (_context32.prev = _context32.next) {
1036
+ case 0:
1037
+ return _context32.abrupt("return", {
1038
+ id: '1',
1039
+ name: 'Updated'
1040
+ });
1041
+ case 1:
1042
+ case "end":
1043
+ return _context32.stop();
1044
+ }
1045
+ }, _callee32);
1046
+ }));
1047
+ function mutationFn() {
1048
+ return _mutationFn8.apply(this, arguments);
1049
+ }
1050
+ return mutationFn;
1051
+ }(),
1052
+ normalize: true
1053
+ });
1054
+ }, {
1055
+ wrapper: wrapper
1056
+ }), mutationResult = _renderHook8.result;
1057
+ mutationResult.current.mutate(undefined);
1058
+ _context33.next = 12;
1059
+ return waitFor(function () {
1060
+ return expect(mutationResult.current.isSuccess).toBe(true);
1061
+ });
1062
+ case 12:
1063
+ // Verify that invalidateQueries was called
1064
+ expect(invalidateSpy).toHaveBeenCalled();
1065
+ invalidateSpy.mockRestore();
1066
+ dmWithInvalidate.queryNormalizer.unsubscribe();
1067
+ dmWithInvalidate.queryClient.clear();
1068
+ case 16:
1069
+ case "end":
1070
+ return _context33.stop();
1071
+ }
1072
+ }, _callee33);
1073
+ })));
1074
+ it('should not invalidate queries when invalidate: false is set on mutation', /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee36() {
1075
+ var dmWithInvalidate, queryKey, invalidateSpy, wrapper, _renderHook9, mutationResult;
1076
+ return _regeneratorRuntime().wrap(function _callee36$(_context36) {
1077
+ while (1) switch (_context36.prev = _context36.next) {
1078
+ case 0:
1079
+ dmWithInvalidate = new ClientDataManager({
1080
+ defaultOptions: {
1081
+ queries: {
1082
+ retry: false
1083
+ },
1084
+ mutations: {
1085
+ retry: false
1086
+ }
1087
+ },
1088
+ normalizerConfig: {
1089
+ devLogging: false,
1090
+ invalidate: true // Globally enabled
1091
+ }
1092
+ });
1093
+ expect(dmWithInvalidate.queryNormalizer).toBeDefined();
1094
+ dmWithInvalidate.queryNormalizer.subscribe();
1095
+ queryKey = ['users'];
1096
+ _context36.next = 6;
1097
+ return dmWithInvalidate.queryClient.fetchQuery({
1098
+ queryKey: queryKey,
1099
+ queryFn: function () {
1100
+ var _queryFn13 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee34() {
1101
+ return _regeneratorRuntime().wrap(function _callee34$(_context34) {
1102
+ while (1) switch (_context34.prev = _context34.next) {
1103
+ case 0:
1104
+ return _context34.abrupt("return", [{
1105
+ id: '1',
1106
+ name: 'Original'
1107
+ }]);
1108
+ case 1:
1109
+ case "end":
1110
+ return _context34.stop();
1111
+ }
1112
+ }, _callee34);
1113
+ }));
1114
+ function queryFn() {
1115
+ return _queryFn13.apply(this, arguments);
1116
+ }
1117
+ return queryFn;
1118
+ }()
1119
+ });
1120
+ case 6:
1121
+ invalidateSpy = jest.spyOn(dmWithInvalidate.queryClient, 'invalidateQueries');
1122
+ wrapper = function wrapper(_ref23) {
1123
+ var children = _ref23.children;
1124
+ return /*#__PURE__*/_jsx(DataSourceProvider, {
1125
+ dataManager: dmWithInvalidate,
1126
+ children: children
1127
+ });
1128
+ };
1129
+ _renderHook9 = renderHook(function () {
1130
+ return useMutation({
1131
+ mutationFn: function () {
1132
+ var _mutationFn9 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee35() {
1133
+ return _regeneratorRuntime().wrap(function _callee35$(_context35) {
1134
+ while (1) switch (_context35.prev = _context35.next) {
1135
+ case 0:
1136
+ return _context35.abrupt("return", {
1137
+ id: '1',
1138
+ name: 'Updated'
1139
+ });
1140
+ case 1:
1141
+ case "end":
1142
+ return _context35.stop();
1143
+ }
1144
+ }, _callee35);
1145
+ }));
1146
+ function mutationFn() {
1147
+ return _mutationFn9.apply(this, arguments);
1148
+ }
1149
+ return mutationFn;
1150
+ }(),
1151
+ normalize: true,
1152
+ invalidate: false // Disable for this mutation
1153
+ });
1154
+ }, {
1155
+ wrapper: wrapper
1156
+ }), mutationResult = _renderHook9.result;
1157
+ mutationResult.current.mutate(undefined);
1158
+ _context36.next = 12;
1159
+ return waitFor(function () {
1160
+ return expect(mutationResult.current.isSuccess).toBe(true);
1161
+ });
1162
+ case 12:
1163
+ // Verify that invalidateQueries was NOT called
1164
+ expect(invalidateSpy).not.toHaveBeenCalled();
1165
+ invalidateSpy.mockRestore();
1166
+ dmWithInvalidate.queryNormalizer.unsubscribe();
1167
+ dmWithInvalidate.queryClient.clear();
1168
+ case 16:
1169
+ case "end":
1170
+ return _context36.stop();
1171
+ }
1172
+ }, _callee36);
1173
+ })));
1174
+ });
1175
+ });
1176
+ // #sourceMappingURL=subscriptions.test.js.map