| "use strict"; |
| |
| Object.defineProperty(exports, "__esModule", { |
| value: true |
| }); |
| exports.UniqueFieldDefinitionNamesRule = UniqueFieldDefinitionNamesRule; |
| |
| var _GraphQLError = require("../../error/GraphQLError"); |
| |
| var _definition = require("../../type/definition"); |
| |
| /** |
| * Unique field definition names |
| * |
| * A GraphQL complex type is only valid if all its fields are uniquely named. |
| */ |
| function UniqueFieldDefinitionNamesRule(context) { |
| var schema = context.getSchema(); |
| var existingTypeMap = schema ? schema.getTypeMap() : Object.create(null); |
| var knownFieldNames = Object.create(null); |
| return { |
| InputObjectTypeDefinition: checkFieldUniqueness, |
| InputObjectTypeExtension: checkFieldUniqueness, |
| InterfaceTypeDefinition: checkFieldUniqueness, |
| InterfaceTypeExtension: checkFieldUniqueness, |
| ObjectTypeDefinition: checkFieldUniqueness, |
| ObjectTypeExtension: checkFieldUniqueness |
| }; |
| |
| function checkFieldUniqueness(node) { |
| var _node$fields; |
| |
| var typeName = node.name.value; |
| |
| if (!knownFieldNames[typeName]) { |
| knownFieldNames[typeName] = Object.create(null); |
| } |
| /* istanbul ignore next (See https://github.com/graphql/graphql-js/issues/2203) */ |
| |
| |
| var fieldNodes = (_node$fields = node.fields) !== null && _node$fields !== void 0 ? _node$fields : []; |
| var fieldNames = knownFieldNames[typeName]; |
| |
| for (var _i2 = 0; _i2 < fieldNodes.length; _i2++) { |
| var fieldDef = fieldNodes[_i2]; |
| var fieldName = fieldDef.name.value; |
| |
| if (hasField(existingTypeMap[typeName], fieldName)) { |
| context.reportError(new _GraphQLError.GraphQLError("Field \"".concat(typeName, ".").concat(fieldName, "\" already exists in the schema. It cannot also be defined in this type extension."), fieldDef.name)); |
| } else if (fieldNames[fieldName]) { |
| context.reportError(new _GraphQLError.GraphQLError("Field \"".concat(typeName, ".").concat(fieldName, "\" can only be defined once."), [fieldNames[fieldName], fieldDef.name])); |
| } else { |
| fieldNames[fieldName] = fieldDef.name; |
| } |
| } |
| |
| return false; |
| } |
| } |
| |
| function hasField(type, fieldName) { |
| if ((0, _definition.isObjectType)(type) || (0, _definition.isInterfaceType)(type) || (0, _definition.isInputObjectType)(type)) { |
| return type.getFields()[fieldName]; |
| } |
| |
| return false; |
| } |