UNPKG

108 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, '__esModule', { value: true });
4
5var globals = require('../utilities/globals');
6var tslib = require('tslib');
7var optimism = require('optimism');
8var utilities = require('../utilities');
9var caches = require('@wry/caches');
10var equality = require('@wry/equality');
11var trie = require('@wry/trie');
12var graphql = require('graphql');
13
14var getInMemoryCacheMemoryInternals = globalThis.__DEV__ !== false ?
15 _getInMemoryCacheMemoryInternals
16 : undefined;
17var getApolloCacheMemoryInternals = globalThis.__DEV__ !== false ?
18 _getApolloCacheMemoryInternals
19 : undefined;
20function _getApolloCacheMemoryInternals() {
21 return {
22 cache: {
23 fragmentQueryDocuments: getWrapperInformation(this["getFragmentDoc"]),
24 },
25 };
26}
27function _getInMemoryCacheMemoryInternals() {
28 var fragments = this.config.fragments;
29 return tslib.__assign(tslib.__assign({}, _getApolloCacheMemoryInternals.apply(this)), { addTypenameDocumentTransform: transformInfo(this["addTypenameTransform"]), inMemoryCache: {
30 executeSelectionSet: getWrapperInformation(this["storeReader"]["executeSelectionSet"]),
31 executeSubSelectedArray: getWrapperInformation(this["storeReader"]["executeSubSelectedArray"]),
32 maybeBroadcastWatch: getWrapperInformation(this["maybeBroadcastWatch"]),
33 }, fragmentRegistry: {
34 findFragmentSpreads: getWrapperInformation(fragments === null || fragments === void 0 ? void 0 : fragments.findFragmentSpreads),
35 lookup: getWrapperInformation(fragments === null || fragments === void 0 ? void 0 : fragments.lookup),
36 transform: getWrapperInformation(fragments === null || fragments === void 0 ? void 0 : fragments.transform),
37 } });
38}
39function isWrapper(f) {
40 return !!f && "dirtyKey" in f;
41}
42function getWrapperInformation(f) {
43 return isWrapper(f) ? f.size : undefined;
44}
45function isDefined(value) {
46 return value != null;
47}
48function transformInfo(transform) {
49 return recurseTransformInfo(transform).map(function (cache) { return ({ cache: cache }); });
50}
51function recurseTransformInfo(transform) {
52 return transform ?
53 tslib.__spreadArray(tslib.__spreadArray([
54 getWrapperInformation(transform === null || transform === void 0 ? void 0 : transform["performWork"])
55 ], recurseTransformInfo(transform === null || transform === void 0 ? void 0 : transform["left"]), true), recurseTransformInfo(transform === null || transform === void 0 ? void 0 : transform["right"]), true).filter(isDefined)
56 : [];
57}
58
59var ApolloCache = (function () {
60 function ApolloCache() {
61 this.assumeImmutableResults = false;
62 this.getFragmentDoc = optimism.wrap(utilities.getFragmentQueryDocument, {
63 max: utilities.cacheSizes["cache.fragmentQueryDocuments"] ||
64 1000 ,
65 cache: caches.WeakCache,
66 });
67 }
68 ApolloCache.prototype.batch = function (options) {
69 var _this = this;
70 var optimisticId = typeof options.optimistic === "string" ? options.optimistic
71 : options.optimistic === false ? null
72 : void 0;
73 var updateResult;
74 this.performTransaction(function () { return (updateResult = options.update(_this)); }, optimisticId);
75 return updateResult;
76 };
77 ApolloCache.prototype.recordOptimisticTransaction = function (transaction, optimisticId) {
78 this.performTransaction(transaction, optimisticId);
79 };
80 ApolloCache.prototype.transformDocument = function (document) {
81 return document;
82 };
83 ApolloCache.prototype.transformForLink = function (document) {
84 return document;
85 };
86 ApolloCache.prototype.identify = function (object) {
87 return;
88 };
89 ApolloCache.prototype.gc = function () {
90 return [];
91 };
92 ApolloCache.prototype.modify = function (options) {
93 return false;
94 };
95 ApolloCache.prototype.readQuery = function (options, optimistic) {
96 if (optimistic === void 0) { optimistic = !!options.optimistic; }
97 return this.read(tslib.__assign(tslib.__assign({}, options), { rootId: options.id || "ROOT_QUERY", optimistic: optimistic }));
98 };
99 ApolloCache.prototype.readFragment = function (options, optimistic) {
100 if (optimistic === void 0) { optimistic = !!options.optimistic; }
101 return this.read(tslib.__assign(tslib.__assign({}, options), { query: this.getFragmentDoc(options.fragment, options.fragmentName), rootId: options.id, optimistic: optimistic }));
102 };
103 ApolloCache.prototype.writeQuery = function (_a) {
104 var id = _a.id, data = _a.data, options = tslib.__rest(_a, ["id", "data"]);
105 return this.write(Object.assign(options, {
106 dataId: id || "ROOT_QUERY",
107 result: data,
108 }));
109 };
110 ApolloCache.prototype.writeFragment = function (_a) {
111 var id = _a.id, data = _a.data, fragment = _a.fragment, fragmentName = _a.fragmentName, options = tslib.__rest(_a, ["id", "data", "fragment", "fragmentName"]);
112 return this.write(Object.assign(options, {
113 query: this.getFragmentDoc(fragment, fragmentName),
114 dataId: id,
115 result: data,
116 }));
117 };
118 ApolloCache.prototype.updateQuery = function (options, update) {
119 return this.batch({
120 update: function (cache) {
121 var value = cache.readQuery(options);
122 var data = update(value);
123 if (data === void 0 || data === null)
124 return value;
125 cache.writeQuery(tslib.__assign(tslib.__assign({}, options), { data: data }));
126 return data;
127 },
128 });
129 };
130 ApolloCache.prototype.updateFragment = function (options, update) {
131 return this.batch({
132 update: function (cache) {
133 var value = cache.readFragment(options);
134 var data = update(value);
135 if (data === void 0 || data === null)
136 return value;
137 cache.writeFragment(tslib.__assign(tslib.__assign({}, options), { data: data }));
138 return data;
139 },
140 });
141 };
142 return ApolloCache;
143}());
144if (globalThis.__DEV__ !== false) {
145 ApolloCache.prototype.getMemoryInternals = getApolloCacheMemoryInternals;
146}
147
148exports.Cache = void 0;
149(function (Cache) {
150})(exports.Cache || (exports.Cache = {}));
151
152var MissingFieldError = (function (_super) {
153 tslib.__extends(MissingFieldError, _super);
154 function MissingFieldError(message, path, query, variables) {
155 var _a;
156 var _this = _super.call(this, message) || this;
157 _this.message = message;
158 _this.path = path;
159 _this.query = query;
160 _this.variables = variables;
161 if (Array.isArray(_this.path)) {
162 _this.missing = _this.message;
163 for (var i = _this.path.length - 1; i >= 0; --i) {
164 _this.missing = (_a = {}, _a[_this.path[i]] = _this.missing, _a);
165 }
166 }
167 else {
168 _this.missing = _this.path;
169 }
170 _this.__proto__ = MissingFieldError.prototype;
171 return _this;
172 }
173 return MissingFieldError;
174}(Error));
175
176var hasOwn = Object.prototype.hasOwnProperty;
177function isNullish(value) {
178 return value === null || value === void 0;
179}
180function defaultDataIdFromObject(_a, context) {
181 var __typename = _a.__typename, id = _a.id, _id = _a._id;
182 if (typeof __typename === "string") {
183 if (context) {
184 context.keyObject =
185 !isNullish(id) ? { id: id }
186 : !isNullish(_id) ? { _id: _id }
187 : void 0;
188 }
189 if (isNullish(id) && !isNullish(_id)) {
190 id = _id;
191 }
192 if (!isNullish(id)) {
193 return "".concat(__typename, ":").concat(typeof id === "number" || typeof id === "string" ?
194 id
195 : JSON.stringify(id));
196 }
197 }
198}
199var defaultConfig = {
200 dataIdFromObject: defaultDataIdFromObject,
201 addTypename: true,
202 resultCaching: true,
203 canonizeResults: false,
204};
205function normalizeConfig(config) {
206 return utilities.compact(defaultConfig, config);
207}
208function shouldCanonizeResults(config) {
209 var value = config.canonizeResults;
210 return value === void 0 ? defaultConfig.canonizeResults : value;
211}
212function getTypenameFromStoreObject(store, objectOrReference) {
213 return utilities.isReference(objectOrReference) ?
214 store.get(objectOrReference.__ref, "__typename")
215 : objectOrReference && objectOrReference.__typename;
216}
217var TypeOrFieldNameRegExp = /^[_a-z][_0-9a-z]*/i;
218function fieldNameFromStoreName(storeFieldName) {
219 var match = storeFieldName.match(TypeOrFieldNameRegExp);
220 return match ? match[0] : storeFieldName;
221}
222function selectionSetMatchesResult(selectionSet, result, variables) {
223 if (utilities.isNonNullObject(result)) {
224 return utilities.isArray(result) ?
225 result.every(function (item) {
226 return selectionSetMatchesResult(selectionSet, item, variables);
227 })
228 : selectionSet.selections.every(function (field) {
229 if (utilities.isField(field) && utilities.shouldInclude(field, variables)) {
230 var key = utilities.resultKeyNameFromField(field);
231 return (hasOwn.call(result, key) &&
232 (!field.selectionSet ||
233 selectionSetMatchesResult(field.selectionSet, result[key], variables)));
234 }
235 return true;
236 });
237 }
238 return false;
239}
240function storeValueIsStoreObject(value) {
241 return utilities.isNonNullObject(value) && !utilities.isReference(value) && !utilities.isArray(value);
242}
243function makeProcessedFieldsMerger() {
244 return new utilities.DeepMerger();
245}
246function extractFragmentContext(document, fragments) {
247 var fragmentMap = utilities.createFragmentMap(utilities.getFragmentDefinitions(document));
248 return {
249 fragmentMap: fragmentMap,
250 lookupFragment: function (name) {
251 var def = fragmentMap[name];
252 if (!def && fragments) {
253 def = fragments.lookup(name);
254 }
255 return def || null;
256 },
257 };
258}
259
260var DELETE = Object.create(null);
261var delModifier = function () { return DELETE; };
262var INVALIDATE = Object.create(null);
263exports.EntityStore = (function () {
264 function EntityStore(policies, group) {
265 var _this = this;
266 this.policies = policies;
267 this.group = group;
268 this.data = Object.create(null);
269 this.rootIds = Object.create(null);
270 this.refs = Object.create(null);
271 this.getFieldValue = function (objectOrReference, storeFieldName) {
272 return utilities.maybeDeepFreeze(utilities.isReference(objectOrReference) ?
273 _this.get(objectOrReference.__ref, storeFieldName)
274 : objectOrReference && objectOrReference[storeFieldName]);
275 };
276 this.canRead = function (objOrRef) {
277 return utilities.isReference(objOrRef) ?
278 _this.has(objOrRef.__ref)
279 : typeof objOrRef === "object";
280 };
281 this.toReference = function (objOrIdOrRef, mergeIntoStore) {
282 if (typeof objOrIdOrRef === "string") {
283 return utilities.makeReference(objOrIdOrRef);
284 }
285 if (utilities.isReference(objOrIdOrRef)) {
286 return objOrIdOrRef;
287 }
288 var id = _this.policies.identify(objOrIdOrRef)[0];
289 if (id) {
290 var ref = utilities.makeReference(id);
291 if (mergeIntoStore) {
292 _this.merge(id, objOrIdOrRef);
293 }
294 return ref;
295 }
296 };
297 }
298 EntityStore.prototype.toObject = function () {
299 return tslib.__assign({}, this.data);
300 };
301 EntityStore.prototype.has = function (dataId) {
302 return this.lookup(dataId, true) !== void 0;
303 };
304 EntityStore.prototype.get = function (dataId, fieldName) {
305 this.group.depend(dataId, fieldName);
306 if (hasOwn.call(this.data, dataId)) {
307 var storeObject = this.data[dataId];
308 if (storeObject && hasOwn.call(storeObject, fieldName)) {
309 return storeObject[fieldName];
310 }
311 }
312 if (fieldName === "__typename" &&
313 hasOwn.call(this.policies.rootTypenamesById, dataId)) {
314 return this.policies.rootTypenamesById[dataId];
315 }
316 if (this instanceof Layer) {
317 return this.parent.get(dataId, fieldName);
318 }
319 };
320 EntityStore.prototype.lookup = function (dataId, dependOnExistence) {
321 if (dependOnExistence)
322 this.group.depend(dataId, "__exists");
323 if (hasOwn.call(this.data, dataId)) {
324 return this.data[dataId];
325 }
326 if (this instanceof Layer) {
327 return this.parent.lookup(dataId, dependOnExistence);
328 }
329 if (this.policies.rootTypenamesById[dataId]) {
330 return Object.create(null);
331 }
332 };
333 EntityStore.prototype.merge = function (older, newer) {
334 var _this = this;
335 var dataId;
336 if (utilities.isReference(older))
337 older = older.__ref;
338 if (utilities.isReference(newer))
339 newer = newer.__ref;
340 var existing = typeof older === "string" ? this.lookup((dataId = older)) : older;
341 var incoming = typeof newer === "string" ? this.lookup((dataId = newer)) : newer;
342 if (!incoming)
343 return;
344 globals.invariant(typeof dataId === "string", 1);
345 var merged = new utilities.DeepMerger(storeObjectReconciler).merge(existing, incoming);
346 this.data[dataId] = merged;
347 if (merged !== existing) {
348 delete this.refs[dataId];
349 if (this.group.caching) {
350 var fieldsToDirty_1 = Object.create(null);
351 if (!existing)
352 fieldsToDirty_1.__exists = 1;
353 Object.keys(incoming).forEach(function (storeFieldName) {
354 if (!existing ||
355 existing[storeFieldName] !== merged[storeFieldName]) {
356 fieldsToDirty_1[storeFieldName] = 1;
357 var fieldName = fieldNameFromStoreName(storeFieldName);
358 if (fieldName !== storeFieldName &&
359 !_this.policies.hasKeyArgs(merged.__typename, fieldName)) {
360 fieldsToDirty_1[fieldName] = 1;
361 }
362 if (merged[storeFieldName] === void 0 && !(_this instanceof Layer)) {
363 delete merged[storeFieldName];
364 }
365 }
366 });
367 if (fieldsToDirty_1.__typename &&
368 !(existing && existing.__typename) &&
369 this.policies.rootTypenamesById[dataId] === merged.__typename) {
370 delete fieldsToDirty_1.__typename;
371 }
372 Object.keys(fieldsToDirty_1).forEach(function (fieldName) {
373 return _this.group.dirty(dataId, fieldName);
374 });
375 }
376 }
377 };
378 EntityStore.prototype.modify = function (dataId, fields) {
379 var _this = this;
380 var storeObject = this.lookup(dataId);
381 if (storeObject) {
382 var changedFields_1 = Object.create(null);
383 var needToMerge_1 = false;
384 var allDeleted_1 = true;
385 var sharedDetails_1 = {
386 DELETE: DELETE,
387 INVALIDATE: INVALIDATE,
388 isReference: utilities.isReference,
389 toReference: this.toReference,
390 canRead: this.canRead,
391 readField: function (fieldNameOrOptions, from) {
392 return _this.policies.readField(typeof fieldNameOrOptions === "string" ?
393 {
394 fieldName: fieldNameOrOptions,
395 from: from || utilities.makeReference(dataId),
396 }
397 : fieldNameOrOptions, { store: _this });
398 },
399 };
400 Object.keys(storeObject).forEach(function (storeFieldName) {
401 var fieldName = fieldNameFromStoreName(storeFieldName);
402 var fieldValue = storeObject[storeFieldName];
403 if (fieldValue === void 0)
404 return;
405 var modify = typeof fields === "function" ? fields : (fields[storeFieldName] || fields[fieldName]);
406 if (modify) {
407 var newValue = modify === delModifier ? DELETE : (modify(utilities.maybeDeepFreeze(fieldValue), tslib.__assign(tslib.__assign({}, sharedDetails_1), { fieldName: fieldName, storeFieldName: storeFieldName, storage: _this.getStorage(dataId, storeFieldName) })));
408 if (newValue === INVALIDATE) {
409 _this.group.dirty(dataId, storeFieldName);
410 }
411 else {
412 if (newValue === DELETE)
413 newValue = void 0;
414 if (newValue !== fieldValue) {
415 changedFields_1[storeFieldName] = newValue;
416 needToMerge_1 = true;
417 fieldValue = newValue;
418 if (globalThis.__DEV__ !== false) {
419 var checkReference = function (ref) {
420 if (_this.lookup(ref.__ref) === undefined) {
421 globalThis.__DEV__ !== false && globals.invariant.warn(2, ref);
422 return true;
423 }
424 };
425 if (utilities.isReference(newValue)) {
426 checkReference(newValue);
427 }
428 else if (Array.isArray(newValue)) {
429 var seenReference = false;
430 var someNonReference = void 0;
431 for (var _i = 0, newValue_1 = newValue; _i < newValue_1.length; _i++) {
432 var value = newValue_1[_i];
433 if (utilities.isReference(value)) {
434 seenReference = true;
435 if (checkReference(value))
436 break;
437 }
438 else {
439 if (typeof value === "object" && !!value) {
440 var id = _this.policies.identify(value)[0];
441 if (id) {
442 someNonReference = value;
443 }
444 }
445 }
446 if (seenReference && someNonReference !== undefined) {
447 globalThis.__DEV__ !== false && globals.invariant.warn(3, someNonReference);
448 break;
449 }
450 }
451 }
452 }
453 }
454 }
455 }
456 if (fieldValue !== void 0) {
457 allDeleted_1 = false;
458 }
459 });
460 if (needToMerge_1) {
461 this.merge(dataId, changedFields_1);
462 if (allDeleted_1) {
463 if (this instanceof Layer) {
464 this.data[dataId] = void 0;
465 }
466 else {
467 delete this.data[dataId];
468 }
469 this.group.dirty(dataId, "__exists");
470 }
471 return true;
472 }
473 }
474 return false;
475 };
476 EntityStore.prototype.delete = function (dataId, fieldName, args) {
477 var _a;
478 var storeObject = this.lookup(dataId);
479 if (storeObject) {
480 var typename = this.getFieldValue(storeObject, "__typename");
481 var storeFieldName = fieldName && args ?
482 this.policies.getStoreFieldName({ typename: typename, fieldName: fieldName, args: args })
483 : fieldName;
484 return this.modify(dataId, storeFieldName ? (_a = {},
485 _a[storeFieldName] = delModifier,
486 _a) : delModifier);
487 }
488 return false;
489 };
490 EntityStore.prototype.evict = function (options, limit) {
491 var evicted = false;
492 if (options.id) {
493 if (hasOwn.call(this.data, options.id)) {
494 evicted = this.delete(options.id, options.fieldName, options.args);
495 }
496 if (this instanceof Layer && this !== limit) {
497 evicted = this.parent.evict(options, limit) || evicted;
498 }
499 if (options.fieldName || evicted) {
500 this.group.dirty(options.id, options.fieldName || "__exists");
501 }
502 }
503 return evicted;
504 };
505 EntityStore.prototype.clear = function () {
506 this.replace(null);
507 };
508 EntityStore.prototype.extract = function () {
509 var _this = this;
510 var obj = this.toObject();
511 var extraRootIds = [];
512 this.getRootIdSet().forEach(function (id) {
513 if (!hasOwn.call(_this.policies.rootTypenamesById, id)) {
514 extraRootIds.push(id);
515 }
516 });
517 if (extraRootIds.length) {
518 obj.__META = { extraRootIds: extraRootIds.sort() };
519 }
520 return obj;
521 };
522 EntityStore.prototype.replace = function (newData) {
523 var _this = this;
524 Object.keys(this.data).forEach(function (dataId) {
525 if (!(newData && hasOwn.call(newData, dataId))) {
526 _this.delete(dataId);
527 }
528 });
529 if (newData) {
530 var __META = newData.__META, rest_1 = tslib.__rest(newData, ["__META"]);
531 Object.keys(rest_1).forEach(function (dataId) {
532 _this.merge(dataId, rest_1[dataId]);
533 });
534 if (__META) {
535 __META.extraRootIds.forEach(this.retain, this);
536 }
537 }
538 };
539 EntityStore.prototype.retain = function (rootId) {
540 return (this.rootIds[rootId] = (this.rootIds[rootId] || 0) + 1);
541 };
542 EntityStore.prototype.release = function (rootId) {
543 if (this.rootIds[rootId] > 0) {
544 var count = --this.rootIds[rootId];
545 if (!count)
546 delete this.rootIds[rootId];
547 return count;
548 }
549 return 0;
550 };
551 EntityStore.prototype.getRootIdSet = function (ids) {
552 if (ids === void 0) { ids = new Set(); }
553 Object.keys(this.rootIds).forEach(ids.add, ids);
554 if (this instanceof Layer) {
555 this.parent.getRootIdSet(ids);
556 }
557 else {
558 Object.keys(this.policies.rootTypenamesById).forEach(ids.add, ids);
559 }
560 return ids;
561 };
562 EntityStore.prototype.gc = function () {
563 var _this = this;
564 var ids = this.getRootIdSet();
565 var snapshot = this.toObject();
566 ids.forEach(function (id) {
567 if (hasOwn.call(snapshot, id)) {
568 Object.keys(_this.findChildRefIds(id)).forEach(ids.add, ids);
569 delete snapshot[id];
570 }
571 });
572 var idsToRemove = Object.keys(snapshot);
573 if (idsToRemove.length) {
574 var root_1 = this;
575 while (root_1 instanceof Layer)
576 root_1 = root_1.parent;
577 idsToRemove.forEach(function (id) { return root_1.delete(id); });
578 }
579 return idsToRemove;
580 };
581 EntityStore.prototype.findChildRefIds = function (dataId) {
582 if (!hasOwn.call(this.refs, dataId)) {
583 var found_1 = (this.refs[dataId] = Object.create(null));
584 var root = this.data[dataId];
585 if (!root)
586 return found_1;
587 var workSet_1 = new Set([root]);
588 workSet_1.forEach(function (obj) {
589 if (utilities.isReference(obj)) {
590 found_1[obj.__ref] = true;
591 }
592 if (utilities.isNonNullObject(obj)) {
593 Object.keys(obj).forEach(function (key) {
594 var child = obj[key];
595 if (utilities.isNonNullObject(child)) {
596 workSet_1.add(child);
597 }
598 });
599 }
600 });
601 }
602 return this.refs[dataId];
603 };
604 EntityStore.prototype.makeCacheKey = function () {
605 return this.group.keyMaker.lookupArray(arguments);
606 };
607 return EntityStore;
608}());
609var CacheGroup = (function () {
610 function CacheGroup(caching, parent) {
611 if (parent === void 0) { parent = null; }
612 this.caching = caching;
613 this.parent = parent;
614 this.d = null;
615 this.resetCaching();
616 }
617 CacheGroup.prototype.resetCaching = function () {
618 this.d = this.caching ? optimism.dep() : null;
619 this.keyMaker = new trie.Trie(utilities.canUseWeakMap);
620 };
621 CacheGroup.prototype.depend = function (dataId, storeFieldName) {
622 if (this.d) {
623 this.d(makeDepKey(dataId, storeFieldName));
624 var fieldName = fieldNameFromStoreName(storeFieldName);
625 if (fieldName !== storeFieldName) {
626 this.d(makeDepKey(dataId, fieldName));
627 }
628 if (this.parent) {
629 this.parent.depend(dataId, storeFieldName);
630 }
631 }
632 };
633 CacheGroup.prototype.dirty = function (dataId, storeFieldName) {
634 if (this.d) {
635 this.d.dirty(makeDepKey(dataId, storeFieldName),
636 storeFieldName === "__exists" ? "forget" : "setDirty");
637 }
638 };
639 return CacheGroup;
640}());
641function makeDepKey(dataId, storeFieldName) {
642 return storeFieldName + "#" + dataId;
643}
644function maybeDependOnExistenceOfEntity(store, entityId) {
645 if (supportsResultCaching(store)) {
646 store.group.depend(entityId, "__exists");
647 }
648}
649(function (EntityStore) {
650 var Root = (function (_super) {
651 tslib.__extends(Root, _super);
652 function Root(_a) {
653 var policies = _a.policies, _b = _a.resultCaching, resultCaching = _b === void 0 ? true : _b, seed = _a.seed;
654 var _this = _super.call(this, policies, new CacheGroup(resultCaching)) || this;
655 _this.stump = new Stump(_this);
656 _this.storageTrie = new trie.Trie(utilities.canUseWeakMap);
657 if (seed)
658 _this.replace(seed);
659 return _this;
660 }
661 Root.prototype.addLayer = function (layerId, replay) {
662 return this.stump.addLayer(layerId, replay);
663 };
664 Root.prototype.removeLayer = function () {
665 return this;
666 };
667 Root.prototype.getStorage = function () {
668 return this.storageTrie.lookupArray(arguments);
669 };
670 return Root;
671 }(EntityStore));
672 EntityStore.Root = Root;
673})(exports.EntityStore || (exports.EntityStore = {}));
674var Layer = (function (_super) {
675 tslib.__extends(Layer, _super);
676 function Layer(id, parent, replay, group) {
677 var _this = _super.call(this, parent.policies, group) || this;
678 _this.id = id;
679 _this.parent = parent;
680 _this.replay = replay;
681 _this.group = group;
682 replay(_this);
683 return _this;
684 }
685 Layer.prototype.addLayer = function (layerId, replay) {
686 return new Layer(layerId, this, replay, this.group);
687 };
688 Layer.prototype.removeLayer = function (layerId) {
689 var _this = this;
690 var parent = this.parent.removeLayer(layerId);
691 if (layerId === this.id) {
692 if (this.group.caching) {
693 Object.keys(this.data).forEach(function (dataId) {
694 var ownStoreObject = _this.data[dataId];
695 var parentStoreObject = parent["lookup"](dataId);
696 if (!parentStoreObject) {
697 _this.delete(dataId);
698 }
699 else if (!ownStoreObject) {
700 _this.group.dirty(dataId, "__exists");
701 Object.keys(parentStoreObject).forEach(function (storeFieldName) {
702 _this.group.dirty(dataId, storeFieldName);
703 });
704 }
705 else if (ownStoreObject !== parentStoreObject) {
706 Object.keys(ownStoreObject).forEach(function (storeFieldName) {
707 if (!equality.equal(ownStoreObject[storeFieldName], parentStoreObject[storeFieldName])) {
708 _this.group.dirty(dataId, storeFieldName);
709 }
710 });
711 }
712 });
713 }
714 return parent;
715 }
716 if (parent === this.parent)
717 return this;
718 return parent.addLayer(this.id, this.replay);
719 };
720 Layer.prototype.toObject = function () {
721 return tslib.__assign(tslib.__assign({}, this.parent.toObject()), this.data);
722 };
723 Layer.prototype.findChildRefIds = function (dataId) {
724 var fromParent = this.parent.findChildRefIds(dataId);
725 return hasOwn.call(this.data, dataId) ? tslib.__assign(tslib.__assign({}, fromParent), _super.prototype.findChildRefIds.call(this, dataId)) : fromParent;
726 };
727 Layer.prototype.getStorage = function () {
728 var p = this.parent;
729 while (p.parent)
730 p = p.parent;
731 return p.getStorage.apply(p,
732 arguments);
733 };
734 return Layer;
735}(exports.EntityStore));
736var Stump = (function (_super) {
737 tslib.__extends(Stump, _super);
738 function Stump(root) {
739 return _super.call(this, "EntityStore.Stump", root, function () { }, new CacheGroup(root.group.caching, root.group)) || this;
740 }
741 Stump.prototype.removeLayer = function () {
742 return this;
743 };
744 Stump.prototype.merge = function (older, newer) {
745 return this.parent.merge(older, newer);
746 };
747 return Stump;
748}(Layer));
749function storeObjectReconciler(existingObject, incomingObject, property) {
750 var existingValue = existingObject[property];
751 var incomingValue = incomingObject[property];
752 return equality.equal(existingValue, incomingValue) ? existingValue : incomingValue;
753}
754function supportsResultCaching(store) {
755 return !!(store instanceof exports.EntityStore && store.group.caching);
756}
757
758function shallowCopy(value) {
759 if (utilities.isNonNullObject(value)) {
760 return utilities.isArray(value) ?
761 value.slice(0)
762 : tslib.__assign({ __proto__: Object.getPrototypeOf(value) }, value);
763 }
764 return value;
765}
766var ObjectCanon = (function () {
767 function ObjectCanon() {
768 this.known = new (utilities.canUseWeakSet ? WeakSet : Set)();
769 this.pool = new trie.Trie(utilities.canUseWeakMap);
770 this.passes = new WeakMap();
771 this.keysByJSON = new Map();
772 this.empty = this.admit({});
773 }
774 ObjectCanon.prototype.isKnown = function (value) {
775 return utilities.isNonNullObject(value) && this.known.has(value);
776 };
777 ObjectCanon.prototype.pass = function (value) {
778 if (utilities.isNonNullObject(value)) {
779 var copy = shallowCopy(value);
780 this.passes.set(copy, value);
781 return copy;
782 }
783 return value;
784 };
785 ObjectCanon.prototype.admit = function (value) {
786 var _this = this;
787 if (utilities.isNonNullObject(value)) {
788 var original = this.passes.get(value);
789 if (original)
790 return original;
791 var proto = Object.getPrototypeOf(value);
792 switch (proto) {
793 case Array.prototype: {
794 if (this.known.has(value))
795 return value;
796 var array = value.map(this.admit, this);
797 var node = this.pool.lookupArray(array);
798 if (!node.array) {
799 this.known.add((node.array = array));
800 if (globalThis.__DEV__ !== false) {
801 Object.freeze(array);
802 }
803 }
804 return node.array;
805 }
806 case null:
807 case Object.prototype: {
808 if (this.known.has(value))
809 return value;
810 var proto_1 = Object.getPrototypeOf(value);
811 var array_1 = [proto_1];
812 var keys = this.sortedKeys(value);
813 array_1.push(keys.json);
814 var firstValueIndex_1 = array_1.length;
815 keys.sorted.forEach(function (key) {
816 array_1.push(_this.admit(value[key]));
817 });
818 var node = this.pool.lookupArray(array_1);
819 if (!node.object) {
820 var obj_1 = (node.object = Object.create(proto_1));
821 this.known.add(obj_1);
822 keys.sorted.forEach(function (key, i) {
823 obj_1[key] = array_1[firstValueIndex_1 + i];
824 });
825 if (globalThis.__DEV__ !== false) {
826 Object.freeze(obj_1);
827 }
828 }
829 return node.object;
830 }
831 }
832 }
833 return value;
834 };
835 ObjectCanon.prototype.sortedKeys = function (obj) {
836 var keys = Object.keys(obj);
837 var node = this.pool.lookupArray(keys);
838 if (!node.keys) {
839 keys.sort();
840 var json = JSON.stringify(keys);
841 if (!(node.keys = this.keysByJSON.get(json))) {
842 this.keysByJSON.set(json, (node.keys = { sorted: keys, json: json }));
843 }
844 }
845 return node.keys;
846 };
847 return ObjectCanon;
848}());
849
850function execSelectionSetKeyArgs(options) {
851 return [
852 options.selectionSet,
853 options.objectOrReference,
854 options.context,
855 options.context.canonizeResults,
856 ];
857}
858var StoreReader = (function () {
859 function StoreReader(config) {
860 var _this = this;
861 this.knownResults = new (utilities.canUseWeakMap ? WeakMap : Map)();
862 this.config = utilities.compact(config, {
863 addTypename: config.addTypename !== false,
864 canonizeResults: shouldCanonizeResults(config),
865 });
866 this.canon = config.canon || new ObjectCanon();
867 this.executeSelectionSet = optimism.wrap(function (options) {
868 var _a;
869 var canonizeResults = options.context.canonizeResults;
870 var peekArgs = execSelectionSetKeyArgs(options);
871 peekArgs[3] = !canonizeResults;
872 var other = (_a = _this.executeSelectionSet).peek.apply(_a, peekArgs);
873 if (other) {
874 if (canonizeResults) {
875 return tslib.__assign(tslib.__assign({}, other), {
876 result: _this.canon.admit(other.result) });
877 }
878 return other;
879 }
880 maybeDependOnExistenceOfEntity(options.context.store, options.enclosingRef.__ref);
881 return _this.execSelectionSetImpl(options);
882 }, {
883 max: this.config.resultCacheMaxSize ||
884 utilities.cacheSizes["inMemoryCache.executeSelectionSet"] ||
885 50000 ,
886 keyArgs: execSelectionSetKeyArgs,
887 makeCacheKey: function (selectionSet, parent, context, canonizeResults) {
888 if (supportsResultCaching(context.store)) {
889 return context.store.makeCacheKey(selectionSet, utilities.isReference(parent) ? parent.__ref : parent, context.varString, canonizeResults);
890 }
891 },
892 });
893 this.executeSubSelectedArray = optimism.wrap(function (options) {
894 maybeDependOnExistenceOfEntity(options.context.store, options.enclosingRef.__ref);
895 return _this.execSubSelectedArrayImpl(options);
896 }, {
897 max: this.config.resultCacheMaxSize ||
898 utilities.cacheSizes["inMemoryCache.executeSubSelectedArray"] ||
899 10000 ,
900 makeCacheKey: function (_a) {
901 var field = _a.field, array = _a.array, context = _a.context;
902 if (supportsResultCaching(context.store)) {
903 return context.store.makeCacheKey(field, array, context.varString);
904 }
905 },
906 });
907 }
908 StoreReader.prototype.resetCanon = function () {
909 this.canon = new ObjectCanon();
910 };
911 StoreReader.prototype.diffQueryAgainstStore = function (_a) {
912 var store = _a.store, query = _a.query, _b = _a.rootId, rootId = _b === void 0 ? "ROOT_QUERY" : _b, variables = _a.variables, _c = _a.returnPartialData, returnPartialData = _c === void 0 ? true : _c, _d = _a.canonizeResults, canonizeResults = _d === void 0 ? this.config.canonizeResults : _d;
913 var policies = this.config.cache.policies;
914 variables = tslib.__assign(tslib.__assign({}, utilities.getDefaultValues(utilities.getQueryDefinition(query))), variables);
915 var rootRef = utilities.makeReference(rootId);
916 var execResult = this.executeSelectionSet({
917 selectionSet: utilities.getMainDefinition(query).selectionSet,
918 objectOrReference: rootRef,
919 enclosingRef: rootRef,
920 context: tslib.__assign({ store: store, query: query, policies: policies, variables: variables, varString: utilities.canonicalStringify(variables), canonizeResults: canonizeResults }, extractFragmentContext(query, this.config.fragments)),
921 });
922 var missing;
923 if (execResult.missing) {
924 missing = [
925 new MissingFieldError(firstMissing(execResult.missing), execResult.missing, query, variables),
926 ];
927 if (!returnPartialData) {
928 throw missing[0];
929 }
930 }
931 return {
932 result: execResult.result,
933 complete: !missing,
934 missing: missing,
935 };
936 };
937 StoreReader.prototype.isFresh = function (result, parent, selectionSet, context) {
938 if (supportsResultCaching(context.store) &&
939 this.knownResults.get(result) === selectionSet) {
940 var latest = this.executeSelectionSet.peek(selectionSet, parent, context,
941 this.canon.isKnown(result));
942 if (latest && result === latest.result) {
943 return true;
944 }
945 }
946 return false;
947 };
948 StoreReader.prototype.execSelectionSetImpl = function (_a) {
949 var _this = this;
950 var selectionSet = _a.selectionSet, objectOrReference = _a.objectOrReference, enclosingRef = _a.enclosingRef, context = _a.context;
951 if (utilities.isReference(objectOrReference) &&
952 !context.policies.rootTypenamesById[objectOrReference.__ref] &&
953 !context.store.has(objectOrReference.__ref)) {
954 return {
955 result: this.canon.empty,
956 missing: "Dangling reference to missing ".concat(objectOrReference.__ref, " object"),
957 };
958 }
959 var variables = context.variables, policies = context.policies, store = context.store;
960 var typename = store.getFieldValue(objectOrReference, "__typename");
961 var objectsToMerge = [];
962 var missing;
963 var missingMerger = new utilities.DeepMerger();
964 if (this.config.addTypename &&
965 typeof typename === "string" &&
966 !policies.rootIdsByTypename[typename]) {
967 objectsToMerge.push({ __typename: typename });
968 }
969 function handleMissing(result, resultName) {
970 var _a;
971 if (result.missing) {
972 missing = missingMerger.merge(missing, (_a = {},
973 _a[resultName] = result.missing,
974 _a));
975 }
976 return result.result;
977 }
978 var workSet = new Set(selectionSet.selections);
979 workSet.forEach(function (selection) {
980 var _a, _b;
981 if (!utilities.shouldInclude(selection, variables))
982 return;
983 if (utilities.isField(selection)) {
984 var fieldValue = policies.readField({
985 fieldName: selection.name.value,
986 field: selection,
987 variables: context.variables,
988 from: objectOrReference,
989 }, context);
990 var resultName = utilities.resultKeyNameFromField(selection);
991 if (fieldValue === void 0) {
992 if (!utilities.addTypenameToDocument.added(selection)) {
993 missing = missingMerger.merge(missing, (_a = {},
994 _a[resultName] = "Can't find field '".concat(selection.name.value, "' on ").concat(utilities.isReference(objectOrReference) ?
995 objectOrReference.__ref + " object"
996 : "object " + JSON.stringify(objectOrReference, null, 2)),
997 _a));
998 }
999 }
1000 else if (utilities.isArray(fieldValue)) {
1001 if (fieldValue.length > 0) {
1002 fieldValue = handleMissing(_this.executeSubSelectedArray({
1003 field: selection,
1004 array: fieldValue,
1005 enclosingRef: enclosingRef,
1006 context: context,
1007 }), resultName);
1008 }
1009 }
1010 else if (!selection.selectionSet) {
1011 if (context.canonizeResults) {
1012 fieldValue = _this.canon.pass(fieldValue);
1013 }
1014 }
1015 else if (fieldValue != null) {
1016 fieldValue = handleMissing(_this.executeSelectionSet({
1017 selectionSet: selection.selectionSet,
1018 objectOrReference: fieldValue,
1019 enclosingRef: utilities.isReference(fieldValue) ? fieldValue : enclosingRef,
1020 context: context,
1021 }), resultName);
1022 }
1023 if (fieldValue !== void 0) {
1024 objectsToMerge.push((_b = {}, _b[resultName] = fieldValue, _b));
1025 }
1026 }
1027 else {
1028 var fragment = utilities.getFragmentFromSelection(selection, context.lookupFragment);
1029 if (!fragment && selection.kind === graphql.Kind.FRAGMENT_SPREAD) {
1030 throw globals.newInvariantError(9, selection.name.value);
1031 }
1032 if (fragment && policies.fragmentMatches(fragment, typename)) {
1033 fragment.selectionSet.selections.forEach(workSet.add, workSet);
1034 }
1035 }
1036 });
1037 var result = utilities.mergeDeepArray(objectsToMerge);
1038 var finalResult = { result: result, missing: missing };
1039 var frozen = context.canonizeResults ?
1040 this.canon.admit(finalResult)
1041 : utilities.maybeDeepFreeze(finalResult);
1042 if (frozen.result) {
1043 this.knownResults.set(frozen.result, selectionSet);
1044 }
1045 return frozen;
1046 };
1047 StoreReader.prototype.execSubSelectedArrayImpl = function (_a) {
1048 var _this = this;
1049 var field = _a.field, array = _a.array, enclosingRef = _a.enclosingRef, context = _a.context;
1050 var missing;
1051 var missingMerger = new utilities.DeepMerger();
1052 function handleMissing(childResult, i) {
1053 var _a;
1054 if (childResult.missing) {
1055 missing = missingMerger.merge(missing, (_a = {}, _a[i] = childResult.missing, _a));
1056 }
1057 return childResult.result;
1058 }
1059 if (field.selectionSet) {
1060 array = array.filter(context.store.canRead);
1061 }
1062 array = array.map(function (item, i) {
1063 if (item === null) {
1064 return null;
1065 }
1066 if (utilities.isArray(item)) {
1067 return handleMissing(_this.executeSubSelectedArray({
1068 field: field,
1069 array: item,
1070 enclosingRef: enclosingRef,
1071 context: context,
1072 }), i);
1073 }
1074 if (field.selectionSet) {
1075 return handleMissing(_this.executeSelectionSet({
1076 selectionSet: field.selectionSet,
1077 objectOrReference: item,
1078 enclosingRef: utilities.isReference(item) ? item : enclosingRef,
1079 context: context,
1080 }), i);
1081 }
1082 if (globalThis.__DEV__ !== false) {
1083 assertSelectionSetForIdValue(context.store, field, item);
1084 }
1085 return item;
1086 });
1087 return {
1088 result: context.canonizeResults ? this.canon.admit(array) : array,
1089 missing: missing,
1090 };
1091 };
1092 return StoreReader;
1093}());
1094function firstMissing(tree) {
1095 try {
1096 JSON.stringify(tree, function (_, value) {
1097 if (typeof value === "string")
1098 throw value;
1099 return value;
1100 });
1101 }
1102 catch (result) {
1103 return result;
1104 }
1105}
1106function assertSelectionSetForIdValue(store, field, fieldValue) {
1107 if (!field.selectionSet) {
1108 var workSet_1 = new Set([fieldValue]);
1109 workSet_1.forEach(function (value) {
1110 if (utilities.isNonNullObject(value)) {
1111 globals.invariant(
1112 !utilities.isReference(value),
1113 10,
1114 getTypenameFromStoreObject(store, value),
1115 field.name.value
1116 );
1117 Object.values(value).forEach(workSet_1.add, workSet_1);
1118 }
1119 });
1120 }
1121}
1122
1123var cacheSlot = new optimism.Slot();
1124var cacheInfoMap = new WeakMap();
1125function getCacheInfo(cache) {
1126 var info = cacheInfoMap.get(cache);
1127 if (!info) {
1128 cacheInfoMap.set(cache, (info = {
1129 vars: new Set(),
1130 dep: optimism.dep(),
1131 }));
1132 }
1133 return info;
1134}
1135function forgetCache(cache) {
1136 getCacheInfo(cache).vars.forEach(function (rv) { return rv.forgetCache(cache); });
1137}
1138function recallCache(cache) {
1139 getCacheInfo(cache).vars.forEach(function (rv) { return rv.attachCache(cache); });
1140}
1141function makeVar(value) {
1142 var caches = new Set();
1143 var listeners = new Set();
1144 var rv = function (newValue) {
1145 if (arguments.length > 0) {
1146 if (value !== newValue) {
1147 value = newValue;
1148 caches.forEach(function (cache) {
1149 getCacheInfo(cache).dep.dirty(rv);
1150 broadcast(cache);
1151 });
1152 var oldListeners = Array.from(listeners);
1153 listeners.clear();
1154 oldListeners.forEach(function (listener) { return listener(value); });
1155 }
1156 }
1157 else {
1158 var cache = cacheSlot.getValue();
1159 if (cache) {
1160 attach(cache);
1161 getCacheInfo(cache).dep(rv);
1162 }
1163 }
1164 return value;
1165 };
1166 rv.onNextChange = function (listener) {
1167 listeners.add(listener);
1168 return function () {
1169 listeners.delete(listener);
1170 };
1171 };
1172 var attach = (rv.attachCache = function (cache) {
1173 caches.add(cache);
1174 getCacheInfo(cache).vars.add(rv);
1175 return rv;
1176 });
1177 rv.forgetCache = function (cache) { return caches.delete(cache); };
1178 return rv;
1179}
1180function broadcast(cache) {
1181 if (cache.broadcastWatches) {
1182 cache.broadcastWatches();
1183 }
1184}
1185
1186var specifierInfoCache = Object.create(null);
1187function lookupSpecifierInfo(spec) {
1188 var cacheKey = JSON.stringify(spec);
1189 return (specifierInfoCache[cacheKey] ||
1190 (specifierInfoCache[cacheKey] = Object.create(null)));
1191}
1192function keyFieldsFnFromSpecifier(specifier) {
1193 var info = lookupSpecifierInfo(specifier);
1194 return (info.keyFieldsFn || (info.keyFieldsFn = function (object, context) {
1195 var extract = function (from, key) {
1196 return context.readField(key, from);
1197 };
1198 var keyObject = (context.keyObject = collectSpecifierPaths(specifier, function (schemaKeyPath) {
1199 var extracted = extractKeyPath(context.storeObject, schemaKeyPath,
1200 extract);
1201 if (extracted === void 0 &&
1202 object !== context.storeObject &&
1203 hasOwn.call(object, schemaKeyPath[0])) {
1204 extracted = extractKeyPath(object, schemaKeyPath, extractKey);
1205 }
1206 globals.invariant(extracted !== void 0, 4, schemaKeyPath.join("."), object);
1207 return extracted;
1208 }));
1209 return "".concat(context.typename, ":").concat(JSON.stringify(keyObject));
1210 }));
1211}
1212function keyArgsFnFromSpecifier(specifier) {
1213 var info = lookupSpecifierInfo(specifier);
1214 return (info.keyArgsFn ||
1215 (info.keyArgsFn = function (args, _a) {
1216 var field = _a.field, variables = _a.variables, fieldName = _a.fieldName;
1217 var collected = collectSpecifierPaths(specifier, function (keyPath) {
1218 var firstKey = keyPath[0];
1219 var firstChar = firstKey.charAt(0);
1220 if (firstChar === "@") {
1221 if (field && utilities.isNonEmptyArray(field.directives)) {
1222 var directiveName_1 = firstKey.slice(1);
1223 var d = field.directives.find(function (d) { return d.name.value === directiveName_1; });
1224 var directiveArgs = d && utilities.argumentsObjectFromField(d, variables);
1225 return (directiveArgs &&
1226 extractKeyPath(directiveArgs,
1227 keyPath.slice(1)));
1228 }
1229 return;
1230 }
1231 if (firstChar === "$") {
1232 var variableName = firstKey.slice(1);
1233 if (variables && hasOwn.call(variables, variableName)) {
1234 var varKeyPath = keyPath.slice(0);
1235 varKeyPath[0] = variableName;
1236 return extractKeyPath(variables, varKeyPath);
1237 }
1238 return;
1239 }
1240 if (args) {
1241 return extractKeyPath(args, keyPath);
1242 }
1243 });
1244 var suffix = JSON.stringify(collected);
1245 if (args || suffix !== "{}") {
1246 fieldName += ":" + suffix;
1247 }
1248 return fieldName;
1249 }));
1250}
1251function collectSpecifierPaths(specifier, extractor) {
1252 var merger = new utilities.DeepMerger();
1253 return getSpecifierPaths(specifier).reduce(function (collected, path) {
1254 var _a;
1255 var toMerge = extractor(path);
1256 if (toMerge !== void 0) {
1257 for (var i = path.length - 1; i >= 0; --i) {
1258 toMerge = (_a = {}, _a[path[i]] = toMerge, _a);
1259 }
1260 collected = merger.merge(collected, toMerge);
1261 }
1262 return collected;
1263 }, Object.create(null));
1264}
1265function getSpecifierPaths(spec) {
1266 var info = lookupSpecifierInfo(spec);
1267 if (!info.paths) {
1268 var paths_1 = (info.paths = []);
1269 var currentPath_1 = [];
1270 spec.forEach(function (s, i) {
1271 if (utilities.isArray(s)) {
1272 getSpecifierPaths(s).forEach(function (p) { return paths_1.push(currentPath_1.concat(p)); });
1273 currentPath_1.length = 0;
1274 }
1275 else {
1276 currentPath_1.push(s);
1277 if (!utilities.isArray(spec[i + 1])) {
1278 paths_1.push(currentPath_1.slice(0));
1279 currentPath_1.length = 0;
1280 }
1281 }
1282 });
1283 }
1284 return info.paths;
1285}
1286function extractKey(object, key) {
1287 return object[key];
1288}
1289function extractKeyPath(object, path, extract) {
1290 extract = extract || extractKey;
1291 return normalize(path.reduce(function reducer(obj, key) {
1292 return utilities.isArray(obj) ?
1293 obj.map(function (child) { return reducer(child, key); })
1294 : obj && extract(obj, key);
1295 }, object));
1296}
1297function normalize(value) {
1298 if (utilities.isNonNullObject(value)) {
1299 if (utilities.isArray(value)) {
1300 return value.map(normalize);
1301 }
1302 return collectSpecifierPaths(Object.keys(value).sort(), function (path) {
1303 return extractKeyPath(value, path);
1304 });
1305 }
1306 return value;
1307}
1308
1309function argsFromFieldSpecifier(spec) {
1310 return (spec.args !== void 0 ? spec.args
1311 : spec.field ? utilities.argumentsObjectFromField(spec.field, spec.variables)
1312 : null);
1313}
1314var nullKeyFieldsFn = function () { return void 0; };
1315var simpleKeyArgsFn = function (_args, context) { return context.fieldName; };
1316var mergeTrueFn = function (existing, incoming, _a) {
1317 var mergeObjects = _a.mergeObjects;
1318 return mergeObjects(existing, incoming);
1319};
1320var mergeFalseFn = function (_, incoming) { return incoming; };
1321var Policies = (function () {
1322 function Policies(config) {
1323 this.config = config;
1324 this.typePolicies = Object.create(null);
1325 this.toBeAdded = Object.create(null);
1326 this.supertypeMap = new Map();
1327 this.fuzzySubtypes = new Map();
1328 this.rootIdsByTypename = Object.create(null);
1329 this.rootTypenamesById = Object.create(null);
1330 this.usingPossibleTypes = false;
1331 this.config = tslib.__assign({ dataIdFromObject: defaultDataIdFromObject }, config);
1332 this.cache = this.config.cache;
1333 this.setRootTypename("Query");
1334 this.setRootTypename("Mutation");
1335 this.setRootTypename("Subscription");
1336 if (config.possibleTypes) {
1337 this.addPossibleTypes(config.possibleTypes);
1338 }
1339 if (config.typePolicies) {
1340 this.addTypePolicies(config.typePolicies);
1341 }
1342 }
1343 Policies.prototype.identify = function (object, partialContext) {
1344 var _a;
1345 var policies = this;
1346 var typename = (partialContext &&
1347 (partialContext.typename || ((_a = partialContext.storeObject) === null || _a === void 0 ? void 0 : _a.__typename))) ||
1348 object.__typename;
1349 if (typename === this.rootTypenamesById.ROOT_QUERY) {
1350 return ["ROOT_QUERY"];
1351 }
1352 var storeObject = (partialContext && partialContext.storeObject) || object;
1353 var context = tslib.__assign(tslib.__assign({}, partialContext), { typename: typename, storeObject: storeObject, readField: (partialContext && partialContext.readField) ||
1354 function () {
1355 var options = normalizeReadFieldOptions(arguments, storeObject);
1356 return policies.readField(options, {
1357 store: policies.cache["data"],
1358 variables: options.variables,
1359 });
1360 } });
1361 var id;
1362 var policy = typename && this.getTypePolicy(typename);
1363 var keyFn = (policy && policy.keyFn) || this.config.dataIdFromObject;
1364 while (keyFn) {
1365 var specifierOrId = keyFn(tslib.__assign(tslib.__assign({}, object), storeObject), context);
1366 if (utilities.isArray(specifierOrId)) {
1367 keyFn = keyFieldsFnFromSpecifier(specifierOrId);
1368 }
1369 else {
1370 id = specifierOrId;
1371 break;
1372 }
1373 }
1374 id = id ? String(id) : void 0;
1375 return context.keyObject ? [id, context.keyObject] : [id];
1376 };
1377 Policies.prototype.addTypePolicies = function (typePolicies) {
1378 var _this = this;
1379 Object.keys(typePolicies).forEach(function (typename) {
1380 var _a = typePolicies[typename], queryType = _a.queryType, mutationType = _a.mutationType, subscriptionType = _a.subscriptionType, incoming = tslib.__rest(_a, ["queryType", "mutationType", "subscriptionType"]);
1381 if (queryType)
1382 _this.setRootTypename("Query", typename);
1383 if (mutationType)
1384 _this.setRootTypename("Mutation", typename);
1385 if (subscriptionType)
1386 _this.setRootTypename("Subscription", typename);
1387 if (hasOwn.call(_this.toBeAdded, typename)) {
1388 _this.toBeAdded[typename].push(incoming);
1389 }
1390 else {
1391 _this.toBeAdded[typename] = [incoming];
1392 }
1393 });
1394 };
1395 Policies.prototype.updateTypePolicy = function (typename, incoming) {
1396 var _this = this;
1397 var existing = this.getTypePolicy(typename);
1398 var keyFields = incoming.keyFields, fields = incoming.fields;
1399 function setMerge(existing, merge) {
1400 existing.merge =
1401 typeof merge === "function" ? merge
1402 : merge === true ? mergeTrueFn
1403 : merge === false ? mergeFalseFn
1404 : existing.merge;
1405 }
1406 setMerge(existing, incoming.merge);
1407 existing.keyFn =
1408 keyFields === false ? nullKeyFieldsFn
1409 : utilities.isArray(keyFields) ? keyFieldsFnFromSpecifier(keyFields)
1410 : typeof keyFields === "function" ? keyFields
1411 : existing.keyFn;
1412 if (fields) {
1413 Object.keys(fields).forEach(function (fieldName) {
1414 var existing = _this.getFieldPolicy(typename, fieldName, true);
1415 var incoming = fields[fieldName];
1416 if (typeof incoming === "function") {
1417 existing.read = incoming;
1418 }
1419 else {
1420 var keyArgs = incoming.keyArgs, read = incoming.read, merge = incoming.merge;
1421 existing.keyFn =
1422 keyArgs === false ? simpleKeyArgsFn
1423 : utilities.isArray(keyArgs) ? keyArgsFnFromSpecifier(keyArgs)
1424 : typeof keyArgs === "function" ? keyArgs
1425 : existing.keyFn;
1426 if (typeof read === "function") {
1427 existing.read = read;
1428 }
1429 setMerge(existing, merge);
1430 }
1431 if (existing.read && existing.merge) {
1432 existing.keyFn = existing.keyFn || simpleKeyArgsFn;
1433 }
1434 });
1435 }
1436 };
1437 Policies.prototype.setRootTypename = function (which, typename) {
1438 if (typename === void 0) { typename = which; }
1439 var rootId = "ROOT_" + which.toUpperCase();
1440 var old = this.rootTypenamesById[rootId];
1441 if (typename !== old) {
1442 globals.invariant(!old || old === which, 5, which);
1443 if (old)
1444 delete this.rootIdsByTypename[old];
1445 this.rootIdsByTypename[typename] = rootId;
1446 this.rootTypenamesById[rootId] = typename;
1447 }
1448 };
1449 Policies.prototype.addPossibleTypes = function (possibleTypes) {
1450 var _this = this;
1451 this.usingPossibleTypes = true;
1452 Object.keys(possibleTypes).forEach(function (supertype) {
1453 _this.getSupertypeSet(supertype, true);
1454 possibleTypes[supertype].forEach(function (subtype) {
1455 _this.getSupertypeSet(subtype, true).add(supertype);
1456 var match = subtype.match(TypeOrFieldNameRegExp);
1457 if (!match || match[0] !== subtype) {
1458 _this.fuzzySubtypes.set(subtype, new RegExp(subtype));
1459 }
1460 });
1461 });
1462 };
1463 Policies.prototype.getTypePolicy = function (typename) {
1464 var _this = this;
1465 if (!hasOwn.call(this.typePolicies, typename)) {
1466 var policy_1 = (this.typePolicies[typename] = Object.create(null));
1467 policy_1.fields = Object.create(null);
1468 var supertypes_1 = this.supertypeMap.get(typename);
1469 if (!supertypes_1 && this.fuzzySubtypes.size) {
1470 supertypes_1 = this.getSupertypeSet(typename, true);
1471 this.fuzzySubtypes.forEach(function (regExp, fuzzy) {
1472 if (regExp.test(typename)) {
1473 var fuzzySupertypes = _this.supertypeMap.get(fuzzy);
1474 if (fuzzySupertypes) {
1475 fuzzySupertypes.forEach(function (supertype) {
1476 return supertypes_1.add(supertype);
1477 });
1478 }
1479 }
1480 });
1481 }
1482 if (supertypes_1 && supertypes_1.size) {
1483 supertypes_1.forEach(function (supertype) {
1484 var _a = _this.getTypePolicy(supertype), fields = _a.fields, rest = tslib.__rest(_a, ["fields"]);
1485 Object.assign(policy_1, rest);
1486 Object.assign(policy_1.fields, fields);
1487 });
1488 }
1489 }
1490 var inbox = this.toBeAdded[typename];
1491 if (inbox && inbox.length) {
1492 inbox.splice(0).forEach(function (policy) {
1493 _this.updateTypePolicy(typename, policy);
1494 });
1495 }
1496 return this.typePolicies[typename];
1497 };
1498 Policies.prototype.getFieldPolicy = function (typename, fieldName, createIfMissing) {
1499 if (typename) {
1500 var fieldPolicies = this.getTypePolicy(typename).fields;
1501 return (fieldPolicies[fieldName] ||
1502 (createIfMissing && (fieldPolicies[fieldName] = Object.create(null))));
1503 }
1504 };
1505 Policies.prototype.getSupertypeSet = function (subtype, createIfMissing) {
1506 var supertypeSet = this.supertypeMap.get(subtype);
1507 if (!supertypeSet && createIfMissing) {
1508 this.supertypeMap.set(subtype, (supertypeSet = new Set()));
1509 }
1510 return supertypeSet;
1511 };
1512 Policies.prototype.fragmentMatches = function (fragment, typename, result, variables) {
1513 var _this = this;
1514 if (!fragment.typeCondition)
1515 return true;
1516 if (!typename)
1517 return false;
1518 var supertype = fragment.typeCondition.name.value;
1519 if (typename === supertype)
1520 return true;
1521 if (this.usingPossibleTypes && this.supertypeMap.has(supertype)) {
1522 var typenameSupertypeSet = this.getSupertypeSet(typename, true);
1523 var workQueue_1 = [typenameSupertypeSet];
1524 var maybeEnqueue_1 = function (subtype) {
1525 var supertypeSet = _this.getSupertypeSet(subtype, false);
1526 if (supertypeSet &&
1527 supertypeSet.size &&
1528 workQueue_1.indexOf(supertypeSet) < 0) {
1529 workQueue_1.push(supertypeSet);
1530 }
1531 };
1532 var needToCheckFuzzySubtypes = !!(result && this.fuzzySubtypes.size);
1533 var checkingFuzzySubtypes = false;
1534 for (var i = 0; i < workQueue_1.length; ++i) {
1535 var supertypeSet = workQueue_1[i];
1536 if (supertypeSet.has(supertype)) {
1537 if (!typenameSupertypeSet.has(supertype)) {
1538 if (checkingFuzzySubtypes) {
1539 globalThis.__DEV__ !== false && globals.invariant.warn(6, typename, supertype);
1540 }
1541 typenameSupertypeSet.add(supertype);
1542 }
1543 return true;
1544 }
1545 supertypeSet.forEach(maybeEnqueue_1);
1546 if (needToCheckFuzzySubtypes &&
1547 i === workQueue_1.length - 1 &&
1548 selectionSetMatchesResult(fragment.selectionSet, result, variables)) {
1549 needToCheckFuzzySubtypes = false;
1550 checkingFuzzySubtypes = true;
1551 this.fuzzySubtypes.forEach(function (regExp, fuzzyString) {
1552 var match = typename.match(regExp);
1553 if (match && match[0] === typename) {
1554 maybeEnqueue_1(fuzzyString);
1555 }
1556 });
1557 }
1558 }
1559 }
1560 return false;
1561 };
1562 Policies.prototype.hasKeyArgs = function (typename, fieldName) {
1563 var policy = this.getFieldPolicy(typename, fieldName, false);
1564 return !!(policy && policy.keyFn);
1565 };
1566 Policies.prototype.getStoreFieldName = function (fieldSpec) {
1567 var typename = fieldSpec.typename, fieldName = fieldSpec.fieldName;
1568 var policy = this.getFieldPolicy(typename, fieldName, false);
1569 var storeFieldName;
1570 var keyFn = policy && policy.keyFn;
1571 if (keyFn && typename) {
1572 var context = {
1573 typename: typename,
1574 fieldName: fieldName,
1575 field: fieldSpec.field || null,
1576 variables: fieldSpec.variables,
1577 };
1578 var args = argsFromFieldSpecifier(fieldSpec);
1579 while (keyFn) {
1580 var specifierOrString = keyFn(args, context);
1581 if (utilities.isArray(specifierOrString)) {
1582 keyFn = keyArgsFnFromSpecifier(specifierOrString);
1583 }
1584 else {
1585 storeFieldName = specifierOrString || fieldName;
1586 break;
1587 }
1588 }
1589 }
1590 if (storeFieldName === void 0) {
1591 storeFieldName =
1592 fieldSpec.field ?
1593 utilities.storeKeyNameFromField(fieldSpec.field, fieldSpec.variables)
1594 : utilities.getStoreKeyName(fieldName, argsFromFieldSpecifier(fieldSpec));
1595 }
1596 if (storeFieldName === false) {
1597 return fieldName;
1598 }
1599 return fieldName === fieldNameFromStoreName(storeFieldName) ? storeFieldName
1600 : fieldName + ":" + storeFieldName;
1601 };
1602 Policies.prototype.readField = function (options, context) {
1603 var objectOrReference = options.from;
1604 if (!objectOrReference)
1605 return;
1606 var nameOrField = options.field || options.fieldName;
1607 if (!nameOrField)
1608 return;
1609 if (options.typename === void 0) {
1610 var typename = context.store.getFieldValue(objectOrReference, "__typename");
1611 if (typename)
1612 options.typename = typename;
1613 }
1614 var storeFieldName = this.getStoreFieldName(options);
1615 var fieldName = fieldNameFromStoreName(storeFieldName);
1616 var existing = context.store.getFieldValue(objectOrReference, storeFieldName);
1617 var policy = this.getFieldPolicy(options.typename, fieldName, false);
1618 var read = policy && policy.read;
1619 if (read) {
1620 var readOptions = makeFieldFunctionOptions(this, objectOrReference, options, context, context.store.getStorage(utilities.isReference(objectOrReference) ?
1621 objectOrReference.__ref
1622 : objectOrReference, storeFieldName));
1623 return cacheSlot.withValue(this.cache, read, [
1624 existing,
1625 readOptions,
1626 ]);
1627 }
1628 return existing;
1629 };
1630 Policies.prototype.getReadFunction = function (typename, fieldName) {
1631 var policy = this.getFieldPolicy(typename, fieldName, false);
1632 return policy && policy.read;
1633 };
1634 Policies.prototype.getMergeFunction = function (parentTypename, fieldName, childTypename) {
1635 var policy = this.getFieldPolicy(parentTypename, fieldName, false);
1636 var merge = policy && policy.merge;
1637 if (!merge && childTypename) {
1638 policy = this.getTypePolicy(childTypename);
1639 merge = policy && policy.merge;
1640 }
1641 return merge;
1642 };
1643 Policies.prototype.runMergeFunction = function (existing, incoming, _a, context, storage) {
1644 var field = _a.field, typename = _a.typename, merge = _a.merge;
1645 if (merge === mergeTrueFn) {
1646 return makeMergeObjectsFunction(context.store)(existing, incoming);
1647 }
1648 if (merge === mergeFalseFn) {
1649 return incoming;
1650 }
1651 if (context.overwrite) {
1652 existing = void 0;
1653 }
1654 return merge(existing, incoming, makeFieldFunctionOptions(this,
1655 void 0, {
1656 typename: typename,
1657 fieldName: field.name.value,
1658 field: field,
1659 variables: context.variables,
1660 }, context, storage || Object.create(null)));
1661 };
1662 return Policies;
1663}());
1664function makeFieldFunctionOptions(policies, objectOrReference, fieldSpec, context, storage) {
1665 var storeFieldName = policies.getStoreFieldName(fieldSpec);
1666 var fieldName = fieldNameFromStoreName(storeFieldName);
1667 var variables = fieldSpec.variables || context.variables;
1668 var _a = context.store, toReference = _a.toReference, canRead = _a.canRead;
1669 return {
1670 args: argsFromFieldSpecifier(fieldSpec),
1671 field: fieldSpec.field || null,
1672 fieldName: fieldName,
1673 storeFieldName: storeFieldName,
1674 variables: variables,
1675 isReference: utilities.isReference,
1676 toReference: toReference,
1677 storage: storage,
1678 cache: policies.cache,
1679 canRead: canRead,
1680 readField: function () {
1681 return policies.readField(normalizeReadFieldOptions(arguments, objectOrReference, variables), context);
1682 },
1683 mergeObjects: makeMergeObjectsFunction(context.store),
1684 };
1685}
1686function normalizeReadFieldOptions(readFieldArgs, objectOrReference, variables) {
1687 var fieldNameOrOptions = readFieldArgs[0], from = readFieldArgs[1], argc = readFieldArgs.length;
1688 var options;
1689 if (typeof fieldNameOrOptions === "string") {
1690 options = {
1691 fieldName: fieldNameOrOptions,
1692 from: argc > 1 ? from : objectOrReference,
1693 };
1694 }
1695 else {
1696 options = tslib.__assign({}, fieldNameOrOptions);
1697 if (!hasOwn.call(options, "from")) {
1698 options.from = objectOrReference;
1699 }
1700 }
1701 if (globalThis.__DEV__ !== false && options.from === void 0) {
1702 globalThis.__DEV__ !== false && globals.invariant.warn(7, utilities.stringifyForDisplay(Array.from(readFieldArgs)));
1703 }
1704 if (void 0 === options.variables) {
1705 options.variables = variables;
1706 }
1707 return options;
1708}
1709function makeMergeObjectsFunction(store) {
1710 return function mergeObjects(existing, incoming) {
1711 if (utilities.isArray(existing) || utilities.isArray(incoming)) {
1712 throw globals.newInvariantError(8);
1713 }
1714 if (utilities.isNonNullObject(existing) && utilities.isNonNullObject(incoming)) {
1715 var eType = store.getFieldValue(existing, "__typename");
1716 var iType = store.getFieldValue(incoming, "__typename");
1717 var typesDiffer = eType && iType && eType !== iType;
1718 if (typesDiffer) {
1719 return incoming;
1720 }
1721 if (utilities.isReference(existing) && storeValueIsStoreObject(incoming)) {
1722 store.merge(existing.__ref, incoming);
1723 return existing;
1724 }
1725 if (storeValueIsStoreObject(existing) && utilities.isReference(incoming)) {
1726 store.merge(existing, incoming.__ref);
1727 return incoming;
1728 }
1729 if (storeValueIsStoreObject(existing) &&
1730 storeValueIsStoreObject(incoming)) {
1731 return tslib.__assign(tslib.__assign({}, existing), incoming);
1732 }
1733 }
1734 return incoming;
1735 };
1736}
1737
1738function getContextFlavor(context, clientOnly, deferred) {
1739 var key = "".concat(clientOnly).concat(deferred);
1740 var flavored = context.flavors.get(key);
1741 if (!flavored) {
1742 context.flavors.set(key, (flavored =
1743 context.clientOnly === clientOnly && context.deferred === deferred ?
1744 context
1745 : tslib.__assign(tslib.__assign({}, context), { clientOnly: clientOnly, deferred: deferred })));
1746 }
1747 return flavored;
1748}
1749var StoreWriter = (function () {
1750 function StoreWriter(cache, reader, fragments) {
1751 this.cache = cache;
1752 this.reader = reader;
1753 this.fragments = fragments;
1754 }
1755 StoreWriter.prototype.writeToStore = function (store, _a) {
1756 var _this = this;
1757 var query = _a.query, result = _a.result, dataId = _a.dataId, variables = _a.variables, overwrite = _a.overwrite;
1758 var operationDefinition = utilities.getOperationDefinition(query);
1759 var merger = makeProcessedFieldsMerger();
1760 variables = tslib.__assign(tslib.__assign({}, utilities.getDefaultValues(operationDefinition)), variables);
1761 var context = tslib.__assign(tslib.__assign({ store: store, written: Object.create(null), merge: function (existing, incoming) {
1762 return merger.merge(existing, incoming);
1763 }, variables: variables, varString: utilities.canonicalStringify(variables) }, extractFragmentContext(query, this.fragments)), { overwrite: !!overwrite, incomingById: new Map(), clientOnly: false, deferred: false, flavors: new Map() });
1764 var ref = this.processSelectionSet({
1765 result: result || Object.create(null),
1766 dataId: dataId,
1767 selectionSet: operationDefinition.selectionSet,
1768 mergeTree: { map: new Map() },
1769 context: context,
1770 });
1771 if (!utilities.isReference(ref)) {
1772 throw globals.newInvariantError(11, result);
1773 }
1774 context.incomingById.forEach(function (_a, dataId) {
1775 var storeObject = _a.storeObject, mergeTree = _a.mergeTree, fieldNodeSet = _a.fieldNodeSet;
1776 var entityRef = utilities.makeReference(dataId);
1777 if (mergeTree && mergeTree.map.size) {
1778 var applied = _this.applyMerges(mergeTree, entityRef, storeObject, context);
1779 if (utilities.isReference(applied)) {
1780 return;
1781 }
1782 storeObject = applied;
1783 }
1784 if (globalThis.__DEV__ !== false && !context.overwrite) {
1785 var fieldsWithSelectionSets_1 = Object.create(null);
1786 fieldNodeSet.forEach(function (field) {
1787 if (field.selectionSet) {
1788 fieldsWithSelectionSets_1[field.name.value] = true;
1789 }
1790 });
1791 var hasSelectionSet_1 = function (storeFieldName) {
1792 return fieldsWithSelectionSets_1[fieldNameFromStoreName(storeFieldName)] ===
1793 true;
1794 };
1795 var hasMergeFunction_1 = function (storeFieldName) {
1796 var childTree = mergeTree && mergeTree.map.get(storeFieldName);
1797 return Boolean(childTree && childTree.info && childTree.info.merge);
1798 };
1799 Object.keys(storeObject).forEach(function (storeFieldName) {
1800 if (hasSelectionSet_1(storeFieldName) &&
1801 !hasMergeFunction_1(storeFieldName)) {
1802 warnAboutDataLoss(entityRef, storeObject, storeFieldName, context.store);
1803 }
1804 });
1805 }
1806 store.merge(dataId, storeObject);
1807 });
1808 store.retain(ref.__ref);
1809 return ref;
1810 };
1811 StoreWriter.prototype.processSelectionSet = function (_a) {
1812 var _this = this;
1813 var dataId = _a.dataId, result = _a.result, selectionSet = _a.selectionSet, context = _a.context,
1814 mergeTree = _a.mergeTree;
1815 var policies = this.cache.policies;
1816 var incoming = Object.create(null);
1817 var typename = (dataId && policies.rootTypenamesById[dataId]) ||
1818 utilities.getTypenameFromResult(result, selectionSet, context.fragmentMap) ||
1819 (dataId && context.store.get(dataId, "__typename"));
1820 if ("string" === typeof typename) {
1821 incoming.__typename = typename;
1822 }
1823 var readField = function () {
1824 var options = normalizeReadFieldOptions(arguments, incoming, context.variables);
1825 if (utilities.isReference(options.from)) {
1826 var info = context.incomingById.get(options.from.__ref);
1827 if (info) {
1828 var result_1 = policies.readField(tslib.__assign(tslib.__assign({}, options), { from: info.storeObject }), context);
1829 if (result_1 !== void 0) {
1830 return result_1;
1831 }
1832 }
1833 }
1834 return policies.readField(options, context);
1835 };
1836 var fieldNodeSet = new Set();
1837 this.flattenFields(selectionSet, result,
1838 context, typename).forEach(function (context, field) {
1839 var _a;
1840 var resultFieldKey = utilities.resultKeyNameFromField(field);
1841 var value = result[resultFieldKey];
1842 fieldNodeSet.add(field);
1843 if (value !== void 0) {
1844 var storeFieldName = policies.getStoreFieldName({
1845 typename: typename,
1846 fieldName: field.name.value,
1847 field: field,
1848 variables: context.variables,
1849 });
1850 var childTree = getChildMergeTree(mergeTree, storeFieldName);
1851 var incomingValue = _this.processFieldValue(value, field,
1852 field.selectionSet ?
1853 getContextFlavor(context, false, false)
1854 : context, childTree);
1855 var childTypename = void 0;
1856 if (field.selectionSet &&
1857 (utilities.isReference(incomingValue) || storeValueIsStoreObject(incomingValue))) {
1858 childTypename = readField("__typename", incomingValue);
1859 }
1860 var merge = policies.getMergeFunction(typename, field.name.value, childTypename);
1861 if (merge) {
1862 childTree.info = {
1863 field: field,
1864 typename: typename,
1865 merge: merge,
1866 };
1867 }
1868 else {
1869 maybeRecycleChildMergeTree(mergeTree, storeFieldName);
1870 }
1871 incoming = context.merge(incoming, (_a = {},
1872 _a[storeFieldName] = incomingValue,
1873 _a));
1874 }
1875 else if (globalThis.__DEV__ !== false &&
1876 !context.clientOnly &&
1877 !context.deferred &&
1878 !utilities.addTypenameToDocument.added(field) &&
1879 !policies.getReadFunction(typename, field.name.value)) {
1880 globalThis.__DEV__ !== false && globals.invariant.error(12, utilities.resultKeyNameFromField(field), result);
1881 }
1882 });
1883 try {
1884 var _b = policies.identify(result, {
1885 typename: typename,
1886 selectionSet: selectionSet,
1887 fragmentMap: context.fragmentMap,
1888 storeObject: incoming,
1889 readField: readField,
1890 }), id = _b[0], keyObject = _b[1];
1891 dataId = dataId || id;
1892 if (keyObject) {
1893 incoming = context.merge(incoming, keyObject);
1894 }
1895 }
1896 catch (e) {
1897 if (!dataId)
1898 throw e;
1899 }
1900 if ("string" === typeof dataId) {
1901 var dataRef = utilities.makeReference(dataId);
1902 var sets = context.written[dataId] || (context.written[dataId] = []);
1903 if (sets.indexOf(selectionSet) >= 0)
1904 return dataRef;
1905 sets.push(selectionSet);
1906 if (this.reader &&
1907 this.reader.isFresh(result, dataRef, selectionSet, context)) {
1908 return dataRef;
1909 }
1910 var previous_1 = context.incomingById.get(dataId);
1911 if (previous_1) {
1912 previous_1.storeObject = context.merge(previous_1.storeObject, incoming);
1913 previous_1.mergeTree = mergeMergeTrees(previous_1.mergeTree, mergeTree);
1914 fieldNodeSet.forEach(function (field) { return previous_1.fieldNodeSet.add(field); });
1915 }
1916 else {
1917 context.incomingById.set(dataId, {
1918 storeObject: incoming,
1919 mergeTree: mergeTreeIsEmpty(mergeTree) ? void 0 : mergeTree,
1920 fieldNodeSet: fieldNodeSet,
1921 });
1922 }
1923 return dataRef;
1924 }
1925 return incoming;
1926 };
1927 StoreWriter.prototype.processFieldValue = function (value, field, context, mergeTree) {
1928 var _this = this;
1929 if (!field.selectionSet || value === null) {
1930 return globalThis.__DEV__ !== false ? utilities.cloneDeep(value) : value;
1931 }
1932 if (utilities.isArray(value)) {
1933 return value.map(function (item, i) {
1934 var value = _this.processFieldValue(item, field, context, getChildMergeTree(mergeTree, i));
1935 maybeRecycleChildMergeTree(mergeTree, i);
1936 return value;
1937 });
1938 }
1939 return this.processSelectionSet({
1940 result: value,
1941 selectionSet: field.selectionSet,
1942 context: context,
1943 mergeTree: mergeTree,
1944 });
1945 };
1946 StoreWriter.prototype.flattenFields = function (selectionSet, result, context, typename) {
1947 if (typename === void 0) { typename = utilities.getTypenameFromResult(result, selectionSet, context.fragmentMap); }
1948 var fieldMap = new Map();
1949 var policies = this.cache.policies;
1950 var limitingTrie = new trie.Trie(false);
1951 (function flatten(selectionSet, inheritedContext) {
1952 var visitedNode = limitingTrie.lookup(selectionSet,
1953 inheritedContext.clientOnly, inheritedContext.deferred);
1954 if (visitedNode.visited)
1955 return;
1956 visitedNode.visited = true;
1957 selectionSet.selections.forEach(function (selection) {
1958 if (!utilities.shouldInclude(selection, context.variables))
1959 return;
1960 var clientOnly = inheritedContext.clientOnly, deferred = inheritedContext.deferred;
1961 if (
1962 !(clientOnly && deferred) &&
1963 utilities.isNonEmptyArray(selection.directives)) {
1964 selection.directives.forEach(function (dir) {
1965 var name = dir.name.value;
1966 if (name === "client")
1967 clientOnly = true;
1968 if (name === "defer") {
1969 var args = utilities.argumentsObjectFromField(dir, context.variables);
1970 if (!args || args.if !== false) {
1971 deferred = true;
1972 }
1973 }
1974 });
1975 }
1976 if (utilities.isField(selection)) {
1977 var existing = fieldMap.get(selection);
1978 if (existing) {
1979 clientOnly = clientOnly && existing.clientOnly;
1980 deferred = deferred && existing.deferred;
1981 }
1982 fieldMap.set(selection, getContextFlavor(context, clientOnly, deferred));
1983 }
1984 else {
1985 var fragment = utilities.getFragmentFromSelection(selection, context.lookupFragment);
1986 if (!fragment && selection.kind === graphql.Kind.FRAGMENT_SPREAD) {
1987 throw globals.newInvariantError(13, selection.name.value);
1988 }
1989 if (fragment &&
1990 policies.fragmentMatches(fragment, typename, result, context.variables)) {
1991 flatten(fragment.selectionSet, getContextFlavor(context, clientOnly, deferred));
1992 }
1993 }
1994 });
1995 })(selectionSet, context);
1996 return fieldMap;
1997 };
1998 StoreWriter.prototype.applyMerges = function (mergeTree, existing, incoming, context, getStorageArgs) {
1999 var _a;
2000 var _this = this;
2001 if (mergeTree.map.size && !utilities.isReference(incoming)) {
2002 var e_1 =
2003 (!utilities.isArray(incoming) &&
2004 (utilities.isReference(existing) || storeValueIsStoreObject(existing))) ?
2005 existing
2006 : void 0;
2007 var i_1 = incoming;
2008 if (e_1 && !getStorageArgs) {
2009 getStorageArgs = [utilities.isReference(e_1) ? e_1.__ref : e_1];
2010 }
2011 var changedFields_1;
2012 var getValue_1 = function (from, name) {
2013 return (utilities.isArray(from) ?
2014 typeof name === "number" ?
2015 from[name]
2016 : void 0
2017 : context.store.getFieldValue(from, String(name)));
2018 };
2019 mergeTree.map.forEach(function (childTree, storeFieldName) {
2020 var eVal = getValue_1(e_1, storeFieldName);
2021 var iVal = getValue_1(i_1, storeFieldName);
2022 if (void 0 === iVal)
2023 return;
2024 if (getStorageArgs) {
2025 getStorageArgs.push(storeFieldName);
2026 }
2027 var aVal = _this.applyMerges(childTree, eVal, iVal, context, getStorageArgs);
2028 if (aVal !== iVal) {
2029 changedFields_1 = changedFields_1 || new Map();
2030 changedFields_1.set(storeFieldName, aVal);
2031 }
2032 if (getStorageArgs) {
2033 globals.invariant(getStorageArgs.pop() === storeFieldName);
2034 }
2035 });
2036 if (changedFields_1) {
2037 incoming = (utilities.isArray(i_1) ? i_1.slice(0) : tslib.__assign({}, i_1));
2038 changedFields_1.forEach(function (value, name) {
2039 incoming[name] = value;
2040 });
2041 }
2042 }
2043 if (mergeTree.info) {
2044 return this.cache.policies.runMergeFunction(existing, incoming, mergeTree.info, context, getStorageArgs && (_a = context.store).getStorage.apply(_a, getStorageArgs));
2045 }
2046 return incoming;
2047 };
2048 return StoreWriter;
2049}());
2050var emptyMergeTreePool = [];
2051function getChildMergeTree(_a, name) {
2052 var map = _a.map;
2053 if (!map.has(name)) {
2054 map.set(name, emptyMergeTreePool.pop() || { map: new Map() });
2055 }
2056 return map.get(name);
2057}
2058function mergeMergeTrees(left, right) {
2059 if (left === right || !right || mergeTreeIsEmpty(right))
2060 return left;
2061 if (!left || mergeTreeIsEmpty(left))
2062 return right;
2063 var info = left.info && right.info ? tslib.__assign(tslib.__assign({}, left.info), right.info) : left.info || right.info;
2064 var needToMergeMaps = left.map.size && right.map.size;
2065 var map = needToMergeMaps ? new Map()
2066 : left.map.size ? left.map
2067 : right.map;
2068 var merged = { info: info, map: map };
2069 if (needToMergeMaps) {
2070 var remainingRightKeys_1 = new Set(right.map.keys());
2071 left.map.forEach(function (leftTree, key) {
2072 merged.map.set(key, mergeMergeTrees(leftTree, right.map.get(key)));
2073 remainingRightKeys_1.delete(key);
2074 });
2075 remainingRightKeys_1.forEach(function (key) {
2076 merged.map.set(key, mergeMergeTrees(right.map.get(key), left.map.get(key)));
2077 });
2078 }
2079 return merged;
2080}
2081function mergeTreeIsEmpty(tree) {
2082 return !tree || !(tree.info || tree.map.size);
2083}
2084function maybeRecycleChildMergeTree(_a, name) {
2085 var map = _a.map;
2086 var childTree = map.get(name);
2087 if (childTree && mergeTreeIsEmpty(childTree)) {
2088 emptyMergeTreePool.push(childTree);
2089 map.delete(name);
2090 }
2091}
2092var warnings = new Set();
2093function warnAboutDataLoss(existingRef, incomingObj, storeFieldName, store) {
2094 var getChild = function (objOrRef) {
2095 var child = store.getFieldValue(objOrRef, storeFieldName);
2096 return typeof child === "object" && child;
2097 };
2098 var existing = getChild(existingRef);
2099 if (!existing)
2100 return;
2101 var incoming = getChild(incomingObj);
2102 if (!incoming)
2103 return;
2104 if (utilities.isReference(existing))
2105 return;
2106 if (equality.equal(existing, incoming))
2107 return;
2108 if (Object.keys(existing).every(function (key) { return store.getFieldValue(incoming, key) !== void 0; })) {
2109 return;
2110 }
2111 var parentType = store.getFieldValue(existingRef, "__typename") ||
2112 store.getFieldValue(incomingObj, "__typename");
2113 var fieldName = fieldNameFromStoreName(storeFieldName);
2114 var typeDotName = "".concat(parentType, ".").concat(fieldName);
2115 if (warnings.has(typeDotName))
2116 return;
2117 warnings.add(typeDotName);
2118 var childTypenames = [];
2119 if (!utilities.isArray(existing) && !utilities.isArray(incoming)) {
2120 [existing, incoming].forEach(function (child) {
2121 var typename = store.getFieldValue(child, "__typename");
2122 if (typeof typename === "string" && !childTypenames.includes(typename)) {
2123 childTypenames.push(typename);
2124 }
2125 });
2126 }
2127 globalThis.__DEV__ !== false && globals.invariant.warn(14, fieldName, parentType, childTypenames.length ?
2128 "either ensure all objects of type " +
2129 childTypenames.join(" and ") +
2130 " have an ID or a custom merge function, or "
2131 : "", typeDotName, existing, incoming);
2132}
2133
2134var InMemoryCache = (function (_super) {
2135 tslib.__extends(InMemoryCache, _super);
2136 function InMemoryCache(config) {
2137 if (config === void 0) { config = {}; }
2138 var _this = _super.call(this) || this;
2139 _this.watches = new Set();
2140 _this.addTypenameTransform = new utilities.DocumentTransform(utilities.addTypenameToDocument);
2141 _this.assumeImmutableResults = true;
2142 _this.makeVar = makeVar;
2143 _this.txCount = 0;
2144 _this.config = normalizeConfig(config);
2145 _this.addTypename = !!_this.config.addTypename;
2146 _this.policies = new Policies({
2147 cache: _this,
2148 dataIdFromObject: _this.config.dataIdFromObject,
2149 possibleTypes: _this.config.possibleTypes,
2150 typePolicies: _this.config.typePolicies,
2151 });
2152 _this.init();
2153 return _this;
2154 }
2155 InMemoryCache.prototype.init = function () {
2156 var rootStore = (this.data = new exports.EntityStore.Root({
2157 policies: this.policies,
2158 resultCaching: this.config.resultCaching,
2159 }));
2160 this.optimisticData = rootStore.stump;
2161 this.resetResultCache();
2162 };
2163 InMemoryCache.prototype.resetResultCache = function (resetResultIdentities) {
2164 var _this = this;
2165 var previousReader = this.storeReader;
2166 var fragments = this.config.fragments;
2167 this.storeWriter = new StoreWriter(this, (this.storeReader = new StoreReader({
2168 cache: this,
2169 addTypename: this.addTypename,
2170 resultCacheMaxSize: this.config.resultCacheMaxSize,
2171 canonizeResults: shouldCanonizeResults(this.config),
2172 canon: resetResultIdentities ? void 0 : (previousReader && previousReader.canon),
2173 fragments: fragments,
2174 })), fragments);
2175 this.maybeBroadcastWatch = optimism.wrap(function (c, options) {
2176 return _this.broadcastWatch(c, options);
2177 }, {
2178 max: this.config.resultCacheMaxSize ||
2179 utilities.cacheSizes["inMemoryCache.maybeBroadcastWatch"] ||
2180 5000 ,
2181 makeCacheKey: function (c) {
2182 var store = c.optimistic ? _this.optimisticData : _this.data;
2183 if (supportsResultCaching(store)) {
2184 var optimistic = c.optimistic, id = c.id, variables = c.variables;
2185 return store.makeCacheKey(c.query,
2186 c.callback, utilities.canonicalStringify({ optimistic: optimistic, id: id, variables: variables }));
2187 }
2188 },
2189 });
2190 new Set([this.data.group, this.optimisticData.group]).forEach(function (group) {
2191 return group.resetCaching();
2192 });
2193 };
2194 InMemoryCache.prototype.restore = function (data) {
2195 this.init();
2196 if (data)
2197 this.data.replace(data);
2198 return this;
2199 };
2200 InMemoryCache.prototype.extract = function (optimistic) {
2201 if (optimistic === void 0) { optimistic = false; }
2202 return (optimistic ? this.optimisticData : this.data).extract();
2203 };
2204 InMemoryCache.prototype.read = function (options) {
2205 var
2206 _a = options.returnPartialData,
2207 returnPartialData = _a === void 0 ? false : _a;
2208 try {
2209 return (this.storeReader.diffQueryAgainstStore(tslib.__assign(tslib.__assign({}, options), { store: options.optimistic ? this.optimisticData : this.data, config: this.config, returnPartialData: returnPartialData })).result || null);
2210 }
2211 catch (e) {
2212 if (e instanceof MissingFieldError) {
2213 return null;
2214 }
2215 throw e;
2216 }
2217 };
2218 InMemoryCache.prototype.write = function (options) {
2219 try {
2220 ++this.txCount;
2221 return this.storeWriter.writeToStore(this.data, options);
2222 }
2223 finally {
2224 if (!--this.txCount && options.broadcast !== false) {
2225 this.broadcastWatches();
2226 }
2227 }
2228 };
2229 InMemoryCache.prototype.modify = function (options) {
2230 if (hasOwn.call(options, "id") && !options.id) {
2231 return false;
2232 }
2233 var store = ((options.optimistic)
2234 ) ?
2235 this.optimisticData
2236 : this.data;
2237 try {
2238 ++this.txCount;
2239 return store.modify(options.id || "ROOT_QUERY", options.fields);
2240 }
2241 finally {
2242 if (!--this.txCount && options.broadcast !== false) {
2243 this.broadcastWatches();
2244 }
2245 }
2246 };
2247 InMemoryCache.prototype.diff = function (options) {
2248 return this.storeReader.diffQueryAgainstStore(tslib.__assign(tslib.__assign({}, options), { store: options.optimistic ? this.optimisticData : this.data, rootId: options.id || "ROOT_QUERY", config: this.config }));
2249 };
2250 InMemoryCache.prototype.watch = function (watch) {
2251 var _this = this;
2252 if (!this.watches.size) {
2253 recallCache(this);
2254 }
2255 this.watches.add(watch);
2256 if (watch.immediate) {
2257 this.maybeBroadcastWatch(watch);
2258 }
2259 return function () {
2260 if (_this.watches.delete(watch) && !_this.watches.size) {
2261 forgetCache(_this);
2262 }
2263 _this.maybeBroadcastWatch.forget(watch);
2264 };
2265 };
2266 InMemoryCache.prototype.gc = function (options) {
2267 var _a;
2268 utilities.canonicalStringify.reset();
2269 utilities.print.reset();
2270 this.addTypenameTransform.resetCache();
2271 (_a = this.config.fragments) === null || _a === void 0 ? void 0 : _a.resetCaches();
2272 var ids = this.optimisticData.gc();
2273 if (options && !this.txCount) {
2274 if (options.resetResultCache) {
2275 this.resetResultCache(options.resetResultIdentities);
2276 }
2277 else if (options.resetResultIdentities) {
2278 this.storeReader.resetCanon();
2279 }
2280 }
2281 return ids;
2282 };
2283 InMemoryCache.prototype.retain = function (rootId, optimistic) {
2284 return (optimistic ? this.optimisticData : this.data).retain(rootId);
2285 };
2286 InMemoryCache.prototype.release = function (rootId, optimistic) {
2287 return (optimistic ? this.optimisticData : this.data).release(rootId);
2288 };
2289 InMemoryCache.prototype.identify = function (object) {
2290 if (utilities.isReference(object))
2291 return object.__ref;
2292 try {
2293 return this.policies.identify(object)[0];
2294 }
2295 catch (e) {
2296 globalThis.__DEV__ !== false && globals.invariant.warn(e);
2297 }
2298 };
2299 InMemoryCache.prototype.evict = function (options) {
2300 if (!options.id) {
2301 if (hasOwn.call(options, "id")) {
2302 return false;
2303 }
2304 options = tslib.__assign(tslib.__assign({}, options), { id: "ROOT_QUERY" });
2305 }
2306 try {
2307 ++this.txCount;
2308 return this.optimisticData.evict(options, this.data);
2309 }
2310 finally {
2311 if (!--this.txCount && options.broadcast !== false) {
2312 this.broadcastWatches();
2313 }
2314 }
2315 };
2316 InMemoryCache.prototype.reset = function (options) {
2317 var _this = this;
2318 this.init();
2319 utilities.canonicalStringify.reset();
2320 if (options && options.discardWatches) {
2321 this.watches.forEach(function (watch) { return _this.maybeBroadcastWatch.forget(watch); });
2322 this.watches.clear();
2323 forgetCache(this);
2324 }
2325 else {
2326 this.broadcastWatches();
2327 }
2328 return Promise.resolve();
2329 };
2330 InMemoryCache.prototype.removeOptimistic = function (idToRemove) {
2331 var newOptimisticData = this.optimisticData.removeLayer(idToRemove);
2332 if (newOptimisticData !== this.optimisticData) {
2333 this.optimisticData = newOptimisticData;
2334 this.broadcastWatches();
2335 }
2336 };
2337 InMemoryCache.prototype.batch = function (options) {
2338 var _this = this;
2339 var update = options.update, _a = options.optimistic, optimistic = _a === void 0 ? true : _a, removeOptimistic = options.removeOptimistic, onWatchUpdated = options.onWatchUpdated;
2340 var updateResult;
2341 var perform = function (layer) {
2342 var _a = _this, data = _a.data, optimisticData = _a.optimisticData;
2343 ++_this.txCount;
2344 if (layer) {
2345 _this.data = _this.optimisticData = layer;
2346 }
2347 try {
2348 return (updateResult = update(_this));
2349 }
2350 finally {
2351 --_this.txCount;
2352 _this.data = data;
2353 _this.optimisticData = optimisticData;
2354 }
2355 };
2356 var alreadyDirty = new Set();
2357 if (onWatchUpdated && !this.txCount) {
2358 this.broadcastWatches(tslib.__assign(tslib.__assign({}, options), { onWatchUpdated: function (watch) {
2359 alreadyDirty.add(watch);
2360 return false;
2361 } }));
2362 }
2363 if (typeof optimistic === "string") {
2364 this.optimisticData = this.optimisticData.addLayer(optimistic, perform);
2365 }
2366 else if (optimistic === false) {
2367 perform(this.data);
2368 }
2369 else {
2370 perform();
2371 }
2372 if (typeof removeOptimistic === "string") {
2373 this.optimisticData = this.optimisticData.removeLayer(removeOptimistic);
2374 }
2375 if (onWatchUpdated && alreadyDirty.size) {
2376 this.broadcastWatches(tslib.__assign(tslib.__assign({}, options), { onWatchUpdated: function (watch, diff) {
2377 var result = onWatchUpdated.call(this, watch, diff);
2378 if (result !== false) {
2379 alreadyDirty.delete(watch);
2380 }
2381 return result;
2382 } }));
2383 if (alreadyDirty.size) {
2384 alreadyDirty.forEach(function (watch) { return _this.maybeBroadcastWatch.dirty(watch); });
2385 }
2386 }
2387 else {
2388 this.broadcastWatches(options);
2389 }
2390 return updateResult;
2391 };
2392 InMemoryCache.prototype.performTransaction = function (update, optimisticId) {
2393 return this.batch({
2394 update: update,
2395 optimistic: optimisticId || optimisticId !== null,
2396 });
2397 };
2398 InMemoryCache.prototype.transformDocument = function (document) {
2399 return this.addTypenameToDocument(this.addFragmentsToDocument(document));
2400 };
2401 InMemoryCache.prototype.broadcastWatches = function (options) {
2402 var _this = this;
2403 if (!this.txCount) {
2404 this.watches.forEach(function (c) { return _this.maybeBroadcastWatch(c, options); });
2405 }
2406 };
2407 InMemoryCache.prototype.addFragmentsToDocument = function (document) {
2408 var fragments = this.config.fragments;
2409 return fragments ? fragments.transform(document) : document;
2410 };
2411 InMemoryCache.prototype.addTypenameToDocument = function (document) {
2412 if (this.addTypename) {
2413 return this.addTypenameTransform.transformDocument(document);
2414 }
2415 return document;
2416 };
2417 InMemoryCache.prototype.broadcastWatch = function (c, options) {
2418 var lastDiff = c.lastDiff;
2419 var diff = this.diff(c);
2420 if (options) {
2421 if (c.optimistic && typeof options.optimistic === "string") {
2422 diff.fromOptimisticTransaction = true;
2423 }
2424 if (options.onWatchUpdated &&
2425 options.onWatchUpdated.call(this, c, diff, lastDiff) === false) {
2426 return;
2427 }
2428 }
2429 if (!lastDiff || !equality.equal(lastDiff.result, diff.result)) {
2430 c.callback((c.lastDiff = diff), lastDiff);
2431 }
2432 };
2433 return InMemoryCache;
2434}(ApolloCache));
2435if (globalThis.__DEV__ !== false) {
2436 InMemoryCache.prototype.getMemoryInternals = getInMemoryCacheMemoryInternals;
2437}
2438
2439function createFragmentRegistry() {
2440 var fragments = [];
2441 for (var _i = 0; _i < arguments.length; _i++) {
2442 fragments[_i] = arguments[_i];
2443 }
2444 return new (FragmentRegistry.bind.apply(FragmentRegistry, tslib.__spreadArray([void 0], fragments, false)))();
2445}
2446var FragmentRegistry = (function () {
2447 function FragmentRegistry() {
2448 var fragments = [];
2449 for (var _i = 0; _i < arguments.length; _i++) {
2450 fragments[_i] = arguments[_i];
2451 }
2452 this.registry = Object.create(null);
2453 this.resetCaches();
2454 if (fragments.length) {
2455 this.register.apply(this, fragments);
2456 }
2457 }
2458 FragmentRegistry.prototype.register = function () {
2459 var _this = this;
2460 var fragments = [];
2461 for (var _i = 0; _i < arguments.length; _i++) {
2462 fragments[_i] = arguments[_i];
2463 }
2464 var definitions = new Map();
2465 fragments.forEach(function (doc) {
2466 utilities.getFragmentDefinitions(doc).forEach(function (node) {
2467 definitions.set(node.name.value, node);
2468 });
2469 });
2470 definitions.forEach(function (node, name) {
2471 if (node !== _this.registry[name]) {
2472 _this.registry[name] = node;
2473 _this.invalidate(name);
2474 }
2475 });
2476 return this;
2477 };
2478 FragmentRegistry.prototype.invalidate = function (name) { };
2479 FragmentRegistry.prototype.resetCaches = function () {
2480 var proto = FragmentRegistry.prototype;
2481 this.invalidate = (this.lookup = optimism.wrap(proto.lookup.bind(this), {
2482 makeCacheKey: function (arg) { return arg; },
2483 max: utilities.cacheSizes["fragmentRegistry.lookup"] ||
2484 1000 ,
2485 })).dirty;
2486 this.transform = optimism.wrap(proto.transform.bind(this), {
2487 cache: caches.WeakCache,
2488 max: utilities.cacheSizes["fragmentRegistry.transform"] ||
2489 2000 ,
2490 });
2491 this.findFragmentSpreads = optimism.wrap(proto.findFragmentSpreads.bind(this), {
2492 cache: caches.WeakCache,
2493 max: utilities.cacheSizes["fragmentRegistry.findFragmentSpreads"] ||
2494 4000 ,
2495 });
2496 };
2497 FragmentRegistry.prototype.lookup = function (fragmentName) {
2498 return this.registry[fragmentName] || null;
2499 };
2500 FragmentRegistry.prototype.transform = function (document) {
2501 var _this = this;
2502 var defined = new Map();
2503 utilities.getFragmentDefinitions(document).forEach(function (def) {
2504 defined.set(def.name.value, def);
2505 });
2506 var unbound = new Set();
2507 var enqueue = function (spreadName) {
2508 if (!defined.has(spreadName)) {
2509 unbound.add(spreadName);
2510 }
2511 };
2512 var enqueueChildSpreads = function (node) {
2513 return Object.keys(_this.findFragmentSpreads(node)).forEach(enqueue);
2514 };
2515 enqueueChildSpreads(document);
2516 var missing = [];
2517 var map = Object.create(null);
2518 unbound.forEach(function (fragmentName) {
2519 var knownFragmentDef = defined.get(fragmentName);
2520 if (knownFragmentDef) {
2521 enqueueChildSpreads((map[fragmentName] = knownFragmentDef));
2522 }
2523 else {
2524 missing.push(fragmentName);
2525 var def = _this.lookup(fragmentName);
2526 if (def) {
2527 enqueueChildSpreads((map[fragmentName] = def));
2528 }
2529 }
2530 });
2531 if (missing.length) {
2532 var defsToAppend_1 = [];
2533 missing.forEach(function (name) {
2534 var def = map[name];
2535 if (def) {
2536 defsToAppend_1.push(def);
2537 }
2538 });
2539 if (defsToAppend_1.length) {
2540 document = tslib.__assign(tslib.__assign({}, document), { definitions: document.definitions.concat(defsToAppend_1) });
2541 }
2542 }
2543 return document;
2544 };
2545 FragmentRegistry.prototype.findFragmentSpreads = function (root) {
2546 var spreads = Object.create(null);
2547 graphql.visit(root, {
2548 FragmentSpread: function (node) {
2549 spreads[node.name.value] = node;
2550 },
2551 });
2552 return spreads;
2553 };
2554 return FragmentRegistry;
2555}());
2556
2557exports.canonicalStringify = utilities.canonicalStringify;
2558exports.isReference = utilities.isReference;
2559exports.makeReference = utilities.makeReference;
2560exports.ApolloCache = ApolloCache;
2561exports.InMemoryCache = InMemoryCache;
2562exports.MissingFieldError = MissingFieldError;
2563exports.Policies = Policies;
2564exports.cacheSlot = cacheSlot;
2565exports.createFragmentRegistry = createFragmentRegistry;
2566exports.defaultDataIdFromObject = defaultDataIdFromObject;
2567exports.fieldNameFromStoreName = fieldNameFromStoreName;
2568exports.makeVar = makeVar;
2569//# sourceMappingURL=cache.cjs.map