From 65a76ff01a553f08fcd8b70db2f720bed2fcf6d9 Mon Sep 17 00:00:00 2001 From: Kim Brandwijk Date: Fri, 12 Jan 2018 14:08:22 +0100 Subject: [PATCH] feat(generators): add context to binding-ts and binding-js --- src/generators/binding-js.ts | 22 ++++++++++++- src/generators/binding-ts.ts | 56 +++++++++++++++++++++++++++++++++- src/generators/graphcool-js.ts | 6 +++- src/generators/graphcool-ts.ts | 8 ++--- 4 files changed, 85 insertions(+), 7 deletions(-) diff --git a/src/generators/binding-js.ts b/src/generators/binding-js.ts index 6cde649..66d897b 100644 --- a/src/generators/binding-js.ts +++ b/src/generators/binding-js.ts @@ -19,7 +19,6 @@ import { } from 'graphql' import { Generator } from '../types' -import { renderMainMethodFields, renderMainSubscriptionMethodFields } from './graphcool-js' export const generator: Generator = { Main: renderMainMethod, @@ -31,6 +30,23 @@ function renderHeader(schema: string): string { const { GraphQLResolveInfo } = require('graphql')` } +function renderMainMethodFields(operation: string, fields: GraphQLFieldMap): 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): 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 { @@ -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) + } }` } diff --git a/src/generators/binding-ts.ts b/src/generators/binding-ts.ts index c59fdae..9573696 100644 --- a/src/generators/binding-ts.ts +++ b/src/generators/binding-ts.ts @@ -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>` + }) + .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'` @@ -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): 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): string { + return Object.keys(fields) + .map(f => { + const field = fields[f] + return ` ${field.name}: (args, context, infoOrQuery): Promise> => super.delegateSubscription('${field.name}', args, context, infoOrQuery)` + }) + .join(',\n') } \ No newline at end of file diff --git a/src/generators/graphcool-js.ts b/src/generators/graphcool-js.ts index 4e8c14c..cd2f18f 100644 --- a/src/generators/graphcool-js.ts +++ b/src/generators/graphcool-js.ts @@ -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) + } }` } @@ -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') } diff --git a/src/generators/graphcool-ts.ts b/src/generators/graphcool-ts.ts index eee8ea0..f059a4e 100644 --- a/src/generators/graphcool-ts.ts +++ b/src/generators/graphcool-ts.ts @@ -123,7 +123,7 @@ export function renderMainSubscriptionMethodFields(fields: GraphQLFieldMap { const field = fields[f] - return ` ${field.name}: (args, infoOrQuery): Promise> => super.delegateSubscription('${field.name}', args, infoOrQuery)` + return ` ${field.name}: (args, infoOrQuery): Promise> => super.delegateSubscription('${field.name}', args, {}, infoOrQuery)` }) .join(',\n') } @@ -237,11 +237,11 @@ function renderInputObjectType( return renderInterfaceWrapper(type.name, type.description, interfaces, fieldDefinition) } -function renderFieldName(field: GraphQLInputField | GraphQLField) { +export function renderFieldName(field: GraphQLInputField | GraphQLField) { 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) } @@ -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} }`