import type { Path } from '../jsutils/Path'; import type { ObjMap } from '../jsutils/ObjMap'; import type { PromiseOrValue } from '../jsutils/PromiseOrValue'; import type { Maybe } from '../jsutils/Maybe'; import type { GraphQLFormattedError } from '../error/GraphQLError'; import { GraphQLError } from '../error/GraphQLError'; import type { DocumentNode, OperationDefinitionNode, FieldNode, FragmentDefinitionNode, } from '../language/ast'; import type { GraphQLSchema } from '../type/schema'; import type { GraphQLObjectType, GraphQLField, GraphQLFieldResolver, GraphQLResolveInfo, GraphQLTypeResolver, } from '../type/definition'; /** * Terminology * * "Definitions" are the generic name for top-level statements in the document. * Examples of this include: * 1) Operations (such as a query) * 2) Fragments * * "Operations" are a generic name for requests in the document. * Examples of this include: * 1) query, * 2) mutation * * "Selections" are the definitions that can appear legally and at * single level of the query. These include: * 1) field references e.g `a` * 2) fragment "spreads" e.g. `...c` * 3) inline fragment "spreads" e.g. `...on Type { a }` */ /** * Data that must be available at all points during query execution. * * Namely, schema of the type system that is currently executing, * and the fragments defined in the query document */ export interface ExecutionContext { schema: GraphQLSchema; fragments: ObjMap; rootValue: unknown; contextValue: unknown; operation: OperationDefinitionNode; variableValues: { [variable: string]: unknown; }; fieldResolver: GraphQLFieldResolver; typeResolver: GraphQLTypeResolver; subscribeFieldResolver: GraphQLFieldResolver; errors: Array; } /** * The result of GraphQL execution. * * - `errors` is included when any errors occurred as a non-empty array. * - `data` is the result of a successful execution of the query. * - `extensions` is reserved for adding non-standard properties. */ export interface ExecutionResult< TData = ObjMap, TExtensions = ObjMap, > { errors?: ReadonlyArray; data?: TData | null; extensions?: TExtensions; } export interface FormattedExecutionResult< TData = ObjMap, TExtensions = ObjMap, > { errors?: ReadonlyArray; data?: TData | null; extensions?: TExtensions; } export interface ExecutionArgs { schema: GraphQLSchema; document: DocumentNode; rootValue?: unknown; contextValue?: unknown; variableValues?: Maybe<{ readonly [variable: string]: unknown; }>; operationName?: Maybe; fieldResolver?: Maybe>; typeResolver?: Maybe>; subscribeFieldResolver?: Maybe>; } /** * Implements the "Executing requests" section of the GraphQL specification. * * Returns either a synchronous ExecutionResult (if all encountered resolvers * are synchronous), or a Promise of an ExecutionResult that will eventually be * resolved and never rejected. * * If the arguments to this function do not result in a legal execution context, * a GraphQLError will be thrown immediately explaining the invalid input. */ export declare function execute( args: ExecutionArgs, ): PromiseOrValue; /** * Also implements the "Executing requests" section of the GraphQL specification. * However, it guarantees to complete synchronously (or throw an error) assuming * that all field resolvers are also synchronous. */ export declare function executeSync(args: ExecutionArgs): ExecutionResult; /** * Essential assertions before executing to provide developer feedback for * improper use of the GraphQL library. * * @internal */ export declare function assertValidExecutionArguments( schema: GraphQLSchema, document: DocumentNode, rawVariableValues: Maybe<{ readonly [variable: string]: unknown; }>, ): void; /** * Constructs a ExecutionContext object from the arguments passed to * execute, which we will pass throughout the other execution methods. * * Throws a GraphQLError if a valid execution context cannot be created. * * @internal */ export declare function buildExecutionContext( args: ExecutionArgs, ): ReadonlyArray | ExecutionContext; /** * @internal */ export declare function buildResolveInfo( exeContext: ExecutionContext, fieldDef: GraphQLField, fieldNodes: ReadonlyArray, parentType: GraphQLObjectType, path: Path, ): GraphQLResolveInfo; /** * If a resolveType function is not given, then a default resolve behavior is * used which attempts two strategies: * * First, See if the provided value has a `__typename` field defined, if so, use * that value as name of the resolved type. * * Otherwise, test each possible type for the abstract type by calling * isTypeOf for the object being coerced, returning the first type that matches. */ export declare const defaultTypeResolver: GraphQLTypeResolver; /** * If a resolve function is not given, then a default resolve behavior is used * which takes the property of the source object of the same name as the field * and returns it as the result, or if it's a function, returns the result * of calling that function while passing along args and context value. */ export declare const defaultFieldResolver: GraphQLFieldResolver< unknown, unknown >; /** * This method looks up the field on the given type definition. * It has special casing for the three introspection fields, * __schema, __type and __typename. __typename is special because * it can always be queried as a field, even in situations where no * other fields are allowed, like on a Union. __schema and __type * could get automatically added to the query type, but that would * require mutating type definitions, which would cause issues. * * @internal */ export declare function getFieldDef( schema: GraphQLSchema, parentType: GraphQLObjectType, fieldNode: FieldNode, ): Maybe>;