'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.typeIncompatibleSpreadMessage = typeIncompatibleSpreadMessage; exports.typeIncompatibleAnonSpreadMessage = typeIncompatibleAnonSpreadMessage; exports.PossibleFragmentSpreads = PossibleFragmentSpreads; var _error = require('../../error'); var _typeComparators = require('../../utilities/typeComparators'); var _typeFromAST = require('../../utilities/typeFromAST'); var _definition = require('../../type/definition'); function typeIncompatibleSpreadMessage(fragName, parentType, fragType) { return 'Fragment "' + fragName + '" cannot be spread here as objects of ' + ('type "' + String(parentType) + '" can never be of type "' + String(fragType) + '".'); } /** * Copyright (c) 2015-present, Facebook, Inc. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * * strict */ function typeIncompatibleAnonSpreadMessage(parentType, fragType) { return 'Fragment cannot be spread here as objects of ' + ('type "' + String(parentType) + '" can never be of type "' + String(fragType) + '".'); } /** * Possible fragment spread * * A fragment spread is only valid if the type condition could ever possibly * be true: if there is a non-empty intersection of the possible parent types, * and possible types which pass the type condition. */ function PossibleFragmentSpreads(context) { return { InlineFragment: function InlineFragment(node) { var fragType = context.getType(); var parentType = context.getParentType(); if ((0, _definition.isCompositeType)(fragType) && (0, _definition.isCompositeType)(parentType) && !(0, _typeComparators.doTypesOverlap)(context.getSchema(), fragType, parentType)) { context.reportError(new _error.GraphQLError(typeIncompatibleAnonSpreadMessage(parentType, fragType), [node])); } }, FragmentSpread: function FragmentSpread(node) { var fragName = node.name.value; var fragType = getFragmentType(context, fragName); var parentType = context.getParentType(); if (fragType && parentType && !(0, _typeComparators.doTypesOverlap)(context.getSchema(), fragType, parentType)) { context.reportError(new _error.GraphQLError(typeIncompatibleSpreadMessage(fragName, parentType, fragType), [node])); } } }; } function getFragmentType(context, name) { var frag = context.getFragment(name); if (frag) { var type = (0, _typeFromAST.typeFromAST)(context.getSchema(), frag.typeCondition); if ((0, _definition.isCompositeType)(type)) { return type; } } }