@@ -568,7 +568,9 @@ export class BaseResolversVisitor<
568568 protected _resolversTypes : ResolverTypes = { } ;
569569 protected _resolversParentTypes : ResolverParentTypes = { } ;
570570 protected _hasReferencedResolversUnionTypes = false ;
571+ protected _hasReferencedResolversUnionParentTypes = false ;
571572 protected _resolversUnionTypes : Record < string , string > = { } ;
573+ protected _resolversUnionParentTypes : Record < string , string > = { } ;
572574 protected _rootTypeNames = new Set < string > ( ) ;
573575 protected _globalDeclarations = new Set < string > ( ) ;
574576 protected _federation : ApolloFederation ;
@@ -625,18 +627,26 @@ export class BaseResolversVisitor<
625627 this . convertName ,
626628 this . config . namespacedImportName
627629 ) ;
628- this . _resolversTypes = this . createResolversFields (
629- type => this . applyResolverTypeWrapper ( type ) ,
630- type => this . clearResolverTypeWrapper ( type ) ,
631- name => this . getTypeToUse ( name )
632- ) ;
633- this . _resolversParentTypes = this . createResolversFields (
634- type => type ,
635- type => type ,
636- name => this . getParentTypeToUse ( name ) ,
637- namedType => ! isEnumType ( namedType )
638- ) ;
639- this . _resolversUnionTypes = this . createResolversUnionTypes ( ) ;
630+
631+ this . _resolversTypes = this . createResolversFields ( {
632+ applyWrapper : type => this . applyResolverTypeWrapper ( type ) ,
633+ clearWrapper : type => this . clearResolverTypeWrapper ( type ) ,
634+ getTypeToUse : name => this . getTypeToUse ( name ) ,
635+ referencedUnionType : 'ResolversUnionTypes' ,
636+ } ) ;
637+ this . _resolversParentTypes = this . createResolversFields ( {
638+ applyWrapper : type => type ,
639+ clearWrapper : type => type ,
640+ getTypeToUse : name => this . getParentTypeToUse ( name ) ,
641+ referencedUnionType : 'ResolversUnionParentTypes' ,
642+ shouldInclude : namedType => ! isEnumType ( namedType ) ,
643+ } ) ;
644+ this . _resolversUnionTypes = this . createResolversUnionTypes ( {
645+ getTypeToUse : this . getTypeToUse ,
646+ } ) ;
647+ this . _resolversUnionParentTypes = this . createResolversUnionTypes ( {
648+ getTypeToUse : this . getParentTypeToUse ,
649+ } ) ;
640650 this . _fieldContextTypeMap = this . createFieldContextTypeMap ( ) ;
641651 this . _directiveContextTypesMap = this . createDirectivedContextType ( ) ;
642652 this . _directiveResolverMappings = rawConfig . directiveResolverMappings ?? { } ;
@@ -700,12 +710,19 @@ export class BaseResolversVisitor<
700710 }
701711
702712 // Kamil: this one is heeeeavvyyyy
703- protected createResolversFields (
704- applyWrapper : ( str : string ) => string ,
705- clearWrapper : ( str : string ) => string ,
706- getTypeToUse : ( str : string ) => string ,
707- shouldInclude ?: ( type : GraphQLNamedType ) => boolean
708- ) : ResolverTypes {
713+ protected createResolversFields ( {
714+ applyWrapper,
715+ clearWrapper,
716+ getTypeToUse,
717+ referencedUnionType,
718+ shouldInclude,
719+ } : {
720+ applyWrapper : ( str : string ) => string ;
721+ clearWrapper : ( str : string ) => string ;
722+ getTypeToUse : ( str : string ) => string ;
723+ referencedUnionType : 'ResolversUnionTypes' | 'ResolversUnionParentTypes' ;
724+ shouldInclude ?: ( type : GraphQLNamedType ) => boolean ;
725+ } ) : ResolverTypes {
709726 const allSchemaTypes = this . _schema . getTypeMap ( ) ;
710727 const typeNames = this . _federation . filterTypeNames ( Object . keys ( allSchemaTypes ) ) ;
711728
@@ -766,8 +783,12 @@ export class BaseResolversVisitor<
766783 } else if ( isScalar ) {
767784 prev [ typeName ] = applyWrapper ( this . _getScalar ( typeName ) ) ;
768785 } else if ( isUnionType ( schemaType ) ) {
769- this . _hasReferencedResolversUnionTypes = true ;
770- const resolversType = this . convertName ( 'ResolversUnionTypes' ) ;
786+ if ( referencedUnionType === 'ResolversUnionTypes' ) {
787+ this . _hasReferencedResolversUnionTypes = true ;
788+ } else if ( referencedUnionType === 'ResolversUnionParentTypes' ) {
789+ this . _hasReferencedResolversUnionParentTypes = true ;
790+ }
791+ const resolversType = this . convertName ( referencedUnionType ) ;
771792 prev [ typeName ] = applyWrapper ( `${ resolversType } ['${ typeName } ']` ) ;
772793 } else if ( isEnumType ( schemaType ) ) {
773794 prev [ typeName ] = this . convertName ( typeName , { useTypesPrefix : this . config . enumPrefix } , true ) ;
@@ -861,7 +882,11 @@ export class BaseResolversVisitor<
861882 return `Array<${ t } >` ;
862883 }
863884
864- protected createResolversUnionTypes ( ) : Record < string , string > {
885+ protected createResolversUnionTypes ( {
886+ getTypeToUse,
887+ } : {
888+ getTypeToUse : ( name : string ) => string ;
889+ } ) : Record < string , string > {
865890 if ( ! this . _hasReferencedResolversUnionTypes ) {
866891 return { } ;
867892 }
@@ -887,11 +912,8 @@ export class BaseResolversVisitor<
887912
888913 // 2b. Find fields to Omit if needed.
889914 // - If no field to Omit, "type with maybe Omit" is typescript type i.e. no Omit
890- // - If there are fields to Omit, "type with maybe Omit"
891- const fieldsToOmit = this . getRelevantFieldsToOmit ( {
892- schemaType : unionMemberType ,
893- getTypeToUse : this . getTypeToUse ,
894- } ) ;
915+ // - If there are fields to Omit, keep track of these "type with maybe Omit" to replace in original unionMemberValue
916+ const fieldsToOmit = this . getRelevantFieldsToOmit ( { schemaType : unionMemberType , getTypeToUse } ) ;
895917 if ( fieldsToOmit . length > 0 ) {
896918 unionMemberValue = this . replaceFieldsInType ( unionMemberValue , fieldsToOmit ) ;
897919 }
@@ -996,6 +1018,24 @@ export class BaseResolversVisitor<
9961018 ) . string ;
9971019 }
9981020
1021+ public buildResolversUnionParentTypes ( ) : string {
1022+ if ( Object . keys ( this . _resolversUnionParentTypes ) . length === 0 ) {
1023+ return '' ;
1024+ }
1025+
1026+ const declarationKind = 'type' ;
1027+ return new DeclarationBlock ( this . _declarationBlockConfig )
1028+ . export ( )
1029+ . asKind ( declarationKind )
1030+ . withName ( this . convertName ( 'ResolversUnionParentTypes' ) )
1031+ . withComment ( 'Mapping of union parent types' )
1032+ . withBlock (
1033+ Object . entries ( this . _resolversUnionParentTypes )
1034+ . map ( ( [ typeName , value ] ) => indent ( `${ typeName } : ${ value } ${ this . getPunctuation ( declarationKind ) } ` ) )
1035+ . join ( '\n' )
1036+ ) . string ;
1037+ }
1038+
9991039 public get schema ( ) : GraphQLSchema {
10001040 return this . _schema ;
10011041 }
0 commit comments