@@ -232,7 +232,11 @@ function validateName(
232
232
}
233
233
234
234
function validateTypes ( context : SchemaValidationContext ) : void {
235
+ const validateInputObjectCircularRefs = createInputObjectCircularRefsValidator (
236
+ context ,
237
+ ) ;
235
238
const typeMap = context . schema . getTypeMap ( ) ;
239
+
236
240
objectValues ( typeMap ) . forEach ( type => {
237
241
// Ensure all provided types are in fact GraphQL type.
238
242
if ( ! isNamedType ( type ) ) {
@@ -269,11 +273,11 @@ function validateTypes(context: SchemaValidationContext): void {
269
273
} else if ( isInputObjectType ( type ) ) {
270
274
// Ensure Input Object fields are valid.
271
275
validateInputFields ( context , type ) ;
276
+
277
+ // Ensure Input Objects do not contain non-nullable circular references
278
+ validateInputObjectCircularRefs ( type ) ;
272
279
}
273
280
} ) ;
274
-
275
- // Ensure Input Objects do not contain non-nullable circular references
276
- validateInputObjectCircularReferences ( context ) ;
277
281
}
278
282
279
283
function validateFields (
@@ -581,9 +585,9 @@ function validateInputFields(
581
585
} ) ;
582
586
}
583
587
584
- function validateInputObjectCircularReferences (
588
+ function createInputObjectCircularRefsValidator (
585
589
context : SchemaValidationContext ,
586
- ) : void {
590
+ ) {
587
591
// Modified copy of algorithm from 'src/validation/rules/NoFragmentCycles.js'.
588
592
// Tracks already visited types to maintain O(N) and to ensure that cycles
589
593
// are not redundantly reported.
@@ -595,12 +599,7 @@ function validateInputObjectCircularReferences(
595
599
// Position in the type path
596
600
const fieldPathIndexByTypeName = Object . create ( null ) ;
597
601
598
- const typeMap = context . schema . getTypeMap ( ) ;
599
- for ( const type of objectValues ( typeMap ) ) {
600
- if ( isInputObjectType ( type ) ) {
601
- detectCycleRecursive ( type ) ;
602
- }
603
- }
602
+ return detectCycleRecursive ;
604
603
605
604
// This does a straight-forward DFS to find cycles.
606
605
// It does not terminate when a cycle was found but continues to explore
0 commit comments