Skip to content

Commit d973922

Browse files
committed
fix(args convertion): errors when converting gql objects
1 parent 35ee36f commit d973922

File tree

4 files changed

+20
-6
lines changed

4 files changed

+20
-6
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
- fix missing type args in schema when declared in field resolver
66
- fix missing resolver function when defined as type field method
77
- fix creating instances of root object when internal fields are Promises (switch from `plainToClass` to vanilla JS)
8+
- fix convertings field and resolvers args errors while converting gql objects (weird `prototype` stuffs)
89

910
### 0.1.1
1011
#### Features

src/resolvers/create.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { IOCContainer } from "../utils/container";
55
import { FieldResolverDefinition, ParamDefinition } from "../metadata/definition-interfaces";
66
import { getParams } from "./helpers";
77
import { BaseResolverDefinitions } from "../types/resolvers";
8+
import { convertToType } from "../types/convert";
89

910
export function createResolver(
1011
resolverDefinition: BaseResolverDefinitions,
@@ -25,10 +26,7 @@ export function createFieldResolver(
2526

2627
const targetType = fieldResolverDefintion.getParentType!();
2728
return (root, args, context, info) => {
28-
// const targetData = { ...root }; // workaround for plainToClass bug
29-
// const targetInstance: any = plainToClass(targetType as any, targetData);
30-
const targetInstance: any = Object.assign({}, root);
31-
Object.setPrototypeOf(targetInstance, targetType.prototype);
29+
const targetInstance: any = convertToType(targetType, root);
3230

3331
// method
3432
if (fieldResolverDefintion.handler) {

src/resolvers/helpers.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { plainToClass } from "class-transformer";
22

33
import { ParamDefinition } from "../metadata/definition-interfaces";
4+
import { convertToType } from "../types/convert";
45

56
export interface ResolverData {
67
root: any;
@@ -15,9 +16,9 @@ export function getParams(
1516
return params.sort((a, b) => a.index - b.index).map(paramInfo => {
1617
switch (paramInfo.kind) {
1718
case "args":
18-
return plainToClass(paramInfo.getType() as any, args);
19+
return convertToType(paramInfo.getType(), args);
1920
case "arg":
20-
return plainToClass(paramInfo.getType() as any, args[paramInfo.name]);
21+
return convertToType(paramInfo.getType(), args[paramInfo.name]);
2122
case "context":
2223
return context;
2324
case "root":

src/types/convert.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
const simpleTypes: Function[] = [String, Boolean, Number, Date, Array, Promise];
2+
3+
export function convertToType(target: any, data?: object): object|undefined {
4+
// skip converting undefined and null
5+
if (data == null) {
6+
return;
7+
}
8+
// skip simple types
9+
if (simpleTypes.includes(data.constructor)) {
10+
return data;
11+
}
12+
13+
return Object.assign(Object.create(target.prototype), data);
14+
}

0 commit comments

Comments
 (0)