@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,88 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.checkMutationObjectsKeys = void 0;
7
+ var _createForOfIteratorHelper2 = _interopRequireDefault(require("@babel/runtime/helpers/createForOfIteratorHelper"));
8
+ var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
9
+ var _core = require("@normy/core");
10
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
11
+ var hasFewerKeys = function hasFewerKeys(mutation, existing) {
12
+ var mutationKeys = Object.keys(mutation);
13
+ var existingKeys = Object.keys(existing);
14
+ if (mutationKeys.length >= existingKeys.length) {
15
+ return false;
16
+ }
17
+ for (var _i = 0, _mutationKeys = mutationKeys; _i < _mutationKeys.length; _i++) {
18
+ var key = _mutationKeys[_i];
19
+ if (!existingKeys.includes(key)) {
20
+ return true;
21
+ }
22
+ }
23
+ return true;
24
+ };
25
+ var extractNormalizableObjects = function extractNormalizableObjects(data, getNormalizationObjectKey) {
26
+ var objects = [];
27
+ function extract(item) {
28
+ if (Array.isArray(item)) {
29
+ item.forEach(extract);
30
+ } else if (item !== null && (0, _typeof2.default)(item) === 'object' && !(item instanceof Date)) {
31
+ var obj = item;
32
+ if (getNormalizationObjectKey(obj)) {
33
+ objects.push(obj);
34
+ }
35
+ }
36
+ }
37
+ extract(data);
38
+ return objects;
39
+ };
40
+ var checkMutationObjectsKeys = exports.checkMutationObjectsKeys = function checkMutationObjectsKeys(mutationData, normalizer, config) {
41
+ var getNormalizationObjectKey = (config === null || config === void 0 ? void 0 : config.getNormalizationObjectKey) || function (obj) {
42
+ return obj.id;
43
+ };
44
+ var normalizedState = normalizer.getNormalizedData();
45
+ var mutationObjects = extractNormalizableObjects(mutationData, getNormalizationObjectKey);
46
+ if (mutationObjects.length === 0) {
47
+ return {
48
+ needsRefetch: false,
49
+ details: []
50
+ };
51
+ }
52
+ var details = [];
53
+ var _iterator = (0, _createForOfIteratorHelper2.default)(mutationObjects),
54
+ _step;
55
+ try {
56
+ var _loop = function _loop() {
57
+ var obj = _step.value;
58
+ var objectKey = getNormalizationObjectKey(obj);
59
+ if (!objectKey) {
60
+ return 1; // continue
61
+ }
62
+ var normalizedKey = (0, _core.getId)(objectKey);
63
+ var existingObject = normalizedState.objects[normalizedKey];
64
+ if (existingObject && hasFewerKeys(obj, existingObject)) {
65
+ var mutationKeys = Object.keys(obj);
66
+ var existingKeys = Object.keys(existingObject);
67
+ details.push({
68
+ id: objectKey,
69
+ missingKeys: existingKeys.filter(function (k) {
70
+ return !mutationKeys.includes(k);
71
+ })
72
+ });
73
+ }
74
+ };
75
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
76
+ if (_loop()) continue;
77
+ }
78
+ } catch (err) {
79
+ _iterator.e(err);
80
+ } finally {
81
+ _iterator.f();
82
+ }
83
+ return {
84
+ needsRefetch: details.length > 0,
85
+ details: details
86
+ };
87
+ };
88
+ // #sourceMappingURL=checkMutationObjectsKeys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_core","require","_interopRequireDefault","e","__esModule","default","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","exports","mutationData","normalizer","config","id","normalizedState","getNormalizedData","mutationObjects","needsRefetch","details","_iterator","_createForOfIteratorHelper","_step","_loop","value","objectKey","normalizedKey","getId","existingObject","missingKeys","filter","k","s","n","done","err","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,10 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.parseQueryKey = void 0;
7
+ var parseQueryKey = exports.parseQueryKey = function parseQueryKey(queryKeyString) {
8
+ return JSON.parse(queryKeyString);
9
+ };
10
+ // #sourceMappingURL=parseQueryKey.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["parseQueryKey","exports","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":";;;;;;AAEO,IAAMA,aAAa,GAAAC,OAAA,CAAAD,aAAA,GAAG,SAAhBA,aAAaA,CAAIE,cAAsB,EAAe;EAC/D,OAAOC,IAAI,CAACC,KAAK,CAACF,cAAc,CAAC;AACrC,CAAC","ignoreList":[]}
@@ -1,5 +1,5 @@
1
1
  import type { Data } from '@normy/core';
2
- import type { InvalidateQueryFilters, QueryClientConfig } from '@tanstack/react-query';
2
+ import type { InvalidateQueryFilters, QueryClientConfig, QueryKey } from '@tanstack/react-query';
3
3
  import { QueryClient } from '@tanstack/react-query';
4
4
  import { type AnyDataSource, type DataManager, type DataSourceParams, type DataSourceTag, type Normalizer, type NormalizerConfig } from '../core';
5
5
  import type { InvalidateOptions, InvalidateRepeatOptions } from '../core/types/DataManagerOptions';
@@ -11,9 +11,11 @@ export declare class ClientDataManager implements DataManager {
11
11
  readonly queryClient: QueryClient;
12
12
  readonly normalizer?: Normalizer | undefined;
13
13
  readonly queryNormalizer?: QueryNormalizer | undefined;
14
+ readonly normalizerConfig?: NormalizerConfig | boolean;
14
15
  constructor(config?: ClientDataManagerConfig);
15
- optimisticUpdate(mutationData: Data): void;
16
- invalidateData(data: Data): void;
16
+ optimisticUpdate(mutationData: Data, queryKey?: QueryKey, queryData?: Data): void;
17
+ invalidateData(data: Data, queryKey?: QueryKey): void;
18
+ update(data: Data): void;
17
19
  invalidateTag(tag: DataSourceTag, invalidateOptions?: InvalidateOptions): Promise<void>;
18
20
  invalidateTags(tags: DataSourceTag[], invalidateOptions?: InvalidateOptions): Promise<void>;
19
21
  invalidateSource<TDataSource extends AnyDataSource>(dataSource: TDataSource, invalidateOptions?: InvalidateOptions): Promise<void>;
@@ -24,4 +26,6 @@ export declare class ClientDataManager implements DataManager {
24
26
  protected invalidateQueries(filters: InvalidateQueryFilters, invalidateOptions?: InvalidateOptions): Promise<void>;
25
27
  protected repeatInvalidate(invalidate: () => Promise<void>, repeat?: InvalidateRepeatOptions): void;
26
28
  private createNormalize;
29
+ private invalidateQuery;
30
+ private optimisticUpdateQuery;
27
31
  }
@@ -1,10 +1,13 @@
1
+ import _typeof from "@babel/runtime/helpers/typeof";
1
2
  import _objectSpread from "@babel/runtime/helpers/objectSpread2";
2
3
  import _classCallCheck from "@babel/runtime/helpers/classCallCheck";
3
4
  import _createClass from "@babel/runtime/helpers/createClass";
4
5
  import { createNormalizer } from '@normy/core';
5
6
  import { QueryClient } from '@tanstack/react-query';
6
7
  import { composeFullKey, hasTag } from '../core';
8
+ import { checkMutationObjectsKeys } from './utils/checkMutationObjectsKeys';
7
9
  import { createQueryNormalizer } from './utils/normalize';
10
+ import { parseQueryKey } from './utils/parseQueryKey';
8
11
  export var ClientDataManager = /*#__PURE__*/function () {
9
12
  function ClientDataManager() {
10
13
  var _config$defaultOption,
@@ -15,6 +18,8 @@ export var ClientDataManager = /*#__PURE__*/function () {
15
18
  this.queryClient = void 0;
16
19
  this.normalizer = void 0;
17
20
  this.queryNormalizer = void 0;
21
+ this.normalizerConfig = void 0;
22
+ this.normalizerConfig = config.normalizerConfig;
18
23
  this.queryClient = new QueryClient(_objectSpread(_objectSpread({}, config), {}, {
19
24
  defaultOptions: _objectSpread(_objectSpread({}, config.defaultOptions), {}, {
20
25
  queries: _objectSpread({
@@ -34,54 +39,94 @@ export var ClientDataManager = /*#__PURE__*/function () {
34
39
  }
35
40
  return _createClass(ClientDataManager, [{
36
41
  key: "optimisticUpdate",
37
- value: function optimisticUpdate(mutationData) {
42
+ value: function optimisticUpdate(mutationData, queryKey, queryData) {
38
43
  var _this2 = this;
39
44
  if (!this.normalizer) {
40
45
  return;
41
46
  }
47
+ if (queryKey && queryData) {
48
+ this.optimisticUpdateQuery(queryKey, queryData);
49
+ return;
50
+ }
42
51
  var queriesToUpdate = this.normalizer.getQueriesToUpdate(mutationData);
43
52
  queriesToUpdate.forEach(function (query) {
44
- var queryKey = JSON.parse(query.queryKey);
45
- var cachedQuery = _this2.queryClient.getQueryCache().find({
46
- queryKey: queryKey
47
- });
48
- var dataUpdatedAt = cachedQuery === null || cachedQuery === void 0 ? void 0 : cachedQuery.state.dataUpdatedAt;
49
- var isInvalidated = cachedQuery === null || cachedQuery === void 0 ? void 0 : cachedQuery.state.isInvalidated;
50
- var error = cachedQuery === null || cachedQuery === void 0 ? void 0 : cachedQuery.state.error;
51
- var status = cachedQuery === null || cachedQuery === void 0 ? void 0 : cachedQuery.state.status;
52
- _this2.queryClient.setQueryData(queryKey, function () {
53
- return query.data;
54
- }, {
55
- updatedAt: dataUpdatedAt
56
- });
57
- cachedQuery === null || cachedQuery === void 0 || cachedQuery.setState({
58
- isInvalidated: isInvalidated,
59
- error: error,
60
- status: status
61
- });
53
+ var parsedQueryKey = parseQueryKey(query.queryKey);
54
+ _this2.optimisticUpdateQuery(parsedQueryKey, query.data);
62
55
  });
63
56
  }
64
57
  }, {
65
58
  key: "invalidateData",
66
- value: function invalidateData(data) {
59
+ value: function invalidateData(data, queryKey) {
67
60
  var _this3 = this;
68
61
  if (!this.normalizer) {
69
62
  return;
70
63
  }
64
+ if (queryKey) {
65
+ this.invalidateQuery(queryKey);
66
+ return;
67
+ }
71
68
  var queriesToUpdate = this.normalizer.getQueriesToUpdate(data);
72
69
  queriesToUpdate.forEach(function (query) {
73
- var queryKey = JSON.parse(query.queryKey);
74
- _this3.queryClient.invalidateQueries({
75
- queryKey: queryKey
70
+ var parsedQueryKey = parseQueryKey(query.queryKey);
71
+ _this3.invalidateQuery(parsedQueryKey);
72
+ });
73
+ }
74
+ }, {
75
+ key: "update",
76
+ value: function update(data) {
77
+ var _this4 = this;
78
+ if (!this.normalizer) {
79
+ return;
80
+ }
81
+ var _ref = _typeof(this.normalizerConfig) === 'object' ? this.normalizerConfig : {
82
+ optimistic: false,
83
+ invalidate: false
84
+ },
85
+ globalOptimistic = _ref.optimistic,
86
+ globalInvalidate = _ref.invalidate;
87
+ var queriesToUpdate = this.normalizer.getQueriesToUpdate(data);
88
+ if (queriesToUpdate.length === 0) {
89
+ var completeness = checkMutationObjectsKeys(data, this.normalizer);
90
+ var dependentQueries = this.normalizer.getDependentQueries(data);
91
+ if (completeness.needsRefetch) {
92
+ dependentQueries.forEach(function (queryKeyString) {
93
+ var _cachedQuery$meta;
94
+ var parsedQueryKey = parseQueryKey(queryKeyString);
95
+ var cachedQuery = _this4.queryClient.getQueryCache().find({
96
+ queryKey: parsedQueryKey
97
+ });
98
+ var _ref2 = (_cachedQuery$meta = cachedQuery === null || cachedQuery === void 0 ? void 0 : cachedQuery.meta) !== null && _cachedQuery$meta !== void 0 ? _cachedQuery$meta : {},
99
+ invalidate = _ref2.invalidate;
100
+ if (invalidate === true || invalidate === undefined && globalInvalidate === true) {
101
+ _this4.invalidateData(data, parsedQueryKey);
102
+ }
103
+ });
104
+ }
105
+ return;
106
+ }
107
+ queriesToUpdate.forEach(function (query) {
108
+ var _cachedQuery$meta2;
109
+ var parsedQueryKey = parseQueryKey(query.queryKey);
110
+ var cachedQuery = _this4.queryClient.getQueryCache().find({
111
+ queryKey: parsedQueryKey
76
112
  });
113
+ var _ref3 = (_cachedQuery$meta2 = cachedQuery === null || cachedQuery === void 0 ? void 0 : cachedQuery.meta) !== null && _cachedQuery$meta2 !== void 0 ? _cachedQuery$meta2 : {},
114
+ optimistic = _ref3.optimistic,
115
+ invalidate = _ref3.invalidate;
116
+ if (optimistic === true || optimistic === undefined && globalOptimistic === true) {
117
+ _this4.optimisticUpdate(data, parsedQueryKey, query.data);
118
+ }
119
+ if (invalidate === true || invalidate === undefined && globalInvalidate === true) {
120
+ _this4.invalidateData(data, parsedQueryKey);
121
+ }
77
122
  });
78
123
  }
79
124
  }, {
80
125
  key: "invalidateTag",
81
126
  value: function invalidateTag(tag, invalidateOptions) {
82
127
  return this.invalidateQueries({
83
- predicate: function predicate(_ref) {
84
- var queryKey = _ref.queryKey;
128
+ predicate: function predicate(_ref4) {
129
+ var queryKey = _ref4.queryKey;
85
130
  return hasTag(queryKey, tag);
86
131
  }
87
132
  }, invalidateOptions);
@@ -90,8 +135,8 @@ export var ClientDataManager = /*#__PURE__*/function () {
90
135
  key: "invalidateTags",
91
136
  value: function invalidateTags(tags, invalidateOptions) {
92
137
  return this.invalidateQueries({
93
- predicate: function predicate(_ref2) {
94
- var queryKey = _ref2.queryKey;
138
+ predicate: function predicate(_ref5) {
139
+ var queryKey = _ref5.queryKey;
95
140
  return tags.every(function (tag) {
96
141
  return hasTag(queryKey, tag);
97
142
  });
@@ -141,9 +186,9 @@ export var ClientDataManager = /*#__PURE__*/function () {
141
186
  }, {
142
187
  key: "invalidateQueries",
143
188
  value: function invalidateQueries(filters, invalidateOptions) {
144
- var _this4 = this;
189
+ var _this5 = this;
145
190
  var invalidate = function invalidate() {
146
- return _this4.queryClient.invalidateQueries(filters);
191
+ return _this5.queryClient.invalidateQueries(filters);
147
192
  };
148
193
  this.repeatInvalidate(invalidate, invalidateOptions === null || invalidateOptions === void 0 ? void 0 : invalidateOptions.repeat);
149
194
  return invalidate();
@@ -169,6 +214,39 @@ export var ClientDataManager = /*#__PURE__*/function () {
169
214
  }
170
215
  return createNormalizer(config);
171
216
  }
217
+ }, {
218
+ key: "invalidateQuery",
219
+ value: function invalidateQuery(queryKey) {
220
+ var cachedQuery = this.queryClient.getQueryCache().find({
221
+ queryKey: queryKey
222
+ });
223
+ if ((cachedQuery === null || cachedQuery === void 0 ? void 0 : cachedQuery.state.fetchStatus) !== 'fetching' && (cachedQuery === null || cachedQuery === void 0 ? void 0 : cachedQuery.state.status) === 'success' && !(cachedQuery !== null && cachedQuery !== void 0 && cachedQuery.state.isInvalidated)) {
224
+ this.queryClient.invalidateQueries({
225
+ queryKey: queryKey
226
+ });
227
+ }
228
+ }
229
+ }, {
230
+ key: "optimisticUpdateQuery",
231
+ value: function optimisticUpdateQuery(queryKey, queryData) {
232
+ var cachedQuery = this.queryClient.getQueryCache().find({
233
+ queryKey: queryKey
234
+ });
235
+ var dataUpdatedAt = cachedQuery === null || cachedQuery === void 0 ? void 0 : cachedQuery.state.dataUpdatedAt;
236
+ var isInvalidated = cachedQuery === null || cachedQuery === void 0 ? void 0 : cachedQuery.state.isInvalidated;
237
+ var error = cachedQuery === null || cachedQuery === void 0 ? void 0 : cachedQuery.state.error;
238
+ var status = cachedQuery === null || cachedQuery === void 0 ? void 0 : cachedQuery.state.status;
239
+ this.queryClient.setQueryData(queryKey, function () {
240
+ return queryData;
241
+ }, {
242
+ updatedAt: dataUpdatedAt
243
+ });
244
+ cachedQuery === null || cachedQuery === void 0 || cachedQuery.setState({
245
+ isInvalidated: isInvalidated,
246
+ error: error,
247
+ status: status
248
+ });
249
+ }
172
250
  }]);
173
251
  }();
174
252
  // #sourceMappingURL=ClientDataManager.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["createNormalizer","QueryClient","composeFullKey","hasTag","createQueryNormalizer","ClientDataManager","_config$defaultOption","_config$defaultOption2","_this","config","arguments","length","undefined","_classCallCheck","queryClient","normalizer","queryNormalizer","_objectSpread","defaultOptions","queries","networkMode","mutations","createNormalize","normalizerConfig","data","optimisticUpdate","invalidateData","_createClass","key","value","mutationData","_this2","queriesToUpdate","getQueriesToUpdate","forEach","query","queryKey","JSON","parse","cachedQuery","getQueryCache","find","dataUpdatedAt","state","isInvalidated","error","status","setQueryData","updatedAt","setState","_this3","invalidateQueries","invalidateTag","tag","invalidateOptions","predicate","_ref","invalidateTags","tags","_ref2","every","invalidateSource","dataSource","name","resetSource","resetQueries","invalidateParams","params","exact","resetParams","invalidateSourceTags","slice","filters","_this4","invalidate","repeatInvalidate","repeat","i","count","setTimeout","interval"],"sources":["ClientDataManager.ts"],"sourcesContent":["import type {Data} from '@normy/core';\nimport {createNormalizer} from '@normy/core';\nimport type {InvalidateQueryFilters, QueryClientConfig, QueryKey} from '@tanstack/react-query';\nimport {QueryClient} from '@tanstack/react-query';\n\nimport {\n type AnyDataSource,\n type DataManager,\n type DataSourceParams,\n type DataSourceTag,\n type Normalizer,\n type NormalizerConfig,\n composeFullKey,\n hasTag,\n} from '../core';\nimport type {InvalidateOptions, InvalidateRepeatOptions} from '../core/types/DataManagerOptions';\n\nimport type {QueryNormalizer} from './types/normalizer';\nimport {createQueryNormalizer} from './utils/normalize';\n\nexport interface ClientDataManagerConfig extends QueryClientConfig {\n normalizerConfig?: NormalizerConfig | boolean;\n}\n\nexport class ClientDataManager implements DataManager {\n readonly queryClient: QueryClient;\n readonly normalizer?: Normalizer | undefined;\n readonly queryNormalizer?: QueryNormalizer | undefined;\n\n constructor(config: ClientDataManagerConfig = {}) {\n this.queryClient = new QueryClient({\n ...config,\n defaultOptions: {\n ...config.defaultOptions,\n queries: {\n networkMode: 'always',\n ...config.defaultOptions?.queries,\n },\n mutations: {\n networkMode: 'always',\n ...config.defaultOptions?.mutations,\n },\n },\n });\n\n this.normalizer = this.createNormalize(config.normalizerConfig);\n this.queryNormalizer = createQueryNormalizer(\n this.normalizer,\n this.queryClient,\n config.normalizerConfig,\n (data) => this.optimisticUpdate(data),\n (data) => this.invalidateData(data),\n );\n }\n\n optimisticUpdate(mutationData: Data) {\n if (!this.normalizer) {\n return;\n }\n\n const queriesToUpdate = this.normalizer.getQueriesToUpdate(mutationData);\n\n queriesToUpdate.forEach((query) => {\n const queryKey = JSON.parse(query.queryKey) as QueryKey;\n\n const cachedQuery = this.queryClient.getQueryCache().find({queryKey});\n\n const dataUpdatedAt = cachedQuery?.state.dataUpdatedAt;\n const isInvalidated = cachedQuery?.state.isInvalidated;\n const error = cachedQuery?.state.error;\n const status = cachedQuery?.state.status;\n\n this.queryClient.setQueryData(queryKey, () => query.data, {\n updatedAt: dataUpdatedAt,\n });\n\n cachedQuery?.setState({isInvalidated, error, status});\n });\n }\n\n invalidateData(data: Data): void {\n if (!this.normalizer) {\n return;\n }\n\n const queriesToUpdate = this.normalizer.getQueriesToUpdate(data);\n\n queriesToUpdate.forEach((query) => {\n const queryKey = JSON.parse(query.queryKey) as QueryKey;\n this.queryClient.invalidateQueries({queryKey});\n });\n }\n\n invalidateTag(tag: DataSourceTag, invalidateOptions?: InvalidateOptions) {\n return this.invalidateQueries(\n {\n predicate: ({queryKey}) => hasTag(queryKey, tag),\n },\n invalidateOptions,\n );\n }\n\n invalidateTags(tags: DataSourceTag[], invalidateOptions?: InvalidateOptions) {\n return this.invalidateQueries(\n {\n predicate: ({queryKey}) => tags.every((tag) => hasTag(queryKey, tag)),\n },\n invalidateOptions,\n );\n }\n\n invalidateSource<TDataSource extends AnyDataSource>(\n dataSource: TDataSource,\n invalidateOptions?: InvalidateOptions,\n ) {\n return this.invalidateQueries(\n {\n // First element is a data source name\n queryKey: [dataSource.name],\n },\n invalidateOptions,\n );\n }\n\n resetSource<TDataSource extends AnyDataSource>(dataSource: TDataSource) {\n return this.queryClient.resetQueries({\n // First element is a data source name\n queryKey: [dataSource.name],\n });\n }\n\n invalidateParams<TDataSource extends AnyDataSource>(\n dataSource: TDataSource,\n params: DataSourceParams<TDataSource>,\n invalidateOptions?: InvalidateOptions,\n ) {\n return this.invalidateQueries(\n {\n queryKey: composeFullKey(dataSource, params),\n exact: true,\n },\n invalidateOptions,\n );\n }\n\n resetParams<TDataSource extends AnyDataSource>(\n dataSource: TDataSource,\n params: DataSourceParams<TDataSource>,\n ) {\n return this.queryClient.resetQueries({\n queryKey: composeFullKey(dataSource, params),\n exact: true,\n });\n }\n\n invalidateSourceTags<TDataSource extends AnyDataSource>(\n dataSource: TDataSource,\n params: DataSourceParams<TDataSource>,\n invalidateOptions?: InvalidateOptions,\n ) {\n return this.invalidateQueries(\n {\n // Last element is a full key\n queryKey: composeFullKey(dataSource, params).slice(0, -1),\n },\n invalidateOptions,\n );\n }\n\n protected invalidateQueries(\n filters: InvalidateQueryFilters,\n invalidateOptions?: InvalidateOptions,\n ) {\n const invalidate = () => this.queryClient.invalidateQueries(filters);\n\n this.repeatInvalidate(invalidate, invalidateOptions?.repeat);\n\n return invalidate();\n }\n\n protected repeatInvalidate(invalidate: () => Promise<void>, repeat?: InvalidateRepeatOptions) {\n if (!repeat) {\n return;\n }\n\n for (let i = 1; i <= repeat.count; i++) {\n setTimeout(invalidate, repeat.interval * i);\n }\n }\n\n private createNormalize(\n config: boolean | NormalizerConfig | undefined,\n ): Normalizer | undefined {\n if (!config) {\n return undefined;\n }\n\n if (config === true) {\n return createNormalizer({});\n }\n\n return createNormalizer(config);\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["createNormalizer","QueryClient","composeFullKey","hasTag","checkMutationObjectsKeys","createQueryNormalizer","parseQueryKey","ClientDataManager","_config$defaultOption","_config$defaultOption2","_this","config","arguments","length","undefined","_classCallCheck","queryClient","normalizer","queryNormalizer","normalizerConfig","_objectSpread","defaultOptions","queries","networkMode","mutations","createNormalize","data","optimisticUpdate","invalidateData","_createClass","key","value","mutationData","queryKey","queryData","_this2","optimisticUpdateQuery","queriesToUpdate","getQueriesToUpdate","forEach","query","parsedQueryKey","_this3","invalidateQuery","update","_this4","_ref","_typeof","optimistic","invalidate","globalOptimistic","globalInvalidate","completeness","dependentQueries","getDependentQueries","needsRefetch","queryKeyString","_cachedQuery$meta","cachedQuery","getQueryCache","find","_ref2","meta","_cachedQuery$meta2","_ref3","invalidateTag","tag","invalidateOptions","invalidateQueries","predicate","_ref4","invalidateTags","tags","_ref5","every","invalidateSource","dataSource","name","resetSource","resetQueries","invalidateParams","params","exact","resetParams","invalidateSourceTags","slice","filters","_this5","repeatInvalidate","repeat","i","count","setTimeout","interval","state","fetchStatus","status","isInvalidated","dataUpdatedAt","error","setQueryData","updatedAt","setState"],"sources":["ClientDataManager.ts"],"sourcesContent":["import type {Data} from '@normy/core';\nimport {createNormalizer} from '@normy/core';\nimport type {InvalidateQueryFilters, QueryClientConfig, QueryKey} from '@tanstack/react-query';\nimport {QueryClient} from '@tanstack/react-query';\n\nimport {\n type AnyDataSource,\n type DataManager,\n type DataSourceParams,\n type DataSourceTag,\n type Normalizer,\n type NormalizerConfig,\n composeFullKey,\n hasTag,\n} from '../core';\nimport type {InvalidateOptions, InvalidateRepeatOptions} from '../core/types/DataManagerOptions';\n\nimport type {QueryNormalizer} from './types/normalizer';\nimport {checkMutationObjectsKeys} from './utils/checkMutationObjectsKeys';\nimport {createQueryNormalizer} from './utils/normalize';\nimport {parseQueryKey} from './utils/parseQueryKey';\n\nexport interface ClientDataManagerConfig extends QueryClientConfig {\n normalizerConfig?: NormalizerConfig | boolean;\n}\n\nexport class ClientDataManager implements DataManager {\n readonly queryClient: QueryClient;\n readonly normalizer?: Normalizer | undefined;\n readonly queryNormalizer?: QueryNormalizer | undefined;\n readonly normalizerConfig?: NormalizerConfig | boolean;\n\n constructor(config: ClientDataManagerConfig = {}) {\n this.normalizerConfig = config.normalizerConfig;\n\n this.queryClient = new QueryClient({\n ...config,\n defaultOptions: {\n ...config.defaultOptions,\n queries: {\n networkMode: 'always',\n ...config.defaultOptions?.queries,\n },\n mutations: {\n networkMode: 'always',\n ...config.defaultOptions?.mutations,\n },\n },\n });\n\n this.normalizer = this.createNormalize(config.normalizerConfig);\n this.queryNormalizer = createQueryNormalizer(\n this.normalizer,\n this.queryClient,\n config.normalizerConfig,\n (data) => this.optimisticUpdate(data),\n (data) => this.invalidateData(data),\n );\n }\n\n optimisticUpdate(mutationData: Data, queryKey?: QueryKey, queryData?: Data) {\n if (!this.normalizer) {\n return;\n }\n\n if (queryKey && queryData) {\n this.optimisticUpdateQuery(queryKey, queryData);\n\n return;\n }\n\n const queriesToUpdate = this.normalizer.getQueriesToUpdate(mutationData);\n\n queriesToUpdate.forEach((query) => {\n const parsedQueryKey = parseQueryKey(query.queryKey);\n\n this.optimisticUpdateQuery(parsedQueryKey, query.data);\n });\n }\n\n invalidateData(data: Data, queryKey?: QueryKey): void {\n if (!this.normalizer) {\n return;\n }\n\n if (queryKey) {\n this.invalidateQuery(queryKey);\n\n return;\n }\n\n const queriesToUpdate = this.normalizer.getQueriesToUpdate(data);\n\n queriesToUpdate.forEach((query) => {\n const parsedQueryKey = parseQueryKey(query.queryKey);\n\n this.invalidateQuery(parsedQueryKey);\n });\n }\n\n update(data: Data) {\n if (!this.normalizer) {\n return;\n }\n\n const {optimistic: globalOptimistic, invalidate: globalInvalidate} =\n typeof this.normalizerConfig === 'object'\n ? this.normalizerConfig\n : {optimistic: false, invalidate: false};\n\n const queriesToUpdate = this.normalizer.getQueriesToUpdate(data);\n\n if (queriesToUpdate.length === 0) {\n const completeness = checkMutationObjectsKeys(data, this.normalizer);\n const dependentQueries = this.normalizer.getDependentQueries(data);\n\n if (completeness.needsRefetch) {\n dependentQueries.forEach((queryKeyString) => {\n const parsedQueryKey = parseQueryKey(queryKeyString);\n\n const cachedQuery = this.queryClient\n .getQueryCache()\n .find({queryKey: parsedQueryKey});\n\n const {invalidate} = cachedQuery?.meta ?? {};\n\n if (\n invalidate === true ||\n (invalidate === undefined && globalInvalidate === true)\n ) {\n this.invalidateData(data, parsedQueryKey);\n }\n });\n }\n\n return;\n }\n\n queriesToUpdate.forEach((query) => {\n const parsedQueryKey = parseQueryKey(query.queryKey);\n\n const cachedQuery = this.queryClient.getQueryCache().find({queryKey: parsedQueryKey});\n\n const {optimistic, invalidate} = cachedQuery?.meta ?? {};\n\n if (optimistic === true || (optimistic === undefined && globalOptimistic === true)) {\n this.optimisticUpdate(data, parsedQueryKey, query.data);\n }\n\n if (invalidate === true || (invalidate === undefined && globalInvalidate === true)) {\n this.invalidateData(data, parsedQueryKey);\n }\n });\n }\n\n invalidateTag(tag: DataSourceTag, invalidateOptions?: InvalidateOptions) {\n return this.invalidateQueries(\n {\n predicate: ({queryKey}) => hasTag(queryKey, tag),\n },\n invalidateOptions,\n );\n }\n\n invalidateTags(tags: DataSourceTag[], invalidateOptions?: InvalidateOptions) {\n return this.invalidateQueries(\n {\n predicate: ({queryKey}) => tags.every((tag) => hasTag(queryKey, tag)),\n },\n invalidateOptions,\n );\n }\n\n invalidateSource<TDataSource extends AnyDataSource>(\n dataSource: TDataSource,\n invalidateOptions?: InvalidateOptions,\n ) {\n return this.invalidateQueries(\n {\n // First element is a data source name\n queryKey: [dataSource.name],\n },\n invalidateOptions,\n );\n }\n\n resetSource<TDataSource extends AnyDataSource>(dataSource: TDataSource) {\n return this.queryClient.resetQueries({\n // First element is a data source name\n queryKey: [dataSource.name],\n });\n }\n\n invalidateParams<TDataSource extends AnyDataSource>(\n dataSource: TDataSource,\n params: DataSourceParams<TDataSource>,\n invalidateOptions?: InvalidateOptions,\n ) {\n return this.invalidateQueries(\n {\n queryKey: composeFullKey(dataSource, params),\n exact: true,\n },\n invalidateOptions,\n );\n }\n\n resetParams<TDataSource extends AnyDataSource>(\n dataSource: TDataSource,\n params: DataSourceParams<TDataSource>,\n ) {\n return this.queryClient.resetQueries({\n queryKey: composeFullKey(dataSource, params),\n exact: true,\n });\n }\n\n invalidateSourceTags<TDataSource extends AnyDataSource>(\n dataSource: TDataSource,\n params: DataSourceParams<TDataSource>,\n invalidateOptions?: InvalidateOptions,\n ) {\n return this.invalidateQueries(\n {\n // Last element is a full key\n queryKey: composeFullKey(dataSource, params).slice(0, -1),\n },\n invalidateOptions,\n );\n }\n\n protected invalidateQueries(\n filters: InvalidateQueryFilters,\n invalidateOptions?: InvalidateOptions,\n ) {\n const invalidate = () => this.queryClient.invalidateQueries(filters);\n\n this.repeatInvalidate(invalidate, invalidateOptions?.repeat);\n\n return invalidate();\n }\n\n protected repeatInvalidate(invalidate: () => Promise<void>, repeat?: InvalidateRepeatOptions) {\n if (!repeat) {\n return;\n }\n\n for (let i = 1; i <= repeat.count; i++) {\n setTimeout(invalidate, repeat.interval * i);\n }\n }\n\n private createNormalize(\n config: boolean | NormalizerConfig | undefined,\n ): Normalizer | undefined {\n if (!config) {\n return undefined;\n }\n\n if (config === true) {\n return createNormalizer({});\n }\n\n return createNormalizer(config);\n }\n\n private invalidateQuery(queryKey: QueryKey) {\n const cachedQuery = this.queryClient.getQueryCache().find({queryKey});\n\n if (\n cachedQuery?.state.fetchStatus !== 'fetching' &&\n cachedQuery?.state.status === 'success' &&\n !cachedQuery?.state.isInvalidated\n ) {\n this.queryClient.invalidateQueries({queryKey});\n }\n }\n\n private optimisticUpdateQuery(queryKey: QueryKey, queryData: Data) {\n const cachedQuery = this.queryClient.getQueryCache().find({queryKey});\n\n const dataUpdatedAt = cachedQuery?.state.dataUpdatedAt;\n const isInvalidated = cachedQuery?.state.isInvalidated;\n const error = cachedQuery?.state.error;\n const status = cachedQuery?.state.status;\n\n this.queryClient.setQueryData(queryKey, () => queryData, {\n updatedAt: dataUpdatedAt,\n });\n\n cachedQuery?.setState({isInvalidated, error, status});\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -507,5 +507,150 @@ describe('Normalization Configuration Integration', function () {
507
507
  }, _callee19);
508
508
  })));
509
509
  });
510
+ describe('ClientDataManager.update()', function () {
511
+ it('should work with array of objects for optimistic update', /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee20() {
512
+ var dm, queryKey, initialData, data;
513
+ return _regeneratorRuntime().wrap(function _callee20$(_context20) {
514
+ while (1) switch (_context20.prev = _context20.next) {
515
+ case 0:
516
+ dm = new ClientDataManager({
517
+ normalizerConfig: {
518
+ devLogging: false,
519
+ optimistic: true
520
+ }
521
+ });
522
+ dm.queryNormalizer.subscribe();
523
+ queryKey = ['users'];
524
+ initialData = [{
525
+ id: '1',
526
+ name: 'User 1'
527
+ }, {
528
+ id: '2',
529
+ name: 'User 2'
530
+ }];
531
+ dm.queryClient.setQueryData(queryKey, initialData);
532
+ dm.normalizer.setQuery(JSON.stringify(queryKey), initialData);
533
+
534
+ // Update both objects
535
+ dm.update([{
536
+ id: '1',
537
+ name: 'Updated 1'
538
+ }, {
539
+ id: '2',
540
+ name: 'Updated 2'
541
+ }]);
542
+ data = dm.queryClient.getQueryData(queryKey);
543
+ expect(data[0].name).toBe('Updated 1');
544
+ expect(data[1].name).toBe('Updated 2');
545
+ dm.queryNormalizer.unsubscribe();
546
+ dm.queryClient.clear();
547
+ case 12:
548
+ case "end":
549
+ return _context20.stop();
550
+ }
551
+ }, _callee20);
552
+ })));
553
+ it('should call invalidateData when invalidate option is enabled', /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee21() {
554
+ var dm, queryKey, initialData, cache, invalidateSpy;
555
+ return _regeneratorRuntime().wrap(function _callee21$(_context21) {
556
+ while (1) switch (_context21.prev = _context21.next) {
557
+ case 0:
558
+ dm = new ClientDataManager({
559
+ normalizerConfig: {
560
+ devLogging: false,
561
+ invalidate: true
562
+ }
563
+ });
564
+ dm.queryNormalizer.subscribe();
565
+ queryKey = ['users'];
566
+ initialData = [{
567
+ id: '1',
568
+ name: 'User 1'
569
+ }];
570
+ dm.queryClient.setQueryData(queryKey, initialData);
571
+ dm.normalizer.setQuery(JSON.stringify(queryKey), initialData);
572
+
573
+ // Set query state to success so it can be invalidated
574
+ cache = dm.queryClient.getQueryCache().find({
575
+ queryKey: queryKey
576
+ });
577
+ cache === null || cache === void 0 || cache.setState({
578
+ status: 'success',
579
+ fetchStatus: 'idle',
580
+ isInvalidated: false
581
+ });
582
+ invalidateSpy = jest.spyOn(dm, 'invalidateData');
583
+ dm.update({
584
+ id: '1',
585
+ name: 'Updated'
586
+ });
587
+ expect(invalidateSpy).toHaveBeenCalled();
588
+ invalidateSpy.mockRestore();
589
+ dm.queryNormalizer.unsubscribe();
590
+ dm.queryClient.clear();
591
+ case 14:
592
+ case "end":
593
+ return _context21.stop();
594
+ }
595
+ }, _callee21);
596
+ })));
597
+ it('should trigger refetch when mutation has fewer keys and normy returns empty queriesToUpdate', /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee22() {
598
+ var dm, queryKey, initialData, cache, originalGetQueriesToUpdate, invalidateSpy;
599
+ return _regeneratorRuntime().wrap(function _callee22$(_context22) {
600
+ while (1) switch (_context22.prev = _context22.next) {
601
+ case 0:
602
+ // checkMutationObjectsKeys is called only when getQueriesToUpdate returns []
603
+ // This happens when normy can't compute a diff (e.g., structure mismatch)
604
+ dm = new ClientDataManager({
605
+ normalizerConfig: {
606
+ devLogging: false,
607
+ invalidate: true // Need to enable invalidate for refetch to work
608
+ }
609
+ });
610
+ dm.queryNormalizer.subscribe();
611
+ queryKey = ['users']; // Store data with more keys
612
+ initialData = [{
613
+ id: '1',
614
+ name: 'User 1',
615
+ email: 'user@test.com',
616
+ age: 25
617
+ }];
618
+ dm.queryClient.setQueryData(queryKey, initialData);
619
+ dm.normalizer.setQuery(JSON.stringify(queryKey), initialData);
620
+
621
+ // Set query state to success so it can be invalidated
622
+ cache = dm.queryClient.getQueryCache().find({
623
+ queryKey: queryKey
624
+ });
625
+ cache === null || cache === void 0 || cache.setState({
626
+ status: 'success',
627
+ fetchStatus: 'idle',
628
+ isInvalidated: false
629
+ });
630
+
631
+ // Mock getQueriesToUpdate to return empty array (simulating normy can't compute diff)
632
+ originalGetQueriesToUpdate = dm.normalizer.getQueriesToUpdate;
633
+ dm.normalizer.getQueriesToUpdate = jest.fn().mockReturnValue([]);
634
+ invalidateSpy = jest.spyOn(dm.queryClient, 'invalidateQueries'); // Update with fewer keys - should trigger refetch via checkMutationObjectsKeys
635
+ dm.update({
636
+ id: '1',
637
+ name: 'Updated'
638
+ });
639
+
640
+ // Check if invalidation was triggered due to fewer keys
641
+ expect(invalidateSpy).toHaveBeenCalled();
642
+
643
+ // Restore mocks
644
+ dm.normalizer.getQueriesToUpdate = originalGetQueriesToUpdate;
645
+ invalidateSpy.mockRestore();
646
+ dm.queryNormalizer.unsubscribe();
647
+ dm.queryClient.clear();
648
+ case 17:
649
+ case "end":
650
+ return _context22.stop();
651
+ }
652
+ }, _callee22);
653
+ })));
654
+ });
510
655
  });
511
656
  // #sourceMappingURL=threeLevelIntegration.test.js.map