Skip to content

Commit

Permalink
feat: improve root type return type
Browse files Browse the repository at this point in the history
  • Loading branch information
plantain-00 committed Nov 19, 2018
1 parent 8ddc1ad commit be347c1
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 15 deletions.
26 changes: 17 additions & 9 deletions demo/root-type.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,30 @@ import { GraphQLResolveInfo } from 'graphql'

import { MutationResult, CreateInput, GetResult } from './cases'

type DeepPromisifyReturnType<T> = {
[P in keyof T]: T[P] extends Array<infer U>
? Array<DeepPromisifyReturnType<U>>
: T[P] extends (...args: infer P) => infer R
? (...args: P) => R | Promise<R>
: DeepPromisifyReturnType<T[P]>
}

export interface Root<TContext = any> {
create(input: { input: CreateInput }, context: TContext, info: GraphQLResolveInfo): MutationResult | Promise<MutationResult>
user(input: { id: string }, context: TContext, info: GraphQLResolveInfo): GetResult | Promise<GetResult>
users(input: {}, context: TContext, info: GraphQLResolveInfo): GetResult | Promise<GetResult>
create(input: { input: CreateInput }, context: TContext, info: GraphQLResolveInfo): DeepPromisifyReturnType<MutationResult> | Promise<DeepPromisifyReturnType<MutationResult>>
user(input: { id: string }, context: TContext, info: GraphQLResolveInfo): DeepPromisifyReturnType<GetResult> | Promise<DeepPromisifyReturnType<GetResult>>
users(input: {}, context: TContext, info: GraphQLResolveInfo): DeepPromisifyReturnType<GetResult> | Promise<DeepPromisifyReturnType<GetResult>>
}

type ResolveFunctionResult<T> = {
type DeepReturnType<T> = {
[P in keyof T]: T[P] extends Array<infer U>
? Array<ResolveFunctionResult<U>>
? Array<DeepReturnType<U>>
: T[P] extends (...args: any[]) => infer R
? R
: ResolveFunctionResult<T[P]>
: DeepReturnType<T[P]>
}

export interface ResolveResult {
create: ResolveFunctionResult<MutationResult>
user: ResolveFunctionResult<GetResult>
users: ResolveFunctionResult<GetResult>
create: DeepReturnType<MutationResult>
user: DeepReturnType<GetResult>
users: DeepReturnType<GetResult>
}
20 changes: 14 additions & 6 deletions src/graphql-root-type-generator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,24 +12,32 @@ export function generateGraphqlRootType(declarations: TypeDeclaration[], graphql
for (const member of typeDeclaration.members) {
const memberType = getMemberType(member.type, referenceTypes)
const parameters = getMemberParameters(referenceTypes, member.parameters)
rootTypes.push(` ${member.name}(${parameters}, context: TContext, info: GraphQLResolveInfo): ${memberType} | Promise<${memberType}>`)
resolveResults.push(` ${member.name}: ResolveFunctionResult<${memberType}>`)
rootTypes.push(` ${member.name}(${parameters}, context: TContext, info: GraphQLResolveInfo): DeepPromisifyReturnType<${memberType}> | Promise<DeepPromisifyReturnType<${memberType}>>`)
resolveResults.push(` ${member.name}: DeepReturnType<${memberType}>`)
}
}
}
const referenceTypeImports = getReferenceTypeImports(referenceTypes, graphqlRootTypePath)
return `import { GraphQLResolveInfo } from 'graphql'
` + referenceTypeImports + `export interface Root<TContext = any> {
` + referenceTypeImports + `type DeepPromisifyReturnType<T> = {
[P in keyof T]: T[P] extends Array<infer U>
? Array<DeepPromisifyReturnType<U>>
: T[P] extends (...args: infer P) => infer R
? (...args: P) => R | Promise<R>
: DeepPromisifyReturnType<T[P]>
}
export interface Root<TContext = any> {
${rootTypes.join('\n')}
}
type ResolveFunctionResult<T> = {
type DeepReturnType<T> = {
[P in keyof T]: T[P] extends Array<infer U>
? Array<ResolveFunctionResult<U>>
? Array<DeepReturnType<U>>
: T[P] extends (...args: any[]) => infer R
? R
: ResolveFunctionResult<T[P]>
: DeepReturnType<T[P]>
}
export interface ResolveResult {
Expand Down

0 comments on commit be347c1

Please sign in to comment.