UNPKG

5.23 kBJavaScriptView Raw
1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.PossibleTypeExtensionsRule = PossibleTypeExtensionsRule;
7
8var _inspect = _interopRequireDefault(require("../../jsutils/inspect.js"));
9
10var _invariant = _interopRequireDefault(require("../../jsutils/invariant.js"));
11
12var _didYouMean = _interopRequireDefault(require("../../jsutils/didYouMean.js"));
13
14var _suggestionList = _interopRequireDefault(require("../../jsutils/suggestionList.js"));
15
16var _GraphQLError = require("../../error/GraphQLError.js");
17
18var _kinds = require("../../language/kinds.js");
19
20var _predicates = require("../../language/predicates.js");
21
22var _definition = require("../../type/definition.js");
23
24var _defKindToExtKind;
25
26function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
27
28function _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; }
29
30/**
31 * Possible type extension
32 *
33 * A type extension is only valid if the type is defined and has the same kind.
34 */
35function PossibleTypeExtensionsRule(context) {
36 var schema = context.getSchema();
37 var definedTypes = Object.create(null);
38
39 for (var _i2 = 0, _context$getDocument$2 = context.getDocument().definitions; _i2 < _context$getDocument$2.length; _i2++) {
40 var def = _context$getDocument$2[_i2];
41
42 if ((0, _predicates.isTypeDefinitionNode)(def)) {
43 definedTypes[def.name.value] = def;
44 }
45 }
46
47 return {
48 ScalarTypeExtension: checkExtension,
49 ObjectTypeExtension: checkExtension,
50 InterfaceTypeExtension: checkExtension,
51 UnionTypeExtension: checkExtension,
52 EnumTypeExtension: checkExtension,
53 InputObjectTypeExtension: checkExtension
54 };
55
56 function checkExtension(node) {
57 var typeName = node.name.value;
58 var defNode = definedTypes[typeName];
59 var existingType = schema === null || schema === void 0 ? void 0 : schema.getType(typeName);
60 var expectedKind;
61
62 if (defNode) {
63 expectedKind = defKindToExtKind[defNode.kind];
64 } else if (existingType) {
65 expectedKind = typeToExtKind(existingType);
66 }
67
68 if (expectedKind) {
69 if (expectedKind !== node.kind) {
70 var kindStr = extensionKindToTypeName(node.kind);
71 context.reportError(new _GraphQLError.GraphQLError("Cannot extend non-".concat(kindStr, " type \"").concat(typeName, "\"."), defNode ? [defNode, node] : node));
72 }
73 } else {
74 var allTypeNames = Object.keys(definedTypes);
75
76 if (schema) {
77 allTypeNames = allTypeNames.concat(Object.keys(schema.getTypeMap()));
78 }
79
80 var suggestedTypes = (0, _suggestionList.default)(typeName, allTypeNames);
81 context.reportError(new _GraphQLError.GraphQLError("Cannot extend type \"".concat(typeName, "\" because it is not defined.") + (0, _didYouMean.default)(suggestedTypes), node.name));
82 }
83 }
84}
85
86var 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);
87
88function typeToExtKind(type) {
89 if ((0, _definition.isScalarType)(type)) {
90 return _kinds.Kind.SCALAR_TYPE_EXTENSION;
91 }
92
93 if ((0, _definition.isObjectType)(type)) {
94 return _kinds.Kind.OBJECT_TYPE_EXTENSION;
95 }
96
97 if ((0, _definition.isInterfaceType)(type)) {
98 return _kinds.Kind.INTERFACE_TYPE_EXTENSION;
99 }
100
101 if ((0, _definition.isUnionType)(type)) {
102 return _kinds.Kind.UNION_TYPE_EXTENSION;
103 }
104
105 if ((0, _definition.isEnumType)(type)) {
106 return _kinds.Kind.ENUM_TYPE_EXTENSION;
107 } // istanbul ignore else (See: 'https://github.com/graphql/graphql-js/issues/2618')
108
109
110 if ((0, _definition.isInputObjectType)(type)) {
111 return _kinds.Kind.INPUT_OBJECT_TYPE_EXTENSION;
112 } // istanbul ignore next (Not reachable. All possible types have been considered)
113
114
115 false || (0, _invariant.default)(0, 'Unexpected type: ' + (0, _inspect.default)(type));
116}
117
118function extensionKindToTypeName(kind) {
119 switch (kind) {
120 case _kinds.Kind.SCALAR_TYPE_EXTENSION:
121 return 'scalar';
122
123 case _kinds.Kind.OBJECT_TYPE_EXTENSION:
124 return 'object';
125
126 case _kinds.Kind.INTERFACE_TYPE_EXTENSION:
127 return 'interface';
128
129 case _kinds.Kind.UNION_TYPE_EXTENSION:
130 return 'union';
131
132 case _kinds.Kind.ENUM_TYPE_EXTENSION:
133 return 'enum';
134
135 case _kinds.Kind.INPUT_OBJECT_TYPE_EXTENSION:
136 return 'input object';
137 } // istanbul ignore next (Not reachable. All possible types have been considered)
138
139
140 false || (0, _invariant.default)(0, 'Unexpected kind: ' + (0, _inspect.default)(kind));
141}