42 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			42 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| import { groupBy } from '../../jsutils/groupBy.mjs';
 | |
| import { GraphQLError } from '../../error/GraphQLError.mjs';
 | |
| 
 | |
| /**
 | |
|  * Unique variable names
 | |
|  *
 | |
|  * A GraphQL operation is only valid if all its variables are uniquely named.
 | |
|  */
 | |
| export function UniqueVariableNamesRule(context) {
 | |
|   return {
 | |
|     OperationDefinition(operationNode) {
 | |
|       var _operationNode$variab;
 | |
| 
 | |
|       // See: https://github.com/graphql/graphql-js/issues/2203
 | |
| 
 | |
|       /* c8 ignore next */
 | |
|       const variableDefinitions =
 | |
|         (_operationNode$variab = operationNode.variableDefinitions) !== null &&
 | |
|         _operationNode$variab !== void 0
 | |
|           ? _operationNode$variab
 | |
|           : [];
 | |
|       const seenVariableDefinitions = groupBy(
 | |
|         variableDefinitions,
 | |
|         (node) => node.variable.name.value,
 | |
|       );
 | |
| 
 | |
|       for (const [variableName, variableNodes] of seenVariableDefinitions) {
 | |
|         if (variableNodes.length > 1) {
 | |
|           context.reportError(
 | |
|             new GraphQLError(
 | |
|               `There can be only one variable named "$${variableName}".`,
 | |
|               {
 | |
|                 nodes: variableNodes.map((node) => node.variable.name),
 | |
|               },
 | |
|             ),
 | |
|           );
 | |
|         }
 | |
|       }
 | |
|     },
 | |
|   };
 | |
| }
 |