@ftschopp/dynatable-migrations 1.0.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/.gitkeep +0 -0
- package/CHANGELOG.md +13 -0
- package/README.md +421 -0
- package/USAGE.md +557 -0
- package/bin/dynatable-migrate.js +30 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +104 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/create.d.ts +2 -0
- package/dist/commands/create.d.ts.map +1 -0
- package/dist/commands/create.js +123 -0
- package/dist/commands/create.js.map +1 -0
- package/dist/commands/down.d.ts +3 -0
- package/dist/commands/down.d.ts.map +1 -0
- package/dist/commands/down.js +37 -0
- package/dist/commands/down.js.map +1 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +70 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/status.d.ts +3 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +84 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/up.d.ts +3 -0
- package/dist/commands/up.d.ts.map +1 -0
- package/dist/commands/up.js +37 -0
- package/dist/commands/up.js.map +1 -0
- package/dist/core/config.d.ts +29 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +160 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/loader.d.ts +47 -0
- package/dist/core/loader.d.ts.map +1 -0
- package/dist/core/loader.js +226 -0
- package/dist/core/loader.js.map +1 -0
- package/dist/core/runner.d.ts +38 -0
- package/dist/core/runner.d.ts.map +1 -0
- package/dist/core/runner.js +166 -0
- package/dist/core/runner.js.map +1 -0
- package/dist/core/tracker.d.ts +19 -0
- package/dist/core/tracker.d.ts.map +1 -0
- package/dist/core/tracker.js +172 -0
- package/dist/core/tracker.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +48 -0
- package/dist/index.js.map +1 -0
- package/dist/templates/migration.d.ts +5 -0
- package/dist/templates/migration.d.ts.map +1 -0
- package/dist/templates/migration.js +96 -0
- package/dist/templates/migration.js.map +1 -0
- package/dist/types/index.d.ts +159 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/migrations/.gitkeep +0 -0
- package/package.json +43 -0
- package/src/cli.ts +106 -0
- package/src/commands/create.ts +110 -0
- package/src/commands/down.ts +42 -0
- package/src/commands/init.ts +37 -0
- package/src/commands/status.ts +92 -0
- package/src/commands/up.ts +39 -0
- package/src/core/config.ts +140 -0
- package/src/core/loader.ts +233 -0
- package/src/core/runner.ts +223 -0
- package/src/core/tracker.ts +219 -0
- package/src/index.ts +23 -0
- package/src/templates/migration.ts +92 -0
- package/src/types/index.ts +196 -0
- package/tsconfig.json +19 -0
|
@@ -0,0 +1,123 @@
|
|
|
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.createMigration = createMigration;
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
const loader_1 = require("../core/loader");
|
|
40
|
+
const migration_1 = require("../templates/migration");
|
|
41
|
+
/**
|
|
42
|
+
* Get next version based on bump type
|
|
43
|
+
*/
|
|
44
|
+
async function getNextVersion(loader, bumpType) {
|
|
45
|
+
const migrations = await loader['loadMigrations']();
|
|
46
|
+
if (migrations.length === 0) {
|
|
47
|
+
return '0.1.0';
|
|
48
|
+
}
|
|
49
|
+
const lastMigration = migrations[migrations.length - 1];
|
|
50
|
+
if (!lastMigration) {
|
|
51
|
+
return '0.1.0';
|
|
52
|
+
}
|
|
53
|
+
const lastVersion = lastMigration.version;
|
|
54
|
+
const parts = lastVersion.split('.');
|
|
55
|
+
if (parts.length !== 3 || !parts[0] || !parts[1] || !parts[2]) {
|
|
56
|
+
return '0.1.0';
|
|
57
|
+
}
|
|
58
|
+
const major = parseInt(parts[0], 10);
|
|
59
|
+
const minor = parseInt(parts[1], 10);
|
|
60
|
+
const patch = parseInt(parts[2], 10);
|
|
61
|
+
switch (bumpType) {
|
|
62
|
+
case 'major':
|
|
63
|
+
return `${major + 1}.0.0`;
|
|
64
|
+
case 'minor':
|
|
65
|
+
return `${major}.${minor + 1}.0`;
|
|
66
|
+
case 'patch':
|
|
67
|
+
return `${major}.${minor}.${patch + 1}`;
|
|
68
|
+
default:
|
|
69
|
+
return `${major}.${minor}.${patch + 1}`;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
async function createMigration(name, migrationsDir = './migrations', bumpType, explicitVersion) {
|
|
73
|
+
// Ensure migrations directory exists
|
|
74
|
+
if (!fs.existsSync(migrationsDir)) {
|
|
75
|
+
fs.mkdirSync(migrationsDir, { recursive: true });
|
|
76
|
+
console.log(`📁 Created migrations directory: ${migrationsDir}`);
|
|
77
|
+
}
|
|
78
|
+
// Generate version
|
|
79
|
+
const loader = new loader_1.MigrationLoader(migrationsDir);
|
|
80
|
+
let version;
|
|
81
|
+
if (explicitVersion) {
|
|
82
|
+
// Validate explicit version is semver
|
|
83
|
+
if (!/^\d+\.\d+\.\d+$/.test(explicitVersion)) {
|
|
84
|
+
throw new Error(`Invalid version format: ${explicitVersion}. Expected semver format (e.g., 1.0.0)`);
|
|
85
|
+
}
|
|
86
|
+
version = explicitVersion;
|
|
87
|
+
}
|
|
88
|
+
else if (bumpType) {
|
|
89
|
+
// Validate bump type
|
|
90
|
+
const validTypes = ['major', 'minor', 'patch'];
|
|
91
|
+
if (!validTypes.includes(bumpType)) {
|
|
92
|
+
throw new Error(`Invalid bump type: ${bumpType}. Expected: major, minor, or patch`);
|
|
93
|
+
}
|
|
94
|
+
version = await getNextVersion(loader, bumpType);
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
// Default: increment patch
|
|
98
|
+
version = await getNextVersion(loader, 'patch');
|
|
99
|
+
}
|
|
100
|
+
// Sanitize name (replace spaces and special chars with underscores)
|
|
101
|
+
const sanitizedName = name.replace(/[^a-zA-Z0-9]/g, '_').toLowerCase();
|
|
102
|
+
// Generate file name
|
|
103
|
+
const fileName = `${version}_${sanitizedName}.ts`;
|
|
104
|
+
const filePath = path.join(migrationsDir, fileName);
|
|
105
|
+
// Check if file already exists
|
|
106
|
+
if (fs.existsSync(filePath)) {
|
|
107
|
+
throw new Error(`Migration file already exists: ${filePath}`);
|
|
108
|
+
}
|
|
109
|
+
// Generate migration content
|
|
110
|
+
const content = (0, migration_1.generateMigrationTemplate)(version, sanitizedName);
|
|
111
|
+
// Write file
|
|
112
|
+
fs.writeFileSync(filePath, content, 'utf-8');
|
|
113
|
+
// Determine version type for informational message
|
|
114
|
+
const versionType = bumpType ? bumpType.toUpperCase() : explicitVersion ? 'EXPLICIT' : 'PATCH';
|
|
115
|
+
console.log(`\n✅ Created migration: ${fileName}`);
|
|
116
|
+
console.log(` Path: ${filePath}`);
|
|
117
|
+
console.log(` Version: ${version} (${versionType})\n`);
|
|
118
|
+
console.log(`Next steps:`);
|
|
119
|
+
console.log(` 1. Edit ${fileName}`);
|
|
120
|
+
console.log(` 2. Implement up() and down() functions`);
|
|
121
|
+
console.log(` 3. Run: dynatable-migrate up\n`);
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=create.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"down.d.ts","sourceRoot":"","sources":["../../src/commands/down.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3C,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,eAAe,EACvB,KAAK,GAAE,MAAU,GAChB,OAAO,CAAC,IAAI,CAAC,CAiCf"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.rollbackMigrations = rollbackMigrations;
|
|
4
|
+
const client_dynamodb_1 = require("@aws-sdk/client-dynamodb");
|
|
5
|
+
const lib_dynamodb_1 = require("@aws-sdk/lib-dynamodb");
|
|
6
|
+
const runner_1 = require("../core/runner");
|
|
7
|
+
async function rollbackMigrations(config, steps = 1) {
|
|
8
|
+
// Create DynamoDB client
|
|
9
|
+
const ddbClient = new client_dynamodb_1.DynamoDBClient({
|
|
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
|
+
});
|
|
23
|
+
const runner = new runner_1.MigrationRunner(client, config);
|
|
24
|
+
try {
|
|
25
|
+
const rolledBack = await runner.down(steps);
|
|
26
|
+
if (rolledBack.length > 0) {
|
|
27
|
+
console.log(`\n🎉 Successfully rolled back ${rolledBack.length} migration(s)`);
|
|
28
|
+
const currentVersion = await runner.getCurrentVersion();
|
|
29
|
+
console.log(`📌 Current version: ${currentVersion}\n`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
console.error(`\n❌ Rollback failed: ${error.message}\n`);
|
|
34
|
+
process.exit(1);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=down.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"down.js","sourceRoot":"","sources":["../../src/commands/down.ts"],"names":[],"mappings":";;AAKA,gDAoCC;AAzCD,8DAA0D;AAC1D,wDAA+D;AAC/D,2CAAiD;AAG1C,KAAK,UAAU,kBAAkB,CACtC,MAAuB,EACvB,QAAgB,CAAC;IAEjB,yBAAyB;IACzB,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,MAAM,MAAM,GAAG,qCAAsB,CAAC,IAAI,CAAC,SAAS,EAAE;QACpD,eAAe,EAAE;YACf,qBAAqB,EAAE,IAAI;YAC3B,yBAAyB,EAAE,IAAI;SAChC;QACD,iBAAiB,EAAE;YACjB,WAAW,EAAE,KAAK;SACnB;KACF,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,IAAI,wBAAe,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEnD,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAE5C,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,iCAAiC,UAAU,CAAC,MAAM,eAAe,CAAC,CAAC;YAE/E,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,wBAAwB,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;QACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAIA,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAgCjD"}
|
|
@@ -0,0 +1,70 @@
|
|
|
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.initProject = initProject;
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
const config_1 = require("../core/config");
|
|
40
|
+
async function initProject() {
|
|
41
|
+
const cwd = process.cwd();
|
|
42
|
+
console.log('\n🚀 Initializing DynamoDB migrations\n');
|
|
43
|
+
// Create migrations directory
|
|
44
|
+
const migrationsDir = path.join(cwd, 'migrations');
|
|
45
|
+
if (!fs.existsSync(migrationsDir)) {
|
|
46
|
+
fs.mkdirSync(migrationsDir, { recursive: true });
|
|
47
|
+
console.log(`✅ Created: ${migrationsDir}/`);
|
|
48
|
+
// Create .gitkeep
|
|
49
|
+
fs.writeFileSync(path.join(migrationsDir, '.gitkeep'), '');
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
console.log(`⚠️ Directory already exists: ${migrationsDir}/`);
|
|
53
|
+
}
|
|
54
|
+
// Create config file
|
|
55
|
+
const configPath = path.join(cwd, 'dynatable.config.js');
|
|
56
|
+
if (!fs.existsSync(configPath)) {
|
|
57
|
+
config_1.ConfigLoader.createDefaultConfig(configPath);
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
console.log(`⚠️ Config already exists: ${configPath}`);
|
|
61
|
+
}
|
|
62
|
+
console.log('\n✅ Initialization complete!\n');
|
|
63
|
+
console.log('Next steps:');
|
|
64
|
+
console.log(' 1. Edit dynatable.config.js with your DynamoDB settings');
|
|
65
|
+
console.log(' 2. Create your first migration:');
|
|
66
|
+
console.log(' dynatable-migrate create add_user_email');
|
|
67
|
+
console.log(' 3. Run migrations:');
|
|
68
|
+
console.log(' dynatable-migrate up\n');
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,kCAgCC;AApCD,uCAAyB;AACzB,2CAA6B;AAC7B,2CAA8C;AAEvC,KAAK,UAAU,WAAW;IAC/B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAE1B,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;IAEvD,8BAA8B;IAC9B,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IACnD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAClC,EAAE,CAAC,SAAS,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,cAAc,aAAa,GAAG,CAAC,CAAC;QAE5C,kBAAkB;QAClB,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC;IAC7D,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,iCAAiC,aAAa,GAAG,CAAC,CAAC;IACjE,CAAC;IAED,qBAAqB;IACrB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,qBAAqB,CAAC,CAAC;IACzD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,qBAAY,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC;IAC/C,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,8BAA8B,UAAU,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IAC3B,OAAO,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC;IACzE,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;IACjD,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IACpC,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;AAC7C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3C,wBAAsB,UAAU,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAsFvE"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.showStatus = showStatus;
|
|
4
|
+
const client_dynamodb_1 = require("@aws-sdk/client-dynamodb");
|
|
5
|
+
const lib_dynamodb_1 = require("@aws-sdk/lib-dynamodb");
|
|
6
|
+
const runner_1 = require("../core/runner");
|
|
7
|
+
async function showStatus(config) {
|
|
8
|
+
// Create DynamoDB client
|
|
9
|
+
const ddbClient = new client_dynamodb_1.DynamoDBClient({
|
|
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
|
+
});
|
|
23
|
+
const runner = new runner_1.MigrationRunner(client, config);
|
|
24
|
+
try {
|
|
25
|
+
const statuses = await runner.status();
|
|
26
|
+
const currentVersion = await runner.getCurrentVersion();
|
|
27
|
+
console.log(`\n📊 Migration Status\n`);
|
|
28
|
+
console.log(`Table: ${config.tableName}`);
|
|
29
|
+
console.log(`Current version: ${currentVersion || 'v0000 (no migrations)'}`);
|
|
30
|
+
console.log(`Migrations directory: ${config.migrationsDir || './migrations'}\n`);
|
|
31
|
+
if (statuses.length === 0) {
|
|
32
|
+
console.log('No migrations found.\n');
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
// Group by status
|
|
36
|
+
const pending = statuses.filter((s) => s.status === 'pending');
|
|
37
|
+
const applied = statuses.filter((s) => s.status === 'applied');
|
|
38
|
+
const failed = statuses.filter((s) => s.status === 'failed');
|
|
39
|
+
const rolledBack = statuses.filter((s) => s.status === 'rolled_back');
|
|
40
|
+
// Show applied migrations
|
|
41
|
+
if (applied.length > 0) {
|
|
42
|
+
console.log(`✅ Applied (${applied.length}):`);
|
|
43
|
+
for (const status of applied) {
|
|
44
|
+
const date = status.appliedAt ? new Date(status.appliedAt).toLocaleString() : '';
|
|
45
|
+
console.log(` ${status.version} - ${status.name} (${date})`);
|
|
46
|
+
}
|
|
47
|
+
console.log();
|
|
48
|
+
}
|
|
49
|
+
// Show pending migrations
|
|
50
|
+
if (pending.length > 0) {
|
|
51
|
+
console.log(`⏳ Pending (${pending.length}):`);
|
|
52
|
+
for (const status of pending) {
|
|
53
|
+
console.log(` ${status.version} - ${status.name}`);
|
|
54
|
+
}
|
|
55
|
+
console.log();
|
|
56
|
+
}
|
|
57
|
+
// Show rolled back migrations
|
|
58
|
+
if (rolledBack.length > 0) {
|
|
59
|
+
console.log(`⬅️ Rolled Back (${rolledBack.length}):`);
|
|
60
|
+
for (const status of rolledBack) {
|
|
61
|
+
console.log(` ${status.version} - ${status.name}`);
|
|
62
|
+
}
|
|
63
|
+
console.log();
|
|
64
|
+
}
|
|
65
|
+
// Show failed migrations
|
|
66
|
+
if (failed.length > 0) {
|
|
67
|
+
console.log(`❌ Failed (${failed.length}):`);
|
|
68
|
+
for (const status of failed) {
|
|
69
|
+
console.log(` ${status.version} - ${status.name}`);
|
|
70
|
+
if (status.error) {
|
|
71
|
+
console.log(` Error: ${status.error}`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
console.log();
|
|
75
|
+
}
|
|
76
|
+
// Summary
|
|
77
|
+
console.log(`Total: ${statuses.length} migration(s)\n`);
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
console.error(`\n❌ Failed to get status: ${error.message}\n`);
|
|
81
|
+
process.exit(1);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"up.d.ts","sourceRoot":"","sources":["../../src/commands/up.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3C,wBAAsB,aAAa,CAAC,MAAM,EAAE,eAAe,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiC1F"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
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
|
+
const runner_1 = require("../core/runner");
|
|
7
|
+
async function runMigrations(config, limit) {
|
|
8
|
+
// Create DynamoDB client
|
|
9
|
+
const ddbClient = new client_dynamodb_1.DynamoDBClient({
|
|
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
|
+
});
|
|
23
|
+
const runner = new runner_1.MigrationRunner(client, config);
|
|
24
|
+
try {
|
|
25
|
+
const executed = await runner.up(limit);
|
|
26
|
+
if (executed.length > 0) {
|
|
27
|
+
console.log(`\n🎉 Successfully applied ${executed.length} migration(s)`);
|
|
28
|
+
const currentVersion = await runner.getCurrentVersion();
|
|
29
|
+
console.log(`📌 Current version: ${currentVersion}\n`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
console.error(`\n❌ Migration failed: ${error.message}\n`);
|
|
34
|
+
process.exit(1);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=up.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"up.js","sourceRoot":"","sources":["../../src/commands/up.ts"],"names":[],"mappings":";;AAKA,sCAiCC;AAtCD,8DAA0D;AAC1D,wDAA+D;AAC/D,2CAAiD;AAG1C,KAAK,UAAU,aAAa,CAAC,MAAuB,EAAE,KAAc;IACzE,yBAAyB;IACzB,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,MAAM,MAAM,GAAG,qCAAsB,CAAC,IAAI,CAAC,SAAS,EAAE;QACpD,eAAe,EAAE;YACf,qBAAqB,EAAE,IAAI;YAC3B,yBAAyB,EAAE,IAAI;SAChC;QACD,iBAAiB,EAAE;YACjB,WAAW,EAAE,KAAK;SACnB;KACF,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,IAAI,wBAAe,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEnD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;QAExC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,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,29 @@
|
|
|
1
|
+
import { MigrationConfig } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Load migration configuration
|
|
4
|
+
*/
|
|
5
|
+
export declare class ConfigLoader {
|
|
6
|
+
private configPath;
|
|
7
|
+
constructor(configPath?: string);
|
|
8
|
+
/**
|
|
9
|
+
* Find config file in current directory or parent directories
|
|
10
|
+
*/
|
|
11
|
+
private findConfigFile;
|
|
12
|
+
/**
|
|
13
|
+
* Load configuration from file
|
|
14
|
+
*/
|
|
15
|
+
load(): Promise<MigrationConfig>;
|
|
16
|
+
/**
|
|
17
|
+
* Validate and normalize configuration
|
|
18
|
+
*/
|
|
19
|
+
private validateAndNormalizeConfig;
|
|
20
|
+
/**
|
|
21
|
+
* Create default config file
|
|
22
|
+
*/
|
|
23
|
+
static createDefaultConfig(targetPath: string): void;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Get config from environment or file
|
|
27
|
+
*/
|
|
28
|
+
export declare function loadConfig(configPath?: string): Promise<MigrationConfig>;
|
|
29
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3C;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,UAAU,CAAS;gBAEf,UAAU,CAAC,EAAE,MAAM;IAI/B;;OAEG;IACH,OAAO,CAAC,cAAc;IAyBtB;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,eAAe,CAAC;IAyBtC;;OAEG;IACH,OAAO,CAAC,0BAA0B;IAsBlC;;OAEG;IACH,MAAM,CAAC,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;CAiCrD;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAG9E"}
|
|
@@ -0,0 +1,160 @@
|
|
|
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.ConfigLoader = void 0;
|
|
37
|
+
exports.loadConfig = loadConfig;
|
|
38
|
+
const fs = __importStar(require("fs"));
|
|
39
|
+
const path = __importStar(require("path"));
|
|
40
|
+
/**
|
|
41
|
+
* Load migration configuration
|
|
42
|
+
*/
|
|
43
|
+
class ConfigLoader {
|
|
44
|
+
constructor(configPath) {
|
|
45
|
+
this.configPath = configPath || this.findConfigFile() || 'dynatable.config.js';
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Find config file in current directory or parent directories
|
|
49
|
+
*/
|
|
50
|
+
findConfigFile() {
|
|
51
|
+
const configFileNames = [
|
|
52
|
+
'dynatable.config.js',
|
|
53
|
+
'dynatable.config.json',
|
|
54
|
+
'.dynatablerc.js',
|
|
55
|
+
'.dynatablerc.json',
|
|
56
|
+
];
|
|
57
|
+
let currentDir = process.cwd();
|
|
58
|
+
const root = path.parse(currentDir).root;
|
|
59
|
+
while (currentDir !== root) {
|
|
60
|
+
for (const fileName of configFileNames) {
|
|
61
|
+
const filePath = path.join(currentDir, fileName);
|
|
62
|
+
if (fs.existsSync(filePath)) {
|
|
63
|
+
return filePath;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
currentDir = path.dirname(currentDir);
|
|
67
|
+
}
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Load configuration from file
|
|
72
|
+
*/
|
|
73
|
+
async load() {
|
|
74
|
+
if (!fs.existsSync(this.configPath)) {
|
|
75
|
+
throw new Error(`Configuration file not found: ${this.configPath}\n\nPlease create a dynatable.config.js file in your project root.`);
|
|
76
|
+
}
|
|
77
|
+
try {
|
|
78
|
+
let config;
|
|
79
|
+
if (this.configPath.endsWith('.json')) {
|
|
80
|
+
const content = fs.readFileSync(this.configPath, 'utf-8');
|
|
81
|
+
config = JSON.parse(content);
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
// JavaScript config file
|
|
85
|
+
const module = await Promise.resolve(`${this.configPath}`).then(s => __importStar(require(s)));
|
|
86
|
+
config = module.default || module;
|
|
87
|
+
}
|
|
88
|
+
return this.validateAndNormalizeConfig(config);
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
throw new Error(`Failed to load configuration: ${error.message}`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Validate and normalize configuration
|
|
96
|
+
*/
|
|
97
|
+
validateAndNormalizeConfig(config) {
|
|
98
|
+
if (!config.tableName) {
|
|
99
|
+
throw new Error("Configuration error: 'tableName' is required");
|
|
100
|
+
}
|
|
101
|
+
if (!config.client?.region) {
|
|
102
|
+
throw new Error("Configuration error: 'client.region' is required");
|
|
103
|
+
}
|
|
104
|
+
return {
|
|
105
|
+
tableName: config.tableName,
|
|
106
|
+
client: {
|
|
107
|
+
region: config.client.region,
|
|
108
|
+
endpoint: config.client.endpoint,
|
|
109
|
+
credentials: config.client.credentials,
|
|
110
|
+
},
|
|
111
|
+
migrationsDir: config.migrationsDir || './migrations',
|
|
112
|
+
trackingPrefix: config.trackingPrefix || '_SCHEMA#VERSION',
|
|
113
|
+
gsi1Name: config.gsi1Name || 'GSI1',
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Create default config file
|
|
118
|
+
*/
|
|
119
|
+
static createDefaultConfig(targetPath) {
|
|
120
|
+
const defaultConfig = `module.exports = {
|
|
121
|
+
// DynamoDB table name
|
|
122
|
+
tableName: "MyTable",
|
|
123
|
+
|
|
124
|
+
// DynamoDB client configuration
|
|
125
|
+
client: {
|
|
126
|
+
region: "us-east-1",
|
|
127
|
+
|
|
128
|
+
// Optional: For local DynamoDB
|
|
129
|
+
endpoint: "http://localhost:8000",
|
|
130
|
+
|
|
131
|
+
// Optional: Credentials (use AWS_PROFILE or IAM role in production)
|
|
132
|
+
credentials: {
|
|
133
|
+
accessKeyId: "local",
|
|
134
|
+
secretAccessKey: "local",
|
|
135
|
+
},
|
|
136
|
+
},
|
|
137
|
+
|
|
138
|
+
// Optional: Migrations directory (default: ./migrations)
|
|
139
|
+
migrationsDir: "./migrations",
|
|
140
|
+
|
|
141
|
+
// Optional: Tracking prefix in single table (default: _SCHEMA#VERSION)
|
|
142
|
+
trackingPrefix: "_SCHEMA#VERSION",
|
|
143
|
+
|
|
144
|
+
// Optional: GSI name for tracking (default: GSI1)
|
|
145
|
+
gsi1Name: "GSI1",
|
|
146
|
+
};
|
|
147
|
+
`;
|
|
148
|
+
fs.writeFileSync(targetPath, defaultConfig, 'utf-8');
|
|
149
|
+
console.log(`✅ Created config file: ${targetPath}`);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
exports.ConfigLoader = ConfigLoader;
|
|
153
|
+
/**
|
|
154
|
+
* Get config from environment or file
|
|
155
|
+
*/
|
|
156
|
+
async function loadConfig(configPath) {
|
|
157
|
+
const loader = new ConfigLoader(configPath);
|
|
158
|
+
return loader.load();
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"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"}
|