@datacapy/migrate 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/LICENSE +29 -0
  2. package/README.md +658 -0
  3. package/dist/cli/command-parser.d.ts +18 -0
  4. package/dist/cli/command-parser.d.ts.map +1 -0
  5. package/dist/cli/command-parser.js +159 -0
  6. package/dist/cli/command-parser.js.map +1 -0
  7. package/dist/cli/index.d.ts +3 -0
  8. package/dist/cli/index.d.ts.map +1 -0
  9. package/dist/cli/index.js +22 -0
  10. package/dist/cli/index.js.map +1 -0
  11. package/dist/cli/runner.d.ts +6 -0
  12. package/dist/cli/runner.d.ts.map +1 -0
  13. package/dist/cli/runner.js +141 -0
  14. package/dist/cli/runner.js.map +1 -0
  15. package/dist/executor/patch-executor.d.ts +13 -0
  16. package/dist/executor/patch-executor.d.ts.map +1 -0
  17. package/dist/executor/patch-executor.js +58 -0
  18. package/dist/executor/patch-executor.js.map +1 -0
  19. package/dist/index.d.ts +13 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +20 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/interface/context-resolver.d.ts +4 -0
  24. package/dist/interface/context-resolver.d.ts.map +1 -0
  25. package/dist/interface/context-resolver.js +3 -0
  26. package/dist/interface/context-resolver.js.map +1 -0
  27. package/dist/interface/database-patch.d.ts +8 -0
  28. package/dist/interface/database-patch.d.ts.map +1 -0
  29. package/dist/interface/database-patch.js +3 -0
  30. package/dist/interface/database-patch.js.map +1 -0
  31. package/dist/interface/index.d.ts +4 -0
  32. package/dist/interface/index.d.ts.map +1 -0
  33. package/dist/interface/index.js +20 -0
  34. package/dist/interface/index.js.map +1 -0
  35. package/dist/interface/migration-config.d.ts +26 -0
  36. package/dist/interface/migration-config.d.ts.map +1 -0
  37. package/dist/interface/migration-config.js +3 -0
  38. package/dist/interface/migration-config.js.map +1 -0
  39. package/dist/interface/migration-result.d.ts +31 -0
  40. package/dist/interface/migration-result.d.ts.map +1 -0
  41. package/dist/interface/migration-result.js +3 -0
  42. package/dist/interface/migration-result.js.map +1 -0
  43. package/dist/logger/migration-logger.d.ts +21 -0
  44. package/dist/logger/migration-logger.d.ts.map +1 -0
  45. package/dist/logger/migration-logger.js +78 -0
  46. package/dist/logger/migration-logger.js.map +1 -0
  47. package/dist/manager/migration-manager.d.ts +12 -0
  48. package/dist/manager/migration-manager.d.ts.map +1 -0
  49. package/dist/manager/migration-manager.js +262 -0
  50. package/dist/manager/migration-manager.js.map +1 -0
  51. package/dist/meta/meta-table.d.ts +22 -0
  52. package/dist/meta/meta-table.d.ts.map +1 -0
  53. package/dist/meta/meta-table.js +86 -0
  54. package/dist/meta/meta-table.js.map +1 -0
  55. package/dist/scanner/patch-scanner.d.ts +11 -0
  56. package/dist/scanner/patch-scanner.d.ts.map +1 -0
  57. package/dist/scanner/patch-scanner.js +166 -0
  58. package/dist/scanner/patch-scanner.js.map +1 -0
  59. package/dist/version/version-manager.d.ts +11 -0
  60. package/dist/version/version-manager.d.ts.map +1 -0
  61. package/dist/version/version-manager.js +90 -0
  62. package/dist/version/version-manager.js.map +1 -0
  63. package/package.json +51 -0
  64. package/tsconfig.json +27 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration-result.d.ts","sourceRoot":"","sources":["../../src/interface/migration-result.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,WAAW;IAI1B,OAAO,EAAE,MAAM,CAAC;IAKhB,WAAW,EAAE,MAAM,CAAC;IAKpB,cAAc,EAAE,MAAM,CAAC;IAKvB,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;IAKzC,QAAQ,EAAE,MAAM,CAAC;IAKjB,KAAK,CAAC,EAAE;QACN,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IAKF,SAAS,EAAE,IAAI,CAAC;CACjB;AAOD,MAAM,WAAW,eAAe;IAI9B,YAAY,EAAE,MAAM,CAAC;IAKrB,YAAY,EAAE,MAAM,CAAC;IAKrB,WAAW,EAAE,MAAM,CAAC;IAKpB,YAAY,EAAE,MAAM,CAAC;IAKrB,YAAY,EAAE,WAAW,EAAE,CAAC;IAK5B,eAAe,EAAE,MAAM,CAAC;IAKxB,cAAc,EAAE,MAAM,CAAC;IAKvB,aAAa,EAAE,MAAM,CAAC;IAKtB,MAAM,EAAE,OAAO,CAAC;IAKhB,SAAS,EAAE,IAAI,CAAC;IAKhB,OAAO,EAAE,IAAI,CAAC;CACf;AAOD,MAAM,WAAW,SAAS;IAIxB,OAAO,EAAE,MAAM,CAAC;IAKhB,QAAQ,EAAE,MAAM,CAAC;IAKjB,KAAK,EAAE,GAAG,CAAC;CACZ"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=migration-result.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration-result.js","sourceRoot":"","sources":["../../src/interface/migration-result.ts"],"names":[],"mappings":""}
@@ -0,0 +1,21 @@
1
+ export declare class MigrationLogger {
2
+ private verbose;
3
+ private customLogger?;
4
+ constructor(verbose?: boolean, customLogger?: (message: string, level?: "info" | "warn" | "error") => void);
5
+ info(message: string): void;
6
+ warn(message: string): void;
7
+ error(message: string): void;
8
+ verboseLog(message: string): void;
9
+ success(message: string): void;
10
+ private log;
11
+ logMigrationStart(dataSourceName: string, patchCount: number): void;
12
+ logMigrationComplete(successCount: number, failedCount: number, duration: number): void;
13
+ logPatchStart(version: string, description: string): void;
14
+ logPatchSuccess(version: string, duration: number): void;
15
+ logPatchFailure(version: string, error: Error): void;
16
+ logPatchSkipped(version: string, reason: string): void;
17
+ logDryRun(): void;
18
+ logCurrentVersion(version: string): void;
19
+ logTargetVersion(version: string): void;
20
+ }
21
+ //# sourceMappingURL=migration-logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration-logger.d.ts","sourceRoot":"","sources":["../../src/logger/migration-logger.ts"],"names":[],"mappings":"AAKA,qBAAa,eAAe;IAC1B,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,YAAY,CAAC,CAGX;gBAGR,OAAO,GAAE,OAAe,EACxB,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,KAAK,IAAI;IAS7E,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAO3B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAO3B,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAO5B,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IASjC,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAO9B,OAAO,CAAC,GAAG;IAwBX,iBAAiB,CAAC,cAAc,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAQnE,oBAAoB,CAClB,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,GACf,IAAI;IASP,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI;IAOzD,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAOxD,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI;IAUpD,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAOtD,SAAS,IAAI,IAAI;IAOjB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAOxC,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;CAGxC"}
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MigrationLogger = void 0;
4
+ class MigrationLogger {
5
+ constructor(verbose = false, customLogger) {
6
+ this.verbose = verbose;
7
+ this.customLogger = customLogger;
8
+ }
9
+ info(message) {
10
+ this.log(message, "info");
11
+ }
12
+ warn(message) {
13
+ this.log(message, "warn");
14
+ }
15
+ error(message) {
16
+ this.log(message, "error");
17
+ }
18
+ verboseLog(message) {
19
+ if (this.verbose) {
20
+ this.log(message, "info");
21
+ }
22
+ }
23
+ success(message) {
24
+ this.log(message, "info");
25
+ }
26
+ log(message, level) {
27
+ const timestamp = new Date().toISOString();
28
+ const formattedMessage = `[${timestamp}] [${level.toUpperCase()}] ${message}`;
29
+ if (this.customLogger) {
30
+ this.customLogger(formattedMessage, level);
31
+ }
32
+ else {
33
+ switch (level) {
34
+ case "error":
35
+ console.error(formattedMessage);
36
+ break;
37
+ case "warn":
38
+ console.warn(formattedMessage);
39
+ break;
40
+ default:
41
+ console.log(formattedMessage);
42
+ }
43
+ }
44
+ }
45
+ logMigrationStart(dataSourceName, patchCount) {
46
+ this.info(`Starting migration for datasource: ${dataSourceName}`);
47
+ this.info(`Found ${patchCount} patches to apply`);
48
+ }
49
+ logMigrationComplete(successCount, failedCount, duration) {
50
+ this.success(`Migration complete: ${successCount} successful, ${failedCount} failed (${duration}ms)`);
51
+ }
52
+ logPatchStart(version, description) {
53
+ this.verboseLog(`Applying patch ${version}: ${description}`);
54
+ }
55
+ logPatchSuccess(version, duration) {
56
+ this.verboseLog(`✓ Patch ${version} applied successfully (${duration}ms)`);
57
+ }
58
+ logPatchFailure(version, error) {
59
+ this.error(`✗ Patch ${version} failed: ${error.message}`);
60
+ if (this.verbose && error.stack) {
61
+ this.error(error.stack);
62
+ }
63
+ }
64
+ logPatchSkipped(version, reason) {
65
+ this.verboseLog(`⊘ Patch ${version} skipped: ${reason}`);
66
+ }
67
+ logDryRun() {
68
+ this.warn("DRY RUN MODE - No changes will be applied");
69
+ }
70
+ logCurrentVersion(version) {
71
+ this.info(`Current database version: ${version}`);
72
+ }
73
+ logTargetVersion(version) {
74
+ this.info(`Target version: ${version}`);
75
+ }
76
+ }
77
+ exports.MigrationLogger = MigrationLogger;
78
+ //# sourceMappingURL=migration-logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration-logger.js","sourceRoot":"","sources":["../../src/logger/migration-logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { MigrationConfig } from "../interface/migration-config";
2
+ import { MigrationResult } from "../interface/migration-result";
3
+ export declare class MigrationManager {
4
+ private config;
5
+ private logger;
6
+ constructor(config: MigrationConfig);
7
+ migrate(): Promise<MigrationResult>;
8
+ private migrateBatch;
9
+ private buildDataSourceContext;
10
+ private resolveDataSource;
11
+ }
12
+ //# sourceMappingURL=migration-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration-manager.d.ts","sourceRoot":"","sources":["../../src/manager/migration-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EAEhB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,eAAe,EAAe,MAAM,+BAA+B,CAAC;AAiB7E,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,MAAM,CAAkB;gBAEpB,MAAM,EAAE,eAAe;IAoB7B,OAAO,IAAI,OAAO,CAAC,eAAe,CAAC;YA0L3B,YAAY;IAoI1B,OAAO,CAAC,sBAAsB;YAsBhB,iBAAiB;CAyDhC"}
@@ -0,0 +1,262 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MigrationManager = void 0;
4
+ const version_manager_1 = require("../version/version-manager");
5
+ const meta_table_1 = require("../meta/meta-table");
6
+ const patch_scanner_1 = require("../scanner/patch-scanner");
7
+ const patch_executor_1 = require("../executor/patch-executor");
8
+ const migration_logger_1 = require("../logger/migration-logger");
9
+ const data_source_1 = require("@datacapy/om/dist/data-source");
10
+ class MigrationManager {
11
+ constructor(config) {
12
+ this.config = {
13
+ ...config,
14
+ patchDirectory: config.patchDirectory || "./migrate",
15
+ targetVersion: config.targetVersion || "latest",
16
+ metaTableName: config.metaTableName || "migrationMeta",
17
+ dryRun: config.dryRun || false,
18
+ verbose: config.verbose || false,
19
+ stopOnError: config.stopOnError !== undefined ? config.stopOnError : true,
20
+ };
21
+ this.logger = new migration_logger_1.MigrationLogger(this.config.verbose, this.config.logger);
22
+ }
23
+ async migrate() {
24
+ const startTime = new Date();
25
+ let releaseKey;
26
+ try {
27
+ if (this.config.contextLookup) {
28
+ return await this.migrateBatch(startTime);
29
+ }
30
+ if (this.config.dryRun) {
31
+ this.logger.logDryRun();
32
+ }
33
+ this.logger.verboseLog("Resolving target datasource...");
34
+ const resolved = await this.resolveDataSource();
35
+ const targetDataSource = resolved.dataSource;
36
+ releaseKey = resolved.releaseKey;
37
+ const dsContext = this.buildDataSourceContext();
38
+ if (dsContext) {
39
+ await this.config.modelManager.initDynamicReposForDataSource(this.config.dataSourceName, dsContext);
40
+ }
41
+ this.logger.verboseLog("Initializing meta table...");
42
+ const metaTable = new meta_table_1.MetaTable(targetDataSource, this.config.metaTableName);
43
+ await metaTable.initialize();
44
+ const currentVersion = await metaTable.getCurrentVersion();
45
+ this.logger.logCurrentVersion(currentVersion);
46
+ this.logger.verboseLog(`Scanning patches in ${this.config.patchDirectory}...`);
47
+ const scanner = new patch_scanner_1.PatchScanner(this.config.patchDirectory);
48
+ const allPatchFiles = await scanner.scanPatches();
49
+ const filteredPatchFiles = allPatchFiles.filter((pf) => pf.patch.dataSourceName === this.config.dataSourceName);
50
+ this.logger.verboseLog(`Found ${allPatchFiles.length} total patches, ${filteredPatchFiles.length} for datasource "${this.config.dataSourceName}"`);
51
+ const allVersions = filteredPatchFiles.map((pf) => pf.version);
52
+ const targetVersion = this.config.targetVersion === "latest"
53
+ ? version_manager_1.VersionManager.getLatestVersion(allVersions)
54
+ : this.config.targetVersion;
55
+ if (targetVersion) {
56
+ this.logger.logTargetVersion(targetVersion);
57
+ }
58
+ const versionsToApply = version_manager_1.VersionManager.getVersionsToApply(allVersions, currentVersion, targetVersion);
59
+ const patchesToApply = filteredPatchFiles
60
+ .filter((pf) => versionsToApply.includes(pf.version))
61
+ .map((pf) => pf.patch);
62
+ if (patchesToApply.length === 0) {
63
+ this.logger.info("No patches to apply. Database is up to date.");
64
+ return {
65
+ totalPatches: 0,
66
+ successCount: 0,
67
+ failedCount: 0,
68
+ skippedCount: 0,
69
+ patchResults: [],
70
+ previousVersion: currentVersion,
71
+ currentVersion: currentVersion,
72
+ totalDuration: Date.now() - startTime.getTime(),
73
+ dryRun: this.config.dryRun,
74
+ startTime,
75
+ endTime: new Date(),
76
+ };
77
+ }
78
+ this.logger.logMigrationStart(this.config.dataSourceName, patchesToApply.length);
79
+ const executor = new patch_executor_1.PatchExecutor(this.config.modelManager, this.logger, this.config.dryRun);
80
+ const patchResults = await executor.executePatches(patchesToApply, dsContext ?? new data_source_1.DataSourceContext(), this.config.stopOnError);
81
+ if (!this.config.dryRun) {
82
+ for (const result of patchResults) {
83
+ if (result.status === "success") {
84
+ await metaTable.recordPatch(result.version, result.description, result.duration);
85
+ }
86
+ }
87
+ }
88
+ const newCurrentVersion = this.config.dryRun
89
+ ? currentVersion
90
+ : await metaTable.getCurrentVersion();
91
+ const successCount = patchResults.filter((r) => r.status === "success").length;
92
+ const failedCount = patchResults.filter((r) => r.status === "failed").length;
93
+ const skippedCount = patchResults.filter((r) => r.status === "skipped").length;
94
+ const endTime = new Date();
95
+ const totalDuration = endTime.getTime() - startTime.getTime();
96
+ this.logger.logMigrationComplete(successCount, failedCount, totalDuration);
97
+ return {
98
+ totalPatches: patchResults.length,
99
+ successCount,
100
+ failedCount,
101
+ skippedCount,
102
+ patchResults,
103
+ previousVersion: currentVersion,
104
+ currentVersion: newCurrentVersion,
105
+ totalDuration,
106
+ dryRun: this.config.dryRun,
107
+ startTime,
108
+ endTime,
109
+ };
110
+ }
111
+ catch (error) {
112
+ const endTime = new Date();
113
+ this.logger.error(`Migration failed: ${error instanceof Error ? error.message : String(error)}`);
114
+ throw error;
115
+ }
116
+ finally {
117
+ if (releaseKey) {
118
+ this.config.modelManager.dataSourceRegistry?.release(releaseKey);
119
+ }
120
+ }
121
+ }
122
+ async migrateBatch(startTime) {
123
+ const { contextLookup, contextResolver } = this.config;
124
+ if (!contextResolver) {
125
+ throw new Error("contextResolver is required when contextLookup is provided");
126
+ }
127
+ if (!contextLookup) {
128
+ throw new Error("contextLookup pattern is required for batch migration");
129
+ }
130
+ this.logger.info(`Resolving context pattern: ${contextLookup}`);
131
+ let contexts;
132
+ try {
133
+ contexts = await contextResolver.resolve(contextLookup);
134
+ }
135
+ catch (error) {
136
+ throw new Error(`Failed to resolve context pattern "${contextLookup}": ${error instanceof Error ? error.message : String(error)}`);
137
+ }
138
+ if (contexts.length === 0) {
139
+ this.logger.info(`No contexts found for pattern "${contextLookup}"`);
140
+ return {
141
+ totalPatches: 0,
142
+ successCount: 0,
143
+ failedCount: 0,
144
+ skippedCount: 0,
145
+ patchResults: [],
146
+ previousVersion: null,
147
+ currentVersion: null,
148
+ totalDuration: Date.now() - startTime.getTime(),
149
+ dryRun: this.config.dryRun,
150
+ startTime,
151
+ endTime: new Date(),
152
+ };
153
+ }
154
+ this.logger.info(`Found ${contexts.length} context(s) to migrate sequentially`);
155
+ if (this.config.dryRun) {
156
+ this.logger.logDryRun();
157
+ }
158
+ const allPatchResults = [];
159
+ let totalSuccessCount = 0;
160
+ let totalFailedCount = 0;
161
+ let totalSkippedCount = 0;
162
+ for (let i = 0; i < contexts.length; i++) {
163
+ const context = contexts[i];
164
+ const contextStr = JSON.stringify(context);
165
+ this.logger.info(`\n[${i + 1}/${contexts.length}] Migrating context: ${contextStr}`);
166
+ try {
167
+ const contextConfig = {
168
+ ...this.config,
169
+ context,
170
+ contextLookup: undefined,
171
+ contextResolver: undefined,
172
+ };
173
+ const contextManager = new MigrationManager(contextConfig);
174
+ const result = await contextManager.migrate();
175
+ allPatchResults.push(...result.patchResults);
176
+ totalSuccessCount += result.successCount;
177
+ totalFailedCount += result.failedCount;
178
+ totalSkippedCount += result.skippedCount;
179
+ if (result.failedCount > 0) {
180
+ this.logger.error(`Migration failed for context ${contextStr}. Stopping batch migration.`);
181
+ break;
182
+ }
183
+ this.logger.info(`✓ Context ${contextStr} migrated successfully (${result.successCount} patches applied)`);
184
+ }
185
+ catch (error) {
186
+ this.logger.error(`Migration failed for context ${contextStr}: ${error instanceof Error ? error.message : String(error)}`);
187
+ throw error;
188
+ }
189
+ }
190
+ const endTime = new Date();
191
+ const totalDuration = endTime.getTime() - startTime.getTime();
192
+ this.logger.info("\n=== Batch Migration Summary ===");
193
+ this.logger.info(`Total contexts migrated: ${contexts.length}`);
194
+ this.logger.info(`Total patches applied: ${totalSuccessCount}`);
195
+ this.logger.info(`Total patches failed: ${totalFailedCount}`);
196
+ this.logger.info(`Total patches skipped: ${totalSkippedCount}`);
197
+ this.logger.info(`Total duration: ${totalDuration}ms`);
198
+ return {
199
+ totalPatches: allPatchResults.length,
200
+ successCount: totalSuccessCount,
201
+ failedCount: totalFailedCount,
202
+ skippedCount: totalSkippedCount,
203
+ patchResults: allPatchResults,
204
+ previousVersion: null,
205
+ currentVersion: null,
206
+ totalDuration,
207
+ dryRun: this.config.dryRun,
208
+ startTime,
209
+ endTime,
210
+ };
211
+ }
212
+ buildDataSourceContext() {
213
+ const { context, dataSourceName } = this.config;
214
+ if (!context)
215
+ return undefined;
216
+ if (context instanceof data_source_1.DataSourceContext)
217
+ return context;
218
+ const entry = Object.keys(context).reduce((acc, key) => {
219
+ acc[dataSourceName] = {
220
+ lookupKey: context[key],
221
+ };
222
+ return acc;
223
+ }, {});
224
+ return data_source_1.DataSourceContext.fromDataSources(entry);
225
+ }
226
+ async resolveDataSource() {
227
+ const { modelManager, dataSourceName } = this.config;
228
+ try {
229
+ const staticDataSource = modelManager.getDataSource(dataSourceName);
230
+ const isDynamic = staticDataSource &&
231
+ typeof staticDataSource.isDynamic === "function" &&
232
+ staticDataSource.isDynamic();
233
+ if (staticDataSource && !isDynamic) {
234
+ this.logger.verboseLog(`Resolved static datasource: ${dataSourceName}`);
235
+ return { dataSource: staticDataSource };
236
+ }
237
+ }
238
+ catch (error) {
239
+ }
240
+ const dsContext = this.buildDataSourceContext();
241
+ if (!dsContext) {
242
+ throw new Error(`Datasource "${dataSourceName}" not found. If this is a dynamic datasource, provide context via --context argument.`);
243
+ }
244
+ const contextEntry = dsContext.getForDataSource(dataSourceName);
245
+ if (!contextEntry) {
246
+ throw new Error(`No context provided for dynamic datasource "${dataSourceName}"`);
247
+ }
248
+ try {
249
+ const dynamicDataSource = await modelManager.getDataSourceDynamic(dataSourceName, contextEntry);
250
+ this.logger.verboseLog(`Resolved dynamic datasource: ${dataSourceName} (lookupKey: ${contextEntry.lookupKey})`);
251
+ const releaseKey = contextEntry.lookupKey
252
+ ? `${dataSourceName}:${contextEntry.lookupKey}`
253
+ : undefined;
254
+ return { dataSource: dynamicDataSource, releaseKey };
255
+ }
256
+ catch (error) {
257
+ throw new Error(`Failed to resolve datasource "${dataSourceName}": ${error instanceof Error ? error.message : String(error)}`);
258
+ }
259
+ }
260
+ }
261
+ exports.MigrationManager = MigrationManager;
262
+ //# sourceMappingURL=migration-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration-manager.js","sourceRoot":"","sources":["../../src/manager/migration-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { DataSourceInterface } from "@datacapy/om/dist/data-source";
2
+ export interface MetaRecord {
3
+ _id?: string;
4
+ version: string;
5
+ description: string;
6
+ appliedAt: Date;
7
+ duration?: number;
8
+ }
9
+ export declare class MetaTable {
10
+ private dataSource;
11
+ private tableName;
12
+ constructor(dataSource: DataSourceInterface, tableName?: string);
13
+ initialize(): Promise<void>;
14
+ getCurrentVersion(): Promise<string>;
15
+ recordPatch(version: string, description: string, duration?: number): Promise<void>;
16
+ getAppliedPatches(): Promise<MetaRecord[]>;
17
+ isPatchApplied(version: string): Promise<boolean>;
18
+ getAppliedPatchCount(): Promise<number>;
19
+ deletePatchRecord(version: string): Promise<void>;
20
+ clearAll(): Promise<void>;
21
+ }
22
+ //# sourceMappingURL=meta-table.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meta-table.d.ts","sourceRoot":"","sources":["../../src/meta/meta-table.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAQpE,MAAM,WAAW,UAAU;IACzB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,IAAI,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAQD,qBAAa,SAAS;IACpB,OAAO,CAAC,UAAU,CAAsB;IACxC,OAAO,CAAC,SAAS,CAAS;gBAGxB,UAAU,EAAE,mBAAmB,EAC/B,SAAS,GAAE,MAAwB;IAU/B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IA0D3B,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC;IAkBpC,WAAW,CACf,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC;IAeV,iBAAiB,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAc1C,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAQjD,oBAAoB,IAAI,OAAO,CAAC,MAAM,CAAC;IAQvC,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQjD,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAGhC"}
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MetaTable = void 0;
4
+ const id_1 = require("@datacapy/id");
5
+ class MetaTable {
6
+ constructor(dataSource, tableName = "migrationMeta") {
7
+ this.dataSource = dataSource;
8
+ this.tableName = tableName;
9
+ }
10
+ async initialize() {
11
+ try {
12
+ await this.dataSource.count(this.tableName);
13
+ }
14
+ catch (error) {
15
+ const dummyRecord = {
16
+ _id: (0, id_1.genUniqueId)(),
17
+ version: "0000-00-00_0000",
18
+ description: "Initial meta table creation",
19
+ appliedAt: new Date(),
20
+ };
21
+ try {
22
+ await this.dataSource.insertOne(this.tableName, dummyRecord);
23
+ await this.dataSource.deleteOne(this.tableName, {
24
+ version: "0000-00-00_0000",
25
+ });
26
+ }
27
+ catch (insertError) {
28
+ try {
29
+ await this.dataSource.count(this.tableName);
30
+ }
31
+ catch {
32
+ throw new Error(`Failed to initialize meta table: ${insertError}`);
33
+ }
34
+ }
35
+ }
36
+ try {
37
+ await this.dataSource.createIndex(this.tableName, { version: 1 }, { name: "idx_migration_version", unique: true });
38
+ }
39
+ catch (error) {
40
+ }
41
+ try {
42
+ await this.dataSource.createIndex(this.tableName, { appliedAt: -1 }, { name: "idx_migration_appliedAt" });
43
+ }
44
+ catch (error) {
45
+ }
46
+ }
47
+ async getCurrentVersion() {
48
+ const records = (await this.dataSource.find(this.tableName, {}));
49
+ if (records.length === 0) {
50
+ return "0000-00-00_0000";
51
+ }
52
+ const sorted = records.sort((a, b) => b.version.localeCompare(a.version));
53
+ return sorted[0].version;
54
+ }
55
+ async recordPatch(version, description, duration) {
56
+ const record = {
57
+ _id: (0, id_1.genUniqueId)(),
58
+ version,
59
+ description,
60
+ appliedAt: new Date(),
61
+ duration,
62
+ };
63
+ await this.dataSource.insertOne(this.tableName, record);
64
+ }
65
+ async getAppliedPatches() {
66
+ const records = await this.dataSource.find(this.tableName, {}, {
67
+ sort: { appliedAt: 1 },
68
+ });
69
+ return records;
70
+ }
71
+ async isPatchApplied(version) {
72
+ const count = await this.dataSource.count(this.tableName, { version });
73
+ return count > 0;
74
+ }
75
+ async getAppliedPatchCount() {
76
+ return this.dataSource.count(this.tableName);
77
+ }
78
+ async deletePatchRecord(version) {
79
+ await this.dataSource.deleteOne(this.tableName, { version });
80
+ }
81
+ async clearAll() {
82
+ await this.dataSource.deleteMany(this.tableName, {});
83
+ }
84
+ }
85
+ exports.MetaTable = MetaTable;
86
+ //# sourceMappingURL=meta-table.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meta-table.js","sourceRoot":"","sources":["../../src/meta/meta-table.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { PatchFile } from "../interface/migration-result";
2
+ export declare class PatchScanner {
3
+ private patchDirectory;
4
+ constructor(patchDirectory: string);
5
+ scanPatches(): Promise<PatchFile[]>;
6
+ private loadPatchFile;
7
+ private validatePatch;
8
+ private getDirectories;
9
+ private getFiles;
10
+ }
11
+ //# sourceMappingURL=patch-scanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patch-scanner.d.ts","sourceRoot":"","sources":["../../src/scanner/patch-scanner.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAQ1D,qBAAa,YAAY;IACvB,OAAO,CAAC,cAAc,CAAS;gBAEnB,cAAc,EAAE,MAAM;IAU5B,WAAW,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YAoD3B,aAAa;IAmE3B,OAAO,CAAC,aAAa;IA6CrB,OAAO,CAAC,cAAc;IActB,OAAO,CAAC,QAAQ;CAUjB"}