@apollo/client
Version:
A fully-featured caching GraphQL client.
113 lines • 4.28 kB
JavaScript
import { __assign, __spreadArray } from "tslib";
import { visit, } from "graphql";
import { wrap } from "optimism";
import { getFragmentDefinitions } from "../../utilities/index.js";
export function createFragmentRegistry() {
var fragments = [];
for (var _i = 0; _i < arguments.length; _i++) {
fragments[_i] = arguments[_i];
}
return new (FragmentRegistry.bind.apply(FragmentRegistry, __spreadArray([void 0], fragments, false)))();
}
var arrayLikeForEach = Array.prototype.forEach;
var FragmentRegistry = (function () {
function FragmentRegistry() {
var fragments = [];
for (var _i = 0; _i < arguments.length; _i++) {
fragments[_i] = arguments[_i];
}
this.registry = Object.create(null);
this.resetCaches();
if (fragments.length) {
this.register.apply(this, fragments);
}
}
FragmentRegistry.prototype.register = function () {
var _this = this;
var definitions = new Map();
arrayLikeForEach.call(arguments, function (doc) {
getFragmentDefinitions(doc).forEach(function (node) {
definitions.set(node.name.value, node);
});
});
definitions.forEach(function (node, name) {
if (node !== _this.registry[name]) {
_this.registry[name] = node;
_this.invalidate(name);
}
});
return this;
};
FragmentRegistry.prototype.invalidate = function (name) { };
FragmentRegistry.prototype.resetCaches = function () {
this.invalidate = (this.lookup = this.cacheUnaryMethod("lookup")).dirty;
this.transform = this.cacheUnaryMethod("transform");
this.findFragmentSpreads = this.cacheUnaryMethod("findFragmentSpreads");
};
FragmentRegistry.prototype.cacheUnaryMethod = function (name) {
var registry = this;
var originalMethod = FragmentRegistry.prototype[name];
return wrap(function () {
return originalMethod.apply(registry, arguments);
}, {
makeCacheKey: function (arg) { return arg; },
});
};
FragmentRegistry.prototype.lookup = function (fragmentName) {
return this.registry[fragmentName] || null;
};
FragmentRegistry.prototype.transform = function (document) {
var _this = this;
var defined = new Map();
getFragmentDefinitions(document).forEach(function (def) {
defined.set(def.name.value, def);
});
var unbound = new Set();
var enqueue = function (spreadName) {
if (!defined.has(spreadName)) {
unbound.add(spreadName);
}
};
var enqueueChildSpreads = function (node) { return Object.keys(_this.findFragmentSpreads(node)).forEach(enqueue); };
enqueueChildSpreads(document);
var missing = [];
var map = Object.create(null);
unbound.forEach(function (fragmentName) {
var knownFragmentDef = defined.get(fragmentName);
if (knownFragmentDef) {
enqueueChildSpreads(map[fragmentName] = knownFragmentDef);
}
else {
missing.push(fragmentName);
var def = _this.lookup(fragmentName);
if (def) {
enqueueChildSpreads(map[fragmentName] = def);
}
}
});
if (missing.length) {
var defsToAppend_1 = [];
missing.forEach(function (name) {
var def = map[name];
if (def) {
defsToAppend_1.push(def);
}
});
if (defsToAppend_1.length) {
document = __assign(__assign({}, document), { definitions: document.definitions.concat(defsToAppend_1) });
}
}
return document;
};
FragmentRegistry.prototype.findFragmentSpreads = function (root) {
var spreads = Object.create(null);
visit(root, {
FragmentSpread: function (node) {
spreads[node.name.value] = node;
},
});
return spreads;
};
return FragmentRegistry;
}());
//# sourceMappingURL=fragmentRegistry.js.map