45 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			45 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| import { groupBy } from '../../jsutils/groupBy.mjs';
 | |
| import { GraphQLError } from '../../error/GraphQLError.mjs';
 | |
| 
 | |
| /**
 | |
|  * Unique argument names
 | |
|  *
 | |
|  * A GraphQL field or directive is only valid if all supplied arguments are
 | |
|  * uniquely named.
 | |
|  *
 | |
|  * See https://spec.graphql.org/draft/#sec-Argument-Names
 | |
|  */
 | |
| export function UniqueArgumentNamesRule(context) {
 | |
|   return {
 | |
|     Field: checkArgUniqueness,
 | |
|     Directive: checkArgUniqueness,
 | |
|   };
 | |
| 
 | |
|   function checkArgUniqueness(parentNode) {
 | |
|     var _parentNode$arguments;
 | |
| 
 | |
|     // FIXME: https://github.com/graphql/graphql-js/issues/2203
 | |
| 
 | |
|     /* c8 ignore next */
 | |
|     const argumentNodes =
 | |
|       (_parentNode$arguments = parentNode.arguments) !== null &&
 | |
|       _parentNode$arguments !== void 0
 | |
|         ? _parentNode$arguments
 | |
|         : [];
 | |
|     const seenArgs = groupBy(argumentNodes, (arg) => arg.name.value);
 | |
| 
 | |
|     for (const [argName, argNodes] of seenArgs) {
 | |
|       if (argNodes.length > 1) {
 | |
|         context.reportError(
 | |
|           new GraphQLError(
 | |
|             `There can be only one argument named "${argName}".`,
 | |
|             {
 | |
|               nodes: argNodes.map((node) => node.name),
 | |
|             },
 | |
|           ),
 | |
|         );
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| }
 |