import { Client as GraphQLWsClient } from 'graphql-ws'; import { SubscriptionClient } from 'subscriptions-transport-ws'; import type { TypedDocumentNode } from '@graphql-typed-document-node/core'; import GraphQLClient from '../GraphQLClient'; export interface GraphQLResponseErrorLocation { line: number; column: number; } export interface GraphQLResponseError { message: string; locations?: GraphQLResponseErrorLocation[]; path?: string[]; extensions?: Record; } export type FetchFunction = (input: RequestInfo, init?: RequestInit) => Promise; export type OnErrorFunction = ({ result, operation }: { operation: Operation; result: Result; }) => void; export type MiddlewareOptions = { client: GraphQLClient; operation: Operation; resolve: (result: Result) => void; addResponseHook: (hook: (result: Result) => void) => void; reject: (reason: Error | String) => void; }; export type MiddlewareFunction = (options: MiddlewareOptions, next: () => void) => any; export interface ClientOptions { url: string; cache?: Cache; headers?: Headers | { [key: string]: string; }; ssrMode?: boolean; useGETForQueries?: boolean; subscriptionClient?: SubscriptionClient | GraphQLWsClient | (() => SubscriptionClient | GraphQLWsClient); fetch?: FetchFunction; fetchOptions?: object; FormData?: any; logErrors?: boolean; fullWsTransport?: boolean; onError?: OnErrorFunction; middleware?: MiddlewareFunction[]; } export interface LocalClientOptions extends Omit { localQueries: LocalQueries; requestDelayMs?: number; url?: string; } export interface SubscriptionRequest { query: string; variables: object; } export type ResetFunction = (desiredState?: object) => void; export type Headers = { [k: string]: string; }; export type LocalQueries = { [q: string]: (variables: any, operationName?: string) => any; }; export interface Cache { get(keyObject: CacheKeyObject): object; set(keyObject: CacheKeyObject, data: object): void; delete(keyObject: CacheKeyObject): void; clear(): void; keys(): void; getInitialState(): object; } export interface Operation { query: string | null; variables?: TVariables; operationName?: string; hash?: unknown; extensions?: Record & VExtension; } export interface HttpError { status: number; statusText: string; body: string; } export interface APIError { fetchError?: Error; httpError?: HttpError; graphQLErrors?: TGraphQLError[]; } export interface Result { data?: ResponseData; error?: APIError; headers?: Response['headers']; } export interface RequestOptions { fetchOptionsOverrides?: object; hashOnly?: boolean; responseReducer?: (data: any, response: Response) => any; } export interface GenerateResultOptions { fetchError?: Error; httpError?: HttpError; graphQLErrors?: TGraphQLError[]; data?: ResponseData; headers?: Response['headers']; } export interface UseClientRequestOptions { useCache?: boolean; isMutation?: boolean; isManual?: boolean; skip?: boolean; variables?: Variables; operationName?: string; skipCache?: boolean; fetchOptionsOverrides?: object; updateData?(previousData: ResponseData, data: ResponseData): any; client?: GraphQLClient; responseReducer?(data: object, response: object): object; persisted?: boolean; onSuccess?(result: Result, variables: Variables): void; } export type RefetchAfterMutationItem = { mutation: string; refetchOnMutationError?: boolean; filter?: (variables: any) => boolean; }; export type RefetchAfterMutationsData = string | RefetchAfterMutationItem | TypedDocumentNode | (string | RefetchAfterMutationItem | TypedDocumentNode)[]; export interface UseQueryOptions extends UseClientRequestOptions { ssr?: boolean; refetchAfterMutations?: RefetchAfterMutationsData; [key: string]: any; } export interface UseClientRequestResult { loading: boolean; cacheHit: boolean; cacheKey?: CacheKeyObject; data?: ResponseData; error?: APIError; } export interface UseQueryResult extends UseClientRequestResult { refetch(options?: UseQueryOptions): Promise>; } export interface UseSubscriptionOperation extends Operation { variables?: Variables; client?: GraphQLClient; } export type FetchData = (options?: UseClientRequestOptions) => Promise>; export interface CacheKeyObject { operation: Operation; fetchOptions: object; }