@zauso-ai/capstan-db 0.1.4 → 0.3.0
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/dist/client.d.ts +31 -18
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +300 -24
- package/dist/client.js.map +1 -1
- package/dist/crud.d.ts +14 -0
- package/dist/crud.d.ts.map +1 -1
- package/dist/crud.js +49 -39
- package/dist/crud.js.map +1 -1
- package/dist/dialect.d.ts +25 -0
- package/dist/dialect.d.ts.map +1 -0
- package/dist/dialect.js +208 -0
- package/dist/dialect.js.map +1 -0
- package/dist/embedding.d.ts +63 -0
- package/dist/embedding.d.ts.map +1 -0
- package/dist/embedding.js +61 -0
- package/dist/embedding.js.map +1 -0
- package/dist/index.d.ts +14 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -2
- package/dist/index.js.map +1 -1
- package/dist/migrate.d.ts +44 -23
- package/dist/migrate.d.ts.map +1 -1
- package/dist/migrate.js +308 -125
- package/dist/migrate.js.map +1 -1
- package/dist/model.d.ts +9 -0
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +13 -0
- package/dist/model.js.map +1 -1
- package/dist/naming.d.ts +37 -0
- package/dist/naming.d.ts.map +1 -0
- package/dist/naming.js +196 -0
- package/dist/naming.js.map +1 -0
- package/dist/runtime.d.ts +51 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +490 -0
- package/dist/runtime.js.map +1 -0
- package/dist/schema.d.ts +2 -12
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +199 -105
- package/dist/schema.js.map +1 -1
- package/dist/search.d.ts +52 -0
- package/dist/search.d.ts.map +1 -0
- package/dist/search.js +110 -0
- package/dist/search.js.map +1 -0
- package/dist/types.d.ts +5 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/vector-store-memory.d.ts +31 -0
- package/dist/vector-store-memory.d.ts.map +1 -0
- package/dist/vector-store-memory.js +125 -0
- package/dist/vector-store-memory.js.map +1 -0
- package/dist/vector-store-pgvector.d.ts +46 -0
- package/dist/vector-store-pgvector.d.ts.map +1 -0
- package/dist/vector-store-pgvector.js +215 -0
- package/dist/vector-store-pgvector.js.map +1 -0
- package/dist/vector-store-sqlite.d.ts +51 -0
- package/dist/vector-store-sqlite.d.ts.map +1 -0
- package/dist/vector-store-sqlite.js +203 -0
- package/dist/vector-store-sqlite.js.map +1 -0
- package/dist/vector-store.d.ts +79 -0
- package/dist/vector-store.d.ts.map +1 -0
- package/dist/vector-store.js +5 -0
- package/dist/vector-store.js.map +1 -0
- package/dist/write.d.ts +15 -0
- package/dist/write.d.ts.map +1 -0
- package/dist/write.js +156 -0
- package/dist/write.js.map +1 -0
- package/package.json +17 -4
package/dist/client.d.ts
CHANGED
|
@@ -1,29 +1,42 @@
|
|
|
1
|
+
import type { DatabaseRuntime } from "./runtime.js";
|
|
1
2
|
import type { DatabaseConfig } from "./types.js";
|
|
2
|
-
export interface DatabaseInstance {
|
|
3
|
-
/** The Drizzle ORM database instance. */
|
|
4
|
-
db: unknown;
|
|
5
|
-
/** Close the underlying database connection. */
|
|
6
|
-
close: () => void;
|
|
3
|
+
export interface DatabaseInstance extends DatabaseRuntime {
|
|
7
4
|
}
|
|
8
5
|
/**
|
|
9
|
-
* Create a Drizzle database instance backed by better-sqlite3
|
|
6
|
+
* Create a Drizzle database instance backed by better-sqlite3 (SQLite),
|
|
7
|
+
* node-postgres (PostgreSQL), or mysql2 (MySQL).
|
|
10
8
|
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
* will not work until the peer dependencies are
|
|
9
|
+
* All driver dependencies are optional peer dependencies and are loaded lazily
|
|
10
|
+
* so that `@zauso-ai/capstan-db` can be installed even when native compilation
|
|
11
|
+
* of `better-sqlite3` fails or `pg`/`mysql2` are not needed. The actual
|
|
12
|
+
* database features will not work until the appropriate peer dependencies are
|
|
13
|
+
* installed.
|
|
15
14
|
*
|
|
16
|
-
* @param config - Database configuration.
|
|
17
|
-
*
|
|
18
|
-
*
|
|
15
|
+
* @param config - Database configuration.
|
|
16
|
+
* - `provider: "sqlite"` — `url` should be a file path (or `:memory:`).
|
|
17
|
+
* - `provider: "postgres"` — `url` should be a PostgreSQL connection string
|
|
18
|
+
* (e.g. `postgres://user:pass@host:5432/db`).
|
|
19
|
+
* - `provider: "mysql"` — `url` should be a MySQL connection string
|
|
20
|
+
* (e.g. `mysql://user:pass@host:3306/db`).
|
|
19
21
|
*
|
|
20
|
-
* @throws If
|
|
21
|
-
* error with installation instructions.
|
|
22
|
+
* @throws If the required driver or `drizzle-orm` adapter is not installed,
|
|
23
|
+
* throws an error with installation instructions.
|
|
22
24
|
*
|
|
23
25
|
* @example
|
|
26
|
+
* // SQLite
|
|
24
27
|
* const { db, close } = createDatabase({ provider: "sqlite", url: "./data.db" });
|
|
25
|
-
*
|
|
26
|
-
*
|
|
28
|
+
*
|
|
29
|
+
* // PostgreSQL
|
|
30
|
+
* const { db, close } = createDatabase({
|
|
31
|
+
* provider: "postgres",
|
|
32
|
+
* url: "postgres://user:pass@localhost:5432/mydb",
|
|
33
|
+
* });
|
|
34
|
+
*
|
|
35
|
+
* // MySQL
|
|
36
|
+
* const { db, close } = createDatabase({
|
|
37
|
+
* provider: "mysql",
|
|
38
|
+
* url: "mysql://user:pass@localhost:3306/mydb",
|
|
39
|
+
* });
|
|
27
40
|
*/
|
|
28
|
-
export declare function createDatabase(config: DatabaseConfig): DatabaseInstance
|
|
41
|
+
export declare function createDatabase(config: DatabaseConfig): Promise<DatabaseInstance>;
|
|
29
42
|
//# sourceMappingURL=client.d.ts.map
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAwC,MAAM,cAAc,CAAC;AAC1F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AASjD,MAAM,WAAW,gBAAiB,SAAQ,eAAe;CAAG;AAM5D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAiBtF"}
|
package/dist/client.js
CHANGED
|
@@ -1,33 +1,74 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import { createDatabaseRuntime } from "./runtime.js";
|
|
2
|
+
// Helper to dynamically import optional peer dependencies without TypeScript
|
|
3
|
+
// trying to resolve them at compile time (they may not be installed).
|
|
4
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
5
|
+
async function importPeer(specifier) {
|
|
6
|
+
return import(specifier);
|
|
7
|
+
}
|
|
8
|
+
function normalizeParams(params) {
|
|
9
|
+
return params ?? [];
|
|
10
|
+
}
|
|
3
11
|
/**
|
|
4
|
-
* Create a Drizzle database instance backed by better-sqlite3
|
|
12
|
+
* Create a Drizzle database instance backed by better-sqlite3 (SQLite),
|
|
13
|
+
* node-postgres (PostgreSQL), or mysql2 (MySQL).
|
|
5
14
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* will not work until the peer dependencies are
|
|
15
|
+
* All driver dependencies are optional peer dependencies and are loaded lazily
|
|
16
|
+
* so that `@zauso-ai/capstan-db` can be installed even when native compilation
|
|
17
|
+
* of `better-sqlite3` fails or `pg`/`mysql2` are not needed. The actual
|
|
18
|
+
* database features will not work until the appropriate peer dependencies are
|
|
19
|
+
* installed.
|
|
10
20
|
*
|
|
11
|
-
* @param config - Database configuration.
|
|
12
|
-
*
|
|
13
|
-
*
|
|
21
|
+
* @param config - Database configuration.
|
|
22
|
+
* - `provider: "sqlite"` — `url` should be a file path (or `:memory:`).
|
|
23
|
+
* - `provider: "postgres"` — `url` should be a PostgreSQL connection string
|
|
24
|
+
* (e.g. `postgres://user:pass@host:5432/db`).
|
|
25
|
+
* - `provider: "mysql"` — `url` should be a MySQL connection string
|
|
26
|
+
* (e.g. `mysql://user:pass@host:3306/db`).
|
|
14
27
|
*
|
|
15
|
-
* @throws If
|
|
16
|
-
* error with installation instructions.
|
|
28
|
+
* @throws If the required driver or `drizzle-orm` adapter is not installed,
|
|
29
|
+
* throws an error with installation instructions.
|
|
17
30
|
*
|
|
18
31
|
* @example
|
|
32
|
+
* // SQLite
|
|
19
33
|
* const { db, close } = createDatabase({ provider: "sqlite", url: "./data.db" });
|
|
20
|
-
*
|
|
21
|
-
*
|
|
34
|
+
*
|
|
35
|
+
* // PostgreSQL
|
|
36
|
+
* const { db, close } = createDatabase({
|
|
37
|
+
* provider: "postgres",
|
|
38
|
+
* url: "postgres://user:pass@localhost:5432/mydb",
|
|
39
|
+
* });
|
|
40
|
+
*
|
|
41
|
+
* // MySQL
|
|
42
|
+
* const { db, close } = createDatabase({
|
|
43
|
+
* provider: "mysql",
|
|
44
|
+
* url: "mysql://user:pass@localhost:3306/mydb",
|
|
45
|
+
* });
|
|
22
46
|
*/
|
|
23
|
-
export function createDatabase(config) {
|
|
24
|
-
|
|
25
|
-
|
|
47
|
+
export async function createDatabase(config) {
|
|
48
|
+
switch (config.provider) {
|
|
49
|
+
case "sqlite":
|
|
50
|
+
return createSqliteDatabase(config.url);
|
|
51
|
+
case "postgres":
|
|
52
|
+
return createPostgresDatabase(config.url);
|
|
53
|
+
case "mysql":
|
|
54
|
+
return createMysqlDatabase(config.url);
|
|
55
|
+
case "libsql":
|
|
56
|
+
return createLibsqlDatabase(config.url);
|
|
57
|
+
default: {
|
|
58
|
+
const _exhaustive = config.provider;
|
|
59
|
+
throw new Error(`@zauso-ai/capstan-db: Unsupported database provider "${String(_exhaustive)}".`);
|
|
60
|
+
}
|
|
26
61
|
}
|
|
62
|
+
}
|
|
63
|
+
// ---------------------------------------------------------------------------
|
|
64
|
+
// SQLite (better-sqlite3)
|
|
65
|
+
// ---------------------------------------------------------------------------
|
|
66
|
+
async function createSqliteDatabase(url) {
|
|
27
67
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
28
68
|
let BetterSqlite3;
|
|
29
69
|
try {
|
|
30
|
-
|
|
70
|
+
const mod = await importPeer("better-sqlite3");
|
|
71
|
+
BetterSqlite3 = mod.default ?? mod;
|
|
31
72
|
}
|
|
32
73
|
catch {
|
|
33
74
|
throw new Error(`@zauso-ai/capstan-db: "better-sqlite3" is required for SQLite support but is not installed.\n` +
|
|
@@ -38,22 +79,257 @@ export function createDatabase(config) {
|
|
|
38
79
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
39
80
|
let drizzle;
|
|
40
81
|
try {
|
|
41
|
-
const drizzleModule =
|
|
82
|
+
const drizzleModule = await importPeer("drizzle-orm/better-sqlite3");
|
|
42
83
|
drizzle = drizzleModule.drizzle;
|
|
43
84
|
}
|
|
44
85
|
catch {
|
|
45
86
|
throw new Error(`@zauso-ai/capstan-db: "drizzle-orm" is required for database support but is not installed.\n` +
|
|
46
87
|
`Install it with: npm install drizzle-orm`);
|
|
47
88
|
}
|
|
48
|
-
const sqlite = new BetterSqlite3(
|
|
89
|
+
const sqlite = new BetterSqlite3(url);
|
|
49
90
|
// Enable WAL mode for better concurrent read performance.
|
|
50
91
|
sqlite.pragma("journal_mode = WAL");
|
|
51
92
|
const db = drizzle({ client: sqlite });
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
sqlite.
|
|
93
|
+
const adapter = {
|
|
94
|
+
provider: "sqlite",
|
|
95
|
+
async query(sql, params) {
|
|
96
|
+
const statement = sqlite.prepare(sql);
|
|
97
|
+
return statement.all(...normalizeParams(params));
|
|
98
|
+
},
|
|
99
|
+
async execute(sql, params) {
|
|
100
|
+
const statement = sqlite.prepare(sql);
|
|
101
|
+
const normalized = sql.trim().toUpperCase();
|
|
102
|
+
if (normalized.startsWith("SELECT") || normalized.includes(" RETURNING ")) {
|
|
103
|
+
const rows = statement.all(...normalizeParams(params));
|
|
104
|
+
return { affectedRows: rows.length, rows };
|
|
105
|
+
}
|
|
106
|
+
const result = statement.run(...normalizeParams(params));
|
|
107
|
+
return { affectedRows: Number(result.changes ?? 0) };
|
|
108
|
+
},
|
|
109
|
+
async transaction(fn) {
|
|
110
|
+
sqlite.exec("BEGIN");
|
|
111
|
+
try {
|
|
112
|
+
const result = await fn(adapter);
|
|
113
|
+
sqlite.exec("COMMIT");
|
|
114
|
+
return result;
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
sqlite.exec("ROLLBACK");
|
|
118
|
+
throw error;
|
|
119
|
+
}
|
|
120
|
+
},
|
|
121
|
+
};
|
|
122
|
+
return createDatabaseRuntime(db, "sqlite", () => sqlite.close(), adapter);
|
|
123
|
+
}
|
|
124
|
+
// ---------------------------------------------------------------------------
|
|
125
|
+
// PostgreSQL (node-postgres / pg)
|
|
126
|
+
// ---------------------------------------------------------------------------
|
|
127
|
+
async function createPostgresDatabase(url) {
|
|
128
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
129
|
+
let Pool;
|
|
130
|
+
try {
|
|
131
|
+
const pgModule = await importPeer("pg");
|
|
132
|
+
Pool = pgModule.Pool ?? pgModule.default?.Pool;
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
throw new Error(`@zauso-ai/capstan-db: "pg" (node-postgres) is required for PostgreSQL support but is not installed.\n` +
|
|
136
|
+
`Install it with: npm install pg`);
|
|
137
|
+
}
|
|
138
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
139
|
+
let drizzle;
|
|
140
|
+
try {
|
|
141
|
+
const drizzleModule = await importPeer("drizzle-orm/node-postgres");
|
|
142
|
+
drizzle = drizzleModule.drizzle;
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
throw new Error(`@zauso-ai/capstan-db: "drizzle-orm/node-postgres" adapter is required for PostgreSQL support but is not installed.\n` +
|
|
146
|
+
`Install it with: npm install drizzle-orm`);
|
|
147
|
+
}
|
|
148
|
+
const pool = new Pool({ connectionString: url });
|
|
149
|
+
const db = drizzle({ client: pool });
|
|
150
|
+
const rootAdapter = {
|
|
151
|
+
provider: "postgres",
|
|
152
|
+
async query(sql, params) {
|
|
153
|
+
const result = await pool.query(sql, normalizeParams(params));
|
|
154
|
+
return result.rows;
|
|
155
|
+
},
|
|
156
|
+
async execute(sql, params) {
|
|
157
|
+
const result = await pool.query(sql, normalizeParams(params));
|
|
158
|
+
return {
|
|
159
|
+
affectedRows: result.rowCount ?? result.rows.length,
|
|
160
|
+
rows: result.rows,
|
|
161
|
+
};
|
|
162
|
+
},
|
|
163
|
+
async transaction(fn) {
|
|
164
|
+
const client = await pool.connect();
|
|
165
|
+
const adapter = {
|
|
166
|
+
provider: "postgres",
|
|
167
|
+
async query(statement, params) {
|
|
168
|
+
const result = await client.query(statement, normalizeParams(params));
|
|
169
|
+
return result.rows;
|
|
170
|
+
},
|
|
171
|
+
async execute(statement, params) {
|
|
172
|
+
const result = await client.query(statement, normalizeParams(params));
|
|
173
|
+
return {
|
|
174
|
+
affectedRows: result.rowCount ?? result.rows.length,
|
|
175
|
+
rows: result.rows,
|
|
176
|
+
};
|
|
177
|
+
},
|
|
178
|
+
async transaction(innerFn) {
|
|
179
|
+
return innerFn(adapter);
|
|
180
|
+
},
|
|
181
|
+
};
|
|
182
|
+
await client.query("BEGIN");
|
|
183
|
+
try {
|
|
184
|
+
const result = await fn(adapter);
|
|
185
|
+
await client.query("COMMIT");
|
|
186
|
+
return result;
|
|
187
|
+
}
|
|
188
|
+
catch (error) {
|
|
189
|
+
await client.query("ROLLBACK");
|
|
190
|
+
throw error;
|
|
191
|
+
}
|
|
192
|
+
finally {
|
|
193
|
+
client.release();
|
|
194
|
+
}
|
|
195
|
+
},
|
|
196
|
+
};
|
|
197
|
+
return createDatabaseRuntime(db, "postgres", () => pool.end(), rootAdapter);
|
|
198
|
+
}
|
|
199
|
+
// ---------------------------------------------------------------------------
|
|
200
|
+
// MySQL (mysql2)
|
|
201
|
+
// ---------------------------------------------------------------------------
|
|
202
|
+
async function createMysqlDatabase(url) {
|
|
203
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
204
|
+
let createPool;
|
|
205
|
+
try {
|
|
206
|
+
const mysql2 = await importPeer("mysql2/promise");
|
|
207
|
+
createPool = mysql2.createPool ?? mysql2.default?.createPool;
|
|
208
|
+
}
|
|
209
|
+
catch {
|
|
210
|
+
throw new Error(`@zauso-ai/capstan-db: "mysql2" is required for MySQL support but is not installed.\n` +
|
|
211
|
+
`Install it with: npm install mysql2`);
|
|
212
|
+
}
|
|
213
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
214
|
+
let drizzle;
|
|
215
|
+
try {
|
|
216
|
+
const drizzleModule = await importPeer("drizzle-orm/mysql2");
|
|
217
|
+
drizzle = drizzleModule.drizzle;
|
|
218
|
+
}
|
|
219
|
+
catch {
|
|
220
|
+
throw new Error(`@zauso-ai/capstan-db: "drizzle-orm/mysql2" adapter is required for MySQL support but is not installed.\n` +
|
|
221
|
+
`Install it with: npm install drizzle-orm`);
|
|
222
|
+
}
|
|
223
|
+
const pool = createPool({ uri: url });
|
|
224
|
+
const db = drizzle({ client: pool });
|
|
225
|
+
function normalizeMysqlRows(result) {
|
|
226
|
+
return Array.isArray(result) ? result : [];
|
|
227
|
+
}
|
|
228
|
+
const rootAdapter = {
|
|
229
|
+
provider: "mysql",
|
|
230
|
+
async query(sql, params) {
|
|
231
|
+
const [rows] = await pool.query(sql, normalizeParams(params));
|
|
232
|
+
return normalizeMysqlRows(rows);
|
|
233
|
+
},
|
|
234
|
+
async execute(sql, params) {
|
|
235
|
+
const [result] = await pool.query(sql, normalizeParams(params));
|
|
236
|
+
if (Array.isArray(result)) {
|
|
237
|
+
return { affectedRows: result.length, rows: result };
|
|
238
|
+
}
|
|
239
|
+
const payload = result;
|
|
240
|
+
return { affectedRows: payload.affectedRows ?? 0 };
|
|
241
|
+
},
|
|
242
|
+
async transaction(fn) {
|
|
243
|
+
const connection = await pool.getConnection();
|
|
244
|
+
const adapter = {
|
|
245
|
+
provider: "mysql",
|
|
246
|
+
async query(statement, params) {
|
|
247
|
+
const [rows] = await connection.query(statement, normalizeParams(params));
|
|
248
|
+
return normalizeMysqlRows(rows);
|
|
249
|
+
},
|
|
250
|
+
async execute(statement, params) {
|
|
251
|
+
const [result] = await connection.query(statement, normalizeParams(params));
|
|
252
|
+
if (Array.isArray(result)) {
|
|
253
|
+
return { affectedRows: result.length, rows: result };
|
|
254
|
+
}
|
|
255
|
+
const payload = result;
|
|
256
|
+
return { affectedRows: payload.affectedRows ?? 0 };
|
|
257
|
+
},
|
|
258
|
+
async transaction(innerFn) {
|
|
259
|
+
return innerFn(adapter);
|
|
260
|
+
},
|
|
261
|
+
};
|
|
262
|
+
await connection.beginTransaction();
|
|
263
|
+
try {
|
|
264
|
+
const result = await fn(adapter);
|
|
265
|
+
await connection.commit();
|
|
266
|
+
return result;
|
|
267
|
+
}
|
|
268
|
+
catch (error) {
|
|
269
|
+
await connection.rollback();
|
|
270
|
+
throw error;
|
|
271
|
+
}
|
|
272
|
+
finally {
|
|
273
|
+
connection.release();
|
|
274
|
+
}
|
|
275
|
+
},
|
|
276
|
+
};
|
|
277
|
+
return createDatabaseRuntime(db, "mysql", () => {
|
|
278
|
+
void pool.end();
|
|
279
|
+
}, rootAdapter);
|
|
280
|
+
}
|
|
281
|
+
// ---------------------------------------------------------------------------
|
|
282
|
+
// libSQL / Turso (@libsql/client)
|
|
283
|
+
// ---------------------------------------------------------------------------
|
|
284
|
+
async function createLibsqlDatabase(url) {
|
|
285
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
286
|
+
let createClient;
|
|
287
|
+
try {
|
|
288
|
+
const libsqlModule = await importPeer("@libsql/client");
|
|
289
|
+
createClient = libsqlModule.createClient ?? libsqlModule.default?.createClient;
|
|
290
|
+
}
|
|
291
|
+
catch {
|
|
292
|
+
throw new Error(`@zauso-ai/capstan-db: "@libsql/client" is required for libSQL/Turso support but is not installed.\n` +
|
|
293
|
+
`Install it with: npm install @libsql/client`);
|
|
294
|
+
}
|
|
295
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
296
|
+
let drizzle;
|
|
297
|
+
try {
|
|
298
|
+
const drizzleModule = await importPeer("drizzle-orm/libsql");
|
|
299
|
+
drizzle = drizzleModule.drizzle;
|
|
300
|
+
}
|
|
301
|
+
catch {
|
|
302
|
+
throw new Error(`@zauso-ai/capstan-db: "drizzle-orm/libsql" adapter is required for libSQL/Turso support but is not installed.\n` +
|
|
303
|
+
`Install it with: npm install drizzle-orm`);
|
|
304
|
+
}
|
|
305
|
+
const client = createClient({ url });
|
|
306
|
+
const db = drizzle({ client });
|
|
307
|
+
const adapter = {
|
|
308
|
+
provider: "libsql",
|
|
309
|
+
async query(sql, params) {
|
|
310
|
+
const result = await client.execute({ sql, args: normalizeParams(params) });
|
|
311
|
+
return result.rows;
|
|
312
|
+
},
|
|
313
|
+
async execute(sql, params) {
|
|
314
|
+
const result = await client.execute({ sql, args: normalizeParams(params) });
|
|
315
|
+
return {
|
|
316
|
+
affectedRows: Number(result.rowsAffected ?? result.rows.length ?? 0),
|
|
317
|
+
rows: result.rows,
|
|
318
|
+
};
|
|
319
|
+
},
|
|
320
|
+
async transaction(fn) {
|
|
321
|
+
await client.execute("BEGIN");
|
|
322
|
+
try {
|
|
323
|
+
const result = await fn(adapter);
|
|
324
|
+
await client.execute("COMMIT");
|
|
325
|
+
return result;
|
|
326
|
+
}
|
|
327
|
+
catch (error) {
|
|
328
|
+
await client.execute("ROLLBACK");
|
|
329
|
+
throw error;
|
|
330
|
+
}
|
|
56
331
|
},
|
|
57
332
|
};
|
|
333
|
+
return createDatabaseRuntime(db, "libsql", () => client.close(), adapter);
|
|
58
334
|
}
|
|
59
335
|
//# sourceMappingURL=client.js.map
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/crud.d.ts
CHANGED
|
@@ -1,9 +1,21 @@
|
|
|
1
|
+
import type { DatabaseRuntime, FindManyOptions, ModelRepository } from "./runtime.js";
|
|
2
|
+
import type { PrepareWriteOptions } from "./write.js";
|
|
1
3
|
import type { ModelDefinition } from "./types.js";
|
|
2
4
|
export interface CrudRouteFiles {
|
|
3
5
|
/** File path relative to app/routes/, e.g. "tickets/index.api.ts" */
|
|
4
6
|
path: string;
|
|
5
7
|
content: string;
|
|
6
8
|
}
|
|
9
|
+
export interface CrudQueryOptions extends FindManyOptions {
|
|
10
|
+
}
|
|
11
|
+
export interface CrudRuntime<M extends ModelDefinition = ModelDefinition> {
|
|
12
|
+
repository: ModelRepository<M>;
|
|
13
|
+
list: (options?: CrudQueryOptions) => Promise<Array<Record<string, unknown>>>;
|
|
14
|
+
get: (id: unknown, options?: Omit<CrudQueryOptions, "where" | "limit" | "offset">) => Promise<Record<string, unknown> | null>;
|
|
15
|
+
create: (input: Record<string, unknown>, options?: PrepareWriteOptions) => Promise<Record<string, unknown>>;
|
|
16
|
+
update: (id: unknown, input: Record<string, unknown>, options?: PrepareWriteOptions) => Promise<Record<string, unknown> | null>;
|
|
17
|
+
remove: (id: unknown) => Promise<boolean>;
|
|
18
|
+
}
|
|
7
19
|
/**
|
|
8
20
|
* Naive English pluraliser — sufficient for model-name pluralisation.
|
|
9
21
|
*
|
|
@@ -24,4 +36,6 @@ export declare function pluralize(word: string): string;
|
|
|
24
36
|
* 2. `<plural>/[id].api.ts` — GET (by id) + PUT (update) + DELETE
|
|
25
37
|
*/
|
|
26
38
|
export declare function generateCrudRoutes(model: ModelDefinition): CrudRouteFiles[];
|
|
39
|
+
export declare function createCrudRepository<M extends ModelDefinition>(database: DatabaseRuntime, model: M | string): ModelRepository<M>;
|
|
40
|
+
export declare function createCrudRuntime<M extends ModelDefinition>(database: DatabaseRuntime, model: M | string): CrudRuntime<M>;
|
|
27
41
|
//# sourceMappingURL=crud.d.ts.map
|
package/dist/crud.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crud.d.ts","sourceRoot":"","sources":["../src/crud.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAmB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"crud.d.ts","sourceRoot":"","sources":["../src/crud.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACtF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,KAAK,EAAE,eAAe,EAAmB,MAAM,YAAY,CAAC;AAOnE,MAAM,WAAW,cAAc;IAC7B,qEAAqE;IACrE,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAiB,SAAQ,eAAe;CAAG;AAE5D,MAAM,WAAW,WAAW,CAAC,CAAC,SAAS,eAAe,GAAG,eAAe;IACtE,UAAU,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC;IAC/B,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE,gBAAgB,KAAK,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IAC9E,GAAG,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,gBAAgB,EAAE,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;IAC9H,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,mBAAmB,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC5G,MAAM,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,mBAAmB,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;IAChI,MAAM,EAAE,CAAC,EAAE,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC3C;AAMD;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9C;AAsHD;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,eAAe,GAAG,cAAc,EAAE,CAgH3E;AAED,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,eAAe,EAC5D,QAAQ,EAAE,eAAe,EACzB,KAAK,EAAE,CAAC,GAAG,MAAM,GAChB,eAAe,CAAC,CAAC,CAAC,CAEpB;AAED,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,eAAe,EACzD,QAAQ,EAAE,eAAe,EACzB,KAAK,EAAE,CAAC,GAAG,MAAM,GAChB,WAAW,CAAC,CAAC,CAAC,CAUhB"}
|
package/dist/crud.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { autoFieldNames, findPrimaryKeyField, pluralizeModelName } from "./naming.js";
|
|
1
2
|
// ---------------------------------------------------------------------------
|
|
2
3
|
// Pluralisation helper
|
|
3
4
|
// ---------------------------------------------------------------------------
|
|
@@ -10,24 +11,7 @@
|
|
|
10
11
|
* bus -> buses
|
|
11
12
|
*/
|
|
12
13
|
export function pluralize(word) {
|
|
13
|
-
|
|
14
|
-
return word;
|
|
15
|
-
const lower = word.toLowerCase();
|
|
16
|
-
// Words ending in consonant + y → ies
|
|
17
|
-
if (lower.endsWith("y") &&
|
|
18
|
-
lower.length > 1 &&
|
|
19
|
-
!"aeiou".includes(lower[lower.length - 2])) {
|
|
20
|
-
return word.slice(0, -1) + "ies";
|
|
21
|
-
}
|
|
22
|
-
// Words ending in s, sh, ch, x, z → es
|
|
23
|
-
if (lower.endsWith("s") ||
|
|
24
|
-
lower.endsWith("sh") ||
|
|
25
|
-
lower.endsWith("ch") ||
|
|
26
|
-
lower.endsWith("x") ||
|
|
27
|
-
lower.endsWith("z")) {
|
|
28
|
-
return word + "es";
|
|
29
|
-
}
|
|
30
|
-
return word + "s";
|
|
14
|
+
return pluralizeModelName(word);
|
|
31
15
|
}
|
|
32
16
|
// ---------------------------------------------------------------------------
|
|
33
17
|
// Field → Zod mapping
|
|
@@ -62,6 +46,11 @@ function fieldToZod(field) {
|
|
|
62
46
|
case "json":
|
|
63
47
|
base = "z.unknown()";
|
|
64
48
|
break;
|
|
49
|
+
case "vector":
|
|
50
|
+
base = field.dimensions !== undefined
|
|
51
|
+
? `z.array(z.number()).length(${field.dimensions})`
|
|
52
|
+
: "z.array(z.number())";
|
|
53
|
+
break;
|
|
65
54
|
default:
|
|
66
55
|
base = "z.unknown()";
|
|
67
56
|
}
|
|
@@ -134,25 +123,25 @@ function buildZodObject(fields, options) {
|
|
|
134
123
|
* 2. `<plural>/[id].api.ts` — GET (by id) + PUT (update) + DELETE
|
|
135
124
|
*/
|
|
136
125
|
export function generateCrudRoutes(model) {
|
|
137
|
-
const plural = pluralize(model.name
|
|
126
|
+
const plural = pluralize(model.name);
|
|
138
127
|
const resourceName = model.name;
|
|
139
|
-
|
|
140
|
-
const
|
|
141
|
-
|
|
142
|
-
if (field.autoId)
|
|
143
|
-
autoFields.add(name);
|
|
144
|
-
if (field.updatedAt)
|
|
145
|
-
autoFields.add(name);
|
|
146
|
-
}
|
|
128
|
+
const serializedModel = JSON.stringify(model, null, 2);
|
|
129
|
+
const primaryKeyField = findPrimaryKeyField(model) ?? "id";
|
|
130
|
+
const autoFields = autoFieldNames(model);
|
|
147
131
|
// ----- index.api.ts (list + create) -----
|
|
148
132
|
const createSchema = buildZodObject(model.fields, { exclude: autoFields });
|
|
133
|
+
const tableName = plural;
|
|
149
134
|
const indexContent = `// Auto-generated CRUD routes for ${resourceName}
|
|
150
135
|
// This file was generated by @zauso-ai/capstan-db generateCrudRoutes().
|
|
151
136
|
|
|
152
137
|
import { defineAPI } from "@zauso-ai/capstan-core";
|
|
138
|
+
import { prepareCreateData } from "@zauso-ai/capstan-db";
|
|
153
139
|
import { z } from "zod";
|
|
140
|
+
import { db } from "../../db.js";
|
|
141
|
+
import { ${tableName} } from "../../db/schema.js";
|
|
154
142
|
|
|
155
143
|
export const meta = { resource: "${resourceName}" };
|
|
144
|
+
const model = ${serializedModel};
|
|
156
145
|
|
|
157
146
|
const CreateInput = ${createSchema};
|
|
158
147
|
|
|
@@ -161,8 +150,8 @@ export const GET = defineAPI({
|
|
|
161
150
|
resource: "${resourceName}",
|
|
162
151
|
description: "List all ${plural}",
|
|
163
152
|
handler: async ({ ctx }) => {
|
|
164
|
-
|
|
165
|
-
return { data:
|
|
153
|
+
const items = await db.select().from(${tableName});
|
|
154
|
+
return { data: items, total: items.length };
|
|
166
155
|
},
|
|
167
156
|
});
|
|
168
157
|
|
|
@@ -173,8 +162,9 @@ export const POST = defineAPI({
|
|
|
173
162
|
policy: "requireAuth",
|
|
174
163
|
input: CreateInput,
|
|
175
164
|
handler: async ({ input, ctx }) => {
|
|
176
|
-
|
|
177
|
-
|
|
165
|
+
const values = await prepareCreateData(model, input) as typeof ${tableName}.$inferInsert;
|
|
166
|
+
const result = await db.insert(${tableName}).values(values).returning();
|
|
167
|
+
return { data: result[0], created: true };
|
|
178
168
|
},
|
|
179
169
|
});
|
|
180
170
|
`;
|
|
@@ -187,9 +177,14 @@ export const POST = defineAPI({
|
|
|
187
177
|
// This file was generated by @zauso-ai/capstan-db generateCrudRoutes().
|
|
188
178
|
|
|
189
179
|
import { defineAPI } from "@zauso-ai/capstan-core";
|
|
180
|
+
import { prepareUpdateData } from "@zauso-ai/capstan-db";
|
|
190
181
|
import { z } from "zod";
|
|
182
|
+
import { eq } from "drizzle-orm";
|
|
183
|
+
import { db } from "../../db.js";
|
|
184
|
+
import { ${tableName} } from "../../db/schema.js";
|
|
191
185
|
|
|
192
186
|
export const meta = { resource: "${resourceName}" };
|
|
187
|
+
const model = ${serializedModel};
|
|
193
188
|
|
|
194
189
|
const UpdateInput = ${updateSchema};
|
|
195
190
|
|
|
@@ -197,9 +192,9 @@ export const GET = defineAPI({
|
|
|
197
192
|
capability: "read",
|
|
198
193
|
resource: "${resourceName}",
|
|
199
194
|
description: "Get a ${resourceName} by id",
|
|
200
|
-
handler: async ({ input, ctx }) => {
|
|
201
|
-
|
|
202
|
-
return { data: null };
|
|
195
|
+
handler: async ({ input, ctx, params }) => {
|
|
196
|
+
const items = await db.select().from(${tableName}).where(eq(${tableName}.${primaryKeyField}, params.id));
|
|
197
|
+
return { data: items[0] ?? null };
|
|
203
198
|
},
|
|
204
199
|
});
|
|
205
200
|
|
|
@@ -209,9 +204,10 @@ export const PUT = defineAPI({
|
|
|
209
204
|
description: "Update a ${resourceName}",
|
|
210
205
|
policy: "requireAuth",
|
|
211
206
|
input: UpdateInput,
|
|
212
|
-
handler: async ({ input, ctx }) => {
|
|
213
|
-
|
|
214
|
-
|
|
207
|
+
handler: async ({ input, ctx, params }) => {
|
|
208
|
+
const values = await prepareUpdateData(model, input) as Partial<typeof ${tableName}.$inferInsert>;
|
|
209
|
+
const result = await db.update(${tableName}).set(values).where(eq(${tableName}.${primaryKeyField}, params.id)).returning();
|
|
210
|
+
return { data: result[0], updated: true };
|
|
215
211
|
},
|
|
216
212
|
});
|
|
217
213
|
|
|
@@ -220,8 +216,8 @@ export const DELETE = defineAPI({
|
|
|
220
216
|
resource: "${resourceName}",
|
|
221
217
|
description: "Delete a ${resourceName}",
|
|
222
218
|
policy: "requireAuth",
|
|
223
|
-
handler: async ({ ctx }) => {
|
|
224
|
-
|
|
219
|
+
handler: async ({ ctx, params }) => {
|
|
220
|
+
await db.delete(${tableName}).where(eq(${tableName}.${primaryKeyField}, params.id));
|
|
225
221
|
return { deleted: true };
|
|
226
222
|
},
|
|
227
223
|
});
|
|
@@ -231,4 +227,18 @@ export const DELETE = defineAPI({
|
|
|
231
227
|
{ path: `${plural}/[id].api.ts`, content: idContent },
|
|
232
228
|
];
|
|
233
229
|
}
|
|
230
|
+
export function createCrudRepository(database, model) {
|
|
231
|
+
return database.model(model);
|
|
232
|
+
}
|
|
233
|
+
export function createCrudRuntime(database, model) {
|
|
234
|
+
const repository = createCrudRepository(database, model);
|
|
235
|
+
return {
|
|
236
|
+
repository,
|
|
237
|
+
list: (options) => repository.findMany(options),
|
|
238
|
+
get: (id, options) => repository.findById(id, options),
|
|
239
|
+
create: (input, options) => repository.create(input, options),
|
|
240
|
+
update: (id, input, options) => repository.update(id, input, options),
|
|
241
|
+
remove: (id) => repository.delete(id),
|
|
242
|
+
};
|
|
243
|
+
}
|
|
234
244
|
//# sourceMappingURL=crud.js.map
|