Skip to content
This repository was archived by the owner on May 10, 2018. It is now read-only.

Commit 8ce3997

Browse files
authored
feat(generators): add context to binding-ts and binding-js (#34)
1 parent a299c25 commit 8ce3997

File tree

4 files changed

+85
-7
lines changed

4 files changed

+85
-7
lines changed

src/generators/binding-js.ts

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ import {
1919
} from 'graphql'
2020

2121
import { Generator } from '../types'
22-
import { renderMainMethodFields, renderMainSubscriptionMethodFields } from './graphcool-js'
2322

2423
export const generator: Generator = {
2524
Main: renderMainMethod,
@@ -31,6 +30,23 @@ function renderHeader(schema: string): string {
3130
const { GraphQLResolveInfo } = require('graphql')`
3231
}
3332

33+
function renderMainMethodFields(operation: string, fields: GraphQLFieldMap<any, any>): string {
34+
return Object.keys(fields).map(f => {
35+
const field = fields[f]
36+
return ` ${field.name}(args, context, info) {
37+
return self.delegate('${operation}', '${field.name}', args, context, info)
38+
}`
39+
}).join(',\n')
40+
}
41+
42+
function renderMainSubscriptionMethodFields(operation: string, fields: GraphQLFieldMap<any, any>): string {
43+
return Object.keys(fields).map(f => {
44+
const field = fields[f]
45+
return ` ${field.name}(args, context, infoOrQuery) {
46+
return self.delegateSubscription('${field.name}', args, context, infoOrQuery)
47+
}`
48+
}).join(',\n')
49+
}
3450

3551
function renderMainMethod(queryType: GraphQLObjectType, mutationType?: GraphQLObjectType | null, subscriptionType?: GraphQLObjectType | null) {
3652
return `module.exports.Binding = class Binding extends BaseBinding {
@@ -55,6 +71,10 @@ ${renderMainSubscriptionMethodFields('mutation', subscriptionType.getFields())}
5571
delegate(operation, field, args, context, info) {
5672
return super.delegate(operation, field, args, context, info)
5773
}
74+
75+
delegateSubscription(field, args, context, infoOrQuery) {
76+
return super.delegateSubscription(field, args, context, infoOrQuery)
77+
}
5878
}`
5979
}
6080

src/generators/binding-ts.ts

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,31 @@ import {
1919
} from 'graphql'
2020

2121
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'
2323

2424
export const generator: Generator = {
2525
...gcgenerator,
2626
Main: renderMainMethod,
27+
RootType: renderRootType,
28+
SubscriptionType: renderSubscriptionType,
2729
Header: renderHeader,
2830
}
2931

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+
3047
function renderHeader(schema: string): string {
3148
return `import { Binding as BaseBinding, BindingOptions } from 'graphql-binding'
3249
import { GraphQLResolveInfo } from 'graphql'`
@@ -51,4 +68,41 @@ ${renderMainMethodFields('mutation', mutationType.getFields())}
5168
${renderMainSubscriptionMethodFields(subscriptionType.getFields())}
5269
}`: ''}
5370
}`
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')
54108
}

src/generators/graphcool-js.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,10 @@ ${renderMainSubscriptionMethodFields('mutation', subscriptionType.getFields())}
6161
delegate(operation, field, args, context, info) {
6262
return super.delegate(operation, field, args, context, info)
6363
}
64+
65+
delegateSubscription(field, args, context, infoOrQuery) {
66+
return super.delegateSubscription(field, args, context, infoOrQuery)
67+
}
6468
}`
6569
}
6670

@@ -100,7 +104,7 @@ export function renderMainSubscriptionMethodFields(operation: string, fields: Gr
100104
return Object.keys(fields).map(f => {
101105
const field = fields[f]
102106
return ` ${field.name}(args, infoOrQuery) {
103-
return self.delegateSubscription('${field.name}', args, infoOrQuery)
107+
return self.delegateSubscription('${field.name}', args, {}, infoOrQuery)
104108
}`
105109
}).join(',\n')
106110
}

src/generators/graphcool-ts.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ export function renderMainSubscriptionMethodFields(fields: GraphQLFieldMap<any,
123123
return Object.keys(fields)
124124
.map(f => {
125125
const field = fields[f]
126-
return ` ${field.name}: (args, infoOrQuery): Promise<AsyncIterator<${renderFieldType(field.type)}>> => super.delegateSubscription('${field.name}', args, infoOrQuery)`
126+
return ` ${field.name}: (args, infoOrQuery): Promise<AsyncIterator<${renderFieldType(field.type)}>> => super.delegateSubscription('${field.name}', args, {}, infoOrQuery)`
127127
})
128128
.join(',\n')
129129
}
@@ -237,11 +237,11 @@ function renderInputObjectType(
237237
return renderInterfaceWrapper(type.name, type.description, interfaces, fieldDefinition)
238238
}
239239

240-
function renderFieldName(field: GraphQLInputField | GraphQLField<any, any>) {
240+
export function renderFieldName(field: GraphQLInputField | GraphQLField<any, any>) {
241241
return `${field.name}${isNonNullType(field.type) ? '' : '?'}`
242242
}
243243

244-
function renderFieldType(type: GraphQLInputType | GraphQLOutputType) {
244+
export function renderFieldType(type: GraphQLInputType | GraphQLOutputType) {
245245
if (isNonNullType(type)) {
246246
return renderFieldType((type as GraphQLWrappingType).ofType)
247247
}
@@ -295,7 +295,7 @@ ${fieldDefinition}
295295
}`
296296
}
297297

298-
function renderTypeWrapper(typeName: string, typeDescription: string, fieldDefinition: string): string {
298+
export function renderTypeWrapper(typeName: string, typeDescription: string, fieldDefinition: string): string {
299299
return `${renderDescription(typeDescription)}export type ${typeName} = {
300300
${fieldDefinition}
301301
}`

0 commit comments

Comments
 (0)