diff --git a/CHANGELOG.md b/CHANGELOG.md index 180e4d084..fd48e2176 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,8 @@ ### Features - add support for creating and attaching middlewares, guards and interceptors to fields and resolvers - **Breaking Change**: remove deprecated decorators with `GraphQL` prefix and `{ array: true }` type option +### Fixes +- fix bug when converting object scalars to target class instance (#65) ## v0.10.0 ### Features diff --git a/src/helpers/types.ts b/src/helpers/types.ts index 2245bc59f..28d482cbf 100644 --- a/src/helpers/types.ts +++ b/src/helpers/types.ts @@ -58,7 +58,11 @@ export function convertToType(Target: any, data?: object): object | undefined { if (data == null) { return; } - // skip simple types + // skip converting scalars (object scalar mostly) + if (Target instanceof GraphQLScalarType) { + return data; + } + // skip converting simple types if (simpleTypes.includes(data.constructor)) { return data; } diff --git a/tests/functional/scalars.ts b/tests/functional/scalars.ts index 70477cfbd..76bb76e96 100644 --- a/tests/functional/scalars.ts +++ b/tests/functional/scalars.ts @@ -24,7 +24,7 @@ import { GraphQLTimestamp, } from "../../src"; import { getSchemaInfo } from "../helpers/getSchemaInfo"; -import { CustomScalar, CustomType } from "../helpers/customScalar"; +import { CustomScalar, CustomType, ObjectScalar } from "../helpers/customScalar"; import { getSampleObjectFieldType } from "../helpers/getSampleObjectFieldType"; import { MetadataStorage } from "../../src/metadata/metadata-storage"; @@ -103,6 +103,15 @@ describe("Scalars", () => { return true; } + @Query(returns => Boolean) + objectArgScalar( + @Arg("scalar", type => ObjectScalar) + scalar: any, + ): any { + argScalar = scalar; + return true; + } + @Query(returns => Date) returnDate(): any { return new Date(); @@ -237,6 +246,15 @@ describe("Scalars", () => { expect(argScalar!).toEqual("TypeGraphQL parseLiteral"); }); + + it("should properly parse scalar object", async () => { + const query = `query { + objectArgScalar(scalar: "test") + }`; + await graphql(schema, query); + + expect(argScalar!).toEqual({ value: "TypeGraphQL parseLiteral" }); + }); }); describe("Bulit-in scalars", () => { diff --git a/tests/helpers/customScalar.ts b/tests/helpers/customScalar.ts index ee5b040e7..13eaf1fe3 100644 --- a/tests/helpers/customScalar.ts +++ b/tests/helpers/customScalar.ts @@ -7,3 +7,14 @@ export const CustomScalar = new GraphQLScalarType({ serialize: () => "TypeGraphQL serialize", }); export class CustomType {} + +export const ObjectScalar = new GraphQLScalarType({ + name: "ObjectScalar", + parseLiteral: () => ({ + value: "TypeGraphQL parseLiteral", + }), + parseValue: () => ({ + value: "TypeGraphQL parseValue", + }), + serialize: obj => obj.value, +});