96 lines
4.5 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var apollo_utilities_1 = require("apollo-utilities");
var ts_invariant_1 = require("ts-invariant");
var haveWarned = false;
function shouldWarn() {
var answer = !haveWarned;
if (!apollo_utilities_1.isTest()) {
haveWarned = true;
}
return answer;
}
var HeuristicFragmentMatcher = (function () {
function HeuristicFragmentMatcher() {
}
HeuristicFragmentMatcher.prototype.ensureReady = function () {
return Promise.resolve();
};
HeuristicFragmentMatcher.prototype.canBypassInit = function () {
return true;
};
HeuristicFragmentMatcher.prototype.match = function (idValue, typeCondition, context) {
var obj = context.store.get(idValue.id);
var isRootQuery = idValue.id === 'ROOT_QUERY';
if (!obj) {
return isRootQuery;
}
var _a = obj.__typename, __typename = _a === void 0 ? isRootQuery && 'Query' : _a;
if (!__typename) {
if (shouldWarn()) {
ts_invariant_1.invariant.warn("You're using fragments in your queries, but either don't have the addTypename:\n true option set in Apollo Client, or you are trying to write a fragment to the store without the __typename.\n Please turn on the addTypename option and include __typename when writing fragments so that Apollo Client\n can accurately match fragments.");
ts_invariant_1.invariant.warn('Could not find __typename on Fragment ', typeCondition, obj);
ts_invariant_1.invariant.warn("DEPRECATION WARNING: using fragments without __typename is unsupported behavior " +
"and will be removed in future versions of Apollo client. You should fix this and set addTypename to true now.");
}
return 'heuristic';
}
if (__typename === typeCondition) {
return true;
}
if (shouldWarn()) {
ts_invariant_1.invariant.error('You are using the simple (heuristic) fragment matcher, but your ' +
'queries contain union or interface types. Apollo Client will not be ' +
'able to accurately map fragments. To make this error go away, use ' +
'the `IntrospectionFragmentMatcher` as described in the docs: ' +
'https://www.apollographql.com/docs/react/advanced/fragments.html#fragment-matcher');
}
return 'heuristic';
};
return HeuristicFragmentMatcher;
}());
exports.HeuristicFragmentMatcher = HeuristicFragmentMatcher;
var IntrospectionFragmentMatcher = (function () {
function IntrospectionFragmentMatcher(options) {
if (options && options.introspectionQueryResultData) {
this.possibleTypesMap = this.parseIntrospectionResult(options.introspectionQueryResultData);
this.isReady = true;
}
else {
this.isReady = false;
}
this.match = this.match.bind(this);
}
IntrospectionFragmentMatcher.prototype.match = function (idValue, typeCondition, context) {
ts_invariant_1.invariant(this.isReady, 'FragmentMatcher.match() was called before FragmentMatcher.init()');
var obj = context.store.get(idValue.id);
var isRootQuery = idValue.id === 'ROOT_QUERY';
if (!obj) {
return isRootQuery;
}
var _a = obj.__typename, __typename = _a === void 0 ? isRootQuery && 'Query' : _a;
ts_invariant_1.invariant(__typename, "Cannot match fragment because __typename property is missing: " + JSON.stringify(obj));
if (__typename === typeCondition) {
return true;
}
var implementingTypes = this.possibleTypesMap[typeCondition];
if (__typename &&
implementingTypes &&
implementingTypes.indexOf(__typename) > -1) {
return true;
}
return false;
};
IntrospectionFragmentMatcher.prototype.parseIntrospectionResult = function (introspectionResultData) {
var typeMap = {};
introspectionResultData.__schema.types.forEach(function (type) {
if (type.kind === 'UNION' || type.kind === 'INTERFACE') {
typeMap[type.name] = type.possibleTypes.map(function (implementingType) { return implementingType.name; });
}
});
return typeMap;
};
return IntrospectionFragmentMatcher;
}());
exports.IntrospectionFragmentMatcher = IntrospectionFragmentMatcher;
//# sourceMappingURL=fragmentMatcher.js.map