import { MaybeArray } from 'cosmokit'; import { Context } from 'cordis'; import { Eval, Update } from './eval.ts'; import { DeepPartial, FlatKeys, Flatten, Keys, Row } from './utils.ts'; import { Type } from './type.ts'; import { Driver } from './driver.ts'; import { Query } from './query.ts'; import { Selection } from './selection.ts'; import { Create } from './database.ts'; import { Types } from './index.ts'; declare const Primary: unique symbol; export type Primary = (string | number) & { [Primary]: true; }; export declare namespace Relation { const Marker: unique symbol; export type Marker = { [Marker]: true; }; export const Type: readonly ["oneToOne", "oneToMany", "manyToOne", "manyToMany"]; export type Type = typeof Type[number]; export interface Config = Keys, K extends string = string> { type: Type; table: T; references: Keys[]; fields: K[]; shared: Record>; required: boolean; } export interface Definition { type: 'oneToOne' | 'manyToOne' | 'manyToMany'; table?: string; target?: string; references?: MaybeArray; fields?: MaybeArray; shared?: MaybeArray | Partial>; } export type Include = boolean | { [P in keyof T]?: T[P] extends MaybeArray | undefined ? U extends S ? Include : (U extends (infer I)[] ? Query.Expr : never) : never; }; export type SetExpr = ((row: Row) => Update) | { where: Query.Expr> | Selection.Callback; update: Row.Computed>; }; export interface Modifier { $create?: MaybeArray>; $upsert?: MaybeArray>; $set?: MaybeArray>; $remove?: Query.Expr> | Selection.Callback; $connect?: Query.Expr> | Selection.Callback; $disconnect?: Query.Expr> | Selection.Callback; } export function buildAssociationTable(...tables: [string, string]): string; export function buildAssociationKey(key: string, table: string): string; export function buildSharedKey(field: string, reference: string): string; export function parse(def: Definition, key: string, model: Model, relModel: Model, subprimary?: boolean): [Config, Config]; export {}; } export interface Field { type: Type; deftype?: Field.Type; length?: number; nullable?: boolean; initial?: T; precision?: number; scale?: number; expr?: Eval.Expr; legacy?: string[]; deprecated?: boolean; relation?: Relation.Config; transformers?: Driver.Transformer[]; } export declare namespace Field { export const number: Type[]; export const string: Type[]; export const boolean: Type[]; export const date: Type[]; export const object: Type[]; export type Type = T extends Primary ? 'primary' : T extends number ? 'integer' | 'unsigned' | 'float' | 'double' | 'decimal' : T extends string ? 'char' | 'string' | 'text' : T extends boolean ? 'boolean' : T extends Date ? 'timestamp' | 'date' | 'time' : T extends ArrayBuffer ? 'binary' : T extends bigint ? 'bigint' : T extends unknown[] ? 'list' | 'json' | 'oneToMany' | 'manyToMany' : T extends object ? 'json' | 'oneToOne' | 'manyToOne' : 'expr'; type Shorthand = S | `${S}(${any})`; export type Object = { type: 'object'; inner?: Extension; } & Omit, 'type'>; export type Array = { type: 'array'; inner?: Literal | Definition | Transform; } & Omit, 'type'>; export type Transform = { type: Type | Keys | NewType | 'object' | 'array'; dump: (value: S | null) => T | null | void; load: (value: T | null) => S | null | void; initial?: S; } & Omit, 'type' | 'initial'>; export type Definition = (Omit, 'type'> & { type: Type | Keys | NewType; }) | (T extends object ? Object : never) | (T extends (infer I)[] ? Array : never); export type Literal = Shorthand> | Keys | NewType | (T extends object ? 'object' : never) | (T extends unknown[] ? 'array' : never); export type Parsable = { type: Type | Field['type']; } & Omit, 'type'>; type MapField = { [K in keyof O]?: Literal | Definition | Transform | (O[K] extends object | undefined ? Relation.Definition> : never); }; export type Extension = MapField>; const NewType: unique symbol; export type NewType = string & { [NewType]: T; }; export type Config = { [K in keyof O]?: Field; }; export function parse(source: string | Parsable): Field; export function getInitial(type: Field.Type, initial?: any): any; export function available(field?: Field): boolean; export {}; } export declare namespace Model { type Migration = (database: D) => Promise; interface Config { callback?: Migration; autoInc: boolean; primary: MaybeArray; unique: MaybeArray[]; indexes: (MaybeArray | Driver.IndexDef)[]; foreign: { [P in K]?: [string, string]; }; } interface Intercept extends Partial>> { create?: boolean; fields: Field.Extension; } } export interface Model extends Model.Config { } export declare class Model { name: string; ctx?: Context; indexes: Driver.Index>[]; fields: Field.Config; migrations: Map, string[]>; private type; constructor(name: string); extend(fields: Field.Extension, config?: Partial): void; private parseIndex; private checkIndex; resolveValue(field: string | Field | Type, value: any): any; resolveModel(obj: any, model?: Type): any; format(source: object, strict?: boolean, prefix?: string, result?: S): any; parse(source: object, strict?: boolean, prefix?: string, result?: S): any; create(data?: {}): any; availableFields(): import("cosmokit").Dict | undefined, string>; getType(): Type; getType(key: string): Type | undefined; } export {};