| import { GraphQLError } from "../../error/GraphQLError.mjs"; |
| import { isEnumType } from "../../type/definition.mjs"; |
| |
| /** |
| * Unique enum value names |
| * |
| * A GraphQL enum type is only valid if all its values are uniquely named. |
| */ |
| export function UniqueEnumValueNamesRule(context) { |
| var schema = context.getSchema(); |
| var existingTypeMap = schema ? schema.getTypeMap() : Object.create(null); |
| var knownValueNames = Object.create(null); |
| return { |
| EnumTypeDefinition: checkValueUniqueness, |
| EnumTypeExtension: checkValueUniqueness |
| }; |
| |
| function checkValueUniqueness(node) { |
| var _node$values; |
| |
| var typeName = node.name.value; |
| |
| if (!knownValueNames[typeName]) { |
| knownValueNames[typeName] = Object.create(null); |
| } |
| /* istanbul ignore next (See https://github.com/graphql/graphql-js/issues/2203) */ |
| |
| |
| var valueNodes = (_node$values = node.values) !== null && _node$values !== void 0 ? _node$values : []; |
| var valueNames = knownValueNames[typeName]; |
| |
| for (var _i2 = 0; _i2 < valueNodes.length; _i2++) { |
| var valueDef = valueNodes[_i2]; |
| var valueName = valueDef.name.value; |
| var existingType = existingTypeMap[typeName]; |
| |
| if (isEnumType(existingType) && existingType.getValue(valueName)) { |
| context.reportError(new GraphQLError("Enum value \"".concat(typeName, ".").concat(valueName, "\" already exists in the schema. It cannot also be defined in this type extension."), valueDef.name)); |
| } else if (valueNames[valueName]) { |
| context.reportError(new GraphQLError("Enum value \"".concat(typeName, ".").concat(valueName, "\" can only be defined once."), [valueNames[valueName], valueDef.name])); |
| } else { |
| valueNames[valueName] = valueDef.name; |
| } |
| } |
| |
| return false; |
| } |
| } |