@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.
Files changed (67) hide show
  1. package/dist/client.d.ts +31 -18
  2. package/dist/client.d.ts.map +1 -1
  3. package/dist/client.js +300 -24
  4. package/dist/client.js.map +1 -1
  5. package/dist/crud.d.ts +14 -0
  6. package/dist/crud.d.ts.map +1 -1
  7. package/dist/crud.js +49 -39
  8. package/dist/crud.js.map +1 -1
  9. package/dist/dialect.d.ts +25 -0
  10. package/dist/dialect.d.ts.map +1 -0
  11. package/dist/dialect.js +208 -0
  12. package/dist/dialect.js.map +1 -0
  13. package/dist/embedding.d.ts +63 -0
  14. package/dist/embedding.d.ts.map +1 -0
  15. package/dist/embedding.js +61 -0
  16. package/dist/embedding.js.map +1 -0
  17. package/dist/index.d.ts +14 -4
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +6 -2
  20. package/dist/index.js.map +1 -1
  21. package/dist/migrate.d.ts +44 -23
  22. package/dist/migrate.d.ts.map +1 -1
  23. package/dist/migrate.js +308 -125
  24. package/dist/migrate.js.map +1 -1
  25. package/dist/model.d.ts +9 -0
  26. package/dist/model.d.ts.map +1 -1
  27. package/dist/model.js +13 -0
  28. package/dist/model.js.map +1 -1
  29. package/dist/naming.d.ts +37 -0
  30. package/dist/naming.d.ts.map +1 -0
  31. package/dist/naming.js +196 -0
  32. package/dist/naming.js.map +1 -0
  33. package/dist/runtime.d.ts +51 -0
  34. package/dist/runtime.d.ts.map +1 -0
  35. package/dist/runtime.js +490 -0
  36. package/dist/runtime.js.map +1 -0
  37. package/dist/schema.d.ts +2 -12
  38. package/dist/schema.d.ts.map +1 -1
  39. package/dist/schema.js +199 -105
  40. package/dist/schema.js.map +1 -1
  41. package/dist/search.d.ts +52 -0
  42. package/dist/search.d.ts.map +1 -0
  43. package/dist/search.js +110 -0
  44. package/dist/search.js.map +1 -0
  45. package/dist/types.d.ts +5 -2
  46. package/dist/types.d.ts.map +1 -1
  47. package/dist/vector-store-memory.d.ts +31 -0
  48. package/dist/vector-store-memory.d.ts.map +1 -0
  49. package/dist/vector-store-memory.js +125 -0
  50. package/dist/vector-store-memory.js.map +1 -0
  51. package/dist/vector-store-pgvector.d.ts +46 -0
  52. package/dist/vector-store-pgvector.d.ts.map +1 -0
  53. package/dist/vector-store-pgvector.js +215 -0
  54. package/dist/vector-store-pgvector.js.map +1 -0
  55. package/dist/vector-store-sqlite.d.ts +51 -0
  56. package/dist/vector-store-sqlite.d.ts.map +1 -0
  57. package/dist/vector-store-sqlite.js +203 -0
  58. package/dist/vector-store-sqlite.js.map +1 -0
  59. package/dist/vector-store.d.ts +79 -0
  60. package/dist/vector-store.d.ts.map +1 -0
  61. package/dist/vector-store.js +5 -0
  62. package/dist/vector-store.js.map +1 -0
  63. package/dist/write.d.ts +15 -0
  64. package/dist/write.d.ts.map +1 -0
  65. package/dist/write.js +156 -0
  66. package/dist/write.js.map +1 -0
  67. 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
- * Both `better-sqlite3` and `drizzle-orm` are optional peer dependencies. They
12
- * are loaded lazily so that `@zauso-ai/capstan-db` can be installed even when
13
- * native compilation of `better-sqlite3` fails. The actual database features
14
- * will not work until the peer dependencies are installed.
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. Currently only `sqlite` provider is
17
- * supported. The `url` field should be a file path (or `:memory:` for an
18
- * in-memory database).
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 `better-sqlite3` or `drizzle-orm` are not installed, throws an
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
- * // ... use db ...
26
- * close();
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
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAIjD,MAAM,WAAW,gBAAgB;IAC/B,yCAAyC;IACzC,EAAE,EAAE,OAAO,CAAC;IACZ,gDAAgD;IAChD,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,gBAAgB,CA6CvE"}
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 { createRequire } from "node:module";
2
- const require = createRequire(import.meta.url);
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
- * Both `better-sqlite3` and `drizzle-orm` are optional peer dependencies. They
7
- * are loaded lazily so that `@zauso-ai/capstan-db` can be installed even when
8
- * native compilation of `better-sqlite3` fails. The actual database features
9
- * will not work until the peer dependencies are installed.
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. Currently only `sqlite` provider is
12
- * supported. The `url` field should be a file path (or `:memory:` for an
13
- * in-memory database).
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 `better-sqlite3` or `drizzle-orm` are not installed, throws an
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
- * // ... use db ...
21
- * close();
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
- if (config.provider !== "sqlite") {
25
- throw new Error(`@zauso-ai/capstan-db: Unsupported database provider "${config.provider}". Only "sqlite" is currently supported.`);
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
- BetterSqlite3 = require("better-sqlite3");
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 = require("drizzle-orm/better-sqlite3");
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(config.url);
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
- return {
53
- db,
54
- close() {
55
- sqlite.close();
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
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG5C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAS/C;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,cAAc,CAAC,MAAsB;IACnD,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CACb,wDAAwD,MAAM,CAAC,QAAQ,0CAA0C,CAClH,CAAC;IACJ,CAAC;IAED,8DAA8D;IAC9D,IAAI,aAAkB,CAAC;IACvB,IAAI,CAAC;QACH,aAAa,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,+FAA+F;YAC/F,+CAA+C;YAC/C,6DAA6D;YAC7D,qDAAqD,CACtD,CAAC;IACJ,CAAC;IAED,8DAA8D;IAC9D,IAAI,OAAY,CAAC;IACjB,IAAI,CAAC;QACH,MAAM,aAAa,GAAG,OAAO,CAAC,4BAA4B,CAAC,CAAC;QAC5D,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,8FAA8F;YAC9F,0CAA0C,CAC3C,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAE7C,0DAA0D;IAC1D,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAEpC,MAAM,EAAE,GAAG,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAEvC,OAAO;QACL,EAAE;QACF,KAAK;YACH,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAIrD,6EAA6E;AAC7E,sEAAsE;AACtE,8DAA8D;AAC9D,KAAK,UAAU,UAAU,CAAC,SAAiB;IACzC,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC;AAC3B,CAAC;AAID,SAAS,eAAe,CAAC,MAAkB;IACzC,OAAO,MAAM,IAAI,EAAE,CAAC;AACtB,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,MAAsB;IACzD,QAAQ,MAAM,CAAC,QAAQ,EAAE,CAAC;QACxB,KAAK,QAAQ;YACX,OAAO,oBAAoB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1C,KAAK,UAAU;YACb,OAAO,sBAAsB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC5C,KAAK,OAAO;YACV,OAAO,mBAAmB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACzC,KAAK,QAAQ;YACX,OAAO,oBAAoB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1C,OAAO,CAAC,CAAC,CAAC;YACR,MAAM,WAAW,GAAU,MAAM,CAAC,QAAQ,CAAC;YAC3C,MAAM,IAAI,KAAK,CACb,wDAAwD,MAAM,CAAC,WAAW,CAAC,IAAI,CAChF,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,0BAA0B;AAC1B,8EAA8E;AAE9E,KAAK,UAAU,oBAAoB,CAAC,GAAW;IAC7C,8DAA8D;IAC9D,IAAI,aAAkB,CAAC;IACvB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,gBAAgB,CAAC,CAAC;QAC/C,aAAa,GAAG,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,+FAA+F;YAC/F,+CAA+C;YAC/C,6DAA6D;YAC7D,qDAAqD,CACtD,CAAC;IACJ,CAAC;IAED,8DAA8D;IAC9D,IAAI,OAAY,CAAC;IACjB,IAAI,CAAC;QACH,MAAM,aAAa,GAAG,MAAM,UAAU,CAAC,4BAA4B,CAAC,CAAC;QACrE,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,8FAA8F;YAC9F,0CAA0C,CAC3C,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,GAAG,CAAC,CAAC;IAEtC,0DAA0D;IAC1D,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAEpC,MAAM,EAAE,GAAG,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACvC,MAAM,OAAO,GAAsB;QACjC,QAAQ,EAAE,QAAQ;QAClB,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM;YACrB,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACtC,OAAO,SAAS,CAAC,GAAG,CAAC,GAAG,eAAe,CAAC,MAAM,CAAC,CAA8B,CAAC;QAChF,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM;YACvB,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACtC,MAAM,UAAU,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAC5C,IAAI,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;gBAC1E,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,eAAe,CAAC,MAAM,CAAC,CAA8B,CAAC;gBACpF,OAAO,EAAE,YAAY,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;YAC7C,CAAC;YACD,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;YACzD,OAAO,EAAE,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC,EAAE,CAAC;QACvD,CAAC;QACD,KAAK,CAAC,WAAW,CAAI,EAA8C;YACjE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACrB,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC;gBACjC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACtB,OAAO,MAAM,CAAC;YAChB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBACxB,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;KACF,CAAC;IAEF,OAAO,qBAAqB,CAC1B,EAAE,EACF,QAAQ,EACR,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,EACpB,OAAO,CACR,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,kCAAkC;AAClC,8EAA8E;AAE9E,KAAK,UAAU,sBAAsB,CAAC,GAAW;IAC/C,8DAA8D;IAC9D,IAAI,IAAS,CAAC;IACd,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,GAAG,QAAQ,CAAC,IAAI,IAAK,QAAQ,CAAC,OAA6B,EAAE,IAAI,CAAC;IACxE,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,uGAAuG;YACvG,iCAAiC,CAClC,CAAC;IACJ,CAAC;IAED,8DAA8D;IAC9D,IAAI,OAAY,CAAC;IACjB,IAAI,CAAC;QACH,MAAM,aAAa,GAAG,MAAM,UAAU,CAAC,2BAA2B,CAAC,CAAC;QACpE,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,sHAAsH;YACtH,0CAA0C,CAC3C,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,EAAE,gBAAgB,EAAE,GAAG,EAAE,CAAC,CAAC;IAEjD,MAAM,EAAE,GAAG,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IACrC,MAAM,WAAW,GAAsB;QACrC,QAAQ,EAAE,UAAU;QACpB,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM;YACrB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;YAC9D,OAAO,MAAM,CAAC,IAAiC,CAAC;QAClD,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM;YACvB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;YAC9D,OAAO;gBACL,YAAY,EAAE,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM;gBACnD,IAAI,EAAE,MAAM,CAAC,IAAiC;aAC/C,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,WAAW,CAAI,EAA8C;YACjE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;YACpC,MAAM,OAAO,GAAsB;gBACjC,QAAQ,EAAE,UAAU;gBACpB,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM;oBAC3B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;oBACtE,OAAO,MAAM,CAAC,IAAiC,CAAC;gBAClD,CAAC;gBACD,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM;oBAC7B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;oBACtE,OAAO;wBACL,YAAY,EAAE,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM;wBACnD,IAAI,EAAE,MAAM,CAAC,IAAiC;qBAC/C,CAAC;gBACJ,CAAC;gBACD,KAAK,CAAC,WAAW,CAAI,OAAmD;oBACtE,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC;gBAC1B,CAAC;aACF,CAAC;YAEF,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC5B,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC;gBACjC,MAAM,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBAC7B,OAAO,MAAM,CAAC;YAChB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;gBAC/B,MAAM,KAAK,CAAC;YACd,CAAC;oBAAS,CAAC;gBACT,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,CAAC;QACH,CAAC;KACF,CAAC;IAEF,OAAO,qBAAqB,CAC1B,EAAE,EACF,UAAU,EACV,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,EAChB,WAAW,CACZ,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,iBAAiB;AACjB,8EAA8E;AAE9E,KAAK,UAAU,mBAAmB,CAAC,GAAW;IAC5C,8DAA8D;IAC9D,IAAI,UAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,gBAAgB,CAAC,CAAC;QAClD,UAAU,GAAG,MAAM,CAAC,UAAU,IAAK,MAAM,CAAC,OAAmC,EAAE,UAAU,CAAC;IAC5F,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,sFAAsF;YACtF,qCAAqC,CACtC,CAAC;IACJ,CAAC;IAED,8DAA8D;IAC9D,IAAI,OAAY,CAAC;IACjB,IAAI,CAAC;QACH,MAAM,aAAa,GAAG,MAAM,UAAU,CAAC,oBAAoB,CAAC,CAAC;QAC7D,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,0GAA0G;YAC1G,0CAA0C,CAC3C,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,UAAU,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IACtC,MAAM,EAAE,GAAG,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IACrC,SAAS,kBAAkB,CAAC,MAAe;QACzC,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAmC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1E,CAAC;IAED,MAAM,WAAW,GAAsB;QACrC,QAAQ,EAAE,OAAO;QACjB,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM;YACrB,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;YAC9D,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAC;QAClC,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM;YACvB,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;YAChE,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,MAAmC,EAAE,CAAC;YACpF,CAAC;YACD,MAAM,OAAO,GAAG,MAAmC,CAAC;YACpD,OAAO,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,CAAC,EAAE,CAAC;QACrD,CAAC;QACD,KAAK,CAAC,WAAW,CAAI,EAA8C;YACjE,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;YAC9C,MAAM,OAAO,GAAsB;gBACjC,QAAQ,EAAE,OAAO;gBACjB,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM;oBAC3B,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,SAAS,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;oBAC1E,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAC;gBAClC,CAAC;gBACD,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM;oBAC7B,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,SAAS,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;oBAC5E,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;wBAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,MAAmC,EAAE,CAAC;oBACpF,CAAC;oBACD,MAAM,OAAO,GAAG,MAAmC,CAAC;oBACpD,OAAO,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,CAAC,EAAE,CAAC;gBACrD,CAAC;gBACD,KAAK,CAAC,WAAW,CAAI,OAAmD;oBACtE,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC;gBAC1B,CAAC;aACF,CAAC;YAEF,MAAM,UAAU,CAAC,gBAAgB,EAAE,CAAC;YACpC,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC;gBACjC,MAAM,UAAU,CAAC,MAAM,EAAE,CAAC;gBAC1B,OAAO,MAAM,CAAC;YAChB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,UAAU,CAAC,QAAQ,EAAE,CAAC;gBAC5B,MAAM,KAAK,CAAC;YACd,CAAC;oBAAS,CAAC;gBACT,UAAU,CAAC,OAAO,EAAE,CAAC;YACvB,CAAC;QACH,CAAC;KACF,CAAC;IAEF,OAAO,qBAAqB,CAC1B,EAAE,EACF,OAAO,EACP,GAAG,EAAE;QACH,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC;IAClB,CAAC,EACD,WAAW,CACZ,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,kCAAkC;AAClC,8EAA8E;AAE9E,KAAK,UAAU,oBAAoB,CAAC,GAAW;IAC7C,8DAA8D;IAC9D,IAAI,YAAiB,CAAC;IACtB,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,MAAM,UAAU,CAAC,gBAAgB,CAAC,CAAC;QACxD,YAAY,GAAG,YAAY,CAAC,YAAY,IAAK,YAAY,CAAC,OAAqC,EAAE,YAAY,CAAC;IAChH,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,qGAAqG;YACrG,6CAA6C,CAC9C,CAAC;IACJ,CAAC;IAED,8DAA8D;IAC9D,IAAI,OAAY,CAAC;IACjB,IAAI,CAAC;QACH,MAAM,aAAa,GAAG,MAAM,UAAU,CAAC,oBAAoB,CAAC,CAAC;QAC7D,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,iHAAiH;YACjH,0CAA0C,CAC3C,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,YAAY,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;IACrC,MAAM,EAAE,GAAG,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAC/B,MAAM,OAAO,GAAsB;QACjC,QAAQ,EAAE,QAAQ;QAClB,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM;YACrB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC5E,OAAO,MAAM,CAAC,IAAiC,CAAC;QAClD,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM;YACvB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC5E,OAAO;gBACL,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;gBACpE,IAAI,EAAE,MAAM,CAAC,IAAiC;aAC/C,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,WAAW,CAAI,EAA8C;YACjE,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAC9B,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC;gBACjC,MAAM,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAC/B,OAAO,MAAM,CAAC;YAChB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;gBACjC,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;KACF,CAAC;IAEF,OAAO,qBAAqB,CAC1B,EAAE,EACF,QAAQ,EACR,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,EACpB,OAAO,CACR,CAAC;AACJ,CAAC"}
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
@@ -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;AAMnE,MAAM,WAAW,cAAc;IAC7B,qEAAqE;IACrE,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAMD;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA0B9C;AAiHD;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,eAAe,GAAG,cAAc,EAAE,CAsG3E"}
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
- if (word.length === 0)
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.toLowerCase());
126
+ const plural = pluralize(model.name);
138
127
  const resourceName = model.name;
139
- // Determine which fields are auto-generated (id, updatedAt).
140
- const autoFields = new Set();
141
- for (const [name, field] of Object.entries(model.fields)) {
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
- // TODO: replace with actual database query
165
- return { data: [], total: 0 };
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
- // TODO: replace with actual database insert
177
- return { data: { id: "TODO", ...input }, created: true };
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
- // TODO: replace with actual database lookup
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
- // TODO: replace with actual database update
214
- return { data: { id: "TODO", ...input }, updated: true };
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
- // TODO: replace with actual database delete
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