/*
A TS file to help with the construction of the official Relay (flow) types.
 */

import { FragmentType } from "relay-runtime";
import { EntryPoint } from "./EntryPointTypes";

export type KeyType<TData = unknown> = Readonly<{
    " $data"?: TData | undefined;
    " $fragmentSpreads": FragmentType;
}>;

export type KeyTypeData<TKey extends KeyType<TData>, TData = unknown> = Required<TKey>[" $data"];

export type ArrayKeyType<TData = unknown> = ReadonlyArray<KeyType<readonly TData[]> | null | undefined>;
export type ArrayKeyTypeData<TKey extends ArrayKeyType<TData>, TData = unknown> = KeyTypeData<
    NonNullable<TKey[number]>
>;

export type GetEntryPointParamsFromEntryPoint<TEntryPoint> = TEntryPoint extends EntryPoint<
    infer TEntryPointComponent,
    infer TEntryPointParams
> ? TEntryPointParams
    : never;

export type GetEntryPointComponentFromEntryPoint<TEntryPoint> = TEntryPoint extends EntryPoint<
    infer TEntryPointComponent,
    infer TEntryPointParams
> ? TEntryPointComponent
    : never;
