import { GraphQLFieldResolver, GraphQLSchema, GraphQLTypeResolver } from 'graphql'; import { GiraphQLEnumValueConfig, GiraphQLInterfaceTypeConfig, GiraphQLUnionTypeConfig, } from '../types'; import { BasePlugin } from './plugin'; import { BuildCache, GiraphQLInputFieldConfig, GiraphQLOutputFieldConfig, GiraphQLTypeConfig, SchemaTypes, } from '..'; export class MergedPlugins extends BasePlugin { plugins; constructor(buildCache: BuildCache, plugins: BasePlugin[]) { super(buildCache, 'GiraphQLMergedPlugin' as never); this.plugins = plugins; } override onTypeConfig(typeConfig: GiraphQLTypeConfig) { return this.plugins.reduceRight( (config, plugin) => (config === null ? config : plugin.onTypeConfig(config)), typeConfig, ); } override onInputFieldConfig(fieldConfig: GiraphQLInputFieldConfig) { return this.plugins.reduceRight | null>( (config, plugin) => (config === null ? config : plugin.onInputFieldConfig(config)), fieldConfig, ); } override onOutputFieldConfig(fieldConfig: GiraphQLOutputFieldConfig) { return this.plugins.reduceRight | null>( (config, plugin) => (config === null ? config : plugin.onOutputFieldConfig(config)), fieldConfig, ); } override onEnumValueConfig(valueConfig: GiraphQLEnumValueConfig) { return this.plugins.reduceRight | null>( (config, plugin) => (config === null ? config : plugin.onEnumValueConfig(config)), valueConfig, ); } override beforeBuild() { for (const plugin of this.plugins) { plugin.beforeBuild(); } } override afterBuild(schema: GraphQLSchema) { return this.plugins.reduceRight((nextSchema, plugin) => plugin.afterBuild(nextSchema), schema); } override wrapResolve( resolve: GraphQLFieldResolver, fieldConfig: GiraphQLOutputFieldConfig, ) { return this.plugins.reduceRight( (nextResolve, plugin) => plugin.wrapResolve(nextResolve, fieldConfig), resolve, ); } override wrapSubscribe( subscribe: GraphQLFieldResolver | undefined, fieldConfig: GiraphQLOutputFieldConfig, ) { return this.plugins.reduceRight( (nextSubscribe, plugin) => plugin.wrapSubscribe(nextSubscribe, fieldConfig), subscribe, ); } override wrapResolveType( resolveType: GraphQLTypeResolver, typeConfig: GiraphQLInterfaceTypeConfig | GiraphQLUnionTypeConfig, ) { return this.plugins.reduceRight( (nextResolveType, plugin) => plugin.wrapResolveType(nextResolveType, typeConfig), resolveType, ); } }