@zauso-ai/capstan-db 1.0.0-beta.6 → 1.0.0-beta.8
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 +3 -6
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +179 -35
- 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/index.d.ts +8 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/migrate.d.ts +22 -46
- package/dist/migrate.d.ts.map +1 -1
- package/dist/migrate.js +245 -160
- package/dist/migrate.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 -27
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +181 -209
- package/dist/schema.js.map +1 -1
- 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 +5 -1
package/dist/client.d.ts
CHANGED
|
@@ -1,9 +1,6 @@
|
|
|
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
6
|
* Create a Drizzle database instance backed by better-sqlite3 (SQLite),
|
|
@@ -41,5 +38,5 @@ export interface DatabaseInstance {
|
|
|
41
38
|
* url: "mysql://user:pass@localhost:3306/mydb",
|
|
42
39
|
* });
|
|
43
40
|
*/
|
|
44
|
-
export declare function createDatabase(config: DatabaseConfig): DatabaseInstance
|
|
41
|
+
export declare function createDatabase(config: DatabaseConfig): Promise<DatabaseInstance>;
|
|
45
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,5 +1,13 @@
|
|
|
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
12
|
* Create a Drizzle database instance backed by better-sqlite3 (SQLite),
|
|
5
13
|
* node-postgres (PostgreSQL), or mysql2 (MySQL).
|
|
@@ -36,7 +44,7 @@ const require = createRequire(import.meta.url);
|
|
|
36
44
|
* url: "mysql://user:pass@localhost:3306/mydb",
|
|
37
45
|
* });
|
|
38
46
|
*/
|
|
39
|
-
export function createDatabase(config) {
|
|
47
|
+
export async function createDatabase(config) {
|
|
40
48
|
switch (config.provider) {
|
|
41
49
|
case "sqlite":
|
|
42
50
|
return createSqliteDatabase(config.url);
|
|
@@ -55,11 +63,12 @@ export function createDatabase(config) {
|
|
|
55
63
|
// ---------------------------------------------------------------------------
|
|
56
64
|
// SQLite (better-sqlite3)
|
|
57
65
|
// ---------------------------------------------------------------------------
|
|
58
|
-
function createSqliteDatabase(url) {
|
|
66
|
+
async function createSqliteDatabase(url) {
|
|
59
67
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
60
68
|
let BetterSqlite3;
|
|
61
69
|
try {
|
|
62
|
-
|
|
70
|
+
const mod = await importPeer("better-sqlite3");
|
|
71
|
+
BetterSqlite3 = mod.default ?? mod;
|
|
63
72
|
}
|
|
64
73
|
catch {
|
|
65
74
|
throw new Error(`@zauso-ai/capstan-db: "better-sqlite3" is required for SQLite support but is not installed.\n` +
|
|
@@ -70,7 +79,7 @@ function createSqliteDatabase(url) {
|
|
|
70
79
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
71
80
|
let drizzle;
|
|
72
81
|
try {
|
|
73
|
-
const drizzleModule =
|
|
82
|
+
const drizzleModule = await importPeer("drizzle-orm/better-sqlite3");
|
|
74
83
|
drizzle = drizzleModule.drizzle;
|
|
75
84
|
}
|
|
76
85
|
catch {
|
|
@@ -81,22 +90,46 @@ function createSqliteDatabase(url) {
|
|
|
81
90
|
// Enable WAL mode for better concurrent read performance.
|
|
82
91
|
sqlite.pragma("journal_mode = WAL");
|
|
83
92
|
const db = drizzle({ client: sqlite });
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
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
|
+
}
|
|
88
120
|
},
|
|
89
121
|
};
|
|
122
|
+
return createDatabaseRuntime(db, "sqlite", () => sqlite.close(), adapter);
|
|
90
123
|
}
|
|
91
124
|
// ---------------------------------------------------------------------------
|
|
92
125
|
// PostgreSQL (node-postgres / pg)
|
|
93
126
|
// ---------------------------------------------------------------------------
|
|
94
|
-
function createPostgresDatabase(url) {
|
|
127
|
+
async function createPostgresDatabase(url) {
|
|
95
128
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
96
129
|
let Pool;
|
|
97
130
|
try {
|
|
98
|
-
const pgModule =
|
|
99
|
-
Pool = pgModule.Pool;
|
|
131
|
+
const pgModule = await importPeer("pg");
|
|
132
|
+
Pool = pgModule.Pool ?? pgModule.default?.Pool;
|
|
100
133
|
}
|
|
101
134
|
catch {
|
|
102
135
|
throw new Error(`@zauso-ai/capstan-db: "pg" (node-postgres) is required for PostgreSQL support but is not installed.\n` +
|
|
@@ -105,7 +138,7 @@ function createPostgresDatabase(url) {
|
|
|
105
138
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
106
139
|
let drizzle;
|
|
107
140
|
try {
|
|
108
|
-
const drizzleModule =
|
|
141
|
+
const drizzleModule = await importPeer("drizzle-orm/node-postgres");
|
|
109
142
|
drizzle = drizzleModule.drizzle;
|
|
110
143
|
}
|
|
111
144
|
catch {
|
|
@@ -114,22 +147,64 @@ function createPostgresDatabase(url) {
|
|
|
114
147
|
}
|
|
115
148
|
const pool = new Pool({ connectionString: url });
|
|
116
149
|
const db = drizzle({ client: pool });
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
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
|
+
}
|
|
121
195
|
},
|
|
122
196
|
};
|
|
197
|
+
return createDatabaseRuntime(db, "postgres", () => pool.end(), rootAdapter);
|
|
123
198
|
}
|
|
124
199
|
// ---------------------------------------------------------------------------
|
|
125
200
|
// MySQL (mysql2)
|
|
126
201
|
// ---------------------------------------------------------------------------
|
|
127
|
-
function createMysqlDatabase(url) {
|
|
202
|
+
async function createMysqlDatabase(url) {
|
|
128
203
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
129
204
|
let createPool;
|
|
130
205
|
try {
|
|
131
|
-
const mysql2 =
|
|
132
|
-
createPool = mysql2.createPool;
|
|
206
|
+
const mysql2 = await importPeer("mysql2/promise");
|
|
207
|
+
createPool = mysql2.createPool ?? mysql2.default?.createPool;
|
|
133
208
|
}
|
|
134
209
|
catch {
|
|
135
210
|
throw new Error(`@zauso-ai/capstan-db: "mysql2" is required for MySQL support but is not installed.\n` +
|
|
@@ -138,7 +213,7 @@ function createMysqlDatabase(url) {
|
|
|
138
213
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
139
214
|
let drizzle;
|
|
140
215
|
try {
|
|
141
|
-
const drizzleModule =
|
|
216
|
+
const drizzleModule = await importPeer("drizzle-orm/mysql2");
|
|
142
217
|
drizzle = drizzleModule.drizzle;
|
|
143
218
|
}
|
|
144
219
|
catch {
|
|
@@ -147,23 +222,71 @@ function createMysqlDatabase(url) {
|
|
|
147
222
|
}
|
|
148
223
|
const pool = createPool({ uri: url });
|
|
149
224
|
const db = drizzle({ client: pool });
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
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
|
+
}
|
|
155
275
|
},
|
|
156
276
|
};
|
|
277
|
+
return createDatabaseRuntime(db, "mysql", () => {
|
|
278
|
+
void pool.end();
|
|
279
|
+
}, rootAdapter);
|
|
157
280
|
}
|
|
158
281
|
// ---------------------------------------------------------------------------
|
|
159
282
|
// libSQL / Turso (@libsql/client)
|
|
160
283
|
// ---------------------------------------------------------------------------
|
|
161
|
-
function createLibsqlDatabase(url) {
|
|
284
|
+
async function createLibsqlDatabase(url) {
|
|
162
285
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
163
286
|
let createClient;
|
|
164
287
|
try {
|
|
165
|
-
const libsqlModule =
|
|
166
|
-
createClient = libsqlModule.createClient;
|
|
288
|
+
const libsqlModule = await importPeer("@libsql/client");
|
|
289
|
+
createClient = libsqlModule.createClient ?? libsqlModule.default?.createClient;
|
|
167
290
|
}
|
|
168
291
|
catch {
|
|
169
292
|
throw new Error(`@zauso-ai/capstan-db: "@libsql/client" is required for libSQL/Turso support but is not installed.\n` +
|
|
@@ -172,7 +295,7 @@ function createLibsqlDatabase(url) {
|
|
|
172
295
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
173
296
|
let drizzle;
|
|
174
297
|
try {
|
|
175
|
-
const drizzleModule =
|
|
298
|
+
const drizzleModule = await importPeer("drizzle-orm/libsql");
|
|
176
299
|
drizzle = drizzleModule.drizzle;
|
|
177
300
|
}
|
|
178
301
|
catch {
|
|
@@ -181,11 +304,32 @@ function createLibsqlDatabase(url) {
|
|
|
181
304
|
}
|
|
182
305
|
const client = createClient({ url });
|
|
183
306
|
const db = drizzle({ client });
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
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
|
+
}
|
|
188
331
|
},
|
|
189
332
|
};
|
|
333
|
+
return createDatabaseRuntime(db, "libsql", () => client.close(), adapter);
|
|
190
334
|
}
|
|
191
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
|
package/dist/crud.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crud.js","sourceRoot":"","sources":["../src/crud.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"crud.js","sourceRoot":"","sources":["../src/crud.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { DbProvider, FieldDefinition, ScalarType } from "./types.js";
|
|
2
|
+
export interface ProviderMeta {
|
|
3
|
+
tableBuilder: string;
|
|
4
|
+
importModule: string;
|
|
5
|
+
nowDefaultSql: string;
|
|
6
|
+
}
|
|
7
|
+
export interface ColumnMapping {
|
|
8
|
+
builder: string;
|
|
9
|
+
import: string;
|
|
10
|
+
config?: string;
|
|
11
|
+
sqlType: string;
|
|
12
|
+
}
|
|
13
|
+
export declare function providerMeta(provider: DbProvider): ProviderMeta;
|
|
14
|
+
export declare function columnMapping(fieldType: ScalarType, provider: DbProvider, dimensions?: number): ColumnMapping;
|
|
15
|
+
export declare function columnMappingForReference(targetField: FieldDefinition, provider: DbProvider): ColumnMapping;
|
|
16
|
+
export declare function sqlTypeForField(def: FieldDefinition, provider: DbProvider): string;
|
|
17
|
+
export declare function sqlTypeForReference(targetField: FieldDefinition, provider: DbProvider): string;
|
|
18
|
+
export declare function autoIdSchemaExpr(columnName: string, provider: DbProvider): {
|
|
19
|
+
expr: string;
|
|
20
|
+
imports: string[];
|
|
21
|
+
needsSql: boolean;
|
|
22
|
+
};
|
|
23
|
+
export declare function autoIdSqlDefault(provider: DbProvider): string;
|
|
24
|
+
export declare function sqlDefaultClause(def: FieldDefinition, provider: DbProvider): string | null;
|
|
25
|
+
//# sourceMappingURL=dialect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dialect.d.ts","sourceRoot":"","sources":["../src/dialect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE1E,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAQD,wBAAgB,YAAY,CAAC,QAAQ,EAAE,UAAU,GAAG,YAAY,CAsB/D;AAyED,wBAAgB,aAAa,CAAC,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,aAAa,CAU7G;AAED,wBAAgB,yBAAyB,CAAC,WAAW,EAAE,eAAe,EAAE,QAAQ,EAAE,UAAU,GAAG,aAAa,CAc3G;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,eAAe,EAAE,QAAQ,EAAE,UAAU,GAAG,MAAM,CAalF;AAED,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,eAAe,EAAE,QAAQ,EAAE,UAAU,GAAG,MAAM,CAE9F;AAED,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAsBjI;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,UAAU,GAAG,MAAM,CAU7D;AAMD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,eAAe,EAAE,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,CAiC1F"}
|