Skip to content

Commit 5c6c4cd

Browse files
authored
Merge pull request #368 from drizzle-team/beta
2 parents 67cfc7d + 65b5b5a commit 5c6c4cd

Some content is hidden

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

86 files changed

+2803
-250
lines changed

changelogs/drizzle-orm/0.23.5.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
- 🐛 Various minor bugfixes

drizzle-orm/package.json

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
{
22
"name": "drizzle-orm",
3-
"version": "0.23.4",
3+
"version": "0.23.5",
44
"description": "Drizzle ORM package for SQL databases",
55
"scripts": {
66
"build": "tsc && resolve-tspaths && cp ../README.md package.json dist/",
7-
"test:types": "cd tests && tsc",
7+
"test:types": "cd type-tests && tsc",
8+
"test": "vitest run",
89
"pack": "cp package.json dist/ && (cd dist && npm pack --pack-destination ..) && rm -f package.tgz && mv *.tgz package.tgz",
910
"publish": "npm publish package.tgz"
1011
},
@@ -109,6 +110,7 @@
109110
"@cloudflare/workers-types": "^4.20230321.0",
110111
"@libsql/client": "^0.1.1",
111112
"@neondatabase/serverless": "^0.2.9",
113+
"@originjs/vite-plugin-commonjs": "^1.0.3",
112114
"@planetscale/database": "^1.5.0",
113115
"@types/better-sqlite3": "^7.6.2",
114116
"@types/node": "^18.15.11",
@@ -122,6 +124,8 @@
122124
"pg": "^8.8.0",
123125
"postgres": "^3.3.3",
124126
"sql.js": "^1.8.0",
125-
"sqlite3": "^5.1.2"
127+
"sqlite3": "^5.1.2",
128+
"vite-tsconfig-paths": "^4.0.7",
129+
"vitest": "^0.29.8"
126130
}
127131
}

drizzle-orm/src/better-sqlite3/session.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,10 @@ export class PreparedQuery<T extends PreparedQueryConfig = PreparedQueryConfig>
8585

8686
const value = this.stmt.raw().get(...params);
8787

88+
if (!value) {
89+
return undefined;
90+
}
91+
8892
return mapResultRow(fields, value, this.joinsNotNullableMap);
8993
}
9094

drizzle-orm/src/bun-sqlite/session.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,10 @@ export class PreparedQuery<T extends PreparedQueryConfig = PreparedQueryConfig>
8282
this.logger.logQuery(this.queryString, params);
8383
const value = this.stmt.get(...params);
8484

85+
if (!value) {
86+
return undefined;
87+
}
88+
8589
const { fields } = this;
8690
if (!fields) {
8791
return value;

drizzle-orm/src/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
export * from './column';
22
export * from './logger';
3-
export { param, sql } from './sql';
3+
export * from './sql';
44
export * from './table';

drizzle-orm/src/kysely/index.ts

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,26 @@
11
import type { ColumnType } from 'kysely';
2-
import type { InferModel, Table } from '~/table';
3-
import type { Assume, Simplify } from '~/utils';
2+
import type { InferModel, MapColumnName, Table } from '~/table';
3+
import type { Simplify } from '~/utils';
44

55
export type Kyselify<T extends Table> = Simplify<
66
{
7-
[Key in keyof T['_']['columns']]: ColumnType<
8-
InferModel<
9-
T,
10-
'select',
11-
{ dbColumnNames: true }
12-
>[Assume<Key, keyof InferModel<T, 'select', { dbColumnNames: true }>>],
13-
InferModel<
7+
[Key in keyof T['_']['columns'] & string as MapColumnName<Key, T['_']['columns'][Key], true>]: ColumnType<
8+
// select
9+
InferModel<T, 'select', { dbColumnNames: true }>[MapColumnName<Key, T['_']['columns'][Key], true>],
10+
// insert
11+
MapColumnName<Key, T['_']['columns'][Key], true> extends keyof InferModel<
1412
T,
1513
'insert',
1614
{ dbColumnNames: true }
17-
>[Assume<Key, keyof InferModel<T, 'insert', { dbColumnNames: true }>>],
18-
InferModel<
15+
> ? InferModel<T, 'insert', { dbColumnNames: true }>[MapColumnName<Key, T['_']['columns'][Key], true>]
16+
: never,
17+
// update
18+
MapColumnName<Key, T['_']['columns'][Key], true> extends keyof InferModel<
1919
T,
2020
'insert',
2121
{ dbColumnNames: true }
22-
>[Assume<Key, keyof InferModel<T, 'insert', { dbColumnNames: true }>>]
22+
> ? InferModel<T, 'insert', { dbColumnNames: true }>[MapColumnName<Key, T['_']['columns'][Key], true>]
23+
: never
2324
>;
2425
}
2526
>;

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

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -90,20 +90,13 @@ interface MySqlBigIntConfig<T extends 'number' | 'bigint' = 'number' | 'bigint'>
9090
mode: T;
9191
}
9292

93-
export function bigint<TName extends string>(
93+
export function bigint<TName extends string, TMode extends MySqlBigIntConfig['mode']>(
9494
name: TName,
95-
config: MySqlBigIntConfig<'number'>,
96-
): MySqlBigInt53BuilderInitial<TName>;
97-
export function bigint<TName extends string>(
98-
name: TName,
99-
config: MySqlBigIntConfig<'bigint'>,
100-
): MySqlBigInt64BuilderInitial<TName>;
101-
export function bigint<TName extends string>(
102-
name: TName,
103-
config: MySqlBigIntConfig,
104-
): MySqlBigInt53BuilderInitial<TName> | MySqlBigInt64BuilderInitial<TName> {
95+
config: MySqlBigIntConfig<TMode>,
96+
): TMode extends 'number' ? MySqlBigInt53BuilderInitial<TName> : MySqlBigInt64BuilderInitial<TName>;
97+
export function bigint(name: string, config: MySqlBigIntConfig) {
10598
if (config.mode === 'number') {
106-
return new MySqlBigInt53Builder<MySqlBigInt53BuilderInitial<TName>['_']['config']>(name);
99+
return new MySqlBigInt53Builder(name);
107100
}
108-
return new MySqlBigInt64Builder<MySqlBigInt64BuilderInitial<TName>['_']['config']>(name);
101+
return new MySqlBigInt64Builder(name);
109102
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ export class MySqlCustomColumnBuilder<T extends ColumnBuilderBaseConfig> extends
6060
}
6161

6262
export class MySqlCustomColumn<T extends ColumnBaseConfig> extends MySqlColumn<MySqlCustomColumnHKT, T> {
63+
declare protected $mysqlColumnBrand: 'MySqlCustomColumn';
64+
6365
private sqlName: string;
6466
private mapTo?: (value: T['data']) => T['driverParam'];
6567
private mapFrom?: (value: T['driverParam']) => T['data'];

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

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import type { ColumnBaseConfig, ColumnHKTBase } from '~/column';
22
import type { ColumnBuilderBaseConfig, ColumnBuilderHKTBase, MakeColumnConfig } from '~/column-builder';
33
import type { AnyMySqlTable } from '~/mysql-core/table';
4-
import type { Assume } from '~/utils';
4+
import type { Assume, Equal } from '~/utils';
55
import { MySqlColumn, MySqlColumnBuilder } from './common';
66

77
export interface MySqlDateBuilderHKT extends ColumnBuilderHKTBase {
@@ -88,14 +88,16 @@ export class MySqlDateString<T extends ColumnBaseConfig> extends MySqlColumn<MyS
8888
}
8989
}
9090

91-
export function date<TName extends string>(name: TName): MySqlDateBuilderInitial<TName>;
92-
export function date<TName extends string>(
91+
export interface MySqlDateConfig<TMode extends 'date' | 'string' = 'date' | 'string'> {
92+
mode?: TMode;
93+
}
94+
95+
export function date<TName extends string, TMode extends MySqlDateConfig['mode'] & {}>(
9396
name: TName,
94-
config: { mode: 'string' },
95-
): MySqlDateStringBuilderInitial<TName>;
96-
export function date<TName extends string>(name: TName, config: { mode: 'date' }): MySqlDateBuilderInitial<TName>;
97-
export function date<TName extends string>(name: TName, config?: { mode?: 'date' | 'string' }) {
98-
if (config?.mode === 'string') {
97+
config?: MySqlDateConfig<TMode>,
98+
): Equal<TMode, 'string'> extends true ? MySqlDateStringBuilderInitial<TName> : MySqlDateBuilderInitial<TName>;
99+
export function date(name: string, config: MySqlDateConfig = {}) {
100+
if (config.mode === 'string') {
99101
return new MySqlDateStringBuilder(name);
100102
}
101103
return new MySqlDateBuilder(name);

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

Lines changed: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import type { ColumnBaseConfig, ColumnHKTBase } from '~/column';
22
import type { ColumnBuilderBaseConfig, ColumnBuilderHKTBase, MakeColumnConfig } from '~/column-builder';
33
import type { AnyMySqlTable } from '~/mysql-core/table';
4-
import type { Assume } from '~/utils';
4+
import type { Assume, Equal } from '~/utils';
55
import { MySqlColumn, MySqlColumnBuilder } from './common';
66

77
export interface MySqlDateTimeBuilderHKT extends ColumnBuilderHKTBase {
@@ -24,9 +24,9 @@ export type MySqlDateTimeBuilderInitial<TName extends string> = MySqlDateTimeBui
2424
export class MySqlDateTimeBuilder<T extends ColumnBuilderBaseConfig> extends MySqlColumnBuilder<
2525
MySqlDateTimeBuilderHKT,
2626
T,
27-
DatetimeConfig
27+
MySqlDatetimeConfig
2828
> {
29-
constructor(name: T['name'], config: DatetimeConfig | undefined) {
29+
constructor(name: T['name'], config: MySqlDatetimeConfig | undefined) {
3030
super(name);
3131
this.config.fsp = config?.fsp;
3232
}
@@ -82,9 +82,9 @@ export type MySqlDateTimeStringBuilderInitial<TName extends string> = MySqlDateT
8282
export class MySqlDateTimeStringBuilder<T extends ColumnBuilderBaseConfig> extends MySqlColumnBuilder<
8383
MySqlDateTimeStringBuilderHKT,
8484
T,
85-
DatetimeConfig
85+
MySqlDatetimeConfig
8686
> {
87-
constructor(name: T['name'], config: DatetimeConfig | undefined) {
87+
constructor(name: T['name'], config: MySqlDatetimeConfig | undefined) {
8888
super(name);
8989
this.config.fsp = config?.fsp;
9090
}
@@ -118,24 +118,17 @@ export class MySqlDateTimeString<
118118

119119
export type DatetimeFsp = 0 | 1 | 2 | 3 | 4 | 5 | 6;
120120

121-
export interface DatetimeConfig {
121+
export interface MySqlDatetimeConfig<TMode extends 'date' | 'string' = 'date' | 'string'> {
122+
mode?: TMode;
122123
fsp?: DatetimeFsp;
123124
}
124125

125-
export function datetime<TName extends string>(name: TName): MySqlDateTimeBuilderInitial<TName>;
126-
export function datetime<TName extends string>(
126+
export function datetime<TName extends string, TMode extends MySqlDatetimeConfig['mode'] & {}>(
127127
name: TName,
128-
config: { mode: 'string' } & DatetimeConfig,
129-
): MySqlDateTimeStringBuilderInitial<TName>;
130-
export function datetime<TName extends string>(
131-
name: TName,
132-
config: { mode?: 'date' } & DatetimeConfig,
133-
): MySqlDateTimeBuilderInitial<TName>;
134-
export function datetime<TName extends string>(
135-
name: TName,
136-
config?: { mode?: 'date' | 'string' } & DatetimeConfig,
137-
) {
138-
if (config?.mode === 'string') {
128+
config?: MySqlDatetimeConfig<TMode>,
129+
): Equal<TMode, 'string'> extends true ? MySqlDateTimeStringBuilderInitial<TName> : MySqlDateTimeBuilderInitial<TName>;
130+
export function datetime(name: string, config: MySqlDatetimeConfig = {}) {
131+
if (config.mode === 'string') {
139132
return new MySqlDateTimeStringBuilder(name, config);
140133
}
141134
return new MySqlDateTimeBuilder(name, config);

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

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import type { ColumnBaseConfig, ColumnHKTBase } from '~/column';
22
import type { ColumnBuilderBaseConfig, ColumnBuilderHKTBase, MakeColumnConfig } from '~/column-builder';
33
import type { AnyMySqlTable } from '~/mysql-core/table';
4-
import type { Assume } from '~/utils';
4+
import type { Assume, Equal } from '~/utils';
55
import { MySqlDateBaseColumn, MySqlDateColumnBaseBuilder } from './date.common';
66

77
export interface MySqlTimestampBuilderHKT extends ColumnBuilderHKTBase {
@@ -102,24 +102,18 @@ export class MySqlTimestampString<T extends ColumnBaseConfig>
102102

103103
export type TimestampFsp = 0 | 1 | 2 | 3 | 4 | 5 | 6;
104104

105-
export interface MySqlTimestampConfig {
105+
export interface MySqlTimestampConfig<TMode extends 'string' | 'date' = 'string' | 'date'> {
106+
mode?: TMode;
106107
fsp?: TimestampFsp;
107108
}
108109

109-
export function timestamp<TName extends string>(name: TName): MySqlTimestampBuilderInitial<TName>;
110-
export function timestamp<TName extends string>(
110+
export function timestamp<TName extends string, TMode extends MySqlTimestampConfig['mode'] & {}>(
111111
name: TName,
112-
config: { mode: 'string'; fsp?: TimestampFsp },
113-
): MySqlTimestampStringBuilderInitial<TName>;
114-
export function timestamp<TName extends string>(
115-
name: TName,
116-
config: { mode?: 'date'; fsp?: TimestampFsp },
117-
): MySqlTimestampBuilderInitial<TName>;
118-
export function timestamp<TName extends string>(
119-
name: TName,
120-
config?: { mode?: 'date' | 'string'; fsp?: TimestampFsp },
121-
) {
122-
if (config?.mode === 'string') {
112+
config?: MySqlTimestampConfig<TMode>,
113+
): Equal<TMode, 'string'> extends true ? MySqlTimestampStringBuilderInitial<TName>
114+
: MySqlTimestampBuilderInitial<TName>;
115+
export function timestamp(name: string, config: MySqlTimestampConfig = {}) {
116+
if (config.mode === 'string') {
123117
return new MySqlTimestampStringBuilder(name, config);
124118
}
125119
return new MySqlTimestampBuilder(name, config);

drizzle-orm/src/mysql-core/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,7 @@ export * from './primary-keys';
99
export * from './query-builders';
1010
export * from './schema';
1111
export * from './session';
12+
export * from './subquery';
1213
export * from './table';
14+
export * from './utils';
1315
export * from './view';

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

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import type {
88
} from '~/column-builder';
99
import type { AnyPgTable } from '~/pg-core/table';
1010
import type { Assume } from '~/utils';
11+
import { makePgArray, parsePgArray } from '../utils';
1112
import { type AnyPgColumn, PgColumn, PgColumnBuilder, type PgColumnBuilderHKT } from './common';
1213

1314
export interface PgArrayBuilderHKT extends ColumnBuilderHKTBase {
@@ -73,6 +74,8 @@ export class PgArray<T extends ColumnBaseConfig> extends PgColumn<PgArrayHKT, T,
7374
>
7475
>;
7576
}> {
77+
declare protected $pgColumnBrand: 'PgArray';
78+
7679
readonly size: number | undefined;
7780

7881
constructor(
@@ -89,11 +92,16 @@ export class PgArray<T extends ColumnBaseConfig> extends PgColumn<PgArrayHKT, T,
8992
return `${this.baseColumn.getSQLType()}[${typeof this.size === 'number' ? this.size : ''}]`;
9093
}
9194

92-
override mapFromDriverValue(value: unknown[]): T['data'] {
95+
override mapFromDriverValue(value: unknown[] | string): T['data'] {
96+
if (typeof value === 'string') {
97+
// Thank you node-postgres for not parsing enum arrays
98+
value = parsePgArray(value);
99+
}
93100
return value.map((v) => this.baseColumn.mapFromDriverValue(v));
94101
}
95102

96-
override mapToDriverValue(value: unknown[]): T['driverParam'] {
97-
return value.map((v) => v === null ? null : this.baseColumn.mapToDriverValue(v));
103+
override mapToDriverValue(value: unknown[]): string {
104+
const a = value.map((v) => v === null ? null : this.baseColumn.mapToDriverValue(v));
105+
return makePgArray(a);
98106
}
99107
}

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

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -84,18 +84,11 @@ interface PgBigIntConfig<T extends 'number' | 'bigint' = 'number' | 'bigint'> {
8484
mode: T;
8585
}
8686

87-
export function bigint<TName extends string, TMode extends 'number' | 'bigint'>(
87+
export function bigint<TName extends string, TMode extends PgBigIntConfig['mode']>(
8888
name: TName,
8989
config: PgBigIntConfig<TMode>,
90-
): PgBigInt53BuilderInitial<TName>;
91-
export function bigint<TName extends string>(
92-
name: TName,
93-
config: PgBigIntConfig<'bigint'>,
94-
): PgBigInt64BuilderInitial<TName>;
95-
export function bigint<TName extends string>(
96-
name: TName,
97-
config: PgBigIntConfig,
98-
) {
90+
): TMode extends 'number' ? PgBigInt53BuilderInitial<TName> : PgBigInt64BuilderInitial<TName>;
91+
export function bigint(name: string, config: PgBigIntConfig) {
9992
if (config.mode === 'number') {
10093
return new PgBigInt53Builder(name);
10194
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ export abstract class PgColumnBuilder<
4040
notNull: NonNullable<T['notNull']>;
4141
hasDefault: NonNullable<T['hasDefault']>;
4242
data: T['data'][];
43-
driverParam: T['driverParam'][];
43+
driverParam: T['driverParam'][] | string;
4444
}
4545
> {
4646
// Required to avoid circular dependency

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ export class PgCustomColumnBuilder<T extends ColumnBuilderBaseConfig> extends Pg
6060
}
6161

6262
export class PgCustomColumn<T extends ColumnBaseConfig> extends PgColumn<PgCustomColumnHKT, T> {
63+
declare protected $pgColumnBrand: 'PgCustomColumn';
64+
6365
private sqlName: string;
6466
private mapTo?: (value: T['data']) => T['driverParam'];
6567
private mapFrom?: (value: T['driverParam']) => T['data'];

drizzle-orm/src/pg-core/columns/date.common.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ import { PgColumnBuilder } from './common';
66
export abstract class PgDateColumnBaseBuilder<
77
THKT extends ColumnBuilderHKTBase,
88
T extends ColumnBuilderBaseConfig,
9-
TConfig extends Record<string, unknown> = {},
10-
> extends PgColumnBuilder<THKT, T, TConfig> {
9+
TRuntimeConfig extends object = {},
10+
> extends PgColumnBuilder<THKT, T, TRuntimeConfig> {
1111
defaultNow() {
1212
return this.default(sql`now()`);
1313
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ export class PgJsonBuilder<T extends ColumnBuilderBaseConfig> extends PgColumnBu
3434
}
3535

3636
export class PgJson<T extends ColumnBaseConfig> extends PgColumn<PgJsonHKT, T> {
37+
declare protected $pgColumnBrand: 'PgJson';
38+
3739
constructor(table: AnyPgTable<{ name: T['tableName'] }>, config: PgJsonBuilder<T>['config']) {
3840
super(table, config);
3941
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ export class PgJsonbBuilder<T extends ColumnBuilderBaseConfig> extends PgColumnB
3131
}
3232

3333
export class PgJsonb<T extends ColumnBaseConfig> extends PgColumn<PgJsonbHKT, T> {
34+
declare protected $pgColumnBrand: 'PgJsonb';
35+
3436
constructor(table: AnyPgTable<{ name: T['tableName'] }>, config: PgJsonbBuilder<T>['config']) {
3537
super(table, config);
3638
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ export class PgNumeric<T extends ColumnBaseConfig> extends PgColumn<PgNumericHKT
6565
}
6666

6767
export function numeric<TName extends string>(
68-
name: string,
68+
name: TName,
6969
config?:
7070
| { precision: number; scale?: number }
7171
| { precision?: number; scale: number }

0 commit comments

Comments
 (0)