Skip to content

Commit 0437a5c

Browse files
authored
Merge pull request #349 from drizzle-team/libsql
2 parents aa1a7a2 + 5722c66 commit 0437a5c

File tree

92 files changed

+6728
-2464
lines changed

Some content is hidden

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

92 files changed

+6728
-2464
lines changed

.npmrc

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1 @@
1-
recursive-install = true
21
prefer-workspace-packages = true

README.md

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -28,17 +28,17 @@ Drizzle ORM is being battle-tested on production projects by multiple teams 🚀
2828

2929
## Supported databases
3030

31-
| Database | Status | |
32-
|:------------|:-------:|:---|
33-
| PostgreSQL | | [Docs](./drizzle-orm/src/pg-core/README.md)|
34-
| MySQL | |[Docs](./drizzle-orm/src/mysql-core/README.md)|
35-
| SQLite | |[Docs](./drizzle-orm/src/sqlite-core/README.md)|
36-
| [Cloudflare D1](https://developers.cloudflare.com/d1) | | [Docs](./examples/cloudflare-d1/README.md) |
37-
| [libSQL](https://libsql.org) | | |
38-
| DynamoDB | | |
39-
| MS SQL | | |
40-
| CockroachDB | | |
41-
31+
| Database | Status | |
32+
|:------------------------------------------------------|:------:|:-----------------------------------------------|
33+
| PostgreSQL | | [Docs](/drizzle-orm/src/pg-core/README.md) |
34+
| MySQL | | [Docs](/drizzle-orm/src/mysql-core/README.md) |
35+
| SQLite | | [Docs](/drizzle-orm/src/sqlite-core/README.md) |
36+
| [Cloudflare D1](https://developers.cloudflare.com/d1) | | [Docs](/examples/cloudflare-d1/README.md) |
37+
| [libSQL](https://libsql.org) | | [Docs](/examples/libsql/README.md) |
38+
| [Turso](https://turso.tech) | | [Docs](/examples/libsql/README.md) |
39+
| DynamoDB | | |
40+
| MS SQL | | |
41+
| CockroachDB || |
4242

4343
## Installation
4444

changelogs/drizzle-orm/0.23.3.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
- 🎉 Added [libSQL](https://libsql.org/) support

changelogs/drizzle-zod/0.2.0.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
- 🎉 Added select schema support
2+
- 🎉 Added SQLite support
3+
- ❗ Changed imports from `drizzle-zod/pg` to `drizzle-zod` for all dialects

drizzle-orm/package.json

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "drizzle-orm",
3-
"version": "0.23.2",
3+
"version": "0.23.3",
44
"description": "Drizzle ORM package for SQL databases",
55
"scripts": {
66
"build": "tsc && resolve-tspaths && cp ../README.md package.json dist/",
@@ -35,6 +35,7 @@
3535
"peerDependencies": {
3636
"@aws-sdk/client-rds-data": ">=3",
3737
"@cloudflare/workers-types": ">=3",
38+
"@libsql/client": "*",
3839
"@neondatabase/serverless": ">=0.1",
3940
"@planetscale/database": ">=1",
4041
"@types/better-sqlite3": "*",
@@ -98,22 +99,26 @@
9899
},
99100
"kysely": {
100101
"optional": true
102+
},
103+
"@libsql/client": {
104+
"optional": true
101105
}
102106
},
103107
"devDependencies": {
104-
"@aws-sdk/client-rds-data": "^3.257.0",
105-
"@cloudflare/workers-types": "^3.18.0",
106-
"@neondatabase/serverless": "^0.1.13",
108+
"@aws-sdk/client-rds-data": "^3.303.0",
109+
"@cloudflare/workers-types": "^4.20230321.0",
110+
"@libsql/client": "^0.1.1",
111+
"@neondatabase/serverless": "^0.2.9",
107112
"@planetscale/database": "^1.5.0",
108113
"@types/better-sqlite3": "^7.6.2",
109-
"@types/node": "^18.11.9",
114+
"@types/node": "^18.15.11",
110115
"@types/pg": "^8.6.5",
111116
"@types/sql.js": "^1.4.4",
112-
"better-sqlite3": "^7.6.2",
113-
"bun-types": "^0.5.0",
117+
"better-sqlite3": "^8.0.0",
118+
"bun-types": "^0.5.8",
114119
"knex": "^2.4.2",
115-
"kysely": "^0.23.5",
116-
"mysql2": "^2.3.3",
120+
"kysely": "^0.24.2",
121+
"mysql2": "^3.2.0",
117122
"pg": "^8.8.0",
118123
"postgres": "^3.3.3",
119124
"sql.js": "^1.8.0",

drizzle-orm/src/aws-data-api/pg/migrator.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,9 @@ export async function migrate(db: AwsDataApiPgDatabase, config: string | Migrati
3030
!lastDbMigration
3131
|| parseInt(lastDbMigration.created_at, 10) < migration.folderMillis
3232
) {
33-
await session.executeWithTransaction(sql.raw(migration.sql), transactionId);
33+
for (const stmnt of migration.sql) {
34+
await session.executeWithTransaction(sql.raw(stmnt), transactionId);
35+
}
3436
await session.executeWithTransaction(
3537
sql`INSERT INTO "drizzle"."__drizzle_migrations" ("hash", "created_at") VALUES(${migration.hash}, ${migration.folderMillis})`,
3638
transactionId,

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import type { Query } from '~/sql';
55
import { fillPlaceholders } from '~/sql';
66
import type { SQLiteSyncDialect } from '~/sqlite-core/dialect';
77
import type { SelectedFieldsOrdered } from '~/sqlite-core/query-builders/select.types';
8-
import type { PreparedQueryConfig as PreparedQueryConfigBase } from '~/sqlite-core/session';
8+
import type { PreparedQueryConfig as PreparedQueryConfigBase, Transaction } from '~/sqlite-core/session';
99
import { PreparedQuery as PreparedQueryBase, SQLiteSession } from '~/sqlite-core/session';
1010
import { mapResultRow } from '~/utils';
1111

@@ -38,6 +38,10 @@ export class BetterSQLiteSession extends SQLiteSession<'sync', RunResult> {
3838
const stmt = this.client.prepare(query.sql);
3939
return new PreparedQuery(stmt, query.sql, query.params, this.logger, fields);
4040
}
41+
42+
override transaction(): Transaction<'sync', RunResult> {
43+
throw new Error('Method not implemented.');
44+
}
4145
}
4246

4347
export class PreparedQuery<T extends PreparedQueryConfig = PreparedQueryConfig> extends PreparedQueryBase<

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import type { Query } from '~/sql';
77
import { fillPlaceholders } from '~/sql';
88
import type { SQLiteSyncDialect } from '~/sqlite-core/dialect';
99
import type { SelectedFieldsOrdered } from '~/sqlite-core/query-builders/select.types';
10-
import type { PreparedQueryConfig as PreparedQueryConfigBase } from '~/sqlite-core/session';
10+
import type { PreparedQueryConfig as PreparedQueryConfigBase, Transaction } from '~/sqlite-core/session';
1111
import { PreparedQuery as PreparedQueryBase, SQLiteSession } from '~/sqlite-core/session';
1212
import { mapResultRow } from '~/utils';
1313

@@ -41,6 +41,10 @@ export class SQLiteBunSession extends SQLiteSession<'sync', void> {
4141
const stmt = this.client.prepare(query.sql);
4242
return new PreparedQuery(stmt, query.sql, query.params, this.logger, fields);
4343
}
44+
45+
override transaction(): Transaction<'sync', void> {
46+
throw new Error('Method not implemented.');
47+
}
4448
}
4549

4650
export class PreparedQuery<T extends PreparedQueryConfig = PreparedQueryConfig> extends PreparedQueryBase<

drizzle-orm/src/column-builder.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ export interface ColumnBuilderHKTBase {
4040

4141
export type ColumnBuilderKind<
4242
THKT extends ColumnBuilderHKTBase,
43-
TConfig extends Partial<ColumnBuilderBaseConfig>,
43+
TConfig extends ColumnBuilderBaseConfig,
4444
> = (THKT & {
4545
config: TConfig;
4646
})['_type'];
@@ -114,7 +114,7 @@ export abstract class ColumnBuilder<
114114
export type AnyColumnBuilder = ColumnBuilder<ColumnBuilderHKT, ColumnBuilderBaseConfig>;
115115

116116
export type UpdateCBConfig<
117-
T extends Partial<ColumnBuilderBaseConfig>,
117+
T extends ColumnBuilderBaseConfig,
118118
TUpdate extends Partial<ColumnBuilderBaseConfig>,
119119
> = Update<T, TUpdate>;
120120

drizzle-orm/src/column.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ export interface ColumnHKTBase {
1717
_type: unknown;
1818
}
1919

20-
export type ColumnKind<T extends ColumnHKTBase, TConfig extends Partial<ColumnBaseConfig>> = (T & {
20+
export type ColumnKind<T extends ColumnHKTBase, TConfig extends ColumnBaseConfig> = (T & {
2121
config: TConfig;
2222
})['_type'];
2323

@@ -79,7 +79,7 @@ export abstract class Column<
7979
}
8080
}
8181

82-
export type UpdateColConfig<T extends Partial<ColumnBaseConfig>, TUpdate extends Partial<ColumnBaseConfig>> = Update<
82+
export type UpdateColConfig<T extends ColumnBaseConfig, TUpdate extends Partial<ColumnBaseConfig>> = Update<
8383
T,
8484
TUpdate
8585
>;

drizzle-orm/src/d1/session.ts

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import type { Query } from '~/sql';
66
import { fillPlaceholders } from '~/sql';
77
import type { SQLiteAsyncDialect } from '~/sqlite-core/dialect';
88
import type { SelectedFieldsOrdered } from '~/sqlite-core/query-builders/select.types';
9-
import type { PreparedQueryConfig as PreparedQueryConfigBase } from '~/sqlite-core/session';
9+
import { type PreparedQueryConfig as PreparedQueryConfigBase, Transaction } from '~/sqlite-core/session';
1010
import { PreparedQuery as PreparedQueryBase, SQLiteSession } from '~/sqlite-core/session';
1111
import { mapResultRow } from '~/utils';
1212

@@ -28,17 +28,25 @@ export class SQLiteD1Session extends SQLiteSession<'async', D1Result> {
2828
this.logger = options.logger ?? new NoopLogger();
2929
}
3030

31-
exec(query: string): void {
32-
throw Error('To implement: D1 migrator');
33-
// await this.client.exec(query.sql);
34-
}
35-
3631
prepareQuery(query: Query, fields?: SelectedFieldsOrdered): PreparedQuery {
3732
const stmt = this.client.prepare(query.sql);
3833
return new PreparedQuery(stmt, query.sql, query.params, this.logger, fields);
3934
}
35+
36+
override async transaction(transaction: (tx: D1Transaction) => void | Promise<void>): Promise<void> {
37+
await this.client.exec('begin');
38+
try {
39+
await transaction(new D1Transaction(this));
40+
await this.client.exec('commit');
41+
} catch (err) {
42+
await this.client.exec('rollback');
43+
throw err;
44+
}
45+
}
4046
}
4147

48+
export class D1Transaction extends Transaction<'async', D1Result> {}
49+
4250
export class PreparedQuery<T extends PreparedQueryConfig = PreparedQueryConfig> extends PreparedQueryBase<
4351
{ type: 'async'; run: D1Result; all: T['all']; get: T['get']; values: T['values'] }
4452
> {

drizzle-orm/src/libsql/driver.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import type { Client, ResultSet } from '@libsql/client';
2+
import type { Logger } from '~/logger';
3+
import { DefaultLogger } from '~/logger';
4+
import { BaseSQLiteDatabase } from '~/sqlite-core/db';
5+
import { SQLiteAsyncDialect } from '~/sqlite-core/dialect';
6+
import { LibSQLSession } from './session';
7+
8+
export interface DrizzleConfig {
9+
logger?: boolean | Logger;
10+
}
11+
12+
export type LibSQLDatabase = BaseSQLiteDatabase<'async', ResultSet>;
13+
14+
export function drizzle(client: Client, config: DrizzleConfig = {}): LibSQLDatabase {
15+
const dialect = new SQLiteAsyncDialect();
16+
let logger;
17+
if (config.logger === true) {
18+
logger = new DefaultLogger();
19+
} else if (config.logger !== false) {
20+
logger = config.logger;
21+
}
22+
const session = new LibSQLSession(client, dialect, { logger });
23+
return new BaseSQLiteDatabase(dialect, session);
24+
}

drizzle-orm/src/libsql/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export * from './driver';
2+
export * from './session';

drizzle-orm/src/libsql/migrator.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import type { MigrationConfig } from '~/migrator';
2+
import { readMigrationFiles } from '~/migrator';
3+
import type { LibSQLDatabase } from './driver';
4+
5+
export function migrate(db: LibSQLDatabase, config: MigrationConfig) {
6+
const migrations = readMigrationFiles(config);
7+
return db.dialect.migrate(migrations, db.session);
8+
}

0 commit comments

Comments
 (0)