/** All supported Postgres column data types */ export type ColumnDataType = "text" | "varchar" | "char" | "integer" | "bigint" | "smallint" | "serial" | "bigserial" | "smallserial" | "boolean" | "real" | "double precision" | "numeric" | "decimal" | "json" | "jsonb" | "timestamp" | "timestamptz" | "date" | "time" | "timetz" | "uuid" | "bytea" | "interval" | "inet" | "cidr" | "macaddr" | "point" | "line" | "lseg" | "box" | "path" | "polygon" | "circle" | "text[]" | "integer[]" | "varchar[]" | "uuid[]" | "boolean[]" | "json[]" | "jsonb[]" | (string & {}); /** Column config stored internally */ export interface ColumnConfig { name: string; tableName?: string; dataType: TDataType; notNull: TNotNull; primaryKey: TPrimaryKey; unique: boolean; defaultValue?: unknown; defaultFn?: string; references?: TRef; check?: string; generated?: "always" | "by default"; generatedAs?: string; enumConfig?: { enumName: string; enumValues: string[]; }; } export interface ForeignKeyRef { table: TTable; column: TColumn; relationName?: TRelationName; backRelationName?: TBackRelationName; onDelete?: "cascade" | "set null" | "set default" | "restrict" | "no action"; onUpdate?: "cascade" | "set null" | "set default" | "restrict" | "no action"; } /** Table index definition */ export interface IndexConfig { name?: string; columns: string[]; unique?: boolean; where?: string; using?: "btree" | "hash" | "gin" | "gist" | "brin"; } /** Table foreign key definition (table-level) */ export interface ForeignKeyConfig { name?: string; columns: string[]; foreignTable: string; foreignColumns: string[]; onDelete?: "cascade" | "set null" | "set default" | "restrict" | "no action"; onUpdate?: "cascade" | "set null" | "set default" | "restrict" | "no action"; } /** Table-level config */ export interface TableConfig { name: string; schema?: string; columns: Record; primaryKeys?: string[]; indexes?: IndexConfig[]; foreignKeys?: ForeignKeyConfig[]; checks?: string[]; } type IsNullable> = C["notNull"] extends true ? false : true; type InferBaseType> = C extends { _enumType: infer E; } ? E : C["dataType"] extends "text" | "varchar" | "char" | "uuid" | "inet" | "cidr" | "macaddr" ? string : C["dataType"] extends "integer" | "bigint" | "smallint" | "serial" | "bigserial" | "smallserial" | "real" | "double precision" | "numeric" | "decimal" ? number : C["dataType"] extends "boolean" ? boolean : C["dataType"] extends "json" | "jsonb" ? unknown : C["dataType"] extends "timestamp" | "timestamptz" | "date" | "time" | "timetz" ? Date : C["dataType"] extends "bytea" ? Uint8Array : C["dataType"] extends "text[]" | "varchar[]" | "uuid[]" ? string[] : C["dataType"] extends "integer[]" ? number[] : C["dataType"] extends "boolean[]" ? boolean[] : C["dataType"] extends "json[]" | "jsonb[]" ? unknown[] : unknown; export type InferColumnType> = IsNullable extends true ? InferBaseType | null : InferBaseType; /** Given a table's columns record, infer the full row type */ export type InferTable>> = { [K in keyof T]: InferColumnType; }; /** Partial version for inserts (nullable cols and cols with defaults are optional) */ export type InferInsert>> = { [K in keyof T as T[K]["notNull"] extends true ? T[K]["defaultValue"] extends undefined ? T[K]["defaultFn"] extends undefined ? T[K]["primaryKey"] extends true ? never : K : never : never : never]: InferBaseType; } & { [K in keyof T as T[K]["notNull"] extends true ? T[K]["defaultValue"] extends undefined ? T[K]["defaultFn"] extends undefined ? T[K]["primaryKey"] extends true ? K : never : K : K : K]?: InferColumnType; }; export {}; //# sourceMappingURL=index.d.ts.map