import { Dict, MaybeArray } from 'cosmokit'; import { Context, Service } from 'cordis'; import { AtomicTypes, DeepPartial, FlatKeys, FlatPick, Flatten, Indexable, Keys, Row, Values } from './utils.ts'; import { Selection } from './selection.ts'; import { Field, Model, Relation } from './model.ts'; import { Driver } from './driver.ts'; import { Eval, Update } from './eval.ts'; import { Query } from './query.ts'; import { Tables, Types } from './index.ts'; type TableLike = Keys | Selection; type TableType> = T extends Keys ? S[T] : T extends Selection ? U : never; export declare namespace Join1 { export type Input = readonly Keys[]; export type Output> = { [P in U[number]]: TableType; }; type Parameters> = U extends readonly [infer K extends Keys, ...infer R] ? [Row, ...Parameters>>] : []; export type Predicate> = (...args: Parameters) => Eval.Expr; export {}; } export declare namespace Join2 { export type Input = Dict>; export type Output> = { [K in keyof U]: TableType; }; type Parameters> = { [K in keyof U]: Row>; }; export type Predicate> = (args: Parameters) => Eval.Expr; export {}; } type CreateUnit = T extends Values ? T : T extends (infer I extends Values)[] ? Create[] | { $literal?: DeepPartial; $create?: MaybeArray>; $upsert?: MaybeArray>; $connect?: Query.Expr>; } : T extends Values ? Create | { $literal?: DeepPartial; $create?: Create; $upsert?: Create; $connect?: Query.Expr>; } : T extends (infer U)[] ? DeepPartial[] : T extends object ? Create : T; export type Create = { [K in keyof T]?: CreateUnit; }; export declare namespace Database { interface Intercept { tables: (keyof Tables)[] | { [K in keyof Tables]?: Model.Intercept; }; } } export declare class Database extends Service { static readonly transact: unique symbol; static readonly migrate: unique symbol; tables: Dict; drivers: Driver[]; types: Dict; private _driver; private stashed; private prepareTasks; migrateTasks: Dict>; constructor(ctx: Context); refresh(): void; prepared(): Promise; private getDriver; private prepare; extend>(name: K, fields: Field.Extension, config?: Partial>>): void; private _parseField; private parseField; define, Field.Type | 'object' | 'array'>>(name: K, field: Field.Definition | Field.Transform): K; define(field: Field.Definition | Field.Transform): Field.NewType; migrate>(name: K, fields: Field.Extension, callback: Model.Migration): void; select(table: Selection, query?: Query): Selection; select>(table: K, query?: Query, include?: Relation.Include> | null): Selection; join>(tables: X, callback?: Join1.Predicate, optional?: boolean[]): Selection>; join>(tables: X, callback?: Join2.Predicate, optional?: Dict>): Selection>; get>(table: K, query: Query): Promise; get, P extends FlatKeys = any>(table: K, query: Query, cursor?: Driver.Cursor): Promise[]>; eval, T>(table: K, expr: Selection.Callback, query?: Query): Promise; set>(table: K, query: Query, update: Row.Computed>): Promise; remove>(table: K, query: Query): Promise; create>(table: K, data: Create): Promise; upsert>(table: K, upsert: Row.Computed[]>, keys?: MaybeArray>): Promise; makeProxy(marker: any, getDriver?: (driver: Driver, database: this) => Driver): this; withTransaction(callback: (database: this) => Promise): Promise; transact(callback: (database: this) => Promise): Promise; stopAll(): Promise; drop>(table: K): Promise; dropAll(): Promise; stats(): Promise; private ensureTransaction; private transformRelationQuery; private createOrUpdate; private processRelationUpdate; private hasRelation; } export {};