summaryrefslogtreecommitdiff
path: root/alarm/node_modules/graphql/validation/rules/UniqueEnumValueNamesRule.js.flow
diff options
context:
space:
mode:
Diffstat (limited to 'alarm/node_modules/graphql/validation/rules/UniqueEnumValueNamesRule.js.flow')
-rw-r--r--alarm/node_modules/graphql/validation/rules/UniqueEnumValueNamesRule.js.flow69
1 files changed, 69 insertions, 0 deletions
diff --git a/alarm/node_modules/graphql/validation/rules/UniqueEnumValueNamesRule.js.flow b/alarm/node_modules/graphql/validation/rules/UniqueEnumValueNamesRule.js.flow
new file mode 100644
index 0000000..09515e8
--- /dev/null
+++ b/alarm/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;
+ }
+}