| "use strict"; |
| |
| Object.defineProperty(exports, "__esModule", { |
| value: true |
| }); |
| exports.PossibleTypeExtensionsRule = PossibleTypeExtensionsRule; |
| |
| var _inspect = _interopRequireDefault(require("../../jsutils/inspect")); |
| |
| var _invariant = _interopRequireDefault(require("../../jsutils/invariant")); |
| |
| var _didYouMean = _interopRequireDefault(require("../../jsutils/didYouMean")); |
| |
| var _suggestionList = _interopRequireDefault(require("../../jsutils/suggestionList")); |
| |
| var _GraphQLError = require("../../error/GraphQLError"); |
| |
| var _kinds = require("../../language/kinds"); |
| |
| var _predicates = require("../../language/predicates"); |
| |
| var _definition = require("../../type/definition"); |
| |
| var _defKindToExtKind; |
| |
| function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } |
| |
| function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } |
| |
| /** |
| * Possible type extension |
| * |
| * A type extension is only valid if the type is defined and has the same kind. |
| */ |
| function PossibleTypeExtensionsRule(context) { |
| var schema = context.getSchema(); |
| var definedTypes = Object.create(null); |
| |
| for (var _i2 = 0, _context$getDocument$2 = context.getDocument().definitions; _i2 < _context$getDocument$2.length; _i2++) { |
| var def = _context$getDocument$2[_i2]; |
| |
| if ((0, _predicates.isTypeDefinitionNode)(def)) { |
| definedTypes[def.name.value] = def; |
| } |
| } |
| |
| return { |
| ScalarTypeExtension: checkExtension, |
| ObjectTypeExtension: checkExtension, |
| InterfaceTypeExtension: checkExtension, |
| UnionTypeExtension: checkExtension, |
| EnumTypeExtension: checkExtension, |
| InputObjectTypeExtension: checkExtension |
| }; |
| |
| function checkExtension(node) { |
| var typeName = node.name.value; |
| var defNode = definedTypes[typeName]; |
| var existingType = schema === null || schema === void 0 ? void 0 : schema.getType(typeName); |
| var expectedKind; |
| |
| if (defNode) { |
| expectedKind = defKindToExtKind[defNode.kind]; |
| } else if (existingType) { |
| expectedKind = typeToExtKind(existingType); |
| } |
| |
| if (expectedKind) { |
| if (expectedKind !== node.kind) { |
| var kindStr = extensionKindToTypeName(node.kind); |
| context.reportError(new _GraphQLError.GraphQLError("Cannot extend non-".concat(kindStr, " type \"").concat(typeName, "\"."), defNode ? [defNode, node] : node)); |
| } |
| } else { |
| var allTypeNames = Object.keys(definedTypes); |
| |
| if (schema) { |
| allTypeNames = allTypeNames.concat(Object.keys(schema.getTypeMap())); |
| } |
| |
| var suggestedTypes = (0, _suggestionList.default)(typeName, allTypeNames); |
| context.reportError(new _GraphQLError.GraphQLError("Cannot extend type \"".concat(typeName, "\" because it is not defined.") + (0, _didYouMean.default)(suggestedTypes), node.name)); |
| } |
| } |
| } |
| |
| var defKindToExtKind = (_defKindToExtKind = {}, _defineProperty(_defKindToExtKind, _kinds.Kind.SCALAR_TYPE_DEFINITION, _kinds.Kind.SCALAR_TYPE_EXTENSION), _defineProperty(_defKindToExtKind, _kinds.Kind.OBJECT_TYPE_DEFINITION, _kinds.Kind.OBJECT_TYPE_EXTENSION), _defineProperty(_defKindToExtKind, _kinds.Kind.INTERFACE_TYPE_DEFINITION, _kinds.Kind.INTERFACE_TYPE_EXTENSION), _defineProperty(_defKindToExtKind, _kinds.Kind.UNION_TYPE_DEFINITION, _kinds.Kind.UNION_TYPE_EXTENSION), _defineProperty(_defKindToExtKind, _kinds.Kind.ENUM_TYPE_DEFINITION, _kinds.Kind.ENUM_TYPE_EXTENSION), _defineProperty(_defKindToExtKind, _kinds.Kind.INPUT_OBJECT_TYPE_DEFINITION, _kinds.Kind.INPUT_OBJECT_TYPE_EXTENSION), _defKindToExtKind); |
| |
| function typeToExtKind(type) { |
| if ((0, _definition.isScalarType)(type)) { |
| return _kinds.Kind.SCALAR_TYPE_EXTENSION; |
| } |
| |
| if ((0, _definition.isObjectType)(type)) { |
| return _kinds.Kind.OBJECT_TYPE_EXTENSION; |
| } |
| |
| if ((0, _definition.isInterfaceType)(type)) { |
| return _kinds.Kind.INTERFACE_TYPE_EXTENSION; |
| } |
| |
| if ((0, _definition.isUnionType)(type)) { |
| return _kinds.Kind.UNION_TYPE_EXTENSION; |
| } |
| |
| if ((0, _definition.isEnumType)(type)) { |
| return _kinds.Kind.ENUM_TYPE_EXTENSION; |
| } |
| |
| /* istanbul ignore else */ |
| if ((0, _definition.isInputObjectType)(type)) { |
| return _kinds.Kind.INPUT_OBJECT_TYPE_EXTENSION; |
| } // Not reachable. All possible types have been considered. |
| |
| |
| /* istanbul ignore next */ |
| (0, _invariant.default)(false, 'Unexpected type: ' + (0, _inspect.default)(type)); |
| } |
| |
| function extensionKindToTypeName(kind) { |
| switch (kind) { |
| case _kinds.Kind.SCALAR_TYPE_EXTENSION: |
| return 'scalar'; |
| |
| case _kinds.Kind.OBJECT_TYPE_EXTENSION: |
| return 'object'; |
| |
| case _kinds.Kind.INTERFACE_TYPE_EXTENSION: |
| return 'interface'; |
| |
| case _kinds.Kind.UNION_TYPE_EXTENSION: |
| return 'union'; |
| |
| case _kinds.Kind.ENUM_TYPE_EXTENSION: |
| return 'enum'; |
| |
| case _kinds.Kind.INPUT_OBJECT_TYPE_EXTENSION: |
| return 'input object'; |
| } // Not reachable. All possible types have been considered. |
| |
| |
| /* istanbul ignore next */ |
| (0, _invariant.default)(false, 'Unexpected kind: ' + (0, _inspect.default)(kind)); |
| } |