Skip to content

Commit

Permalink
feat: generate apollo graphql resolver types
Browse files Browse the repository at this point in the history
  • Loading branch information
yorkyao committed Nov 21, 2018
1 parent c82023e commit 985ed2e
Show file tree
Hide file tree
Showing 2 changed files with 274 additions and 6 deletions.
243 changes: 243 additions & 0 deletions demo/root-type.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
/**
* This file is generated by 'types-as-schema'
* It is not mean to be edited by hand
*/
// tslint:disable

import { GraphQLResolveInfo } from 'graphql'

import { MutationResult, CreateInput, GetResult } from './cases'
Expand All @@ -16,6 +22,241 @@ export interface Root<TContext = any> {
users(input: {}, context: TContext, info: GraphQLResolveInfo): DeepPromisifyReturnType<GetResult> | Promise<DeepPromisifyReturnType<GetResult>>
}

export interface ApolloResolvers<TContext> {
TypeLiteral?: {
typeLiteralMember1?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
typeLiteralMember2?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
},
Interface?: {
interfaceMember1?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
interfaceMember2?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
},
TypeUnion1?: {
typeLiteralMember1?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
typeLiteralMember2?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
typeUnionMember1?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
typeUnionMember2?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
},
TypeUnion2?: {
kind?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
typeUnionMember1?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
typeUnionMember2?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
},
TypeUnion3?: {
kind?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
typeUnionMember1?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
typeUnionMember2?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
},
TypeUnion4?: {
kind?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
typeUnionMember1?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
typeUnionMember2?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
},
TypeUnion?: {
typeUnionMember1?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
typeUnionMember2?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
typeUnionMember3?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
typeUnionMember4?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
typeUnionMember5?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
typeUnionMember6?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
typeUnionMember7?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
typeUnionMember8?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
typeUnionMember9?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
},
InterfaceExtends?: {
interfaceExtendsMember1?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
interfaceExtendsMember2?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
interfaceMember1?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
interfaceMember2?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
},
TypeIntersection1?: {
interfaceMember1?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
interfaceMember2?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
typeIntersectionMember1?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
typeIntersectionMember2?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
},
TypeIntersection2?: {
typeIntersectionMember1?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
typeIntersectionMember2?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
typeIntersectionMember3?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
typeIntersectionMember4?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
},
TypeIntersection?: {
typeIntersectionMember1?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
typeIntersectionMember2?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
typeIntersectionMember3?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
},
TypeUnionAndIntersection?: {
typeIntersectionMember1?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
kind?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
typeUnionMember1?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
typeUnionMember2?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
},
TaggedField?: {
taggedFieldMember1?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
taggedFieldMember2?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
},
Enum?: {
stringEnum?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
numberEnum?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
numberEnum2?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
stringEnum2?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
},
NumberType?: {
numberMember?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
integerMember?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
uint32Member?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
int32Member?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
sint32Member?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
fixed32Member?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
sfixed32Member?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
uint64Member?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
int64Member?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
sint64Member?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
fixed64Member?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
sfixed64Member?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
floatMember?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
doubleMember?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
titleMember?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
},
StringType?: {
stringMember?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
},
ArrayType?: {
arrayType1?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
arrayType2?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
arrayType3?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
arrayType4?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
arrayType5?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
arrayType6?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
arrayType7?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
arrayType8?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
},
MapType7?: {
foo?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
},
MapType8?: {

},
MapType?: {
mapType?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
mapType2?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
mapType3?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
mapType4?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
mapType5?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
mapType6?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
mapType7?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
mapType8?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
},
Parameter?: {
member1?(parent: any, input: { name: string, age: number }, context: TContext, info: GraphQLResolveInfo): any,
member2?(parent: any, input: { name?: string }, context: TContext, info: GraphQLResolveInfo): any,
},
DefaultValue?: {
stringMember?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
numberMember?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
booleanMember?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
stringMember2?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
stringMember3?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
arrayMember?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
objectMember?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
numberMember1?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
objectMember2?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
},
ReferenceType?: {
typeReferenceMember1?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
typeReferenceMember2?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
},
ClassType1?: {
classMember1?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
classMember2?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
},
ClassType2?: {
classMember3?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
classMember4?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
classMember1?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
classMember2?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
},
ClassType3?: {
classMember1?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
classMember2?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
classMember3?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
classMember4?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
classMember5?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
classMember6?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
},
ClassType?: {
classType1?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
classType2?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
classType3?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
},
Circular?: {
children?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
},
EntryType?: {
optionalMember?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
booleanMember?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
stringMember?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
numberType?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
arrayType?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
typeLiteral?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
referenceType?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
interfaceType?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
typeUnion?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
interfaceExtends?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
typeIntersection?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
typeUnionAndIntersection?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
mapType?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
taggedField?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
enum?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
stringNumber?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
id?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
parameter?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
optionalArrayMember?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
tupleType?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
defaultType?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
anyType?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
classType?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
circular?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
outerType?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
typeAlias?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
},
Mutation: {
create(parent: any, input: { input: CreateInput }, context: TContext, info: GraphQLResolveInfo): any,
},
CreateInput?: {
member1?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
member2?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
member3?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
},
MutationResult?: {
result?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
},
Query: {
user(parent: any, input: { id: string }, context: TContext, info: GraphQLResolveInfo): any,
users(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
},
GetResult?: {
result?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
},
Result?: {
member1?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
member2?(parent: any, input: { input: string }, context: TContext, info: GraphQLResolveInfo): any,
},
CreateInputMember3?: {
member1?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
},
TypeAlias?: {
result?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
},
Result3?: {
result3?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
},
OuterType?: {
outerType?(parent: any, input: {}, context: TContext, info: GraphQLResolveInfo): any,
},
}

export type DeepReturnType<T> = {
[P in keyof T]: T[P] extends Array<infer U>
? Array<DeepReturnType<U>>
Expand All @@ -29,3 +270,5 @@ export interface ResolveResult {
user: DeepReturnType<GetResult>
users: DeepReturnType<GetResult>
}

// tslint:enable
37 changes: 31 additions & 6 deletions src/graphql-root-type-generator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,42 @@ import * as path from 'path'

import { TypeDeclaration, Type, MemberParameter, ReferenceType, EnumType } from './utils'

// tslint:disable-next-line:cognitive-complexity
export function generateGraphqlRootType(declarations: TypeDeclaration[], graphqlRootTypePath: string) {
const rootTypes: string[] = []
const resolveResults: string[] = []
const resolvers: string[] = []
const referenceTypes: (ReferenceType | EnumType)[] = []
for (const typeDeclaration of declarations) {
if (typeDeclaration.kind === 'object'
&& (typeDeclaration.name === 'Query' || typeDeclaration.name === 'Mutation')) {
if (typeDeclaration.kind === 'object') {
const isQueryOrMutation = typeDeclaration.name === 'Query' || typeDeclaration.name === 'Mutation'
if (isQueryOrMutation) {
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): DeepPromisifyReturnType<${memberType}> | Promise<DeepPromisifyReturnType<${memberType}>>`)
resolveResults.push(` ${member.name}: DeepReturnType<${memberType}>`)
}
}
const resolverFields: string[] = []
const optionalToken = isQueryOrMutation ? '' : '?'
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): DeepPromisifyReturnType<${memberType}> | Promise<DeepPromisifyReturnType<${memberType}>>`)
resolveResults.push(` ${member.name}: DeepReturnType<${memberType}>`)
resolverFields.push(` ${member.name}${optionalToken}(parent: any, ${parameters}, context: TContext, info: GraphQLResolveInfo): any,`)
}
resolvers.push(` ${typeDeclaration.name}${optionalToken}: {
${resolverFields.join('\n')}
},`)
}
}
const referenceTypeImports = getReferenceTypeImports(referenceTypes, graphqlRootTypePath)
return `import { GraphQLResolveInfo } from 'graphql'
return `/**
* This file is generated by 'types-as-schema'
* It is not mean to be edited by hand
*/
// tslint:disable
import { GraphQLResolveInfo } from 'graphql'
` + referenceTypeImports + `export type DeepPromisifyReturnType<T> = {
[P in keyof T]: T[P] extends Array<infer U>
Expand All @@ -32,6 +51,10 @@ export interface Root<TContext = any> {
${rootTypes.join('\n')}
}
export interface ApolloResolvers<TContext> {
${resolvers.join('\n')}
}
export type DeepReturnType<T> = {
[P in keyof T]: T[P] extends Array<infer U>
? Array<DeepReturnType<U>>
Expand All @@ -43,6 +66,8 @@ export type DeepReturnType<T> = {
export interface ResolveResult {
${resolveResults.join('\n')}
}
// tslint:enable
`
}

Expand Down

0 comments on commit 985ed2e

Please sign in to comment.