Skip to content

Commit 9bb38e2

Browse files
committed
[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 5106abf commit 9bb38e2

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
@@ -803,13 +803,25 @@ export class BaseResolversVisitor<
803803
clearWrapper: type => this.clearResolverTypeWrapper(type),
804804
getTypeToUse: name => this.getTypeToUse(name),
805805
currentType: 'ResolversTypes',
806+
onNotMappedObjectType: ({ initialType }) => initialType,
806807
});
807808
this._resolversParentTypes = this.createResolversFields({
808809
applyWrapper: type => type,
809810
clearWrapper: type => type,
810811
getTypeToUse: name => this.getParentTypeToUse(name),
811812
currentType: 'ResolversParentTypes',
812813
shouldInclude: namedType => !isEnumType(namedType),
814+
onNotMappedObjectType: ({ typeName, initialType }) => {
815+
let result = initialType;
816+
const federationReferenceTypes = this._federation.printReferenceSelectionSets({
817+
typeName,
818+
baseFederationType: `${this.convertName('FederationTypes')}['${typeName}']`,
819+
});
820+
if (federationReferenceTypes) {
821+
result += ` | ${federationReferenceTypes}`;
822+
}
823+
return result;
824+
},
813825
});
814826
this._resolversUnionTypes = this.createResolversUnionTypes();
815827
this._resolversInterfaceTypes = this.createResolversInterfaceTypes();
@@ -882,12 +894,14 @@ export class BaseResolversVisitor<
882894
getTypeToUse,
883895
currentType,
884896
shouldInclude,
897+
onNotMappedObjectType,
885898
}: {
886899
applyWrapper: (str: string) => string;
887900
clearWrapper: (str: string) => string;
888901
getTypeToUse: (str: string) => string;
889902
currentType: 'ResolversTypes' | 'ResolversParentTypes';
890903
shouldInclude?: (type: GraphQLNamedType) => boolean;
904+
onNotMappedObjectType: (params: { initialType: string; typeName: string }) => string;
891905
}): ResolverTypes {
892906
const allSchemaTypes = this._schema.getTypeMap();
893907
const typeNames = this._federation.filterTypeNames(Object.keys(allSchemaTypes));
@@ -976,6 +990,11 @@ export class BaseResolversVisitor<
976990
if (this.config.mappers[typeName].type && hasPlaceholder(this.config.mappers[typeName].type)) {
977991
internalType = replacePlaceholder(this.config.mappers[typeName].type, internalType);
978992
}
993+
} else {
994+
internalType = onNotMappedObjectType({
995+
typeName,
996+
initialType: internalType,
997+
});
979998
}
980999

9811000
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)