| 
									
										
										
										
											2021-09-20 19:15:50 +02:00
										 |  |  | import { LifecycleProvider } from './lifecycles'; | 
					
						
							|  |  |  | import { MigrationProvider } from './migrations'; | 
					
						
							|  |  |  | import { SchemaProvideer } from './schema'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-07 16:07:39 +02:00
										 |  |  | type LogicalOperators<T> = { | 
					
						
							| 
									
										
										
										
											2021-06-17 16:17:15 +02:00
										 |  |  |   $and?: WhereParams<T>[]; | 
					
						
							|  |  |  |   $or?: WhereParams<T>[]; | 
					
						
							|  |  |  |   $not?: WhereParams<T>; | 
					
						
							| 
									
										
										
										
											2022-06-07 16:07:39 +02:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2022-05-11 12:12:30 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | type AttributeOperators<T, K extends keyof T> = { | 
					
						
							| 
									
										
										
										
											2022-06-07 16:07:39 +02:00
										 |  |  |   $eq?: T[K] | Array<T[K]>; | 
					
						
							|  |  |  |   $ne?: T[K] | Array<T[K]>; | 
					
						
							| 
									
										
										
										
											2022-05-11 12:12:30 -06:00
										 |  |  |   $in?: T[K][]; | 
					
						
							|  |  |  |   $notIn?: T[K][]; | 
					
						
							|  |  |  |   $lt?: T[K]; | 
					
						
							|  |  |  |   $lte?: T[K]; | 
					
						
							|  |  |  |   $gt?: T[K]; | 
					
						
							|  |  |  |   $gte?: T[K]; | 
					
						
							|  |  |  |   $between?: [T[K], T[K]]; | 
					
						
							|  |  |  |   $contains?: T[K]; | 
					
						
							|  |  |  |   $notContains?: T[K]; | 
					
						
							|  |  |  |   $containsi?: T[K]; | 
					
						
							|  |  |  |   $notContainsi?: T[K]; | 
					
						
							|  |  |  |   $startsWith?: T[K]; | 
					
						
							|  |  |  |   $endsWith?: T[K]; | 
					
						
							|  |  |  |   $null?: boolean; | 
					
						
							|  |  |  |   $notNull?: boolean; | 
					
						
							|  |  |  |   $not?: WhereParams<T> | AttributeOperators<T, K>; | 
					
						
							| 
									
										
										
										
											2022-06-07 16:07:39 +02:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2021-06-17 16:17:15 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-11 12:12:30 -06:00
										 |  |  | export type WhereParams<T> = { | 
					
						
							|  |  |  |   [K in keyof T]?: T[K] | T[K][] | AttributeOperators<T, K>; | 
					
						
							| 
									
										
										
										
											2021-06-17 16:17:15 +02:00
										 |  |  | } & | 
					
						
							| 
									
										
										
										
											2022-06-07 16:07:39 +02:00
										 |  |  |   LogicalOperators<T>; | 
					
						
							| 
									
										
										
										
											2021-06-17 16:17:15 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | type Sortables<T> = { | 
					
						
							|  |  |  |   // check sortable
 | 
					
						
							|  |  |  |   [P in keyof T]: P; | 
					
						
							|  |  |  | }[keyof T]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type Direction = 'asc' | 'ASC' | 'DESC' | 'desc'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-30 20:00:03 +02:00
										 |  |  | interface FindParams<T> { | 
					
						
							| 
									
										
										
										
											2021-06-17 16:17:15 +02:00
										 |  |  |   select?: (keyof T)[]; | 
					
						
							|  |  |  |   // TODO: add nested operators & relations
 | 
					
						
							|  |  |  |   where?: WhereParams<T>; | 
					
						
							|  |  |  |   limit?: number; | 
					
						
							|  |  |  |   offset?: number; | 
					
						
							|  |  |  |   orderBy?: // TODO: add relations
 | 
					
						
							|  |  |  |   | Sortables<T> | 
					
						
							|  |  |  |     | Sortables<T>[] | 
					
						
							|  |  |  |     | { [K in Sortables<T>]?: Direction } | 
					
						
							|  |  |  |     | { [K in Sortables<T>]?: Direction }[]; | 
					
						
							| 
									
										
										
										
											2021-06-30 20:00:03 +02:00
										 |  |  |   // TODO: define nested obj
 | 
					
						
							|  |  |  |   populate?: (keyof T)[]; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | interface CreateParams<T> { | 
					
						
							|  |  |  |   select?: (keyof T)[]; | 
					
						
							|  |  |  |   populate?: (keyof T)[]; | 
					
						
							|  |  |  |   data: T[keyof T]; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | interface CreateManyParams<T> { | 
					
						
							|  |  |  |   select?: (keyof T)[]; | 
					
						
							|  |  |  |   populate?: (keyof T)[]; | 
					
						
							|  |  |  |   data: T[keyof T][]; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2021-06-17 16:17:15 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-07-06 14:18:03 +02:00
										 |  |  | interface Pagination { | 
					
						
							|  |  |  |   page: number; | 
					
						
							|  |  |  |   pageSize: number; | 
					
						
							|  |  |  |   pageCount: number; | 
					
						
							|  |  |  |   total: number; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-20 19:15:50 +02:00
										 |  |  | interface PopulateParams {} | 
					
						
							|  |  |  | interface EntityManager { | 
					
						
							|  |  |  |   findOne<K extends keyof AllTypes>(uid: K, params: FindParams<AllTypes[K]>): Promise<any>; | 
					
						
							|  |  |  |   findMany<K extends keyof AllTypes>(uid: K, params: FindParams<AllTypes[K]>): Promise<any[]>; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   create<K extends keyof AllTypes>(uid: K, params: CreateParams<AllTypes[K]>): Promise<any>; | 
					
						
							|  |  |  |   createMany<K extends keyof AllTypes>( | 
					
						
							|  |  |  |     uid: K, | 
					
						
							|  |  |  |     params: CreateManyParams<AllTypes[K]> | 
					
						
							|  |  |  |   ): Promise<{ count: number }>; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   update<K extends keyof AllTypes>(uid: K, params: any): Promise<any>; | 
					
						
							|  |  |  |   updateMany<K extends keyof AllTypes>(uid: K, params: any): Promise<{ count: number }>; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   delete<K extends keyof AllTypes>(uid: K, params: any): Promise<any>; | 
					
						
							|  |  |  |   deleteMany<K extends keyof AllTypes>(uid: K, params: any): Promise<{ count: number }>; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   count<K extends keyof AllTypes>(uid: K, params: any): Promise<number>; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   attachRelations<K extends keyof AllTypes>(uid: K, id: ID, data: any): Promise<any>; | 
					
						
							|  |  |  |   updateRelations<K extends keyof AllTypes>(uid: K, id: ID, data: any): Promise<any>; | 
					
						
							|  |  |  |   deleteRelations<K extends keyof AllTypes>(uid: K, id: ID): Promise<any>; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   populate<K extends keyof AllTypes, T extends AllTypes[K]>( | 
					
						
							|  |  |  |     uid: K, | 
					
						
							|  |  |  |     entity: T, | 
					
						
							|  |  |  |     populate: PopulateParams | 
					
						
							|  |  |  |   ): Promise<T>; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   load<K extends keyof AllTypes, T extends AllTypes[K], SK extends keyof T>( | 
					
						
							|  |  |  |     uid: K, | 
					
						
							|  |  |  |     entity: T, | 
					
						
							|  |  |  |     field: SK, | 
					
						
							|  |  |  |     populate: PopulateParams | 
					
						
							|  |  |  |   ): Promise<T[SK]>; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-17 16:17:15 +02:00
										 |  |  | interface QueryFromContentType<T extends keyof AllTypes> { | 
					
						
							| 
									
										
										
										
											2021-08-27 08:55:18 +02:00
										 |  |  |   findOne(params: FindParams<AllTypes[T]>): Promise<any>; | 
					
						
							|  |  |  |   findMany(params: FindParams<AllTypes[T]>): Promise<any[]>; | 
					
						
							|  |  |  |   findWithCount(params: FindParams<AllTypes[T]>): Promise<[any[], number]>; | 
					
						
							|  |  |  |   findPage(params: FindParams<AllTypes[T]>): Promise<{ results: any[]; pagination: Pagination }>; | 
					
						
							| 
									
										
										
										
											2021-07-06 14:18:03 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-27 08:55:18 +02:00
										 |  |  |   create(params: CreateParams<AllTypes[T]>): Promise<any>; | 
					
						
							|  |  |  |   createMany(params: CreateManyParams<AllTypes[T]>): Promise<{ count: number }>; | 
					
						
							| 
									
										
										
										
											2021-07-06 14:18:03 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-27 08:55:18 +02:00
										 |  |  |   update(params: any): Promise<any>; | 
					
						
							|  |  |  |   updateMany(params: any): Promise<{ count: number }>; | 
					
						
							| 
									
										
										
										
											2021-07-06 14:18:03 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-27 08:55:18 +02:00
										 |  |  |   delete(params: any): Promise<any>; | 
					
						
							|  |  |  |   deleteMany(params: any): Promise<{ count: number }>; | 
					
						
							| 
									
										
										
										
											2021-07-06 14:18:03 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-27 08:55:18 +02:00
										 |  |  |   count(params: any): Promise<number>; | 
					
						
							| 
									
										
										
										
											2021-07-06 14:18:03 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-27 08:55:18 +02:00
										 |  |  |   attachRelations(id: ID, data: any): Promise<any>; | 
					
						
							|  |  |  |   updateRelations(id: ID, data: any): Promise<any>; | 
					
						
							|  |  |  |   deleteRelations(id: ID): Promise<any>; | 
					
						
							| 
									
										
										
										
											2021-09-20 19:15:50 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |   populate<S extends AllTypes[T]>(entity: S, populate: PopulateParams): Promise<S>; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   load<S extends AllTypes[T], K extends keyof S>( | 
					
						
							|  |  |  |     entity: S, | 
					
						
							|  |  |  |     field: K, | 
					
						
							|  |  |  |     populate: PopulateParams | 
					
						
							|  |  |  |   ): Promise<S[K]>; | 
					
						
							| 
									
										
										
										
											2021-06-17 16:17:15 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | interface ModelConfig { | 
					
						
							|  |  |  |   tableName: string; | 
					
						
							|  |  |  |   [k: string]: any; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-28 12:34:29 +02:00
										 |  |  | interface ConnectionConfig {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | interface DatabaseConfig { | 
					
						
							|  |  |  |   connection: ConnectionConfig; | 
					
						
							|  |  |  |   models: ModelConfig[]; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2021-06-30 20:00:03 +02:00
										 |  |  | export interface Database { | 
					
						
							| 
									
										
										
										
											2021-09-20 19:15:50 +02:00
										 |  |  |   schema: SchemaProvideer; | 
					
						
							|  |  |  |   lifecycles: LifecycleProvider; | 
					
						
							|  |  |  |   migrations: MigrationProvider; | 
					
						
							|  |  |  |   entityManager: EntityManager; | 
					
						
							| 
									
										
										
										
											2021-06-30 20:00:03 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-17 16:17:15 +02:00
										 |  |  |   query<T extends keyof AllTypes>(uid: T): QueryFromContentType<T>; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2021-06-30 20:00:03 +02:00
										 |  |  | export class Database implements Database { | 
					
						
							|  |  |  |   static transformContentTypes(contentTypes: any[]): ModelConfig[]; | 
					
						
							|  |  |  |   static init(config: DatabaseConfig): Promise<Database>; | 
					
						
							|  |  |  | } |