dbdock 1.1.16 → 1.1.19

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 (52) hide show
  1. package/README.md +236 -11
  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/cli/utils/config.js +125 -5
  11. package/dist/cli/utils/config.js.map +1 -1
  12. package/dist/config/config.service.js +21 -3
  13. package/dist/config/config.service.js.map +1 -1
  14. package/dist/config/env-url.helper.d.ts +11 -0
  15. package/dist/config/env-url.helper.js +56 -0
  16. package/dist/config/env-url.helper.js.map +1 -0
  17. package/dist/config/secrets.validator.js +5 -1
  18. package/dist/config/secrets.validator.js.map +1 -1
  19. package/dist/migration/analyzers/mongodb.analyzer.d.ts +3 -0
  20. package/dist/migration/analyzers/mongodb.analyzer.js +208 -0
  21. package/dist/migration/analyzers/mongodb.analyzer.js.map +1 -0
  22. package/dist/migration/analyzers/postgres.analyzer.d.ts +3 -0
  23. package/dist/migration/analyzers/postgres.analyzer.js +176 -0
  24. package/dist/migration/analyzers/postgres.analyzer.js.map +1 -0
  25. package/dist/migration/config.manager.d.ts +3 -0
  26. package/dist/migration/config.manager.js +80 -0
  27. package/dist/migration/config.manager.js.map +1 -0
  28. package/dist/migration/engines/migration.engine.d.ts +6 -0
  29. package/dist/migration/engines/migration.engine.js +62 -0
  30. package/dist/migration/engines/migration.engine.js.map +1 -0
  31. package/dist/migration/engines/mongo-to-postgres.engine.d.ts +2 -0
  32. package/dist/migration/engines/mongo-to-postgres.engine.js +409 -0
  33. package/dist/migration/engines/mongo-to-postgres.engine.js.map +1 -0
  34. package/dist/migration/engines/postgres-to-mongo.engine.d.ts +2 -0
  35. package/dist/migration/engines/postgres-to-mongo.engine.js +192 -0
  36. package/dist/migration/engines/postgres-to-mongo.engine.js.map +1 -0
  37. package/dist/migration/mappers/mongo-to-postgres.mapper.d.ts +2 -0
  38. package/dist/migration/mappers/mongo-to-postgres.mapper.js +263 -0
  39. package/dist/migration/mappers/mongo-to-postgres.mapper.js.map +1 -0
  40. package/dist/migration/mappers/postgres-to-mongo.mapper.d.ts +2 -0
  41. package/dist/migration/mappers/postgres-to-mongo.mapper.js +174 -0
  42. package/dist/migration/mappers/postgres-to-mongo.mapper.js.map +1 -0
  43. package/dist/migration/reference.detector.d.ts +2 -0
  44. package/dist/migration/reference.detector.js +57 -0
  45. package/dist/migration/reference.detector.js.map +1 -0
  46. package/dist/migration/type.mapper.d.ts +12 -0
  47. package/dist/migration/type.mapper.js +197 -0
  48. package/dist/migration/type.mapper.js.map +1 -0
  49. package/dist/migration/types.d.ts +183 -0
  50. package/dist/migration/types.js +11 -0
  51. package/dist/migration/types.js.map +1 -0
  52. package/package.json +11 -2
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.exportConfig = exportConfig;
37
+ exports.importConfig = importConfig;
38
+ const fs_1 = require("fs");
39
+ const yaml = __importStar(require("js-yaml"));
40
+ function exportConfig(plan, filePath) {
41
+ const ext = filePath.split('.').pop()?.toLowerCase();
42
+ const data = sanitizePlanForExport(plan);
43
+ if (ext === 'yaml' || ext === 'yml') {
44
+ (0, fs_1.writeFileSync)(filePath, yaml.dump(data, { indent: 2, lineWidth: 120 }));
45
+ }
46
+ else {
47
+ (0, fs_1.writeFileSync)(filePath, JSON.stringify(data, null, 2));
48
+ }
49
+ }
50
+ function importConfig(filePath) {
51
+ if (!(0, fs_1.existsSync)(filePath)) {
52
+ throw new Error(`Config file not found: ${filePath}`);
53
+ }
54
+ const content = (0, fs_1.readFileSync)(filePath, 'utf-8');
55
+ const ext = filePath.split('.').pop()?.toLowerCase();
56
+ let data;
57
+ if (ext === 'yaml' || ext === 'yml') {
58
+ data = yaml.load(content);
59
+ }
60
+ else {
61
+ data = JSON.parse(content);
62
+ }
63
+ if (!data.version || !data.direction || !data.source || !data.target) {
64
+ throw new Error('Invalid migration config: missing required fields');
65
+ }
66
+ return data;
67
+ }
68
+ function sanitizePlanForExport(plan) {
69
+ return {
70
+ version: plan.version,
71
+ direction: plan.direction,
72
+ source: { type: plan.source.type, database: plan.source.database },
73
+ target: { type: plan.target.type, database: plan.target.database },
74
+ tableMappings: plan.tableMappings,
75
+ documentMappings: plan.documentMappings,
76
+ conflicts: plan.conflicts,
77
+ options: plan.options,
78
+ };
79
+ }
80
+ //# sourceMappingURL=config.manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.manager.js","sourceRoot":"","sources":["../../src/migration/config.manager.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,oCASC;AAED,oCAoBC;AAnCD,2BAA6D;AAC7D,8CAAgC;AAGhC,SAAgB,YAAY,CAAC,IAAmB,EAAE,QAAgB;IAChE,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,CAAC;IACrD,MAAM,IAAI,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;IAEzC,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;QACpC,IAAA,kBAAa,EAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;IAC1E,CAAC;SAAM,CAAC;QACN,IAAA,kBAAa,EAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACzD,CAAC;AACH,CAAC;AAED,SAAgB,YAAY,CAAC,QAAgB;IAC3C,IAAI,CAAC,IAAA,eAAU,EAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,0BAA0B,QAAQ,EAAE,CAAC,CAAC;IACxD,CAAC;IAED,MAAM,OAAO,GAAG,IAAA,iBAAY,EAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAChD,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,CAAC;IAErD,IAAI,IAAS,CAAC;IACd,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;QACpC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC5B,CAAC;SAAM,CAAC;QACN,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACrE,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACvE,CAAC;IAED,OAAO,IAAqB,CAAC;AAC/B,CAAC;AAED,SAAS,qBAAqB,CAAC,IAAmB;IAChD,OAAO;QACL,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;QAClE,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;QAClE,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;QACvC,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,OAAO,EAAE,IAAI,CAAC,OAAO;KACtB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { MigrationPlan, MigrationResult, MigrationOptions, AnalysisResult, ParsedDatabaseUrl } from '../types';
2
+ export declare function parseDatabaseUrl(url: string): ParsedDatabaseUrl;
3
+ export declare function analyzeDatabase(url: string): Promise<AnalysisResult>;
4
+ export declare function generateMigrationPlan(analysis: AnalysisResult, sourceUrl: string, targetUrl: string, options?: Partial<MigrationOptions>): MigrationPlan;
5
+ export declare function executeMigration(plan: MigrationPlan, onProgress?: (table: string, processed: number, total: number) => void): Promise<MigrationResult>;
6
+ export declare function maskUrl(url: string): string;
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseDatabaseUrl = parseDatabaseUrl;
4
+ exports.analyzeDatabase = analyzeDatabase;
5
+ exports.generateMigrationPlan = generateMigrationPlan;
6
+ exports.executeMigration = executeMigration;
7
+ exports.maskUrl = maskUrl;
8
+ const mongodb_analyzer_1 = require("../analyzers/mongodb.analyzer");
9
+ const postgres_analyzer_1 = require("../analyzers/postgres.analyzer");
10
+ const mongo_to_postgres_mapper_1 = require("../mappers/mongo-to-postgres.mapper");
11
+ const postgres_to_mongo_mapper_1 = require("../mappers/postgres-to-mongo.mapper");
12
+ const mongo_to_postgres_engine_1 = require("./mongo-to-postgres.engine");
13
+ const postgres_to_mongo_engine_1 = require("./postgres-to-mongo.engine");
14
+ function parseDatabaseUrl(url) {
15
+ if (url.startsWith('mongodb://') || url.startsWith('mongodb+srv://')) {
16
+ return (0, mongodb_analyzer_1.parseMongoUrl)(url);
17
+ }
18
+ if (url.startsWith('postgresql://') || url.startsWith('postgres://')) {
19
+ return (0, postgres_analyzer_1.parsePostgresUrl)(url);
20
+ }
21
+ throw new Error(`Unsupported database URL. Expected "mongodb://", "mongodb+srv://", "postgresql://", or "postgres://"`);
22
+ }
23
+ async function analyzeDatabase(url) {
24
+ const parsed = parseDatabaseUrl(url);
25
+ if (parsed.type === 'mongodb') {
26
+ return (0, mongodb_analyzer_1.analyzeMongoDB)(url);
27
+ }
28
+ return (0, postgres_analyzer_1.analyzePostgres)(url);
29
+ }
30
+ function generateMigrationPlan(analysis, sourceUrl, targetUrl, options = {}) {
31
+ const targetParsed = parseDatabaseUrl(targetUrl);
32
+ if (analysis.type === 'mongodb' && targetParsed.type === 'postgresql') {
33
+ return (0, mongo_to_postgres_mapper_1.generateMongoToPostgresPlan)(analysis, sourceUrl, targetUrl, options);
34
+ }
35
+ if (analysis.type === 'postgresql' && targetParsed.type === 'mongodb') {
36
+ return (0, postgres_to_mongo_mapper_1.generatePostgresToMongoPlan)(analysis, sourceUrl, targetUrl, options);
37
+ }
38
+ throw new Error(`Unsupported migration direction: ${analysis.type} → ${targetParsed.type}. ` +
39
+ `Supported: MongoDB → PostgreSQL, PostgreSQL → MongoDB`);
40
+ }
41
+ async function executeMigration(plan, onProgress) {
42
+ if (plan.direction === 'mongo_to_postgres') {
43
+ return (0, mongo_to_postgres_engine_1.executeMongoToPostgres)(plan, onProgress);
44
+ }
45
+ if (plan.direction === 'postgres_to_mongo') {
46
+ return (0, postgres_to_mongo_engine_1.executePostgresToMongo)(plan, onProgress);
47
+ }
48
+ throw new Error(`Unsupported migration direction: ${plan.direction}`);
49
+ }
50
+ function maskUrl(url) {
51
+ try {
52
+ const parsed = new URL(url);
53
+ if (parsed.password) {
54
+ parsed.password = '****';
55
+ }
56
+ return parsed.toString();
57
+ }
58
+ catch {
59
+ return url;
60
+ }
61
+ }
62
+ //# sourceMappingURL=migration.engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration.engine.js","sourceRoot":"","sources":["../../../src/migration/engines/migration.engine.ts"],"names":[],"mappings":";;AAeA,4CAUC;AAED,0CAQC;AAED,sDAoBC;AAED,4CAaC;AAED,0BAUC;AA5ED,oEAA8E;AAC9E,sEAAmF;AACnF,kFAAkF;AAClF,kFAAkF;AAClF,yEAAoE;AACpE,yEAAoE;AAEpE,SAAgB,gBAAgB,CAAC,GAAW;IAC1C,IAAI,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACrE,OAAO,IAAA,gCAAa,EAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;IACD,IAAI,GAAG,CAAC,UAAU,CAAC,eAAe,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QACrE,OAAO,IAAA,oCAAgB,EAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IACD,MAAM,IAAI,KAAK,CACb,sGAAsG,CACvG,CAAC;AACJ,CAAC;AAEM,KAAK,UAAU,eAAe,CAAC,GAAW;IAC/C,MAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAErC,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC9B,OAAO,IAAA,iCAAc,EAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED,OAAO,IAAA,mCAAe,EAAC,GAAG,CAAC,CAAC;AAC9B,CAAC;AAED,SAAgB,qBAAqB,CACnC,QAAwB,EACxB,SAAiB,EACjB,SAAiB,EACjB,UAAqC,EAAE;IAEvC,MAAM,YAAY,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAEjD,IAAI,QAAQ,CAAC,IAAI,KAAK,SAAS,IAAI,YAAY,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QACtE,OAAO,IAAA,sDAA2B,EAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IAC9E,CAAC;IAED,IAAI,QAAQ,CAAC,IAAI,KAAK,YAAY,IAAI,YAAY,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QACtE,OAAO,IAAA,sDAA2B,EAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IAC9E,CAAC;IAED,MAAM,IAAI,KAAK,CACb,oCAAoC,QAAQ,CAAC,IAAI,MAAM,YAAY,CAAC,IAAI,IAAI;QAC5E,uDAAuD,CACxD,CAAC;AACJ,CAAC;AAEM,KAAK,UAAU,gBAAgB,CACpC,IAAmB,EACnB,UAAsE;IAEtE,IAAI,IAAI,CAAC,SAAS,KAAK,mBAAmB,EAAE,CAAC;QAC3C,OAAO,IAAA,iDAAsB,EAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAClD,CAAC;IAED,IAAI,IAAI,CAAC,SAAS,KAAK,mBAAmB,EAAE,CAAC;QAC3C,OAAO,IAAA,iDAAsB,EAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAClD,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,oCAAoC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;AACxE,CAAC;AAED,SAAgB,OAAO,CAAC,GAAW;IACjC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACpB,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC;QAC3B,CAAC;QACD,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,CAAC;IACb,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { MigrationPlan, MigrationResult } from '../types';
2
+ export declare function executeMongoToPostgres(plan: MigrationPlan, onProgress?: (table: string, processed: number, total: number) => void): Promise<MigrationResult>;
@@ -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":";;AAqBA,wDAqEC;AA1FD,qCAAsC;AACtC,2BAAsC;AACtC,+BAAoC;AAUpC,gDAAqG;AAS9F,KAAK,UAAU,sBAAsB,CAC1C,IAAmB,EACnB,UAAsE;IAEtE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,MAAM,GAAqB,EAAE,CAAC;IACpC,MAAM,OAAO,GAA2B,EAAE,CAAC;IAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,QAAQ,CAAC;IAEjE,MAAM,WAAW,GAAG,IAAI,qBAAW,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,IAAI,SAAI,CAAC,EAAE,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;IAE/D,IAAI,CAAC;QACH,MAAM,WAAW,CAAC,OAAO,EAAE,CAAC;QAC5B,MAAM,EAAE,GAAG,WAAW,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAChD,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;QAExC,IAAI,CAAC;YACH,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;gBACxB,MAAM,QAAQ,CAAC,KAAK,CAAC,yBAAyB,MAAM,UAAU,CAAC,CAAC;gBAChE,MAAM,QAAQ,CAAC,KAAK,CAAC,iBAAiB,MAAM,EAAE,CAAC,CAAC;YAClD,CAAC;YAED,IAAI,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC;gBACnC,MAAM,iBAAiB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAC5C,CAAC;YAED,MAAM,eAAe,CAAC,QAAQ,EAAE,IAAI,CAAC,aAAa,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC;YAElE,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,aAAa,IAAI,EAAE,EAAE,CAAC;gBAC/C,MAAM,MAAM,GAAG,MAAM,iBAAiB,CACpC,EAAE,EACF,QAAQ,EACR,OAAO,EACP,IAAI,EACJ,MAAM,EACN,MAAM,EACN,UAAU,CACX,CAAC;gBACF,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACvB,CAAC;YAED,MAAM,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,aAAa,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC;YAEjE,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC;gBACxD,MAAM,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YAC9C,CAAC;YAED,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;gBACxB,MAAM,QAAQ,CAAC,KAAK,CAAC,yBAAyB,MAAM,UAAU,CAAC,CAAC;YAClE,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,QAAQ,CAAC,OAAO,EAAE,CAAC;QACrB,CAAC;IACH,CAAC;YAAS,CAAC;QACT,MAAM,WAAW,CAAC,KAAK,EAAE,CAAC;QAC1B,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC;IACrB,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IACxC,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;IAEhE,OAAO;QACL,OAAO,EAAE,UAAU,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAC1C,MAAM,EAAE,OAAO;QACf,WAAW,EAAE,MAAM,CAAC,MAAM;QAC1B,QAAQ;QACR,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM;KAC5B,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,MAAkB,EAAE,MAAc;IACjE,MAAM,MAAM,CAAC,KAAK,CAAC;iCACY,MAAM;;;;;;;;GAQpC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,eAAe,CAC5B,MAAkB,EAClB,QAAwB,EACxB,MAAc;IAEd,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAEvE,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;YAC5C,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBACjD,MAAM,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;YACvE,CAAC;QACH,CAAC;QAED,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;YACxC,IAAI,GAAG,CAAC,QAAQ,KAAK,aAAa,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;gBACjD,MAAM,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;YACjE,CAAC;iBAAM,IAAI,GAAG,CAAC,QAAQ,KAAK,cAAc,EAAE,CAAC;gBAC3C,MAAM,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;YAC9C,CAAC;iBAAM,IAAI,GAAG,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;gBACvC,MAAM,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;YACjD,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,WAAW,CACxB,MAAkB,EAClB,MAAc,EACd,SAAiB,EACjB,MAAsB;IAEtB,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC/B,IAAI,GAAG,GAAG,IAAI,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,UAAU,EAAE,CAAC;QAChD,IAAI,CAAC,CAAC,YAAY;YAAE,GAAG,IAAI,cAAc,CAAC;QAC1C,IAAI,CAAC,CAAC,YAAY;YAAE,GAAG,IAAI,YAAY,CAAC,CAAC,YAAY,EAAE,CAAC;QACxD,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,YAAY;YAAE,GAAG,IAAI,WAAW,CAAC;QACvD,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,YAAY;YAAE,GAAG,IAAI,SAAS,CAAC;QACpD,OAAO,GAAG,CAAC;IACb,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,CAAC,KAAK,CAChB,8BAA8B,MAAM,KAAK,SAAS,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAC9E,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,gBAAgB,CAC7B,MAAkB,EAClB,MAAc,EACd,GAAiB;IAEjB,MAAM,MAAM,CAAC,KAAK,CAAC;iCACY,MAAM,KAAK,GAAG,CAAC,WAAW;;SAElD,GAAG,CAAC,gBAAgB;cACf,GAAG,CAAC,WAAW,IAAI,MAAM;;GAEpC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,mBAAmB,CAChC,MAAkB,EAClB,MAAc,EACd,GAAiB;IAEjB,MAAM,MAAM,CAAC,KAAK,CAAC;iCACY,MAAM,KAAK,GAAG,CAAC,WAAW;;SAElD,GAAG,CAAC,gBAAgB;;;GAG1B,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,cAAc,CAC3B,MAAkB,EAClB,QAAwB,EACxB,MAAc;IAEd,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;YAC7C,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAC9B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,gBAAgB,KAAK,GAAG,CAAC,gBAAgB,CACnD,CAAC;YACF,IAAI,CAAC,UAAU;gBAAE,SAAS;YAE1B,MAAM,QAAQ,GAAG,GAAG,CAAC,gBAAgB,CAAC,QAAQ,CAAC,KAAK,CAAC;gBACnD,CAAC,CAAC,GAAG,CAAC,gBAAgB;gBACtB,CAAC,CAAC,GAAG,CAAC,gBAAgB,GAAG,KAAK,CAAC;YAEjC,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CACnC,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,YAAY,KAAK,QAAQ;gBAC3B,CAAC,CAAC,YAAY,KAAK,GAAG,CAAC,gBAAgB,CAC1C,CAAC;YACF,IAAI,CAAC,SAAS;gBAAE,SAAS;YAEzB,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CACtC,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,YAAY,KAAK,QAAQ;gBAC3B,CAAC,CAAC,YAAY,KAAK,GAAG,CAAC,gBAAgB,CAC1C,EAAE,YAAY,CAAC;YAEhB,IAAI,CAAC,YAAY;gBAAE,SAAS;YAE5B,IAAI,CAAC;gBACH,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC,WAAW,IAAI,YAAY,EAAE,CAAC;gBACnE,MAAM,MAAM,CAAC,KAAK,CAAC;wBACH,MAAM,KAAK,OAAO,CAAC,WAAW;4BAC1B,cAAc;0BAChB,YAAY;uBACf,MAAM,KAAK,UAAU,CAAC,WAAW;;SAE/C,CAAC,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;YAET,CAAC;QACH,CAAC;QAED,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;YAC5C,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;gBAChC,IAAI,CAAC;oBACH,MAAM,MAAM,CAAC,KAAK,CAAC;0BACH,MAAM,KAAK,MAAM,CAAC,WAAW;iCACtB,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,gBAAgB;4BAClD,MAAM,CAAC,gBAAgB;yBAC1B,MAAM,KAAK,OAAO,CAAC,WAAW;;WAE5C,CAAC,CAAC;gBACL,CAAC;gBAAC,MAAM,CAAC,CAAA,CAAC;YACZ,CAAC;QACH,CAAC;QAED,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;YACxC,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,KAAK,CAAC;wBACH,MAAM,KAAK,GAAG,CAAC,WAAW;+BACnB,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,gBAAgB;0BAC5C,GAAG,CAAC,gBAAgB;uBACvB,MAAM,KAAK,OAAO,CAAC,WAAW;;SAE5C,CAAC,CAAC;YACL,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;QACZ,CAAC;IACH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,EAAO,EACP,QAAoB,EACpB,OAAqB,EACrB,IAAmB,EACnB,MAAc,EACd,MAAwB,EACxB,UAAsE;IAEtE,MAAM,UAAU,GAAG,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC3D,IAAI,KAAK,GAAQ,EAAE,CAAC;IAEpB,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACnD,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC/C,KAAK,GAAG;YACN,GAAG,EAAE;gBACH,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE;gBAClC,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE;gBAClC,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE;gBACnC,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE;aACpC;SACF,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,UAAU,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IAC1D,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;IACzC,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IAE3D,IAAI,KAAK,GAAU,EAAE,CAAC;IAEtB,OAAO,MAAM,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;QAC9B,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QAChC,IAAI,CAAC,GAAG;YAAE,SAAS;QACnB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAEhB,IAAI,KAAK,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC;YAC9B,MAAM,MAAM,GAAG,MAAM,YAAY,CAC/B,QAAQ,EACR,OAAO,EACP,KAAK,EACL,MAAM,EACN,MAAM,CACP,CAAC;YACF,WAAW,IAAI,MAAM,CAAC;YACtB,SAAS,IAAI,KAAK,CAAC,MAAM,CAAC;YAC1B,KAAK,GAAG,EAAE,CAAC;YACX,UAAU,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,MAAM,GAAG,MAAM,YAAY,CAC/B,QAAQ,EACR,OAAO,EACP,KAAK,EACL,MAAM,EACN,MAAM,CACP,CAAC;QACF,WAAW,IAAI,MAAM,CAAC;QACtB,SAAS,IAAI,KAAK,CAAC,MAAM,CAAC;QAC1B,UAAU,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IAC3D,CAAC;IAED,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IAErB,MAAM,WAAW,GAAG,SAAS,GAAG,WAAW,CAAC;IAC5C,IAAI,MAAM,GAAqC,SAAS,CAAC;IACzD,IAAI,WAAW,GAAG,CAAC,IAAI,WAAW,GAAG,CAAC;QAAE,MAAM,GAAG,SAAS,CAAC;IAC3D,IAAI,WAAW,KAAK,CAAC,IAAI,UAAU,GAAG,CAAC;QAAE,MAAM,GAAG,QAAQ,CAAC;IAE3D,OAAO;QACL,IAAI,EAAE,OAAO,CAAC,WAAW;QACzB,WAAW,EAAE,UAAU;QACvB,WAAW;QACX,WAAW;QACX,MAAM;KACP,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,YAAY,CACzB,QAAoB,EACpB,OAAqB,EACrB,IAAW,EACX,MAAc,EACd,MAAwB;IAExB,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,CAAC;YACH,MAAM,cAAc,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QACvD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,EAAE,CAAC;YACT,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE,IAAI,SAAS,CAAC;YACpD,MAAM,CAAC,IAAI,CAAC;gBACV,KAAK,EAAE,OAAO,CAAC,WAAW;gBAC1B,QAAQ;gBACR,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;gBACvD,IAAI,EAAE,aAAa,CAAC,GAAG,CAAC;aACzB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,cAAc,CAC3B,QAAoB,EACpB,OAAqB,EACrB,GAAQ,EACR,MAAc;IAEd,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAA,4BAAc,EAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,IAAA,SAAM,GAAE,CAAC;IAEzE,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,MAAM,GAAU,EAAE,CAAC;IACzB,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,IAAI,QAAQ,GAAG,CAAC,CAAC;IAEjB,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;QAErD,IAAI,OAAY,CAAC;QACjB,IAAI,KAAK,CAAC,SAAS,KAAK,oBAAoB,IAAI,KAAK,EAAE,CAAC;YACtD,OAAO,GAAG,IAAA,4BAAc,EAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC7C,CAAC;aAAM,IAAI,KAAK,CAAC,SAAS,KAAK,OAAO,EAAE,CAAC;YACvC,OAAO,GAAG,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACzD,CAAC;aAAM,IAAI,KAAK,CAAC,SAAS,KAAK,MAAM,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;YACvD,MAAM,MAAM,GAAG,IAAA,yBAAW,EAAC,KAAK,EAAE,OAAO,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;YAClE,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;QACjD,CAAC;aAAM,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC;YACjC,OAAO,GAAG,KAAK,CAAC;QAClB,CAAC;aAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,UAAU,KAAK,OAAO,EAAE,CAAC;YACvF,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAClC,CAAC;aAAM,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YAC/B,OAAO,GAAG,KAAK,EAAE,QAAQ,EAAE,EAAE,IAAI,KAAK,CAAC;QACzC,CAAC;aAAM,CAAC;YACN,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC;QACxC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACrB,YAAY,CAAC,IAAI,CAAC,IAAI,QAAQ,EAAE,EAAE,CAAC,CAAC;IACtC,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,QAAQ,CAAC,KAAK,CAClB,eAAe,MAAM,KAAK,OAAO,CAAC,WAAW,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,0BAA0B,EACnI,MAAM,CACP,CAAC;IACJ,CAAC;IAED,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;QAC5C,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YACjD,MAAM,WAAW,GAAG,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;YAC5D,IAAI,WAAW,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;gBAClF,MAAM,kBAAkB,CACtB,QAAQ,EACR,MAAM,EACN,MAAM,EACN,WAAW,EACX,QAAQ,CACT,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;QACxC,MAAM,UAAU,GAAG,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;QACxD,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9B,MAAM,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,kBAAkB,CAC/B,QAAoB,EACpB,MAAc,EACd,MAAqB,EACrB,KAAU,EACV,QAAgB;IAEhB,IAAI,CAAC,MAAM,CAAC,MAAM;QAAE,OAAO;IAE3B,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,MAAM,GAAU,EAAE,CAAC;IACzB,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,IAAI,QAAQ,GAAG,CAAC,CAAC;IAEjB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClC,IAAI,KAAK,CAAC,WAAW,KAAK,IAAI,EAAE,CAAC;YAC/B,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACrB,MAAM,CAAC,IAAI,CAAC,IAAA,SAAM,GAAE,CAAC,CAAC;YACtB,YAAY,CAAC,IAAI,CAAC,IAAI,QAAQ,EAAE,EAAE,CAAC,CAAC;QACtC,CAAC;aAAM,IAAI,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,UAAU,KAAK,MAAM,EAAE,CAAC;YAC5E,OAAO,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC;YACxC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACtB,YAAY,CAAC,IAAI,CAAC,IAAI,QAAQ,EAAE,EAAE,CAAC,CAAC;QACtC,CAAC;aAAM,CAAC;YACN,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,KAAK,CAAC,WAAW,CAAC;YAC1E,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC;YACrC,OAAO,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC;YACxC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACjB,YAAY,CAAC,IAAI,CAAC,IAAI,QAAQ,EAAE,EAAE,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,CAAC,KAAK,CAClB,eAAe,MAAM,KAAK,MAAM,CAAC,WAAW,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,0BAA0B,EAClI,MAAM,CACP,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,mBAAmB,CAChC,QAAoB,EACpB,MAAc,EACd,GAAiB,EACjB,MAAa,EACb,QAAgB;IAEhB,KAAK,MAAM,OAAO,IAAI,MAAM,EAAE,CAAC;QAC7B,IAAI,GAAG,CAAC,QAAQ,KAAK,aAAa,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACjD,MAAM,OAAO,GAAa,EAAE,CAAC;YAC7B,MAAM,IAAI,GAAU,EAAE,CAAC;YACvB,MAAM,YAAY,GAAa,EAAE,CAAC;YAClC,IAAI,QAAQ,GAAG,CAAC,CAAC;YAEjB,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;gBAC/B,IAAI,KAAK,CAAC,WAAW,KAAK,IAAI,EAAE,CAAC;oBAC/B,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBACrB,IAAI,CAAC,IAAI,CAAC,IAAA,SAAM,GAAE,CAAC,CAAC;oBACpB,YAAY,CAAC,IAAI,CAAC,IAAI,QAAQ,EAAE,EAAE,CAAC,CAAC;gBACtC,CAAC;qBAAM,IACL,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC;oBACjC,KAAK,CAAC,UAAU,KAAK,MAAM,EAC3B,CAAC;oBACD,OAAO,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC;oBACxC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBACpB,YAAY,CAAC,IAAI,CAAC,IAAI,QAAQ,EAAE,EAAE,CAAC,CAAC;gBACtC,CAAC;qBAAM,CAAC;oBACN,MAAM,SAAS,GACb,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,KAAK,CAAC,WAAW,CAAC;oBAC1D,MAAM,GAAG,GACP,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO;wBACpC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,IAAI;wBAC5B,CAAC,CAAC,IAAI,CAAC;oBACX,OAAO,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC;oBACxC,IAAI,CAAC,IAAI,CAAC,GAAG,YAAY,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;oBAC3C,YAAY,CAAC,IAAI,CAAC,IAAI,QAAQ,EAAE,EAAE,CAAC,CAAC;gBACtC,CAAC;YACH,CAAC;YAED,MAAM,QAAQ,CAAC,KAAK,CAClB,eAAe,MAAM,KAAK,GAAG,CAAC,WAAW,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,0BAA0B,EAC/H,IAAI,CACL,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,GACP,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YAElE,MAAM,QAAQ,CAAC,KAAK,CAClB,eAAe,MAAM,KAAK,GAAG,CAAC,WAAW,aAAa,GAAG,CAAC,gBAAgB,wDAAwD,EAClI,CAAC,IAAA,SAAM,GAAE,EAAE,QAAQ,EAAE,GAAG,CAAC,CAC1B,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,GAAQ,EAAE,IAAY;IAC5C,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG;QAAE,OAAO,GAAG,CAAC;IAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnD,IAAI,OAAO,GAAG,GAAG,CAAC;IAClB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,OAAO,IAAI,IAAI;YAAE,OAAO,SAAS,CAAC;QACtC,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,KAAK,UAAU,WAAW,CACxB,MAAkB,EAClB,MAAwB,EACxB,MAAc;IAEd,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,KAAK,CAChB,eAAe,MAAM,gGAAgG,EACrH,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,CAC/C,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,GAAQ;IAC7B,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE;YACtC,IAAI,OAAO,KAAK,KAAK,QAAQ;gBAAE,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;YACvD,IAAI,KAAK,YAAY,IAAI;gBAAE,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC;YACtD,IAAI,KAAK,EAAE,SAAS;gBAAE,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC9C,OAAO,KAAK,CAAC;QACf,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -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>;