/**
 * Copyright (c) Meta Platforms, Inc. and affiliates.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 */

/**
 * Represents any resource that must be explicitly disposed of. The most common
 * use-case is as a return value for subscriptions, where calling `dispose()`
 * would cancel the subscription.
 */
export interface Disposable {
    dispose: DisposeFn;
}

export type DataID = string;

export interface Variables {
    [name: string]: any;
}

export interface OperationType {
    readonly variables: Variables;
    readonly response: unknown;
    readonly rawResponse?: unknown | undefined;
}

export type VariablesOf<TQuery extends OperationType> = TQuery['variables'];

export type DisposeFn = () => void;

/**
 * Settings for how a query response may be cached.
 *
 * - `force`: causes a query to be issued unconditionally, irrespective of the
 *   state of any configured response cache.
 * - `poll`: causes a query to live update by polling at the specified interval
 *   in milliseconds. (This value will be passed to setTimeout.)
 * - `liveConfigId`: causes a query to live update by calling GraphQLLiveQuery,
 *   it represents a configuration of gateway when doing live query
 * - `metadata`: user-supplied metadata.
 * - `transactionId`: a user-supplied value, intended for use as a unique id for
 *   a given instance of executing an operation.
 */
export interface CacheConfig {
    force?: boolean | null | undefined;
    poll?: number | null | undefined;
    liveConfigId?: string | null | undefined;
    metadata?: { [key: string]: unknown } | undefined;
    transactionId?: string | null | undefined;
}

/**
 * Experimental
 */
export type FetchQueryFetchPolicy = 'store-or-network' | 'network-only';
export type FetchPolicy = FetchQueryFetchPolicy | 'store-and-network' | 'store-only';
export type RenderPolicy = 'full' | 'partial';
