diff options
Diffstat (limited to 'school/node_modules/graphql/validation/rules/UniqueEnumValueNamesRule.js.flow')
-rw-r--r-- | school/node_modules/graphql/validation/rules/UniqueEnumValueNamesRule.js.flow | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/school/node_modules/graphql/validation/rules/UniqueEnumValueNamesRule.js.flow b/school/node_modules/graphql/validation/rules/UniqueEnumValueNamesRule.js.flow new file mode 100644 index 0000000..09515e8 --- /dev/null +++ b/school/node_modules/graphql/validation/rules/UniqueEnumValueNamesRule.js.flow @@ -0,0 +1,69 @@ +// @flow strict +import { GraphQLError } from '../../error/GraphQLError'; + +import type { ASTVisitor } from '../../language/visitor'; +import type { + EnumTypeDefinitionNode, + EnumTypeExtensionNode, +} from '../../language/ast'; + +import { isEnumType } from '../../type/definition'; + +import type { SDLValidationContext } from '../ValidationContext'; + +/** + * Unique enum value names + * + * A GraphQL enum type is only valid if all its values are uniquely named. + */ +export function UniqueEnumValueNamesRule( + context: SDLValidationContext, +): ASTVisitor { + const schema = context.getSchema(); + const existingTypeMap = schema ? schema.getTypeMap() : Object.create(null); + const knownValueNames = Object.create(null); + + return { + EnumTypeDefinition: checkValueUniqueness, + EnumTypeExtension: checkValueUniqueness, + }; + + function checkValueUniqueness( + node: EnumTypeDefinitionNode | EnumTypeExtensionNode, + ) { + const typeName = node.name.value; + + if (!knownValueNames[typeName]) { + knownValueNames[typeName] = Object.create(null); + } + + // istanbul ignore next (See: 'https://github.com/graphql/graphql-js/issues/2203') + const valueNodes = node.values ?? []; + const valueNames = knownValueNames[typeName]; + + for (const valueDef of valueNodes) { + const valueName = valueDef.name.value; + + const existingType = existingTypeMap[typeName]; + if (isEnumType(existingType) && existingType.getValue(valueName)) { + context.reportError( + new GraphQLError( + `Enum value "${typeName}.${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 "${typeName}.${valueName}" can only be defined once.`, + [valueNames[valueName], valueDef.name], + ), + ); + } else { + valueNames[valueName] = valueDef.name; + } + } + + return false; + } +} |