diff --git a/packages/core/src/create.ts b/packages/core/src/create.ts index d47665016..9c7e03f13 100644 --- a/packages/core/src/create.ts +++ b/packages/core/src/create.ts @@ -1,14 +1,15 @@ import { GetEnvelopedFn, ComposeContext, Plugin, ArbitraryObject } from '@envelop/types'; import { isPluginEnabled, PluginOrDisabledPlugin } from './enable-if.js'; -import { createEnvelopOrchestrator, EnvelopOrchestrator } from './orchestrator.js'; +import { createEnvelopOrchestrator, EnvelopOrchestrator, GraphQLEngine } from './orchestrator.js'; import { traceOrchestrator } from './traced-orchestrator.js'; export function envelop[]>(options: { plugins: Array; enableInternalTracing?: boolean; + engine?: typeof GraphQLEngine; }): GetEnvelopedFn> { const plugins = options.plugins.filter(isPluginEnabled); - let orchestrator = createEnvelopOrchestrator>(plugins); + let orchestrator = createEnvelopOrchestrator>(plugins, options.engine); if (options.enableInternalTracing) { orchestrator = traceOrchestrator(orchestrator); diff --git a/packages/core/src/orchestrator.ts b/packages/core/src/orchestrator.ts index 759e22d91..4b120ad2d 100644 --- a/packages/core/src/orchestrator.ts +++ b/packages/core/src/orchestrator.ts @@ -64,10 +64,31 @@ export type EnvelopOrchestrator< getCurrentSchema: () => Maybe; }; +export const GraphQLEngine = ({ + parseFn, + executeFn, + validateFn, + subscribeFn, +}: { + parseFn?: typeof parse; + executeFn?: typeof execute; + validateFn?: typeof validate; + subscribeFn?: typeof subscribe; +}) => { + return { + parse: parseFn ?? parse, + execute: executeFn ?? execute, + validate: validateFn ?? validate, + subscribe: subscribeFn ?? subscribe, + }; +}; + export function createEnvelopOrchestrator( - plugins: Plugin[] + plugins: Plugin[], + engine: typeof GraphQLEngine = GraphQLEngine ): EnvelopOrchestrator { let schema: GraphQLSchema | undefined | null = null; + const { parse, execute, validate, subscribe } = engine({}); let initDone = false; const onResolversHandlers: OnResolverCalledHook[] = []; for (const plugin of plugins) {