export declare type SQLDialects = "mssql" | "mysql" | "oracle" | "postgres" | "sqlite"; export interface OrderByValueNode { } export interface Named { name?: Name; } export interface ColumnDefinition extends Named { jsType?: Type; dataType: string; primaryKey?: boolean; references?: { table: string; column: string; onDelete?: 'restrict' | 'cascade' | 'no action' | 'set null' | 'set default'; onUpdate?: 'restrict' | 'cascade' | 'no action' | 'set null' | 'set default'; }; notNull?: boolean; unique?: boolean; defaultValue?: Type; } export interface TableDefinition { name: Name; schema: string; columns: { [CName in keyof Row]: ColumnDefinition; }; dialect?: SQLDialects; isTemporary?: boolean; foreignKeys?: { table: string; columns: (keyof Row)[]; refColumns: string[]; onDelete?: 'restrict' | 'cascade' | 'no action' | 'set null' | 'set default'; onUpdate?: 'restrict' | 'cascade' | 'no action' | 'set null' | 'set default'; }; } export interface QueryLike { values: any[]; text: string; } export interface Executable { toQuery(): QueryLike; } export interface Queryable extends Executable { where(...nodes: any[]): Query; delete(): ModifyingQuery; select(star: Column): Query; select(n1: Column): Query<{ [N in N1]: T1; }>; select(n1: Column, n2: Column): Query<{ [N in N1]: T1; } & { [N in N2]: T2; }>; select(n1: Column, n2: Column, n3: Column): Query<{ [N in N1]: T1; } & { [N in N2]: T2; } & { [N in N3]: T3; }>; select(...nodesOrTables: any[]): Query; } export interface Query extends Executable, Queryable { resultType: T; from(table: TableNode): Query; from(statement: string): Query; update(o: { [key: string]: any; }): ModifyingQuery; update(o: {}): ModifyingQuery; group(...nodes: any[]): Query; order(...criteria: OrderByValueNode[]): Query; limit(l: number): Query; offset(o: number): Query; } export interface SubQuery { select(node: Column): SubQuery; select(...nodes: any[]): SubQuery; where(...nodes: any[]): SubQuery; from(table: TableNode): SubQuery; from(statement: string): SubQuery; group(...nodes: any[]): SubQuery; order(criteria: OrderByValueNode): SubQuery; exists(): BinaryNode; notExists(): BinaryNode; notExists(subQuery: SubQuery): BinaryNode; } export interface ModifyingQuery extends Executable { returning(...nodes: any[]): Query; where(...nodes: any[]): ModifyingQuery; } export interface TableNode { join(table: TableNode): JoinTableNode; leftJoin(table: TableNode): JoinTableNode; } export interface JoinTableNode extends TableNode { on(filter: BinaryNode): TableNode; on(filter: string): TableNode; } export interface CreateQuery extends Executable { ifNotExists(): Executable; } export interface DropQuery extends Executable { ifExists(): Executable; } export declare type Columns = { [Name in keyof T]: Column; }; export declare type Table = TableNode & Queryable & Named & Columns & { getName(): string; getSchema(): string; literal(statement: string): any; create(): CreateQuery; drop(): DropQuery; as(name: OtherName): Table; update(o: Partial): ModifyingQuery; insert(row: T): ModifyingQuery; insert(rows: T[]): ModifyingQuery; select(): Query; select(...nodes: any[]): Query; from(table: TableNode): Query; from(statement: string): Query; star(): Column; subQuery(): SubQuery; columns: Column[]; sql: SQL; alter(): AlterQuery; indexes(): IndexQuery; }; export interface AlterQuery extends Executable { addColumn(column: Column): AlterQuery; addColumn(name: string, options: string): AlterQuery; dropColumn(column: Column | string): AlterQuery; renameColumn(column: Column, newColumn: Column): AlterQuery; renameColumn(column: Column, newName: string): AlterQuery; renameColumn(name: string, newName: string): AlterQuery; rename(newName: string): AlterQuery; } export interface IndexQuery { create(): IndexCreationQuery; create(indexName: string): IndexCreationQuery; drop(indexName: string): Executable; drop(...columns: Column[]): Executable; } export interface IndexCreationQuery extends Executable { unique(): IndexCreationQuery; using(name: string): IndexCreationQuery; on(...columns: (Column | OrderByValueNode)[]): IndexCreationQuery; withParser(parserName: string): IndexCreationQuery; fulltext(): IndexCreationQuery; spatial(): IndexCreationQuery; } export interface SQL { functions: { LOWER(c: Column): Column; }; } export interface BinaryNode { and(node: BinaryNode): BinaryNode; or(node: BinaryNode): BinaryNode; } export interface Column { name: Name; in(arr: T[]): BinaryNode; in(subQuery: SubQuery): BinaryNode; notIn(arr: T[]): BinaryNode; equals(node: T | Column): BinaryNode; notEquals(node: T | Column): BinaryNode; gte(node: T | Column): BinaryNode; lte(node: T | Column): BinaryNode; gt(node: T | Column): BinaryNode; lt(node: T | Column): BinaryNode; like(str: string): BinaryNode; multiply: { (node: Column): Column; (n: number): Column; }; isNull(): BinaryNode; isNotNull(): BinaryNode; sum(): Column; count(): Column; count(name: string): Column; distinct(): Column; as(name: OtherName): Column; ascending: OrderByValueNode; descending: OrderByValueNode; asc: OrderByValueNode; desc: OrderByValueNode; } export declare function define(map: TableDefinition): Table; export declare function setDialect(dialect: SQLDialects): void;