diff options
author | Minteck <contact@minteck.org> | 2023-01-10 14:54:04 +0100 |
---|---|---|
committer | Minteck <contact@minteck.org> | 2023-01-10 14:54:04 +0100 |
commit | 99c1d9af689e5325f3cf535c4007b3aeb8325229 (patch) | |
tree | e663b3c2ebdbd67c818ac0c5147f0ce1d2463cda /school/node_modules/graphql/validation/rules/UniqueFieldDefinitionNamesRule.js.flow | |
parent | 9871b03912fc28ad38b4037ebf26a78aa937baba (diff) | |
download | pluralconnect-99c1d9af689e5325f3cf535c4007b3aeb8325229.tar.gz pluralconnect-99c1d9af689e5325f3cf535c4007b3aeb8325229.tar.bz2 pluralconnect-99c1d9af689e5325f3cf535c4007b3aeb8325229.zip |
Update - This is an automated commit
Diffstat (limited to 'school/node_modules/graphql/validation/rules/UniqueFieldDefinitionNamesRule.js.flow')
-rw-r--r-- | school/node_modules/graphql/validation/rules/UniqueFieldDefinitionNamesRule.js.flow | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/school/node_modules/graphql/validation/rules/UniqueFieldDefinitionNamesRule.js.flow b/school/node_modules/graphql/validation/rules/UniqueFieldDefinitionNamesRule.js.flow new file mode 100644 index 0000000..1193111 --- /dev/null +++ b/school/node_modules/graphql/validation/rules/UniqueFieldDefinitionNamesRule.js.flow @@ -0,0 +1,87 @@ +// @flow strict +import { GraphQLError } from '../../error/GraphQLError'; + +import type { ASTVisitor } from '../../language/visitor'; +import type { + NameNode, + FieldDefinitionNode, + InputValueDefinitionNode, +} from '../../language/ast'; + +import type { GraphQLNamedType } from '../../type/definition'; +import { + isObjectType, + isInterfaceType, + isInputObjectType, +} from '../../type/definition'; + +import type { SDLValidationContext } from '../ValidationContext'; + +/** + * Unique field definition names + * + * A GraphQL complex type is only valid if all its fields are uniquely named. + */ +export function UniqueFieldDefinitionNamesRule( + context: SDLValidationContext, +): ASTVisitor { + const schema = context.getSchema(); + const existingTypeMap = schema ? schema.getTypeMap() : Object.create(null); + const knownFieldNames = Object.create(null); + + return { + InputObjectTypeDefinition: checkFieldUniqueness, + InputObjectTypeExtension: checkFieldUniqueness, + InterfaceTypeDefinition: checkFieldUniqueness, + InterfaceTypeExtension: checkFieldUniqueness, + ObjectTypeDefinition: checkFieldUniqueness, + ObjectTypeExtension: checkFieldUniqueness, + }; + + function checkFieldUniqueness(node: { + +name: NameNode, + +fields?: $ReadOnlyArray<InputValueDefinitionNode | FieldDefinitionNode>, + ... + }) { + const typeName = node.name.value; + + if (!knownFieldNames[typeName]) { + knownFieldNames[typeName] = Object.create(null); + } + + // istanbul ignore next (See: 'https://github.com/graphql/graphql-js/issues/2203') + const fieldNodes = node.fields ?? []; + const fieldNames = knownFieldNames[typeName]; + + for (const fieldDef of fieldNodes) { + const fieldName = fieldDef.name.value; + + if (hasField(existingTypeMap[typeName], fieldName)) { + context.reportError( + new GraphQLError( + `Field "${typeName}.${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( + `Field "${typeName}.${fieldName}" can only be defined once.`, + [fieldNames[fieldName], fieldDef.name], + ), + ); + } else { + fieldNames[fieldName] = fieldDef.name; + } + } + + return false; + } +} + +function hasField(type: GraphQLNamedType, fieldName: string): boolean { + if (isObjectType(type) || isInterfaceType(type) || isInputObjectType(type)) { + return type.getFields()[fieldName] != null; + } + return false; +} |