import type { Has } from '@principia/base/Has' import type * as I from '@principia/base/IO' import type { Stream } from '@principia/base/Stream' import type * as U from '@principia/base/util/types' import type * as Q from '@principia/query/Query' import type { GraphQLResolveInfo } from 'graphql' import type { ConnectionContext } from 'subscriptions-transport-ws' export interface ResolverParameters { readonly args: Args readonly ctx: Ctx readonly root: Root readonly info: GraphQLResolveInfo } export interface SubscriptionResolverParameters { readonly ctx: Ctx readonly result: Root } export type Effect = (_: ResolverParameters) => I.IO, E, A> export type Query = (_: ResolverParameters) => Q.Query, E, A> export interface Subscription { readonly subscribe: (_: ResolverParameters) => Stream readonly resolve: (_: SubscriptionResolverParameters) => I.IO } export type Resolver = Effect | Query export type AnyResolver = Effect | Query export type TypeResolver = (_: { obj: A, ctx: Ctx, info: GraphQLResolveInfo }) => string | null export type FieldResolvers = Record< string, Resolver | Subscription > export type SchemaResolvers = Record> export type SchemaResolversEnv = Res extends SchemaResolvers ? FieldResolversEnv, Ctx> : never export type FieldResolversEnv = Res extends FieldResolvers ? U.UnionToIntersection< { [k in keyof Res]: Res[k] extends Resolver ? unknown extends R ? never : R : Res[k] extends Subscription ? unknown extends RS ? unknown extends RR ? never : RR : unknown extends RR ? RS : RS & RR : never }[keyof Res] > : never export type TypeOf = Res extends Resolver ? A : never export type ErrorOf = Res extends Resolver ? E : never export type EnvOf = Res extends Resolver ? R : never