import { WithUndefinedPropertiesAsOptionals } from './typeHelpers';
import { INTERNAL_TYPES } from '../types';
import { Database } from '../Database';
import { Adapter } from '../Adapter';
import ColumnType from '../ColumnType';
interface TableProperties {
    [key: string]: ColumnType;
}
declare type BuiltTable<T extends TableProperties> = {
    [P in keyof T]: T[P][INTERNAL_TYPES.INTERNAL_TYPE];
};
export declare class SchemaTable<DBAdapter extends Adapter = any, T = any> {
    readonly [INTERNAL_TYPES.INTERNAL_TYPE]: T;
    database: Database<DBAdapter>;
    name: string;
    config: DBAdapter['TableTypes'];
    primaryKey: keyof T;
    constructor(database: Database<DBAdapter>, name: string, config: DBAdapter['TableTypes'], builder: (t: DBAdapter['ColumnTypes']) => TableProperties);
}
export declare class Schema<RegisteredTables = {}> {
    version: number | undefined;
    tables: RegisteredTables;
    constructor(version?: number, tables?: RegisteredTables);
    /**
     * TODO: Documentation.
     */
    table<DBAdapter extends Adapter, TableName extends string, Built extends TableProperties>(database: Database<DBAdapter>, name: TableName, config: DBAdapter['TableTypes'], builder: (t: DBAdapter['ColumnTypes']) => Built): Schema<RegisteredTables & {
        [P in TableName]: SchemaTable<DBAdapter, WithUndefinedPropertiesAsOptionals<BuiltTable<Built>>>;
    }>;
}
export { ColumnType };
/**
 * TODO: Documentation.
 */
export declare function createSchema(version?: number): Schema<{}>;
