tspace-mysql
Version:
Tspace MySQL is a promise-based ORM for Node.js, designed with modern TypeScript and providing type safety for schema databases.
375 lines (374 loc) • 13.5 kB
TypeScript
import { Model } from "../core/Model";
import { TCache as Cache } from '../core/Cache';
import { CONSTANTS } from '../constants';
import { Join } from "../core/Join";
import { TRelationModel, TSchemaModel } from "../core";
export type TCache = Cache;
export type TConstant = typeof CONSTANTS;
export type TRelationOptions<K = any> = {
name: K extends void ? never : K;
model: new () => Model<any, any>;
as?: string;
localKey?: string;
foreignKey?: string;
freezeTable?: string;
pivot?: string;
query?: any;
queryPivot?: any;
relation?: Object;
exists?: boolean;
notExists?: boolean;
all?: boolean;
trashed?: boolean;
count?: boolean;
oldVersion?: boolean;
modelPivot?: new () => Model;
};
export type TRelationQueryOptions<K = any> = {
name?: K extends void ? never : K;
model: new () => Model<any, any>;
as?: string;
localKey?: string;
foreignKey?: string;
freezeTable?: string | undefined;
pivot?: string | undefined;
query?: any;
relation?: Object | undefined;
exists?: boolean;
all?: boolean;
trashed?: boolean;
count?: boolean;
oldVersion?: boolean;
modelPivot?: new () => Model;
};
export type TRelationShip = {
hasOne: string;
hasMany: string;
belongsTo: string;
belongsToMany: string;
};
export type TPagination<K = any> = {
meta: {
total: number;
limit: number;
total_page: number;
current_page: number;
last_page: number;
next_page: number;
prev_page: number;
totalPage: number;
currentPage: number;
lastPage: number;
nextPage: number;
prevPage: number;
};
data: K[];
};
export type TBackup = {
database: string;
to?: {
host: string;
port: number;
username: string;
password: string;
};
};
export type TBackupToFile = {
database?: string;
filePath: string;
table?: string;
connection?: {
host: string;
port: number;
database: string;
username: string;
password: string;
};
};
export type TBackupTableToFile = {
filePath: string;
table: string;
connection?: {
host: string;
port: number;
database: string;
username: string;
password: string;
};
};
export type TConnectionOptions = {
connectionLimit?: number;
dateStrings?: boolean;
waitForConnections?: boolean;
charset?: string;
host: string;
port: number;
database: string;
username: string;
password: string;
};
export type TPoolCallback = {
query: (sql: string, callback: (err: any, result: any) => void) => void;
release: () => void;
};
export type TConnectionTransaction = {
on: (event: TPoolEvent, data: any) => void;
query: (sql: string) => Promise<any[]>;
/**
* The 'startTransaction' method is used when need to started the transaction
* @returns {Promise<void>}
*/
startTransaction: () => Promise<void>;
/**
* The 'commit' method is used to when need to commit the transactions is successfully
* @returns {Promise<void>}
*/
commit: () => Promise<void>;
/**
* The 'rollback ' method is used to when the transaction is failed
* @returns {Promise<void>}
*/
rollback: () => Promise<void>;
/**
* The 'end ' method is used to end the transction
* @returns {Promise<void>}
*/
end: () => Promise<void>;
};
export type TConnection = {
on: (event: TPoolEvent, data: (r: any) => any) => void;
query: (sql: string) => Promise<any>;
connection: () => Promise<{
on: (event: TPoolEvent, data: any) => void;
query: (sql: string) => Promise<any[]>;
}>;
};
export type TNewConnection = {
on: (event: TPoolEvent, data: (r: any) => any) => void;
query: (sql: string) => Promise<any>;
connection: () => Promise<TConnectionTransaction>;
};
export type TOptions = {
[key: string]: any;
connectionLimit?: number;
dateStrings?: boolean;
waitForConnections?: boolean;
charset?: string;
host: string;
port: number;
database: string;
user: string;
password: string;
};
export type TExecute = {
sql: string;
type: string;
message?: string;
options?: {
[key: string]: any;
};
};
export type TPattern = 'snake_case' | 'camelCase';
export type TValidateSchema = null | Record<string, NumberConstructor | StringConstructor | DateConstructor | BooleanConstructor | {
type: NumberConstructor | StringConstructor | DateConstructor | BooleanConstructor;
require?: boolean;
match?: RegExp;
length?: number;
minLength?: number;
maxLength?: number;
min?: number;
max?: number;
enum?: string[] | number[] | boolean[];
unique?: boolean;
json?: boolean;
fn?: Function;
}>;
export type TValidateSchemaDecorator = NumberConstructor | StringConstructor | DateConstructor | BooleanConstructor | {
type: NumberConstructor | StringConstructor | DateConstructor | BooleanConstructor;
require?: boolean;
match?: RegExp;
length?: number;
minLength?: number;
maxLength?: number;
min?: number;
max?: number;
enum?: string[] | number[] | boolean[];
unique?: boolean;
json?: boolean;
fn?: Function;
};
export type TNonEmptyArray<T> = [T, ...T[]];
export type TGlobalSetting = {
softDelete?: boolean;
debug?: boolean;
uuid?: boolean;
timestamp?: boolean;
pattern?: boolean | ('s');
logger?: {
selected?: boolean;
inserted?: boolean;
updated?: boolean;
deleted?: boolean;
};
};
export type TOperator = {
'eq': string;
'notEq': string;
'more': string;
'less': string;
'moreOrEq': string;
'lessOrEq': string;
'like': string;
'notLike': string;
'in': string;
'notIn': string;
'isNull': string;
'isNotNull': string;
'query': string;
'|eq': string;
'|notEq': string;
'|more': string;
'|less': string;
'|moreOrEq': string;
'|lessOrEq': string;
'|like': string;
'|notLike': string;
'|in': string;
'|notIn': string;
'|isNull': string;
'|isNotNull': string;
'|query': string;
};
export type TPoolEvent = 'connected' | 'release' | 'query' | 'slowQuery' | 'select' | 'insert' | 'update' | 'delete';
export type TRawStringQuery = `$RAW:${string}`;
export type TFreezeStringQuery = `$Freeze:${string}`;
export type TRepositoryCreate<T extends Record<string, any> = any> = {
data: Partial<{
[K in keyof T]: T[K] | TRawStringQuery | TFreezeStringQuery;
}>;
debug?: boolean;
transaction?: TConnection | TConnectionTransaction;
};
export type TRepositoryCreateMultiple<T extends Record<string, any> = any> = {
data: Partial<{
[K in keyof T]: T[K] | TRawStringQuery | TFreezeStringQuery;
}>[];
debug?: boolean;
transaction?: TConnection | TConnectionTransaction;
};
export type TRepositoryCreateOrThings<T extends Record<string, any> = any> = {
data: Partial<{
[K in keyof T]: T[K] | TRawStringQuery | TFreezeStringQuery;
}>;
where: Partial<Record<keyof T | `${string}.${string}`, any>> extends infer K ? K : unknown;
debug?: boolean;
};
export type TRepositoryUpdate<T extends Record<string, any> = any> = {
data: Partial<{
[K in keyof T]: T[K] | TRawStringQuery | TFreezeStringQuery;
}>;
where: Partial<Record<keyof T | `${string}.${string}`, any>> extends infer K ? K : unknown;
debug?: boolean;
transaction?: TConnection | TConnectionTransaction;
};
export type TRepositoryUpdateMultiple<T extends Record<string, any> = any> = {
cases: {
when: Partial<{
[K in keyof T]: T[K] | TRawStringQuery | TFreezeStringQuery;
}>;
columns: Partial<{
[K in keyof T]: T[K] | TRawStringQuery | TFreezeStringQuery;
}>;
}[];
debug?: boolean;
transaction?: TConnection | TConnectionTransaction;
};
export type TRepositoryDelete<T extends Record<string, any> = any> = {
where: Partial<Record<keyof T | `${string}.${string}`, any>> extends infer K ? K : any;
debug?: boolean;
transaction?: TConnection | TConnectionTransaction;
};
export type TPickColumns<T, K extends keyof T> = {
[P in K]: T[P];
};
export type TPickRelations<T, K extends keyof T> = {
[P in K]: T[P];
};
export type TRegistry = {
'$save'?: Function;
'$attach'?: Function;
'$detach'?: Function;
};
export type TSchemaColumns<T> = TSchemaKeys<T> | `${string}.${string}` | TRawStringQuery | TFreezeStringQuery;
export type TSchemaKeys<T> = keyof {
[K in keyof T as string extends K ? never : K]: T[K];
} extends never ? string : keyof {
[K in keyof T as string extends K ? never : K]: T[K];
};
export type TRelationResults<T> = T extends Array<infer U> ? TRelationResults<U>[] : T extends object ? {
[K in keyof T as K extends `$${string}` ? never : K]: TRelationResults<T[K]>;
} : T;
export type TRelationKeys<T> = keyof {
[K in keyof T as K extends `$${string}` ? never : K]: T[K];
};
type TRepositoryWhere<T extends Record<string, any> = any, R = unknown> = Partial<{
[K in TSchemaKeys<T> | TRelationKeys<R> | `${string}.${string}` | TRawStringQuery]: K extends TRelationKeys<R> ? K extends `$${string & K}` ? R extends Record<string, any> ? R[K] : never : R extends Record<string, any> ? R[`$${string & K}`] extends (infer U)[] ? U extends Model ? TRepositoryWhere<TSchemaModel<U>, TRelationModel<U>> : never : R[`$${K & string}`] extends Model ? TRepositoryWhere<TSchemaModel<R[`$${K & string}`]>, TRelationModel<R[`$${K & string}`]>> : never : never : K extends keyof T ? T[K] : never;
}>;
type TRepositoryOrderBy<T extends Record<string, any> = any, R = unknown> = Partial<{
[K in TSchemaKeys<T> | TRelationKeys<R>]: K extends TRelationKeys<R> ? K extends TRawStringQuery ? 'ASC' | 'DESC' : K extends `${string}.${string}` ? 'ASC' | 'DESC' : K extends `$${string & K}` ? R extends Record<string, any> ? 'ASC' | 'DESC' : never : R extends Record<string, any> ? R[`$${string & K}`] extends (infer U)[] ? U extends Model ? '*' | TRepositoryOrderBy<TSchemaModel<U>, TRelationModel<U>> : never : R[`$${K & string}`] extends Model ? '*' | TRepositoryOrderBy<TSchemaModel<R[`$${K & string}`]>, TRelationModel<R[`$${K & string}`]>> : never : never : K extends keyof T ? 'ASC' | 'DESC' : never;
}>;
type TRepositorySelect<T extends Record<string, any> = any, R = unknown> = Partial<{
[K in TSchemaKeys<T> | TRelationKeys<R>]: K extends TRelationKeys<R> ? K extends TRawStringQuery ? boolean : K extends `${string}.${string}` ? boolean : K extends `$${string & K}` ? R extends Record<string, any> ? boolean : never : R extends Record<string, any> ? R[`$${string & K}`] extends (infer U)[] ? U extends Model ? '*' | TRepositorySelect<TSchemaModel<U>, TRelationModel<U>> : never : R[`$${K & string}`] extends Model ? '*' | TRepositorySelect<TSchemaModel<R[`$${K & string}`]>, TRelationModel<R[`$${K & string}`]>> : never : never : K extends keyof T ? boolean : never;
}>;
type TRepositoryRelation<R = unknown> = Partial<{
[K in TRelationKeys<R>]: K extends TRelationKeys<R> ? K extends `$${string & K}` ? R extends Record<string, any> ? boolean : never : R extends Record<string, any> ? R[`$${string & K}`] extends (infer U)[] ? U extends Model ? boolean | (TRepositoryRequest<TSchemaModel<U>, TRelationModel<U>> & TRepositoryRelation<TRelationModel<U>>) : never : R[`$${K & string}`] extends Model ? boolean | (TRepositoryRequest<TSchemaModel<R[`$${K & string}`]>, TRelationModel<R[`$${K & string}`]>> & TRepositoryRelation<TRelationModel<R[`$${K & string}`]>>) : never : never : never;
}>;
export type TRepositoryRequest<T extends Record<string, any> = any, R = unknown> = {
debug?: boolean;
cache?: {
key: string;
expires: number;
};
when?: {
condition: boolean;
query: () => TRepositoryRequest<T, R>;
};
select?: '*' | TRepositorySelect<T, R>;
except?: TRepositorySelect<T, R>;
join?: {
localKey: `${string}.${string}`;
referenceKey: `${string}.${string}`;
}[];
leftJoin?: {
localKey: `${string}.${string}`;
referenceKey: `${string}.${string}`;
}[];
rightJoin?: {
localKey: `${string}.${string}`;
referenceKey: `${string}.${string}`;
}[];
where?: TRepositoryWhere<T, R>;
whereRaw?: string[];
whereQuery?: Partial<Record<TSchemaColumns<T> | `${string}.${string}`, any>>;
groupBy?: (Partial<TSchemaColumns<T>> | `${string}.${string}` | TRawStringQuery)[];
having?: string;
orderBy?: TRepositoryOrderBy<T, R>;
limit?: number;
offset?: number;
relations?: TRepositoryRelation<R>;
relationsExists?: TRepositoryRelation<R>;
};
export type TRepositoryRequestHandler<T extends Record<string, any> = any, R = any> = Partial<TRepositoryRequest<T, R> & {
instance?: Model;
}>;
export type TRepositoryRequestPagination<T extends Record<string, any> = any, R = any> = Partial<TRepositoryRequest<T, R>> & {
page?: number;
};
export type TRepositoryRequestAggregate<T extends Record<string, any> = any, R = any> = Partial<Omit<TRepositoryRequest<T, R>, 'relations' | 'relationQuery'>>;
export type TModelConstructorOrObject = {
model: new () => Model<any, any>;
alias?: string;
key?: string;
join?: Join;
} | (new () => Model<any, any>);
export {};