naystack
Version:
A stack built with tight Next + Drizzle + GraphQL
35 lines (32 loc) • 1.99 kB
text/typescript
import { GraphQLScalarType } from 'graphql';
import { ClassType, Query, Arg } from 'type-graphql';
import { Context } from './types.mjs';
type ReturnOptions = Parameters<typeof Query>[1];
type ArgsOptions = Parameters<typeof Arg>[2];
type Values = object | string | number | boolean;
type DeepPartial<T> = {
[K in keyof T]?: T[K] extends object ? DeepPartial<T[K]> : T[K];
};
interface BaseDefinition<T extends Values, U extends Values> {
output: T extends object ? ClassType<DeepPartial<T>> | [ClassType<DeepPartial<T>>] : GraphQLScalarType<T, T> | NumberConstructor | StringConstructor | BooleanConstructor;
outputOptions?: ReturnOptions;
input?: U extends object ? ClassType<U> | [ClassType<U>] : GraphQLScalarType<U, U> | NumberConstructor | StringConstructor | BooleanConstructor;
inputOptions?: ArgsOptions;
authorized?: boolean;
}
interface QueryDefinition<T extends Values, U extends Values> extends BaseDefinition<T, U> {
fn: (ctx: Context, data: U) => Promise<T | T[]> | T | T[];
mutation?: boolean;
}
interface FieldResolverDefinition<T extends Values, U extends Values, Root> extends BaseDefinition<T, U> {
fn: (root: Root, ctx: Context, data: U) => Promise<T | T[]> | T | T[];
}
declare function query<T extends Values, U extends Values>(fn: QueryDefinition<T, U>["fn"], options: Omit<QueryDefinition<T, U>, "fn">): QueryDefinition<T, U>;
declare function field<T extends Values, U extends Values, Root>(fn: FieldResolverDefinition<T, U, Root>["fn"], options: Omit<FieldResolverDefinition<T, U, Root>, "fn">): FieldResolverDefinition<T, U, Root>;
declare function QueryLibrary<T extends Record<string, QueryDefinition<any, any>>>(queries: T): {
new (): {};
};
declare function FieldLibrary<X extends object, T extends Record<string, FieldResolverDefinition<any, any, X>> = Record<string, FieldResolverDefinition<any, any, X>>>(type: ClassType, queries: T): {
new (): {};
};
export { FieldLibrary, QueryLibrary, field, query };