turbine-orm 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 (63) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +295 -0
  3. package/dist/cli/config.d.ts +58 -0
  4. package/dist/cli/config.d.ts.map +1 -0
  5. package/dist/cli/config.js +123 -0
  6. package/dist/cli/config.js.map +1 -0
  7. package/dist/cli/index.d.ts +23 -0
  8. package/dist/cli/index.d.ts.map +1 -0
  9. package/dist/cli/index.js +935 -0
  10. package/dist/cli/index.js.map +1 -0
  11. package/dist/cli/migrate.d.ts +94 -0
  12. package/dist/cli/migrate.d.ts.map +1 -0
  13. package/dist/cli/migrate.js +383 -0
  14. package/dist/cli/migrate.js.map +1 -0
  15. package/dist/cli/ui.d.ts +74 -0
  16. package/dist/cli/ui.d.ts.map +1 -0
  17. package/dist/cli/ui.js +220 -0
  18. package/dist/cli/ui.js.map +1 -0
  19. package/dist/client.d.ts +212 -0
  20. package/dist/client.d.ts.map +1 -0
  21. package/dist/client.js +423 -0
  22. package/dist/client.js.map +1 -0
  23. package/dist/generate.d.ts +24 -0
  24. package/dist/generate.d.ts.map +1 -0
  25. package/dist/generate.js +289 -0
  26. package/dist/generate.js.map +1 -0
  27. package/dist/index.d.ts +44 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +53 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/introspect.d.ts +22 -0
  32. package/dist/introspect.d.ts.map +1 -0
  33. package/dist/introspect.js +284 -0
  34. package/dist/introspect.js.map +1 -0
  35. package/dist/pipeline.d.ts +44 -0
  36. package/dist/pipeline.d.ts.map +1 -0
  37. package/dist/pipeline.js +69 -0
  38. package/dist/pipeline.js.map +1 -0
  39. package/dist/query.d.ts +342 -0
  40. package/dist/query.d.ts.map +1 -0
  41. package/dist/query.js +1396 -0
  42. package/dist/query.js.map +1 -0
  43. package/dist/schema-builder.d.ts +127 -0
  44. package/dist/schema-builder.d.ts.map +1 -0
  45. package/dist/schema-builder.js +164 -0
  46. package/dist/schema-builder.js.map +1 -0
  47. package/dist/schema-sql.d.ts +71 -0
  48. package/dist/schema-sql.d.ts.map +1 -0
  49. package/dist/schema-sql.js +347 -0
  50. package/dist/schema-sql.js.map +1 -0
  51. package/dist/schema.d.ts +90 -0
  52. package/dist/schema.d.ts.map +1 -0
  53. package/dist/schema.js +129 -0
  54. package/dist/schema.js.map +1 -0
  55. package/dist/serverless.d.ts +162 -0
  56. package/dist/serverless.d.ts.map +1 -0
  57. package/dist/serverless.js +195 -0
  58. package/dist/serverless.js.map +1 -0
  59. package/dist/types.d.ts +93 -0
  60. package/dist/types.d.ts.map +1 -0
  61. package/dist/types.js +126 -0
  62. package/dist/types.js.map +1 -0
  63. package/package.json +74 -0
package/dist/client.js ADDED
@@ -0,0 +1,423 @@
1
+ /**
2
+ * @batadata/turbine — TurbineClient
3
+ *
4
+ * The main entry point for the Turbine TypeScript SDK.
5
+ * Manages connection pooling and provides typed table accessors.
6
+ *
7
+ * Schema-driven: call `table<T>(name)` to get a QueryInterface for any
8
+ * table in the introspected schema. Generated clients extend this with
9
+ * typed properties (e.g. `db.users`, `db.posts`).
10
+ *
11
+ * @example
12
+ * ```ts
13
+ * // With generated client (recommended):
14
+ * import { turbine } from './generated/turbine';
15
+ * const db = turbine({ connectionString: process.env.DATABASE_URL });
16
+ * const user = await db.users.findUnique({ where: { id: 1 } });
17
+ *
18
+ * // With base client (dynamic):
19
+ * import { TurbineClient } from '@batadata/turbine';
20
+ * const db = new TurbineClient({ connectionString: '...' }, schema);
21
+ * const users = db.table<User>('users');
22
+ * ```
23
+ */
24
+ import pg from 'pg';
25
+ import { QueryInterface } from './query.js';
26
+ import { executePipeline } from './pipeline.js';
27
+ // Parse int8 (bigint, OID 20) as JavaScript number instead of string.
28
+ // Safe for values up to Number.MAX_SAFE_INTEGER (9,007,199,254,740,991).
29
+ pg.types.setTypeParser(20, (val) => {
30
+ const n = Number(val);
31
+ return Number.isSafeInteger(n) ? n : val; // fall back to string for huge values
32
+ });
33
+ // Parse numeric (OID 1700) as number when safe, string otherwise
34
+ pg.types.setTypeParser(1700, (val) => {
35
+ const n = Number(val);
36
+ if (val.includes('.') && Number.isFinite(n))
37
+ return n;
38
+ return Number.isSafeInteger(n) ? n : val;
39
+ });
40
+ /** Maps isolation level names to SQL */
41
+ const ISOLATION_LEVELS = {
42
+ ReadUncommitted: 'READ UNCOMMITTED',
43
+ ReadCommitted: 'READ COMMITTED',
44
+ RepeatableRead: 'REPEATABLE READ',
45
+ Serializable: 'SERIALIZABLE',
46
+ };
47
+ // ---------------------------------------------------------------------------
48
+ // TransactionClient — provides typed table accessors within a transaction
49
+ // ---------------------------------------------------------------------------
50
+ /**
51
+ * A transaction-scoped client that provides the same table accessor API as TurbineClient.
52
+ * All queries run on a dedicated connection within a BEGIN/COMMIT block.
53
+ * Supports nested transactions via SAVEPOINTs.
54
+ */
55
+ export class TransactionClient {
56
+ client;
57
+ schema;
58
+ middlewares;
59
+ tableCache = new Map();
60
+ savepointCounter = 0;
61
+ constructor(client, schema, middlewares) {
62
+ this.client = client;
63
+ this.schema = schema;
64
+ this.middlewares = middlewares;
65
+ // Auto-create typed table accessors for all tables in the schema
66
+ for (const tableName of Object.keys(schema.tables)) {
67
+ const camelName = tableName.replace(/_([a-z])/g, (_, c) => c.toUpperCase());
68
+ if (!(camelName in this)) {
69
+ Object.defineProperty(this, camelName, {
70
+ get: () => this.table(tableName),
71
+ enumerable: true,
72
+ });
73
+ }
74
+ }
75
+ }
76
+ /**
77
+ * Get a QueryInterface for a table within this transaction.
78
+ * Uses the dedicated transaction connection instead of the pool.
79
+ */
80
+ table(name) {
81
+ let qi = this.tableCache.get(name);
82
+ if (!qi) {
83
+ // Create a QueryInterface that uses the transaction client as its "pool"
84
+ // We use a proxy pool that routes queries through the transaction client
85
+ const txPool = this.createTxPool();
86
+ qi = new QueryInterface(txPool, name, this.schema, this.middlewares);
87
+ this.tableCache.set(name, qi);
88
+ }
89
+ return qi;
90
+ }
91
+ /**
92
+ * Execute a nested transaction via SAVEPOINT.
93
+ * If the inner function throws, only the savepoint is rolled back.
94
+ */
95
+ async $transaction(fn) {
96
+ const savepointName = `sp_${++this.savepointCounter}`;
97
+ await this.client.query(`SAVEPOINT ${savepointName}`);
98
+ try {
99
+ const result = await fn(this);
100
+ await this.client.query(`RELEASE SAVEPOINT ${savepointName}`);
101
+ return result;
102
+ }
103
+ catch (err) {
104
+ await this.client.query(`ROLLBACK TO SAVEPOINT ${savepointName}`);
105
+ throw err;
106
+ }
107
+ }
108
+ /**
109
+ * Execute a raw SQL query within this transaction.
110
+ */
111
+ async raw(strings, ...values) {
112
+ let sql = '';
113
+ strings.forEach((str, i) => {
114
+ sql += str;
115
+ if (i < values.length) {
116
+ sql += `$${i + 1}`;
117
+ }
118
+ });
119
+ const result = await this.client.query(sql, values);
120
+ return result.rows;
121
+ }
122
+ /**
123
+ * Create a pool-like wrapper around the transaction client.
124
+ * This allows QueryInterface to work with the transaction connection
125
+ * without knowing it's in a transaction.
126
+ */
127
+ createTxPool() {
128
+ const client = this.client;
129
+ // Return a minimal pool-compatible object that routes queries
130
+ // through the transaction client
131
+ return {
132
+ query: (text, values) => client.query(text, values),
133
+ connect: () => Promise.resolve(client),
134
+ };
135
+ }
136
+ }
137
+ // ---------------------------------------------------------------------------
138
+ // TurbineClient
139
+ // ---------------------------------------------------------------------------
140
+ export class TurbineClient {
141
+ /** The underlying pg.Pool — exposed for escape hatches */
142
+ pool;
143
+ /** The schema metadata this client was built from */
144
+ schema;
145
+ logging;
146
+ tableCache = new Map();
147
+ middlewares = [];
148
+ constructor(config = {}, schema) {
149
+ this.logging = config.logging ?? false;
150
+ this.schema = schema;
151
+ const poolConfig = {
152
+ max: config.poolSize ?? 10,
153
+ idleTimeoutMillis: config.idleTimeoutMs ?? 30_000,
154
+ connectionTimeoutMillis: config.connectionTimeoutMs ?? 5_000,
155
+ };
156
+ if (config.connectionString) {
157
+ poolConfig.connectionString = config.connectionString;
158
+ }
159
+ else {
160
+ poolConfig.host = config.host ?? 'localhost';
161
+ poolConfig.port = config.port ?? 5432;
162
+ poolConfig.database = config.database ?? 'postgres';
163
+ poolConfig.user = config.user ?? 'postgres';
164
+ poolConfig.password = config.password ?? 'postgres';
165
+ }
166
+ this.pool = new pg.Pool(poolConfig);
167
+ this.pool.on('error', (err) => {
168
+ console.error('[turbine] Unexpected pool error:', err.message);
169
+ });
170
+ if (this.logging) {
171
+ console.log(`[turbine] Pool created — max ${poolConfig.max} connections, ${Object.keys(schema.tables).length} tables`);
172
+ }
173
+ // Auto-create typed table accessors for all tables in the schema
174
+ for (const tableName of Object.keys(schema.tables)) {
175
+ const camelName = tableName.replace(/_([a-z])/g, (_, c) => c.toUpperCase());
176
+ if (!(camelName in this)) {
177
+ Object.defineProperty(this, camelName, {
178
+ get: () => this.table(tableName),
179
+ enumerable: true,
180
+ });
181
+ }
182
+ }
183
+ }
184
+ // -------------------------------------------------------------------------
185
+ // Middleware — intercept all queries
186
+ // -------------------------------------------------------------------------
187
+ /**
188
+ * Register a middleware function that runs before/after every query.
189
+ *
190
+ * @example
191
+ * ```ts
192
+ * // Query timing middleware
193
+ * db.$use(async (params, next) => {
194
+ * const before = Date.now();
195
+ * const result = await next(params);
196
+ * console.log(`${params.model}.${params.action} took ${Date.now() - before}ms`);
197
+ * return result;
198
+ * });
199
+ *
200
+ * // Soft-delete middleware
201
+ * db.$use(async (params, next) => {
202
+ * if (params.action === 'findMany' || params.action === 'findUnique') {
203
+ * params.args.where = { ...params.args.where, deletedAt: null };
204
+ * }
205
+ * if (params.action === 'delete') {
206
+ * params.action = 'update';
207
+ * params.args = { where: params.args.where, data: { deletedAt: new Date() } };
208
+ * }
209
+ * return next(params);
210
+ * });
211
+ * ```
212
+ */
213
+ $use(middleware) {
214
+ this.middlewares.push(middleware);
215
+ // Clear table cache so new QueryInterfaces pick up the middleware
216
+ this.tableCache.clear();
217
+ }
218
+ // -------------------------------------------------------------------------
219
+ // Table accessor — creates QueryInterface for any table
220
+ // -------------------------------------------------------------------------
221
+ /**
222
+ * Get a QueryInterface for a table.
223
+ * Results are cached — calling `table('users')` twice returns the same instance.
224
+ */
225
+ table(name) {
226
+ let qi = this.tableCache.get(name);
227
+ if (!qi) {
228
+ qi = new QueryInterface(this.pool, name, this.schema, this.middlewares);
229
+ this.tableCache.set(name, qi);
230
+ }
231
+ return qi;
232
+ }
233
+ // -------------------------------------------------------------------------
234
+ // Pipeline — batch multiple queries into one round-trip
235
+ // -------------------------------------------------------------------------
236
+ /**
237
+ * Execute multiple queries in a single database round-trip.
238
+ *
239
+ * Pass the result of any `.build*()` method on a table accessor.
240
+ */
241
+ async pipeline(...queries) {
242
+ if (this.logging) {
243
+ console.log(`[turbine] Pipeline: ${queries.length} queries — ${queries.map((q) => q.tag).join(', ')}`);
244
+ }
245
+ return executePipeline(this.pool, queries);
246
+ }
247
+ // -------------------------------------------------------------------------
248
+ // Raw SQL — tagged template literal escape hatch
249
+ // -------------------------------------------------------------------------
250
+ /**
251
+ * Execute a raw SQL query with parameter interpolation via tagged templates.
252
+ *
253
+ * @example
254
+ * ```ts
255
+ * const result = await db.raw<{ day: Date; count: number }>`
256
+ * SELECT DATE_TRUNC('day', created_at) as day, COUNT(*)::int as count
257
+ * FROM posts WHERE org_id = ${orgId}
258
+ * GROUP BY day ORDER BY day
259
+ * `;
260
+ * ```
261
+ */
262
+ async raw(strings, ...values) {
263
+ let sql = '';
264
+ strings.forEach((str, i) => {
265
+ sql += str;
266
+ if (i < values.length) {
267
+ sql += `$${i + 1}`;
268
+ }
269
+ });
270
+ if (this.logging) {
271
+ console.log(`[turbine] Raw SQL: ${sql.trim().substring(0, 120)}...`);
272
+ }
273
+ const result = await this.pool.query(sql, values);
274
+ return result.rows;
275
+ }
276
+ // -------------------------------------------------------------------------
277
+ // Transaction support (raw — legacy)
278
+ // -------------------------------------------------------------------------
279
+ /**
280
+ * Execute a function within a database transaction (raw pg.PoolClient).
281
+ * For the typed API, use `$transaction()` instead.
282
+ *
283
+ * @example
284
+ * ```ts
285
+ * await db.transaction(async (client) => {
286
+ * await client.query('INSERT INTO users (name) VALUES ($1)', ['Alice']);
287
+ * });
288
+ * ```
289
+ */
290
+ async transaction(fn) {
291
+ const client = await this.pool.connect();
292
+ try {
293
+ await client.query('BEGIN');
294
+ const result = await fn(client);
295
+ await client.query('COMMIT');
296
+ return result;
297
+ }
298
+ catch (err) {
299
+ await client.query('ROLLBACK');
300
+ throw err;
301
+ }
302
+ finally {
303
+ client.release();
304
+ }
305
+ }
306
+ // -------------------------------------------------------------------------
307
+ // $transaction — Prisma-style typed transaction API
308
+ // -------------------------------------------------------------------------
309
+ /**
310
+ * Execute a function within a database transaction with full typed table accessors.
311
+ *
312
+ * The `tx` object provides the same table accessor API as the main client.
313
+ * Supports nested transactions via SAVEPOINTs, timeouts, and isolation levels.
314
+ *
315
+ * @example
316
+ * ```ts
317
+ * await db.$transaction(async (tx) => {
318
+ * const user = await tx.users.create({ data: { email: 'a@b.com' } });
319
+ * await tx.posts.create({ data: { userId: user.id, title: 'Hello' } });
320
+ * });
321
+ *
322
+ * // With options:
323
+ * await db.$transaction(async (tx) => {
324
+ * // ...
325
+ * }, { timeout: 5000, isolationLevel: 'Serializable' });
326
+ * ```
327
+ */
328
+ async $transaction(fn, options) {
329
+ const client = await this.pool.connect();
330
+ const timeout = options?.timeout;
331
+ try {
332
+ // BEGIN with optional isolation level
333
+ let beginSQL = 'BEGIN';
334
+ if (options?.isolationLevel) {
335
+ const level = ISOLATION_LEVELS[options.isolationLevel];
336
+ if (level)
337
+ beginSQL += ` ISOLATION LEVEL ${level}`;
338
+ }
339
+ await client.query(beginSQL);
340
+ // Create the transaction client with typed table accessors
341
+ const tx = new TransactionClient(client, this.schema, this.middlewares);
342
+ // Dynamically attach table accessors to tx
343
+ for (const tableName of Object.keys(this.schema.tables)) {
344
+ const camelName = tableName.replace(/_([a-z])/g, (_, c) => c.toUpperCase());
345
+ if (!(camelName in tx)) {
346
+ Object.defineProperty(tx, camelName, {
347
+ get: () => tx.table(tableName),
348
+ enumerable: true,
349
+ });
350
+ }
351
+ }
352
+ let result;
353
+ if (timeout) {
354
+ // Race between the function and a timeout
355
+ const timeoutPromise = new Promise((_, reject) => {
356
+ setTimeout(() => {
357
+ reject(new Error(`[turbine] Transaction timed out after ${timeout}ms`));
358
+ }, timeout);
359
+ });
360
+ result = await Promise.race([fn(tx), timeoutPromise]);
361
+ }
362
+ else {
363
+ result = await fn(tx);
364
+ }
365
+ await client.query('COMMIT');
366
+ if (this.logging) {
367
+ console.log('[turbine] Transaction committed');
368
+ }
369
+ return result;
370
+ }
371
+ catch (err) {
372
+ await client.query('ROLLBACK');
373
+ if (this.logging) {
374
+ console.log('[turbine] Transaction rolled back');
375
+ }
376
+ throw err;
377
+ }
378
+ finally {
379
+ client.release();
380
+ }
381
+ }
382
+ // -------------------------------------------------------------------------
383
+ // Connection lifecycle
384
+ // -------------------------------------------------------------------------
385
+ /**
386
+ * Test the database connection.
387
+ * Throws if the connection fails.
388
+ */
389
+ async connect() {
390
+ const client = await this.pool.connect();
391
+ try {
392
+ await client.query('SELECT 1');
393
+ if (this.logging) {
394
+ console.log('[turbine] Connection verified');
395
+ }
396
+ }
397
+ finally {
398
+ client.release();
399
+ }
400
+ }
401
+ /**
402
+ * Gracefully shut down the connection pool.
403
+ */
404
+ async disconnect() {
405
+ await this.pool.end();
406
+ if (this.logging) {
407
+ console.log('[turbine] Pool disconnected');
408
+ }
409
+ }
410
+ /** Alias for disconnect() */
411
+ async end() {
412
+ return this.disconnect();
413
+ }
414
+ /** Pool statistics for monitoring. */
415
+ get stats() {
416
+ return {
417
+ totalCount: this.pool.totalCount,
418
+ idleCount: this.pool.idleCount,
419
+ waitingCount: this.pool.waitingCount,
420
+ };
421
+ }
422
+ }
423
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * @batadata/turbine — Code generator
3
+ *
4
+ * Takes an IntrospectedSchema and emits TypeScript files:
5
+ * - types.ts — Entity interfaces, Create/Update input types
6
+ * - metadata.ts — Runtime schema metadata (column maps, relations, etc.)
7
+ * - index.ts — Configured TurbineClient with typed table accessors
8
+ *
9
+ * Output goes to the specified directory (default: ./generated/turbine/).
10
+ */
11
+ import { type SchemaMetadata } from './schema.js';
12
+ export interface GenerateOptions {
13
+ /** The introspected schema to generate from */
14
+ schema: SchemaMetadata;
15
+ /** Output directory (default: './generated/turbine') */
16
+ outDir?: string;
17
+ /** Redact connection string from generated comments */
18
+ connectionString?: string;
19
+ }
20
+ export declare function generate(options: GenerateOptions): {
21
+ outDir: string;
22
+ files: string[];
23
+ };
24
+ //# sourceMappingURL=generate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,EACL,KAAK,cAAc,EAKpB,MAAM,aAAa,CAAC;AAWrB,MAAM,WAAW,eAAe;IAC9B,+CAA+C;IAC/C,MAAM,EAAE,cAAc,CAAC;IACvB,wDAAwD;IACxD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,uDAAuD;IACvD,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAMD,wBAAgB,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAsBtF"}