diff --git a/src/gql/gql-util.ts b/src/gql/gql-util.ts index 7403d36..052b3d1 100644 --- a/src/gql/gql-util.ts +++ b/src/gql/gql-util.ts @@ -385,12 +385,14 @@ export function createPromiseType(...types: string[]) { export function getType(node: ts.PropertyDeclaration | ts.MethodDeclaration) { const typeFromDecorator = getTypeFromDecorator(node, 'Field') if (typeFromDecorator) return typeFromDecorator + if (getName(node) === 'id') return 'ID' const [type, secondType] = Array.from(new Set(getAllTypes(node.type))).filter( i => !['null', 'undefined', 'Promise'].includes(i), ) if (secondType) throw new Error('Return type can not be a union type.') + if (type === 'string') return + if (type === 'number') return 'Int' if (type) return type - if (getName(node) === 'id') return 'ID' } export function addNullability( @@ -462,7 +464,7 @@ export function createFieldDecorator( factory.createIdentifier(type), ), ) - if (type === 'ID') context.imports.push(createImport('@nestjs/graphql', 'ID')) + if (['ID', 'INT'].includes(type)) context.imports.push(createImport('@nestjs/graphql', type)) } if (isNullable(node) || !!comment) { diff --git a/src/gql/resolver/resolver-generator.test.ts b/src/gql/resolver/resolver-generator.test.ts index 0e8f468..414fa08 100644 --- a/src/gql/resolver/resolver-generator.test.ts +++ b/src/gql/resolver/resolver-generator.test.ts @@ -38,12 +38,15 @@ describe('generateResolver', () => { ) expect(toParsedOutput(output)).toBe( toParsedOutput(` - import { Query, Resolver } from '@nestjs/graphql' + import { Parent, ResolveField, Resolver } from '@nestjs/graphql' @Resolver(() => UserModel) export class UserResolver { - @Query(() => User) - createdBy(): Promise {} + @ResolveField(() => User) + createdBy( + @Parent() + parent: User, + ): Promise {} } `), ) diff --git a/src/gql/resolver/resolver-generator.ts b/src/gql/resolver/resolver-generator.ts index 7bb746e..3057c47 100644 --- a/src/gql/resolver/resolver-generator.ts +++ b/src/gql/resolver/resolver-generator.ts @@ -22,6 +22,7 @@ import { getAllTypes, getName, getParameterType, + getType, getTypeFromDecorator, hasDecorator, hasImplementationByName, @@ -41,7 +42,23 @@ function processParameters( ...node, parameters: toNonNullArray( node.parameters.map(parameter => { - if (!!parameter.dotDotDotToken) return + if (!!parameter.dotDotDotToken) { + const type = getType(node) + return addDecorator( + factory.createParameterDeclaration( + undefined, + undefined, + factory.createIdentifier('parent'), + undefined, + factory.createTypeReferenceNode( + factory.createIdentifier(parentType ?? type ?? 'unknown'), + undefined, + ), + undefined, + ), + createParentDecorator(context), + ) + } const name = getName(parameter) if (name === 'parent') { return addDecorator( @@ -160,9 +177,8 @@ function getTypeNameFromParameters(node: ts.ClassDeclaration) { function getFieldDecoratorType(node: ts.Node) { if ( hasDecorator(node, 'ResolveField') || - ((ts.isFunctionTypeNode(node) - ? hasParameter(node.type, 'parent') - : hasParameter(node, 'parent')) && + ((hasParameter(ts.isFunctionTypeNode(node) ? node.type : node, 'parent') || + hasParameter(ts.isFunctionTypeNode(node) ? node.type : node, 'args')) && !hasDecorator(node, 'Query') && !hasDecorator(node, 'Mutation')) ) {