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.
- package/LICENSE +21 -0
- package/README.md +295 -0
- package/dist/cli/config.d.ts +58 -0
- package/dist/cli/config.d.ts.map +1 -0
- package/dist/cli/config.js +123 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/index.d.ts +23 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +935 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/migrate.d.ts +94 -0
- package/dist/cli/migrate.d.ts.map +1 -0
- package/dist/cli/migrate.js +383 -0
- package/dist/cli/migrate.js.map +1 -0
- package/dist/cli/ui.d.ts +74 -0
- package/dist/cli/ui.d.ts.map +1 -0
- package/dist/cli/ui.js +220 -0
- package/dist/cli/ui.js.map +1 -0
- package/dist/client.d.ts +212 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +423 -0
- package/dist/client.js.map +1 -0
- package/dist/generate.d.ts +24 -0
- package/dist/generate.d.ts.map +1 -0
- package/dist/generate.js +289 -0
- package/dist/generate.js.map +1 -0
- package/dist/index.d.ts +44 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +53 -0
- package/dist/index.js.map +1 -0
- package/dist/introspect.d.ts +22 -0
- package/dist/introspect.d.ts.map +1 -0
- package/dist/introspect.js +284 -0
- package/dist/introspect.js.map +1 -0
- package/dist/pipeline.d.ts +44 -0
- package/dist/pipeline.d.ts.map +1 -0
- package/dist/pipeline.js +69 -0
- package/dist/pipeline.js.map +1 -0
- package/dist/query.d.ts +342 -0
- package/dist/query.d.ts.map +1 -0
- package/dist/query.js +1396 -0
- package/dist/query.js.map +1 -0
- package/dist/schema-builder.d.ts +127 -0
- package/dist/schema-builder.d.ts.map +1 -0
- package/dist/schema-builder.js +164 -0
- package/dist/schema-builder.js.map +1 -0
- package/dist/schema-sql.d.ts +71 -0
- package/dist/schema-sql.d.ts.map +1 -0
- package/dist/schema-sql.js +347 -0
- package/dist/schema-sql.js.map +1 -0
- package/dist/schema.d.ts +90 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +129 -0
- package/dist/schema.js.map +1 -0
- package/dist/serverless.d.ts +162 -0
- package/dist/serverless.d.ts.map +1 -0
- package/dist/serverless.js +195 -0
- package/dist/serverless.js.map +1 -0
- package/dist/types.d.ts +93 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +126 -0
- package/dist/types.js.map +1 -0
- package/package.json +74 -0
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @batadata/turbine — Schema SQL Generator
|
|
3
|
+
*
|
|
4
|
+
* Converts a SchemaDef (from defineSchema) into executable DDL statements.
|
|
5
|
+
* Also provides diff and push commands for syncing schema to a live database.
|
|
6
|
+
*/
|
|
7
|
+
import pg from 'pg';
|
|
8
|
+
import { camelToSnake } from './schema.js';
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
// SQL Generation — SchemaDef → CREATE TABLE statements
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
/**
|
|
13
|
+
* Convert a SchemaDef into an ordered array of SQL DDL statements.
|
|
14
|
+
*
|
|
15
|
+
* Returns CREATE TABLE statements (in dependency order based on references)
|
|
16
|
+
* followed by CREATE INDEX statements for foreign key columns.
|
|
17
|
+
*/
|
|
18
|
+
export function schemaToSQL(schema) {
|
|
19
|
+
const statements = [];
|
|
20
|
+
const tableNames = Object.keys(schema.tables);
|
|
21
|
+
// Topologically sort tables by their foreign key references
|
|
22
|
+
const sorted = topologicalSort(schema);
|
|
23
|
+
// Generate CREATE TABLE statements
|
|
24
|
+
for (const tableName of sorted) {
|
|
25
|
+
const table = schema.tables[tableName];
|
|
26
|
+
statements.push(generateCreateTable(table));
|
|
27
|
+
}
|
|
28
|
+
// Generate CREATE INDEX for foreign key columns
|
|
29
|
+
for (const tableName of sorted) {
|
|
30
|
+
const table = schema.tables[tableName];
|
|
31
|
+
const indexes = generateForeignKeyIndexes(table);
|
|
32
|
+
statements.push(...indexes);
|
|
33
|
+
}
|
|
34
|
+
return statements;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Topologically sort tables so that referenced tables come before referencing ones.
|
|
38
|
+
* Falls back to input order for tables with no dependency ordering.
|
|
39
|
+
*/
|
|
40
|
+
function topologicalSort(schema) {
|
|
41
|
+
const tableNames = Object.keys(schema.tables);
|
|
42
|
+
const resolved = new Set();
|
|
43
|
+
const result = [];
|
|
44
|
+
const visiting = new Set();
|
|
45
|
+
function visit(name) {
|
|
46
|
+
if (resolved.has(name))
|
|
47
|
+
return;
|
|
48
|
+
if (visiting.has(name)) {
|
|
49
|
+
// Circular reference — just add it
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
visiting.add(name);
|
|
53
|
+
const table = schema.tables[name];
|
|
54
|
+
if (table) {
|
|
55
|
+
// Visit all tables this table references
|
|
56
|
+
for (const col of Object.values(table.columns)) {
|
|
57
|
+
if (col.referencesTarget) {
|
|
58
|
+
const refTable = col.referencesTarget.split('.')[0];
|
|
59
|
+
if (refTable !== name && schema.tables[refTable]) {
|
|
60
|
+
visit(refTable);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
visiting.delete(name);
|
|
66
|
+
resolved.add(name);
|
|
67
|
+
result.push(name);
|
|
68
|
+
}
|
|
69
|
+
for (const name of tableNames) {
|
|
70
|
+
visit(name);
|
|
71
|
+
}
|
|
72
|
+
return result;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Generate a CREATE TABLE statement for a single table definition.
|
|
76
|
+
*/
|
|
77
|
+
function generateCreateTable(table) {
|
|
78
|
+
const tableName = table.name;
|
|
79
|
+
const columnDefs = [];
|
|
80
|
+
for (const [fieldName, config] of Object.entries(table.columns)) {
|
|
81
|
+
columnDefs.push(generateColumnDef(fieldName, config));
|
|
82
|
+
}
|
|
83
|
+
const body = columnDefs.map((d) => ` ${d}`).join(',\n');
|
|
84
|
+
return `CREATE TABLE ${tableName} (\n${body}\n);`;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Generate a single column definition line (e.g. "id BIGSERIAL PRIMARY KEY").
|
|
88
|
+
*/
|
|
89
|
+
function generateColumnDef(fieldName, config) {
|
|
90
|
+
const snakeName = camelToSnake(fieldName);
|
|
91
|
+
const parts = [snakeName];
|
|
92
|
+
// Type
|
|
93
|
+
if (config.type === 'VARCHAR' && config.maxLength != null) {
|
|
94
|
+
parts.push(`VARCHAR(${config.maxLength})`);
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
parts.push(config.type);
|
|
98
|
+
}
|
|
99
|
+
// PRIMARY KEY
|
|
100
|
+
if (config.isPrimaryKey) {
|
|
101
|
+
parts.push('PRIMARY KEY');
|
|
102
|
+
}
|
|
103
|
+
// UNIQUE (only if not primary key — PK is implicitly unique)
|
|
104
|
+
if (config.isUnique && !config.isPrimaryKey) {
|
|
105
|
+
parts.push('UNIQUE');
|
|
106
|
+
}
|
|
107
|
+
// NOT NULL — serial types are implicitly NOT NULL, but explicit is fine.
|
|
108
|
+
// A column is NOT NULL if:
|
|
109
|
+
// 1. Explicitly marked .notNull(), OR
|
|
110
|
+
// 2. Is a serial (BIGSERIAL implies NOT NULL), OR
|
|
111
|
+
// 3. Has a primary key (PKs are NOT NULL)
|
|
112
|
+
// A column is left nullable if .nullable() was called.
|
|
113
|
+
const isSerial = config.type === 'BIGSERIAL';
|
|
114
|
+
const implicitNotNull = isSerial || config.isPrimaryKey;
|
|
115
|
+
if (config.isNotNull && !implicitNotNull) {
|
|
116
|
+
parts.push('NOT NULL');
|
|
117
|
+
}
|
|
118
|
+
// DEFAULT
|
|
119
|
+
if (config.defaultValue != null) {
|
|
120
|
+
const sqlDefault = normalizeDefault(config.defaultValue);
|
|
121
|
+
parts.push(`DEFAULT ${sqlDefault}`);
|
|
122
|
+
}
|
|
123
|
+
// REFERENCES
|
|
124
|
+
if (config.referencesTarget) {
|
|
125
|
+
const refParts = config.referencesTarget.split('.');
|
|
126
|
+
if (refParts.length === 2) {
|
|
127
|
+
parts.push(`REFERENCES ${refParts[0]}(${refParts[1]})`);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return parts.join(' ');
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Normalize a default value from the user's schema definition to valid SQL.
|
|
134
|
+
*
|
|
135
|
+
* Examples:
|
|
136
|
+
* 'now()' → NOW()
|
|
137
|
+
* "'free'" → 'free'
|
|
138
|
+
* 'false' → false
|
|
139
|
+
* '0' → 0
|
|
140
|
+
*/
|
|
141
|
+
function normalizeDefault(val) {
|
|
142
|
+
// Recognize function calls like now(), gen_random_uuid(), etc.
|
|
143
|
+
if (/^[a-z_]+\(\)$/i.test(val)) {
|
|
144
|
+
return val.toUpperCase();
|
|
145
|
+
}
|
|
146
|
+
return val;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Generate CREATE INDEX statements for foreign key columns.
|
|
150
|
+
* Only generates indexes for columns that have a REFERENCES clause.
|
|
151
|
+
*/
|
|
152
|
+
function generateForeignKeyIndexes(table) {
|
|
153
|
+
const indexes = [];
|
|
154
|
+
for (const [fieldName, config] of Object.entries(table.columns)) {
|
|
155
|
+
if (config.referencesTarget) {
|
|
156
|
+
const snakeName = camelToSnake(fieldName);
|
|
157
|
+
const indexName = `idx_${table.name}_${snakeName}`;
|
|
158
|
+
indexes.push(`CREATE INDEX ${indexName} ON ${table.name}(${snakeName});`);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
return indexes;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Compare a SchemaDef against a live Postgres database and return the diff.
|
|
165
|
+
*
|
|
166
|
+
* Connects to the database, inspects the public schema, and computes what
|
|
167
|
+
* DDL is needed to make the database match the schema definition.
|
|
168
|
+
*/
|
|
169
|
+
export async function schemaDiff(schema, connectionString) {
|
|
170
|
+
const client = new pg.Client({ connectionString });
|
|
171
|
+
await client.connect();
|
|
172
|
+
try {
|
|
173
|
+
// Get existing tables in the public schema
|
|
174
|
+
const tableResult = await client.query(`SELECT tablename FROM pg_tables WHERE schemaname = 'public'`);
|
|
175
|
+
const existingTables = new Set(tableResult.rows.map((r) => r.tablename));
|
|
176
|
+
// Get existing columns for all tables
|
|
177
|
+
const columnResult = await client.query(`SELECT table_name, column_name, data_type, udt_name, is_nullable, column_default, character_maximum_length
|
|
178
|
+
FROM information_schema.columns
|
|
179
|
+
WHERE table_schema = 'public'
|
|
180
|
+
ORDER BY table_name, ordinal_position`);
|
|
181
|
+
const dbColumns = {};
|
|
182
|
+
for (const row of columnResult.rows) {
|
|
183
|
+
if (!dbColumns[row.table_name]) {
|
|
184
|
+
dbColumns[row.table_name] = {};
|
|
185
|
+
}
|
|
186
|
+
dbColumns[row.table_name][row.column_name] = {
|
|
187
|
+
dataType: row.data_type,
|
|
188
|
+
udtName: row.udt_name,
|
|
189
|
+
isNullable: row.is_nullable === 'YES',
|
|
190
|
+
columnDefault: row.column_default,
|
|
191
|
+
maxLength: row.character_maximum_length,
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
const schemaTableNames = new Set(Object.keys(schema.tables));
|
|
195
|
+
const result = { create: [], alter: [], drop: [], statements: [] };
|
|
196
|
+
// Tables to create (in schema but not in DB)
|
|
197
|
+
const sorted = topologicalSort(schema);
|
|
198
|
+
for (const tableName of sorted) {
|
|
199
|
+
if (!existingTables.has(tableName)) {
|
|
200
|
+
const tableDef = schema.tables[tableName];
|
|
201
|
+
result.create.push(tableDef);
|
|
202
|
+
result.statements.push(generateCreateTable(tableDef));
|
|
203
|
+
// Also add FK indexes
|
|
204
|
+
result.statements.push(...generateForeignKeyIndexes(tableDef));
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
// Tables to drop (in DB but not in schema)
|
|
208
|
+
for (const existingTable of existingTables) {
|
|
209
|
+
if (!schemaTableNames.has(existingTable)) {
|
|
210
|
+
result.drop.push(existingTable);
|
|
211
|
+
// We don't auto-generate DROP statements for safety
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
// Tables to alter (exist in both)
|
|
215
|
+
for (const tableName of sorted) {
|
|
216
|
+
if (!existingTables.has(tableName))
|
|
217
|
+
continue;
|
|
218
|
+
const tableDef = schema.tables[tableName];
|
|
219
|
+
const dbCols = dbColumns[tableName] ?? {};
|
|
220
|
+
const alterDef = { table: tableName, columns: [] };
|
|
221
|
+
for (const [fieldName, config] of Object.entries(tableDef.columns)) {
|
|
222
|
+
const snakeName = camelToSnake(fieldName);
|
|
223
|
+
const dbCol = dbCols[snakeName];
|
|
224
|
+
if (!dbCol) {
|
|
225
|
+
// Column exists in schema but not in DB — ADD COLUMN
|
|
226
|
+
const colDef = generateColumnDef(fieldName, config);
|
|
227
|
+
const sql = `ALTER TABLE ${tableName} ADD COLUMN ${colDef};`;
|
|
228
|
+
alterDef.columns.push({ column: snakeName, action: 'add', sql });
|
|
229
|
+
result.statements.push(sql);
|
|
230
|
+
continue;
|
|
231
|
+
}
|
|
232
|
+
// Check type mismatch
|
|
233
|
+
const expectedUdt = schemaTypeToUdt(config);
|
|
234
|
+
if (expectedUdt && dbCol.udtName !== expectedUdt) {
|
|
235
|
+
const sqlType = config.type === 'VARCHAR' && config.maxLength
|
|
236
|
+
? `VARCHAR(${config.maxLength})`
|
|
237
|
+
: config.type;
|
|
238
|
+
const sql = `ALTER TABLE ${tableName} ALTER COLUMN ${snakeName} TYPE ${sqlType};`;
|
|
239
|
+
alterDef.columns.push({ column: snakeName, action: 'alter_type', sql });
|
|
240
|
+
result.statements.push(sql);
|
|
241
|
+
}
|
|
242
|
+
// Check NOT NULL mismatch
|
|
243
|
+
const shouldBeNotNull = config.isNotNull || config.isPrimaryKey || config.type === 'BIGSERIAL';
|
|
244
|
+
const isCurrentlyNullable = dbCol.isNullable;
|
|
245
|
+
if (shouldBeNotNull && isCurrentlyNullable && !config.isNullable) {
|
|
246
|
+
const sql = `ALTER TABLE ${tableName} ALTER COLUMN ${snakeName} SET NOT NULL;`;
|
|
247
|
+
alterDef.columns.push({ column: snakeName, action: 'set_not_null', sql });
|
|
248
|
+
result.statements.push(sql);
|
|
249
|
+
}
|
|
250
|
+
else if (!shouldBeNotNull && !isCurrentlyNullable && config.isNullable) {
|
|
251
|
+
const sql = `ALTER TABLE ${tableName} ALTER COLUMN ${snakeName} DROP NOT NULL;`;
|
|
252
|
+
alterDef.columns.push({ column: snakeName, action: 'drop_not_null', sql });
|
|
253
|
+
result.statements.push(sql);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
// Check for columns in DB that are not in schema
|
|
257
|
+
for (const dbColName of Object.keys(dbCols)) {
|
|
258
|
+
const hasField = Object.entries(tableDef.columns).some(([fieldName]) => camelToSnake(fieldName) === dbColName);
|
|
259
|
+
if (!hasField) {
|
|
260
|
+
const sql = `ALTER TABLE ${tableName} DROP COLUMN ${dbColName};`;
|
|
261
|
+
alterDef.columns.push({ column: dbColName, action: 'drop', sql });
|
|
262
|
+
// Don't auto-add drops to statements for safety — user must opt in
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
if (alterDef.columns.length > 0) {
|
|
266
|
+
result.alter.push(alterDef);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
return result;
|
|
270
|
+
}
|
|
271
|
+
finally {
|
|
272
|
+
await client.end();
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Map a schema column type to its expected PostgreSQL UDT name.
|
|
277
|
+
*/
|
|
278
|
+
function schemaTypeToUdt(config) {
|
|
279
|
+
const map = {
|
|
280
|
+
BIGSERIAL: 'int8',
|
|
281
|
+
BIGINT: 'int8',
|
|
282
|
+
INTEGER: 'int4',
|
|
283
|
+
SMALLINT: 'int2',
|
|
284
|
+
TEXT: 'text',
|
|
285
|
+
VARCHAR: 'varchar',
|
|
286
|
+
BOOLEAN: 'bool',
|
|
287
|
+
TIMESTAMPTZ: 'timestamptz',
|
|
288
|
+
DATE: 'date',
|
|
289
|
+
JSONB: 'jsonb',
|
|
290
|
+
UUID: 'uuid',
|
|
291
|
+
REAL: 'float4',
|
|
292
|
+
'DOUBLE PRECISION': 'float8',
|
|
293
|
+
NUMERIC: 'numeric',
|
|
294
|
+
BYTEA: 'bytea',
|
|
295
|
+
};
|
|
296
|
+
return map[config.type] ?? null;
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Push a schema definition to a live database.
|
|
300
|
+
*
|
|
301
|
+
* Computes the diff, then executes the resulting DDL statements in a
|
|
302
|
+
* single transaction. This is a destructive operation for ADD/ALTER —
|
|
303
|
+
* it will NOT drop tables or columns unless explicitly configured.
|
|
304
|
+
*/
|
|
305
|
+
export async function schemaPush(schema, connectionString, options = {}) {
|
|
306
|
+
const diff = await schemaDiff(schema, connectionString);
|
|
307
|
+
const result = {
|
|
308
|
+
statementsExecuted: 0,
|
|
309
|
+
statements: diff.statements,
|
|
310
|
+
tablesCreated: diff.create.map((t) => t.name),
|
|
311
|
+
tablesAltered: diff.alter.map((a) => a.table),
|
|
312
|
+
};
|
|
313
|
+
if (options.dryRun || diff.statements.length === 0) {
|
|
314
|
+
return result;
|
|
315
|
+
}
|
|
316
|
+
// Execute all statements in a transaction
|
|
317
|
+
const client = new pg.Client({ connectionString });
|
|
318
|
+
await client.connect();
|
|
319
|
+
try {
|
|
320
|
+
await client.query('BEGIN');
|
|
321
|
+
for (const sql of diff.statements) {
|
|
322
|
+
await client.query(sql);
|
|
323
|
+
result.statementsExecuted++;
|
|
324
|
+
}
|
|
325
|
+
await client.query('COMMIT');
|
|
326
|
+
}
|
|
327
|
+
catch (err) {
|
|
328
|
+
await client.query('ROLLBACK');
|
|
329
|
+
throw err;
|
|
330
|
+
}
|
|
331
|
+
finally {
|
|
332
|
+
await client.end();
|
|
333
|
+
}
|
|
334
|
+
return result;
|
|
335
|
+
}
|
|
336
|
+
// ---------------------------------------------------------------------------
|
|
337
|
+
// Utility: format schema as SQL string (convenience for debugging/printing)
|
|
338
|
+
// ---------------------------------------------------------------------------
|
|
339
|
+
/**
|
|
340
|
+
* Generate the full DDL as a single formatted string.
|
|
341
|
+
* Useful for printing or saving to a .sql file.
|
|
342
|
+
*/
|
|
343
|
+
export function schemaToSQLString(schema) {
|
|
344
|
+
const statements = schemaToSQL(schema);
|
|
345
|
+
return statements.join('\n\n') + '\n';
|
|
346
|
+
}
|
|
347
|
+
//# sourceMappingURL=schema-sql.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-sql.js","sourceRoot":"","sources":["../src/schema-sql.ts"],"names":[],"mappings":"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"}
|
package/dist/schema.d.ts
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @batadata/turbine — Schema metadata types
|
|
3
|
+
*
|
|
4
|
+
* These types represent the introspected database schema at runtime.
|
|
5
|
+
* They're used by the query builder, code generator, and CLI.
|
|
6
|
+
*/
|
|
7
|
+
export interface SchemaMetadata {
|
|
8
|
+
/** All discovered tables, keyed by table name */
|
|
9
|
+
tables: Record<string, TableMetadata>;
|
|
10
|
+
/** Database-level enums (typname → labels) */
|
|
11
|
+
enums: Record<string, string[]>;
|
|
12
|
+
}
|
|
13
|
+
export interface TableMetadata {
|
|
14
|
+
/** Table name in the database (snake_case) */
|
|
15
|
+
name: string;
|
|
16
|
+
/** All columns in ordinal order */
|
|
17
|
+
columns: ColumnMetadata[];
|
|
18
|
+
/** camelCase field name → snake_case column name */
|
|
19
|
+
columnMap: Record<string, string>;
|
|
20
|
+
/** snake_case column name → camelCase field name */
|
|
21
|
+
reverseColumnMap: Record<string, string>;
|
|
22
|
+
/** snake_case columns that are timestamp/date types (need Date parsing) */
|
|
23
|
+
dateColumns: Set<string>;
|
|
24
|
+
/** snake_case column → Postgres type for UNNEST casts */
|
|
25
|
+
pgTypes: Record<string, string>;
|
|
26
|
+
/** All snake_case column names in ordinal order */
|
|
27
|
+
allColumns: string[];
|
|
28
|
+
/** Primary key column(s) in snake_case */
|
|
29
|
+
primaryKey: string[];
|
|
30
|
+
/** Unique constraint columns */
|
|
31
|
+
uniqueColumns: string[][];
|
|
32
|
+
/** Relations defined on this table */
|
|
33
|
+
relations: Record<string, RelationDef>;
|
|
34
|
+
/** Indexes on this table */
|
|
35
|
+
indexes: IndexMetadata[];
|
|
36
|
+
}
|
|
37
|
+
export interface ColumnMetadata {
|
|
38
|
+
/** snake_case column name */
|
|
39
|
+
name: string;
|
|
40
|
+
/** camelCase field name for TypeScript */
|
|
41
|
+
field: string;
|
|
42
|
+
/** Postgres base type (e.g. 'int8', 'text', 'timestamptz') */
|
|
43
|
+
pgType: string;
|
|
44
|
+
/** TypeScript type string (e.g. 'number', 'string', 'Date') */
|
|
45
|
+
tsType: string;
|
|
46
|
+
/** Whether the column allows NULL */
|
|
47
|
+
nullable: boolean;
|
|
48
|
+
/** Whether the column has a DEFAULT, is serial, or is generated */
|
|
49
|
+
hasDefault: boolean;
|
|
50
|
+
/** Whether this is an array column */
|
|
51
|
+
isArray: boolean;
|
|
52
|
+
/** Postgres array type for UNNEST (e.g. 'bigint[]') */
|
|
53
|
+
pgArrayType: string;
|
|
54
|
+
/** Max character length (for varchar) */
|
|
55
|
+
maxLength?: number;
|
|
56
|
+
}
|
|
57
|
+
export interface RelationDef {
|
|
58
|
+
type: 'hasMany' | 'hasOne' | 'belongsTo';
|
|
59
|
+
/** Relation name (camelCase, used as the field name) */
|
|
60
|
+
name: string;
|
|
61
|
+
/** Source table */
|
|
62
|
+
from: string;
|
|
63
|
+
/** Target table */
|
|
64
|
+
to: string;
|
|
65
|
+
/** FK column on the "many" / "child" side (snake_case) */
|
|
66
|
+
foreignKey: string;
|
|
67
|
+
/** Referenced column on the "one" / "parent" side (snake_case) */
|
|
68
|
+
referenceKey: string;
|
|
69
|
+
}
|
|
70
|
+
export interface IndexMetadata {
|
|
71
|
+
name: string;
|
|
72
|
+
columns: string[];
|
|
73
|
+
unique: boolean;
|
|
74
|
+
definition: string;
|
|
75
|
+
}
|
|
76
|
+
/** Map a Postgres type to its TypeScript equivalent */
|
|
77
|
+
export declare function pgTypeToTs(pgType: string, nullable: boolean): string;
|
|
78
|
+
/** Check if a Postgres type is a date/timestamp that needs Date parsing */
|
|
79
|
+
export declare function isDateType(pgType: string): boolean;
|
|
80
|
+
/** Get the Postgres array cast type for UNNEST batch inserts */
|
|
81
|
+
export declare function pgArrayType(pgType: string): string;
|
|
82
|
+
/** snake_case → camelCase */
|
|
83
|
+
export declare function snakeToCamel(s: string): string;
|
|
84
|
+
/** camelCase → snake_case */
|
|
85
|
+
export declare function camelToSnake(s: string): string;
|
|
86
|
+
/** snake_case → PascalCase (for type names) */
|
|
87
|
+
export declare function snakeToPascal(s: string): string;
|
|
88
|
+
/** Naive singularize: "posts" → "post", "categories" → "category" */
|
|
89
|
+
export declare function singularize(s: string): string;
|
|
90
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
|
package/dist/schema.js
ADDED
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @batadata/turbine — Schema metadata types
|
|
3
|
+
*
|
|
4
|
+
* These types represent the introspected database schema at runtime.
|
|
5
|
+
* They're used by the query builder, code generator, and CLI.
|
|
6
|
+
*/
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
// Type mapping: Postgres → TypeScript
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
const PG_TO_TS = {
|
|
11
|
+
// Integers
|
|
12
|
+
int2: 'number',
|
|
13
|
+
int4: 'number',
|
|
14
|
+
int8: 'number',
|
|
15
|
+
float4: 'number',
|
|
16
|
+
float8: 'number',
|
|
17
|
+
oid: 'number',
|
|
18
|
+
// Precision-sensitive — keep as string to avoid JS float issues
|
|
19
|
+
numeric: 'string',
|
|
20
|
+
money: 'string',
|
|
21
|
+
// Boolean
|
|
22
|
+
bool: 'boolean',
|
|
23
|
+
// Strings
|
|
24
|
+
text: 'string',
|
|
25
|
+
varchar: 'string',
|
|
26
|
+
char: 'string',
|
|
27
|
+
bpchar: 'string',
|
|
28
|
+
name: 'string',
|
|
29
|
+
uuid: 'string',
|
|
30
|
+
citext: 'string',
|
|
31
|
+
xml: 'string',
|
|
32
|
+
// Dates & times
|
|
33
|
+
timestamptz: 'Date',
|
|
34
|
+
timestamp: 'Date',
|
|
35
|
+
date: 'Date',
|
|
36
|
+
time: 'string',
|
|
37
|
+
timetz: 'string',
|
|
38
|
+
interval: 'string',
|
|
39
|
+
// JSON
|
|
40
|
+
json: 'unknown',
|
|
41
|
+
jsonb: 'unknown',
|
|
42
|
+
// Binary
|
|
43
|
+
bytea: 'Buffer',
|
|
44
|
+
// Network
|
|
45
|
+
inet: 'string',
|
|
46
|
+
cidr: 'string',
|
|
47
|
+
macaddr: 'string',
|
|
48
|
+
// Geometric
|
|
49
|
+
point: 'string',
|
|
50
|
+
line: 'string',
|
|
51
|
+
lseg: 'string',
|
|
52
|
+
box: 'string',
|
|
53
|
+
path: 'string',
|
|
54
|
+
polygon: 'string',
|
|
55
|
+
circle: 'string',
|
|
56
|
+
// TSVector
|
|
57
|
+
tsvector: 'string',
|
|
58
|
+
tsquery: 'string',
|
|
59
|
+
};
|
|
60
|
+
const DATE_TYPES = new Set(['timestamptz', 'timestamp', 'date']);
|
|
61
|
+
const PG_TO_ARRAY = {
|
|
62
|
+
int2: 'smallint[]',
|
|
63
|
+
int4: 'integer[]',
|
|
64
|
+
int8: 'bigint[]',
|
|
65
|
+
float4: 'real[]',
|
|
66
|
+
float8: 'double precision[]',
|
|
67
|
+
numeric: 'numeric[]',
|
|
68
|
+
bool: 'boolean[]',
|
|
69
|
+
text: 'text[]',
|
|
70
|
+
varchar: 'text[]',
|
|
71
|
+
char: 'text[]',
|
|
72
|
+
bpchar: 'text[]',
|
|
73
|
+
uuid: 'uuid[]',
|
|
74
|
+
timestamptz: 'timestamptz[]',
|
|
75
|
+
timestamp: 'timestamp[]',
|
|
76
|
+
date: 'date[]',
|
|
77
|
+
json: 'json[]',
|
|
78
|
+
jsonb: 'jsonb[]',
|
|
79
|
+
bytea: 'bytea[]',
|
|
80
|
+
inet: 'inet[]',
|
|
81
|
+
};
|
|
82
|
+
/** Map a Postgres type to its TypeScript equivalent */
|
|
83
|
+
export function pgTypeToTs(pgType, nullable) {
|
|
84
|
+
// Array types: udt_name starts with '_'
|
|
85
|
+
if (pgType.startsWith('_')) {
|
|
86
|
+
const elementType = pgTypeToTs(pgType.slice(1), false);
|
|
87
|
+
const tsType = `${elementType}[]`;
|
|
88
|
+
return nullable ? `${tsType} | null` : tsType;
|
|
89
|
+
}
|
|
90
|
+
const tsType = PG_TO_TS[pgType] ?? 'unknown';
|
|
91
|
+
return nullable ? `${tsType} | null` : tsType;
|
|
92
|
+
}
|
|
93
|
+
/** Check if a Postgres type is a date/timestamp that needs Date parsing */
|
|
94
|
+
export function isDateType(pgType) {
|
|
95
|
+
return DATE_TYPES.has(pgType);
|
|
96
|
+
}
|
|
97
|
+
/** Get the Postgres array cast type for UNNEST batch inserts */
|
|
98
|
+
export function pgArrayType(pgType) {
|
|
99
|
+
return PG_TO_ARRAY[pgType] ?? 'text[]';
|
|
100
|
+
}
|
|
101
|
+
// ---------------------------------------------------------------------------
|
|
102
|
+
// Name conversion utilities
|
|
103
|
+
// ---------------------------------------------------------------------------
|
|
104
|
+
/** snake_case → camelCase */
|
|
105
|
+
export function snakeToCamel(s) {
|
|
106
|
+
return s.replace(/_([a-z])/g, (_, c) => c.toUpperCase());
|
|
107
|
+
}
|
|
108
|
+
/** camelCase → snake_case */
|
|
109
|
+
export function camelToSnake(s) {
|
|
110
|
+
return s.replace(/[A-Z]/g, (c) => `_${c.toLowerCase()}`);
|
|
111
|
+
}
|
|
112
|
+
/** snake_case → PascalCase (for type names) */
|
|
113
|
+
export function snakeToPascal(s) {
|
|
114
|
+
return s
|
|
115
|
+
.split('_')
|
|
116
|
+
.map((w) => w.charAt(0).toUpperCase() + w.slice(1))
|
|
117
|
+
.join('');
|
|
118
|
+
}
|
|
119
|
+
/** Naive singularize: "posts" → "post", "categories" → "category" */
|
|
120
|
+
export function singularize(s) {
|
|
121
|
+
if (s.endsWith('ies'))
|
|
122
|
+
return s.slice(0, -3) + 'y';
|
|
123
|
+
if (s.endsWith('ses') || s.endsWith('xes') || s.endsWith('zes'))
|
|
124
|
+
return s.slice(0, -2);
|
|
125
|
+
if (s.endsWith('s') && !s.endsWith('ss'))
|
|
126
|
+
return s.slice(0, -1);
|
|
127
|
+
return s;
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
|