diff --git a/src/Interfaces.ts b/src/Interfaces.ts index ee0f1c1191c..3e067221fc5 100644 --- a/src/Interfaces.ts +++ b/src/Interfaces.ts @@ -173,17 +173,23 @@ declare module 'graphql' { // eslint-disable-next-line @typescript-eslint/no-empty-interface export interface IGraphQLToolsResolveInfo extends GraphQLResolveInfo {} -export type Fetcher = ( - operation: IFetcherOperation, -) => Promise; +export type Fetcher = (options: IFetcherOptions) => Promise; -export interface IFetcherOperation { +export interface IFetcherOptions { query: DocumentNode; operationName?: string; variables?: Record; - context?: Record; + context?: { + graphqlContext?: Record; + graphqlResolveInfo?: GraphQLResolveInfo; + [key: string]: any; + }; } +// for backwards compatibility +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface IFetcherOperation extends IFetcherOptions {} + export type Dispatcher = (context: any) => ApolloLink | Fetcher; export interface SubschemaConfig { diff --git a/src/delegate/delegateToSchema.ts b/src/delegate/delegateToSchema.ts index 12a8bf1f8ac..d3db0d0f38a 100644 --- a/src/delegate/delegateToSchema.ts +++ b/src/delegate/delegateToSchema.ts @@ -204,8 +204,9 @@ export function delegateRequest({ const executionResult = executor({ document: processedRequest.document, - context, variables: processedRequest.variables, + context, + info, }); if (executionResult instanceof Promise) { @@ -225,8 +226,9 @@ export function delegateRequest({ return subscriber({ document: processedRequest.document, - context, variables: processedRequest.variables, + context, + info, }).then( ( subscriptionResult: @@ -263,12 +265,14 @@ function createExecutor( subschemaConfig?: SubschemaConfig, ): ({ document, - context, variables, + context, + info, }: { document: DocumentNode; - context?: Record; - variables?: Record; + variables: Record; + context: Record; + info: GraphQLResolveInfo; }) => Promise | ExecutionResult { let fetcher: Fetcher; let targetRootValue: Record = rootValue; @@ -291,11 +295,16 @@ function createExecutor( } if (fetcher != null) { - return ({ document, context: graphqlContext, variables }) => + return ({ + document: query, + variables, + context: graphqlContext, + info: graphqlResolveInfo, + }) => fetcher({ - query: document, + query, variables, - context: { graphqlContext }, + context: { graphqlContext, graphqlResolveInfo }, }); } @@ -316,12 +325,14 @@ function createSubscriber( subschemaConfig?: SubschemaConfig, ): ({ document, - context, variables, + context, + info, }: { document: DocumentNode; - context?: Record; - variables?: Record; + variables: Record; + context: Record; + info: GraphQLResolveInfo; }) => Promise | ExecutionResult> { let link: ApolloLink; let targetRootValue: Record = rootValue; @@ -350,7 +361,7 @@ function createSubscriber( }; } - return ({ document, context: graphqlContext, variables }) => + return ({ document, variables, context: graphqlContext }) => subscribe({ schema, document, diff --git a/src/stitch/linkToFetcher.ts b/src/stitch/linkToFetcher.ts index e64e9ff19cf..9d93129b109 100644 --- a/src/stitch/linkToFetcher.ts +++ b/src/stitch/linkToFetcher.ts @@ -1,10 +1,15 @@ import { ApolloLink, toPromise, execute, ExecutionResult } from 'apollo-link'; -import { Fetcher, IFetcherOperation } from '../Interfaces'; +import { Fetcher, IFetcherOptions } from '../Interfaces'; export { execute } from 'apollo-link'; export default function linkToFetcher(link: ApolloLink): Fetcher { - return (fetcherOperation: IFetcherOperation): Promise => - toPromise(execute(link, fetcherOperation)); + return ({ + query, + operationName, + variables, + context, + }: IFetcherOptions): Promise => + toPromise(execute(link, { query, operationName, variables, context })); }