text: "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