@ftschopp/dynatable-migrations 1.0.0 ā 1.2.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.
- package/CHANGELOG.md +14 -0
- package/README.md +102 -134
- package/USAGE.md +199 -60
- package/dist/cli.js +7 -3
- package/dist/cli.js.map +1 -1
- package/dist/commands/down.d.ts +1 -1
- package/dist/commands/down.d.ts.map +1 -1
- package/dist/commands/down.js +5 -20
- package/dist/commands/down.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +2 -17
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/up.d.ts +1 -1
- package/dist/commands/up.d.ts.map +1 -1
- package/dist/commands/up.js +5 -20
- package/dist/commands/up.js.map +1 -1
- package/dist/core/client.d.ts +7 -0
- package/dist/core/client.d.ts.map +1 -0
- package/dist/core/client.js +25 -0
- package/dist/core/client.js.map +1 -0
- package/dist/core/loader.d.ts +8 -0
- package/dist/core/loader.d.ts.map +1 -1
- package/dist/core/loader.js +76 -43
- package/dist/core/loader.js.map +1 -1
- package/dist/core/runner.d.ts +6 -2
- package/dist/core/runner.d.ts.map +1 -1
- package/dist/core/runner.js +124 -67
- package/dist/core/runner.js.map +1 -1
- package/dist/core/tracker.d.ts +20 -1
- package/dist/core/tracker.d.ts.map +1 -1
- package/dist/core/tracker.js +273 -83
- package/dist/core/tracker.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/types/index.d.ts +10 -1
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +1 -3
- package/src/cli.ts +8 -3
- package/src/commands/down.ts +6 -22
- package/src/commands/status.ts +2 -19
- package/src/commands/up.ts +9 -22
- package/src/core/client.ts +24 -0
- package/src/core/loader.ts +88 -46
- package/src/core/runner.ts +151 -78
- package/src/core/tracker.ts +306 -94
- package/src/index.ts +2 -1
- package/src/types/index.ts +13 -1
package/dist/commands/up.js
CHANGED
|
@@ -1,29 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.runMigrations = runMigrations;
|
|
4
|
-
const client_dynamodb_1 = require("@aws-sdk/client-dynamodb");
|
|
5
|
-
const lib_dynamodb_1 = require("@aws-sdk/lib-dynamodb");
|
|
6
4
|
const runner_1 = require("../core/runner");
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
const
|
|
10
|
-
region: config.client.region,
|
|
11
|
-
endpoint: config.client.endpoint,
|
|
12
|
-
credentials: config.client.credentials,
|
|
13
|
-
});
|
|
14
|
-
const client = lib_dynamodb_1.DynamoDBDocumentClient.from(ddbClient, {
|
|
15
|
-
marshallOptions: {
|
|
16
|
-
removeUndefinedValues: true,
|
|
17
|
-
convertClassInstanceToMap: true,
|
|
18
|
-
},
|
|
19
|
-
unmarshallOptions: {
|
|
20
|
-
wrapNumbers: false,
|
|
21
|
-
},
|
|
22
|
-
});
|
|
5
|
+
const client_1 = require("../core/client");
|
|
6
|
+
async function runMigrations(config, limit, dryRun = false) {
|
|
7
|
+
const client = (0, client_1.createDynamoDBClient)(config);
|
|
23
8
|
const runner = new runner_1.MigrationRunner(client, config);
|
|
24
9
|
try {
|
|
25
|
-
const executed = await runner.up(limit);
|
|
26
|
-
if (executed.length > 0) {
|
|
10
|
+
const executed = await runner.up({ limit, dryRun });
|
|
11
|
+
if (!dryRun && executed.length > 0) {
|
|
27
12
|
console.log(`\nš Successfully applied ${executed.length} migration(s)`);
|
|
28
13
|
const currentVersion = await runner.getCurrentVersion();
|
|
29
14
|
console.log(`š Current version: ${currentVersion}\n`);
|
package/dist/commands/up.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"up.js","sourceRoot":"","sources":["../../src/commands/up.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"up.js","sourceRoot":"","sources":["../../src/commands/up.ts"],"names":[],"mappings":";;AAIA,sCAqBC;AAzBD,2CAAiD;AACjD,2CAAsD;AAG/C,KAAK,UAAU,aAAa,CACjC,MAAuB,EACvB,KAAc,EACd,SAAkB,KAAK;IAEvB,MAAM,MAAM,GAAG,IAAA,6BAAoB,EAAC,MAAM,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,IAAI,wBAAe,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEnD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAEpD,IAAI,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,6BAA6B,QAAQ,CAAC,MAAM,eAAe,CAAC,CAAC;YAEzE,MAAM,cAAc,GAAG,MAAM,MAAM,CAAC,iBAAiB,EAAE,CAAC;YACxD,OAAO,CAAC,GAAG,CAAC,uBAAuB,cAAc,IAAI,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,yBAAyB,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;QAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { DynamoDBDocumentClient } from '@aws-sdk/lib-dynamodb';
|
|
2
|
+
import { MigrationConfig } from '../types';
|
|
3
|
+
/**
|
|
4
|
+
* Create a DynamoDB Document Client from config
|
|
5
|
+
*/
|
|
6
|
+
export declare function createDynamoDBClient(config: MigrationConfig): DynamoDBDocumentClient;
|
|
7
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/core/client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3C;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,eAAe,GAAG,sBAAsB,CAgBpF"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createDynamoDBClient = createDynamoDBClient;
|
|
4
|
+
const client_dynamodb_1 = require("@aws-sdk/client-dynamodb");
|
|
5
|
+
const lib_dynamodb_1 = require("@aws-sdk/lib-dynamodb");
|
|
6
|
+
/**
|
|
7
|
+
* Create a DynamoDB Document Client from config
|
|
8
|
+
*/
|
|
9
|
+
function createDynamoDBClient(config) {
|
|
10
|
+
const ddbClient = new client_dynamodb_1.DynamoDBClient({
|
|
11
|
+
region: config.client.region,
|
|
12
|
+
endpoint: config.client.endpoint,
|
|
13
|
+
credentials: config.client.credentials,
|
|
14
|
+
});
|
|
15
|
+
return lib_dynamodb_1.DynamoDBDocumentClient.from(ddbClient, {
|
|
16
|
+
marshallOptions: {
|
|
17
|
+
removeUndefinedValues: true,
|
|
18
|
+
convertClassInstanceToMap: true,
|
|
19
|
+
},
|
|
20
|
+
unmarshallOptions: {
|
|
21
|
+
wrapNumbers: false,
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/core/client.ts"],"names":[],"mappings":";;AAOA,oDAgBC;AAvBD,8DAA0D;AAC1D,wDAA+D;AAG/D;;GAEG;AACH,SAAgB,oBAAoB,CAAC,MAAuB;IAC1D,MAAM,SAAS,GAAG,IAAI,gCAAc,CAAC;QACnC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM;QAC5B,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ;QAChC,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,WAAW;KACvC,CAAC,CAAC;IAEH,OAAO,qCAAsB,CAAC,IAAI,CAAC,SAAS,EAAE;QAC5C,eAAe,EAAE;YACf,qBAAqB,EAAE,IAAI;YAC3B,yBAAyB,EAAE,IAAI;SAChC;QACD,iBAAiB,EAAE;YACjB,WAAW,EAAE,KAAK;SACnB;KACF,CAAC,CAAC;AACL,CAAC"}
|
package/dist/core/loader.d.ts
CHANGED
|
@@ -5,6 +5,10 @@ import { MigrationFile } from '../types';
|
|
|
5
5
|
export declare class MigrationLoader {
|
|
6
6
|
private migrationsDir;
|
|
7
7
|
constructor(migrationsDir: string);
|
|
8
|
+
/**
|
|
9
|
+
* Calculate checksum of a file
|
|
10
|
+
*/
|
|
11
|
+
calculateChecksum(filePath: string): string;
|
|
8
12
|
/**
|
|
9
13
|
* Load all migration files
|
|
10
14
|
*/
|
|
@@ -13,6 +17,10 @@ export declare class MigrationLoader {
|
|
|
13
17
|
* Load single migration file
|
|
14
18
|
*/
|
|
15
19
|
private loadMigration;
|
|
20
|
+
/**
|
|
21
|
+
* Register ts-node for TypeScript file loading
|
|
22
|
+
*/
|
|
23
|
+
private registerTsNode;
|
|
16
24
|
/**
|
|
17
25
|
* Validate migration file name format
|
|
18
26
|
* Expected: 1.0.0_migration_name.ts (semver format)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/core/loader.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/core/loader.ts"],"names":[],"mappings":"AAGA,OAAO,EAAa,aAAa,EAAE,MAAM,UAAU,CAAC;AAEpD;;GAEG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,aAAa,CAAS;gBAElB,aAAa,EAAE,MAAM;IAIjC;;OAEG;IACH,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAK3C;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAkChD;;OAEG;YACW,aAAa;IA6D3B;;OAEG;IACH,OAAO,CAAC,cAAc;IA8BtB;;;OAGG;IACH,OAAO,CAAC,wBAAwB;IAKhC;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAkB9B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAkBzB;;OAEG;IACG,oBAAoB,CAAC,eAAe,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAK/E;;OAEG;IACG,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAKlE;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC;IA6BvC;;;OAGG;IACH,OAAO,CAAC,aAAa;CActB"}
|
package/dist/core/loader.js
CHANGED
|
@@ -36,6 +36,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
36
36
|
exports.MigrationLoader = void 0;
|
|
37
37
|
const fs = __importStar(require("fs"));
|
|
38
38
|
const path = __importStar(require("path"));
|
|
39
|
+
const crypto = __importStar(require("crypto"));
|
|
39
40
|
/**
|
|
40
41
|
* Load all migration files from directory
|
|
41
42
|
*/
|
|
@@ -43,6 +44,13 @@ class MigrationLoader {
|
|
|
43
44
|
constructor(migrationsDir) {
|
|
44
45
|
this.migrationsDir = migrationsDir;
|
|
45
46
|
}
|
|
47
|
+
/**
|
|
48
|
+
* Calculate checksum of a file
|
|
49
|
+
*/
|
|
50
|
+
calculateChecksum(filePath) {
|
|
51
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
52
|
+
return crypto.createHash('md5').update(content).digest('hex');
|
|
53
|
+
}
|
|
46
54
|
/**
|
|
47
55
|
* Load all migration files
|
|
48
56
|
*/
|
|
@@ -75,57 +83,82 @@ class MigrationLoader {
|
|
|
75
83
|
* Load single migration file
|
|
76
84
|
*/
|
|
77
85
|
async loadMigration(filePath) {
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
skipProject: true, // Don't use project tsconfig
|
|
91
|
-
compilerOptions: {
|
|
92
|
-
module: 'commonjs',
|
|
93
|
-
target: 'ES2020',
|
|
94
|
-
esModuleInterop: true,
|
|
95
|
-
moduleResolution: 'node',
|
|
96
|
-
},
|
|
97
|
-
});
|
|
98
|
-
}
|
|
99
|
-
catch {
|
|
100
|
-
// ts-node might already be registered
|
|
101
|
-
}
|
|
102
|
-
// Clear require cache to reload file
|
|
103
|
-
delete require.cache[absolutePath];
|
|
86
|
+
// Convert to absolute path
|
|
87
|
+
const absolutePath = path.isAbsolute(filePath)
|
|
88
|
+
? filePath
|
|
89
|
+
: path.resolve(process.cwd(), filePath);
|
|
90
|
+
let module;
|
|
91
|
+
// For TypeScript files, use require (ts-node must be registered)
|
|
92
|
+
if (absolutePath.endsWith('.ts')) {
|
|
93
|
+
// Register ts-node if not already registered
|
|
94
|
+
this.registerTsNode();
|
|
95
|
+
// Clear require cache to reload file
|
|
96
|
+
delete require.cache[absolutePath];
|
|
97
|
+
try {
|
|
104
98
|
module = require(absolutePath);
|
|
105
99
|
}
|
|
106
|
-
|
|
107
|
-
|
|
100
|
+
catch (error) {
|
|
101
|
+
throw new Error(`Failed to load TypeScript migration ${filePath}: ${error.message}. ` +
|
|
102
|
+
`Ensure ts-node is installed and the file has valid TypeScript syntax.`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
// For JavaScript files, use dynamic import
|
|
107
|
+
try {
|
|
108
108
|
const fileUrl = `file://${absolutePath}`;
|
|
109
109
|
module = await Promise.resolve(`${fileUrl}`).then(s => __importStar(require(s)));
|
|
110
110
|
}
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
console.warn(`Warning: No migration export found in ${filePath}`);
|
|
114
|
-
return null;
|
|
111
|
+
catch (error) {
|
|
112
|
+
throw new Error(`Failed to load JavaScript migration ${filePath}: ${error.message}`);
|
|
115
113
|
}
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
return
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
114
|
+
}
|
|
115
|
+
const migration = module.migration || module.default;
|
|
116
|
+
if (!migration) {
|
|
117
|
+
console.warn(`Warning: No migration export found in ${filePath}`);
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
// Validate migration structure
|
|
121
|
+
this.validateMigration(migration, filePath);
|
|
122
|
+
const fileName = path.basename(filePath);
|
|
123
|
+
const { version, name } = this.parseMigrationFileName(fileName);
|
|
124
|
+
// Calculate checksum
|
|
125
|
+
const checksum = this.calculateChecksum(absolutePath);
|
|
126
|
+
return {
|
|
127
|
+
version,
|
|
128
|
+
name,
|
|
129
|
+
filePath,
|
|
130
|
+
migration,
|
|
131
|
+
checksum,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Register ts-node for TypeScript file loading
|
|
136
|
+
*/
|
|
137
|
+
registerTsNode() {
|
|
138
|
+
try {
|
|
139
|
+
// Check if ts-node is already registered
|
|
140
|
+
const tsNodeSymbol = Symbol.for('ts-node.register.instance');
|
|
141
|
+
if (process[tsNodeSymbol]) {
|
|
142
|
+
return; // Already registered
|
|
143
|
+
}
|
|
144
|
+
require('ts-node').register({
|
|
145
|
+
transpileOnly: true,
|
|
146
|
+
skipProject: true, // Don't use project tsconfig
|
|
147
|
+
compilerOptions: {
|
|
148
|
+
module: 'commonjs',
|
|
149
|
+
target: 'ES2020',
|
|
150
|
+
esModuleInterop: true,
|
|
151
|
+
moduleResolution: 'node',
|
|
152
|
+
},
|
|
153
|
+
});
|
|
126
154
|
}
|
|
127
155
|
catch (error) {
|
|
128
|
-
|
|
156
|
+
if (error.code === 'MODULE_NOT_FOUND') {
|
|
157
|
+
throw new Error('ts-node is required to load TypeScript migrations. ' +
|
|
158
|
+
'Install it with: npm install ts-node');
|
|
159
|
+
}
|
|
160
|
+
// Other errors might mean ts-node is already registered differently
|
|
161
|
+
console.warn(`Warning: Could not register ts-node: ${error.message}`);
|
|
129
162
|
}
|
|
130
163
|
}
|
|
131
164
|
/**
|
package/dist/core/loader.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/core/loader.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAyB;AACzB,2CAA6B;
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/core/loader.ts"],"names":[],"mappings":"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"}
|
package/dist/core/runner.d.ts
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import { DynamoDBDocumentClient } from '@aws-sdk/lib-dynamodb';
|
|
2
2
|
import { MigrationConfig, MigrationFile, MigrationStatus } from '../types';
|
|
3
|
+
export interface RunOptions {
|
|
4
|
+
limit?: number;
|
|
5
|
+
dryRun?: boolean;
|
|
6
|
+
}
|
|
3
7
|
export declare class MigrationRunner {
|
|
4
8
|
private client;
|
|
5
9
|
private config;
|
|
@@ -13,11 +17,11 @@ export declare class MigrationRunner {
|
|
|
13
17
|
/**
|
|
14
18
|
* Run all pending migrations
|
|
15
19
|
*/
|
|
16
|
-
up(
|
|
20
|
+
up(options?: RunOptions): Promise<MigrationFile[]>;
|
|
17
21
|
/**
|
|
18
22
|
* Rollback last migration
|
|
19
23
|
*/
|
|
20
|
-
down(steps?: number): Promise<MigrationFile[]>;
|
|
24
|
+
down(steps?: number, dryRun?: boolean): Promise<MigrationFile[]>;
|
|
21
25
|
/**
|
|
22
26
|
* Get migration status
|
|
23
27
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/core/runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/core/runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAa/D,OAAO,EAAE,eAAe,EAAoB,aAAa,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAI7F,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,OAAO,CAA2B;IAC1C,OAAO,CAAC,MAAM,CAAkB;gBAEpB,MAAM,EAAE,sBAAsB,EAAE,MAAM,EAAE,eAAe;IAOnE;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAIjC;;OAEG;IACG,EAAE,CAAC,OAAO,GAAE,UAAe,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAgG5D;;OAEG;IACG,IAAI,CAAC,KAAK,GAAE,MAAU,EAAE,MAAM,GAAE,OAAe,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAwEhF;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;IA6B1C;;OAEG;IACG,iBAAiB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAKjD;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAa5B;;OAEG;IACH,OAAO,CAAC,aAAa;CAoBtB"}
|
package/dist/core/runner.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.MigrationRunner = void 0;
|
|
4
|
+
const lib_dynamodb_1 = require("@aws-sdk/lib-dynamodb");
|
|
4
5
|
const tracker_1 = require("./tracker");
|
|
5
6
|
const loader_1 = require("./loader");
|
|
6
7
|
class MigrationRunner {
|
|
@@ -19,76 +20,134 @@ class MigrationRunner {
|
|
|
19
20
|
/**
|
|
20
21
|
* Run all pending migrations
|
|
21
22
|
*/
|
|
22
|
-
async up(
|
|
23
|
+
async up(options = {}) {
|
|
24
|
+
const { limit, dryRun = false } = options;
|
|
23
25
|
await this.initialize();
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
pendingMigrations = pendingMigrations.slice(0, limit);
|
|
32
|
-
}
|
|
33
|
-
if (pendingMigrations.length === 0) {
|
|
34
|
-
console.log('ā
No pending migrations');
|
|
35
|
-
return [];
|
|
26
|
+
// Acquire lock unless dry run
|
|
27
|
+
if (!dryRun) {
|
|
28
|
+
const lockAcquired = await this.tracker.acquireLock();
|
|
29
|
+
if (!lockAcquired) {
|
|
30
|
+
throw new Error('Could not acquire migration lock. Another migration may be in progress. ' +
|
|
31
|
+
'If you believe this is an error, wait a few minutes and try again.');
|
|
32
|
+
}
|
|
36
33
|
}
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
await this.
|
|
45
|
-
|
|
46
|
-
|
|
34
|
+
try {
|
|
35
|
+
const appliedMigrations = await this.tracker.getAppliedMigrations();
|
|
36
|
+
const appliedVersions = appliedMigrations
|
|
37
|
+
.filter((m) => m.status === 'applied')
|
|
38
|
+
.map((m) => m.version);
|
|
39
|
+
// Check for checksum mismatches on applied migrations
|
|
40
|
+
for (const applied of appliedMigrations.filter((m) => m.status === 'applied')) {
|
|
41
|
+
const file = await this.loader.getMigration(applied.version);
|
|
42
|
+
if (file && applied.checksum && file.checksum !== applied.checksum) {
|
|
43
|
+
console.warn(`ā ļø Warning: Migration ${applied.version} has been modified since it was applied. ` +
|
|
44
|
+
`Original checksum: ${applied.checksum}, Current: ${file.checksum}`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
let pendingMigrations = await this.loader.getPendingMigrations(appliedVersions);
|
|
48
|
+
// Apply limit if specified
|
|
49
|
+
if (limit) {
|
|
50
|
+
pendingMigrations = pendingMigrations.slice(0, limit);
|
|
47
51
|
}
|
|
48
|
-
|
|
49
|
-
console.
|
|
50
|
-
|
|
51
|
-
|
|
52
|
+
if (pendingMigrations.length === 0) {
|
|
53
|
+
console.log('ā
No pending migrations');
|
|
54
|
+
return [];
|
|
55
|
+
}
|
|
56
|
+
if (dryRun) {
|
|
57
|
+
console.log(`\nš DRY RUN - Would apply ${pendingMigrations.length} migration(s):\n`);
|
|
58
|
+
for (const migrationFile of pendingMigrations) {
|
|
59
|
+
console.log(` ${migrationFile.version}: ${migrationFile.name}`);
|
|
60
|
+
if (migrationFile.migration.description) {
|
|
61
|
+
console.log(` ${migrationFile.migration.description}`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
console.log('\nNo changes were made.\n');
|
|
65
|
+
return pendingMigrations;
|
|
66
|
+
}
|
|
67
|
+
console.log(`\nš¦ Found ${pendingMigrations.length} pending migration(s)\n`);
|
|
68
|
+
const executed = [];
|
|
69
|
+
for (const migrationFile of pendingMigrations) {
|
|
70
|
+
try {
|
|
71
|
+
console.log(`ā¬ļø Applying ${migrationFile.version}: ${migrationFile.name}`);
|
|
72
|
+
const context = this.createContext();
|
|
73
|
+
await migrationFile.migration.up(context);
|
|
74
|
+
await this.tracker.markAsApplied(migrationFile.version, migrationFile.name, migrationFile.migration.schema, undefined, migrationFile.checksum);
|
|
75
|
+
console.log(`ā
Applied ${migrationFile.version}: ${migrationFile.name}\n`);
|
|
76
|
+
executed.push(migrationFile);
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
console.error(`ā Failed to apply ${migrationFile.version}: ${error.message}\n`);
|
|
80
|
+
await this.tracker.markAsFailed(migrationFile.version, error.message);
|
|
81
|
+
throw new Error(`Migration ${migrationFile.version} failed: ${error.message}`);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return executed;
|
|
85
|
+
}
|
|
86
|
+
finally {
|
|
87
|
+
// Always release lock
|
|
88
|
+
if (!dryRun) {
|
|
89
|
+
await this.tracker.releaseLock();
|
|
52
90
|
}
|
|
53
91
|
}
|
|
54
|
-
return executed;
|
|
55
92
|
}
|
|
56
93
|
/**
|
|
57
94
|
* Rollback last migration
|
|
58
95
|
*/
|
|
59
|
-
async down(steps = 1) {
|
|
96
|
+
async down(steps = 1, dryRun = false) {
|
|
60
97
|
await this.initialize();
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
console.log('ā
No migrations to rollback');
|
|
68
|
-
return [];
|
|
98
|
+
// Acquire lock unless dry run
|
|
99
|
+
if (!dryRun) {
|
|
100
|
+
const lockAcquired = await this.tracker.acquireLock();
|
|
101
|
+
if (!lockAcquired) {
|
|
102
|
+
throw new Error('Could not acquire migration lock. Another migration may be in progress.');
|
|
103
|
+
}
|
|
69
104
|
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
105
|
+
try {
|
|
106
|
+
const appliedMigrations = await this.tracker.getAppliedMigrations();
|
|
107
|
+
const applied = appliedMigrations
|
|
108
|
+
.filter((m) => m.status === 'applied')
|
|
109
|
+
.sort((a, b) => b.version.localeCompare(a.version))
|
|
110
|
+
.slice(0, steps);
|
|
111
|
+
if (applied.length === 0) {
|
|
112
|
+
console.log('ā
No migrations to rollback');
|
|
113
|
+
return [];
|
|
114
|
+
}
|
|
115
|
+
if (dryRun) {
|
|
116
|
+
console.log(`\nš DRY RUN - Would rollback ${applied.length} migration(s):\n`);
|
|
117
|
+
for (const record of applied) {
|
|
118
|
+
console.log(` ${record.version}: ${record.name}`);
|
|
77
119
|
}
|
|
78
|
-
console.log(
|
|
79
|
-
|
|
80
|
-
await migrationFile.migration.down(context);
|
|
81
|
-
await this.tracker.markAsRolledBack(migrationFile.version);
|
|
82
|
-
console.log(`ā
Rolled back ${migrationFile.version}: ${migrationFile.name}\n`);
|
|
83
|
-
rolledBack.push(migrationFile);
|
|
120
|
+
console.log('\nNo changes were made.\n');
|
|
121
|
+
return [];
|
|
84
122
|
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
123
|
+
console.log(`\nš¦ Rolling back ${applied.length} migration(s)\n`);
|
|
124
|
+
const rolledBack = [];
|
|
125
|
+
for (const record of applied) {
|
|
126
|
+
try {
|
|
127
|
+
const migrationFile = await this.loader.getMigration(record.version);
|
|
128
|
+
if (!migrationFile) {
|
|
129
|
+
throw new Error(`Migration file not found for version ${record.version}`);
|
|
130
|
+
}
|
|
131
|
+
console.log(`ā¬ļø Rolling back ${migrationFile.version}: ${migrationFile.name}`);
|
|
132
|
+
const context = this.createContext();
|
|
133
|
+
await migrationFile.migration.down(context);
|
|
134
|
+
await this.tracker.markAsRolledBack(migrationFile.version);
|
|
135
|
+
console.log(`ā
Rolled back ${migrationFile.version}: ${migrationFile.name}\n`);
|
|
136
|
+
rolledBack.push(migrationFile);
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
console.error(`ā Failed to rollback ${record.version}: ${error.message}\n`);
|
|
140
|
+
await this.tracker.markAsFailed(record.version, error.message);
|
|
141
|
+
throw new Error(`Rollback of ${record.version} failed: ${error.message}`);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return rolledBack;
|
|
145
|
+
}
|
|
146
|
+
finally {
|
|
147
|
+
if (!dryRun) {
|
|
148
|
+
await this.tracker.releaseLock();
|
|
89
149
|
}
|
|
90
150
|
}
|
|
91
|
-
return rolledBack;
|
|
92
151
|
}
|
|
93
152
|
/**
|
|
94
153
|
* Get migration status
|
|
@@ -140,24 +199,22 @@ class MigrationRunner {
|
|
|
140
199
|
* Create migration context
|
|
141
200
|
*/
|
|
142
201
|
createContext() {
|
|
143
|
-
// Import DynamoDB commands
|
|
144
|
-
const { ScanCommand, QueryCommand, GetCommand, PutCommand, UpdateCommand, DeleteCommand, BatchGetCommand, BatchWriteCommand, TransactWriteCommand, TransactGetCommand, } = require('@aws-sdk/lib-dynamodb');
|
|
145
202
|
return {
|
|
146
203
|
client: this.client,
|
|
147
204
|
tableName: this.config.tableName,
|
|
148
205
|
tracker: this.tracker,
|
|
149
206
|
config: this.config,
|
|
150
207
|
dynamodb: {
|
|
151
|
-
ScanCommand,
|
|
152
|
-
QueryCommand,
|
|
153
|
-
GetCommand,
|
|
154
|
-
PutCommand,
|
|
155
|
-
UpdateCommand,
|
|
156
|
-
DeleteCommand,
|
|
157
|
-
BatchGetCommand,
|
|
158
|
-
BatchWriteCommand,
|
|
159
|
-
TransactWriteCommand,
|
|
160
|
-
TransactGetCommand,
|
|
208
|
+
ScanCommand: lib_dynamodb_1.ScanCommand,
|
|
209
|
+
QueryCommand: lib_dynamodb_1.QueryCommand,
|
|
210
|
+
GetCommand: lib_dynamodb_1.GetCommand,
|
|
211
|
+
PutCommand: lib_dynamodb_1.PutCommand,
|
|
212
|
+
UpdateCommand: lib_dynamodb_1.UpdateCommand,
|
|
213
|
+
DeleteCommand: lib_dynamodb_1.DeleteCommand,
|
|
214
|
+
BatchGetCommand: lib_dynamodb_1.BatchGetCommand,
|
|
215
|
+
BatchWriteCommand: lib_dynamodb_1.BatchWriteCommand,
|
|
216
|
+
TransactWriteCommand: lib_dynamodb_1.TransactWriteCommand,
|
|
217
|
+
TransactGetCommand: lib_dynamodb_1.TransactGetCommand,
|
|
161
218
|
},
|
|
162
219
|
};
|
|
163
220
|
}
|
package/dist/core/runner.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/core/runner.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/core/runner.ts"],"names":[],"mappings":"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"}
|
package/dist/core/tracker.d.ts
CHANGED
|
@@ -5,11 +5,30 @@ export declare class DynamoDBMigrationTracker implements MigrationTracker {
|
|
|
5
5
|
private tableName;
|
|
6
6
|
private trackingPrefix;
|
|
7
7
|
private gsi1Name;
|
|
8
|
+
private lockId;
|
|
8
9
|
constructor(client: DynamoDBDocumentClient, config: MigrationConfig);
|
|
9
10
|
initialize(): Promise<void>;
|
|
11
|
+
/**
|
|
12
|
+
* Acquire a distributed lock to prevent concurrent migrations
|
|
13
|
+
*/
|
|
14
|
+
acquireLock(): Promise<boolean>;
|
|
15
|
+
/**
|
|
16
|
+
* Release the distributed lock
|
|
17
|
+
*/
|
|
18
|
+
releaseLock(): Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* Get all applied migrations with pagination support
|
|
21
|
+
*/
|
|
10
22
|
getAppliedMigrations(): Promise<MigrationRecord[]>;
|
|
11
23
|
getCurrentVersion(): Promise<string | null>;
|
|
12
|
-
|
|
24
|
+
/**
|
|
25
|
+
* Mark migration as applied using TransactWrite for atomicity
|
|
26
|
+
* Handles both new migrations and re-applying rolled back migrations
|
|
27
|
+
*/
|
|
28
|
+
markAsApplied(version: string, name: string, schemaDefinition?: Record<string, any>, schemaChanges?: SchemaChange[], checksum?: string): Promise<void>;
|
|
29
|
+
/**
|
|
30
|
+
* Mark migration as rolled back using TransactWrite for atomicity
|
|
31
|
+
*/
|
|
13
32
|
markAsRolledBack(version: string): Promise<void>;
|
|
14
33
|
markAsFailed(version: string, error: string): Promise<void>;
|
|
15
34
|
recordSchemaChange(change: SchemaChange): Promise<void>;
|