Skip to content

Commit d8644ae

Browse files
authored
[resolvers][federation] Bring Federation reference selection set to ResolversParentTypes instead of each resolver (#10297)
* Bring reference selection set to ResolversParentTypes * Put back old types to extractReferenceSelectionSet * Update tests for TDD * Handle parent type consistently for __resolveReference and subsequent resolvers * Update tests
1 parent c0f73ba commit d8644ae

File tree

6 files changed

+355
-117
lines changed

6 files changed

+355
-117
lines changed

dev-test/test-schema/resolvers-federation.ts

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,13 @@ export type ResolversParentTypes = {
154154
ID: Scalars['ID']['output'];
155155
Lines: Lines;
156156
Query: {};
157-
User: User;
157+
User:
158+
| User
159+
| ({ __typename: 'User' } & (
160+
| GraphQLRecursivePick<FederationTypes['User'], { id: true }>
161+
| GraphQLRecursivePick<FederationTypes['User'], { name: true }>
162+
) &
163+
GraphQLRecursivePick<FederationTypes['User'], { address: { city: true; lines: { line2: true } } }>);
158164
Int: Scalars['Int']['output'];
159165
Boolean: Scalars['Boolean']['output'];
160166
};
@@ -197,22 +203,15 @@ export type UserResolvers<
197203
> = {
198204
__resolveReference?: ReferenceResolver<
199205
Maybe<ResolversTypes['User']>,
200-
{ __typename: 'User' } & (
201-
| GraphQLRecursivePick<FederationType, { id: true }>
202-
| GraphQLRecursivePick<FederationType, { name: true }>
203-
),
204-
ContextType
205-
>;
206-
207-
email?: Resolver<
208-
ResolversTypes['String'],
209206
{ __typename: 'User' } & (
210207
| GraphQLRecursivePick<FederationType, { id: true }>
211208
| GraphQLRecursivePick<FederationType, { name: true }>
212209
) &
213210
GraphQLRecursivePick<FederationType, { address: { city: true; lines: { line2: true } } }>,
214211
ContextType
215212
>;
213+
214+
email?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
216215
};
217216

218217
export type Resolvers<ContextType = any> = {

packages/plugins/other/visitor-plugin-common/src/base-resolvers-visitor.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -769,13 +769,25 @@ export class BaseResolversVisitor<
769769
clearWrapper: type => this.clearResolverTypeWrapper(type),
770770
getTypeToUse: name => this.getTypeToUse(name),
771771
currentType: 'ResolversTypes',
772+
onNotMappedObjectType: ({ initialType }) => initialType,
772773
});
773774
this._resolversParentTypes = this.createResolversFields({
774775
applyWrapper: type => type,
775776
clearWrapper: type => type,
776777
getTypeToUse: name => this.getParentTypeToUse(name),
777778
currentType: 'ResolversParentTypes',
778779
shouldInclude: namedType => !isEnumType(namedType),
780+
onNotMappedObjectType: ({ typeName, initialType }) => {
781+
let result = initialType;
782+
const federationReferenceTypes = this._federation.printReferenceSelectionSets({
783+
typeName,
784+
baseFederationType: `${this.convertName('FederationTypes')}['${typeName}']`,
785+
});
786+
if (federationReferenceTypes) {
787+
result += ` | ${federationReferenceTypes}`;
788+
}
789+
return result;
790+
},
779791
});
780792
this._resolversUnionTypes = this.createResolversUnionTypes();
781793
this._resolversInterfaceTypes = this.createResolversInterfaceTypes();
@@ -848,12 +860,14 @@ export class BaseResolversVisitor<
848860
getTypeToUse,
849861
currentType,
850862
shouldInclude,
863+
onNotMappedObjectType,
851864
}: {
852865
applyWrapper: (str: string) => string;
853866
clearWrapper: (str: string) => string;
854867
getTypeToUse: (str: string) => string;
855868
currentType: 'ResolversTypes' | 'ResolversParentTypes';
856869
shouldInclude?: (type: GraphQLNamedType) => boolean;
870+
onNotMappedObjectType: (params: { initialType: string; typeName: string }) => string;
857871
}): ResolverTypes {
858872
const allSchemaTypes = this._schema.getTypeMap();
859873
const typeNames = this._federation.filterTypeNames(Object.keys(allSchemaTypes));
@@ -942,6 +956,11 @@ export class BaseResolversVisitor<
942956
if (this.config.mappers[typeName].type && hasPlaceholder(this.config.mappers[typeName].type)) {
943957
internalType = replacePlaceholder(this.config.mappers[typeName].type, internalType);
944958
}
959+
} else {
960+
internalType = onNotMappedObjectType({
961+
typeName,
962+
initialType: internalType,
963+
});
945964
}
946965

947966
prev[typeName] = applyWrapper(internalType);

packages/plugins/typescript/resolvers/tests/ts-resolvers.federation.interface.spec.ts

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -147,8 +147,12 @@ describe('TypeScript Resolvers Plugin + Apollo Federation - Interface', () => {
147147
Query: {};
148148
Person: ResolversInterfaceTypes<ResolversParentTypes>['Person'];
149149
ID: Scalars['ID']['output'];
150-
User: User;
151-
Admin: Admin;
150+
User: User |
151+
( { __typename: 'User' }
152+
& GraphQLRecursivePick<FederationTypes['User'], {"id":true}> );
153+
Admin: Admin |
154+
( { __typename: 'Admin' }
155+
& GraphQLRecursivePick<FederationTypes['Admin'], {"id":true}> );
152156
Boolean: Scalars['Boolean']['output'];
153157
PersonName: PersonName;
154158
String: Scalars['String']['output'];
@@ -160,18 +164,24 @@ describe('TypeScript Resolvers Plugin + Apollo Federation - Interface', () => {
160164
161165
export type PersonResolvers<ContextType = any, ParentType extends ResolversParentTypes['Person'] = ResolversParentTypes['Person'], FederationType extends FederationTypes['Person'] = FederationTypes['Person']> = {
162166
__resolveType: TypeResolveFn<'User' | 'Admin', ParentType, ContextType>;
163-
__resolveReference?: ReferenceResolver<Maybe<ResolversTypes['Person']>, { __typename: 'Person' } & GraphQLRecursivePick<FederationType, {"id":true}>, ContextType>;
167+
__resolveReference?: ReferenceResolver<Maybe<ResolversTypes['Person']>,
168+
( { __typename: 'Person' }
169+
& GraphQLRecursivePick<FederationType, {"id":true}> ), ContextType>;
164170
};
165171
166172
export type UserResolvers<ContextType = any, ParentType extends ResolversParentTypes['User'] = ResolversParentTypes['User'], FederationType extends FederationTypes['User'] = FederationTypes['User']> = {
167-
__resolveReference?: ReferenceResolver<Maybe<ResolversTypes['User']>, { __typename: 'User' } & GraphQLRecursivePick<FederationType, {"id":true}>, ContextType>;
173+
__resolveReference?: ReferenceResolver<Maybe<ResolversTypes['User']>,
174+
( { __typename: 'User' }
175+
& GraphQLRecursivePick<FederationType, {"id":true}> ), ContextType>;
168176
id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;
169177
name?: Resolver<ResolversTypes['PersonName'], ParentType, ContextType>;
170178
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
171179
};
172180
173181
export type AdminResolvers<ContextType = any, ParentType extends ResolversParentTypes['Admin'] = ResolversParentTypes['Admin'], FederationType extends FederationTypes['Admin'] = FederationTypes['Admin']> = {
174-
__resolveReference?: ReferenceResolver<Maybe<ResolversTypes['Admin']>, { __typename: 'Admin' } & GraphQLRecursivePick<FederationType, {"id":true}>, ContextType>;
182+
__resolveReference?: ReferenceResolver<Maybe<ResolversTypes['Admin']>,
183+
( { __typename: 'Admin' }
184+
& GraphQLRecursivePick<FederationType, {"id":true}> ), ContextType>;
175185
id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;
176186
name?: Resolver<ResolversTypes['PersonName'], ParentType, ContextType>;
177187
canImpersonate?: Resolver<ResolversTypes['Boolean'], ParentType, ContextType>;

packages/plugins/typescript/resolvers/tests/ts-resolvers.federation.mappers.spec.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,9 @@ describe('TypeScript Resolvers Plugin + Apollo Federation - mappers', () => {
144144
};
145145
146146
export type UserResolvers<ContextType = any, ParentType extends ResolversParentTypes['User'] = ResolversParentTypes['User'], FederationType extends FederationTypes['User'] = FederationTypes['User']> = {
147-
__resolveReference?: ReferenceResolver<Maybe<ResolversTypes['User']>, { __typename: 'User' } & GraphQLRecursivePick<FederationType, {"id":true}>, ContextType>;
147+
__resolveReference?: ReferenceResolver<Maybe<ResolversTypes['User']>,
148+
( { __typename: 'User' }
149+
& GraphQLRecursivePick<FederationType, {"id":true}> ), ContextType>;
148150
id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;
149151
name?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
150152
};

0 commit comments

Comments
 (0)