@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.
Files changed (73) hide show
  1. package/.gitkeep +0 -0
  2. package/CHANGELOG.md +13 -0
  3. package/README.md +421 -0
  4. package/USAGE.md +557 -0
  5. package/bin/dynatable-migrate.js +30 -0
  6. package/dist/cli.d.ts +3 -0
  7. package/dist/cli.d.ts.map +1 -0
  8. package/dist/cli.js +104 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/commands/create.d.ts +2 -0
  11. package/dist/commands/create.d.ts.map +1 -0
  12. package/dist/commands/create.js +123 -0
  13. package/dist/commands/create.js.map +1 -0
  14. package/dist/commands/down.d.ts +3 -0
  15. package/dist/commands/down.d.ts.map +1 -0
  16. package/dist/commands/down.js +37 -0
  17. package/dist/commands/down.js.map +1 -0
  18. package/dist/commands/init.d.ts +2 -0
  19. package/dist/commands/init.d.ts.map +1 -0
  20. package/dist/commands/init.js +70 -0
  21. package/dist/commands/init.js.map +1 -0
  22. package/dist/commands/status.d.ts +3 -0
  23. package/dist/commands/status.d.ts.map +1 -0
  24. package/dist/commands/status.js +84 -0
  25. package/dist/commands/status.js.map +1 -0
  26. package/dist/commands/up.d.ts +3 -0
  27. package/dist/commands/up.d.ts.map +1 -0
  28. package/dist/commands/up.js +37 -0
  29. package/dist/commands/up.js.map +1 -0
  30. package/dist/core/config.d.ts +29 -0
  31. package/dist/core/config.d.ts.map +1 -0
  32. package/dist/core/config.js +160 -0
  33. package/dist/core/config.js.map +1 -0
  34. package/dist/core/loader.d.ts +47 -0
  35. package/dist/core/loader.d.ts.map +1 -0
  36. package/dist/core/loader.js +226 -0
  37. package/dist/core/loader.js.map +1 -0
  38. package/dist/core/runner.d.ts +38 -0
  39. package/dist/core/runner.d.ts.map +1 -0
  40. package/dist/core/runner.js +166 -0
  41. package/dist/core/runner.js.map +1 -0
  42. package/dist/core/tracker.d.ts +19 -0
  43. package/dist/core/tracker.d.ts.map +1 -0
  44. package/dist/core/tracker.js +172 -0
  45. package/dist/core/tracker.js.map +1 -0
  46. package/dist/index.d.ts +16 -0
  47. package/dist/index.d.ts.map +1 -0
  48. package/dist/index.js +48 -0
  49. package/dist/index.js.map +1 -0
  50. package/dist/templates/migration.d.ts +5 -0
  51. package/dist/templates/migration.d.ts.map +1 -0
  52. package/dist/templates/migration.js +96 -0
  53. package/dist/templates/migration.js.map +1 -0
  54. package/dist/types/index.d.ts +159 -0
  55. package/dist/types/index.d.ts.map +1 -0
  56. package/dist/types/index.js +3 -0
  57. package/dist/types/index.js.map +1 -0
  58. package/migrations/.gitkeep +0 -0
  59. package/package.json +43 -0
  60. package/src/cli.ts +106 -0
  61. package/src/commands/create.ts +110 -0
  62. package/src/commands/down.ts +42 -0
  63. package/src/commands/init.ts +37 -0
  64. package/src/commands/status.ts +92 -0
  65. package/src/commands/up.ts +39 -0
  66. package/src/core/config.ts +140 -0
  67. package/src/core/loader.ts +233 -0
  68. package/src/core/runner.ts +223 -0
  69. package/src/core/tracker.ts +219 -0
  70. package/src/index.ts +23 -0
  71. package/src/templates/migration.ts +92 -0
  72. package/src/types/index.ts +196 -0
  73. 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,3 @@
1
+ import { MigrationConfig } from '../types';
2
+ export declare function rollbackMigrations(config: MigrationConfig, steps?: number): Promise<void>;
3
+ //# sourceMappingURL=down.d.ts.map
@@ -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,2 @@
1
+ export declare function initProject(): Promise<void>;
2
+ //# sourceMappingURL=init.d.ts.map
@@ -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,3 @@
1
+ import { MigrationConfig } from '../types';
2
+ export declare function showStatus(config: MigrationConfig): Promise<void>;
3
+ //# sourceMappingURL=status.d.ts.map
@@ -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,3 @@
1
+ import { MigrationConfig } from '../types';
2
+ export declare function runMigrations(config: MigrationConfig, limit?: number): Promise<void>;
3
+ //# sourceMappingURL=up.d.ts.map
@@ -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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"}