import { GraphQLSchema, GraphQLNamedType, GraphQLDirective, SchemaDefinitionNode, GraphQLResolveInfo, GraphQLType, } from 'graphql'; import { ObjectTypeComposer, ObjectTypeComposeDefinition, ArgsMap } from './ObjectTypeComposer'; import { InputTypeComposer, InputTypeComposeDefinition } from './InputTypeComposer'; import { ScalarTypeComposer, ScalarTypeComposeDefinition } from './ScalarTypeComposer'; import { EnumTypeComposer, EnumTypeComposeDefinition } from './EnumTypeComposer'; import { InterfaceTypeComposer, InterfaceTypeComposeDefinition } from './InterfaceTypeComposer'; import { UnionTypeComposer, UnionTypeComposeDefinition } from './UnionTypeComposer'; import { TypeStorage } from './TypeStorage'; import { TypeMapper } from './TypeMapper'; import { Resolver, ResolverOpts } from './Resolver'; type ExtraSchemaConfig = { types?: GraphQLNamedType[] | null; directives?: GraphQLDirective[] | null; astNode?: SchemaDefinitionNode | null; }; type AnyComposeType = | ObjectTypeComposer | InputTypeComposer | EnumTypeComposer | InterfaceTypeComposer | UnionTypeComposer | ScalarTypeComposer; type AnyType = | ObjectTypeComposer | InputTypeComposer | EnumTypeComposer | InterfaceTypeComposer | UnionTypeComposer | ScalarTypeComposer | GraphQLNamedType; type GraphQLToolsResolveMethods = { [typeName: string]: { [fieldName: string]: ( source: any, args: {}, context: TContext, info: GraphQLResolveInfo ) => any; }; }; /** * `SchemaComposer` is a class which helps to create `GraphQLSchema`. */ export class SchemaComposer extends TypeStorage { /** * Returns `ObjectTypeComposer` of `Query` root type. * * @example * import { schemaComposer } from 'graphql-compose'; * schemaComposer.Query.addFields({ field1: 'String' }); */ public readonly Query: ObjectTypeComposer; /** * Returns `ObjectTypeComposer` of `Mutation` root type. * * @example * import { schemaComposer } from 'graphql-compose'; * schemaComposer.Mutation.addFields({ field1: 'String' }); */ public readonly Mutation: ObjectTypeComposer; /** * Returns `ObjectTypeComposer` of `Subscription` root type. * * @example * import { schemaComposer } from 'graphql-compose'; * schemaComposer.Subscription.addFields({ field1: 'String' }); */ public readonly Subscription: ObjectTypeComposer; public typeMapper: TypeMapper; protected _schemaMustHaveTypes: Array>; protected _directives: GraphQLDirective[]; public constructor(schema?: GraphQLSchema); /** * Create `GraphQLSchema` instance from defined types. * This instance can be provided to `express-graphql`, `apollo-server`, `graphql-yoga` etc. */ public buildSchema(extraConfig?: ExtraSchemaConfig): GraphQLSchema; /** * When using Interfaces you may have such Types which are hidden under Interface.resolveType method. In such cases you should add these types explicitly. Cause `buildSchema()` will take only real used types and types which added via `addSchemaMustHaveType()` method. */ public addSchemaMustHaveType(type: AnyType): this; /** * Deeply traverse fields in Query, Mutation, Subscription & sub-objects * where will be removed all fields with empty object types (without sub-fields). */ public removeEmptyTypes(tc: ObjectTypeComposer, passedTypes: Set): void; /** * Load all types from GraphQLSchema and merge with current SchemaComposer's types. * * @example * import { schemaComposer } from 'graphql-compose'; * schemaComposer.merge(someSchema1); * schemaComposer.merge(someSchema2); * schemaComposer.merge(someSchema3); * const schemaComposer.getOTC('User').removeField('password'); * const newSchema = schemaComposer.buildSchema(); */ public merge(schema: GraphQLSchema | SchemaComposer): this; /** * ----------------------------------------------- * Like graphql-tools methods * ----------------------------------------------- */ /** * Add types to Schema via SDL string. Returns a Map of parsed types. * * @example * const schemaComposer = new SchemaComposer(); * schemaComposer.addTypeDefs(` * type Post { * id: Int! * title: String * votes: Int * } * enum Sort { * ASC * DESC * } * `); * * @description * After that your added types will be avaliable for referencing via string, eg. * * @example * ObjectTypeComposer.create({ * name: 'Author', * fields: { * posts: { * type: '[Post!]', * args: { * sort: 'Sort', * }, * resolve: () => {}, * } * } * }); */ public addTypeDefs(typeDefs: string): TypeStorage; /** * Define `resolve` methods for Types in `graphql-tools` manner. * * @example * declare function addResolveMethods(typesFieldsResolve: { * [typeName: string]: { * [fieldName: string]: ( * source: any, * args: Object, * context: TContext, * info: GraphQLResolveInfo * ) => any, * }, * }): void * * @description * More details can be found in [issue #142](https://github.com/graphql-compose/graphql-compose/issues/142). */ public addResolveMethods(typesFieldsResolve: GraphQLToolsResolveMethods): void; /** * ----------------------------------------------- * Type methods * ----------------------------------------------- */ public createObjectTC( typeDef: ObjectTypeComposeDefinition ): ObjectTypeComposer; public createInputTC(typeDef: InputTypeComposeDefinition): InputTypeComposer; public createEnumTC(typeDef: EnumTypeComposeDefinition): EnumTypeComposer; public createInterfaceTC( typeDef: InterfaceTypeComposeDefinition ): InterfaceTypeComposer; public createUnionTC( typeDef: UnionTypeComposeDefinition ): UnionTypeComposer; public createScalarTC(typeDef: ScalarTypeComposeDefinition): ScalarTypeComposer; public createResolver( opts: ResolverOpts ): Resolver; /** * Creates or return existed TypeComposer from SDL or object. * If you call this method again with same params should be returned the same TypeComposer instance. */ public createTC( typeOrSDL: any ): | ObjectTypeComposer | InputTypeComposer | EnumTypeComposer | InterfaceTypeComposer | UnionTypeComposer | ScalarTypeComposer; /** * Creates TypeComposer from SDL or object without adding it to the type storage. */ public createTempTC( typeOrSDL: any ): | ObjectTypeComposer | InputTypeComposer | EnumTypeComposer | InterfaceTypeComposer | UnionTypeComposer | ScalarTypeComposer; public getOrCreateOTC( typeName: string, onCreate?: (tc: ObjectTypeComposer) => any ): ObjectTypeComposer; public getOrCreateITC( typeName: string, onCreate?: (itc: InputTypeComposer) => any ): InputTypeComposer; public getOrCreateETC( typeName: string, onCreate?: (etc: EnumTypeComposer) => any ): EnumTypeComposer; public getOrCreateIFTC( typeName: string, onCreate?: (iftc: InterfaceTypeComposer) => any ): InterfaceTypeComposer; public getOrCreateUTC( typeName: string, onCreate?: (utc: UnionTypeComposer) => any ): UnionTypeComposer; public getOrCreateSTC( typeName: string, onCreate?: (stc: ScalarTypeComposer) => any ): ScalarTypeComposer; public getOTC(typeName: any): ObjectTypeComposer; public getITC(typeName: any): InputTypeComposer; public getETC(typeName: any): EnumTypeComposer; public getIFTC(typeName: any): InterfaceTypeComposer; public getUTC(typeName: any): UnionTypeComposer; public getSTC(typeName: any): ScalarTypeComposer; public getAnyTC( typeName: string | AnyType | GraphQLType ): | ObjectTypeComposer | InputTypeComposer | EnumTypeComposer | InterfaceTypeComposer | UnionTypeComposer | ScalarTypeComposer; public addAsComposer(typeOrSDL: any): string; /** * ----------------------------------------------- * Storage methods * ----------------------------------------------- */ public clear(): void; public delete(key: any): boolean; public entries(): Iterator<[any, AnyType]>; public forEach( callbackfn: (value: AnyType, index: any, map: Map>) => any, thisArg?: any ): void; public get(key: any): AnyType; public has(key: any): boolean; public keys(): Iterator; public set(key: any, value: AnyType): this; public values(): Iterator>; public add(typeOrSDL: any): string | null; public hasInstance(key: any, ClassObj: any): boolean; public getOrSet( key: any, typeOrThunk: AnyType | (() => AnyType) ): AnyType; /** * ----------------------------------------------- * Directive methods * ----------------------------------------------- */ public addDirective(directive: GraphQLDirective): this; public removeDirective(directive: GraphQLDirective): this; public getDirectives(): GraphQLDirective[]; public getDirective(name: string): GraphQLDirective; public hasDirective(directive: string | GraphQLDirective): boolean; /** * ----------------------------------------------- * Misc methods * ----------------------------------------------- */ public toString(): string; public toJSON(): string; public inspect(): string; }