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

feat(generators): add context to binding-ts and binding-js #34

Merged
merged 1 commit into from
Jan 12, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 21 additions & 1 deletion src/generators/binding-js.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ import {
} from 'graphql'

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

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

function renderMainMethodFields(operation: string, fields: GraphQLFieldMap<any, any>): string {
return Object.keys(fields).map(f => {
const field = fields[f]
return ` ${field.name}(args, context, info) {
return self.delegate('${operation}', '${field.name}', args, context, info)
}`
}).join(',\n')
}

function renderMainSubscriptionMethodFields(operation: string, fields: GraphQLFieldMap<any, any>): string {
return Object.keys(fields).map(f => {
const field = fields[f]
return ` ${field.name}(args, context, infoOrQuery) {
return self.delegateSubscription('${field.name}', args, context, infoOrQuery)
}`
}).join(',\n')
}

function renderMainMethod(queryType: GraphQLObjectType, mutationType?: GraphQLObjectType | null, subscriptionType?: GraphQLObjectType | null) {
return `module.exports.Binding = class Binding extends BaseBinding {
Expand All @@ -55,6 +71,10 @@ ${renderMainSubscriptionMethodFields('mutation', subscriptionType.getFields())}
delegate(operation, field, args, context, info) {
return super.delegate(operation, field, args, context, info)
}
delegateSubscription(field, args, context, infoOrQuery) {
return super.delegateSubscription(field, args, context, infoOrQuery)
}
}`
}

56 changes: 55 additions & 1 deletion src/generators/binding-ts.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,31 @@ import {
} from 'graphql'

import { Generator } from '../types'
import { generator as gcgenerator, renderMainMethodFields, renderMainSubscriptionMethodFields } from './graphcool-ts'
import { generator as gcgenerator, renderFieldType, renderFieldName, renderTypeWrapper } from './graphcool-ts'

export const generator: Generator = {
...gcgenerator,
Main: renderMainMethod,
RootType: renderRootType,
SubscriptionType: renderSubscriptionType,
Header: renderHeader,
}

function renderSubscriptionType(type: GraphQLObjectType): string {
const fieldDefinition = Object.keys(type.getFields())
.map(f => {
const field = type.getFields()[f]
return ` ${field.name}: (args: {${field.args.length > 0 ? ' ' : ''}${field.args
.map(f => `${renderFieldName(f)}: ${renderFieldType(f.type)}`)
.join(', ')}${
field.args.length > 0 ? ' ' : ''
}}, context: { [key: string]: any }, infoOrQuery?: GraphQLResolveInfo | string) => Promise<AsyncIterator<${renderFieldType(field.type)}>>`
})
.join('\n')

return renderTypeWrapper(type.name, type.description, fieldDefinition)
}

function renderHeader(schema: string): string {
return `import { Binding as BaseBinding, BindingOptions } from 'graphql-binding'
import { GraphQLResolveInfo } from 'graphql'`
Expand All @@ -51,4 +68,41 @@ ${renderMainMethodFields('mutation', mutationType.getFields())}
${renderMainSubscriptionMethodFields(subscriptionType.getFields())}
}`: ''}
}`
}

function renderRootType(type: GraphQLObjectType): string {
const fieldDefinition = Object.keys(type.getFields())
.map(f => {
const field = type.getFields()[f]
return ` ${field.name}: (args: {${field.args.length > 0 ? ' ' : ''}${field.args
.map(f => `${renderFieldName(f)}: ${renderFieldType(f.type)}`)
.join(', ')}${
field.args.length > 0 ? ' ' : ''
}}, context: { [key: string]: any }, info?: GraphQLResolveInfo | string) => Promise<${renderFieldType(field.type)}${
!isNonNullType(field.type) ? ' | null' : ''
}>`
})
.join('\n')

return renderTypeWrapper(type.name, type.description, fieldDefinition)
}

export function renderMainMethodFields(operation: string, fields: GraphQLFieldMap<any, any>): string {
return Object.keys(fields)
.map(f => {
const field = fields[f]
return ` ${field.name}: (args, context, info): Promise<${renderFieldType(field.type)}${
!isNonNullType(field.type) ? ' | null' : ''
}> => super.delegate('${operation}', '${field.name}', args, context, info)`
})
.join(',\n')
}

export function renderMainSubscriptionMethodFields(fields: GraphQLFieldMap<any, any>): string {
return Object.keys(fields)
.map(f => {
const field = fields[f]
return ` ${field.name}: (args, context, infoOrQuery): Promise<AsyncIterator<${renderFieldType(field.type)}>> => super.delegateSubscription('${field.name}', args, context, infoOrQuery)`
})
.join(',\n')
}
6 changes: 5 additions & 1 deletion src/generators/graphcool-js.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,10 @@ ${renderMainSubscriptionMethodFields('mutation', subscriptionType.getFields())}
delegate(operation, field, args, context, info) {
return super.delegate(operation, field, args, context, info)
}

delegateSubscription(field, args, context, infoOrQuery) {
return super.delegateSubscription(field, args, context, infoOrQuery)
}
}`
}

Expand Down Expand Up @@ -100,7 +104,7 @@ export function renderMainSubscriptionMethodFields(operation: string, fields: Gr
return Object.keys(fields).map(f => {
const field = fields[f]
return ` ${field.name}(args, infoOrQuery) {
return self.delegateSubscription('${field.name}', args, infoOrQuery)
return self.delegateSubscription('${field.name}', args, {}, infoOrQuery)
}`
}).join(',\n')
}
8 changes: 4 additions & 4 deletions src/generators/graphcool-ts.ts
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ export function renderMainSubscriptionMethodFields(fields: GraphQLFieldMap<any,
return Object.keys(fields)
.map(f => {
const field = fields[f]
return ` ${field.name}: (args, infoOrQuery): Promise<AsyncIterator<${renderFieldType(field.type)}>> => super.delegateSubscription('${field.name}', args, infoOrQuery)`
return ` ${field.name}: (args, infoOrQuery): Promise<AsyncIterator<${renderFieldType(field.type)}>> => super.delegateSubscription('${field.name}', args, {}, infoOrQuery)`
})
.join(',\n')
}
Expand Down Expand Up @@ -237,11 +237,11 @@ function renderInputObjectType(
return renderInterfaceWrapper(type.name, type.description, interfaces, fieldDefinition)
}

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

function renderFieldType(type: GraphQLInputType | GraphQLOutputType) {
export function renderFieldType(type: GraphQLInputType | GraphQLOutputType) {
if (isNonNullType(type)) {
return renderFieldType((type as GraphQLWrappingType).ofType)
}
Expand Down Expand Up @@ -295,7 +295,7 @@ ${fieldDefinition}
}`
}

function renderTypeWrapper(typeName: string, typeDescription: string, fieldDefinition: string): string {
export function renderTypeWrapper(typeName: string, typeDescription: string, fieldDefinition: string): string {
return `${renderDescription(typeDescription)}export type ${typeName} = {
${fieldDefinition}
}`
Expand Down