diff --git a/src/validation/__tests__/OverlappingFieldsCanBeMergedRule-test.ts b/src/validation/__tests__/OverlappingFieldsCanBeMergedRule-test.ts index f9f4456b5e..5dd6c2e19f 100644 --- a/src/validation/__tests__/OverlappingFieldsCanBeMergedRule-test.ts +++ b/src/validation/__tests__/OverlappingFieldsCanBeMergedRule-test.ts @@ -1021,6 +1021,17 @@ describe('Validate: Overlapping fields can be merged', () => { `); }); + it('does not infinite loop on immediately recursive fragment mentionned in queries', () => { + expectValid(` + query myQuery { + todoRemove + ...fragA + } + + fragment fragA on Query { ...fragA } + `); + }); + it('does not infinite loop on transitively recursive fragment', () => { expectValid(` fragment fragA on Human { name, ...fragB } diff --git a/src/validation/rules/OverlappingFieldsCanBeMergedRule.ts b/src/validation/rules/OverlappingFieldsCanBeMergedRule.ts index 740454dda7..5027b2d57a 100644 --- a/src/validation/rules/OverlappingFieldsCanBeMergedRule.ts +++ b/src/validation/rules/OverlappingFieldsCanBeMergedRule.ts @@ -267,6 +267,10 @@ function collectConflictsBetweenFieldsAndFragment( // (E) Then collect any conflicts between the provided collection of fields // and any fragment names found in the given fragment. for (const referencedFragmentName of referencedFragmentNames) { + if (referencedFragmentName === fragmentName) { + continue; + } + collectConflictsBetweenFieldsAndFragment( context, conflicts,