import type { Adapter, EmptyTypes, QueryParamsType } from "@hyper-fetch/core"; import type { DocumentNode } from "graphql/language/ast"; export enum GraphqlMethod { POST = "POST", GET = "GET", } export type GraphQlExtraType = { headers: HeadersInit; extensions: Record }; export type GraphQlEndpointType = string | DocumentNode; export type FetchGraphqlAdapterOptionsType = Omit & { timeout?: number; }; export type GraphqlAdapterType = Adapter< FetchGraphqlAdapterOptionsType, GraphqlMethod, number, GraphQlExtraType, QueryParamsType | string, undefined, GraphQlEndpointType, (endpoint: GraphQlEndpointType) => string >; // Extract type GqlParamType = boolean | string | number | Record | EmptyTypes; export type ExtractGqlRouteParams = string extends T ? EmptyTypes : T extends `${string}query ${infer Parameters} {${infer QueryRest}` ? Parameters extends `${string}$${infer Param},${infer Rest}` ? GqlParameter & // eslint-disable-next-line @typescript-eslint/ban-types (ExtractGqlRouteParams extends EmptyTypes ? {} : ExtractGqlRouteParams) : Parameters extends `${string}$${infer Param})${infer Rest}` ? GqlParameter & // eslint-disable-next-line @typescript-eslint/ban-types (ExtractGqlRouteParams extends EmptyTypes ? {} : ExtractGqlRouteParams) : EmptyTypes : T extends `${string}$${infer Parameters},${infer Rest}` ? GqlParameter : T extends `${string}$${infer Parameters})${infer Rest}` ? GqlParameter : EmptyTypes; export type GqlParameter = T extends `${infer Param}:${string}!` ? { [k in Param]: GqlParamType } & (ExtractGqlRouteParams extends EmptyTypes ? // eslint-disable-next-line @typescript-eslint/ban-types {} : ExtractGqlRouteParams) : T extends `${infer Param}:${string}` ? { [k in Param]?: GqlParamType } & (ExtractGqlRouteParams extends EmptyTypes ? // eslint-disable-next-line @typescript-eslint/ban-types {} : ExtractGqlRouteParams) : EmptyTypes;