Skip to content

Commit eeea28d

Browse files
authored
fix(field-resolvers): use schemaName for building field metadata (#1284)
1 parent e28a028 commit eeea28d

File tree

2 files changed

+68
-1
lines changed

2 files changed

+68
-1
lines changed

src/metadata/metadata-storage.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -291,7 +291,9 @@ export class MetadataStorage {
291291
);
292292
}
293293

294-
const typeField = typeMetadata.fields!.find(fieldDef => fieldDef.name === def.methodName)!;
294+
const typeField = typeMetadata.fields!.find(
295+
fieldDef => fieldDef.schemaName === def.schemaName,
296+
)!;
295297
if (!typeField) {
296298
const shouldCollectFieldMetadata =
297299
!options.resolvers ||

tests/functional/resolvers.ts

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2479,5 +2479,70 @@ describe("Resolvers", () => {
24792479

24802480
expect(self).toBeInstanceOf(childResolver);
24812481
});
2482+
2483+
it("should allow duplicate fieldResolver methods with different schema names for inherited resolvers", async () => {
2484+
getMetadataStorage().clear();
2485+
const INHERITED_DYNAMIC_FIELD_NAME_1 = "dynamicallyNamedMethod1";
2486+
const INHERITED_DYNAMIC_FIELD_NAME_2 = "dynamicallyNamedMethod2";
2487+
2488+
const withDynamicallyNamedFieldResolver = (
2489+
classType: ClassType,
2490+
BaseResolverClass: ClassType,
2491+
name: string,
2492+
) => {
2493+
@Resolver(() => classType)
2494+
class DynamicallyNamedFieldResolver extends BaseResolverClass {
2495+
@FieldResolver({ name })
2496+
dynamicallyNamedField(): boolean {
2497+
return true;
2498+
}
2499+
}
2500+
return DynamicallyNamedFieldResolver;
2501+
};
2502+
2503+
@ObjectType()
2504+
class SampleObject {
2505+
@Field()
2506+
sampleField!: string;
2507+
}
2508+
2509+
@Resolver()
2510+
class SampleResolver {
2511+
@Query(() => SampleObject)
2512+
sampleObject(): SampleObject {
2513+
return { sampleField: "sampleText" };
2514+
}
2515+
}
2516+
2517+
const DynamicallyNamedFieldResolver1 = withDynamicallyNamedFieldResolver(
2518+
SampleObject,
2519+
SampleResolver,
2520+
INHERITED_DYNAMIC_FIELD_NAME_1,
2521+
);
2522+
const DynamicallyNamedFieldResolver2 = withDynamicallyNamedFieldResolver(
2523+
SampleObject,
2524+
DynamicallyNamedFieldResolver1,
2525+
INHERITED_DYNAMIC_FIELD_NAME_2,
2526+
);
2527+
2528+
const schemaInfo = await getSchemaInfo({
2529+
resolvers: [DynamicallyNamedFieldResolver2],
2530+
});
2531+
schemaIntrospection = schemaInfo.schemaIntrospection;
2532+
const sampleObjectType = schemaIntrospection.types.find(
2533+
type => type.name === "SampleObject",
2534+
) as IntrospectionObjectType;
2535+
2536+
const dynamicField1 = sampleObjectType.fields.find(
2537+
field => field.name === INHERITED_DYNAMIC_FIELD_NAME_1,
2538+
)!;
2539+
2540+
const dynamicField2 = sampleObjectType.fields.find(
2541+
field => field.name === INHERITED_DYNAMIC_FIELD_NAME_2,
2542+
)!;
2543+
2544+
expect(dynamicField1).toBeDefined();
2545+
expect(dynamicField2).toBeDefined();
2546+
});
24822547
});
24832548
});

0 commit comments

Comments
 (0)