overmind-graphql
Version:
Functional actions
80 lines (79 loc) • 2.83 kB
TypeScript
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 {};