diff --git a/src/execution/execute.ts b/src/execution/execute.ts index 047ad4eb3bf..a12bf218c77 100644 --- a/src/execution/execute.ts +++ b/src/execution/execute.ts @@ -114,6 +114,7 @@ export interface ExecutionContext { variableValues: { [variable: string]: unknown }; fieldResolver: GraphQLFieldResolver; typeResolver: GraphQLTypeResolver; + subscribeFieldResolver?: GraphQLFieldResolver; errors: Array; } @@ -151,6 +152,7 @@ export interface ExecutionArgs { operationName?: Maybe; fieldResolver?: Maybe>; typeResolver?: Maybe>; + subscribeFieldResolver?: Maybe>; } /** @@ -164,32 +166,14 @@ export interface ExecutionArgs { * a GraphQLError will be thrown immediately explaining the invalid input. */ export function execute(args: ExecutionArgs): PromiseOrValue { - const { - schema, - document, - rootValue, - contextValue, - variableValues, - operationName, - fieldResolver, - typeResolver, - } = args; + const { schema, document, variableValues } = args; // If arguments are missing or incorrect, throw an error. assertValidExecutionArguments(schema, document, variableValues); // If a valid execution context cannot be created due to incorrect arguments, // a "Response" with only errors is returned. - const exeContext = buildExecutionContext( - schema, - document, - rootValue, - contextValue, - variableValues, - operationName, - fieldResolver, - typeResolver, - ); + const exeContext = buildExecutionContext(args); // Return early errors if execution context failed. if (!('schema' in exeContext)) { @@ -281,16 +265,17 @@ export function assertValidExecutionArguments( * * @internal */ -export function buildExecutionContext( - schema: GraphQLSchema, - document: DocumentNode, - rootValue: unknown, - contextValue: unknown, - rawVariableValues: Maybe<{ readonly [variable: string]: unknown }>, - operationName: Maybe, - fieldResolver: Maybe>, - typeResolver?: Maybe>, -): ReadonlyArray | ExecutionContext { +export function buildExecutionContext({ + schema, + document, + rootValue, + contextValue, + variableValues, + operationName, + fieldResolver, + typeResolver, + subscribeFieldResolver, +}: ExecutionArgs): ReadonlyArray | ExecutionContext { let operation: OperationDefinitionNode | undefined; const fragments: ObjMap = Object.create(null); for (const definition of document.definitions) { @@ -328,7 +313,7 @@ export function buildExecutionContext( const coercedVariableValues = getVariableValues( schema, variableDefinitions, - rawVariableValues ?? {}, + variableValues ?? {}, { maxErrors: 50 }, ); @@ -345,6 +330,7 @@ export function buildExecutionContext( variableValues: coercedVariableValues.coerced, fieldResolver: fieldResolver ?? defaultFieldResolver, typeResolver: typeResolver ?? defaultTypeResolver, + subscribeFieldResolver: subscribeFieldResolver ?? undefined, errors: [], }; } diff --git a/src/execution/subscribe.ts b/src/execution/subscribe.ts index 1d3af71e702..6f7614b047a 100644 --- a/src/execution/subscribe.ts +++ b/src/execution/subscribe.ts @@ -13,7 +13,11 @@ import type { GraphQLFieldResolver } from '../type/definition'; import { getOperationRootType } from '../utilities/getOperationRootType'; -import type { ExecutionResult, ExecutionContext } from './execute'; +import type { + ExecutionArgs, + ExecutionResult, + ExecutionContext, +} from './execute'; import { collectFields } from './collectFields'; import { getArgumentValues } from './values'; import { @@ -25,16 +29,14 @@ import { } from './execute'; import { mapAsyncIterator } from './mapAsyncIterator'; -export interface SubscriptionArgs { - schema: GraphQLSchema; - document: DocumentNode; - rootValue?: unknown; - contextValue?: unknown; - variableValues?: Maybe<{ readonly [variable: string]: unknown }>; - operationName?: Maybe; - fieldResolver?: Maybe>; - subscribeFieldResolver?: Maybe>; -} +/** + * Note: ExecutionArgs has been broadened to include all properties + * within SubscriptionArgs. The SubscriptionArgs type is retained + * for backwards compability and will be removed in the next major + * version. + */ +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface SubscriptionArgs extends ExecutionArgs {} /** * Implements the "Subscribe" algorithm described in the GraphQL specification. @@ -141,7 +143,7 @@ export async function createSourceEventStream( contextValue?: unknown, variableValues?: Maybe<{ readonly [variable: string]: unknown }>, operationName?: Maybe, - fieldResolver?: Maybe>, + subscribeFieldResolver?: Maybe>, ): Promise | ExecutionResult> { // If arguments are missing or incorrectly typed, this is an internal // developer mistake which should throw an early error. @@ -149,15 +151,15 @@ export async function createSourceEventStream( // If a valid execution context cannot be created due to incorrect arguments, // a "Response" with only errors is returned. - const exeContext = buildExecutionContext( + const exeContext = buildExecutionContext({ schema, document, rootValue, contextValue, variableValues, operationName, - fieldResolver, - ); + subscribeFieldResolver, + }); // Return early errors if execution context failed. if (!('schema' in exeContext)) {