diff --git a/src/validation/__tests__/VariablesInAllowedPositionRule-test.ts b/src/validation/__tests__/VariablesInAllowedPositionRule-test.ts index 654494136d..bca3e28471 100644 --- a/src/validation/__tests__/VariablesInAllowedPositionRule-test.ts +++ b/src/validation/__tests__/VariablesInAllowedPositionRule-test.ts @@ -397,6 +397,28 @@ describe('Validate: Variables are in allowed positions', () => { }); describe('Fragment arguments are validated', () => { + it('validates fragment variables defined before the operation', () => { + expectErrors(` + fragment A($intVar: Int) on ComplicatedArgs { + nonNullIntArgField(nonNullIntArg: $intVar) + } + query Query($intVar: Int!) { + complicatedArgs { + ...A(i: $intVar) + } + } + `).toDeepEqual([ + { + message: + 'Variable "$intVar" of type "Int" used in position expecting type "Int!".', + locations: [ + { line: 2, column: 20 }, + { line: 3, column: 45 }, + ], + }, + ]); + }); + it('Boolean => Boolean', () => { expectValid(` query Query($booleanArg: Boolean) diff --git a/src/validation/rules/VariablesInAllowedPositionRule.ts b/src/validation/rules/VariablesInAllowedPositionRule.ts index 8c31224be1..5f33e49d2f 100644 --- a/src/validation/rules/VariablesInAllowedPositionRule.ts +++ b/src/validation/rules/VariablesInAllowedPositionRule.ts @@ -66,8 +66,13 @@ export function VariablesInAllowedPositionRule( return { OperationDefinition: { - enter() { + enter(operation) { varDefMap = new Map(); + if (operation.variableDefinitions) { + for (const varDef of operation.variableDefinitions) { + varDefMap.set(varDef.variable.name.value, varDef); + } + } }, leave(operation) { const usages = context.getRecursiveVariableUsages(operation); @@ -125,9 +130,6 @@ export function VariablesInAllowedPositionRule( } }, }, - VariableDefinition(node) { - varDefMap.set(node.variable.name.value, node); - }, }; }