Skip to content

Commit

Permalink
fix(field-resolvers): use schemaName for building field metadata (#1284)
Browse files Browse the repository at this point in the history
  • Loading branch information
dobrynin committed Jan 6, 2024
1 parent e28a028 commit eeea28d
Show file tree
Hide file tree
Showing 2 changed files with 68 additions and 1 deletion.
4 changes: 3 additions & 1 deletion src/metadata/metadata-storage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -291,7 +291,9 @@ export class MetadataStorage {
);
}

const typeField = typeMetadata.fields!.find(fieldDef => fieldDef.name === def.methodName)!;
const typeField = typeMetadata.fields!.find(
fieldDef => fieldDef.schemaName === def.schemaName,
)!;
if (!typeField) {
const shouldCollectFieldMetadata =
!options.resolvers ||
Expand Down
65 changes: 65 additions & 0 deletions tests/functional/resolvers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2479,5 +2479,70 @@ describe("Resolvers", () => {

expect(self).toBeInstanceOf(childResolver);
});

it("should allow duplicate fieldResolver methods with different schema names for inherited resolvers", async () => {
getMetadataStorage().clear();
const INHERITED_DYNAMIC_FIELD_NAME_1 = "dynamicallyNamedMethod1";
const INHERITED_DYNAMIC_FIELD_NAME_2 = "dynamicallyNamedMethod2";

const withDynamicallyNamedFieldResolver = (
classType: ClassType,
BaseResolverClass: ClassType,
name: string,
) => {
@Resolver(() => classType)
class DynamicallyNamedFieldResolver extends BaseResolverClass {
@FieldResolver({ name })
dynamicallyNamedField(): boolean {
return true;
}
}
return DynamicallyNamedFieldResolver;
};

@ObjectType()
class SampleObject {
@Field()
sampleField!: string;
}

@Resolver()
class SampleResolver {
@Query(() => SampleObject)
sampleObject(): SampleObject {
return { sampleField: "sampleText" };
}
}

const DynamicallyNamedFieldResolver1 = withDynamicallyNamedFieldResolver(
SampleObject,
SampleResolver,
INHERITED_DYNAMIC_FIELD_NAME_1,
);
const DynamicallyNamedFieldResolver2 = withDynamicallyNamedFieldResolver(
SampleObject,
DynamicallyNamedFieldResolver1,
INHERITED_DYNAMIC_FIELD_NAME_2,
);

const schemaInfo = await getSchemaInfo({
resolvers: [DynamicallyNamedFieldResolver2],
});
schemaIntrospection = schemaInfo.schemaIntrospection;
const sampleObjectType = schemaIntrospection.types.find(
type => type.name === "SampleObject",
) as IntrospectionObjectType;

const dynamicField1 = sampleObjectType.fields.find(
field => field.name === INHERITED_DYNAMIC_FIELD_NAME_1,
)!;

const dynamicField2 = sampleObjectType.fields.find(
field => field.name === INHERITED_DYNAMIC_FIELD_NAME_2,
)!;

expect(dynamicField1).toBeDefined();
expect(dynamicField2).toBeDefined();
});
});
});

0 comments on commit eeea28d

Please sign in to comment.