import type { DriverSpecs } from './Driver.js';
import { type HasSql, internalData, internalSql } from './Internal.js';
import { type Sql } from './Sql.js';
import type { Field, FieldData } from './expr/Field.js';
import { type Input } from './expr/Input.js';
export interface BaseColumnData {
type: HasSql;
name?: string;
json?: boolean;
primary?: boolean;
notNull?: boolean;
isUnique?: boolean;
autoIncrement?: boolean;
defaultValue?: Sql;
references?(): FieldData;
mapFromDriverValue?(value: unknown, specs: DriverSpecs): unknown;
mapToDriverValue?(value: unknown): unknown;
$default?(): Sql;
$onUpdate?(): Sql;
}
export interface ColumnData extends BaseColumnData {
type: ColumnType;
}
export declare class ColumnType implements HasSql {
kind: string;
args: Array>;
[internalSql]: Sql;
constructor(kind: string, args: Array>, sql?: Sql);
}
type WithoutNull = Exclude;
export declare class Column {
readonly [internalData]: ColumnData;
constructor(data: ColumnData);
notNull(): RequiredColumn;
$defaultFn(value: () => Input>): Column>;
$default(value: Input> | (() => Input>)): Column>;
$onUpdateFn(fn: () => Input): Column;
$onUpdate(fn: () => Input): Column;
default(value: Input>): Column>;
defaultNow(): Column>;
primaryKey(options?: {
autoIncrement: boolean;
}): Column>;
unique(name?: string): Column;
references(foreignField: Field | (() => Field)): Column;
$type(): Column;
}
export declare class JsonColumn extends Column {
private brand;
constructor(data: ColumnData);
}
declare const required: unique symbol;
export interface RequiredColumn extends Column> {
[required]: true;
}
export interface Columns {
(data: ColumnData): Column;
[key: string]: (...args: Array>) => ColumnType;
}
export declare const column: Columns;
export type ColumnArguments = [name?: string] | [options: Options] | [name: string, options: Options];
export declare function columnConfig(args: ColumnArguments): {
name: string | undefined;
options: Options | undefined;
};
export declare function formatColumn(column: BaseColumnData): Sql;
export {};