export 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 type Columns = { [Name in keyof T]: Column } export 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 //todo check column names } isNull(): BinaryNode isNotNull(): BinaryNode //todo check column names sum(): Column count(): Column count(name: string): Column distinct(): Column as(name: OtherName): Column ascending: OrderByValueNode descending: OrderByValueNode asc: OrderByValueNode desc: OrderByValueNode } export function define(map: TableDefinition): Table { return require('sql').define(map) } export function setDialect(dialect: SQLDialects): void { return require('sql').setDialect(dialect) }