dbdock 1.1.16 → 1.1.17

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 (43) hide show
  1. package/README.md +222 -6
  2. package/dist/cli/commands/analyze.d.ts +1 -0
  3. package/dist/cli/commands/analyze.js +135 -0
  4. package/dist/cli/commands/analyze.js.map +1 -0
  5. package/dist/cli/commands/cross-migrate.d.ts +11 -0
  6. package/dist/cli/commands/cross-migrate.js +307 -0
  7. package/dist/cli/commands/cross-migrate.js.map +1 -0
  8. package/dist/cli/index.js +20 -0
  9. package/dist/cli/index.js.map +1 -1
  10. package/dist/migration/analyzers/mongodb.analyzer.d.ts +3 -0
  11. package/dist/migration/analyzers/mongodb.analyzer.js +208 -0
  12. package/dist/migration/analyzers/mongodb.analyzer.js.map +1 -0
  13. package/dist/migration/analyzers/postgres.analyzer.d.ts +3 -0
  14. package/dist/migration/analyzers/postgres.analyzer.js +176 -0
  15. package/dist/migration/analyzers/postgres.analyzer.js.map +1 -0
  16. package/dist/migration/config.manager.d.ts +3 -0
  17. package/dist/migration/config.manager.js +80 -0
  18. package/dist/migration/config.manager.js.map +1 -0
  19. package/dist/migration/engines/migration.engine.d.ts +6 -0
  20. package/dist/migration/engines/migration.engine.js +62 -0
  21. package/dist/migration/engines/migration.engine.js.map +1 -0
  22. package/dist/migration/engines/mongo-to-postgres.engine.d.ts +2 -0
  23. package/dist/migration/engines/mongo-to-postgres.engine.js +409 -0
  24. package/dist/migration/engines/mongo-to-postgres.engine.js.map +1 -0
  25. package/dist/migration/engines/postgres-to-mongo.engine.d.ts +2 -0
  26. package/dist/migration/engines/postgres-to-mongo.engine.js +192 -0
  27. package/dist/migration/engines/postgres-to-mongo.engine.js.map +1 -0
  28. package/dist/migration/mappers/mongo-to-postgres.mapper.d.ts +2 -0
  29. package/dist/migration/mappers/mongo-to-postgres.mapper.js +263 -0
  30. package/dist/migration/mappers/mongo-to-postgres.mapper.js.map +1 -0
  31. package/dist/migration/mappers/postgres-to-mongo.mapper.d.ts +2 -0
  32. package/dist/migration/mappers/postgres-to-mongo.mapper.js +174 -0
  33. package/dist/migration/mappers/postgres-to-mongo.mapper.js.map +1 -0
  34. package/dist/migration/reference.detector.d.ts +2 -0
  35. package/dist/migration/reference.detector.js +57 -0
  36. package/dist/migration/reference.detector.js.map +1 -0
  37. package/dist/migration/type.mapper.d.ts +12 -0
  38. package/dist/migration/type.mapper.js +197 -0
  39. package/dist/migration/type.mapper.js.map +1 -0
  40. package/dist/migration/types.d.ts +183 -0
  41. package/dist/migration/types.js +11 -0
  42. package/dist/migration/types.js.map +1 -0
  43. package/package.json +11 -2
@@ -0,0 +1,409 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.executeMongoToPostgres = executeMongoToPostgres;
4
+ const mongodb_1 = require("mongodb");
5
+ const pg_1 = require("pg");
6
+ const uuid_1 = require("uuid");
7
+ const type_mapper_1 = require("../type.mapper");
8
+ async function executeMongoToPostgres(plan, onProgress) {
9
+ const startTime = Date.now();
10
+ const errors = [];
11
+ const results = [];
12
+ const schema = plan.options.dryRun ? '_dbdock_dryrun' : 'public';
13
+ const mongoClient = new mongodb_1.MongoClient(plan.source.url);
14
+ const pgPool = new pg_1.Pool({ connectionString: plan.target.url });
15
+ try {
16
+ await mongoClient.connect();
17
+ const db = mongoClient.db(plan.source.database);
18
+ const pgClient = await pgPool.connect();
19
+ try {
20
+ if (plan.options.dryRun) {
21
+ await pgClient.query(`DROP SCHEMA IF EXISTS ${schema} CASCADE`);
22
+ await pgClient.query(`CREATE SCHEMA ${schema}`);
23
+ }
24
+ if (plan.options.createErrorsTable) {
25
+ await createErrorsTable(pgClient, schema);
26
+ }
27
+ await createAllTables(pgClient, plan.tableMappings || [], schema);
28
+ for (const mapping of plan.tableMappings || []) {
29
+ const result = await migrateCollection(db, pgClient, mapping, plan, schema, errors, onProgress);
30
+ results.push(result);
31
+ }
32
+ await addForeignKeys(pgClient, plan.tableMappings || [], schema);
33
+ if (errors.length > 0 && plan.options.createErrorsTable) {
34
+ await writeErrors(pgClient, errors, schema);
35
+ }
36
+ if (plan.options.dryRun) {
37
+ await pgClient.query(`DROP SCHEMA IF EXISTS ${schema} CASCADE`);
38
+ }
39
+ }
40
+ finally {
41
+ pgClient.release();
42
+ }
43
+ }
44
+ finally {
45
+ await mongoClient.close();
46
+ await pgPool.end();
47
+ }
48
+ const duration = Date.now() - startTime;
49
+ const allSuccess = results.every((r) => r.status === 'success');
50
+ return {
51
+ success: allSuccess && errors.length === 0,
52
+ tables: results,
53
+ totalErrors: errors.length,
54
+ duration,
55
+ dryRun: plan.options.dryRun,
56
+ };
57
+ }
58
+ async function createErrorsTable(client, schema) {
59
+ await client.query(`
60
+ CREATE TABLE IF NOT EXISTS ${schema}._migration_errors (
61
+ id serial PRIMARY KEY,
62
+ table_name text NOT NULL,
63
+ source_id text,
64
+ error_message text NOT NULL,
65
+ source_data jsonb,
66
+ created_at timestamptz DEFAULT now()
67
+ )
68
+ `);
69
+ }
70
+ async function createAllTables(client, mappings, schema) {
71
+ for (const mapping of mappings) {
72
+ await createTable(client, schema, mapping.targetTable, mapping.fields);
73
+ for (const nested of mapping.nestedMappings) {
74
+ if (nested.strategy === 'table' && nested.fields) {
75
+ await createTable(client, schema, nested.targetTable, nested.fields);
76
+ }
77
+ }
78
+ for (const arr of mapping.arrayMappings) {
79
+ if (arr.strategy === 'child_table' && arr.fields) {
80
+ await createTable(client, schema, arr.targetTable, arr.fields);
81
+ }
82
+ else if (arr.strategy === 'array_column') {
83
+ await createArrayTable(client, schema, arr);
84
+ }
85
+ else if (arr.strategy === 'junction') {
86
+ await createJunctionTable(client, schema, arr);
87
+ }
88
+ }
89
+ }
90
+ }
91
+ async function createTable(client, schema, tableName, fields) {
92
+ const columns = fields.map((f) => {
93
+ let def = `"${f.targetColumn}" ${f.targetType}`;
94
+ if (f.isPrimaryKey)
95
+ def += ' PRIMARY KEY';
96
+ if (f.defaultValue)
97
+ def += ` DEFAULT ${f.defaultValue}`;
98
+ if (!f.nullable && !f.isPrimaryKey)
99
+ def += ' NOT NULL';
100
+ if (f.isUnique && !f.isPrimaryKey)
101
+ def += ' UNIQUE';
102
+ return def;
103
+ });
104
+ await client.query(`CREATE TABLE IF NOT EXISTS ${schema}."${tableName}" (${columns.join(', ')})`);
105
+ }
106
+ async function createArrayTable(client, schema, arr) {
107
+ await client.query(`
108
+ CREATE TABLE IF NOT EXISTS ${schema}."${arr.targetTable}" (
109
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
110
+ "${arr.parentForeignKey}" uuid NOT NULL,
111
+ value ${arr.elementType || 'text'} NOT NULL
112
+ )
113
+ `);
114
+ }
115
+ async function createJunctionTable(client, schema, arr) {
116
+ await client.query(`
117
+ CREATE TABLE IF NOT EXISTS ${schema}."${arr.targetTable}" (
118
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
119
+ "${arr.parentForeignKey}" uuid NOT NULL,
120
+ value jsonb NOT NULL
121
+ )
122
+ `);
123
+ }
124
+ async function addForeignKeys(client, mappings, schema) {
125
+ for (const mapping of mappings) {
126
+ for (const ref of mapping.detectedReferences) {
127
+ const refMapping = mappings.find((m) => m.sourceCollection === ref.targetCollection);
128
+ if (!refMapping)
129
+ continue;
130
+ const fkColumn = ref.foreignKeyColumn.endsWith('_id')
131
+ ? ref.foreignKeyColumn
132
+ : ref.foreignKeyColumn + '_id';
133
+ const hasColumn = mapping.fields.some((f) => f.targetColumn === fkColumn ||
134
+ f.targetColumn === ref.foreignKeyColumn);
135
+ if (!hasColumn)
136
+ continue;
137
+ const actualColumn = mapping.fields.find((f) => f.targetColumn === fkColumn ||
138
+ f.targetColumn === ref.foreignKeyColumn)?.targetColumn;
139
+ if (!actualColumn)
140
+ continue;
141
+ try {
142
+ const constraintName = `fk_${mapping.targetTable}_${actualColumn}`;
143
+ await client.query(`
144
+ ALTER TABLE ${schema}."${mapping.targetTable}"
145
+ ADD CONSTRAINT "${constraintName}"
146
+ FOREIGN KEY ("${actualColumn}")
147
+ REFERENCES ${schema}."${refMapping.targetTable}"("id")
148
+ ON DELETE SET NULL
149
+ `);
150
+ }
151
+ catch {
152
+ }
153
+ }
154
+ for (const nested of mapping.nestedMappings) {
155
+ if (nested.strategy === 'table') {
156
+ try {
157
+ await client.query(`
158
+ ALTER TABLE ${schema}."${nested.targetTable}"
159
+ ADD CONSTRAINT "fk_${nested.targetTable}_${nested.parentForeignKey}"
160
+ FOREIGN KEY ("${nested.parentForeignKey}")
161
+ REFERENCES ${schema}."${mapping.targetTable}"("id")
162
+ ON DELETE CASCADE
163
+ `);
164
+ }
165
+ catch { }
166
+ }
167
+ }
168
+ for (const arr of mapping.arrayMappings) {
169
+ try {
170
+ await client.query(`
171
+ ALTER TABLE ${schema}."${arr.targetTable}"
172
+ ADD CONSTRAINT "fk_${arr.targetTable}_${arr.parentForeignKey}"
173
+ FOREIGN KEY ("${arr.parentForeignKey}")
174
+ REFERENCES ${schema}."${mapping.targetTable}"("id")
175
+ ON DELETE CASCADE
176
+ `);
177
+ }
178
+ catch { }
179
+ }
180
+ }
181
+ }
182
+ async function migrateCollection(db, pgClient, mapping, plan, schema, errors, onProgress) {
183
+ const collection = db.collection(mapping.sourceCollection);
184
+ let query = {};
185
+ if (plan.options.incremental && plan.options.since) {
186
+ const sinceDate = new Date(plan.options.since);
187
+ query = {
188
+ $or: [
189
+ { createdAt: { $gte: sinceDate } },
190
+ { updatedAt: { $gte: sinceDate } },
191
+ { created_at: { $gte: sinceDate } },
192
+ { updated_at: { $gte: sinceDate } },
193
+ ],
194
+ };
195
+ }
196
+ const totalCount = await collection.countDocuments(query);
197
+ let processed = 0;
198
+ let failedCount = 0;
199
+ const batchSize = plan.options.batchSize;
200
+ const cursor = collection.find(query).batchSize(batchSize);
201
+ let batch = [];
202
+ while (await cursor.hasNext()) {
203
+ const doc = await cursor.next();
204
+ if (!doc)
205
+ continue;
206
+ batch.push(doc);
207
+ if (batch.length >= batchSize) {
208
+ const failed = await processBatch(pgClient, mapping, batch, schema, errors);
209
+ failedCount += failed;
210
+ processed += batch.length;
211
+ batch = [];
212
+ onProgress?.(mapping.targetTable, processed, totalCount);
213
+ }
214
+ }
215
+ if (batch.length > 0) {
216
+ const failed = await processBatch(pgClient, mapping, batch, schema, errors);
217
+ failedCount += failed;
218
+ processed += batch.length;
219
+ onProgress?.(mapping.targetTable, processed, totalCount);
220
+ }
221
+ await cursor.close();
222
+ const targetCount = processed - failedCount;
223
+ let status = 'success';
224
+ if (failedCount > 0 && targetCount > 0)
225
+ status = 'partial';
226
+ if (targetCount === 0 && totalCount > 0)
227
+ status = 'failed';
228
+ return {
229
+ name: mapping.targetTable,
230
+ sourceCount: totalCount,
231
+ targetCount,
232
+ failedCount,
233
+ status,
234
+ };
235
+ }
236
+ async function processBatch(pgClient, mapping, docs, schema, errors) {
237
+ let failed = 0;
238
+ for (const doc of docs) {
239
+ try {
240
+ await insertDocument(pgClient, mapping, doc, schema);
241
+ }
242
+ catch (err) {
243
+ failed++;
244
+ const sourceId = doc._id?.toString?.() || 'unknown';
245
+ errors.push({
246
+ table: mapping.targetTable,
247
+ sourceId,
248
+ error: err instanceof Error ? err.message : String(err),
249
+ data: safeStringify(doc),
250
+ });
251
+ }
252
+ }
253
+ return failed;
254
+ }
255
+ async function insertDocument(pgClient, mapping, doc, schema) {
256
+ const parentId = doc._id ? (0, type_mapper_1.objectIdToUuid)(doc._id.toString()) : (0, uuid_1.v4)();
257
+ const columns = [];
258
+ const values = [];
259
+ const placeholders = [];
260
+ let paramIdx = 1;
261
+ for (const field of mapping.fields) {
262
+ const value = getNestedValue(doc, field.sourceField);
263
+ let pgValue;
264
+ if (field.transform === 'uuid_from_objectid' && value) {
265
+ pgValue = (0, type_mapper_1.objectIdToUuid)(value.toString());
266
+ }
267
+ else if (field.transform === 'jsonb') {
268
+ pgValue = value != null ? JSON.stringify(value) : null;
269
+ }
270
+ else if (field.transform === 'cast' && value != null) {
271
+ const result = (0, type_mapper_1.coerceValue)(value, typeof value, field.targetType);
272
+ pgValue = result.success ? result.value : null;
273
+ }
274
+ else if (value instanceof Date) {
275
+ pgValue = value;
276
+ }
277
+ else if (typeof value === 'object' && value !== null && field.targetType === 'jsonb') {
278
+ pgValue = JSON.stringify(value);
279
+ }
280
+ else if (value !== undefined) {
281
+ pgValue = value?.toString?.() ?? value;
282
+ }
283
+ else {
284
+ pgValue = null;
285
+ }
286
+ columns.push(`"${field.targetColumn}"`);
287
+ values.push(pgValue);
288
+ placeholders.push(`$${paramIdx++}`);
289
+ }
290
+ if (columns.length > 0) {
291
+ await pgClient.query(`INSERT INTO ${schema}."${mapping.targetTable}" (${columns.join(', ')}) VALUES (${placeholders.join(', ')}) ON CONFLICT DO NOTHING`, values);
292
+ }
293
+ for (const nested of mapping.nestedMappings) {
294
+ if (nested.strategy === 'table' && nested.fields) {
295
+ const nestedValue = getNestedValue(doc, nested.sourceField);
296
+ if (nestedValue && typeof nestedValue === 'object' && !Array.isArray(nestedValue)) {
297
+ await insertNestedObject(pgClient, schema, nested, nestedValue, parentId);
298
+ }
299
+ }
300
+ }
301
+ for (const arr of mapping.arrayMappings) {
302
+ const arrayValue = getNestedValue(doc, arr.sourceField);
303
+ if (Array.isArray(arrayValue)) {
304
+ await insertArrayElements(pgClient, schema, arr, arrayValue, parentId);
305
+ }
306
+ }
307
+ }
308
+ async function insertNestedObject(pgClient, schema, nested, value, parentId) {
309
+ if (!nested.fields)
310
+ return;
311
+ const columns = [];
312
+ const values = [];
313
+ const placeholders = [];
314
+ let paramIdx = 1;
315
+ for (const field of nested.fields) {
316
+ if (field.sourceField === 'id') {
317
+ columns.push('"id"');
318
+ values.push((0, uuid_1.v4)());
319
+ placeholders.push(`$${paramIdx++}`);
320
+ }
321
+ else if (field.sourceField.includes('_id') && field.targetType === 'uuid') {
322
+ columns.push(`"${field.targetColumn}"`);
323
+ values.push(parentId);
324
+ placeholders.push(`$${paramIdx++}`);
325
+ }
326
+ else {
327
+ const fieldName = field.sourceField.split('.').pop() || field.sourceField;
328
+ const val = value[fieldName] ?? null;
329
+ columns.push(`"${field.targetColumn}"`);
330
+ values.push(val);
331
+ placeholders.push(`$${paramIdx++}`);
332
+ }
333
+ }
334
+ await pgClient.query(`INSERT INTO ${schema}."${nested.targetTable}" (${columns.join(', ')}) VALUES (${placeholders.join(', ')}) ON CONFLICT DO NOTHING`, values);
335
+ }
336
+ async function insertArrayElements(pgClient, schema, arr, values, parentId) {
337
+ for (const element of values) {
338
+ if (arr.strategy === 'child_table' && arr.fields) {
339
+ const columns = [];
340
+ const vals = [];
341
+ const placeholders = [];
342
+ let paramIdx = 1;
343
+ for (const field of arr.fields) {
344
+ if (field.sourceField === 'id') {
345
+ columns.push('"id"');
346
+ vals.push((0, uuid_1.v4)());
347
+ placeholders.push(`$${paramIdx++}`);
348
+ }
349
+ else if (field.sourceField.includes('_id') &&
350
+ field.targetType === 'uuid') {
351
+ columns.push(`"${field.targetColumn}"`);
352
+ vals.push(parentId);
353
+ placeholders.push(`$${paramIdx++}`);
354
+ }
355
+ else {
356
+ const fieldName = field.sourceField.split('.').pop() || field.sourceField;
357
+ const val = typeof element === 'object' && element
358
+ ? element[fieldName] ?? null
359
+ : null;
360
+ columns.push(`"${field.targetColumn}"`);
361
+ vals.push(val instanceof Date ? val : val);
362
+ placeholders.push(`$${paramIdx++}`);
363
+ }
364
+ }
365
+ await pgClient.query(`INSERT INTO ${schema}."${arr.targetTable}" (${columns.join(', ')}) VALUES (${placeholders.join(', ')}) ON CONFLICT DO NOTHING`, vals);
366
+ }
367
+ else {
368
+ const val = typeof element === 'object' ? JSON.stringify(element) : element;
369
+ await pgClient.query(`INSERT INTO ${schema}."${arr.targetTable}" ("id", "${arr.parentForeignKey}", "value") VALUES ($1, $2, $3) ON CONFLICT DO NOTHING`, [(0, uuid_1.v4)(), parentId, val]);
370
+ }
371
+ }
372
+ }
373
+ function getNestedValue(obj, path) {
374
+ if (!path || !obj)
375
+ return obj;
376
+ const parts = path.replace(/\[\]/g, '').split('.');
377
+ let current = obj;
378
+ for (const part of parts) {
379
+ if (current == null)
380
+ return undefined;
381
+ current = current[part];
382
+ }
383
+ return current;
384
+ }
385
+ async function writeErrors(client, errors, schema) {
386
+ for (const err of errors) {
387
+ try {
388
+ await client.query(`INSERT INTO ${schema}._migration_errors (table_name, source_id, error_message, source_data) VALUES ($1, $2, $3, $4)`, [err.table, err.sourceId, err.error, err.data]);
389
+ }
390
+ catch { }
391
+ }
392
+ }
393
+ function safeStringify(obj) {
394
+ try {
395
+ return JSON.stringify(obj, (_, value) => {
396
+ if (typeof value === 'bigint')
397
+ return value.toString();
398
+ if (value instanceof Date)
399
+ return value.toISOString();
400
+ if (value?._bsontype)
401
+ return value.toString();
402
+ return value;
403
+ });
404
+ }
405
+ catch {
406
+ return '{}';
407
+ }
408
+ }
409
+ //# sourceMappingURL=mongo-to-postgres.engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mongo-to-postgres.engine.js","sourceRoot":"","sources":["../../../src/migration/engines/mongo-to-postgres.engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { MigrationPlan, MigrationResult } from '../types';
2
+ export declare function executePostgresToMongo(plan: MigrationPlan, onProgress?: (collection: string, processed: number, total: number) => void): Promise<MigrationResult>;
@@ -0,0 +1,192 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.executePostgresToMongo = executePostgresToMongo;
4
+ const mongodb_1 = require("mongodb");
5
+ const pg_1 = require("pg");
6
+ async function executePostgresToMongo(plan, onProgress) {
7
+ const startTime = Date.now();
8
+ const errors = [];
9
+ const results = [];
10
+ const pgPool = new pg_1.Pool({ connectionString: plan.source.url });
11
+ const mongoClient = new mongodb_1.MongoClient(plan.target.url);
12
+ try {
13
+ await mongoClient.connect();
14
+ const db = mongoClient.db(plan.target.database);
15
+ const errorsCollection = plan.options.createErrorsTable
16
+ ? db.collection('_migration_errors')
17
+ : null;
18
+ for (const mapping of plan.documentMappings || []) {
19
+ const result = await migrateTable(pgPool, db, mapping, plan, errors, onProgress);
20
+ results.push(result);
21
+ }
22
+ if (errorsCollection && errors.length > 0) {
23
+ const errorDocs = errors.map((e) => ({
24
+ collection: e.collection,
25
+ sourceId: e.sourceId,
26
+ error: e.error,
27
+ sourceData: e.data,
28
+ createdAt: new Date(),
29
+ }));
30
+ await errorsCollection.insertMany(errorDocs);
31
+ }
32
+ }
33
+ finally {
34
+ await mongoClient.close();
35
+ await pgPool.end();
36
+ }
37
+ const duration = Date.now() - startTime;
38
+ const allSuccess = results.every((r) => r.status === 'success');
39
+ return {
40
+ success: allSuccess && errors.length === 0,
41
+ tables: results,
42
+ totalErrors: errors.length,
43
+ duration,
44
+ dryRun: plan.options.dryRun,
45
+ };
46
+ }
47
+ async function migrateTable(pgPool, db, mapping, plan, errors, onProgress) {
48
+ const batchSize = plan.options.batchSize;
49
+ const collection = db.collection(mapping.targetCollection);
50
+ if (!plan.options.incremental) {
51
+ await collection.deleteMany({});
52
+ }
53
+ let whereClause = '';
54
+ if (plan.options.incremental && plan.options.since) {
55
+ whereClause = buildIncrementalWhere(plan.options.since);
56
+ }
57
+ const countResult = await pgPool.query(`SELECT count(*)::integer AS count FROM "${mapping.primaryTable}" ${whereClause}`);
58
+ const totalCount = parseInt(countResult.rows[0]?.count || '0');
59
+ let processed = 0;
60
+ let failedCount = 0;
61
+ let offset = 0;
62
+ while (offset < totalCount) {
63
+ const rows = await pgPool.query(`SELECT * FROM "${mapping.primaryTable}" ${whereClause} ORDER BY 1 LIMIT $1 OFFSET $2`, [batchSize, offset]);
64
+ const documents = [];
65
+ for (const row of rows.rows) {
66
+ try {
67
+ const doc = await buildDocument(pgPool, mapping, row);
68
+ documents.push(doc);
69
+ }
70
+ catch (err) {
71
+ failedCount++;
72
+ const pkColumn = Object.keys(row)[0];
73
+ errors.push({
74
+ collection: mapping.targetCollection,
75
+ sourceId: String(row[pkColumn]),
76
+ error: err instanceof Error ? err.message : String(err),
77
+ data: JSON.stringify(row),
78
+ });
79
+ }
80
+ }
81
+ if (documents.length > 0) {
82
+ try {
83
+ if (plan.options.incremental) {
84
+ for (const doc of documents) {
85
+ await collection.replaceOne({ _id: doc._id }, doc, { upsert: true });
86
+ }
87
+ }
88
+ else {
89
+ await collection.insertMany(documents, { ordered: false });
90
+ }
91
+ }
92
+ catch (err) {
93
+ failedCount += documents.length;
94
+ errors.push({
95
+ collection: mapping.targetCollection,
96
+ sourceId: 'batch',
97
+ error: err instanceof Error ? err.message : String(err),
98
+ });
99
+ }
100
+ }
101
+ processed += rows.rows.length;
102
+ offset += batchSize;
103
+ onProgress?.(mapping.targetCollection, processed, totalCount);
104
+ }
105
+ const targetCount = processed - failedCount;
106
+ return {
107
+ name: mapping.targetCollection,
108
+ sourceCount: totalCount,
109
+ targetCount,
110
+ failedCount,
111
+ status: failedCount === 0
112
+ ? 'success'
113
+ : targetCount > 0
114
+ ? 'partial'
115
+ : 'failed',
116
+ };
117
+ }
118
+ async function buildDocument(pgPool, mapping, row) {
119
+ const doc = {};
120
+ for (const [pgCol, mongoField] of Object.entries(mapping.fieldMappings)) {
121
+ if (pgCol.startsWith('_'))
122
+ continue;
123
+ const value = row[pgCol];
124
+ if (value === undefined)
125
+ continue;
126
+ if (mongoField === '_id') {
127
+ doc._id = convertToMongoId(value);
128
+ }
129
+ else {
130
+ doc[mongoField] = convertPgValueToMongo(value);
131
+ }
132
+ }
133
+ for (const embed of mapping.embeddings) {
134
+ const childRows = await pgPool.query(`SELECT * FROM "${embed.sourceTable}" WHERE "${embed.foreignKey}" = $1`, [getPrimaryKeyValue(row)]);
135
+ if (embed.isArray) {
136
+ doc[embed.embedAs] = childRows.rows.map((r) => convertRowToEmbeddedDoc(r, embed.foreignKey));
137
+ }
138
+ else if (childRows.rows.length > 0) {
139
+ doc[embed.embedAs] = convertRowToEmbeddedDoc(childRows.rows[0], embed.foreignKey);
140
+ }
141
+ }
142
+ for (const [pgCol, mongoField] of Object.entries(mapping.fieldMappings)) {
143
+ if (!pgCol.startsWith('_'))
144
+ continue;
145
+ const otherTable = pgCol.slice(1);
146
+ const relatedRows = await pgPool.query(`SELECT * FROM "${otherTable}" ORDER BY 1`);
147
+ doc[mongoField] = relatedRows.rows.map((r) => {
148
+ const pk = Object.keys(r)[0];
149
+ return convertPgValueToMongo(r[Object.keys(r).find((k) => k !== pk) || pk]);
150
+ });
151
+ }
152
+ return doc;
153
+ }
154
+ function convertToMongoId(value) {
155
+ if (typeof value === 'string' && /^[a-f0-9]{24}$/.test(value)) {
156
+ return new mongodb_1.ObjectId(value);
157
+ }
158
+ return value;
159
+ }
160
+ function convertPgValueToMongo(value) {
161
+ if (value === null || value === undefined)
162
+ return null;
163
+ if (value instanceof Date)
164
+ return value;
165
+ if (Buffer.isBuffer(value))
166
+ return value;
167
+ if (typeof value === 'object' && !Array.isArray(value))
168
+ return value;
169
+ if (Array.isArray(value))
170
+ return value.map(convertPgValueToMongo);
171
+ return value;
172
+ }
173
+ function convertRowToEmbeddedDoc(row, excludeFk) {
174
+ const doc = {};
175
+ for (const [key, value] of Object.entries(row)) {
176
+ if (key === excludeFk)
177
+ continue;
178
+ if (key === 'id')
179
+ continue;
180
+ const camelKey = key.replace(/_([a-z])/g, (_, l) => l.toUpperCase());
181
+ doc[camelKey] = convertPgValueToMongo(value);
182
+ }
183
+ return doc;
184
+ }
185
+ function getPrimaryKeyValue(row) {
186
+ return row.id || row[Object.keys(row)[0]];
187
+ }
188
+ function buildIncrementalWhere(since) {
189
+ const sinceDate = new Date(since).toISOString();
190
+ return `WHERE COALESCE(created_at, updated_at, '1970-01-01'::timestamptz) >= '${sinceDate}'`;
191
+ }
192
+ //# sourceMappingURL=postgres-to-mongo.engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres-to-mongo.engine.js","sourceRoot":"","sources":["../../../src/migration/engines/postgres-to-mongo.engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { MongoAnalysisResult, MigrationPlan, MigrationOptions } from '../types';
2
+ export declare function generateMongoToPostgresPlan(analysis: MongoAnalysisResult, sourceUrl: string, targetUrl: string, options?: Partial<MigrationOptions>): MigrationPlan;