// Type definitions for anydb-sql // Project: https://github.com/doxout/anydb-sql // Definitions by: Gorgi Kosev // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped declare module "anydb-sql" { interface AnyDBPool extends anydbSQL.DatabaseConnection { query:(text:string, values:any[], callback:(err:Error, result:any)=>void)=>void begin:()=>anydbSQL.Transaction close:(err:Error)=>void } interface Dictionary { [key:string]:T; } namespace anydbSQL { export interface OrderByValueNode {} export interface ColumnDefinition { primaryKey?:boolean; dataType?:string; references?: {table:string; column: string} notNull?:boolean } export interface TableDefinition { name:string columns:Dictionary has?:Dictionary<{from:string; many?:boolean}> } export interface QueryLike { query:string; values: any[] text:string } export interface DatabaseConnection { queryAsync(query:string, ...params:any[]):Promise<{rowCount:number;rows:T[]}> queryAsync(query:QueryLike):Promise<{rowCount:number;rows:T[]}> } export interface Transaction extends DatabaseConnection { rollback():void commitAsync():Promise } export interface SubQuery { select(node:Column):SubQuery where(...nodes:any[]):SubQuery from(table:TableNode):SubQuery group(...nodes:any[]):SubQuery order(criteria:OrderByValueNode):SubQuery notExists(subQuery:SubQuery):SubQuery } interface Executable { get():Promise getWithin(tx:DatabaseConnection):Promise exec():Promise all():Promise execWithin(tx:DatabaseConnection):Promise allWithin(tx:DatabaseConnection):Promise toQuery():QueryLike; } interface Queryable { where(...nodes:any[]):Query delete():ModifyingQuery select(...nodes:any[]):Query selectDeep(table: Table): Query selectDeep(...nodesOrTables:any[]):Query } export interface Query extends Executable, Queryable { from(table:TableNode):Query update(o:Dictionary):ModifyingQuery update(o:{}):ModifyingQuery group(...nodes:any[]):Query order(...criteria:OrderByValueNode[]):Query limit(l:number):Query offset(o:number):Query } 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 } interface CreateQuery extends Executable { ifNotExists():Executable } interface DropQuery extends Executable { ifExists():Executable } export interface Table extends TableNode, Queryable { create():CreateQuery drop():DropQuery as(name:string):Table update(o:any):ModifyingQuery insert(row:T):ModifyingQuery insert(rows:T[]):ModifyingQuery select():Query select(...nodes:any[]):Query from(table:TableNode):Query star():Column subQuery():SubQuery eventEmitter:{emit:(type:string, ...args:any[])=>void on:(eventName:string, handler:Function)=>void} columns:Column[] sql: SQL; alter():AlterQuery } export interface AlterQuery extends Executable { addColumn(column:Column): AlterQuery; addColumn(name: string, options:string): AlterQuery; dropColumn(column: Column): 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 SQL { functions: { LOWER(c:Column):Column } } export interface BinaryNode { and(node:BinaryNode):BinaryNode or(node:BinaryNode):BinaryNode } export interface Column { in(arr:T[]):BinaryNode in(subQuery:SubQuery):BinaryNode notIn(arr:T[]):BinaryNode equals(node:any):BinaryNode notEquals(node:any):BinaryNode gte(node:any):BinaryNode lte(node:any):BinaryNode gt(node:any):BinaryNode lt(node:any):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:string):Column ascending:OrderByValueNode descending:OrderByValueNode asc:OrderByValueNode desc:OrderByValueNode } export interface AnydbSql extends DatabaseConnection { define(map:TableDefinition):Table; transaction(fn:(tx:Transaction)=>Promise):Promise allOf(...tables:Table[]):any models:Dictionary> functions:{LOWER:(name:Column)=>Column RTRIM:(name:Column)=>Column} makeFunction(name:string):Function begin():Transaction open():void; close():void; getPool():AnyDBPool; dialect():string; } } function anydbSQL(config:Object):anydbSQL.AnydbSql; export = anydbSQL; }