@backland/schema
Version:
TypeScript schema declaration and validation library with static type inference
73 lines (72 loc) • 4 kB
TypeScript
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>;