UNPKG

graphql

Version:

A Query Language and Runtime which can target any service.

34 lines 1.57 kB
import { groupBy } from "../../jsutils/groupBy.mjs"; import { GraphQLError } from "../../error/GraphQLError.mjs"; export function UniqueArgumentDefinitionNamesRule(context) { return { DirectiveDefinition(directiveNode) { const argumentNodes = directiveNode.arguments ?? []; return checkArgUniqueness(`@${directiveNode.name.value}`, argumentNodes); }, InterfaceTypeDefinition: checkArgUniquenessPerField, InterfaceTypeExtension: checkArgUniquenessPerField, ObjectTypeDefinition: checkArgUniquenessPerField, ObjectTypeExtension: checkArgUniquenessPerField, }; function checkArgUniquenessPerField(typeNode) { const typeName = typeNode.name.value; const fieldNodes = typeNode.fields ?? []; for (const fieldDef of fieldNodes) { const fieldName = fieldDef.name.value; const argumentNodes = fieldDef.arguments ?? []; checkArgUniqueness(`${typeName}.${fieldName}`, argumentNodes); } return false; } function checkArgUniqueness(parentName, argumentNodes) { const seenArgs = groupBy(argumentNodes, (arg) => arg.name.value); for (const [argName, argNodes] of seenArgs) { if (argNodes.length > 1) { context.reportError(new GraphQLError(`Argument "${parentName}(${argName}:)" can only be defined once.`, { nodes: argNodes.map((node) => node.name) })); } } return false; } } //# sourceMappingURL=UniqueArgumentDefinitionNamesRule.js.map