@@ -34,6 +34,7 @@ type RegistryKeys = 'objects' | 'inputs' | 'interfaces' | 'scalars' | 'unions' |
34
34
type Registry = Record < RegistryKeys , string [ ] > ;
35
35
const registryKeys : RegistryKeys [ ] = [ 'objects' , 'inputs' , 'interfaces' , 'scalars' , 'unions' , 'enums' ] ;
36
36
const resolverKeys : Array < Extract < RegistryKeys , 'objects' | 'enums' | 'scalars' > > = [ 'scalars' , 'objects' , 'enums' ] ;
37
+ const withIsTypeOfKeys : Array < 'objects' > = [ 'objects' ] ;
37
38
38
39
export function buildModule (
39
40
name : string ,
@@ -65,6 +66,7 @@ export function buildModule(
65
66
const picks : Record < RegistryKeys , Record < string , string [ ] > > = createObject ( registryKeys , ( ) => ( { } ) ) ;
66
67
const defined : Registry = createObject ( registryKeys , ( ) => [ ] ) ;
67
68
const extended : Registry = createObject ( registryKeys , ( ) => [ ] ) ;
69
+ const withIsTypeOf : { objects : string [ ] } = createObject ( withIsTypeOfKeys , ( ) => [ ] ) ;
68
70
69
71
// List of types used in objects, fields, arguments etc
70
72
const usedTypes = collectUsedTypes ( doc ) ;
@@ -216,7 +218,9 @@ export function buildModule(
216
218
'DefinedFields' ,
217
219
// In case of enabled `requireRootResolvers` flag, the preset has to produce a non-optional properties.
218
220
requireRootResolvers && rootTypes . includes ( name ) ,
219
- ! rootTypes . includes ( name ) && defined . objects . includes ( name ) ? ` | '__isTypeOf'` : ''
221
+ ! rootTypes . includes ( name ) && defined . objects . includes ( name ) && withIsTypeOf . objects . includes ( name )
222
+ ? ` | '__isTypeOf'`
223
+ : ''
220
224
)
221
225
)
222
226
. join ( '\n' ) ,
@@ -405,6 +409,11 @@ export function buildModule(
405
409
case Kind . OBJECT_TYPE_DEFINITION : {
406
410
defined . objects . push ( name ) ;
407
411
collectFields ( node , picks . objects ) ;
412
+
413
+ if ( node . interfaces ?. length > 0 ) {
414
+ withIsTypeOf . objects . push ( name ) ;
415
+ }
416
+
408
417
break ;
409
418
}
410
419
@@ -433,6 +442,10 @@ export function buildModule(
433
442
434
443
case Kind . UNION_TYPE_DEFINITION : {
435
444
defined . unions . push ( name ) ;
445
+
446
+ for ( const namedType of node . types || [ ] ) {
447
+ pushUnique ( withIsTypeOf . objects , namedType . name . value ) ;
448
+ }
436
449
break ;
437
450
}
438
451
}
@@ -453,6 +466,10 @@ export function buildModule(
453
466
454
467
pushUnique ( extended . objects , name ) ;
455
468
469
+ if ( node . interfaces ?. length > 0 ) {
470
+ pushUnique ( withIsTypeOf . objects , name ) ;
471
+ }
472
+
456
473
break ;
457
474
}
458
475
0 commit comments