driftsql 0.0.1 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c)
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,83 +1,187 @@
1
- # Drift SQL
1
+ # DriftSQL
2
2
 
3
- Driftsql is a SQL client for libsql and sqlitecloud to provide a simple & fast way to query your data.
3
+ <!-- automd:badges color=yellow -->
4
4
 
5
- ## Installation
5
+ [![npm version](https://img.shields.io/npm/v/driftsql?color=yellow)](https://npmjs.com/package/driftsql)
6
+ [![npm downloads](https://img.shields.io/npm/dm/driftsql?color=yellow)](https://npm.chart.dev/driftsql)
6
7
 
7
- ```bash
8
- bun add driftsql # or npm install driftsql
9
- ```
8
+ <!-- /automd -->
9
+
10
+ A lightweight SQL client for TypeScript, supporting multiple databases like PostgreSQL, LibSQL, and HTTP-based database services. DriftSQL provides a unified, type-safe interface for database operations across different database drivers.
11
+
12
+ ## Features
13
+
14
+ - 🔐 Type-safe database operations with TypeScript generics
15
+ - 🛡️ SQL injection protection with parameterized queries
16
+ - 🚀 Multiple driver support (PostgreSQL, LibSQL, HTTP)
17
+ - 📝 Auto-completion support for database schema types
18
+ - ⚡ Built-in error handling and connection management
19
+ - 🔄 Unified API across different database types
20
+
21
+ ## Supported Drivers
22
+
23
+ - **PostgreSQL** - Native PostgreSQL driver via `pg`
24
+ - **LibSQL** - SQLite-compatible databases via `@libsql/client`
25
+ - **HTTP** - HTTP-based database services
10
26
 
11
27
  ## Usage
12
28
 
13
- For now docs are is very basic, but I will add more soon.
29
+ Install the package:
30
+
31
+ ```sh
32
+ # ✨ Auto-detect (supports npm, yarn, pnpm, deno and bun)
33
+ npx nypm install driftsql
34
+ ```
14
35
 
15
- Setup client:
36
+ Import and use:
16
37
 
17
- ```ts
18
- import { DriftClient } from 'driftsql';
38
+ <!-- automd:jsimport cdn name="driftsql" -->
19
39
 
20
- const db = new DriftClient({
21
- driver: 'libsql', // More drivers coming soon
22
- auth: {
23
- url: 'libsql://',
24
- token: 'your-token',
25
- },
26
- });
40
+ **ESM** (Node.js, Bun, Deno)
41
+
42
+ ```js
43
+ import { DriftSQLClient } from 'driftsql'
27
44
  ```
28
45
 
29
- ### Type-safety
46
+ <!-- /automd -->
47
+
48
+ ## Quick Start
30
49
 
31
- You can add an type to your database client to get type-safety and autocompletion. Example:
50
+ ### Define Your Database Schema
51
+
52
+ ```typescript
53
+ import { DriftSQLClient } from 'driftsql'
54
+
55
+ // Define your database schema types
56
+ interface User {
57
+ id: number
58
+ name: string
59
+ email: string
60
+ created_at: string
61
+ }
32
62
 
33
- ```ts
34
- import { DriftClient } from 'driftsql';
63
+ interface Post {
64
+ id: number
65
+ title: string
66
+ content: string | null
67
+ user_id: number | null
68
+ published: boolean
69
+ created_at: Date
70
+ updated_at: Date
71
+ }
35
72
 
36
- interface Database {
37
- users: {
38
- id: number;
39
- name: string;
40
- email: string;
41
- password: string;
42
- created_at: string;
43
- };
73
+ // Define your database schema
74
+ interface MyDatabase {
75
+ users: User
76
+ posts: Post
44
77
  }
78
+ ```
79
+
80
+ ### Initialize with PostgreSQL
81
+
82
+ ```typescript
83
+ const db = new DriftSQLClient<MyDatabase>({
84
+ drivers: {
85
+ postgres: {
86
+ connectionString: 'postgresql://user:password@localhost:5432/mydb',
87
+ // or individual options:
88
+ // host: 'localhost',
89
+ // port: 5432,
90
+ // database: 'mydb',
91
+ // user: 'user',
92
+ // password: 'password'
93
+ },
94
+ },
95
+ })
96
+ ```
97
+
98
+ ### Initialize with LibSQL
99
+
100
+ ```typescript
101
+ const db = new DriftSQLClient<MyDatabase>({
102
+ drivers: {
103
+ libsql: {
104
+ url: 'file:local.db',
105
+ // or for remote:
106
+ // url: 'libsql://your-database.turso.io',
107
+ // authToken: 'your-auth-token'
108
+ },
109
+ },
110
+ })
111
+ ```
112
+
113
+ ### Initialize with HTTP
45
114
 
46
- const db = new DriftClient<Database>({
47
- driver: 'libsql',
48
- auth: {
49
- url: 'libsql://',
50
- token: 'your-token',
115
+ ```typescript
116
+ const db = new DriftSQLClient<MyDatabase>({
117
+ url: 'https://your-database-api.com',
118
+ password: 'your-bearer-token',
119
+ options: {
120
+ defaultTimeout: 5000, // optional, defaults to 5000ms
51
121
  },
52
- });
122
+ })
53
123
  ```
54
124
 
55
- Now you can query your database with a developer-friendly api inspired by Prisma.
125
+ ### Database Operations
56
126
 
57
- ```ts
58
- // Find all users
59
- // in every find method, you can pass a where object to filter the results
60
- const users = await db.findMany({ table: 'users' });
127
+ ```typescript
128
+ // Raw SQL queries
129
+ const users = await db.query<User>('SELECT * FROM users WHERE active = $1', [true])
130
+ console.log(users.rows)
61
131
 
62
- // Find a single user
63
- const user = await db.findOne({ table: 'users', id: 1 });
132
+ // Find operations
133
+ const user = await db.findFirst('users', { email: 'user@example.com' })
134
+ const activeUsers = await db.findMany('users', { active: true })
64
135
 
65
- // Find the first user
66
- const user = await db.findFirst({ table: 'users', where: { id: 1 } });
136
+ // Insert operations
137
+ const newUser = await db.insert('users', {
138
+ name: 'John Doe',
139
+ email: 'john@example.com',
140
+ })
67
141
 
68
- // Create a new user
69
- const user = await db.create({ table: 'users', data: { name: 'John Doe', email: 'john@doe.com', password: 'password' } });
142
+ // Update operations
143
+ const updatedUser = await db.update('users', { name: 'Jane Doe' }, { id: 1 })
70
144
 
71
- // Update a user
72
- const user = await db.update({ table: 'users', where: { id: 1 }, data: { name: 'John Doe' } });
145
+ // Delete operations
146
+ const deleted = await db.delete('users', { id: 1 })
73
147
 
74
- // Delete a user
75
- const user = await db.delete({ table: 'users', where: { id: 1 } });
148
+ // Check server status (HTTP only)
149
+ const status = await db.status()
150
+ console.log(`Database OK: ${status.ok}, Ping: ${status.ping}ms`)
76
151
 
77
- // Delete many users
78
- const users = await db.deleteMany({ table: 'users', where: { id: [1, 2, 3] } });
152
+ // Clean up connections
153
+ await db.close()
79
154
  ```
80
155
 
156
+ ### Constructor Options
157
+
158
+ ```typescript
159
+ interface ClientOptions {
160
+ url?: string // HTTP server URL (for HTTP driver)
161
+ password?: string // Bearer token for HTTP authentication
162
+ drivers?: {
163
+ libsql?: LibsqlClientConfig // LibSQL configuration
164
+ postgres?: PoolConfig // PostgreSQL configuration
165
+ postgresNeonHTTP?: {
166
+ // Neon configuration (experimental)
167
+ connectionString: string
168
+ }
169
+ }
170
+ options?: {
171
+ defaultTimeout?: number // Request timeout in milliseconds
172
+ }
173
+ }
174
+ ```
175
+
176
+ </details>
177
+
81
178
  ## License
82
179
 
83
- MIT
180
+ <!-- automd:contributors license=MIT -->
181
+
182
+ Published under the [MIT](https://github.com/lassejlv/driftsql/blob/main/LICENSE) license.
183
+ Made by [community](https://github.com/lassejlv/driftsql/graphs/contributors) 💛
184
+ <br><br>
185
+ <a href="https://github.com/lassejlv/driftsql/graphs/contributors">
186
+ <img src="https://contrib.rocks/image?repo=lassejlv/driftsql" />
187
+ </a>
@@ -0,0 +1,50 @@
1
+ import { PoolConfig } from 'pg';
2
+ import { Config } from '@libsql/client';
3
+ import mysql from 'mysql2/promise';
4
+
5
+ type UnifiedQueryResult<T extends Record<string, any>> = {
6
+ rows: T[];
7
+ rowCount: number;
8
+ command?: string;
9
+ fields?: Array<{
10
+ name: string;
11
+ dataTypeID: number;
12
+ }>;
13
+ };
14
+ interface ClientOptions {
15
+ url?: string;
16
+ password?: string;
17
+ drivers?: {
18
+ libsql?: Config;
19
+ postgres?: PoolConfig;
20
+ mysql?: mysql.ConnectionOptions;
21
+ };
22
+ options?: {
23
+ defaultTimeout?: number;
24
+ };
25
+ }
26
+ declare class DriftSQLClient<DT> {
27
+ private client;
28
+ private pool?;
29
+ private mysqlClient?;
30
+ private libsqlClient?;
31
+ private neonClient?;
32
+ private postgresClient?;
33
+ constructor(options: ClientOptions);
34
+ private convertLibsqlResult;
35
+ query<T extends Record<string, any>>(query: string, args?: (string | number | boolean | null)[]): Promise<UnifiedQueryResult<T>>;
36
+ status(): Promise<{
37
+ ok: boolean;
38
+ ping: number;
39
+ }>;
40
+ findFirst<K extends keyof DT>(table: K, where?: Partial<DT[K]>): Promise<DT[K] | null>;
41
+ findMany<K extends keyof DT>(table: K, where?: Partial<DT[K]>): Promise<DT[K][]>;
42
+ insert<K extends keyof DT>(table: K, data: Partial<DT[K]>): Promise<DT[K]>;
43
+ update<K extends keyof DT>(table: K, data: Partial<DT[K]>, where: Partial<DT[K]>): Promise<DT[K] | null>;
44
+ delete<K extends keyof DT>(table: K, where: Partial<DT[K]>): Promise<boolean>;
45
+ deleteFirst<K extends keyof DT>(table: K, where: Partial<DT[K]>): Promise<boolean>;
46
+ close(): Promise<void>;
47
+ }
48
+
49
+ export { DriftSQLClient };
50
+ export type { ClientOptions };
@@ -0,0 +1,50 @@
1
+ import { PoolConfig } from 'pg';
2
+ import { Config } from '@libsql/client';
3
+ import mysql from 'mysql2/promise';
4
+
5
+ type UnifiedQueryResult<T extends Record<string, any>> = {
6
+ rows: T[];
7
+ rowCount: number;
8
+ command?: string;
9
+ fields?: Array<{
10
+ name: string;
11
+ dataTypeID: number;
12
+ }>;
13
+ };
14
+ interface ClientOptions {
15
+ url?: string;
16
+ password?: string;
17
+ drivers?: {
18
+ libsql?: Config;
19
+ postgres?: PoolConfig;
20
+ mysql?: mysql.ConnectionOptions;
21
+ };
22
+ options?: {
23
+ defaultTimeout?: number;
24
+ };
25
+ }
26
+ declare class DriftSQLClient<DT> {
27
+ private client;
28
+ private pool?;
29
+ private mysqlClient?;
30
+ private libsqlClient?;
31
+ private neonClient?;
32
+ private postgresClient?;
33
+ constructor(options: ClientOptions);
34
+ private convertLibsqlResult;
35
+ query<T extends Record<string, any>>(query: string, args?: (string | number | boolean | null)[]): Promise<UnifiedQueryResult<T>>;
36
+ status(): Promise<{
37
+ ok: boolean;
38
+ ping: number;
39
+ }>;
40
+ findFirst<K extends keyof DT>(table: K, where?: Partial<DT[K]>): Promise<DT[K] | null>;
41
+ findMany<K extends keyof DT>(table: K, where?: Partial<DT[K]>): Promise<DT[K][]>;
42
+ insert<K extends keyof DT>(table: K, data: Partial<DT[K]>): Promise<DT[K]>;
43
+ update<K extends keyof DT>(table: K, data: Partial<DT[K]>, where: Partial<DT[K]>): Promise<DT[K] | null>;
44
+ delete<K extends keyof DT>(table: K, where: Partial<DT[K]>): Promise<boolean>;
45
+ deleteFirst<K extends keyof DT>(table: K, where: Partial<DT[K]>): Promise<boolean>;
46
+ close(): Promise<void>;
47
+ }
48
+
49
+ export { DriftSQLClient };
50
+ export type { ClientOptions };
package/dist/index.mjs ADDED
@@ -0,0 +1,228 @@
1
+ import consola from 'consola';
2
+ import ky from 'ky';
3
+ import { Pool } from 'pg';
4
+ import { createClient } from '@libsql/client';
5
+ import mysql from 'mysql2/promise';
6
+
7
+ class DriftSQLClient {
8
+ client;
9
+ pool;
10
+ mysqlClient;
11
+ libsqlClient;
12
+ neonClient;
13
+ postgresClient;
14
+ constructor(options) {
15
+ this.client = ky.create({
16
+ prefixUrl: options.url,
17
+ headers: {
18
+ Authorization: `Bearer ${options.password}`
19
+ },
20
+ timeout: options.options?.defaultTimeout || 5e3,
21
+ hooks: {
22
+ afterResponse: [
23
+ async (request, options2, response) => {
24
+ if (!response.ok) {
25
+ const errorText = await response.text();
26
+ throw new Error(`HTTP Error: ${response.status} - ${errorText}`);
27
+ }
28
+ return response;
29
+ }
30
+ ]
31
+ }
32
+ });
33
+ this.pool = options.drivers?.postgres ? new Pool(options.drivers.postgres) : void 0;
34
+ this.libsqlClient = options.drivers?.libsql ? createClient(options.drivers.libsql) : void 0;
35
+ this.mysqlClient = options.drivers?.mysql ? mysql.createConnection(options.drivers.mysql) : void 0;
36
+ }
37
+ convertLibsqlResult(result) {
38
+ const rows = result.rows.map((row) => {
39
+ const obj = {};
40
+ result.columns.forEach((col, index) => {
41
+ obj[col] = row[index];
42
+ });
43
+ return obj;
44
+ });
45
+ return {
46
+ rows,
47
+ rowCount: result.rowsAffected || rows.length,
48
+ command: void 0,
49
+ fields: result.columns.map((col) => ({ name: col, dataTypeID: 0 }))
50
+ };
51
+ }
52
+ async query(query, args) {
53
+ if (this.pool) {
54
+ try {
55
+ await this.pool.connect();
56
+ const result = await this.pool.query(query, args || []);
57
+ return {
58
+ rows: result.rows,
59
+ rowCount: result.rowCount || 0,
60
+ command: result.command,
61
+ fields: result.fields
62
+ };
63
+ } catch (error) {
64
+ consola.error("Failed to connect to PostgreSQL pool:", error);
65
+ }
66
+ }
67
+ if (this.mysqlClient) {
68
+ try {
69
+ consola.warn("MySQL client is experimental and may not be compatible with the helper functions, since they originally designed for PostgreSQL and libsql. But .query() method should work.");
70
+ const [rows, fields] = await (await this.mysqlClient).execute(query, args || []);
71
+ return {
72
+ rows,
73
+ rowCount: Array.isArray(rows) ? rows.length : 0,
74
+ command: void 0,
75
+ // MySQL does not return command info
76
+ fields: fields.map((field) => ({ name: field.name, dataTypeID: field.columnType }))
77
+ };
78
+ } catch (error) {
79
+ consola.error("Failed to execute query with MySQL:", error);
80
+ throw error;
81
+ }
82
+ }
83
+ if (this.postgresClient) {
84
+ try {
85
+ const result = await this.postgresClient.unsafe(query, args || []);
86
+ return {
87
+ // @ts-ignore - postgres library returns rows directly
88
+ rows: result,
89
+ rowCount: result.length,
90
+ command: void 0,
91
+ fields: []
92
+ // postgres library does not provide field info
93
+ };
94
+ } catch (error) {
95
+ consola.error("Failed to execute query with postgres:", error);
96
+ throw error;
97
+ }
98
+ }
99
+ if (this.libsqlClient) {
100
+ try {
101
+ const result = await this.libsqlClient.execute({
102
+ sql: query,
103
+ args: args || []
104
+ });
105
+ return this.convertLibsqlResult(result);
106
+ } catch (error) {
107
+ consola.error("Failed to execute query with libsql:", error);
108
+ throw error;
109
+ }
110
+ }
111
+ if (this.neonClient) {
112
+ try {
113
+ const sql = this.neonClient;
114
+ console.log(sql);
115
+ throw new Error("Neon client is not implemented yet");
116
+ return {
117
+ rows: [],
118
+ rowCount: 0
119
+ };
120
+ } catch (error) {
121
+ consola.error("Failed to execute query with Neon:", error);
122
+ throw error;
123
+ }
124
+ }
125
+ try {
126
+ const response = await this.client.post("query", {
127
+ json: { query, args: args || [] }
128
+ });
129
+ return response.json();
130
+ } catch (error) {
131
+ if (error instanceof Error) {
132
+ throw error;
133
+ }
134
+ throw new Error(`Query failed: ${JSON.stringify(error)}`);
135
+ }
136
+ }
137
+ async status() {
138
+ if (!this.client) {
139
+ throw new Error("HTTP client is not configured");
140
+ }
141
+ const response = await this.client.get("status");
142
+ return response.json();
143
+ }
144
+ async findFirst(table, where) {
145
+ const tableName = String(table);
146
+ const whereEntries = Object.entries(where || {});
147
+ let query = `SELECT * FROM ${tableName}`;
148
+ let args = [];
149
+ if (whereEntries.length > 0) {
150
+ const whereClause = whereEntries.map(([key], index) => `${key} = $${index + 1}`).join(" AND ");
151
+ query += ` WHERE ${whereClause}`;
152
+ args = whereEntries.map(([, value]) => value);
153
+ }
154
+ query += " LIMIT 1";
155
+ const result = await this.query(query, args);
156
+ return result.rows[0] || null;
157
+ }
158
+ async findMany(table, where) {
159
+ const tableName = String(table);
160
+ const whereEntries = Object.entries(where || {});
161
+ let query = `SELECT * FROM ${tableName}`;
162
+ let args = [];
163
+ if (whereEntries.length > 0) {
164
+ const whereClause = whereEntries.map(([key], index) => `${key} = $${index + 1}`).join(" AND ");
165
+ query += ` WHERE ${whereClause}`;
166
+ args = whereEntries.map(([, value]) => value);
167
+ }
168
+ const result = await this.query(query, args);
169
+ return result.rows;
170
+ }
171
+ async insert(table, data) {
172
+ const tableName = String(table);
173
+ const keys = Object.keys(data);
174
+ const values = Object.values(data).map((value) => value);
175
+ if (keys.length === 0) {
176
+ throw new Error("No data provided for insert");
177
+ }
178
+ const placeholders = keys.map((_, index) => `$${index + 1}`).join(", ");
179
+ const query = `INSERT INTO ${tableName} (${keys.join(", ")}) VALUES (${placeholders}) RETURNING *`;
180
+ const result = await this.query(query, values);
181
+ if (!result.rows[0]) {
182
+ throw new Error("Insert failed: No data returned");
183
+ }
184
+ return result.rows[0];
185
+ }
186
+ async update(table, data, where) {
187
+ const tableName = String(table);
188
+ const setEntries = Object.entries(data);
189
+ const whereEntries = Object.entries(where);
190
+ if (setEntries.length === 0) {
191
+ throw new Error("No data provided for update");
192
+ }
193
+ if (whereEntries.length === 0) {
194
+ throw new Error("No conditions provided for update");
195
+ }
196
+ const setClause = setEntries.map(([key], index) => `${key} = $${index + 1}`).join(", ");
197
+ const whereClause = whereEntries.map(([key], index) => `${key} = $${setEntries.length + index + 1}`).join(" AND ");
198
+ const query = `UPDATE ${tableName} SET ${setClause} WHERE ${whereClause} RETURNING *`;
199
+ const args = [...setEntries.map(([, value]) => value), ...whereEntries.map(([, value]) => value)];
200
+ const result = await this.query(query, args);
201
+ return result.rows[0] || null;
202
+ }
203
+ async delete(table, where) {
204
+ const tableName = String(table);
205
+ const whereEntries = Object.entries(where);
206
+ if (whereEntries.length === 0) {
207
+ throw new Error("No conditions provided for delete");
208
+ }
209
+ const whereClause = whereEntries.map(([key], index) => `${key} = $${index + 1}`).join(" AND ");
210
+ const query = `DELETE FROM ${tableName} WHERE ${whereClause}`;
211
+ const args = whereEntries.map(([, value]) => value);
212
+ const result = await this.query(query, args);
213
+ return (result.rowCount || 0) > 0;
214
+ }
215
+ deleteFirst(table, where) {
216
+ return this.delete(table, where);
217
+ }
218
+ async close() {
219
+ if (this.pool) {
220
+ await this.pool.end();
221
+ }
222
+ if (this.libsqlClient) {
223
+ this.libsqlClient.close();
224
+ }
225
+ }
226
+ }
227
+
228
+ export { DriftSQLClient };
package/package.json CHANGED
@@ -1,19 +1,54 @@
1
1
  {
2
2
  "name": "driftsql",
3
- "version": "0.0.1",
4
- "description": "Driftsql is a SQL client for libsql and sqlitecloud to provide a simple & fast way to query your data.",
5
- "module": "src/main.ts",
3
+ "version": "1.0.1",
4
+ "author": "lasse vestergaard",
5
+ "description": "A lightweight SQL client for TypeScript, supporting multiple databases like PostgreSQL, MySQL, and LibSQL.",
6
+ "repository": "lassejlv/driftsql",
7
+ "license": "MIT",
8
+ "sideEffects": false,
6
9
  "type": "module",
7
- "main": "dist/main.js",
8
- "devDependencies": {
9
- "@types/bun": "latest"
10
+ "exports": {
11
+ ".": {
12
+ "types": "./dist/index.d.mts",
13
+ "default": "./dist/index.mjs"
14
+ }
15
+ },
16
+ "files": [
17
+ "dist"
18
+ ],
19
+ "scripts": {
20
+ "build": "unbuild",
21
+ "dev": "vitest dev",
22
+ "lint": "eslint . && prettier -c .",
23
+ "lint:fix": "automd && eslint . --fix && prettier -w .",
24
+ "prepack": "pnpm build",
25
+ "release": "pnpm test && changelogen --release && npm publish && git push --follow-tags",
26
+ "test": "pnpm lint && pnpm test:types && vitest run --coverage",
27
+ "test:types": "tsc --noEmit --skipLibCheck"
10
28
  },
11
- "peerDependencies": {
12
- "typescript": "^5.0.0"
29
+ "devDependencies": {
30
+ "@types/node": "^22.13.13",
31
+ "@vitest/coverage-v8": "^3.0.9",
32
+ "automd": "^0.4.0",
33
+ "changelogen": "^0.6.1",
34
+ "eslint": "^9.23.0",
35
+ "eslint-config-unjs": "^0.4.2",
36
+ "prettier": "^3.5.3",
37
+ "typescript": "^5.8.2",
38
+ "unbuild": "^3.5.0",
39
+ "vitest": "^3.0.9"
13
40
  },
41
+ "packageManager": "pnpm@10.12.1",
14
42
  "dependencies": {
15
- "@libsql/client": "^0.14.0",
16
- "prismoo": "^1.1.2",
17
- "zod": "^3.23.8"
43
+ "@libsql/client": "^0.15.9",
44
+ "@neondatabase/serverless": "^1.0.1",
45
+ "@types/pg": "^8.15.4",
46
+ "consola": "^3.4.2",
47
+ "driftsql": "^0.0.1",
48
+ "drizzle-orm": "^0.44.2",
49
+ "ky": "^1.8.1",
50
+ "mysql2": "^3.14.1",
51
+ "pg": "^8.16.0",
52
+ "postgres": "^3.4.7"
18
53
  }
19
54
  }