import * as Drizzle from 'drizzle-orm';
import { Schema } from 'effect';
type Columns<TTable extends Drizzle.Table> = TTable['_']['columns'];
type ColumnSchema<TColumn extends Drizzle.Column> = TColumn['dataType'] extends 'custom' ? Schema.Schema<any> : TColumn['dataType'] extends 'json' ? Schema.Schema<JsonValue> : TColumn extends {
    enumValues: [string, ...string[]];
} ? Drizzle.Equal<TColumn['enumValues'], [string, ...string[]]> extends true ? Schema.Schema<string> : Schema.Schema<TColumn['enumValues'][number]> : TColumn['dataType'] extends 'bigint' ? Schema.Schema<bigint, bigint> : TColumn['dataType'] extends 'number' ? TColumn['columnType'] extends `PgBigInt${number}` ? Schema.Schema<bigint, number> : Schema.Schema<number, number> : TColumn['columnType'] extends 'PgNumeric' ? Schema.Schema<number, string> : TColumn['columnType'] extends 'PgUUID' ? Schema.Schema<string> : TColumn['columnType'] extends 'PgDate' ? TColumn extends {
    mode: 'string';
} ? Schema.Schema<string, string> : Schema.Schema<Date, string> : TColumn['columnType'] extends 'PgTimestamp' ? TColumn extends {
    mode: 'string';
} ? Schema.Schema<string, string> : Schema.Schema<Date, string> : TColumn['dataType'] extends 'string' ? Schema.Schema<string, string> : TColumn['dataType'] extends 'boolean' ? Schema.Schema<boolean> : TColumn['dataType'] extends 'date' ? TColumn extends {
    mode: 'string';
} ? Schema.Schema<string> : Schema.Schema<Date> : Schema.Schema<any>;
type JsonPrimitive = string | number | boolean | null;
type JsonObject = {
    readonly [key: string]: unknown;
};
type JsonArray = readonly unknown[];
type JsonValue = JsonPrimitive | JsonObject | JsonArray;
type StrictJsonObject = {
    readonly [key: string]: StrictJsonValue;
};
type StrictJsonArray = readonly StrictJsonValue[];
type StrictJsonValue = JsonPrimitive | StrictJsonObject | StrictJsonArray;
export declare const JsonValue: Schema.Union<[typeof Schema.String, typeof Schema.Number, typeof Schema.Boolean, typeof Schema.Null, Schema.Record$<typeof Schema.String, typeof Schema.Unknown>, Schema.Array$<typeof Schema.Unknown>]>;
export declare const StrictJsonValue: Schema.suspend<StrictJsonValue, StrictJsonValue, never>;
type RefineFunction<TTable extends Drizzle.Table> = (schemas: {
    [K in keyof Columns<TTable>]: Schema.Schema<any>;
}) => Schema.Schema<any>;
type RefineArg<TTable extends Drizzle.Table> = Schema.Schema<any> | RefineFunction<TTable>;
type TableRefine<TTable extends Drizzle.Table> = {
    [K in keyof Columns<TTable>]?: RefineArg<TTable>;
};
type InsertProperty<TColumn extends Drizzle.Column, TKey extends string> = TColumn['_']['notNull'] extends false ? Schema.PropertySignature<'?:', Schema.Schema.Type<ColumnSchema<TColumn>> | null | undefined, TKey, '?:', Schema.Schema.Encoded<ColumnSchema<TColumn>> | null | undefined, false, never> : TColumn['_']['hasDefault'] extends true ? Schema.PropertySignature<'?:', Schema.Schema.Type<ColumnSchema<TColumn>> | undefined, TKey, '?:', Schema.Schema.Encoded<ColumnSchema<TColumn>> | undefined, true, never> : ColumnSchema<TColumn>;
type SelectProperty<TColumn extends Drizzle.Column> = TColumn['_']['notNull'] extends false ? Schema.Schema<Schema.Schema.Type<ColumnSchema<TColumn>> | null> : ColumnSchema<TColumn>;
type InsertColumnSchemas<TTable extends Drizzle.Table> = {
    [K in keyof Columns<TTable>]: InsertProperty<Columns<TTable>[K], K & string>;
};
type SelectColumnSchemas<TTable extends Drizzle.Table> = {
    [K in keyof Columns<TTable>]: SelectProperty<Columns<TTable>[K]>;
};
type BuildInsertSchema<TTable extends Drizzle.Table, TRefine = {}> = Schema.Struct<InsertColumnSchemas<TTable> & TRefine>;
type BuildSelectSchema<TTable extends Drizzle.Table, TRefine = {}> = Schema.Struct<SelectColumnSchemas<TTable> & TRefine>;
export declare function createInsertSchema<TTable extends Drizzle.Table, TRefine extends TableRefine<TTable> = {}>(table: TTable, refine?: TRefine): BuildInsertSchema<TTable, TRefine>;
export declare function createSelectSchema<TTable extends Drizzle.Table, TRefine extends TableRefine<TTable> = {}>(table: TTable, refine?: TRefine): BuildSelectSchema<TTable, TRefine>;
export {};
