ts-graphql-query-genrator
Version:
Use the power of typescript to create graphql query
40 lines (39 loc) • 2.25 kB
TypeScript
declare type Unpacked<T> = T extends (infer U)[] ? U : T extends (...args: any[]) => infer U ? U : T extends Promise<infer U> ? U : T;
declare type SpecialUnpack<T> = T extends (...args: any[]) => infer U ? U : T extends Promise<infer U> ? U : T;
declare type ToUnpackModel<T extends {}> = {
[K in keyof T]: SpecialUnpack<T[K]>;
};
declare type PropertyName<T, F> = {
[K in keyof T]: T[K] extends F ? K : never;
}[keyof T];
declare type NonNullPropertyNames<T extends {}> = {
[K in keyof T]: SpecialUnpack<T[K]> extends void | null | undefined ? never : K;
}[keyof T];
declare type PrimitiveTypes = string | number | boolean | string[] | number[] | boolean[];
declare type PrimitivePropertyNames<T> = PropertyName<T, PrimitiveTypes>;
declare type ObjectPropertyNames<T> = {
[K in keyof T]: T[K] extends Function ? never : Unpacked<T[K]> extends object ? K : never;
}[keyof T];
declare type FunctionPropertyNameOnReturnType<T, U> = {
[K in keyof T]: T[K] extends (...args: any[]) => any ? (ReturnType<T[K]> extends U ? K : never) : never;
}[keyof T];
declare type PrimitiveFunctionPropertyNames<T> = FunctionPropertyNameOnReturnType<T, PrimitiveTypes>;
declare type FunctionPropertyNames<T> = {
[K in keyof T]: T[K] extends (...args: any[]) => any ? (ReturnType<T[K]> extends object ? K : never) : never;
}[keyof T];
export declare class Query<TData extends {}> {
private Prefix;
private Indent;
private Fields;
private ObjectFields;
private SimpleFunctionFields;
private FunctionFields;
constructor(Prefix?: string, Indent?: number);
IncludeField(Key: PrimitivePropertyNames<TData>): this;
IncludeObject<TCol extends ObjectPropertyNames<TData>, TIncl extends Unpacked<TData[TCol]>>(Key: TCol, Include: (q: Query<TIncl>) => any): this;
IncludeSimpleFunction<TCol extends PrimitiveFunctionPropertyNames<TData>>(Key: TCol, ...args: [string, any][]): this;
IncludeFunction<TCol extends FunctionPropertyNames<TData>>(Key: TCol, Include: (q: Query<Unpacked<TData[TCol]>>) => any, ...args: [string, any][]): this;
ToQuery(): string;
}
export declare type ToGraphQLModel<T> = ToUnpackModel<ToUnpackModel<Pick<T, NonNullPropertyNames<T>>>>;
export {};