UNPKG

overmind-graphql

Version:
80 lines (79 loc) 2.83 kB
import * as Dom from 'graphql-request/dist/types.dom'; import { Socket as PhoenixSocket } from 'phoenix'; import { GraphQLError } from 'graphql'; export interface Query<Result extends any, Payload extends any = void> { (payload: Payload): Result; } type Variable = string | number | boolean | null; interface NoPayloadSubscription<R> { (action: (result: R) => void): void; dispose(): void; disposeWhere(cb: (variables: { [variables: string]: Variable; }) => boolean): any; } interface PayloadSubscription<P, R> { (payload: P, action: (result: R) => void): void; dispose(): void; disposeWhere(cb: (variables: { [variables: string]: Variable; }) => boolean): any; } type Http = { endpoint: string; headers?: () => Dom.RequestInit['headers']; options?: Dom.RequestInit; }; type Ws = { endpoint: string; params?: () => { [key: string]: string | number | boolean; }; } | (() => PhoenixSocket | null); type Queries = { rawQueries?: { [key: string]: (payload: any) => any; }; queries?: { [key: string]: (payload: any) => any; }; rawMutations?: { [key: string]: (payload: any) => any; }; mutations?: { [key: string]: (payload: any) => any; }; subscriptions?: { [key: string]: (payload: any) => any; }; }; type RawResult<T extends any> = Promise<{ data?: T; extensions?: any; headers: Dom.Headers; status: number; errors?: GraphQLError[]; }>; export type Graphql<T extends Queries> = { initialize(http: Http, ws?: Ws): void; } & { rawQueries: { [N in keyof T['rawQueries']]: T['rawQueries'][N] extends (payload: infer P) => infer R ? P extends void ? () => RawResult<R> : (payload: P) => RawResult<R> : never; }; queries: { [N in keyof T['queries']]: T['queries'][N] extends (payload: infer P) => infer R ? P extends void ? () => Promise<R> : (payload: P) => Promise<R> : never; }; rawMutations: { [N in keyof T['rawMutations']]: T['rawMutations'][N] extends (payload: infer P) => infer R ? P extends void ? () => RawResult<R> : (payload: P) => RawResult<R> : never; }; mutations: { [N in keyof T['mutations']]: T['mutations'][N] extends (payload: infer P) => infer R ? P extends void ? () => Promise<R> : (payload: P) => Promise<R> : never; }; subscriptions: { [N in keyof T['subscriptions']]: T['subscriptions'][N] extends (payload: infer P) => infer R ? P extends void ? NoPayloadSubscription<R> : PayloadSubscription<P, R> : never; }; }; type Literals = string | ReadonlyArray<string>; export declare const gql: (literals: Literals, ...placeholders: any[]) => Query<any, any>; export declare const graphql: <T extends Queries>(queries: T) => Graphql<T>; export {};