UNPKG

@backland/schema

Version:

TypeScript schema declaration and validation library with static type inference

73 lines (72 loc) 4 kB
import { Compute, IsKnown, MaybePromise } from '@backland/utils'; import { GraphQLField, GraphQLFieldConfig, GraphQLResolveInfo } from 'graphql'; import { Infer } from './Infer'; import { FieldInput, InferField, ObjectDefinitionInput, ObjectFieldInput } from './fields/_parseFields'; export type ResolverContextBase = { [K: string]: unknown; }; export type InferResolverArgs<ArgsDef> = [ ArgsDef ] extends [never] ? Record<string, unknown> : [ArgsDef] extends [undefined] ? Record<string, unknown> : [ArgsDef] extends [{ [K: string]: unknown; }] ? InferField<{ object: ArgsDef; }> : Record<string, unknown>; export type ResolverKind = 'query' | 'mutation' | 'subscription'; export type Resolver<Context, Root, Type, Args> = Compute<OptionalResolverConfig<Root, Context, Args> & { __graphTypeId: string; __isRelation: boolean; __isResolver: true; __relatedToGraphTypeId: string; args: any; argsDef: any; argsType: any; asObjectField(name?: string): GraphQLField<any, any>; kind: ResolverKind; name: string; payloadType: any; type: any; typeDef: any; resolve: <Root>(root: Root, args: Args, context: Context, info: GraphQLResolveInfo) => MaybePromise<Type>; }, 1>; export type AnyResolver = Resolver<any, any, any, any>; export type ResolverResolve<Context, Source, TypeDef, ArgsDef> = ((((x: InferResolverArgs<ArgsDef>) => any) extends (x: infer R) => any ? { [K in keyof R]: R[K]; } : never) extends infer Args ? ((x: Infer<TypeDef>) => any) extends (x: infer R) => any ? (parent: Compute<Source>, args: Compute<Args>, context: Context, info: GraphQLResolveInfo) => IsKnown<R> extends 1 ? Compute<Promise<R> | R> : any : (parent: Source, args: Record<string, unknown>, context: Context, info: GraphQLResolveInfo) => Promise<any> | any : never) extends infer R ? R : never; export declare function isPossibleArgsDef(args: any): args is Readonly<ObjectDefinitionInput>; export declare function getResolver(name: string): AnyResolver; export type OptionalResolverConfig<Source = any, Context = any, Args = any> = Omit<GraphQLFieldConfig<Source, Context, Args>, 'resolve' | 'args' | 'type'>; export interface CreateResolver<Context> { <ResultType extends ObjectFieldInput, ArgsType extends ObjectDefinitionInput>(config: { name: string; type: ResultType | Readonly<ResultType>; kind?: ResolverKind; args?: ArgsType | Readonly<ArgsType>; resolve?: never; } & OptionalResolverConfig): { resolver<Returns, Root = unknown>(handler: (root: Root, args: _ResolverArgs<ArgsType>, context: Context, info: GraphQLResolveInfo) => MaybePromise<Returns>): Resolver<Context, Root, Returns, _ResolverArgs<ArgsType>>; }; <ResultType extends FieldInput, Returns = unknown>(config: { name: string; type: ResultType | Readonly<ResultType>; kind?: ResolverKind; args?: undefined; resolve: <Root>(root: Root, args: {}, context: Context, info: GraphQLResolveInfo) => MaybePromise<Returns>; } & OptionalResolverConfig): Resolver<Context, any, Returns, {}> & { resolver?: never; }; <ResultType extends FieldInput, ArgsType extends ObjectDefinitionInput, Returns = unknown>(config: { name: string; type: ResultType | Readonly<ResultType>; kind?: ResolverKind; args: ArgsType | Readonly<ArgsType>; resolve: <Root>(root: Root, args: _ResolverArgs<ArgsType>, context: Context, info: GraphQLResolveInfo) => MaybePromise<Returns>; } & OptionalResolverConfig): Resolver<Context, any, Returns, _ResolverArgs<ArgsType>> & { resolver?: never; }; } export declare function createResolverFactory<Context extends ResolverContextBase>(): CreateResolver<Context>; export type _ResolverArgs<ArgsType> = Exclude<ArgsType, undefined> extends infer R ? IsKnown<R> extends 1 ? Infer<{ object: R; }> : {} : {}; export declare const createResolver: CreateResolver<ResolverContextBase>;