Skip to content

Commit 0a35c2b

Browse files
jziggasclaudeMichalLytek
authored
fix(schema): match field resolvers by schemaName instead of methodName (#1806)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> Co-authored-by: Michał Lytek <michal.wojciech.lytek@gmail.com>
1 parent 899ad79 commit 0a35c2b

File tree

3 files changed

+64
-3
lines changed

3 files changed

+64
-3
lines changed

CHANGELOG.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
# Changelog and release notes
22

3-
<!-- ## Unreleased -->
3+
## Unreleased
4+
5+
### Fixes
6+
7+
- support resolver inheritance with dynamic field resolvers name by matching field resolvers by schemaName instead of methodName (#1806)
48

59
<!-- Here goes all the unreleased changes descriptions -->
610

src/schema/schema-generator.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -338,7 +338,8 @@ export abstract class SchemaGenerator {
338338
it => it.kind === "internal" || resolvers.includes(it.target),
339339
);
340340
const fieldResolverMetadata = filteredFieldResolversMetadata.find(
341-
it => it.getObjectType!() === field.target && it.methodName === field.name,
341+
it =>
342+
it.getObjectType!() === field.target && it.schemaName === field.schemaName,
342343
);
343344
const type = this.getGraphQLOutputType(
344345
field.target,
@@ -456,7 +457,7 @@ export abstract class SchemaGenerator {
456457
const fieldResolverMetadata = this.metadataStorage.fieldResolvers.find(
457458
resolver =>
458459
resolver.getObjectType!() === field.target &&
459-
resolver.methodName === field.name,
460+
resolver.schemaName === field.schemaName,
460461
);
461462
const type = this.getGraphQLOutputType(
462463
field.target,

tests/functional/resolvers.ts

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2618,6 +2618,62 @@ describe("Resolvers", () => {
26182618
expect(dynamicField1).toBeDefined();
26192619
expect(dynamicField2).toBeDefined();
26202620
});
2621+
2622+
it("should resolve independent factory-created field resolvers with different schema names correctly", async () => {
2623+
getMetadataStorage().clear();
2624+
2625+
@ObjectType()
2626+
class FactoryUser {
2627+
@Field()
2628+
name!: string;
2629+
}
2630+
2631+
function createFieldResolver(fieldName: string, returnValue: string) {
2632+
@Resolver(() => FactoryUser)
2633+
class DynamicFieldResolver {
2634+
@FieldResolver(() => [String], { name: fieldName })
2635+
getItems(): string[] {
2636+
return [returnValue];
2637+
}
2638+
}
2639+
return DynamicFieldResolver;
2640+
}
2641+
2642+
const FollowersResolver = createFieldResolver("followers", "follower1");
2643+
const FollowingResolver = createFieldResolver("following", "following1");
2644+
2645+
@Resolver()
2646+
class FactoryUserResolver {
2647+
@Query(() => FactoryUser)
2648+
factoryUser(): FactoryUser {
2649+
return { name: "TestUser" } as FactoryUser;
2650+
}
2651+
}
2652+
2653+
const schemaInfo = await getSchemaInfo({
2654+
resolvers: [FactoryUserResolver, FollowersResolver, FollowingResolver],
2655+
});
2656+
const { schema: factorySchema, schemaIntrospection: factorySchemaIntrospection } = schemaInfo;
2657+
2658+
// Introspection check
2659+
const factoryUserType = factorySchemaIntrospection.types.find(
2660+
type => type.name === "FactoryUser",
2661+
) as IntrospectionObjectType;
2662+
expect(factoryUserType.fields.find(f => f.name === "followers")).toBeDefined();
2663+
expect(factoryUserType.fields.find(f => f.name === "following")).toBeDefined();
2664+
2665+
// Runtime execution check
2666+
const query = `{ factoryUser { name followers following } }`;
2667+
const result = await graphql({ schema: factorySchema, source: query });
2668+
expect(result.errors).toBeUndefined();
2669+
expect(result.data).toEqual({
2670+
factoryUser: {
2671+
name: "TestUser",
2672+
followers: ["follower1"],
2673+
following: ["following1"],
2674+
},
2675+
});
2676+
});
26212677
});
26222678

26232679
describe("Shared generic resolver", () => {

0 commit comments

Comments
 (0)