diff --git a/src/Binding.ts b/src/Binding.ts index a673efe3..ceab5f46 100644 --- a/src/Binding.ts +++ b/src/Binding.ts @@ -5,33 +5,35 @@ import { delegateToSchema } from 'graphql-tools' import { makeProxy, makeSubscriptionProxy } from './proxy' import { QueryMap, BindingOptions, FragmentReplacements, SubscriptionMap, Operation } from './types' -export class Binding { - query: QueryMap - mutation: QueryMap - subscription: SubscriptionMap +export class Binding { + query: TQueryMap + mutation: TQueryMap + subscription: TSubscriptionMap schema: GraphQLSchema before: () => void private fragmentReplacements: FragmentReplacements - constructor({ schema, fragmentReplacements, before }: BindingOptions) { + constructor({ schema, fragmentReplacements, before, handler }: BindingOptions) { this.fragmentReplacements = fragmentReplacements || {} this.schema = schema this.before = before || (() => undefined) - this.query = makeProxy({ + this.query = makeProxy({ schema: this.schema, fragmentReplacements: this.fragmentReplacements, operation: 'query', - before: this.before + before: this.before, + handler }) - this.mutation = makeProxy({ + this.mutation = makeProxy({ schema: this.schema, fragmentReplacements: this.fragmentReplacements, operation: 'mutation', - before: this.before + before: this.before, + handler }) - this.subscription = makeSubscriptionProxy({ + this.subscription = makeSubscriptionProxy({ schema: this.schema, fragmentReplacements: this.fragmentReplacements, before: this.before diff --git a/src/handler.ts b/src/handler.ts index 706d87e3..5f7d67e9 100644 --- a/src/handler.ts +++ b/src/handler.ts @@ -15,6 +15,7 @@ export class Handler implements ProxyHandler { get(target: T, rootFieldName: string) { return ( args?: { [key: string]: any }, + context?: { [key: string]: any }, info?: GraphQLResolveInfo | string, ): Promise => { this.before() @@ -28,7 +29,7 @@ export class Handler implements ProxyHandler { operation, rootFieldName, args || {}, - {}, + context || {}, info, ) } @@ -45,6 +46,7 @@ export class SubscriptionHandler implements ProxyHandler { get(target: T, rootFieldName: string) { return async ( args?: { [key: string]: any }, + context?: { [key: string]: any }, infoOrQuery?: GraphQLResolveInfo | string, ): Promise> => { this.before() @@ -62,7 +64,7 @@ export class SubscriptionHandler implements ProxyHandler { 'subscription', rootFieldName, args || {}, - {}, + context || {}, info, ) diff --git a/src/proxy.ts b/src/proxy.ts index 8a883b36..07d0aada 100644 --- a/src/proxy.ts +++ b/src/proxy.ts @@ -7,15 +7,19 @@ export function makeProxy({ fragmentReplacements, operation, before, + handler }: { schema: GraphQLSchema fragmentReplacements: FragmentReplacements operation: 'query' | 'mutation' - before: () => void + before: () => void, + handler?: { new(schema, fragmentReplacements, operation, before): ProxyHandler } }): T { return new Proxy( {} as T, - new Handler(schema, fragmentReplacements, operation, before), + handler + ? new handler(schema, fragmentReplacements, operation, before) + : new Handler(schema, fragmentReplacements, operation, before), ) } diff --git a/src/types.ts b/src/types.ts index 80a7f8bb..44e810ec 100644 --- a/src/types.ts +++ b/src/types.ts @@ -10,7 +10,8 @@ export interface FragmentReplacements { export interface QueryMap { [rootField: string]: ( - args?: any, + args?: { [key: string]: any }, + context?: { [key: string]: any }, info?: GraphQLResolveInfo | string, ) => Promise } @@ -18,6 +19,7 @@ export interface QueryMap { export interface SubscriptionMap { [rootField: string]: ( args?: any, + context?: { [key: string]: any }, info?: GraphQLResolveInfo | string, ) => AsyncIterator | Promise> } @@ -26,4 +28,5 @@ export interface BindingOptions { fragmentReplacements?: FragmentReplacements schema: GraphQLSchema before?: () => void + handler?: any }