import { UntilHandlerDetails } from 'graphql-lookahead'; import { GenePluginSettings } from 'graphql-gene/plugin-settings'; import { GraphqlTypes } from './graphql'; import { NeverToUnknown, PossiblyUndefinedToPartial, ValueOf } from './typeUtils'; export type GraphqlReturnTypes = TModels | `${TModels}!` | `[${TModels}]` | `[${TModels}!]` | `[${TModels}]!` | `[${TModels}!]!`; export type TrimGqlType = T extends `${infer R}!` ? TrimGqlType : T extends `[${infer R}` ? TrimGqlType : T extends `${infer R}]` ? TrimGqlType : T; export type GqlTypeToTs = T extends `${infer R}!` ? GqlArrayTypeToTs : GqlArrayTypeToTs | undefined | null; type GqlArrayTypeToTs = T extends `${infer R}]` ? GqlArrayTypeToTs : T extends `[${infer R}` ? GqlArrayTypeToTs : A; export type PrototypeOrNot = T extends { prototype: any; } ? T['prototype'] : T; type IsUnionGeneType = 'geneConfig' extends keyof T ? 'varType' extends keyof T['geneConfig'] ? NonNullable extends 'union' ? true : false : false : false; export type GeneTypesToTypescript = { [k in keyof T]: HasPluginMatching extends true ? PrototypeOrNot : T[k] extends { prototype: any; } ? Omit, 'geneConfig'> : T[k] extends string[] | readonly string[] ? GraphqlEnumToTypescript : T[k] extends Record ? IsUnionGeneType extends true ? GraphqlUnionToTypescript> : GraphqlObjToTypescript> : never; }; export type GraphqlToTypescript = GraphqlToTypescriptMap>; type GraphqlToTypescriptMap = TrimmedGqlType extends 'ID' | 'String' ? GqlTypeToTs : TrimmedGqlType extends 'Int' | 'Float' ? GqlTypeToTs : TrimmedGqlType extends 'Boolean' ? GqlTypeToTs : TrimmedGqlType extends 'DateTime' | 'Date' ? GqlTypeToTs : TrimmedGqlType extends 'JSON' ? GqlTypeToTs : TrimmedGqlType extends keyof GraphqlTypes ? GqlTypeToTs : unknown; export type GraphqlObjToTypescript> = PossiblyUndefinedToPartial<{ [k in keyof T]: GraphqlToTypescript; }>; export type GraphqlEnumToTypescript = { readonly [k in keyof T]: T[k]; }[number]; export type GraphqlUnionToTypescript> = ValueOf<{ [k in keyof T]: k extends keyof GraphqlTypes ? GraphqlTypes[k] : unknown; }>; type InferFieldKeys = { [k in keyof GenePluginSettings]: GenePluginSettings[k]['isMatching'] extends true ? GenePluginSettings[k]['fieldName'] : never; }[keyof GenePluginSettings]; export type InferFields = HasPluginMatching extends true ? NeverToUnknown> : keyof M; type HasPluginMatchingOrNever = { [k in keyof GenePluginSettings]: GenePluginSettings[k]['isMatching'] extends true ? true : never; }[keyof GenePluginSettings]; export type HasPluginMatching = HasPluginMatchingOrNever extends never ? false : true; export type FindOptionsStateByModel = { [k in keyof GenePluginSettings]: GenePluginSettings[k]['isMatching'] extends true ? GenePluginSettings[k]['findOptionsState'] : TFallback; }[keyof GenePluginSettings]; export type FindOptionsHandler = (details: UntilHandlerDetails & { findOptions: UntilHandlerDetails['state']; }) => void; export type FindOptionsHandlerByType = TTypeName extends keyof GraphqlTypes ? FindOptionsHandler> : TFallback; export {};