@@ -19,14 +19,31 @@ import {
19
19
} from 'graphql'
20
20
21
21
import { Generator } from '../types'
22
- import { generator as gcgenerator , renderMainMethodFields , renderMainSubscriptionMethodFields } from './graphcool-ts'
22
+ import { generator as gcgenerator , renderFieldType , renderFieldName , renderTypeWrapper } from './graphcool-ts'
23
23
24
24
export const generator : Generator = {
25
25
...gcgenerator ,
26
26
Main : renderMainMethod ,
27
+ RootType : renderRootType ,
28
+ SubscriptionType : renderSubscriptionType ,
27
29
Header : renderHeader ,
28
30
}
29
31
32
+ function renderSubscriptionType ( type : GraphQLObjectType ) : string {
33
+ const fieldDefinition = Object . keys ( type . getFields ( ) )
34
+ . map ( f => {
35
+ const field = type . getFields ( ) [ f ]
36
+ return ` ${ field . name } : (args: {${ field . args . length > 0 ? ' ' : '' } ${ field . args
37
+ . map ( f => `${ renderFieldName ( f ) } : ${ renderFieldType ( f . type ) } ` )
38
+ . join ( ', ' ) } ${
39
+ field . args . length > 0 ? ' ' : ''
40
+ } }, context: { [key: string]: any }, infoOrQuery?: GraphQLResolveInfo | string) => Promise<AsyncIterator<${ renderFieldType ( field . type ) } >>`
41
+ } )
42
+ . join ( '\n' )
43
+
44
+ return renderTypeWrapper ( type . name , type . description , fieldDefinition )
45
+ }
46
+
30
47
function renderHeader ( schema : string ) : string {
31
48
return `import { Binding as BaseBinding, BindingOptions } from 'graphql-binding'
32
49
import { GraphQLResolveInfo } from 'graphql'`
@@ -51,4 +68,41 @@ ${renderMainMethodFields('mutation', mutationType.getFields())}
51
68
${ renderMainSubscriptionMethodFields ( subscriptionType . getFields ( ) ) }
52
69
}` : '' }
53
70
}`
71
+ }
72
+
73
+ function renderRootType ( type : GraphQLObjectType ) : string {
74
+ const fieldDefinition = Object . keys ( type . getFields ( ) )
75
+ . map ( f => {
76
+ const field = type . getFields ( ) [ f ]
77
+ return ` ${ field . name } : (args: {${ field . args . length > 0 ? ' ' : '' } ${ field . args
78
+ . map ( f => `${ renderFieldName ( f ) } : ${ renderFieldType ( f . type ) } ` )
79
+ . join ( ', ' ) } ${
80
+ field . args . length > 0 ? ' ' : ''
81
+ } }, context: { [key: string]: any }, info?: GraphQLResolveInfo | string) => Promise<${ renderFieldType ( field . type ) } ${
82
+ ! isNonNullType ( field . type ) ? ' | null' : ''
83
+ } >`
84
+ } )
85
+ . join ( '\n' )
86
+
87
+ return renderTypeWrapper ( type . name , type . description , fieldDefinition )
88
+ }
89
+
90
+ export function renderMainMethodFields ( operation : string , fields : GraphQLFieldMap < any , any > ) : string {
91
+ return Object . keys ( fields )
92
+ . map ( f => {
93
+ const field = fields [ f ]
94
+ return ` ${ field . name } : (args, context, info): Promise<${ renderFieldType ( field . type ) } ${
95
+ ! isNonNullType ( field . type ) ? ' | null' : ''
96
+ } > => super.delegate('${ operation } ', '${ field . name } ', args, context, info)`
97
+ } )
98
+ . join ( ',\n' )
99
+ }
100
+
101
+ export function renderMainSubscriptionMethodFields ( fields : GraphQLFieldMap < any , any > ) : string {
102
+ return Object . keys ( fields )
103
+ . map ( f => {
104
+ const field = fields [ f ]
105
+ return ` ${ field . name } : (args, context, infoOrQuery): Promise<AsyncIterator<${ renderFieldType ( field . type ) } >> => super.delegateSubscription('${ field . name } ', args, context, infoOrQuery)`
106
+ } )
107
+ . join ( ',\n' )
54
108
}
0 commit comments