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
@@ -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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"}
@@ -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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"}