Skip to content

Commit bdf4331

Browse files
committed
Fix reference being assigned mappers incorrectly
1 parent 5724234 commit bdf4331

File tree

3 files changed

+39
-3
lines changed

3 files changed

+39
-3
lines changed

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

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1223,6 +1223,28 @@ export class BaseResolversVisitor<
12231223
).string;
12241224
}
12251225

1226+
public buildFederationTypes(): string {
1227+
const federationMeta = this._federation.getMeta();
1228+
1229+
if (Object.keys(federationMeta).length === 0) {
1230+
return '';
1231+
}
1232+
1233+
const declarationKind = 'type';
1234+
return new DeclarationBlock(this._declarationBlockConfig)
1235+
.export()
1236+
.asKind(declarationKind)
1237+
.withName(this.convertName('FederationTypes'))
1238+
.withComment('Mapping of federation types')
1239+
.withBlock(
1240+
Object.keys(federationMeta)
1241+
.map(typeName => {
1242+
return indent(`${typeName}: ${this.convertName(typeName)}${this.getPunctuation(declarationKind)}`);
1243+
})
1244+
.join('\n')
1245+
).string;
1246+
}
1247+
12261248
public get schema(): GraphQLSchema {
12271249
return this._schema;
12281250
}
@@ -1498,6 +1520,7 @@ export class BaseResolversVisitor<
14981520
fieldNode: original,
14991521
parentType,
15001522
parentTypeSignature: this.getParentTypeForSignature(node),
1523+
federationTypeSignature: 'FederationType',
15011524
});
15021525
const mappedTypeKey = isSubscriptionType ? `${mappedType}, "${node.name}"` : mappedType;
15031526

@@ -1619,10 +1642,19 @@ export class BaseResolversVisitor<
16191642
);
16201643
}
16211644

1645+
const genericTypes: string[] = [
1646+
`ContextType = ${this.config.contextType.type}`,
1647+
this.transformParentGenericType(parentType),
1648+
];
1649+
if (this._federation.getMeta()[typeName]) {
1650+
const typeRef = `${this.convertName('FederationTypes')}['${typeName}']`;
1651+
genericTypes.push(`FederationType extends ${typeRef} = ${typeRef}`);
1652+
}
1653+
16221654
const block = new DeclarationBlock(this._declarationBlockConfig)
16231655
.export()
16241656
.asKind(declarationKind)
1625-
.withName(name, `<ContextType = ${this.config.contextType.type}, ${this.transformParentGenericType(parentType)}>`)
1657+
.withName(name, `<${genericTypes.join(', ')}>`)
16261658
.withBlock(fieldsContent.join('\n'));
16271659

16281660
this._collectedResolvers[node.name as any] = {

packages/plugins/typescript/resolvers/src/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,7 @@ export type DirectiveResolverFn<TResult = {}, TParent = {}, TContext = {}, TArgs
244244
) => TResult | Promise<TResult>;
245245
`;
246246

247+
const federationTypes = visitor.buildFederationTypes();
247248
const resolversTypeMapping = visitor.buildResolversTypes();
248249
const resolversParentTypeMapping = visitor.buildResolversParentTypes();
249250
const resolversUnionTypesMapping = visitor.buildResolversUnionTypes();
@@ -287,6 +288,7 @@ export type DirectiveResolverFn<TResult = {}, TParent = {}, TContext = {}, TArgs
287288
prepend,
288289
content: [
289290
header,
291+
federationTypes,
290292
resolversUnionTypesMapping,
291293
resolversInterfaceTypesMapping,
292294
resolversTypeMapping,

packages/utils/plugins-helpers/src/federation.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -155,10 +155,12 @@ export class ApolloFederation {
155155
fieldNode,
156156
parentType,
157157
parentTypeSignature,
158+
federationTypeSignature,
158159
}: {
159160
fieldNode: FieldDefinitionNode;
160161
parentType: GraphQLNamedType;
161162
parentTypeSignature: string;
163+
federationTypeSignature: string;
162164
}) {
163165
if (
164166
this.enabled &&
@@ -177,12 +179,12 @@ export class ApolloFederation {
177179

178180
// Look for @requires and see what the service needs and gets
179181
const requires = getDirectivesByName('requires', fieldNode).map(this.extractFieldSet);
180-
const requiredFields = this.translateFieldSet(merge({}, ...requires), parentTypeSignature);
182+
const requiredFields = this.translateFieldSet(merge({}, ...requires), federationTypeSignature);
181183

182184
// @key() @key() - "primary keys" in Federation
183185
const primaryKeys = resolvableKeyDirectives.map(def => {
184186
const fields = this.extractFieldSet(def);
185-
return this.translateFieldSet(fields, parentTypeSignature);
187+
return this.translateFieldSet(fields, federationTypeSignature);
186188
});
187189

188190
const [open, close] = primaryKeys.length > 1 ? ['(', ')'] : ['', ''];

0 commit comments

Comments
 (0)