// @flow import type { DocumentNode } from 'graphql'; // 1 = loading // 2 = setVariables // 3 = fetchMore // 4 = refetch // 6 = poll // 7 = ready // 8 = error export type NetworkStatus = 1 | 2 | 3 | 4 | 6 | 7 | 8; export type FetchPolicy = | 'cache-first' | 'cache-and-network' | 'network-only' | 'cache-only' | 'standby'; // this is query result from client.query() or client.watchQuery().subscribe({ next }); export type QueryResult = { data: T, loading: boolean, networkStatus: NetworkStatus, stale: boolean, }; // TODO determine data field by loading property, so // if loading is false and error is null, then data should be defined as user expects them // if loading is true then data could be nullable // if loading is false and error is Error, then data could be nullable (user can use partial render fir example) // this is current query result (state) of subscription export type CurrentQueryResult = { data: T, error: ?Error, loading: boolean, networkStatus: NetworkStatus, partial: ?boolean, }; export type Observer = { complete?: () => void, error?: (e: ApolloError) => void, next?: (result: QueryResult) => void, }; export type Subscription = { unsubscribe(): void, }; export type UpdateQueryOptions = { variables: ?Object, }; export type ModifiableWatchQueryOptions = { fetchPolicy?: FetchPolicy, notifyOnNetworkStatusChange?: boolean, pollInterval?: number, reducer?: OperationResultReducer, variables?: { [key: string]: any }, }; export type FetchMoreOptions = { query?: DocumentNode, updateQuery: ( previousQueryResult: T, options: { fetchMoreResult: T, queryVariables: Object, }, ) => Object, variables: any, }; export type SubscribeToMoreOptions = { document: DocumentNode, variables?: { [key: string]: any }, updateQuery?: ( previousQueryResult: Object, options: { subscriptionData: { data: any }, variables: { [key: string]: any }, }, ) => Object, onError?: (error: Error) => void, }; export type ObservableQuery = { currentResult(): CurrentQueryResult, fetchMore(options: FetchMoreOptions): Promise>, getLastResult(): QueryResult, subscribe(subscriber: Observer): Subscription, refetch(variables?: { [key: string]: any }): Promise>, result(): Promise>, setOptions(options: ModifiableWatchQueryOptions): Promise>, setVariables(variables: any, tryFetch?: boolean): Promise>, subscribeToMore(options: SubscribeToMoreOptions): () => void, // returns ubsubscribe function startPolling(pollInterval: number): void, stopPolling(): void, updateQuery(mapFn: (previousQueryResult: T, options: UpdateQueryOptions) => any): void, variables: { [key: string]: any }, }; export type PureQueryOptions = { query: DocumentNode, variables?: { [key: string]: any }, }; export type MutationQueryReducer = ( previousResult: Object, options: { mutationResult: Object, queryName: Object, queryVariables: Object, }, ) => Object; export type MutationQueryReducersMap = { [queryName: string]: MutationQueryReducer, }; export type OperationResultReducer = ( previousResult: Object, action: Object, variables: Object, ) => Object; export type OperationResultReducerMap = { [queryId: string]: OperationResultReducer, }; export type DataProxyReadQueryOptions = { query: DocumentNode, variables?: { [key: string]: any }, }; export type DataProxyReadFragmentOptions = { id: string, fragment: DocumentNode, fragmentName?: string, variables?: { [key: string]: any }, }; export type DataProxyWriteQueryOptions = { data: any, query: DocumentNode, variables?: { [key: string]: any }, }; export type DataProxyWriteFragmentOptions = { data: any, id: string, fragment: DocumentNode, fragmentName?: string, variables?: Object, }; export type DataProxy = { readQuery(options: DataProxyReadQueryOptions): QueryType, readFragment(options: DataProxyReadFragmentOptions): ?FragmentType, writeQuery(options: DataProxyWriteQueryOptions): void, writeFragment(options: DataProxyWriteFragmentOptions): void, }; export type MutationUpdaterFn = (proxy: DataProxy, mutationResult: Object) => void; export class ApolloError extends Error { graphQLErrors: ?Array; networkError: ?Error; } export type ApolloClient = { mutate(options: { mutation: DocumentNode, optimisticResponse?: Object, refetchQueries?: Array, update?: MutationUpdaterFn, updateQueries?: MutationQueryReducersMap, variables?: { [key: string]: any }, }): Promise>, watchQuery( options: ModifiableWatchQueryOptions & { metadata?: any, query: DocumentNode, }, ): ObservableQuery<*>, };