@lyku/lockstep-pg 0.1.1

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 (103) hide show
  1. package/LLMs.md +86 -0
  2. package/README.md +93 -0
  3. package/package.json +32 -0
  4. package/src/buildTableIndexCommand.d.ts +3 -0
  5. package/src/buildTableIndexCommand.d.ts.map +1 -0
  6. package/src/buildTableIndexCommand.js +46 -0
  7. package/src/buildTableIndexCommand.js.map +1 -0
  8. package/src/buildTableTriggerCommands.d.ts +3 -0
  9. package/src/buildTableTriggerCommands.d.ts.map +1 -0
  10. package/src/buildTableTriggerCommands.js +23 -0
  11. package/src/buildTableTriggerCommands.js.map +1 -0
  12. package/src/createTable.d.ts +3 -0
  13. package/src/createTable.d.ts.map +1 -0
  14. package/src/createTable.js +46 -0
  15. package/src/createTable.js.map +1 -0
  16. package/src/dateToPostgresString.d.ts +2 -0
  17. package/src/dateToPostgresString.d.ts.map +1 -0
  18. package/src/dateToPostgresString.js +7 -0
  19. package/src/dateToPostgresString.js.map +1 -0
  20. package/src/diff.d.ts +82 -0
  21. package/src/diff.d.ts.map +1 -0
  22. package/src/diff.js +218 -0
  23. package/src/diff.js.map +1 -0
  24. package/src/drift.d.ts +16 -0
  25. package/src/drift.d.ts.map +1 -0
  26. package/src/drift.js +299 -0
  27. package/src/drift.js.map +1 -0
  28. package/src/form.d.ts +3 -0
  29. package/src/form.d.ts.map +1 -0
  30. package/src/form.js +9 -0
  31. package/src/form.js.map +1 -0
  32. package/src/generateSql.d.ts +16 -0
  33. package/src/generateSql.d.ts.map +1 -0
  34. package/src/generateSql.js +306 -0
  35. package/src/generateSql.js.map +1 -0
  36. package/src/index.d.ts +16 -0
  37. package/src/index.d.ts.map +1 -0
  38. package/src/index.js +21 -0
  39. package/src/index.js.map +1 -0
  40. package/src/introspect.d.ts +56 -0
  41. package/src/introspect.d.ts.map +1 -0
  42. package/src/introspect.js +435 -0
  43. package/src/introspect.js.map +1 -0
  44. package/src/mapArrayType.d.ts +3 -0
  45. package/src/mapArrayType.d.ts.map +1 -0
  46. package/src/mapArrayType.js +41 -0
  47. package/src/mapArrayType.js.map +1 -0
  48. package/src/mapBigintType.d.ts +3 -0
  49. package/src/mapBigintType.d.ts.map +1 -0
  50. package/src/mapBigintType.js +17 -0
  51. package/src/mapBigintType.js.map +1 -0
  52. package/src/mapBigserialType.d.ts +3 -0
  53. package/src/mapBigserialType.d.ts.map +1 -0
  54. package/src/mapBigserialType.js +12 -0
  55. package/src/mapBigserialType.js.map +1 -0
  56. package/src/mapCharType.d.ts +3 -0
  57. package/src/mapCharType.d.ts.map +1 -0
  58. package/src/mapCharType.js +22 -0
  59. package/src/mapCharType.js.map +1 -0
  60. package/src/mapColumnType.d.ts +3 -0
  61. package/src/mapColumnType.d.ts.map +1 -0
  62. package/src/mapColumnType.js +63 -0
  63. package/src/mapColumnType.js.map +1 -0
  64. package/src/mapIntegerType.d.ts +3 -0
  65. package/src/mapIntegerType.d.ts.map +1 -0
  66. package/src/mapIntegerType.js +12 -0
  67. package/src/mapIntegerType.js.map +1 -0
  68. package/src/mapSerialType.d.ts +3 -0
  69. package/src/mapSerialType.d.ts.map +1 -0
  70. package/src/mapSerialType.js +12 -0
  71. package/src/mapSerialType.js.map +1 -0
  72. package/src/mapTextType.d.ts +3 -0
  73. package/src/mapTextType.d.ts.map +1 -0
  74. package/src/mapTextType.js +44 -0
  75. package/src/mapTextType.js.map +1 -0
  76. package/src/mapTimestamptzType.d.ts +3 -0
  77. package/src/mapTimestamptzType.d.ts.map +1 -0
  78. package/src/mapTimestamptzType.js +13 -0
  79. package/src/mapTimestamptzType.js.map +1 -0
  80. package/src/mapVarcharType.d.ts +3 -0
  81. package/src/mapVarcharType.d.ts.map +1 -0
  82. package/src/mapVarcharType.js +44 -0
  83. package/src/mapVarcharType.js.map +1 -0
  84. package/src/migrate.d.ts +13 -0
  85. package/src/migrate.d.ts.map +1 -0
  86. package/src/migrate.js +350 -0
  87. package/src/migrate.js.map +1 -0
  88. package/src/numberChecks.d.ts +11 -0
  89. package/src/numberChecks.d.ts.map +1 -0
  90. package/src/numberChecks.js +22 -0
  91. package/src/numberChecks.js.map +1 -0
  92. package/src/seed.d.ts +3 -0
  93. package/src/seed.d.ts.map +1 -0
  94. package/src/seed.js +56 -0
  95. package/src/seed.js.map +1 -0
  96. package/src/setupTable.d.ts +3 -0
  97. package/src/setupTable.d.ts.map +1 -0
  98. package/src/setupTable.js +41 -0
  99. package/src/setupTable.js.map +1 -0
  100. package/src/timestampChecks.d.ts +11 -0
  101. package/src/timestampChecks.d.ts.map +1 -0
  102. package/src/timestampChecks.js +22 -0
  103. package/src/timestampChecks.js.map +1 -0
@@ -0,0 +1,435 @@
1
+ /**
2
+ * Introspect database tables and convert to PostgresTableModel format
3
+ */
4
+ /**
5
+ * Map PostgreSQL array element type name to canonical form
6
+ */
7
+ function normalizeArrayItemType(udtName) {
8
+ const baseType = udtName.startsWith('_') ? udtName.slice(1) : udtName;
9
+ const lower = baseType.toLowerCase();
10
+ // Map PostgreSQL internal type names to canonical forms
11
+ if (lower === 'int8' || lower === 'bigint')
12
+ return 'bigint';
13
+ if (lower === 'int4' || lower === 'integer' || lower === 'int')
14
+ return 'integer';
15
+ if (lower === 'int2' || lower === 'smallint')
16
+ return 'smallint';
17
+ if (lower === 'float8' || lower === 'double precision')
18
+ return 'double precision';
19
+ if (lower === 'float4' || lower === 'real')
20
+ return 'real';
21
+ if (lower === 'text')
22
+ return 'text';
23
+ if (lower === 'varchar' || lower === 'character varying')
24
+ return 'varchar';
25
+ if (lower === 'bool' || lower === 'boolean')
26
+ return 'boolean';
27
+ if (lower === 'timestamptz' || lower === 'timestamp with time zone')
28
+ return 'timestamptz';
29
+ if (lower === 'timestamp' || lower === 'timestamp without time zone')
30
+ return 'timestamp';
31
+ if (lower === 'date')
32
+ return 'date';
33
+ if (lower === 'jsonb')
34
+ return 'jsonb';
35
+ if (lower === 'json')
36
+ return 'json';
37
+ return lower;
38
+ }
39
+ /**
40
+ * Normalize PostgreSQL type to our canonical form
41
+ */
42
+ export function normalizeDbType(pgType, udtName) {
43
+ const lower = pgType.toLowerCase();
44
+ const udt = udtName.toLowerCase();
45
+ // Handle array types
46
+ if (lower === 'array' || udt.startsWith('_')) {
47
+ return {
48
+ type: 'array',
49
+ arrayItemType: normalizeArrayItemType(udt),
50
+ };
51
+ }
52
+ const result = (type) => ({ type, arrayItemType: null });
53
+ // Numeric types
54
+ if (lower === 'bigint' || lower === 'int8')
55
+ return result('bigint');
56
+ if (lower === 'integer' || lower === 'int' || lower === 'int4')
57
+ return result('integer');
58
+ if (lower === 'smallint' || lower === 'int2')
59
+ return result('smallint');
60
+ if (lower === 'double precision' || lower === 'float8')
61
+ return result('double precision');
62
+ // Serial types are stored as their base integer type
63
+ // We detect them by the default value containing 'nextval'
64
+ // String types
65
+ if (lower === 'text')
66
+ return result('text');
67
+ if (lower.startsWith('character varying') || lower === 'varchar')
68
+ return result('varchar');
69
+ if (lower.startsWith('character(') ||
70
+ lower === 'character' ||
71
+ lower === 'bpchar' ||
72
+ lower === 'char')
73
+ return result('char');
74
+ // Boolean
75
+ if (lower === 'boolean' || lower === 'bool')
76
+ return result('boolean');
77
+ // Timestamps
78
+ if (lower === 'timestamp with time zone' || lower === 'timestamptz')
79
+ return result('timestamptz');
80
+ if (lower === 'timestamp without time zone' || lower === 'timestamp')
81
+ return result('timestamp');
82
+ // Date
83
+ if (lower === 'date')
84
+ return result('date');
85
+ // JSON
86
+ if (lower === 'jsonb')
87
+ return result('jsonb');
88
+ if (lower === 'json')
89
+ return result('json');
90
+ // User-defined (enums stored as text with CHECK)
91
+ if (lower === 'user-defined')
92
+ return result('text');
93
+ return result(lower);
94
+ }
95
+ /**
96
+ * Extract enum values from a CHECK constraint clause
97
+ */
98
+ function extractEnumValues(checkClause) {
99
+ // Match patterns like:
100
+ // CHECK ((col = ANY (ARRAY['a'::text, 'b'::text])))
101
+ // CHECK (col IN ('a', 'b', 'c'))
102
+ // CHECK (("col" = ANY (ARRAY['a'::text, 'b'::text])))
103
+ if (!checkClause.includes(' IN (') && !checkClause.includes('ANY')) {
104
+ return null;
105
+ }
106
+ const values = [];
107
+ const valueMatches = checkClause.matchAll(/'([^']+)'/g);
108
+ for (const match of valueMatches) {
109
+ // Skip type casts like ::text that might be captured
110
+ const val = match[1];
111
+ if (!val.includes('::')) {
112
+ values.push(val);
113
+ }
114
+ }
115
+ return values.length > 0 ? values : null;
116
+ }
117
+ /**
118
+ * Detect if a column default indicates a serial/bigserial type
119
+ */
120
+ function _isSerialDefault(defaultVal) {
121
+ if (!defaultVal)
122
+ return null;
123
+ if (defaultVal.includes('nextval(')) {
124
+ // Check if the sequence name suggests bigserial
125
+ if (defaultVal.includes('_id_seq') || defaultVal.includes('bigserial')) {
126
+ return 'bigserial';
127
+ }
128
+ return 'serial';
129
+ }
130
+ return null;
131
+ }
132
+ /**
133
+ * Introspect a single table from the database
134
+ */
135
+ export async function introspectTable(client, tableName) {
136
+ // Get columns
137
+ const columnsResult = await client.query(`
138
+ SELECT
139
+ column_name,
140
+ data_type,
141
+ udt_name,
142
+ is_nullable,
143
+ column_default,
144
+ character_maximum_length
145
+ FROM information_schema.columns
146
+ WHERE table_schema = 'public' AND table_name = $1
147
+ ORDER BY ordinal_position
148
+ `, [tableName]);
149
+ // Get CHECK constraints
150
+ const checkResult = await client.query(`
151
+ SELECT
152
+ con.conname AS constraint_name,
153
+ att.attname AS column_name,
154
+ pg_get_constraintdef(con.oid) AS check_clause
155
+ FROM pg_constraint con
156
+ JOIN pg_attribute att ON att.attnum = ANY(con.conkey) AND att.attrelid = con.conrelid
157
+ WHERE con.conrelid = $1::regclass
158
+ AND con.contype = 'c'
159
+ `, [`"${tableName}"`]);
160
+ const checkConstraints = new Map();
161
+ for (const row of checkResult.rows) {
162
+ checkConstraints.set(row.column_name, row);
163
+ }
164
+ // Build columns map
165
+ const columns = new Map();
166
+ for (const row of columnsResult.rows) {
167
+ const check = checkConstraints.get(row.column_name);
168
+ const enumValues = check ? extractEnumValues(check.check_clause) : null;
169
+ const { type, arrayItemType } = normalizeDbType(row.data_type, row.udt_name);
170
+ columns.set(row.column_name, {
171
+ name: row.column_name,
172
+ type,
173
+ nullable: row.is_nullable === 'YES',
174
+ default: row.column_default,
175
+ maxLength: row.character_maximum_length,
176
+ checkConstraint: check?.check_clause ?? null,
177
+ enumValues,
178
+ arrayItemType,
179
+ });
180
+ }
181
+ // Get indexes
182
+ const indexResult = await client.query(`
183
+ SELECT indexname, indexdef
184
+ FROM pg_indexes
185
+ WHERE schemaname = 'public' AND tablename = $1
186
+ `, [tableName]);
187
+ const indexes = [];
188
+ for (const row of indexResult.rows) {
189
+ // Parse index definition to extract columns
190
+ // Format: CREATE [UNIQUE] INDEX name ON table USING btree (col1, col2)
191
+ const isUnique = row.indexdef.includes('UNIQUE');
192
+ const columnsMatch = row.indexdef.match(/\(([^)]+)\)/);
193
+ const indexColumns = [];
194
+ if (columnsMatch) {
195
+ const colsPart = columnsMatch[1];
196
+ // Split by comma but handle quoted identifiers
197
+ const cols = colsPart.split(',').map((c) => c.trim());
198
+ for (const col of cols) {
199
+ // Extract just the column name (remove quotes, modifiers like DESC)
200
+ const colName = col.replace(/"/g, '').split(' ')[0];
201
+ indexColumns.push(colName);
202
+ }
203
+ }
204
+ indexes.push({
205
+ name: row.indexname,
206
+ columns: indexColumns,
207
+ unique: isUnique,
208
+ definition: row.indexdef,
209
+ });
210
+ }
211
+ // Get primary key
212
+ const pkResult = await client.query(`
213
+ SELECT a.attname AS column_name
214
+ FROM pg_index i
215
+ JOIN pg_attribute a ON a.attrelid = i.indrelid AND a.attnum = ANY(i.indkey)
216
+ WHERE i.indrelid = $1::regclass AND i.indisprimary
217
+ ORDER BY array_position(i.indkey, a.attnum)
218
+ `, [`"${tableName}"`]);
219
+ const primaryKey = pkResult.rows.map((r) => r.column_name);
220
+ // Get unique constraints (excluding primary key)
221
+ const uniqueResult = await client.query(`
222
+ SELECT con.conname AS constraint_name, att.attname AS column_name
223
+ FROM pg_constraint con
224
+ JOIN pg_attribute att ON att.attnum = ANY(con.conkey) AND att.attrelid = con.conrelid
225
+ WHERE con.conrelid = $1::regclass
226
+ AND con.contype = 'u'
227
+ ORDER BY con.conname, array_position(con.conkey, att.attnum)
228
+ `, [`"${tableName}"`]);
229
+ const uniqueByConstraint = new Map();
230
+ for (const row of uniqueResult.rows) {
231
+ const cols = uniqueByConstraint.get(row.constraint_name) ?? [];
232
+ cols.push(row.column_name);
233
+ uniqueByConstraint.set(row.constraint_name, cols);
234
+ }
235
+ const uniqueConstraints = Array.from(uniqueByConstraint.values());
236
+ // Get foreign key constraints
237
+ const fkResult = await client.query(`
238
+ SELECT
239
+ tc.constraint_name,
240
+ kcu.column_name,
241
+ ccu.table_name AS foreign_table_name,
242
+ ccu.column_name AS foreign_column_name
243
+ FROM information_schema.table_constraints tc
244
+ JOIN information_schema.key_column_usage kcu
245
+ ON tc.constraint_name = kcu.constraint_name AND tc.table_schema = kcu.table_schema
246
+ JOIN information_schema.constraint_column_usage ccu
247
+ ON ccu.constraint_name = tc.constraint_name AND ccu.table_schema = tc.table_schema
248
+ WHERE tc.constraint_type = 'FOREIGN KEY'
249
+ AND tc.table_schema = 'public'
250
+ AND tc.table_name = $1
251
+ `, [tableName]);
252
+ const foreignKeys = fkResult.rows.map((row) => ({
253
+ column: row.column_name,
254
+ referencedTable: row.foreign_table_name,
255
+ referencedColumn: row.foreign_column_name,
256
+ constraintName: row.constraint_name,
257
+ }));
258
+ return {
259
+ name: tableName,
260
+ columns,
261
+ indexes,
262
+ primaryKey,
263
+ uniqueConstraints,
264
+ foreignKeys,
265
+ };
266
+ }
267
+ /**
268
+ * Introspect all tables from the database
269
+ */
270
+ export async function introspectDatabase(client) {
271
+ const tablesResult = await client.query(`
272
+ SELECT table_name
273
+ FROM information_schema.tables
274
+ WHERE table_schema = 'public'
275
+ AND table_type = 'BASE TABLE'
276
+ ORDER BY table_name
277
+ `);
278
+ const tables = new Map();
279
+ for (const row of tablesResult.rows) {
280
+ const table = await introspectTable(client, row.table_name);
281
+ tables.set(row.table_name, table);
282
+ }
283
+ return tables;
284
+ }
285
+ /**
286
+ * Convert a code-defined PostgresTableModel to our IntrospectedTable format
287
+ * for comparison purposes
288
+ */
289
+ export function modelToIntrospected(tableName, model) {
290
+ const schema = model.schema;
291
+ const columns = new Map();
292
+ if ('properties' in schema) {
293
+ const required = new Set('required' in schema ? schema.required : []);
294
+ for (const [colName, colSchema] of Object.entries(schema.properties)) {
295
+ const col = colSchema;
296
+ let type = col.type;
297
+ let arrayItemType = null;
298
+ // Normalize type names
299
+ if (type === 'bigserial')
300
+ type = 'bigint';
301
+ if (type === 'serial')
302
+ type = 'integer';
303
+ if (type === 'int' || type === 'int4')
304
+ type = 'integer';
305
+ if (type === 'int8')
306
+ type = 'bigint';
307
+ if (type === 'int2')
308
+ type = 'smallint';
309
+ if (type === 'float8')
310
+ type = 'double precision';
311
+ if (type === 'bool')
312
+ type = 'boolean';
313
+ if (type === 'character varying')
314
+ type = 'varchar';
315
+ if (type === 'character' || type === 'bpchar')
316
+ type = 'char';
317
+ // Enums are stored as text
318
+ const enumValues = col.type === 'enum' && col.enum ? [...col.enum] : null;
319
+ if (col.type === 'enum')
320
+ type = 'text';
321
+ if (col.type === 'array') {
322
+ type = 'array';
323
+ // Extract array item type from schema
324
+ if ('items' in col && col.items && typeof col.items === 'object') {
325
+ const items = col.items;
326
+ if (items.type) {
327
+ // Normalize the item type
328
+ let itemType = items.type;
329
+ if (itemType === 'int8')
330
+ itemType = 'bigint';
331
+ if (itemType === 'int4' || itemType === 'int')
332
+ itemType = 'integer';
333
+ if (itemType === 'int2')
334
+ itemType = 'smallint';
335
+ if (itemType === 'float8')
336
+ itemType = 'double precision';
337
+ if (itemType === 'float4')
338
+ itemType = 'real';
339
+ if (itemType === 'bool')
340
+ itemType = 'boolean';
341
+ arrayItemType = itemType;
342
+ }
343
+ }
344
+ }
345
+ columns.set(colName, {
346
+ name: colName,
347
+ type,
348
+ nullable: !required.has(colName),
349
+ default: 'default' in col && col.default
350
+ ? typeof col.default === 'object' &&
351
+ col.default !== null &&
352
+ 'sql' in col.default
353
+ ? col.default['sql']
354
+ : String(col.default)
355
+ : null,
356
+ maxLength: 'maxLength' in col ? col.maxLength : null,
357
+ checkConstraint: null, // We don't store the full clause
358
+ enumValues,
359
+ arrayItemType,
360
+ });
361
+ }
362
+ }
363
+ // Convert indexes
364
+ const indexes = [];
365
+ if (model.indexes) {
366
+ for (const idx of model.indexes) {
367
+ let cols;
368
+ let name;
369
+ if (typeof idx === 'string') {
370
+ cols = [idx];
371
+ name = `idx_${tableName}_${idx}`;
372
+ }
373
+ else if (Array.isArray(idx)) {
374
+ cols = idx.map((c) => (typeof c === 'string' ? c.split(' ')[0] : c));
375
+ name = `idx_${tableName}_${cols.join('_')}`;
376
+ }
377
+ else {
378
+ const objIdx = idx;
379
+ cols = Array.isArray(objIdx.columns)
380
+ ? objIdx.columns.map((c) => c.split(' ')[0])
381
+ : [objIdx.columns.split(' ')[0]];
382
+ name = objIdx.name ?? `idx_${tableName}_${cols.join('_')}`;
383
+ }
384
+ indexes.push({
385
+ name,
386
+ columns: cols,
387
+ unique: false,
388
+ definition: '',
389
+ });
390
+ }
391
+ }
392
+ // Primary key
393
+ const primaryKey = model.primaryKey
394
+ ? Array.isArray(model.primaryKey)
395
+ ? model.primaryKey
396
+ : [model.primaryKey]
397
+ : [];
398
+ // Unique constraints
399
+ const uniqueConstraints = [];
400
+ if (model.unique) {
401
+ for (const u of model.unique) {
402
+ if (typeof u === 'string') {
403
+ uniqueConstraints.push([u]);
404
+ }
405
+ else if (Array.isArray(u)) {
406
+ uniqueConstraints.push(u);
407
+ }
408
+ }
409
+ }
410
+ // Foreign keys — model format: { columnName: { referencedTable: referencedColumn } }
411
+ const foreignKeys = [];
412
+ if (model.foreignKeys) {
413
+ for (const [colName, ref] of Object.entries(model.foreignKeys)) {
414
+ if (!ref)
415
+ continue;
416
+ for (const [refTable, refColumn] of Object.entries(ref)) {
417
+ foreignKeys.push({
418
+ column: colName,
419
+ referencedTable: refTable,
420
+ referencedColumn: refColumn,
421
+ constraintName: `${tableName}_${colName}_fkey`,
422
+ });
423
+ }
424
+ }
425
+ }
426
+ return {
427
+ name: tableName,
428
+ columns,
429
+ indexes,
430
+ primaryKey,
431
+ uniqueConstraints,
432
+ foreignKeys,
433
+ };
434
+ }
435
+ //# sourceMappingURL=introspect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"introspect.js","sourceRoot":"","sources":["../../../../libs/lockstep-pg/src/introspect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { ArrayColumnModel } from '@lyku/lockstep-core';
2
+ export declare const mapArrayType: (name: string, columnSchema: ArrayColumnModel) => string;
3
+ //# sourceMappingURL=mapArrayType.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mapArrayType.d.ts","sourceRoot":"","sources":["../../../../libs/lockstep-pg/src/mapArrayType.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAGvD,eAAO,MAAM,YAAY,GACxB,MAAM,MAAM,EACZ,cAAc,gBAAgB,KAC5B,MA+CF,CAAC"}
@@ -0,0 +1,41 @@
1
+ import { mapColumnType } from './mapColumnType';
2
+ export const mapArrayType = (name, columnSchema) => {
3
+ const itemType = mapColumnType(name, columnSchema.items);
4
+ const constraints = [];
5
+ if (columnSchema.primaryKey) {
6
+ constraints.push('PRIMARY KEY');
7
+ }
8
+ if (columnSchema.unique) {
9
+ constraints.push('UNIQUE');
10
+ }
11
+ if (columnSchema.minItems !== undefined) {
12
+ constraints.push(`CHECK (array_length("${name}", 1) >= ${columnSchema.minItems})`);
13
+ }
14
+ if (columnSchema.maxItems !== undefined) {
15
+ constraints.push(`CHECK (array_length("${name}", 1) <= ${columnSchema.maxItems})`);
16
+ }
17
+ // Handle multi-word types like DOUBLE PRECISION
18
+ // PostgreSQL syntax: TYPE[] for arrays, constraints come after
19
+ // For types with CHECK constraints, extract them separately
20
+ const checkMatch = itemType.match(/^(.+?)\s*(CHECK\s*\(.+\))$/i);
21
+ let baseType;
22
+ let checkConstraint = null;
23
+ if (checkMatch) {
24
+ baseType = checkMatch[1].trim();
25
+ checkConstraint = checkMatch[2];
26
+ }
27
+ else {
28
+ baseType = itemType;
29
+ }
30
+ // Append [] to the base type
31
+ let result = `${baseType}[]`;
32
+ // Add any check constraints from the item type
33
+ if (checkConstraint) {
34
+ constraints.push(checkConstraint);
35
+ }
36
+ if (constraints.length) {
37
+ result += ' ' + constraints.join(' ');
38
+ }
39
+ return result;
40
+ };
41
+ //# sourceMappingURL=mapArrayType.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mapArrayType.js","sourceRoot":"","sources":["../../../../libs/lockstep-pg/src/mapArrayType.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,MAAM,CAAC,MAAM,YAAY,GAAG,CAC3B,IAAY,EACZ,YAA8B,EACrB,EAAE;IACX,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC;IACzD,MAAM,WAAW,GAAa,EAAE,CAAC;IAEjC,IAAI,YAAY,CAAC,UAAU,EAAE,CAAC;QAC7B,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACjC,CAAC;IACD,IAAI,YAAY,CAAC,MAAM,EAAE,CAAC;QACzB,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;IACD,IAAI,YAAY,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QACzC,WAAW,CAAC,IAAI,CACf,wBAAwB,IAAI,YAAY,YAAY,CAAC,QAAQ,GAAG,CAChE,CAAC;IACH,CAAC;IACD,IAAI,YAAY,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QACzC,WAAW,CAAC,IAAI,CACf,wBAAwB,IAAI,YAAY,YAAY,CAAC,QAAQ,GAAG,CAChE,CAAC;IACH,CAAC;IACD,gDAAgD;IAChD,+DAA+D;IAC/D,4DAA4D;IAC5D,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACjE,IAAI,QAAgB,CAAC;IACrB,IAAI,eAAe,GAAkB,IAAI,CAAC;IAE1C,IAAI,UAAU,EAAE,CAAC;QAChB,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAChC,eAAe,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;IACjC,CAAC;SAAM,CAAC;QACP,QAAQ,GAAG,QAAQ,CAAC;IACrB,CAAC;IAED,6BAA6B;IAC7B,IAAI,MAAM,GAAG,GAAG,QAAQ,IAAI,CAAC;IAE7B,+CAA+C;IAC/C,IAAI,eAAe,EAAE,CAAC;QACrB,WAAW,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACnC,CAAC;IAED,IAAI,WAAW,CAAC,MAAM,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACvC,CAAC;IAED,OAAO,MAAM,CAAC;AACf,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { BigIntColumnModel } from '@lyku/lockstep-core';
2
+ export declare const mapBigintType: (name: string, columnSchema: BigIntColumnModel) => string;
3
+ //# sourceMappingURL=mapBigintType.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mapBigintType.d.ts","sourceRoot":"","sources":["../../../../libs/lockstep-pg/src/mapBigintType.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAGxD,eAAO,MAAM,aAAa,GACzB,MAAM,MAAM,EACZ,cAAc,iBAAiB,KAC7B,MAeF,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { numberChecks } from './numberChecks';
2
+ export const mapBigintType = (name, columnSchema) => {
3
+ const constraints = numberChecks(name, columnSchema);
4
+ if (columnSchema.primaryKey) {
5
+ constraints.push('PRIMARY KEY');
6
+ }
7
+ if (columnSchema.unique) {
8
+ constraints.push('UNIQUE');
9
+ }
10
+ const { generated } = columnSchema;
11
+ if (generated) {
12
+ const when = generated.always ? 'ALWAYS' : 'BY DEFAULT';
13
+ constraints.push(`GENERATED ${when} AS IDENTITY`);
14
+ }
15
+ return `BIGINT${constraints.length ? ' ' + constraints.join(' ') : ''}`;
16
+ };
17
+ //# sourceMappingURL=mapBigintType.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mapBigintType.js","sourceRoot":"","sources":["../../../../libs/lockstep-pg/src/mapBigintType.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,MAAM,CAAC,MAAM,aAAa,GAAG,CAC5B,IAAY,EACZ,YAA+B,EACtB,EAAE;IACX,MAAM,WAAW,GAAG,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IAErD,IAAI,YAAY,CAAC,UAAU,EAAE,CAAC;QAC7B,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACjC,CAAC;IACD,IAAI,YAAY,CAAC,MAAM,EAAE,CAAC;QACzB,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;IACD,MAAM,EAAE,SAAS,EAAE,GAAG,YAAY,CAAC;IACnC,IAAI,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC;QACxD,WAAW,CAAC,IAAI,CAAC,aAAa,IAAI,cAAc,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,SAAS,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AACzE,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { BigSerialColumnModel } from '@lyku/lockstep-core';
2
+ export declare const mapBigserialType: (name: string, columnSchema: BigSerialColumnModel) => string;
3
+ //# sourceMappingURL=mapBigserialType.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mapBigserialType.d.ts","sourceRoot":"","sources":["../../../../libs/lockstep-pg/src/mapBigserialType.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAG3D,eAAO,MAAM,gBAAgB,GAC5B,MAAM,MAAM,EACZ,cAAc,oBAAoB,KAChC,MAUF,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { numberChecks } from './numberChecks';
2
+ export const mapBigserialType = (name, columnSchema) => {
3
+ const constraints = numberChecks(name, columnSchema);
4
+ if (columnSchema.primaryKey) {
5
+ constraints.push('PRIMARY KEY');
6
+ }
7
+ if (columnSchema.unique) {
8
+ constraints.push('UNIQUE');
9
+ }
10
+ return `BIGSERIAL${constraints.length ? ' ' + constraints.join(' ') : ''}`;
11
+ };
12
+ //# sourceMappingURL=mapBigserialType.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mapBigserialType.js","sourceRoot":"","sources":["../../../../libs/lockstep-pg/src/mapBigserialType.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC/B,IAAY,EACZ,YAAkC,EACzB,EAAE;IACX,MAAM,WAAW,GAAG,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IAErD,IAAI,YAAY,CAAC,UAAU,EAAE,CAAC;QAC7B,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACjC,CAAC;IACD,IAAI,YAAY,CAAC,MAAM,EAAE,CAAC;QACzB,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;IACD,OAAO,YAAY,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AAC5E,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { CharColumnModel } from '@lyku/lockstep-core';
2
+ export declare const mapCharType: (name: string, columnSchema: CharColumnModel) => string;
3
+ //# sourceMappingURL=mapCharType.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mapCharType.d.ts","sourceRoot":"","sources":["../../../../libs/lockstep-pg/src/mapCharType.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,eAAO,MAAM,WAAW,GACvB,MAAM,MAAM,EACZ,cAAc,eAAe,KAC3B,MA2BF,CAAC"}
@@ -0,0 +1,22 @@
1
+ export const mapCharType = (name, columnSchema) => {
2
+ // console.log('mapping char', name, columnSchema, '/char');
3
+ const constraints = [];
4
+ if (columnSchema.primaryKey) {
5
+ constraints.push('PRIMARY KEY');
6
+ }
7
+ if (columnSchema.unique) {
8
+ constraints.push('UNIQUE');
9
+ }
10
+ if (columnSchema.generated) {
11
+ constraints.push(`GENERATED ALWAYS AS (${columnSchema.generated.as})${columnSchema.generated.stored ? ' STORED' : ''}`);
12
+ }
13
+ if (columnSchema.checks) {
14
+ constraints.push(...columnSchema.checks.map((check) => `CHECK (${check})`));
15
+ }
16
+ // if (columnSchema.default !== undefined) {
17
+ // constraints.push(`DEFAULT '${columnSchema.default}'`);
18
+ // }
19
+ const length = 'length' in columnSchema ? `(${columnSchema.length})` : '';
20
+ return `CHAR${length}${constraints.length ? ' ' + constraints.join(' ') : ''}`;
21
+ };
22
+ //# sourceMappingURL=mapCharType.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mapCharType.js","sourceRoot":"","sources":["../../../../libs/lockstep-pg/src/mapCharType.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,WAAW,GAAG,CAC1B,IAAY,EACZ,YAA6B,EACpB,EAAE;IACX,4DAA4D;IAC5D,MAAM,WAAW,GAAa,EAAE,CAAC;IAEjC,IAAI,YAAY,CAAC,UAAU,EAAE,CAAC;QAC7B,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACjC,CAAC;IACD,IAAI,YAAY,CAAC,MAAM,EAAE,CAAC;QACzB,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;IACD,IAAI,YAAY,CAAC,SAAS,EAAE,CAAC;QAC5B,WAAW,CAAC,IAAI,CACf,wBAAwB,YAAY,CAAC,SAAS,CAAC,EAAE,IAChD,YAAY,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAC7C,EAAE,CACF,CAAC;IACH,CAAC;IACD,IAAI,YAAY,CAAC,MAAM,EAAE,CAAC;QACzB,WAAW,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,UAAU,KAAK,GAAG,CAAC,CAAC,CAAC;IAC7E,CAAC;IACD,4CAA4C;IAC5C,6DAA6D;IAC7D,IAAI;IACJ,MAAM,MAAM,GAAG,QAAQ,IAAI,YAAY,CAAC,CAAC,CAAC,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1E,OAAO,OAAO,MAAM,GACnB,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EACpD,EAAE,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { PostgresColumnModel } from '@lyku/lockstep-core';
2
+ export declare function mapColumnType(name: string, columnSchema: PostgresColumnModel): string;
3
+ //# sourceMappingURL=mapColumnType.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mapColumnType.d.ts","sourceRoot":"","sources":["../../../../libs/lockstep-pg/src/mapColumnType.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAM1D,wBAAgB,aAAa,CAC5B,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,mBAAmB,GAC/B,MAAM,CAoDR"}