type BooleanWhere = { $and?: WhereParams[]; $or?: WhereParams[]; $not?: WhereParams; }; type WhereParams = { [K in keyof T]?: T[K]; } & BooleanWhere; type Sortables = { // check sortable [P in keyof T]: P; }[keyof T]; type Direction = 'asc' | 'ASC' | 'DESC' | 'desc'; interface FindParams { select?: (keyof T)[]; // TODO: add nested operators & relations where?: WhereParams; limit?: number; offset?: number; orderBy?: // TODO: add relations | Sortables | Sortables[] | { [K in Sortables]?: Direction } | { [K in Sortables]?: Direction }[]; // TODO: define nested obj populate?: (keyof T)[]; } interface CreateParams { select?: (keyof T)[]; populate?: (keyof T)[]; data: T[keyof T]; } interface CreateManyParams { select?: (keyof T)[]; populate?: (keyof T)[]; data: T[keyof T][]; } interface Pagination { page: number; pageSize: number; pageCount: number; total: number; } interface QueryFromContentType { findOne(params: FindParams): any; findMany(params: FindParams): any[]; findWithCount(params: FindParams): [any[], number]; findPage(params: FindParams): { results: any[]; pagination: Pagination }; create(params: CreateParams): any; createMany(params: CreateManyParams): { count: number }; update(params: any): any; updateMany(params: any): { count: number }; delete(params: any): any; deleteMany(params: any): { count: number }; count(params: any): number; attachRelations(id: ID, data: any): any; updateRelations(id: ID, data: any): any; deleteRelations(id: ID): any; } interface ModelConfig { tableName: string; [k: string]: any; } interface ConnectionConfig {} interface DatabaseConfig { connection: ConnectionConfig; models: ModelConfig[]; } interface DatabaseSchema { sync(): Promise; reset(): Promise; create(): Promise; drop(): Promise; } export interface Database { schema: DatabaseSchema; query(uid: T): QueryFromContentType; } export class Database implements Database { static transformContentTypes(contentTypes: any[]): ModelConfig[]; static init(config: DatabaseConfig): Promise; }