import { type ColumnBaseConfig, type ColumnBuilderBaseConfig, type ColumnBuilderRuntimeConfig, type MakeColumnConfig, entityKind, getTableName, } from "drizzle-orm"; import { type AnyPgTable, PgColumn, PgColumnBuilder, type PgTextConfig, } from "drizzle-orm/pg-core"; export type PgTextBuilderInitial< TName extends string, TEnum extends [string, ...string[]], > = PgTextBuilder<{ name: TName; dataType: "string"; columnType: "PgText"; data: TEnum[number]; enumValues: TEnum; driverParam: string; }>; export class PgTextBuilder< T extends ColumnBuilderBaseConfig<"string", "PgText">, > extends PgColumnBuilder { static override readonly [entityKind]: string = "PgTextBuilder"; constructor(name: T["name"], config: PgTextConfig) { super(name, "string", "PgText"); this.config.enumValues = config.enum; } /** @internal */ // @ts-ignore override build( table: AnyPgTable<{ name: TTableName }>, ): PgText> { return new PgText>( table, this.config as ColumnBuilderRuntimeConfig, ); } } export class PgText< T extends ColumnBaseConfig<"string", "PgText">, > extends PgColumn { static override readonly [entityKind]: string = "PgText"; override readonly enumValues = this.config.enumValues; getSQLType(): string { return "text"; } override mapToDriverValue(value: string) { // Note: swallow errors because drizzle will throw a more specific error if the value is invalid try { if (value.match(/\0/g)) { globalThis.PONDER_COMMON?.logger.warn({ msg: `Detected and removed null byte characters. Postgres "text" columns do not support null byte characters. Please consider handling this case in your indexing logic.`, value, table: getTableName(this.table), column: this.name, }); return value.replace(/\0/g, ""); } } catch {} return value; } }