@gravity-ui/data-source 0.8.0 → 0.8.2

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 (65) hide show
  1. package/build/cjs/react-query/ClientDataManager.d.ts +7 -3
  2. package/build/cjs/react-query/ClientDataManager.js +107 -29
  3. package/build/cjs/react-query/ClientDataManager.js.map +1 -1
  4. package/build/cjs/react-query/__tests__/threeLevelIntegration.test.js +145 -0
  5. package/build/cjs/react-query/__tests__/threeLevelIntegration.test.js.map +1 -1
  6. package/build/cjs/react-query/impl/infinite/hooks.js +1 -4
  7. package/build/cjs/react-query/impl/infinite/hooks.js.map +1 -1
  8. package/build/cjs/react-query/impl/infinite/utils.js +6 -1
  9. package/build/cjs/react-query/impl/infinite/utils.js.map +1 -1
  10. package/build/cjs/react-query/impl/plain/hooks.js +1 -4
  11. package/build/cjs/react-query/impl/plain/hooks.js.map +1 -1
  12. package/build/cjs/react-query/impl/plain/utils.js +6 -1
  13. package/build/cjs/react-query/impl/plain/utils.js.map +1 -1
  14. package/build/cjs/react-query/types/options.d.ts +0 -5
  15. package/build/cjs/react-query/types/options.js.map +1 -1
  16. package/build/cjs/react-query/types/query-meta.d.ts +12 -0
  17. package/build/cjs/react-query/utils/__tests__/checkMutationObjectsKeys.test.js +295 -0
  18. package/build/cjs/react-query/utils/__tests__/checkMutationObjectsKeys.test.js.map +1 -0
  19. package/build/cjs/react-query/utils/checkMutationObjectsKeys.d.ts +17 -0
  20. package/build/cjs/react-query/utils/checkMutationObjectsKeys.js +88 -0
  21. package/build/cjs/react-query/utils/checkMutationObjectsKeys.js.map +1 -0
  22. package/build/cjs/react-query/utils/parseQueryKey.d.ts +2 -0
  23. package/build/cjs/react-query/utils/parseQueryKey.js +10 -0
  24. package/build/cjs/react-query/utils/parseQueryKey.js.map +1 -0
  25. package/build/esm/react-query/ClientDataManager.d.ts +7 -3
  26. package/build/esm/react-query/ClientDataManager.js +107 -29
  27. package/build/esm/react-query/ClientDataManager.js.map +1 -1
  28. package/build/esm/react-query/__tests__/threeLevelIntegration.test.js +145 -0
  29. package/build/esm/react-query/__tests__/threeLevelIntegration.test.js.map +1 -1
  30. package/build/esm/react-query/impl/infinite/hooks.js +2 -5
  31. package/build/esm/react-query/impl/infinite/hooks.js.map +1 -1
  32. package/build/esm/react-query/impl/infinite/utils.js +6 -1
  33. package/build/esm/react-query/impl/infinite/utils.js.map +1 -1
  34. package/build/esm/react-query/impl/plain/hooks.js +2 -5
  35. package/build/esm/react-query/impl/plain/hooks.js.map +1 -1
  36. package/build/esm/react-query/impl/plain/utils.js +6 -1
  37. package/build/esm/react-query/impl/plain/utils.js.map +1 -1
  38. package/build/esm/react-query/types/options.d.ts +0 -5
  39. package/build/esm/react-query/types/options.js.map +1 -1
  40. package/build/esm/react-query/types/query-meta.d.ts +12 -0
  41. package/build/esm/react-query/utils/__tests__/checkMutationObjectsKeys.test.js +292 -0
  42. package/build/esm/react-query/utils/__tests__/checkMutationObjectsKeys.test.js.map +1 -0
  43. package/build/esm/react-query/utils/checkMutationObjectsKeys.d.ts +17 -0
  44. package/build/esm/react-query/utils/checkMutationObjectsKeys.js +81 -0
  45. package/build/esm/react-query/utils/checkMutationObjectsKeys.js.map +1 -0
  46. package/build/esm/react-query/utils/parseQueryKey.d.ts +2 -0
  47. package/build/esm/react-query/utils/parseQueryKey.js +4 -0
  48. package/build/esm/react-query/utils/parseQueryKey.js.map +1 -0
  49. package/package.json +1 -1
  50. package/build/cjs/react-query/hooks/__tests__/useQueryData.refetch.test.js +0 -195
  51. package/build/cjs/react-query/hooks/__tests__/useQueryData.refetch.test.js.map +0 -1
  52. package/build/cjs/react-query/utils/warn.d.ts +0 -1
  53. package/build/cjs/react-query/utils/warn.js +0 -15
  54. package/build/cjs/react-query/utils/warn.js.map +0 -1
  55. package/build/cjs/react-query/utils/warnDisabledRefetch.d.ts +0 -1
  56. package/build/cjs/react-query/utils/warnDisabledRefetch.js +0 -11
  57. package/build/cjs/react-query/utils/warnDisabledRefetch.js.map +0 -1
  58. package/build/esm/react-query/hooks/__tests__/useQueryData.refetch.test.js +0 -192
  59. package/build/esm/react-query/hooks/__tests__/useQueryData.refetch.test.js.map +0 -1
  60. package/build/esm/react-query/utils/warn.d.ts +0 -1
  61. package/build/esm/react-query/utils/warn.js +0 -9
  62. package/build/esm/react-query/utils/warn.js.map +0 -1
  63. package/build/esm/react-query/utils/warnDisabledRefetch.d.ts +0 -1
  64. package/build/esm/react-query/utils/warnDisabledRefetch.js +0 -5
  65. package/build/esm/react-query/utils/warnDisabledRefetch.js.map +0 -1
@@ -0,0 +1,292 @@
1
+ import _typeof from "@babel/runtime/helpers/typeof";
2
+ import { createNormalizer } from '@normy/core';
3
+ import { checkMutationObjectsKeys } from '../checkMutationObjectsKeys';
4
+ var createMockNormalizer = function createMockNormalizer(objects) {
5
+ var normalizer = createNormalizer({});
6
+
7
+ // Manually set normalized data for testing
8
+ Object.keys(objects).forEach(function (key) {
9
+ var id = key.replace('@@', '');
10
+ // Use object as-is, id is already included in objects[key]
11
+ normalizer.setQuery("test-".concat(id), objects[key]);
12
+ });
13
+ return normalizer;
14
+ };
15
+ describe('checkMutationObjectsKeys', function () {
16
+ describe('when mutation data has no normalizable objects', function () {
17
+ it('should return needsRefetch: false for primitive values', function () {
18
+ var normalizer = createMockNormalizer({});
19
+ var result = checkMutationObjectsKeys('string value', normalizer);
20
+ expect(result).toEqual({
21
+ needsRefetch: false,
22
+ details: []
23
+ });
24
+ });
25
+ it('should return needsRefetch: false for null', function () {
26
+ var normalizer = createMockNormalizer({});
27
+ var result = checkMutationObjectsKeys(null, normalizer);
28
+ expect(result).toEqual({
29
+ needsRefetch: false,
30
+ details: []
31
+ });
32
+ });
33
+ it('should return needsRefetch: false for empty array', function () {
34
+ var normalizer = createMockNormalizer({});
35
+ var result = checkMutationObjectsKeys([], normalizer);
36
+ expect(result).toEqual({
37
+ needsRefetch: false,
38
+ details: []
39
+ });
40
+ });
41
+ it('should return needsRefetch: false for object without id', function () {
42
+ var normalizer = createMockNormalizer({});
43
+ var result = checkMutationObjectsKeys({
44
+ name: 'test'
45
+ }, normalizer);
46
+ expect(result).toEqual({
47
+ needsRefetch: false,
48
+ details: []
49
+ });
50
+ });
51
+ });
52
+ describe('when mutation object is not in normalized store', function () {
53
+ it('should return needsRefetch: false for new object', function () {
54
+ var normalizer = createMockNormalizer({});
55
+ var result = checkMutationObjectsKeys({
56
+ id: 'new-id',
57
+ name: 'test'
58
+ }, normalizer);
59
+ expect(result).toEqual({
60
+ needsRefetch: false,
61
+ details: []
62
+ });
63
+ });
64
+ });
65
+ describe('when mutation has same keys as normalized data', function () {
66
+ it('should return needsRefetch: false for identical keys', function () {
67
+ var normalizer = createMockNormalizer({
68
+ '@@1': {
69
+ id: '1',
70
+ name: 'test',
71
+ value: 100
72
+ }
73
+ });
74
+ var result = checkMutationObjectsKeys({
75
+ id: '1',
76
+ name: 'updated',
77
+ value: 200
78
+ }, normalizer);
79
+ expect(result).toEqual({
80
+ needsRefetch: false,
81
+ details: []
82
+ });
83
+ });
84
+ it('should return needsRefetch: false when keys are same but in different order', function () {
85
+ var normalizer = createMockNormalizer({
86
+ '@@1': {
87
+ id: '1',
88
+ a: 1,
89
+ b: 2,
90
+ c: 3
91
+ }
92
+ });
93
+ var result = checkMutationObjectsKeys({
94
+ c: 30,
95
+ a: 10,
96
+ b: 20,
97
+ id: '1'
98
+ }, normalizer);
99
+ expect(result).toEqual({
100
+ needsRefetch: false,
101
+ details: []
102
+ });
103
+ });
104
+ });
105
+ describe('when mutation has fewer keys than normalized data', function () {
106
+ it('should return needsRefetch: true with missing keys', function () {
107
+ var normalizer = createMockNormalizer({
108
+ '@@1': {
109
+ id: '1',
110
+ name: 'test',
111
+ email: 'test@example.com',
112
+ age: 25
113
+ }
114
+ });
115
+ var result = checkMutationObjectsKeys({
116
+ id: '1',
117
+ name: 'updated'
118
+ }, normalizer);
119
+ expect(result.needsRefetch).toBe(true);
120
+ expect(result.details).toHaveLength(1);
121
+ expect(result.details[0].id).toBe('1');
122
+ expect(result.details[0].missingKeys).toContain('email');
123
+ expect(result.details[0].missingKeys).toContain('age');
124
+ });
125
+ it('should return needsRefetch: true when only id is present', function () {
126
+ var normalizer = createMockNormalizer({
127
+ '@@1': {
128
+ id: '1',
129
+ field1: 'a',
130
+ field2: 'b',
131
+ field3: 'c'
132
+ }
133
+ });
134
+ var result = checkMutationObjectsKeys({
135
+ id: '1'
136
+ }, normalizer);
137
+ expect(result.needsRefetch).toBe(true);
138
+ expect(result.details[0].missingKeys).toEqual(expect.arrayContaining(['field1', 'field2', 'field3']));
139
+ });
140
+ });
141
+ describe('when mutation has different keys than normalized data', function () {
142
+ it('should return needsRefetch: true when mutation has fewer keys even if some are different', function () {
143
+ var normalizer = createMockNormalizer({
144
+ '@@1': {
145
+ id: '1',
146
+ oldField: 'old',
147
+ anotherField: 'value'
148
+ }
149
+ });
150
+
151
+ // Mutation has fewer keys (2 vs 3), so needsRefetch should be true
152
+ var result = checkMutationObjectsKeys({
153
+ id: '1',
154
+ newField: 'new'
155
+ }, normalizer);
156
+ expect(result.needsRefetch).toBe(true);
157
+ expect(result.details[0].missingKeys).toContain('oldField');
158
+ expect(result.details[0].missingKeys).toContain('anotherField');
159
+ });
160
+ });
161
+ describe('with array of objects', function () {
162
+ it('should check all objects in array', function () {
163
+ var normalizer = createMockNormalizer({
164
+ '@@1': {
165
+ id: '1',
166
+ name: 'first',
167
+ extra: 'data'
168
+ },
169
+ '@@2': {
170
+ id: '2',
171
+ name: 'second',
172
+ extra: 'data'
173
+ }
174
+ });
175
+ var result = checkMutationObjectsKeys([{
176
+ id: '1',
177
+ name: 'updated'
178
+ }, {
179
+ id: '2',
180
+ name: 'updated'
181
+ }], normalizer);
182
+ expect(result.needsRefetch).toBe(true);
183
+ expect(result.details).toHaveLength(2);
184
+ expect(result.details[0].id).toBe('1');
185
+ expect(result.details[1].id).toBe('2');
186
+ });
187
+ it('should handle nested arrays', function () {
188
+ var normalizer = createMockNormalizer({
189
+ '@@1': {
190
+ id: '1',
191
+ field: 'a',
192
+ extra: 'b'
193
+ },
194
+ '@@2': {
195
+ id: '2',
196
+ field: 'c',
197
+ extra: 'd'
198
+ }
199
+ });
200
+ var result = checkMutationObjectsKeys([[{
201
+ id: '1',
202
+ field: 'updated'
203
+ }], [{
204
+ id: '2',
205
+ field: 'updated'
206
+ }]], normalizer);
207
+ expect(result.needsRefetch).toBe(true);
208
+ expect(result.details).toHaveLength(2);
209
+ });
210
+ });
211
+ describe('with custom getNormalizationObjectKey', function () {
212
+ it('should use custom key function', function () {
213
+ var normalizer = createNormalizer({
214
+ getNormalizationObjectKey: function getNormalizationObjectKey(obj) {
215
+ return obj && _typeof(obj) === 'object' && '_id' in obj ? String(obj._id) : undefined;
216
+ }
217
+ });
218
+
219
+ // Set query with custom key
220
+ normalizer.setQuery('test', {
221
+ _id: 'custom-1',
222
+ name: 'test',
223
+ extra: 'field'
224
+ });
225
+ var result = checkMutationObjectsKeys({
226
+ _id: 'custom-1',
227
+ name: 'updated'
228
+ }, normalizer, {
229
+ getNormalizationObjectKey: function getNormalizationObjectKey(obj) {
230
+ return '_id' in obj ? String(obj._id) : undefined;
231
+ }
232
+ });
233
+ expect(result.needsRefetch).toBe(true);
234
+ expect(result.details[0].id).toBe('custom-1');
235
+ });
236
+ });
237
+ describe('edge cases', function () {
238
+ it('should handle object with undefined id', function () {
239
+ var normalizer = createMockNormalizer({});
240
+ var result = checkMutationObjectsKeys({
241
+ id: undefined,
242
+ name: 'test'
243
+ }, normalizer);
244
+ expect(result).toEqual({
245
+ needsRefetch: false,
246
+ details: []
247
+ });
248
+ });
249
+ it('should handle object with numeric id', function () {
250
+ var normalizer = createMockNormalizer({
251
+ '@@123': {
252
+ id: '123',
253
+ value: 'test',
254
+ extra: 'field'
255
+ }
256
+ });
257
+ var result = checkMutationObjectsKeys({
258
+ id: '123',
259
+ value: 'updated'
260
+ }, normalizer);
261
+ expect(result.needsRefetch).toBe(true);
262
+ });
263
+ it('should handle large number of objects', function () {
264
+ var objects = {};
265
+ var mutationData = [];
266
+ for (var i = 0; i < 100; i++) {
267
+ objects["@@".concat(i)] = {
268
+ id: String(i),
269
+ name: "item-".concat(i),
270
+ extra: 'field'
271
+ };
272
+ mutationData.push({
273
+ id: String(i),
274
+ name: "updated-".concat(i)
275
+ });
276
+ }
277
+ var normalizer = createMockNormalizer(objects);
278
+ var result = checkMutationObjectsKeys(mutationData, normalizer);
279
+ expect(result.needsRefetch).toBe(true);
280
+ expect(result.details).toHaveLength(100);
281
+ });
282
+ it('should handle empty object', function () {
283
+ var normalizer = createMockNormalizer({});
284
+ var result = checkMutationObjectsKeys({}, normalizer);
285
+ expect(result).toEqual({
286
+ needsRefetch: false,
287
+ details: []
288
+ });
289
+ });
290
+ });
291
+ });
292
+ // #sourceMappingURL=checkMutationObjectsKeys.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["createNormalizer","checkMutationObjectsKeys","createMockNormalizer","objects","normalizer","Object","keys","forEach","key","id","replace","setQuery","concat","describe","it","result","expect","toEqual","needsRefetch","details","name","value","a","b","c","email","age","toBe","toHaveLength","missingKeys","toContain","field1","field2","field3","arrayContaining","oldField","anotherField","newField","extra","field","getNormalizationObjectKey","obj","_typeof","String","_id","undefined","mutationData","i","push"],"sources":["checkMutationObjectsKeys.test.ts"],"sourcesContent":["import type {Data} from '@normy/core';\nimport {createNormalizer} from '@normy/core';\n\nimport {checkMutationObjectsKeys} from '../checkMutationObjectsKeys';\n\nconst createMockNormalizer = (objects: Record<string, Record<string, unknown>>) => {\n const normalizer = createNormalizer({});\n\n // Manually set normalized data for testing\n Object.keys(objects).forEach((key) => {\n const id = key.replace('@@', '');\n // Use object as-is, id is already included in objects[key]\n normalizer.setQuery(`test-${id}`, objects[key] as Data);\n });\n\n return normalizer;\n};\n\ndescribe('checkMutationObjectsKeys', () => {\n describe('when mutation data has no normalizable objects', () => {\n it('should return needsRefetch: false for primitive values', () => {\n const normalizer = createMockNormalizer({});\n\n const result = checkMutationObjectsKeys('string value', normalizer);\n\n expect(result).toEqual({\n needsRefetch: false,\n details: [],\n });\n });\n\n it('should return needsRefetch: false for null', () => {\n const normalizer = createMockNormalizer({});\n\n const result = checkMutationObjectsKeys(null, normalizer);\n\n expect(result).toEqual({\n needsRefetch: false,\n details: [],\n });\n });\n\n it('should return needsRefetch: false for empty array', () => {\n const normalizer = createMockNormalizer({});\n\n const result = checkMutationObjectsKeys([], normalizer);\n\n expect(result).toEqual({\n needsRefetch: false,\n details: [],\n });\n });\n\n it('should return needsRefetch: false for object without id', () => {\n const normalizer = createMockNormalizer({});\n\n const result = checkMutationObjectsKeys({name: 'test'}, normalizer);\n\n expect(result).toEqual({\n needsRefetch: false,\n details: [],\n });\n });\n });\n\n describe('when mutation object is not in normalized store', () => {\n it('should return needsRefetch: false for new object', () => {\n const normalizer = createMockNormalizer({});\n\n const result = checkMutationObjectsKeys({id: 'new-id', name: 'test'}, normalizer);\n\n expect(result).toEqual({\n needsRefetch: false,\n details: [],\n });\n });\n });\n\n describe('when mutation has same keys as normalized data', () => {\n it('should return needsRefetch: false for identical keys', () => {\n const normalizer = createMockNormalizer({\n '@@1': {id: '1', name: 'test', value: 100},\n });\n\n const result = checkMutationObjectsKeys(\n {id: '1', name: 'updated', value: 200},\n normalizer,\n );\n\n expect(result).toEqual({\n needsRefetch: false,\n details: [],\n });\n });\n\n it('should return needsRefetch: false when keys are same but in different order', () => {\n const normalizer = createMockNormalizer({\n '@@1': {id: '1', a: 1, b: 2, c: 3},\n });\n\n const result = checkMutationObjectsKeys({c: 30, a: 10, b: 20, id: '1'}, normalizer);\n\n expect(result).toEqual({\n needsRefetch: false,\n details: [],\n });\n });\n });\n\n describe('when mutation has fewer keys than normalized data', () => {\n it('should return needsRefetch: true with missing keys', () => {\n const normalizer = createMockNormalizer({\n '@@1': {id: '1', name: 'test', email: 'test@example.com', age: 25},\n });\n\n const result = checkMutationObjectsKeys({id: '1', name: 'updated'}, normalizer);\n\n expect(result.needsRefetch).toBe(true);\n expect(result.details).toHaveLength(1);\n expect(result.details[0].id).toBe('1');\n expect(result.details[0].missingKeys).toContain('email');\n expect(result.details[0].missingKeys).toContain('age');\n });\n\n it('should return needsRefetch: true when only id is present', () => {\n const normalizer = createMockNormalizer({\n '@@1': {id: '1', field1: 'a', field2: 'b', field3: 'c'},\n });\n\n const result = checkMutationObjectsKeys({id: '1'}, normalizer);\n\n expect(result.needsRefetch).toBe(true);\n expect(result.details[0].missingKeys).toEqual(\n expect.arrayContaining(['field1', 'field2', 'field3']),\n );\n });\n });\n\n describe('when mutation has different keys than normalized data', () => {\n it('should return needsRefetch: true when mutation has fewer keys even if some are different', () => {\n const normalizer = createMockNormalizer({\n '@@1': {id: '1', oldField: 'old', anotherField: 'value'},\n });\n\n // Mutation has fewer keys (2 vs 3), so needsRefetch should be true\n const result = checkMutationObjectsKeys({id: '1', newField: 'new'}, normalizer);\n\n expect(result.needsRefetch).toBe(true);\n expect(result.details[0].missingKeys).toContain('oldField');\n expect(result.details[0].missingKeys).toContain('anotherField');\n });\n });\n\n describe('with array of objects', () => {\n it('should check all objects in array', () => {\n const normalizer = createMockNormalizer({\n '@@1': {id: '1', name: 'first', extra: 'data'},\n '@@2': {id: '2', name: 'second', extra: 'data'},\n });\n\n const result = checkMutationObjectsKeys(\n [\n {id: '1', name: 'updated'},\n {id: '2', name: 'updated'},\n ],\n normalizer,\n );\n\n expect(result.needsRefetch).toBe(true);\n expect(result.details).toHaveLength(2);\n expect(result.details[0].id).toBe('1');\n expect(result.details[1].id).toBe('2');\n });\n\n it('should handle nested arrays', () => {\n const normalizer = createMockNormalizer({\n '@@1': {id: '1', field: 'a', extra: 'b'},\n '@@2': {id: '2', field: 'c', extra: 'd'},\n });\n\n const result = checkMutationObjectsKeys(\n [[{id: '1', field: 'updated'}], [{id: '2', field: 'updated'}]],\n normalizer,\n );\n\n expect(result.needsRefetch).toBe(true);\n expect(result.details).toHaveLength(2);\n });\n });\n\n describe('with custom getNormalizationObjectKey', () => {\n it('should use custom key function', () => {\n const normalizer = createNormalizer({\n getNormalizationObjectKey: (obj) =>\n obj && typeof obj === 'object' && '_id' in obj\n ? String((obj as {_id: unknown})._id)\n : undefined,\n });\n\n // Set query with custom key\n normalizer.setQuery('test', {_id: 'custom-1', name: 'test', extra: 'field'});\n\n const result = checkMutationObjectsKeys(\n {_id: 'custom-1', name: 'updated'},\n normalizer,\n {\n getNormalizationObjectKey: (obj) =>\n '_id' in obj ? String(obj._id) : undefined,\n },\n );\n\n expect(result.needsRefetch).toBe(true);\n expect(result.details[0].id).toBe('custom-1');\n });\n });\n\n describe('edge cases', () => {\n it('should handle object with undefined id', () => {\n const normalizer = createMockNormalizer({});\n\n const result = checkMutationObjectsKeys({id: undefined, name: 'test'}, normalizer);\n\n expect(result).toEqual({\n needsRefetch: false,\n details: [],\n });\n });\n\n it('should handle object with numeric id', () => {\n const normalizer = createMockNormalizer({\n '@@123': {id: '123', value: 'test', extra: 'field'},\n });\n\n const result = checkMutationObjectsKeys({id: '123', value: 'updated'}, normalizer);\n\n expect(result.needsRefetch).toBe(true);\n });\n\n it('should handle large number of objects', () => {\n const objects: Record<string, Record<string, unknown>> = {};\n const mutationData: Array<{id: string; name: string}> = [];\n\n for (let i = 0; i < 100; i++) {\n objects[`@@${i}`] = {id: String(i), name: `item-${i}`, extra: 'field'};\n mutationData.push({id: String(i), name: `updated-${i}`});\n }\n\n const normalizer = createMockNormalizer(objects);\n\n const result = checkMutationObjectsKeys(mutationData, normalizer);\n\n expect(result.needsRefetch).toBe(true);\n expect(result.details).toHaveLength(100);\n });\n\n it('should handle empty object', () => {\n const normalizer = createMockNormalizer({});\n\n const result = checkMutationObjectsKeys({}, normalizer);\n\n expect(result).toEqual({\n needsRefetch: false,\n details: [],\n });\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,17 @@
1
+ import type { Normalizer } from '../../core';
2
+ type DataObject = Record<string, unknown>;
3
+ type NormalizableObject = DataObject & {
4
+ id?: string;
5
+ };
6
+ export interface AffectedObject {
7
+ id: string;
8
+ missingKeys: string[];
9
+ }
10
+ export interface MutationObjectsKeysResult {
11
+ needsRefetch: boolean;
12
+ details: AffectedObject[];
13
+ }
14
+ export declare const checkMutationObjectsKeys: (mutationData: unknown, normalizer: Normalizer, config?: {
15
+ getNormalizationObjectKey?: (obj: NormalizableObject) => string | undefined;
16
+ }) => MutationObjectsKeysResult;
17
+ export {};
@@ -0,0 +1,81 @@
1
+ import _createForOfIteratorHelper from "@babel/runtime/helpers/createForOfIteratorHelper";
2
+ import _typeof from "@babel/runtime/helpers/typeof";
3
+ import { getId } from '@normy/core';
4
+ var hasFewerKeys = function hasFewerKeys(mutation, existing) {
5
+ var mutationKeys = Object.keys(mutation);
6
+ var existingKeys = Object.keys(existing);
7
+ if (mutationKeys.length >= existingKeys.length) {
8
+ return false;
9
+ }
10
+ for (var _i = 0, _mutationKeys = mutationKeys; _i < _mutationKeys.length; _i++) {
11
+ var key = _mutationKeys[_i];
12
+ if (!existingKeys.includes(key)) {
13
+ return true;
14
+ }
15
+ }
16
+ return true;
17
+ };
18
+ var extractNormalizableObjects = function extractNormalizableObjects(data, getNormalizationObjectKey) {
19
+ var objects = [];
20
+ function extract(item) {
21
+ if (Array.isArray(item)) {
22
+ item.forEach(extract);
23
+ } else if (item !== null && _typeof(item) === 'object' && !(item instanceof Date)) {
24
+ var obj = item;
25
+ if (getNormalizationObjectKey(obj)) {
26
+ objects.push(obj);
27
+ }
28
+ }
29
+ }
30
+ extract(data);
31
+ return objects;
32
+ };
33
+ export var checkMutationObjectsKeys = function checkMutationObjectsKeys(mutationData, normalizer, config) {
34
+ var getNormalizationObjectKey = (config === null || config === void 0 ? void 0 : config.getNormalizationObjectKey) || function (obj) {
35
+ return obj.id;
36
+ };
37
+ var normalizedState = normalizer.getNormalizedData();
38
+ var mutationObjects = extractNormalizableObjects(mutationData, getNormalizationObjectKey);
39
+ if (mutationObjects.length === 0) {
40
+ return {
41
+ needsRefetch: false,
42
+ details: []
43
+ };
44
+ }
45
+ var details = [];
46
+ var _iterator = _createForOfIteratorHelper(mutationObjects),
47
+ _step;
48
+ try {
49
+ var _loop = function _loop() {
50
+ var obj = _step.value;
51
+ var objectKey = getNormalizationObjectKey(obj);
52
+ if (!objectKey) {
53
+ return 1; // continue
54
+ }
55
+ var normalizedKey = getId(objectKey);
56
+ var existingObject = normalizedState.objects[normalizedKey];
57
+ if (existingObject && hasFewerKeys(obj, existingObject)) {
58
+ var mutationKeys = Object.keys(obj);
59
+ var existingKeys = Object.keys(existingObject);
60
+ details.push({
61
+ id: objectKey,
62
+ missingKeys: existingKeys.filter(function (k) {
63
+ return !mutationKeys.includes(k);
64
+ })
65
+ });
66
+ }
67
+ };
68
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
69
+ if (_loop()) continue;
70
+ }
71
+ } catch (err) {
72
+ _iterator.e(err);
73
+ } finally {
74
+ _iterator.f();
75
+ }
76
+ return {
77
+ needsRefetch: details.length > 0,
78
+ details: details
79
+ };
80
+ };
81
+ // #sourceMappingURL=checkMutationObjectsKeys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["getId","hasFewerKeys","mutation","existing","mutationKeys","Object","keys","existingKeys","length","_i","_mutationKeys","key","includes","extractNormalizableObjects","data","getNormalizationObjectKey","objects","extract","item","Array","isArray","forEach","_typeof","Date","obj","push","checkMutationObjectsKeys","mutationData","normalizer","config","id","normalizedState","getNormalizedData","mutationObjects","needsRefetch","details","_iterator","_createForOfIteratorHelper","_step","_loop","value","objectKey","normalizedKey","existingObject","missingKeys","filter","k","s","n","done","err","e","f"],"sources":["checkMutationObjectsKeys.ts"],"sourcesContent":["import {getId} from '@normy/core';\n\nimport type {Normalizer} from '../../core';\n\ntype DataObject = Record<string, unknown>;\ntype NormalizableObject = DataObject & {id?: string};\n\nexport interface AffectedObject {\n id: string;\n missingKeys: string[];\n}\n\nexport interface MutationObjectsKeysResult {\n needsRefetch: boolean;\n details: AffectedObject[];\n}\n\nconst hasFewerKeys = (mutation: DataObject, existing: DataObject): boolean => {\n const mutationKeys = Object.keys(mutation);\n const existingKeys = Object.keys(existing);\n\n if (mutationKeys.length >= existingKeys.length) {\n return false;\n }\n\n for (const key of mutationKeys) {\n if (!existingKeys.includes(key)) {\n return true;\n }\n }\n\n return true;\n};\n\nconst extractNormalizableObjects = (\n data: unknown,\n getNormalizationObjectKey: (obj: NormalizableObject) => string | undefined,\n): NormalizableObject[] => {\n const objects: NormalizableObject[] = [];\n\n function extract(item: unknown): void {\n if (Array.isArray(item)) {\n item.forEach(extract);\n } else if (item !== null && typeof item === 'object' && !(item instanceof Date)) {\n const obj = item as NormalizableObject;\n\n if (getNormalizationObjectKey(obj)) {\n objects.push(obj);\n }\n }\n }\n\n extract(data);\n\n return objects;\n};\n\nexport const checkMutationObjectsKeys = (\n mutationData: unknown,\n normalizer: Normalizer,\n config?: {getNormalizationObjectKey?: (obj: NormalizableObject) => string | undefined},\n): MutationObjectsKeysResult => {\n const getNormalizationObjectKey =\n config?.getNormalizationObjectKey || ((obj: NormalizableObject) => obj.id);\n\n const normalizedState = normalizer.getNormalizedData();\n\n const mutationObjects = extractNormalizableObjects(mutationData, getNormalizationObjectKey);\n\n if (mutationObjects.length === 0) {\n return {\n needsRefetch: false,\n details: [],\n };\n }\n\n const details: AffectedObject[] = [];\n\n for (const obj of mutationObjects) {\n const objectKey = getNormalizationObjectKey(obj);\n\n if (!objectKey) {\n continue;\n }\n\n const normalizedKey = getId(objectKey);\n\n const existingObject = normalizedState.objects[normalizedKey] as DataObject | undefined;\n\n if (existingObject && hasFewerKeys(obj, existingObject)) {\n const mutationKeys = Object.keys(obj);\n const existingKeys = Object.keys(existingObject);\n\n details.push({\n id: objectKey,\n missingKeys: existingKeys.filter((k) => !mutationKeys.includes(k)),\n });\n }\n }\n\n return {\n needsRefetch: details.length > 0,\n details,\n };\n};\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,2 @@
1
+ import type { QueryKey } from '@tanstack/react-query';
2
+ export declare const parseQueryKey: (queryKeyString: string) => QueryKey;
@@ -0,0 +1,4 @@
1
+ export var parseQueryKey = function parseQueryKey(queryKeyString) {
2
+ return JSON.parse(queryKeyString);
3
+ };
4
+ // #sourceMappingURL=parseQueryKey.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["parseQueryKey","queryKeyString","JSON","parse"],"sources":["parseQueryKey.ts"],"sourcesContent":["import type {QueryKey} from '@tanstack/react-query';\n\nexport const parseQueryKey = (queryKeyString: string): QueryKey => {\n return JSON.parse(queryKeyString) as QueryKey;\n};\n"],"mappings":"AAEA,OAAO,IAAMA,aAAa,GAAG,SAAhBA,aAAaA,CAAIC,cAAsB,EAAe;EAC/D,OAAOC,IAAI,CAACC,KAAK,CAACF,cAAc,CAAC;AACrC,CAAC","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gravity-ui/data-source",
3
- "version": "0.8.0",
3
+ "version": "0.8.2",
4
4
  "description": "A wrapper around data fetching",
5
5
  "keywords": [
6
6
  "data-fetching",
@@ -1,195 +0,0 @@
1
- "use strict";
2
-
3
- var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
4
- var _reactQuery = require("@tanstack/react-query");
5
- var _react = require("@testing-library/react");
6
- var _core = require("../../../core");
7
- var _warnDisabledRefetch = require("../../utils/warnDisabledRefetch");
8
- var _useQueryContext = require("../useQueryContext");
9
- var _useQueryData = require("../useQueryData");
10
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
11
- jest.mock('@tanstack/react-query', function () {
12
- return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, jest.requireActual('@tanstack/react-query')), {}, {
13
- useQuery: jest.fn(),
14
- useInfiniteQuery: jest.fn()
15
- });
16
- });
17
- jest.mock('../useQueryContext');
18
- jest.mock('../../utils/warnDisabledRefetch');
19
- var mockUseQuery = _reactQuery.useQuery;
20
- var mockUseInfiniteQuery = _reactQuery.useInfiniteQuery;
21
- var mockWarnDisabledRefetch = _warnDisabledRefetch.warnDisabledRefetch;
22
- describe('useQueryData refetch behavior', function () {
23
- var mockQueryClient = new _reactQuery.QueryClient();
24
- var mockContext = {
25
- queryClient: mockQueryClient
26
- };
27
- beforeEach(function () {
28
- jest.clearAllMocks();
29
- _useQueryContext.useQueryContext.mockReturnValue(mockContext);
30
- });
31
- var createMockQueryResult = function createMockQueryResult() {
32
- var refetch = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : jest.fn();
33
- return {
34
- data: 'test-data',
35
- error: null,
36
- status: 'success',
37
- fetchStatus: 'idle',
38
- isLoading: false,
39
- isError: false,
40
- isSuccess: true,
41
- isPending: false,
42
- refetch: refetch,
43
- dataUpdatedAt: Date.now(),
44
- errorUpdatedAt: 0,
45
- failureCount: 0,
46
- failureReason: null,
47
- isFetched: true,
48
- isFetchedAfterMount: true,
49
- isFetching: false,
50
- isInitialLoading: false,
51
- isLoadingError: false,
52
- isPaused: false,
53
- isPlaceholderData: false,
54
- isPreviousData: false,
55
- isRefetchError: false,
56
- isRefetching: false,
57
- isStale: false,
58
- promise: Promise.resolve('test-data')
59
- };
60
- };
61
- var createMockInfiniteResult = function createMockInfiniteResult() {
62
- var refetch = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : jest.fn();
63
- return {
64
- data: {
65
- pages: [['item1'], ['item2']],
66
- pageParams: [undefined, 'next-page']
67
- },
68
- error: null,
69
- status: 'success',
70
- fetchStatus: 'idle',
71
- isLoading: false,
72
- isError: false,
73
- isSuccess: true,
74
- isPending: false,
75
- refetch: refetch,
76
- hasNextPage: false,
77
- hasPreviousPage: false,
78
- fetchNextPage: jest.fn(),
79
- fetchPreviousPage: jest.fn(),
80
- isFetchingNextPage: false,
81
- isFetchingPreviousPage: false,
82
- dataUpdatedAt: Date.now(),
83
- errorUpdatedAt: 0,
84
- failureCount: 0,
85
- failureReason: null,
86
- isFetched: true,
87
- isFetchedAfterMount: true,
88
- isFetching: false,
89
- isInitialLoading: false,
90
- isLoadingError: false,
91
- isPaused: false,
92
- isPlaceholderData: false,
93
- isPreviousData: false,
94
- isRefetchError: false,
95
- isRefetching: false,
96
- isStale: false,
97
- promise: Promise.resolve({
98
- pages: [['item1'], ['item2']],
99
- pageParams: [undefined, 'next-page']
100
- })
101
- };
102
- };
103
- describe('plain data source', function () {
104
- var plainDataSource = {
105
- type: 'plain',
106
- name: 'test-plain',
107
- fetch: jest.fn().mockResolvedValue({
108
- data: 'test-data'
109
- })
110
- };
111
- it('should use original refetch when no enabled option', function () {
112
- var originalRefetch = jest.fn();
113
- mockUseQuery.mockReturnValue(createMockQueryResult(originalRefetch));
114
- var _renderHook = (0, _react.renderHook)(function () {
115
- return (0, _useQueryData.useQueryData)(plainDataSource, {
116
- id: 1
117
- });
118
- }),
119
- result = _renderHook.result;
120
- expect(result.current.refetch).toBe(originalRefetch);
121
- expect(result.current.refetch).not.toBe(mockWarnDisabledRefetch);
122
- });
123
- it('should use warnDisabledRefetch when enabled: false', function () {
124
- var originalRefetch = jest.fn();
125
- mockUseQuery.mockReturnValue(createMockQueryResult(originalRefetch));
126
- var _renderHook2 = (0, _react.renderHook)(function () {
127
- return (0, _useQueryData.useQueryData)(plainDataSource, {
128
- id: 1
129
- }, {
130
- enabled: false
131
- });
132
- }),
133
- result = _renderHook2.result;
134
- expect(result.current.refetch).toBe(mockWarnDisabledRefetch);
135
- expect(result.current.refetch).not.toBe(originalRefetch);
136
- });
137
- it('should use warnDisabledRefetch when params is idle', function () {
138
- var originalRefetch = jest.fn();
139
- mockUseQuery.mockReturnValue(createMockQueryResult(originalRefetch));
140
- var _renderHook3 = (0, _react.renderHook)(function () {
141
- return (0, _useQueryData.useQueryData)(plainDataSource, _core.idle);
142
- }),
143
- result = _renderHook3.result;
144
- expect(result.current.refetch).toBe(mockWarnDisabledRefetch);
145
- expect(result.current.refetch).not.toBe(originalRefetch);
146
- });
147
- });
148
- describe('infinite data source', function () {
149
- var infiniteDataSource = {
150
- type: 'infinite',
151
- name: 'test-infinite',
152
- fetch: jest.fn().mockResolvedValue({
153
- data: ['item1', 'item2']
154
- }),
155
- next: jest.fn()
156
- };
157
- it('should use original refetch when no enabled option', function () {
158
- var originalRefetch = jest.fn();
159
- mockUseInfiniteQuery.mockReturnValue(createMockInfiniteResult(originalRefetch));
160
- var _renderHook4 = (0, _react.renderHook)(function () {
161
- return (0, _useQueryData.useQueryData)(infiniteDataSource, {
162
- id: 1
163
- });
164
- }),
165
- result = _renderHook4.result;
166
- expect(result.current.refetch).toBe(originalRefetch);
167
- expect(result.current.refetch).not.toBe(mockWarnDisabledRefetch);
168
- });
169
- it('should use warnDisabledRefetch when enabled: false', function () {
170
- var originalRefetch = jest.fn();
171
- mockUseInfiniteQuery.mockReturnValue(createMockInfiniteResult(originalRefetch));
172
- var _renderHook5 = (0, _react.renderHook)(function () {
173
- return (0, _useQueryData.useQueryData)(infiniteDataSource, {
174
- id: 1
175
- }, {
176
- enabled: false
177
- });
178
- }),
179
- result = _renderHook5.result;
180
- expect(result.current.refetch).toBe(mockWarnDisabledRefetch);
181
- expect(result.current.refetch).not.toBe(originalRefetch);
182
- });
183
- it('should use warnDisabledRefetch when params is idle', function () {
184
- var originalRefetch = jest.fn();
185
- mockUseInfiniteQuery.mockReturnValue(createMockInfiniteResult(originalRefetch));
186
- var _renderHook6 = (0, _react.renderHook)(function () {
187
- return (0, _useQueryData.useQueryData)(infiniteDataSource, _core.idle);
188
- }),
189
- result = _renderHook6.result;
190
- expect(result.current.refetch).toBe(mockWarnDisabledRefetch);
191
- expect(result.current.refetch).not.toBe(originalRefetch);
192
- });
193
- });
194
- });
195
- // #sourceMappingURL=useQueryData.refetch.test.js.map