@@ -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 ) ) {
@@ -266,11 +270,11 @@ function validateTypes(context: SchemaValidationContext): void {
266
270
} else if ( isInputObjectType ( type ) ) {
267
271
// Ensure Input Object fields are valid.
268
272
validateInputFields ( context , type ) ;
273
+
274
+ // Ensure Input Objects do not contain non-nullable circular references
275
+ validateInputObjectCircularRefs ( type ) ;
269
276
}
270
277
} ) ;
271
-
272
- // Ensure Input Objects do not contain non-nullable circular references
273
- validateInputObjectCircularReferences ( context ) ;
274
278
}
275
279
276
280
function validateFields (
@@ -563,9 +567,9 @@ function validateInputFields(
563
567
} ) ;
564
568
}
565
569
566
- function validateInputObjectCircularReferences (
570
+ function createInputObjectCircularRefsValidator (
567
571
context : SchemaValidationContext ,
568
- ) : void {
572
+ ) {
569
573
// Modified copy of algorithm from 'src/validation/rules/NoFragmentCycles.js'.
570
574
// Tracks already visited types to maintain O(N) and to ensure that cycles
571
575
// are not redundantly reported.
@@ -577,12 +581,7 @@ function validateInputObjectCircularReferences(
577
581
// Position in the type path
578
582
const fieldPathIndexByTypeName = Object . create ( null ) ;
579
583
580
- const typeMap = context . schema . getTypeMap ( ) ;
581
- for ( const type of objectValues ( typeMap ) ) {
582
- if ( isInputObjectType ( type ) ) {
583
- detectCycleRecursive ( type ) ;
584
- }
585
- }
584
+ return detectCycleRecursive ;
586
585
587
586
// This does a straight-forward DFS to find cycles.
588
587
// It does not terminate when a cycle was found but continues to explore
0 commit comments