@apollo/client 3.5.0-rc.2 → 3.5.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 (84) hide show
  1. package/apollo-client.cjs +601 -563
  2. package/apollo-client.cjs.map +1 -1
  3. package/apollo-client.min.cjs +1 -1
  4. package/cache/cache.cjs +545 -523
  5. package/cache/cache.cjs.map +1 -1
  6. package/cache/inmemory/key-extractor.d.ts +9 -0
  7. package/cache/inmemory/key-extractor.d.ts.map +1 -0
  8. package/cache/inmemory/key-extractor.js +118 -0
  9. package/cache/inmemory/key-extractor.js.map +1 -0
  10. package/cache/inmemory/policies.d.ts +11 -8
  11. package/cache/inmemory/policies.d.ts.map +1 -1
  12. package/cache/inmemory/policies.js +42 -156
  13. package/cache/inmemory/policies.js.map +1 -1
  14. package/cache/inmemory/writeToStore.d.ts.map +1 -1
  15. package/cache/inmemory/writeToStore.js +44 -22
  16. package/cache/inmemory/writeToStore.js.map +1 -1
  17. package/core/ApolloClient.d.ts +1 -0
  18. package/core/ApolloClient.d.ts.map +1 -1
  19. package/core/ObservableQuery.d.ts +1 -0
  20. package/core/ObservableQuery.d.ts.map +1 -1
  21. package/core/QueryInfo.d.ts +2 -2
  22. package/core/QueryInfo.d.ts.map +1 -1
  23. package/core/QueryManager.d.ts +1 -0
  24. package/core/QueryManager.d.ts.map +1 -1
  25. package/core/QueryManager.js +1 -1
  26. package/core/QueryManager.js.map +1 -1
  27. package/core/core.cjs +2 -2
  28. package/core/core.cjs.map +1 -1
  29. package/invariantErrorCodes.js +5 -5
  30. package/link/batch/batchLink.d.ts +1 -0
  31. package/link/batch/batchLink.d.ts.map +1 -1
  32. package/link/batch/batching.d.ts +1 -0
  33. package/link/batch/batching.d.ts.map +1 -1
  34. package/link/batch-http/batchHttpLink.d.ts +1 -0
  35. package/link/batch-http/batchHttpLink.d.ts.map +1 -1
  36. package/link/core/ApolloLink.d.ts +1 -0
  37. package/link/core/ApolloLink.d.ts.map +1 -1
  38. package/link/core/types.d.ts +5 -6
  39. package/link/core/types.d.ts.map +1 -1
  40. package/link/core/types.js.map +1 -1
  41. package/link/error/index.d.ts +1 -0
  42. package/link/error/index.d.ts.map +1 -1
  43. package/link/retry/retryLink.d.ts +1 -0
  44. package/link/retry/retryLink.d.ts.map +1 -1
  45. package/link/schema/index.d.ts +1 -0
  46. package/link/schema/index.d.ts.map +1 -1
  47. package/link/schema/index.js +8 -1
  48. package/link/schema/index.js.map +1 -1
  49. package/link/schema/schema.cjs +8 -1
  50. package/link/schema/schema.cjs.map +1 -1
  51. package/link/utils/fromError.d.ts +1 -0
  52. package/link/utils/fromError.d.ts.map +1 -1
  53. package/link/utils/fromPromise.d.ts +1 -0
  54. package/link/utils/fromPromise.d.ts.map +1 -1
  55. package/link/utils/toPromise.d.ts +1 -0
  56. package/link/utils/toPromise.d.ts.map +1 -1
  57. package/link/ws/index.d.ts +1 -0
  58. package/link/ws/index.d.ts.map +1 -1
  59. package/package.json +18 -18
  60. package/react/hooks/hooks.cjs +67 -51
  61. package/react/hooks/hooks.cjs.map +1 -1
  62. package/react/hooks/useMutation.d.ts.map +1 -1
  63. package/react/hooks/useMutation.js +68 -52
  64. package/react/hooks/useMutation.js.map +1 -1
  65. package/react/types/types.d.ts +1 -0
  66. package/react/types/types.d.ts.map +1 -1
  67. package/testing/core/mocking/mockLink.d.ts +1 -0
  68. package/testing/core/mocking/mockLink.d.ts.map +1 -1
  69. package/testing/core/mocking/mockSubscriptionLink.d.ts +2 -3
  70. package/testing/core/mocking/mockSubscriptionLink.d.ts.map +1 -1
  71. package/utilities/common/errorHandling.d.ts +1 -1
  72. package/utilities/common/errorHandling.d.ts.map +1 -1
  73. package/utilities/common/errorHandling.js.map +1 -1
  74. package/utilities/graphql/fragments.d.ts.map +1 -1
  75. package/utilities/graphql/fragments.js.map +1 -1
  76. package/utilities/graphql/transform.d.ts.map +1 -1
  77. package/utilities/graphql/transform.js.map +1 -1
  78. package/utilities/observables/Concast.d.ts +1 -0
  79. package/utilities/observables/Concast.d.ts.map +1 -1
  80. package/utilities/observables/asyncMap.d.ts +1 -0
  81. package/utilities/observables/asyncMap.d.ts.map +1 -1
  82. package/utilities/observables/subclassing.d.ts +1 -0
  83. package/utilities/observables/subclassing.d.ts.map +1 -1
  84. package/version.js +1 -1
package/cache/cache.cjs CHANGED
@@ -1005,376 +1005,6 @@ function assertSelectionSetForIdValue(store, field, fieldValue) {
1005
1005
  }
1006
1006
  }
1007
1007
 
1008
- function getContextFlavor(context, clientOnly, deferred) {
1009
- var key = "" + clientOnly + deferred;
1010
- var flavored = context.flavors.get(key);
1011
- if (!flavored) {
1012
- context.flavors.set(key, flavored = (context.clientOnly === clientOnly &&
1013
- context.deferred === deferred) ? context : tslib.__assign(tslib.__assign({}, context), { clientOnly: clientOnly, deferred: deferred }));
1014
- }
1015
- return flavored;
1016
- }
1017
- var StoreWriter = (function () {
1018
- function StoreWriter(cache, reader) {
1019
- this.cache = cache;
1020
- this.reader = reader;
1021
- }
1022
- StoreWriter.prototype.writeToStore = function (store, _a) {
1023
- var _this = this;
1024
- var query = _a.query, result = _a.result, dataId = _a.dataId, variables = _a.variables, overwrite = _a.overwrite;
1025
- var operationDefinition = utilities.getOperationDefinition(query);
1026
- var merger = makeProcessedFieldsMerger();
1027
- variables = tslib.__assign(tslib.__assign({}, utilities.getDefaultValues(operationDefinition)), variables);
1028
- var context = {
1029
- store: store,
1030
- written: Object.create(null),
1031
- merge: function (existing, incoming) {
1032
- return merger.merge(existing, incoming);
1033
- },
1034
- variables: variables,
1035
- varString: canonicalStringify(variables),
1036
- fragmentMap: utilities.createFragmentMap(utilities.getFragmentDefinitions(query)),
1037
- overwrite: !!overwrite,
1038
- incomingById: new Map,
1039
- clientOnly: false,
1040
- deferred: false,
1041
- flavors: new Map,
1042
- };
1043
- var ref = this.processSelectionSet({
1044
- result: result || Object.create(null),
1045
- dataId: dataId,
1046
- selectionSet: operationDefinition.selectionSet,
1047
- mergeTree: { map: new Map },
1048
- context: context,
1049
- });
1050
- if (!utilities.isReference(ref)) {
1051
- throw __DEV__ ? new globals.InvariantError("Could not identify object " + JSON.stringify(result)) : new globals.InvariantError(6);
1052
- }
1053
- context.incomingById.forEach(function (_a, dataId) {
1054
- var storeObject = _a.storeObject, mergeTree = _a.mergeTree, fieldNodeSet = _a.fieldNodeSet;
1055
- var entityRef = utilities.makeReference(dataId);
1056
- if (mergeTree && mergeTree.map.size) {
1057
- var applied = _this.applyMerges(mergeTree, entityRef, storeObject, context);
1058
- if (utilities.isReference(applied)) {
1059
- return;
1060
- }
1061
- storeObject = applied;
1062
- }
1063
- if (__DEV__ && !context.overwrite) {
1064
- var fieldsWithSelectionSets_1 = Object.create(null);
1065
- fieldNodeSet.forEach(function (field) {
1066
- if (field.selectionSet) {
1067
- fieldsWithSelectionSets_1[field.name.value] = true;
1068
- }
1069
- });
1070
- var hasSelectionSet_1 = function (storeFieldName) {
1071
- return fieldsWithSelectionSets_1[fieldNameFromStoreName(storeFieldName)] === true;
1072
- };
1073
- var hasMergeFunction_1 = function (storeFieldName) {
1074
- var childTree = mergeTree && mergeTree.map.get(storeFieldName);
1075
- return Boolean(childTree && childTree.info && childTree.info.merge);
1076
- };
1077
- Object.keys(storeObject).forEach(function (storeFieldName) {
1078
- if (hasSelectionSet_1(storeFieldName) &&
1079
- !hasMergeFunction_1(storeFieldName)) {
1080
- warnAboutDataLoss(entityRef, storeObject, storeFieldName, context.store);
1081
- }
1082
- });
1083
- }
1084
- store.merge(dataId, storeObject);
1085
- });
1086
- store.retain(ref.__ref);
1087
- return ref;
1088
- };
1089
- StoreWriter.prototype.processSelectionSet = function (_a) {
1090
- var _this = this;
1091
- var dataId = _a.dataId, result = _a.result, selectionSet = _a.selectionSet, context = _a.context, mergeTree = _a.mergeTree;
1092
- var policies = this.cache.policies;
1093
- var _b = policies.identify(result, selectionSet, context.fragmentMap), id = _b[0], keyObject = _b[1];
1094
- dataId = dataId || id;
1095
- if ("string" === typeof dataId) {
1096
- var sets = context.written[dataId] || (context.written[dataId] = []);
1097
- var ref = utilities.makeReference(dataId);
1098
- if (sets.indexOf(selectionSet) >= 0)
1099
- return ref;
1100
- sets.push(selectionSet);
1101
- if (this.reader && this.reader.isFresh(result, ref, selectionSet, context)) {
1102
- return ref;
1103
- }
1104
- }
1105
- var incoming = Object.create(null);
1106
- if (keyObject) {
1107
- incoming = context.merge(incoming, keyObject);
1108
- }
1109
- var typename = (dataId && policies.rootTypenamesById[dataId]) ||
1110
- utilities.getTypenameFromResult(result, selectionSet, context.fragmentMap) ||
1111
- (dataId && context.store.get(dataId, "__typename"));
1112
- if ("string" === typeof typename) {
1113
- incoming.__typename = typename;
1114
- }
1115
- var fieldNodeSet = new Set();
1116
- this.flattenFields(selectionSet, result, context, typename).forEach(function (context, field) {
1117
- var _a;
1118
- var resultFieldKey = utilities.resultKeyNameFromField(field);
1119
- var value = result[resultFieldKey];
1120
- fieldNodeSet.add(field);
1121
- if (value !== void 0) {
1122
- var storeFieldName = policies.getStoreFieldName({
1123
- typename: typename,
1124
- fieldName: field.name.value,
1125
- field: field,
1126
- variables: context.variables,
1127
- });
1128
- var childTree = getChildMergeTree(mergeTree, storeFieldName);
1129
- var incomingValue = _this.processFieldValue(value, field, field.selectionSet
1130
- ? getContextFlavor(context, false, false)
1131
- : context, childTree);
1132
- var childTypename = void 0;
1133
- if (field.selectionSet) {
1134
- childTypename = context.store.getFieldValue(incomingValue, "__typename");
1135
- if (!childTypename && utilities.isReference(incomingValue)) {
1136
- var info = context.incomingById.get(incomingValue.__ref);
1137
- childTypename = info && info.storeObject.__typename;
1138
- }
1139
- }
1140
- var merge = policies.getMergeFunction(typename, field.name.value, childTypename);
1141
- if (merge) {
1142
- childTree.info = {
1143
- field: field,
1144
- typename: typename,
1145
- merge: merge,
1146
- };
1147
- }
1148
- else {
1149
- maybeRecycleChildMergeTree(mergeTree, storeFieldName);
1150
- }
1151
- incoming = context.merge(incoming, (_a = {},
1152
- _a[storeFieldName] = incomingValue,
1153
- _a));
1154
- }
1155
- else if (__DEV__ &&
1156
- !context.clientOnly &&
1157
- !context.deferred &&
1158
- !utilities.addTypenameToDocument.added(field) &&
1159
- !policies.getReadFunction(typename, field.name.value)) {
1160
- __DEV__ && globals.invariant.error(("Missing field '" + utilities.resultKeyNameFromField(field) + "' while writing result " + JSON.stringify(result, null, 2)).substring(0, 1000));
1161
- }
1162
- });
1163
- if ("string" === typeof dataId) {
1164
- var previous_1 = context.incomingById.get(dataId);
1165
- if (previous_1) {
1166
- previous_1.storeObject = context.merge(previous_1.storeObject, incoming);
1167
- previous_1.mergeTree = mergeMergeTrees(previous_1.mergeTree, mergeTree);
1168
- fieldNodeSet.forEach(function (field) { return previous_1.fieldNodeSet.add(field); });
1169
- }
1170
- else {
1171
- context.incomingById.set(dataId, {
1172
- storeObject: incoming,
1173
- mergeTree: mergeTreeIsEmpty(mergeTree) ? void 0 : mergeTree,
1174
- fieldNodeSet: fieldNodeSet,
1175
- });
1176
- }
1177
- return utilities.makeReference(dataId);
1178
- }
1179
- return incoming;
1180
- };
1181
- StoreWriter.prototype.processFieldValue = function (value, field, context, mergeTree) {
1182
- var _this = this;
1183
- if (!field.selectionSet || value === null) {
1184
- return __DEV__ ? utilities.cloneDeep(value) : value;
1185
- }
1186
- if (Array.isArray(value)) {
1187
- return value.map(function (item, i) {
1188
- var value = _this.processFieldValue(item, field, context, getChildMergeTree(mergeTree, i));
1189
- maybeRecycleChildMergeTree(mergeTree, i);
1190
- return value;
1191
- });
1192
- }
1193
- return this.processSelectionSet({
1194
- result: value,
1195
- selectionSet: field.selectionSet,
1196
- context: context,
1197
- mergeTree: mergeTree,
1198
- });
1199
- };
1200
- StoreWriter.prototype.flattenFields = function (selectionSet, result, context, typename) {
1201
- if (typename === void 0) { typename = utilities.getTypenameFromResult(result, selectionSet, context.fragmentMap); }
1202
- var fieldMap = new Map();
1203
- var policies = this.cache.policies;
1204
- var limitingTrie = new trie.Trie(false);
1205
- (function flatten(selectionSet, inheritedContext) {
1206
- var visitedNode = limitingTrie.lookup(selectionSet, inheritedContext.clientOnly, inheritedContext.deferred);
1207
- if (visitedNode.visited)
1208
- return;
1209
- visitedNode.visited = true;
1210
- selectionSet.selections.forEach(function (selection) {
1211
- if (!utilities.shouldInclude(selection, context.variables))
1212
- return;
1213
- var clientOnly = inheritedContext.clientOnly, deferred = inheritedContext.deferred;
1214
- if (!(clientOnly && deferred) &&
1215
- utilities.isNonEmptyArray(selection.directives)) {
1216
- selection.directives.forEach(function (dir) {
1217
- var name = dir.name.value;
1218
- if (name === "client")
1219
- clientOnly = true;
1220
- if (name === "defer") {
1221
- var args = utilities.argumentsObjectFromField(dir, context.variables);
1222
- if (!args || args.if !== false) {
1223
- deferred = true;
1224
- }
1225
- }
1226
- });
1227
- }
1228
- if (utilities.isField(selection)) {
1229
- var existing = fieldMap.get(selection);
1230
- if (existing) {
1231
- clientOnly = clientOnly && existing.clientOnly;
1232
- deferred = deferred && existing.deferred;
1233
- }
1234
- fieldMap.set(selection, getContextFlavor(context, clientOnly, deferred));
1235
- }
1236
- else {
1237
- var fragment = utilities.getFragmentFromSelection(selection, context.fragmentMap);
1238
- if (fragment &&
1239
- policies.fragmentMatches(fragment, typename, result, context.variables)) {
1240
- flatten(fragment.selectionSet, getContextFlavor(context, clientOnly, deferred));
1241
- }
1242
- }
1243
- });
1244
- })(selectionSet, context);
1245
- return fieldMap;
1246
- };
1247
- StoreWriter.prototype.applyMerges = function (mergeTree, existing, incoming, context, getStorageArgs) {
1248
- var _a;
1249
- var _this = this;
1250
- if (mergeTree.map.size && !utilities.isReference(incoming)) {
1251
- var e_1 = (!Array.isArray(incoming) &&
1252
- (utilities.isReference(existing) || storeValueIsStoreObject(existing))) ? existing : void 0;
1253
- var i_1 = incoming;
1254
- if (e_1 && !getStorageArgs) {
1255
- getStorageArgs = [utilities.isReference(e_1) ? e_1.__ref : e_1];
1256
- }
1257
- var changedFields_1;
1258
- var getValue_1 = function (from, name) {
1259
- return Array.isArray(from)
1260
- ? (typeof name === "number" ? from[name] : void 0)
1261
- : context.store.getFieldValue(from, String(name));
1262
- };
1263
- mergeTree.map.forEach(function (childTree, storeFieldName) {
1264
- var eVal = getValue_1(e_1, storeFieldName);
1265
- var iVal = getValue_1(i_1, storeFieldName);
1266
- if (void 0 === iVal)
1267
- return;
1268
- if (getStorageArgs) {
1269
- getStorageArgs.push(storeFieldName);
1270
- }
1271
- var aVal = _this.applyMerges(childTree, eVal, iVal, context, getStorageArgs);
1272
- if (aVal !== iVal) {
1273
- changedFields_1 = changedFields_1 || new Map;
1274
- changedFields_1.set(storeFieldName, aVal);
1275
- }
1276
- if (getStorageArgs) {
1277
- globals.invariant(getStorageArgs.pop() === storeFieldName);
1278
- }
1279
- });
1280
- if (changedFields_1) {
1281
- incoming = (Array.isArray(i_1) ? i_1.slice(0) : tslib.__assign({}, i_1));
1282
- changedFields_1.forEach(function (value, name) {
1283
- incoming[name] = value;
1284
- });
1285
- }
1286
- }
1287
- if (mergeTree.info) {
1288
- return this.cache.policies.runMergeFunction(existing, incoming, mergeTree.info, context, getStorageArgs && (_a = context.store).getStorage.apply(_a, getStorageArgs));
1289
- }
1290
- return incoming;
1291
- };
1292
- return StoreWriter;
1293
- }());
1294
- var emptyMergeTreePool = [];
1295
- function getChildMergeTree(_a, name) {
1296
- var map = _a.map;
1297
- if (!map.has(name)) {
1298
- map.set(name, emptyMergeTreePool.pop() || { map: new Map });
1299
- }
1300
- return map.get(name);
1301
- }
1302
- function mergeMergeTrees(left, right) {
1303
- if (left === right || !right || mergeTreeIsEmpty(right))
1304
- return left;
1305
- if (!left || mergeTreeIsEmpty(left))
1306
- return right;
1307
- var info = left.info && right.info ? tslib.__assign(tslib.__assign({}, left.info), right.info) : left.info || right.info;
1308
- var needToMergeMaps = left.map.size && right.map.size;
1309
- var map = needToMergeMaps ? new Map :
1310
- left.map.size ? left.map : right.map;
1311
- var merged = { info: info, map: map };
1312
- if (needToMergeMaps) {
1313
- var remainingRightKeys_1 = new Set(right.map.keys());
1314
- left.map.forEach(function (leftTree, key) {
1315
- merged.map.set(key, mergeMergeTrees(leftTree, right.map.get(key)));
1316
- remainingRightKeys_1.delete(key);
1317
- });
1318
- remainingRightKeys_1.forEach(function (key) {
1319
- merged.map.set(key, mergeMergeTrees(right.map.get(key), left.map.get(key)));
1320
- });
1321
- }
1322
- return merged;
1323
- }
1324
- function mergeTreeIsEmpty(tree) {
1325
- return !tree || !(tree.info || tree.map.size);
1326
- }
1327
- function maybeRecycleChildMergeTree(_a, name) {
1328
- var map = _a.map;
1329
- var childTree = map.get(name);
1330
- if (childTree && mergeTreeIsEmpty(childTree)) {
1331
- emptyMergeTreePool.push(childTree);
1332
- map.delete(name);
1333
- }
1334
- }
1335
- var warnings = new Set();
1336
- function warnAboutDataLoss(existingRef, incomingObj, storeFieldName, store) {
1337
- var getChild = function (objOrRef) {
1338
- var child = store.getFieldValue(objOrRef, storeFieldName);
1339
- return typeof child === "object" && child;
1340
- };
1341
- var existing = getChild(existingRef);
1342
- if (!existing)
1343
- return;
1344
- var incoming = getChild(incomingObj);
1345
- if (!incoming)
1346
- return;
1347
- if (utilities.isReference(existing))
1348
- return;
1349
- if (equality.equal(existing, incoming))
1350
- return;
1351
- if (Object.keys(existing).every(function (key) { return store.getFieldValue(incoming, key) !== void 0; })) {
1352
- return;
1353
- }
1354
- var parentType = store.getFieldValue(existingRef, "__typename") ||
1355
- store.getFieldValue(incomingObj, "__typename");
1356
- var fieldName = fieldNameFromStoreName(storeFieldName);
1357
- var typeDotName = parentType + "." + fieldName;
1358
- if (warnings.has(typeDotName))
1359
- return;
1360
- warnings.add(typeDotName);
1361
- var childTypenames = [];
1362
- if (!Array.isArray(existing) &&
1363
- !Array.isArray(incoming)) {
1364
- [existing, incoming].forEach(function (child) {
1365
- var typename = store.getFieldValue(child, "__typename");
1366
- if (typeof typename === "string" &&
1367
- !childTypenames.includes(typename)) {
1368
- childTypenames.push(typename);
1369
- }
1370
- });
1371
- }
1372
- __DEV__ && globals.invariant.warn("Cache data may be lost when replacing the " + fieldName + " field of a " + parentType + " object.\n\nTo address this problem (which is not a bug in Apollo Client), " + (childTypenames.length
1373
- ? "either ensure all objects of type " +
1374
- childTypenames.join(" and ") + " have an ID or a custom merge function, or "
1375
- : "") + "define a custom merge function for the " + typeDotName + " field, so InMemoryCache can safely merge these objects:\n\n existing: " + JSON.stringify(existing).slice(0, 1000) + "\n incoming: " + JSON.stringify(incoming).slice(0, 1000) + "\n\nFor more information about these options, please refer to the documentation:\n\n * Ensuring entity objects have IDs: https://go.apollo.dev/c/generating-unique-identifiers\n * Defining custom merge functions: https://go.apollo.dev/c/merging-non-normalized-objects\n");
1376
- }
1377
-
1378
1008
  var cacheSlot = new context.Slot();
1379
1009
  var cacheInfoMap = new WeakMap();
1380
1010
  function getCacheInfo(cache) {
@@ -1438,6 +1068,121 @@ function broadcast(cache) {
1438
1068
  }
1439
1069
  }
1440
1070
 
1071
+ var specifierInfoCache = Object.create(null);
1072
+ function lookupSpecifierInfo(spec) {
1073
+ var cacheKey = JSON.stringify(spec);
1074
+ return specifierInfoCache[cacheKey] ||
1075
+ (specifierInfoCache[cacheKey] = Object.create(null));
1076
+ }
1077
+ function keyFieldsFnFromSpecifier(specifier) {
1078
+ var info = lookupSpecifierInfo(specifier);
1079
+ return info.keyFieldsFn || (info.keyFieldsFn = function (object, context) {
1080
+ var extract = function (from, key) { return context.readField(key, from); };
1081
+ var keyObject = context.keyObject = collectSpecifierPaths(specifier, function (schemaKeyPath) {
1082
+ var extracted = extractKeyPath(context.storeObject, schemaKeyPath, extract);
1083
+ if (extracted === void 0 &&
1084
+ object !== context.storeObject &&
1085
+ hasOwn.call(object, schemaKeyPath[0])) {
1086
+ extracted = extractKeyPath(object, schemaKeyPath, extractKey);
1087
+ }
1088
+ __DEV__ ? globals.invariant(extracted !== void 0, "Missing field '" + schemaKeyPath.join('.') + "' while extracting keyFields from " + JSON.stringify(object)) : globals.invariant(extracted !== void 0, 2);
1089
+ return extracted;
1090
+ });
1091
+ return context.typename + ":" + JSON.stringify(keyObject);
1092
+ });
1093
+ }
1094
+ function keyArgsFnFromSpecifier(specifier) {
1095
+ var info = lookupSpecifierInfo(specifier);
1096
+ return info.keyArgsFn || (info.keyArgsFn = function (args, _a) {
1097
+ var field = _a.field, variables = _a.variables, fieldName = _a.fieldName;
1098
+ var collected = collectSpecifierPaths(specifier, function (keyPath) {
1099
+ var firstKey = keyPath[0];
1100
+ var firstChar = firstKey.charAt(0);
1101
+ if (firstChar === "@") {
1102
+ if (field && utilities.isNonEmptyArray(field.directives)) {
1103
+ var directiveName_1 = firstKey.slice(1);
1104
+ var d = field.directives.find(function (d) { return d.name.value === directiveName_1; });
1105
+ var directiveArgs = d && utilities.argumentsObjectFromField(d, variables);
1106
+ return directiveArgs && extractKeyPath(directiveArgs, keyPath.slice(1));
1107
+ }
1108
+ return;
1109
+ }
1110
+ if (firstChar === "$") {
1111
+ var variableName = firstKey.slice(1);
1112
+ if (variables && hasOwn.call(variables, variableName)) {
1113
+ var varKeyPath = keyPath.slice(0);
1114
+ varKeyPath[0] = variableName;
1115
+ return extractKeyPath(variables, varKeyPath);
1116
+ }
1117
+ return;
1118
+ }
1119
+ if (args) {
1120
+ return extractKeyPath(args, keyPath);
1121
+ }
1122
+ });
1123
+ var suffix = JSON.stringify(collected);
1124
+ if (args || suffix !== "{}") {
1125
+ fieldName += ":" + suffix;
1126
+ }
1127
+ return fieldName;
1128
+ });
1129
+ }
1130
+ function collectSpecifierPaths(specifier, extractor) {
1131
+ var merger = new utilities.DeepMerger;
1132
+ return getSpecifierPaths(specifier).reduce(function (collected, path) {
1133
+ var _a;
1134
+ var toMerge = extractor(path);
1135
+ if (toMerge !== void 0) {
1136
+ for (var i = path.length - 1; i >= 0; --i) {
1137
+ toMerge = (_a = {}, _a[path[i]] = toMerge, _a);
1138
+ }
1139
+ collected = merger.merge(collected, toMerge);
1140
+ }
1141
+ return collected;
1142
+ }, Object.create(null));
1143
+ }
1144
+ function getSpecifierPaths(spec) {
1145
+ var info = lookupSpecifierInfo(spec);
1146
+ if (!info.paths) {
1147
+ var paths_1 = info.paths = [];
1148
+ var currentPath_1 = [];
1149
+ spec.forEach(function (s, i) {
1150
+ if (Array.isArray(s)) {
1151
+ getSpecifierPaths(s).forEach(function (p) { return paths_1.push(currentPath_1.concat(p)); });
1152
+ currentPath_1.length = 0;
1153
+ }
1154
+ else {
1155
+ currentPath_1.push(s);
1156
+ if (!Array.isArray(spec[i + 1])) {
1157
+ paths_1.push(currentPath_1.slice(0));
1158
+ currentPath_1.length = 0;
1159
+ }
1160
+ }
1161
+ });
1162
+ }
1163
+ return info.paths;
1164
+ }
1165
+ function extractKey(object, key) {
1166
+ return object[key];
1167
+ }
1168
+ function extractKeyPath(object, path, extract) {
1169
+ extract = extract || extractKey;
1170
+ return normalize(path.reduce(function reducer(obj, key) {
1171
+ return Array.isArray(obj)
1172
+ ? obj.map(function (child) { return reducer(child, key); })
1173
+ : obj && extract(obj, key);
1174
+ }, object));
1175
+ }
1176
+ function normalize(value) {
1177
+ if (utilities.isNonNullObject(value)) {
1178
+ if (Array.isArray(value)) {
1179
+ return value.map(normalize);
1180
+ }
1181
+ return collectSpecifierPaths(Object.keys(value).sort(), function (path) { return extractKeyPath(value, path); });
1182
+ }
1183
+ return value;
1184
+ }
1185
+
1441
1186
  utilities.getStoreKeyName.setStringify(canonicalStringify);
1442
1187
  function argsFromFieldSpecifier(spec) {
1443
1188
  return spec.args !== void 0 ? spec.args :
@@ -1472,18 +1217,22 @@ var Policies = (function () {
1472
1217
  this.addTypePolicies(config.typePolicies);
1473
1218
  }
1474
1219
  }
1475
- Policies.prototype.identify = function (object, selectionSet, fragmentMap) {
1476
- var typename = selectionSet && fragmentMap
1477
- ? utilities.getTypenameFromResult(object, selectionSet, fragmentMap)
1478
- : object.__typename;
1220
+ Policies.prototype.identify = function (object, partialContext) {
1221
+ var _a;
1222
+ var policies = this;
1223
+ var typename = partialContext && (partialContext.typename ||
1224
+ ((_a = partialContext.storeObject) === null || _a === void 0 ? void 0 : _a.__typename)) || object.__typename;
1479
1225
  if (typename === this.rootTypenamesById.ROOT_QUERY) {
1480
1226
  return ["ROOT_QUERY"];
1481
1227
  }
1482
- var context = {
1483
- typename: typename,
1484
- selectionSet: selectionSet,
1485
- fragmentMap: fragmentMap,
1486
- };
1228
+ var storeObject = partialContext && partialContext.storeObject || object;
1229
+ var context = tslib.__assign(tslib.__assign({}, partialContext), { typename: typename, storeObject: storeObject, readField: partialContext && partialContext.readField || function () {
1230
+ var options = normalizeReadFieldOptions(arguments, storeObject);
1231
+ return policies.readField(options, {
1232
+ store: policies.cache["data"],
1233
+ variables: options.variables,
1234
+ });
1235
+ } });
1487
1236
  var id;
1488
1237
  var policy = typename && this.getTypePolicy(typename);
1489
1238
  var keyFn = policy && policy.keyFn || this.config.dataIdFromObject;
@@ -1565,7 +1314,7 @@ var Policies = (function () {
1565
1314
  var rootId = "ROOT_" + which.toUpperCase();
1566
1315
  var old = this.rootTypenamesById[rootId];
1567
1316
  if (typename !== old) {
1568
- __DEV__ ? globals.invariant(!old || old === which, "Cannot change root " + which + " __typename more than once") : globals.invariant(!old || old === which, 2);
1317
+ __DEV__ ? globals.invariant(!old || old === which, "Cannot change root " + which + " __typename more than once") : globals.invariant(!old || old === which, 3);
1569
1318
  if (old)
1570
1319
  delete this.rootIdsByTypename[old];
1571
1320
  this.rootIdsByTypename[typename] = rootId;
@@ -1781,39 +1530,39 @@ function makeFieldFunctionOptions(policies, objectOrReference, fieldSpec, contex
1781
1530
  storage: storage,
1782
1531
  cache: policies.cache,
1783
1532
  canRead: canRead,
1784
- readField: function (fieldNameOrOptions, from) {
1785
- var options;
1786
- if (typeof fieldNameOrOptions === "string") {
1787
- options = {
1788
- fieldName: fieldNameOrOptions,
1789
- from: arguments.length > 1 ? from : objectOrReference,
1790
- };
1791
- }
1792
- else if (utilities.isNonNullObject(fieldNameOrOptions)) {
1793
- options = tslib.__assign({}, fieldNameOrOptions);
1794
- if (!hasOwn.call(fieldNameOrOptions, "from")) {
1795
- options.from = objectOrReference;
1796
- }
1797
- }
1798
- else {
1799
- __DEV__ && globals.invariant.warn("Unexpected readField arguments: " + utilities.stringifyForDisplay(Array.from(arguments)));
1800
- return;
1801
- }
1802
- if (__DEV__ && options.from === void 0) {
1803
- __DEV__ && globals.invariant.warn("Undefined 'from' passed to readField with arguments " + utilities.stringifyForDisplay(Array.from(arguments)));
1804
- }
1805
- if (void 0 === options.variables) {
1806
- options.variables = variables;
1807
- }
1808
- return policies.readField(options, context);
1533
+ readField: function () {
1534
+ return policies.readField(normalizeReadFieldOptions(arguments, objectOrReference, context), context);
1809
1535
  },
1810
1536
  mergeObjects: makeMergeObjectsFunction(context.store),
1811
1537
  };
1812
1538
  }
1539
+ function normalizeReadFieldOptions(readFieldArgs, objectOrReference, variables) {
1540
+ var fieldNameOrOptions = readFieldArgs[0], from = readFieldArgs[1], argc = readFieldArgs.length;
1541
+ var options;
1542
+ if (typeof fieldNameOrOptions === "string") {
1543
+ options = {
1544
+ fieldName: fieldNameOrOptions,
1545
+ from: argc > 1 ? from : objectOrReference,
1546
+ };
1547
+ }
1548
+ else {
1549
+ options = tslib.__assign({}, fieldNameOrOptions);
1550
+ if (!hasOwn.call(options, "from")) {
1551
+ options.from = objectOrReference;
1552
+ }
1553
+ }
1554
+ if (__DEV__ && options.from === void 0) {
1555
+ __DEV__ && globals.invariant.warn("Undefined 'from' passed to readField with arguments " + utilities.stringifyForDisplay(Array.from(readFieldArgs)));
1556
+ }
1557
+ if (void 0 === options.variables) {
1558
+ options.variables = variables;
1559
+ }
1560
+ return options;
1561
+ }
1813
1562
  function makeMergeObjectsFunction(store) {
1814
1563
  return function mergeObjects(existing, incoming) {
1815
1564
  if (Array.isArray(existing) || Array.isArray(incoming)) {
1816
- throw __DEV__ ? new globals.InvariantError("Cannot automatically merge arrays") : new globals.InvariantError(3);
1565
+ throw __DEV__ ? new globals.InvariantError("Cannot automatically merge arrays") : new globals.InvariantError(4);
1817
1566
  }
1818
1567
  if (utilities.isNonNullObject(existing) &&
1819
1568
  utilities.isNonNullObject(incoming)) {
@@ -1823,141 +1572,414 @@ function makeMergeObjectsFunction(store) {
1823
1572
  if (typesDiffer) {
1824
1573
  return incoming;
1825
1574
  }
1826
- if (utilities.isReference(existing) &&
1827
- storeValueIsStoreObject(incoming)) {
1828
- store.merge(existing.__ref, incoming);
1829
- return existing;
1575
+ if (utilities.isReference(existing) &&
1576
+ storeValueIsStoreObject(incoming)) {
1577
+ store.merge(existing.__ref, incoming);
1578
+ return existing;
1579
+ }
1580
+ if (storeValueIsStoreObject(existing) &&
1581
+ utilities.isReference(incoming)) {
1582
+ store.merge(existing, incoming.__ref);
1583
+ return incoming;
1584
+ }
1585
+ if (storeValueIsStoreObject(existing) &&
1586
+ storeValueIsStoreObject(incoming)) {
1587
+ return tslib.__assign(tslib.__assign({}, existing), incoming);
1588
+ }
1589
+ }
1590
+ return incoming;
1591
+ };
1592
+ }
1593
+
1594
+ function getContextFlavor(context, clientOnly, deferred) {
1595
+ var key = "" + clientOnly + deferred;
1596
+ var flavored = context.flavors.get(key);
1597
+ if (!flavored) {
1598
+ context.flavors.set(key, flavored = (context.clientOnly === clientOnly &&
1599
+ context.deferred === deferred) ? context : tslib.__assign(tslib.__assign({}, context), { clientOnly: clientOnly, deferred: deferred }));
1600
+ }
1601
+ return flavored;
1602
+ }
1603
+ var StoreWriter = (function () {
1604
+ function StoreWriter(cache, reader) {
1605
+ this.cache = cache;
1606
+ this.reader = reader;
1607
+ }
1608
+ StoreWriter.prototype.writeToStore = function (store, _a) {
1609
+ var _this = this;
1610
+ var query = _a.query, result = _a.result, dataId = _a.dataId, variables = _a.variables, overwrite = _a.overwrite;
1611
+ var operationDefinition = utilities.getOperationDefinition(query);
1612
+ var merger = makeProcessedFieldsMerger();
1613
+ variables = tslib.__assign(tslib.__assign({}, utilities.getDefaultValues(operationDefinition)), variables);
1614
+ var context = {
1615
+ store: store,
1616
+ written: Object.create(null),
1617
+ merge: function (existing, incoming) {
1618
+ return merger.merge(existing, incoming);
1619
+ },
1620
+ variables: variables,
1621
+ varString: canonicalStringify(variables),
1622
+ fragmentMap: utilities.createFragmentMap(utilities.getFragmentDefinitions(query)),
1623
+ overwrite: !!overwrite,
1624
+ incomingById: new Map,
1625
+ clientOnly: false,
1626
+ deferred: false,
1627
+ flavors: new Map,
1628
+ };
1629
+ var ref = this.processSelectionSet({
1630
+ result: result || Object.create(null),
1631
+ dataId: dataId,
1632
+ selectionSet: operationDefinition.selectionSet,
1633
+ mergeTree: { map: new Map },
1634
+ context: context,
1635
+ });
1636
+ if (!utilities.isReference(ref)) {
1637
+ throw __DEV__ ? new globals.InvariantError("Could not identify object " + JSON.stringify(result)) : new globals.InvariantError(6);
1638
+ }
1639
+ context.incomingById.forEach(function (_a, dataId) {
1640
+ var storeObject = _a.storeObject, mergeTree = _a.mergeTree, fieldNodeSet = _a.fieldNodeSet;
1641
+ var entityRef = utilities.makeReference(dataId);
1642
+ if (mergeTree && mergeTree.map.size) {
1643
+ var applied = _this.applyMerges(mergeTree, entityRef, storeObject, context);
1644
+ if (utilities.isReference(applied)) {
1645
+ return;
1646
+ }
1647
+ storeObject = applied;
1648
+ }
1649
+ if (__DEV__ && !context.overwrite) {
1650
+ var fieldsWithSelectionSets_1 = Object.create(null);
1651
+ fieldNodeSet.forEach(function (field) {
1652
+ if (field.selectionSet) {
1653
+ fieldsWithSelectionSets_1[field.name.value] = true;
1654
+ }
1655
+ });
1656
+ var hasSelectionSet_1 = function (storeFieldName) {
1657
+ return fieldsWithSelectionSets_1[fieldNameFromStoreName(storeFieldName)] === true;
1658
+ };
1659
+ var hasMergeFunction_1 = function (storeFieldName) {
1660
+ var childTree = mergeTree && mergeTree.map.get(storeFieldName);
1661
+ return Boolean(childTree && childTree.info && childTree.info.merge);
1662
+ };
1663
+ Object.keys(storeObject).forEach(function (storeFieldName) {
1664
+ if (hasSelectionSet_1(storeFieldName) &&
1665
+ !hasMergeFunction_1(storeFieldName)) {
1666
+ warnAboutDataLoss(entityRef, storeObject, storeFieldName, context.store);
1667
+ }
1668
+ });
1669
+ }
1670
+ store.merge(dataId, storeObject);
1671
+ });
1672
+ store.retain(ref.__ref);
1673
+ return ref;
1674
+ };
1675
+ StoreWriter.prototype.processSelectionSet = function (_a) {
1676
+ var _this = this;
1677
+ var dataId = _a.dataId, result = _a.result, selectionSet = _a.selectionSet, context = _a.context, mergeTree = _a.mergeTree;
1678
+ var policies = this.cache.policies;
1679
+ var incoming = Object.create(null);
1680
+ var typename = (dataId && policies.rootTypenamesById[dataId]) ||
1681
+ utilities.getTypenameFromResult(result, selectionSet, context.fragmentMap) ||
1682
+ (dataId && context.store.get(dataId, "__typename"));
1683
+ if ("string" === typeof typename) {
1684
+ incoming.__typename = typename;
1685
+ }
1686
+ var readField = function () {
1687
+ var options = normalizeReadFieldOptions(arguments, incoming, context.variables);
1688
+ if (utilities.isReference(options.from)) {
1689
+ var info = context.incomingById.get(options.from.__ref);
1690
+ if (info) {
1691
+ var result_1 = policies.readField(tslib.__assign(tslib.__assign({}, options), { from: info.storeObject }), context);
1692
+ if (result_1 !== void 0) {
1693
+ return result_1;
1694
+ }
1695
+ }
1696
+ }
1697
+ return policies.readField(options, context);
1698
+ };
1699
+ var fieldNodeSet = new Set();
1700
+ this.flattenFields(selectionSet, result, context, typename).forEach(function (context, field) {
1701
+ var _a;
1702
+ var resultFieldKey = utilities.resultKeyNameFromField(field);
1703
+ var value = result[resultFieldKey];
1704
+ fieldNodeSet.add(field);
1705
+ if (value !== void 0) {
1706
+ var storeFieldName = policies.getStoreFieldName({
1707
+ typename: typename,
1708
+ fieldName: field.name.value,
1709
+ field: field,
1710
+ variables: context.variables,
1711
+ });
1712
+ var childTree = getChildMergeTree(mergeTree, storeFieldName);
1713
+ var incomingValue = _this.processFieldValue(value, field, field.selectionSet
1714
+ ? getContextFlavor(context, false, false)
1715
+ : context, childTree);
1716
+ var childTypename = void 0;
1717
+ if (field.selectionSet &&
1718
+ (utilities.isReference(incomingValue) ||
1719
+ storeValueIsStoreObject(incomingValue))) {
1720
+ childTypename = readField("__typename", incomingValue);
1721
+ }
1722
+ var merge = policies.getMergeFunction(typename, field.name.value, childTypename);
1723
+ if (merge) {
1724
+ childTree.info = {
1725
+ field: field,
1726
+ typename: typename,
1727
+ merge: merge,
1728
+ };
1729
+ }
1730
+ else {
1731
+ maybeRecycleChildMergeTree(mergeTree, storeFieldName);
1732
+ }
1733
+ incoming = context.merge(incoming, (_a = {},
1734
+ _a[storeFieldName] = incomingValue,
1735
+ _a));
1736
+ }
1737
+ else if (__DEV__ &&
1738
+ !context.clientOnly &&
1739
+ !context.deferred &&
1740
+ !utilities.addTypenameToDocument.added(field) &&
1741
+ !policies.getReadFunction(typename, field.name.value)) {
1742
+ __DEV__ && globals.invariant.error(("Missing field '" + utilities.resultKeyNameFromField(field) + "' while writing result " + JSON.stringify(result, null, 2)).substring(0, 1000));
1830
1743
  }
1831
- if (storeValueIsStoreObject(existing) &&
1832
- utilities.isReference(incoming)) {
1833
- store.merge(existing, incoming.__ref);
1834
- return incoming;
1744
+ });
1745
+ try {
1746
+ var _b = policies.identify(result, {
1747
+ typename: typename,
1748
+ selectionSet: selectionSet,
1749
+ fragmentMap: context.fragmentMap,
1750
+ storeObject: incoming,
1751
+ readField: readField,
1752
+ }), id = _b[0], keyObject = _b[1];
1753
+ dataId = dataId || id;
1754
+ if (keyObject) {
1755
+ incoming = context.merge(incoming, keyObject);
1835
1756
  }
1836
- if (storeValueIsStoreObject(existing) &&
1837
- storeValueIsStoreObject(incoming)) {
1838
- return tslib.__assign(tslib.__assign({}, existing), incoming);
1757
+ }
1758
+ catch (e) {
1759
+ if (!dataId)
1760
+ throw e;
1761
+ }
1762
+ if ("string" === typeof dataId) {
1763
+ var dataRef = utilities.makeReference(dataId);
1764
+ var sets = context.written[dataId] || (context.written[dataId] = []);
1765
+ if (sets.indexOf(selectionSet) >= 0)
1766
+ return dataRef;
1767
+ sets.push(selectionSet);
1768
+ if (this.reader && this.reader.isFresh(result, dataRef, selectionSet, context)) {
1769
+ return dataRef;
1770
+ }
1771
+ var previous_1 = context.incomingById.get(dataId);
1772
+ if (previous_1) {
1773
+ previous_1.storeObject = context.merge(previous_1.storeObject, incoming);
1774
+ previous_1.mergeTree = mergeMergeTrees(previous_1.mergeTree, mergeTree);
1775
+ fieldNodeSet.forEach(function (field) { return previous_1.fieldNodeSet.add(field); });
1776
+ }
1777
+ else {
1778
+ context.incomingById.set(dataId, {
1779
+ storeObject: incoming,
1780
+ mergeTree: mergeTreeIsEmpty(mergeTree) ? void 0 : mergeTree,
1781
+ fieldNodeSet: fieldNodeSet,
1782
+ });
1839
1783
  }
1784
+ return dataRef;
1840
1785
  }
1841
1786
  return incoming;
1842
1787
  };
1843
- }
1844
- function keyArgsFnFromSpecifier(specifier) {
1845
- return function (args, context) {
1846
- var key = context.fieldName;
1847
- var suffix = JSON.stringify(computeKeyArgsObject(specifier, context.field, args, context.variables));
1848
- if (args || suffix !== "{}") {
1849
- key += ":" + suffix;
1788
+ StoreWriter.prototype.processFieldValue = function (value, field, context, mergeTree) {
1789
+ var _this = this;
1790
+ if (!field.selectionSet || value === null) {
1791
+ return __DEV__ ? utilities.cloneDeep(value) : value;
1850
1792
  }
1851
- return key;
1852
- };
1853
- }
1854
- function keyFieldsFnFromSpecifier(specifier) {
1855
- var trie$1 = new trie.Trie(utilities.canUseWeakMap);
1856
- return function (object, context) {
1857
- var aliasMap;
1858
- if (context.selectionSet && context.fragmentMap) {
1859
- var info = trie$1.lookupArray([
1860
- context.selectionSet,
1861
- context.fragmentMap,
1862
- ]);
1863
- aliasMap = info.aliasMap || (info.aliasMap = makeAliasMap(context.selectionSet, context.fragmentMap));
1864
- }
1865
- var keyObject = context.keyObject =
1866
- computeKeyFieldsObject(specifier, object, aliasMap);
1867
- return context.typename + ":" + JSON.stringify(keyObject);
1793
+ if (Array.isArray(value)) {
1794
+ return value.map(function (item, i) {
1795
+ var value = _this.processFieldValue(item, field, context, getChildMergeTree(mergeTree, i));
1796
+ maybeRecycleChildMergeTree(mergeTree, i);
1797
+ return value;
1798
+ });
1799
+ }
1800
+ return this.processSelectionSet({
1801
+ result: value,
1802
+ selectionSet: field.selectionSet,
1803
+ context: context,
1804
+ mergeTree: mergeTree,
1805
+ });
1868
1806
  };
1869
- }
1870
- function makeAliasMap(selectionSet, fragmentMap) {
1871
- var map = Object.create(null);
1872
- var workQueue = new Set([selectionSet]);
1873
- workQueue.forEach(function (selectionSet) {
1874
- selectionSet.selections.forEach(function (selection) {
1875
- if (utilities.isField(selection)) {
1876
- if (selection.alias) {
1877
- var responseKey = selection.alias.value;
1878
- var storeKey = selection.name.value;
1879
- if (storeKey !== responseKey) {
1880
- var aliases = map.aliases || (map.aliases = Object.create(null));
1881
- aliases[storeKey] = responseKey;
1807
+ StoreWriter.prototype.flattenFields = function (selectionSet, result, context, typename) {
1808
+ if (typename === void 0) { typename = utilities.getTypenameFromResult(result, selectionSet, context.fragmentMap); }
1809
+ var fieldMap = new Map();
1810
+ var policies = this.cache.policies;
1811
+ var limitingTrie = new trie.Trie(false);
1812
+ (function flatten(selectionSet, inheritedContext) {
1813
+ var visitedNode = limitingTrie.lookup(selectionSet, inheritedContext.clientOnly, inheritedContext.deferred);
1814
+ if (visitedNode.visited)
1815
+ return;
1816
+ visitedNode.visited = true;
1817
+ selectionSet.selections.forEach(function (selection) {
1818
+ if (!utilities.shouldInclude(selection, context.variables))
1819
+ return;
1820
+ var clientOnly = inheritedContext.clientOnly, deferred = inheritedContext.deferred;
1821
+ if (!(clientOnly && deferred) &&
1822
+ utilities.isNonEmptyArray(selection.directives)) {
1823
+ selection.directives.forEach(function (dir) {
1824
+ var name = dir.name.value;
1825
+ if (name === "client")
1826
+ clientOnly = true;
1827
+ if (name === "defer") {
1828
+ var args = utilities.argumentsObjectFromField(dir, context.variables);
1829
+ if (!args || args.if !== false) {
1830
+ deferred = true;
1831
+ }
1832
+ }
1833
+ });
1834
+ }
1835
+ if (utilities.isField(selection)) {
1836
+ var existing = fieldMap.get(selection);
1837
+ if (existing) {
1838
+ clientOnly = clientOnly && existing.clientOnly;
1839
+ deferred = deferred && existing.deferred;
1882
1840
  }
1841
+ fieldMap.set(selection, getContextFlavor(context, clientOnly, deferred));
1883
1842
  }
1884
- if (selection.selectionSet) {
1885
- var subsets = map.subsets || (map.subsets = Object.create(null));
1886
- subsets[selection.name.value] =
1887
- makeAliasMap(selection.selectionSet, fragmentMap);
1843
+ else {
1844
+ var fragment = utilities.getFragmentFromSelection(selection, context.fragmentMap);
1845
+ if (fragment &&
1846
+ policies.fragmentMatches(fragment, typename, result, context.variables)) {
1847
+ flatten(fragment.selectionSet, getContextFlavor(context, clientOnly, deferred));
1848
+ }
1888
1849
  }
1850
+ });
1851
+ })(selectionSet, context);
1852
+ return fieldMap;
1853
+ };
1854
+ StoreWriter.prototype.applyMerges = function (mergeTree, existing, incoming, context, getStorageArgs) {
1855
+ var _a;
1856
+ var _this = this;
1857
+ if (mergeTree.map.size && !utilities.isReference(incoming)) {
1858
+ var e_1 = (!Array.isArray(incoming) &&
1859
+ (utilities.isReference(existing) || storeValueIsStoreObject(existing))) ? existing : void 0;
1860
+ var i_1 = incoming;
1861
+ if (e_1 && !getStorageArgs) {
1862
+ getStorageArgs = [utilities.isReference(e_1) ? e_1.__ref : e_1];
1889
1863
  }
1890
- else {
1891
- var fragment = utilities.getFragmentFromSelection(selection, fragmentMap);
1892
- if (fragment) {
1893
- workQueue.add(fragment.selectionSet);
1864
+ var changedFields_1;
1865
+ var getValue_1 = function (from, name) {
1866
+ return Array.isArray(from)
1867
+ ? (typeof name === "number" ? from[name] : void 0)
1868
+ : context.store.getFieldValue(from, String(name));
1869
+ };
1870
+ mergeTree.map.forEach(function (childTree, storeFieldName) {
1871
+ var eVal = getValue_1(e_1, storeFieldName);
1872
+ var iVal = getValue_1(i_1, storeFieldName);
1873
+ if (void 0 === iVal)
1874
+ return;
1875
+ if (getStorageArgs) {
1876
+ getStorageArgs.push(storeFieldName);
1894
1877
  }
1895
- }
1896
- });
1897
- });
1898
- return map;
1899
- }
1900
- function computeKeyFieldsObject(specifier, response, aliasMap) {
1901
- var keyObj = Object.create(null);
1902
- var lastResponseKey;
1903
- var lastActualKey;
1904
- var aliases = aliasMap && aliasMap.aliases;
1905
- var subsets = aliasMap && aliasMap.subsets;
1906
- specifier.forEach(function (s) {
1907
- if (Array.isArray(s)) {
1908
- if (typeof lastActualKey === "string" &&
1909
- typeof lastResponseKey === "string") {
1910
- keyObj[lastActualKey] = computeKeyFieldsObject(s, response[lastResponseKey], subsets && subsets[lastActualKey]);
1878
+ var aVal = _this.applyMerges(childTree, eVal, iVal, context, getStorageArgs);
1879
+ if (aVal !== iVal) {
1880
+ changedFields_1 = changedFields_1 || new Map;
1881
+ changedFields_1.set(storeFieldName, aVal);
1882
+ }
1883
+ if (getStorageArgs) {
1884
+ globals.invariant(getStorageArgs.pop() === storeFieldName);
1885
+ }
1886
+ });
1887
+ if (changedFields_1) {
1888
+ incoming = (Array.isArray(i_1) ? i_1.slice(0) : tslib.__assign({}, i_1));
1889
+ changedFields_1.forEach(function (value, name) {
1890
+ incoming[name] = value;
1891
+ });
1911
1892
  }
1912
1893
  }
1913
- else {
1914
- var responseKey = aliases && aliases[s] || s;
1915
- __DEV__ ? globals.invariant(hasOwn.call(response, responseKey), "Missing field '" + responseKey + "' while extracting keyFields from " + JSON.stringify(response)) : globals.invariant(hasOwn.call(response, responseKey), 4);
1916
- keyObj[lastActualKey = s] = response[lastResponseKey = responseKey];
1894
+ if (mergeTree.info) {
1895
+ return this.cache.policies.runMergeFunction(existing, incoming, mergeTree.info, context, getStorageArgs && (_a = context.store).getStorage.apply(_a, getStorageArgs));
1917
1896
  }
1918
- });
1919
- return keyObj;
1897
+ return incoming;
1898
+ };
1899
+ return StoreWriter;
1900
+ }());
1901
+ var emptyMergeTreePool = [];
1902
+ function getChildMergeTree(_a, name) {
1903
+ var map = _a.map;
1904
+ if (!map.has(name)) {
1905
+ map.set(name, emptyMergeTreePool.pop() || { map: new Map });
1906
+ }
1907
+ return map.get(name);
1920
1908
  }
1921
- function computeKeyArgsObject(specifier, field, source, variables) {
1922
- var keyObj = Object.create(null);
1923
- var last;
1924
- specifier.forEach(function (key) {
1925
- if (Array.isArray(key)) {
1926
- if (last) {
1927
- keyObj[last.key] =
1928
- computeKeyArgsObject(key, field, last.source, variables);
1929
- }
1930
- }
1931
- else {
1932
- var firstChar = key.charAt(0);
1933
- if (firstChar === "@") {
1934
- if (field && utilities.isNonEmptyArray(field.directives)) {
1935
- var directiveName_1 = key.slice(1);
1936
- var d = field.directives.find(function (d) { return d.name.value === directiveName_1; });
1937
- if (d) {
1938
- last = {
1939
- key: key,
1940
- source: keyObj[key] = utilities.argumentsObjectFromField(d, variables),
1941
- };
1942
- return;
1943
- }
1944
- }
1945
- }
1946
- else if (firstChar === "$") {
1947
- var variableName = key.slice(1);
1948
- if (variables && hasOwn.call(variables, variableName)) {
1949
- last = { key: key, source: keyObj[key] = variables[variableName] };
1950
- return;
1951
- }
1952
- }
1953
- else if (source && hasOwn.call(source, key)) {
1954
- last = { key: key, source: keyObj[key] = source[key] };
1955
- return;
1909
+ function mergeMergeTrees(left, right) {
1910
+ if (left === right || !right || mergeTreeIsEmpty(right))
1911
+ return left;
1912
+ if (!left || mergeTreeIsEmpty(left))
1913
+ return right;
1914
+ var info = left.info && right.info ? tslib.__assign(tslib.__assign({}, left.info), right.info) : left.info || right.info;
1915
+ var needToMergeMaps = left.map.size && right.map.size;
1916
+ var map = needToMergeMaps ? new Map :
1917
+ left.map.size ? left.map : right.map;
1918
+ var merged = { info: info, map: map };
1919
+ if (needToMergeMaps) {
1920
+ var remainingRightKeys_1 = new Set(right.map.keys());
1921
+ left.map.forEach(function (leftTree, key) {
1922
+ merged.map.set(key, mergeMergeTrees(leftTree, right.map.get(key)));
1923
+ remainingRightKeys_1.delete(key);
1924
+ });
1925
+ remainingRightKeys_1.forEach(function (key) {
1926
+ merged.map.set(key, mergeMergeTrees(right.map.get(key), left.map.get(key)));
1927
+ });
1928
+ }
1929
+ return merged;
1930
+ }
1931
+ function mergeTreeIsEmpty(tree) {
1932
+ return !tree || !(tree.info || tree.map.size);
1933
+ }
1934
+ function maybeRecycleChildMergeTree(_a, name) {
1935
+ var map = _a.map;
1936
+ var childTree = map.get(name);
1937
+ if (childTree && mergeTreeIsEmpty(childTree)) {
1938
+ emptyMergeTreePool.push(childTree);
1939
+ map.delete(name);
1940
+ }
1941
+ }
1942
+ var warnings = new Set();
1943
+ function warnAboutDataLoss(existingRef, incomingObj, storeFieldName, store) {
1944
+ var getChild = function (objOrRef) {
1945
+ var child = store.getFieldValue(objOrRef, storeFieldName);
1946
+ return typeof child === "object" && child;
1947
+ };
1948
+ var existing = getChild(existingRef);
1949
+ if (!existing)
1950
+ return;
1951
+ var incoming = getChild(incomingObj);
1952
+ if (!incoming)
1953
+ return;
1954
+ if (utilities.isReference(existing))
1955
+ return;
1956
+ if (equality.equal(existing, incoming))
1957
+ return;
1958
+ if (Object.keys(existing).every(function (key) { return store.getFieldValue(incoming, key) !== void 0; })) {
1959
+ return;
1960
+ }
1961
+ var parentType = store.getFieldValue(existingRef, "__typename") ||
1962
+ store.getFieldValue(incomingObj, "__typename");
1963
+ var fieldName = fieldNameFromStoreName(storeFieldName);
1964
+ var typeDotName = parentType + "." + fieldName;
1965
+ if (warnings.has(typeDotName))
1966
+ return;
1967
+ warnings.add(typeDotName);
1968
+ var childTypenames = [];
1969
+ if (!Array.isArray(existing) &&
1970
+ !Array.isArray(incoming)) {
1971
+ [existing, incoming].forEach(function (child) {
1972
+ var typename = store.getFieldValue(child, "__typename");
1973
+ if (typeof typename === "string" &&
1974
+ !childTypenames.includes(typename)) {
1975
+ childTypenames.push(typename);
1956
1976
  }
1957
- last = void 0;
1958
- }
1959
- });
1960
- return keyObj;
1977
+ });
1978
+ }
1979
+ __DEV__ && globals.invariant.warn("Cache data may be lost when replacing the " + fieldName + " field of a " + parentType + " object.\n\nTo address this problem (which is not a bug in Apollo Client), " + (childTypenames.length
1980
+ ? "either ensure all objects of type " +
1981
+ childTypenames.join(" and ") + " have an ID or a custom merge function, or "
1982
+ : "") + "define a custom merge function for the " + typeDotName + " field, so InMemoryCache can safely merge these objects:\n\n existing: " + JSON.stringify(existing).slice(0, 1000) + "\n incoming: " + JSON.stringify(incoming).slice(0, 1000) + "\n\nFor more information about these options, please refer to the documentation:\n\n * Ensuring entity objects have IDs: https://go.apollo.dev/c/generating-unique-identifiers\n * Defining custom merge functions: https://go.apollo.dev/c/merging-non-normalized-objects\n");
1961
1983
  }
1962
1984
 
1963
1985
  var InMemoryCache = (function (_super) {