123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 |
- // @flow strict
- import { GraphQLError } from '../../error/GraphQLError';
- import { type ASTVisitor } from '../../language/visitor';
- import { type ValidationContext } from '../ValidationContext';
- export function undefinedVarMessage(varName: string, opName: ?string): string {
- return opName
- ? `Variable "$${varName}" is not defined by operation "${opName}".`
- : `Variable "$${varName}" is not defined.`;
- }
- /**
- * No undefined variables
- *
- * A GraphQL operation is only valid if all variables encountered, both directly
- * and via fragment spreads, are defined by that operation.
- */
- export function NoUndefinedVariables(context: ValidationContext): ASTVisitor {
- let variableNameDefined = Object.create(null);
- return {
- OperationDefinition: {
- enter() {
- variableNameDefined = Object.create(null);
- },
- leave(operation) {
- const usages = context.getRecursiveVariableUsages(operation);
- for (const { node } of usages) {
- const varName = node.name.value;
- if (variableNameDefined[varName] !== true) {
- context.reportError(
- new GraphQLError(
- undefinedVarMessage(
- varName,
- operation.name && operation.name.value,
- ),
- [node, operation],
- ),
- );
- }
- }
- },
- },
- VariableDefinition(node) {
- variableNameDefined[node.variable.name.value] = true;
- },
- };
- }
|