Skip to content

Commit 7525e49

Browse files
Overhaul validator packages (#3508)
* Unminify validator build output * Reimplement `createSelectSchema` in `drizzle-zod` * Add `getViewSelectedFields` util function * Support views in `drizzle-zod` * Reimplement refinement in zod select schema * Create schema creation factory for zod * Support enums in `createSelectSchema` in `drizzle-zod` * Update peer deps' versions in `drizzle-zod` * Add `getViewSelectedFields` util function * Fix view types * Add `$inferSelect` to views * Format * Fix lint errors * Reimplement `createInsertSchema` in `drizzle-zod` * Add `isView` util function * Handle additional properties * Add `createUpdateSchema` in `drizzle-zod` + Additional tests * Update type * Disallow unknown keys in `drizzle-zod` refinement * Add checks comparison * Test all PG data types * Restructure `drizzle-zod` files * Support PG arrays in `drizzle-zod` * Add MySql tests to drizzle-zod * Add SQLite tests + Fix MySql tests * Format * Update drizzle-valibot peer deps * Fix redundant checks in drizzle-zod * Wipe drizzzle-valibot and drizzle-typebox * Adapt drizzle-zod code for drizzle-valibot * Update string schema generation in drizzle-zod * Add type tests to drizzle-zod * Undo additional validation to strings in drizzle-zod * Add missing text types in `getMySqlColumnBuilders` return value * Handle additional MySQL text types in drizzle-zod * Make necessary type changes to ORM * Add MySQL tests to drizzle-valibot * Some ORM type-level changes * Improve and simplify array handling in drizzle-zod * Add drizzle-valibot PG tests * Add SQLite tests to drizzle-valibot * Fix drizzle-valibot not identifying length in MySQL char * Handle false-positive type error + Format drizzle-valibot * Optimize drizzle-zod * Optimize drizzle-valibot * Update peer deps in drizzle-typebox * Reimplement everything in drizzle-typebox * Add MySQL tests for drizzle-typebox * Add PG tests to drizzle-typebox * Write SQLite tests for drizzle-typebox * Format * Update validator packages README * Format * Add tests for tables within schemas * Properly implement `Buffer` schema in drizzle-typebox * Fix types * Fix type tests in ORM * Fix type tests * Lint * Fix builds for validator packages * Format * Fix types ans lint * fix * Fix * Update ORM types * Fix MySQL char types --------- Co-authored-by: AndriiSherman <andreysherman11@gmail.com>
1 parent a44af76 commit 7525e49

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

75 files changed

+6904
-3218
lines changed

drizzle-orm/src/column-builder.ts

Lines changed: 43 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -313,11 +313,49 @@ export type BuildColumn<
313313
TTableName extends string,
314314
TBuilder extends ColumnBuilderBase,
315315
TDialect extends Dialect,
316-
> = TDialect extends 'pg' ? PgColumn<MakeColumnConfig<TBuilder['_'], TTableName>>
317-
: TDialect extends 'mysql' ? MySqlColumn<MakeColumnConfig<TBuilder['_'], TTableName>>
318-
: TDialect extends 'singlestore' ? SingleStoreColumn<MakeColumnConfig<TBuilder['_'], TTableName>>
319-
: TDialect extends 'sqlite' ? SQLiteColumn<MakeColumnConfig<TBuilder['_'], TTableName>>
320-
: TDialect extends 'common' ? Column<MakeColumnConfig<TBuilder['_'], TTableName>>
316+
> = TDialect extends 'pg' ? PgColumn<
317+
MakeColumnConfig<TBuilder['_'], TTableName>,
318+
{},
319+
Simplify<Omit<TBuilder['_'], keyof MakeColumnConfig<TBuilder['_'], TTableName> | 'brand' | 'dialect'>>
320+
>
321+
: TDialect extends 'mysql' ? MySqlColumn<
322+
MakeColumnConfig<TBuilder['_'], TTableName>,
323+
{},
324+
Simplify<
325+
Omit<
326+
TBuilder['_'],
327+
| keyof MakeColumnConfig<TBuilder['_'], TTableName>
328+
| 'brand'
329+
| 'dialect'
330+
| 'primaryKeyHasDefault'
331+
| 'mysqlColumnBuilderBrand'
332+
>
333+
>
334+
>
335+
: TDialect extends 'sqlite' ? SQLiteColumn<
336+
MakeColumnConfig<TBuilder['_'], TTableName>,
337+
{},
338+
Simplify<Omit<TBuilder['_'], keyof MakeColumnConfig<TBuilder['_'], TTableName> | 'brand' | 'dialect'>>
339+
>
340+
: TDialect extends 'common' ? Column<
341+
MakeColumnConfig<TBuilder['_'], TTableName>,
342+
{},
343+
Simplify<Omit<TBuilder['_'], keyof MakeColumnConfig<TBuilder['_'], TTableName> | 'brand' | 'dialect'>>
344+
>
345+
: TDialect extends 'singlestore' ? SingleStoreColumn<
346+
MakeColumnConfig<TBuilder['_'], TTableName>,
347+
{},
348+
Simplify<
349+
Omit<
350+
TBuilder['_'],
351+
| keyof MakeColumnConfig<TBuilder['_'], TTableName>
352+
| 'brand'
353+
| 'dialect'
354+
| 'primaryKeyHasDefault'
355+
| 'singlestoreColumnBuilderBrand'
356+
>
357+
>
358+
>
321359
: never;
322360

323361
export type BuildIndexColumn<

drizzle-orm/src/mysql-core/columns/all.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import { mediumint } from './mediumint.ts';
1515
import { real } from './real.ts';
1616
import { serial } from './serial.ts';
1717
import { smallint } from './smallint.ts';
18-
import { text } from './text.ts';
18+
import { longtext, mediumtext, text, tinytext } from './text.ts';
1919
import { time } from './time.ts';
2020
import { timestamp } from './timestamp.ts';
2121
import { tinyint } from './tinyint.ts';
@@ -49,6 +49,9 @@ export function getMySqlColumnBuilders() {
4949
varbinary,
5050
varchar,
5151
year,
52+
longtext,
53+
mediumtext,
54+
tinytext,
5255
};
5356
}
5457

drizzle-orm/src/mysql-core/columns/char.ts

Lines changed: 31 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,30 @@ import type { AnyMySqlTable } from '~/mysql-core/table.ts';
55
import { getColumnNameAndConfig, type Writable } from '~/utils.ts';
66
import { MySqlColumn, MySqlColumnBuilder } from './common.ts';
77

8-
export type MySqlCharBuilderInitial<TName extends string, TEnum extends [string, ...string[]]> = MySqlCharBuilder<{
8+
export type MySqlCharBuilderInitial<
9+
TName extends string,
10+
TEnum extends [string, ...string[]],
11+
TLength extends number | undefined,
12+
> = MySqlCharBuilder<{
913
name: TName;
1014
dataType: 'string';
1115
columnType: 'MySqlChar';
1216
data: TEnum[number];
1317
driverParam: number | string;
1418
enumValues: TEnum;
19+
length: TLength;
1520
}>;
1621

17-
export class MySqlCharBuilder<T extends ColumnBuilderBaseConfig<'string', 'MySqlChar'>> extends MySqlColumnBuilder<
22+
export class MySqlCharBuilder<
23+
T extends ColumnBuilderBaseConfig<'string', 'MySqlChar'> & { length?: number | undefined },
24+
> extends MySqlColumnBuilder<
1825
T,
19-
MySqlCharConfig<T['enumValues']>
26+
MySqlCharConfig<T['enumValues'], T['length']>,
27+
{ length: T['length'] }
2028
> {
2129
static override readonly [entityKind]: string = 'MySqlCharBuilder';
2230

23-
constructor(name: T['name'], config: MySqlCharConfig<T['enumValues']>) {
31+
constructor(name: T['name'], config: MySqlCharConfig<T['enumValues'], T['length']>) {
2432
super(name, 'string', 'MySqlChar');
2533
this.config.length = config.length;
2634
this.config.enum = config.enum;
@@ -29,20 +37,20 @@ export class MySqlCharBuilder<T extends ColumnBuilderBaseConfig<'string', 'MySql
2937
/** @internal */
3038
override build<TTableName extends string>(
3139
table: AnyMySqlTable<{ name: TTableName }>,
32-
): MySqlChar<MakeColumnConfig<T, TTableName> & { enumValues: T['enumValues'] }> {
33-
return new MySqlChar<MakeColumnConfig<T, TTableName> & { enumValues: T['enumValues'] }>(
40+
): MySqlChar<MakeColumnConfig<T, TTableName> & { length: T['length']; enumValues: T['enumValues'] }> {
41+
return new MySqlChar<MakeColumnConfig<T, TTableName> & { length: T['length']; enumValues: T['enumValues'] }>(
3442
table,
3543
this.config as ColumnBuilderRuntimeConfig<any, any>,
3644
);
3745
}
3846
}
3947

40-
export class MySqlChar<T extends ColumnBaseConfig<'string', 'MySqlChar'>>
41-
extends MySqlColumn<T, MySqlCharConfig<T['enumValues']>>
48+
export class MySqlChar<T extends ColumnBaseConfig<'string', 'MySqlChar'> & { length?: number | undefined }>
49+
extends MySqlColumn<T, MySqlCharConfig<T['enumValues'], T['length']>, { length: T['length'] }>
4250
{
4351
static override readonly [entityKind]: string = 'MySqlChar';
4452

45-
readonly length: number | undefined = this.config.length;
53+
readonly length: T['length'] = this.config.length;
4654
override readonly enumValues = this.config.enum;
4755

4856
getSQLType(): string {
@@ -52,19 +60,25 @@ export class MySqlChar<T extends ColumnBaseConfig<'string', 'MySqlChar'>>
5260

5361
export interface MySqlCharConfig<
5462
TEnum extends readonly string[] | string[] | undefined = readonly string[] | string[] | undefined,
63+
TLength extends number | undefined = number | undefined,
5564
> {
56-
length?: number;
5765
enum?: TEnum;
66+
length?: TLength;
5867
}
5968

60-
export function char(): MySqlCharBuilderInitial<'', [string, ...string[]]>;
61-
export function char<U extends string, T extends Readonly<[U, ...U[]]>>(
62-
config?: MySqlCharConfig<T | Writable<T>>,
63-
): MySqlCharBuilderInitial<'', Writable<T>>;
64-
export function char<TName extends string, U extends string, T extends Readonly<[U, ...U[]]>>(
69+
export function char(): MySqlCharBuilderInitial<'', [string, ...string[]], undefined>;
70+
export function char<U extends string, T extends Readonly<[U, ...U[]]>, L extends number | undefined>(
71+
config?: MySqlCharConfig<T | Writable<T>, L>,
72+
): MySqlCharBuilderInitial<'', Writable<T>, L>;
73+
export function char<
74+
TName extends string,
75+
U extends string,
76+
T extends Readonly<[U, ...U[]]>,
77+
L extends number | undefined,
78+
>(
6579
name: TName,
66-
config?: MySqlCharConfig<T | Writable<T>>,
67-
): MySqlCharBuilderInitial<TName, Writable<T>>;
80+
config?: MySqlCharConfig<T | Writable<T>, L>,
81+
): MySqlCharBuilderInitial<TName, Writable<T>, L>;
6882
export function char(a?: string | MySqlCharConfig, b: MySqlCharConfig = {}): any {
6983
const { name, config } = getColumnNameAndConfig<MySqlCharConfig>(a, b);
7084
return new MySqlCharBuilder(name, config as any);

drizzle-orm/src/mysql-core/columns/common.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,8 +101,9 @@ export abstract class MySqlColumnBuilder<
101101
// To understand how to use `MySqlColumn` and `AnyMySqlColumn`, see `Column` and `AnyColumn` documentation.
102102
export abstract class MySqlColumn<
103103
T extends ColumnBaseConfig<ColumnDataType, string> = ColumnBaseConfig<ColumnDataType, string>,
104-
TRuntimeConfig extends object = object,
105-
> extends Column<T, TRuntimeConfig, { dialect: 'mysql' }> {
104+
TRuntimeConfig extends object = {},
105+
TTypeConfig extends object = {},
106+
> extends Column<T, TRuntimeConfig, TTypeConfig & { dialect: 'mysql' }> {
106107
static override readonly [entityKind]: string = 'MySqlColumn';
107108

108109
constructor(

drizzle-orm/src/mysql-core/columns/text.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ export class MySqlText<T extends ColumnBaseConfig<'string', 'MySqlText'>>
4141
{
4242
static override readonly [entityKind]: string = 'MySqlText';
4343

44-
private textType: MySqlTextColumnType = this.config.textType;
44+
readonly textType: MySqlTextColumnType = this.config.textType;
4545

4646
override readonly enumValues = this.config.enumValues;
4747

drizzle-orm/src/mysql-core/columns/varchar.ts

Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,24 +5,29 @@ import type { AnyMySqlTable } from '~/mysql-core/table.ts';
55
import { getColumnNameAndConfig, type Writable } from '~/utils.ts';
66
import { MySqlColumn, MySqlColumnBuilder } from './common.ts';
77

8-
export type MySqlVarCharBuilderInitial<TName extends string, TEnum extends [string, ...string[]]> = MySqlVarCharBuilder<
8+
export type MySqlVarCharBuilderInitial<
9+
TName extends string,
10+
TEnum extends [string, ...string[]],
11+
TLength extends number | undefined,
12+
> = MySqlVarCharBuilder<
913
{
1014
name: TName;
1115
dataType: 'string';
1216
columnType: 'MySqlVarChar';
1317
data: TEnum[number];
1418
driverParam: number | string;
1519
enumValues: TEnum;
20+
length: TLength;
1621
}
1722
>;
1823

19-
export class MySqlVarCharBuilder<T extends ColumnBuilderBaseConfig<'string', 'MySqlVarChar'>>
20-
extends MySqlColumnBuilder<T, MySqlVarCharConfig<T['enumValues']>>
21-
{
24+
export class MySqlVarCharBuilder<
25+
T extends ColumnBuilderBaseConfig<'string', 'MySqlVarChar'> & { length?: number | undefined },
26+
> extends MySqlColumnBuilder<T, MySqlVarCharConfig<T['enumValues'], T['length']>> {
2227
static override readonly [entityKind]: string = 'MySqlVarCharBuilder';
2328

2429
/** @internal */
25-
constructor(name: T['name'], config: MySqlVarCharConfig<T['enumValues']>) {
30+
constructor(name: T['name'], config: MySqlVarCharConfig<T['enumValues'], T['length']>) {
2631
super(name, 'string', 'MySqlVarChar');
2732
this.config.length = config.length;
2833
this.config.enum = config.enum;
@@ -31,16 +36,16 @@ export class MySqlVarCharBuilder<T extends ColumnBuilderBaseConfig<'string', 'My
3136
/** @internal */
3237
override build<TTableName extends string>(
3338
table: AnyMySqlTable<{ name: TTableName }>,
34-
): MySqlVarChar<MakeColumnConfig<T, TTableName> & { enumValues: T['enumValues'] }> {
35-
return new MySqlVarChar<MakeColumnConfig<T, TTableName> & { enumValues: T['enumValues'] }>(
39+
): MySqlVarChar<MakeColumnConfig<T, TTableName> & { length: T['length']; enumValues: T['enumValues'] }> {
40+
return new MySqlVarChar<MakeColumnConfig<T, TTableName> & { length: T['length']; enumValues: T['enumValues'] }>(
3641
table,
3742
this.config as ColumnBuilderRuntimeConfig<any, any>,
3843
);
3944
}
4045
}
4146

42-
export class MySqlVarChar<T extends ColumnBaseConfig<'string', 'MySqlVarChar'>>
43-
extends MySqlColumn<T, MySqlVarCharConfig<T['enumValues']>>
47+
export class MySqlVarChar<T extends ColumnBaseConfig<'string', 'MySqlVarChar'> & { length?: number | undefined }>
48+
extends MySqlColumn<T, MySqlVarCharConfig<T['enumValues'], T['length']>, { length: T['length'] }>
4449
{
4550
static override readonly [entityKind]: string = 'MySqlVarChar';
4651

@@ -55,18 +60,24 @@ export class MySqlVarChar<T extends ColumnBaseConfig<'string', 'MySqlVarChar'>>
5560

5661
export interface MySqlVarCharConfig<
5762
TEnum extends string[] | readonly string[] | undefined = string[] | readonly string[] | undefined,
63+
TLength extends number | undefined = number | undefined,
5864
> {
59-
length: number;
6065
enum?: TEnum;
66+
length?: TLength;
6167
}
6268

63-
export function varchar<U extends string, T extends Readonly<[U, ...U[]]>>(
64-
config: MySqlVarCharConfig<T | Writable<T>>,
65-
): MySqlVarCharBuilderInitial<'', Writable<T>>;
66-
export function varchar<TName extends string, U extends string, T extends Readonly<[U, ...U[]]>>(
69+
export function varchar<U extends string, T extends Readonly<[U, ...U[]]>, L extends number | undefined>(
70+
config: MySqlVarCharConfig<T | Writable<T>, L>,
71+
): MySqlVarCharBuilderInitial<'', Writable<T>, L>;
72+
export function varchar<
73+
TName extends string,
74+
U extends string,
75+
T extends Readonly<[U, ...U[]]>,
76+
L extends number | undefined,
77+
>(
6778
name: TName,
68-
config: MySqlVarCharConfig<T | Writable<T>>,
69-
): MySqlVarCharBuilderInitial<TName, Writable<T>>;
79+
config: MySqlVarCharConfig<T | Writable<T>, L>,
80+
): MySqlVarCharBuilderInitial<TName, Writable<T>, L>;
7081
export function varchar(a?: string | MySqlVarCharConfig, b?: MySqlVarCharConfig): any {
7182
const { name, config } = getColumnNameAndConfig<MySqlVarCharConfig>(a, b);
7283
return new MySqlVarCharBuilder(name, config as any);

drizzle-orm/src/pg-core/columns/char.ts

Lines changed: 35 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,30 @@ import type { AnyPgTable } from '~/pg-core/table.ts';
55
import { getColumnNameAndConfig, type Writable } from '~/utils.ts';
66
import { PgColumn, PgColumnBuilder } from './common.ts';
77

8-
export type PgCharBuilderInitial<TName extends string, TEnum extends [string, ...string[]]> = PgCharBuilder<{
8+
export type PgCharBuilderInitial<
9+
TName extends string,
10+
TEnum extends [string, ...string[]],
11+
TLength extends number | undefined,
12+
> = PgCharBuilder<{
913
name: TName;
1014
dataType: 'string';
1115
columnType: 'PgChar';
1216
data: TEnum[number];
1317
enumValues: TEnum;
1418
driverParam: string;
19+
length: TLength;
1520
}>;
1621

17-
export class PgCharBuilder<T extends ColumnBuilderBaseConfig<'string', 'PgChar'>> extends PgColumnBuilder<
18-
T,
19-
{ length: number | undefined; enumValues: T['enumValues'] }
20-
> {
22+
export class PgCharBuilder<T extends ColumnBuilderBaseConfig<'string', 'PgChar'> & { length?: number | undefined }>
23+
extends PgColumnBuilder<
24+
T,
25+
{ length: T['length']; enumValues: T['enumValues'] },
26+
{ length: T['length'] }
27+
>
28+
{
2129
static override readonly [entityKind]: string = 'PgCharBuilder';
2230

23-
constructor(name: T['name'], config: PgCharConfig<T['enumValues']>) {
31+
constructor(name: T['name'], config: PgCharConfig<T['enumValues'], T['length']>) {
2432
super(name, 'string', 'PgChar');
2533
this.config.length = config.length;
2634
this.config.enumValues = config.enum;
@@ -29,13 +37,16 @@ export class PgCharBuilder<T extends ColumnBuilderBaseConfig<'string', 'PgChar'>
2937
/** @internal */
3038
override build<TTableName extends string>(
3139
table: AnyPgTable<{ name: TTableName }>,
32-
): PgChar<MakeColumnConfig<T, TTableName>> {
33-
return new PgChar<MakeColumnConfig<T, TTableName>>(table, this.config as ColumnBuilderRuntimeConfig<any, any>);
40+
): PgChar<MakeColumnConfig<T, TTableName> & { length: T['length'] }> {
41+
return new PgChar<MakeColumnConfig<T, TTableName> & { length: T['length'] }>(
42+
table,
43+
this.config as ColumnBuilderRuntimeConfig<any, any>,
44+
);
3445
}
3546
}
3647

37-
export class PgChar<T extends ColumnBaseConfig<'string', 'PgChar'>>
38-
extends PgColumn<T, { length: number | undefined; enumValues: T['enumValues'] }>
48+
export class PgChar<T extends ColumnBaseConfig<'string', 'PgChar'> & { length?: number | undefined }>
49+
extends PgColumn<T, { length: T['length']; enumValues: T['enumValues'] }, { length: T['length'] }>
3950
{
4051
static override readonly [entityKind]: string = 'PgChar';
4152

@@ -49,19 +60,25 @@ export class PgChar<T extends ColumnBaseConfig<'string', 'PgChar'>>
4960

5061
export interface PgCharConfig<
5162
TEnum extends readonly string[] | string[] | undefined = readonly string[] | string[] | undefined,
63+
TLength extends number | undefined = number | undefined,
5264
> {
53-
length?: number;
5465
enum?: TEnum;
66+
length?: TLength;
5567
}
5668

57-
export function char(): PgCharBuilderInitial<'', [string, ...string[]]>;
58-
export function char<U extends string, T extends Readonly<[U, ...U[]]>>(
59-
config?: PgCharConfig<T | Writable<T>>,
60-
): PgCharBuilderInitial<'', Writable<T>>;
61-
export function char<TName extends string, U extends string, T extends Readonly<[U, ...U[]]>>(
69+
export function char(): PgCharBuilderInitial<'', [string, ...string[]], undefined>;
70+
export function char<U extends string, T extends Readonly<[U, ...U[]]>, L extends number | undefined>(
71+
config?: PgCharConfig<T | Writable<T>, L>,
72+
): PgCharBuilderInitial<'', Writable<T>, L>;
73+
export function char<
74+
TName extends string,
75+
U extends string,
76+
T extends Readonly<[U, ...U[]]>,
77+
L extends number | undefined,
78+
>(
6279
name: TName,
63-
config?: PgCharConfig<T | Writable<T>>,
64-
): PgCharBuilderInitial<TName, Writable<T>>;
80+
config?: PgCharConfig<T | Writable<T>, L>,
81+
): PgCharBuilderInitial<TName, Writable<T>, L>;
6582
export function char(a?: string | PgCharConfig, b: PgCharConfig = {}): any {
6683
const { name, config } = getColumnNameAndConfig<PgCharConfig>(a, b);
6784
return new PgCharBuilder(name, config as any);

0 commit comments

Comments
 (0)