import ApolloClient, { ApolloClientOptions } from 'apollo-client'; import { ApolloLink } from 'apollo-link'; import { ContextSetter } from 'apollo-link-context'; import { ErrorHandler } from 'apollo-link-error'; import { IncomingHttpHeaders, IncomingMessage, ServerResponse } from 'http'; import { ComponentType } from 'react'; declare global { namespace NodeJS { interface Process { browser?: boolean; } } } export interface InitApolloOptions { getInitialProps?: boolean; client: | ApolloClient | (( options: { headers?: IncomingHttpHeaders; link: ApolloLink } ) => ApolloClientOptions); link?: { setContext?: ContextSetter; onError?: ErrorHandler; ws?(options: { headers?: IncomingHttpHeaders }): ApolloLink; http(options: { headers?: IncomingHttpHeaders }): ApolloLink; }; } export interface WithApolloHOC { (Child: ComponentType): ComponentType>; getInitialProps: GetApolloProps; } export interface WithApolloProps { url: { asPath: string; pathname: string; query: NextContext['query']; }; apollo?: ApolloClient; apolloState?: TCache; } export interface NextContext { err: Error; req: IncomingMessage; res: ServerResponse; pathname: string; asPath: string; query: { [key: string]: boolean | boolean[] | number | number[] | string | string[]; }; } export type GetInitialProps = (context: NextContext) => Promise; export type GetApolloProps = ( Child: ComponentType>, apollo?: ApolloClient ) => ( context: NextContext, childProps: object ) => Promise<{ apolloState?: TCache }>;