@studiosonrai/nestjs-migrations 1.2.0 → 1.3.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/dist/src/migration-core.d.ts +2 -0
- package/dist/src/migration-core.js +30 -20
- package/dist/src/migration-core.js.map +1 -1
- package/dist/src/migration-core.spec.js +132 -13
- package/dist/src/migration-core.spec.js.map +1 -1
- package/dist/src/migration.module.js.map +1 -1
- package/dist/src/migration.service.js +1 -0
- package/dist/src/migration.service.js.map +1 -1
- package/dist/src/migration.service.spec.js +136 -19
- package/dist/src/migration.service.spec.js.map +1 -1
- package/dist/src/types.d.ts +2 -0
- package/dist/src/types.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/dist/bin/cli.d.ts +0 -2
- package/dist/bin/cli.js +0 -273
- package/dist/bin/cli.js.map +0 -1
package/package.json
CHANGED
package/dist/bin/cli.d.ts
DELETED
package/dist/bin/cli.js
DELETED
|
@@ -1,273 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
"use strict";
|
|
3
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
-
if (k2 === undefined) k2 = k;
|
|
5
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
-
}
|
|
9
|
-
Object.defineProperty(o, k2, desc);
|
|
10
|
-
}) : (function(o, m, k, k2) {
|
|
11
|
-
if (k2 === undefined) k2 = k;
|
|
12
|
-
o[k2] = m[k];
|
|
13
|
-
}));
|
|
14
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
-
}) : function(o, v) {
|
|
17
|
-
o["default"] = v;
|
|
18
|
-
});
|
|
19
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
20
|
-
var ownKeys = function(o) {
|
|
21
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
22
|
-
var ar = [];
|
|
23
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
24
|
-
return ar;
|
|
25
|
-
};
|
|
26
|
-
return ownKeys(o);
|
|
27
|
-
};
|
|
28
|
-
return function (mod) {
|
|
29
|
-
if (mod && mod.__esModule) return mod;
|
|
30
|
-
var result = {};
|
|
31
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
32
|
-
__setModuleDefault(result, mod);
|
|
33
|
-
return result;
|
|
34
|
-
};
|
|
35
|
-
})();
|
|
36
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
|
-
const typeorm_1 = require("typeorm");
|
|
38
|
-
const path = __importStar(require("path"));
|
|
39
|
-
const migration_core_1 = require("../src/migration-core");
|
|
40
|
-
function printUsage() {
|
|
41
|
-
console.log(`
|
|
42
|
-
@studiosonrai/nestjs-migrations CLI
|
|
43
|
-
|
|
44
|
-
Usage:
|
|
45
|
-
nestjs-migrations run [options]
|
|
46
|
-
nestjs-migrations status [options]
|
|
47
|
-
|
|
48
|
-
Commands:
|
|
49
|
-
run Run all pending migrations
|
|
50
|
-
status Show migration status
|
|
51
|
-
|
|
52
|
-
Options:
|
|
53
|
-
--migrations-dir, -d Path to migrations directory (required)
|
|
54
|
-
--host, -h Database host (default: localhost)
|
|
55
|
-
--port, -p Database port (default: 1433)
|
|
56
|
-
--database, -D Database name (required)
|
|
57
|
-
--username, -u Database username
|
|
58
|
-
--password, -P Database password
|
|
59
|
-
--encrypt Enable encryption (default: false)
|
|
60
|
-
--trust-cert Trust server certificate (default: false)
|
|
61
|
-
--dry-run Show pending migrations without applying
|
|
62
|
-
--verbose, -v Verbose output (default: true)
|
|
63
|
-
--help Show this help message
|
|
64
|
-
|
|
65
|
-
Environment variables:
|
|
66
|
-
DB_HOST Database host
|
|
67
|
-
DB_PORT Database port
|
|
68
|
-
DB_DATABASE Database name
|
|
69
|
-
DB_USERNAME Database username
|
|
70
|
-
DB_PASSWORD Database password
|
|
71
|
-
DB_ENCRYPT Enable encryption
|
|
72
|
-
MIGRATIONS_DIR Path to migrations directory
|
|
73
|
-
|
|
74
|
-
Examples:
|
|
75
|
-
nestjs-migrations run -d ./migrations -D mydb -u sa -P password
|
|
76
|
-
nestjs-migrations status --migrations-dir ./migrations --database mydb
|
|
77
|
-
nestjs-migrations run --dry-run -d ./migrations -D mydb
|
|
78
|
-
`);
|
|
79
|
-
}
|
|
80
|
-
function parseArgs(args) {
|
|
81
|
-
const options = {
|
|
82
|
-
verbose: true,
|
|
83
|
-
};
|
|
84
|
-
let command = '';
|
|
85
|
-
for (let i = 0; i < args.length; i++) {
|
|
86
|
-
const arg = args[i];
|
|
87
|
-
const nextArg = args[i + 1];
|
|
88
|
-
switch (arg) {
|
|
89
|
-
case 'run':
|
|
90
|
-
case 'status':
|
|
91
|
-
command = arg;
|
|
92
|
-
break;
|
|
93
|
-
case '--migrations-dir':
|
|
94
|
-
case '-d':
|
|
95
|
-
options.migrationsDir = nextArg;
|
|
96
|
-
i++;
|
|
97
|
-
break;
|
|
98
|
-
case '--host':
|
|
99
|
-
case '-h':
|
|
100
|
-
options.host = nextArg;
|
|
101
|
-
i++;
|
|
102
|
-
break;
|
|
103
|
-
case '--port':
|
|
104
|
-
case '-p':
|
|
105
|
-
options.port = parseInt(nextArg, 10);
|
|
106
|
-
i++;
|
|
107
|
-
break;
|
|
108
|
-
case '--database':
|
|
109
|
-
case '-D':
|
|
110
|
-
options.database = nextArg;
|
|
111
|
-
i++;
|
|
112
|
-
break;
|
|
113
|
-
case '--username':
|
|
114
|
-
case '-u':
|
|
115
|
-
options.username = nextArg;
|
|
116
|
-
i++;
|
|
117
|
-
break;
|
|
118
|
-
case '--password':
|
|
119
|
-
case '-P':
|
|
120
|
-
options.password = nextArg;
|
|
121
|
-
i++;
|
|
122
|
-
break;
|
|
123
|
-
case '--encrypt':
|
|
124
|
-
options.encrypt = true;
|
|
125
|
-
break;
|
|
126
|
-
case '--trust-cert':
|
|
127
|
-
options.trustServerCertificate = true;
|
|
128
|
-
break;
|
|
129
|
-
case '--dry-run':
|
|
130
|
-
options.dryRun = true;
|
|
131
|
-
break;
|
|
132
|
-
case '--verbose':
|
|
133
|
-
case '-v':
|
|
134
|
-
options.verbose = true;
|
|
135
|
-
break;
|
|
136
|
-
case '--help':
|
|
137
|
-
printUsage();
|
|
138
|
-
process.exit(0);
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
return { command, options };
|
|
142
|
-
}
|
|
143
|
-
function resolveOptions(cliOptions) {
|
|
144
|
-
const dotenv = require('dotenv');
|
|
145
|
-
dotenv.config();
|
|
146
|
-
const options = {
|
|
147
|
-
migrationsDir: cliOptions.migrationsDir || process.env.MIGRATIONS_DIR || '',
|
|
148
|
-
host: cliOptions.host || process.env.DB_HOST || 'localhost',
|
|
149
|
-
port: cliOptions.port || parseInt(process.env.DB_PORT || '1433', 10),
|
|
150
|
-
database: cliOptions.database || process.env.DB_DATABASE || '',
|
|
151
|
-
username: cliOptions.username || process.env.DB_USERNAME,
|
|
152
|
-
password: cliOptions.password || process.env.DB_PASSWORD,
|
|
153
|
-
encrypt: cliOptions.encrypt || process.env.DB_ENCRYPT === 'true',
|
|
154
|
-
trustServerCertificate: cliOptions.trustServerCertificate || false,
|
|
155
|
-
dryRun: cliOptions.dryRun || false,
|
|
156
|
-
verbose: cliOptions.verbose ?? true,
|
|
157
|
-
};
|
|
158
|
-
if (options.migrationsDir && !path.isAbsolute(options.migrationsDir)) {
|
|
159
|
-
options.migrationsDir = path.resolve(process.cwd(), options.migrationsDir);
|
|
160
|
-
}
|
|
161
|
-
return options;
|
|
162
|
-
}
|
|
163
|
-
function validateOptions(options) {
|
|
164
|
-
if (!options.migrationsDir) {
|
|
165
|
-
console.error('Error: --migrations-dir is required');
|
|
166
|
-
process.exit(1);
|
|
167
|
-
}
|
|
168
|
-
if (!options.database) {
|
|
169
|
-
console.error('Error: --database is required');
|
|
170
|
-
process.exit(1);
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
async function createDataSource(options) {
|
|
174
|
-
const dataSource = new typeorm_1.DataSource({
|
|
175
|
-
type: 'mssql',
|
|
176
|
-
host: options.host,
|
|
177
|
-
port: options.port,
|
|
178
|
-
database: options.database,
|
|
179
|
-
username: options.username,
|
|
180
|
-
password: options.password,
|
|
181
|
-
options: {
|
|
182
|
-
encrypt: options.encrypt || false,
|
|
183
|
-
trustServerCertificate: options.trustServerCertificate || false,
|
|
184
|
-
},
|
|
185
|
-
});
|
|
186
|
-
await dataSource.initialize();
|
|
187
|
-
return dataSource;
|
|
188
|
-
}
|
|
189
|
-
async function runCommand(options) {
|
|
190
|
-
console.log('Starting migration runner...');
|
|
191
|
-
console.log(`Migrations directory: ${options.migrationsDir}`);
|
|
192
|
-
console.log(`Database: ${options.database}`);
|
|
193
|
-
console.log(`Host: ${options.host}:${options.port}`);
|
|
194
|
-
console.log('');
|
|
195
|
-
const dataSource = await createDataSource(options);
|
|
196
|
-
console.log('Database connection established');
|
|
197
|
-
try {
|
|
198
|
-
const migrationCore = new migration_core_1.MigrationCore(dataSource, {
|
|
199
|
-
migrationsDir: options.migrationsDir,
|
|
200
|
-
});
|
|
201
|
-
const result = await migrationCore.runMigrations({
|
|
202
|
-
dryRun: options.dryRun,
|
|
203
|
-
verbose: options.verbose,
|
|
204
|
-
});
|
|
205
|
-
if (result.success) {
|
|
206
|
-
console.log('');
|
|
207
|
-
console.log('Migration completed successfully!');
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
finally {
|
|
211
|
-
await dataSource.destroy();
|
|
212
|
-
console.log('Database connection closed');
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
async function statusCommand(options) {
|
|
216
|
-
console.log('Checking migration status...');
|
|
217
|
-
console.log(`Migrations directory: ${options.migrationsDir}`);
|
|
218
|
-
console.log(`Database: ${options.database}`);
|
|
219
|
-
console.log('');
|
|
220
|
-
const dataSource = await createDataSource(options);
|
|
221
|
-
try {
|
|
222
|
-
const migrationCore = new migration_core_1.MigrationCore(dataSource, {
|
|
223
|
-
migrationsDir: options.migrationsDir,
|
|
224
|
-
});
|
|
225
|
-
const status = await migrationCore.getStatus();
|
|
226
|
-
console.log(`Total migrations: ${status.total}`);
|
|
227
|
-
console.log(`Applied: ${status.applied}`);
|
|
228
|
-
console.log(`Pending: ${status.pending}`);
|
|
229
|
-
if (status.pendingFiles.length > 0) {
|
|
230
|
-
console.log('');
|
|
231
|
-
console.log('Pending migrations:');
|
|
232
|
-
status.pendingFiles.forEach((file) => console.log(` - ${file}`));
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
finally {
|
|
236
|
-
await dataSource.destroy();
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
async function main() {
|
|
240
|
-
const args = process.argv.slice(2);
|
|
241
|
-
if (args.length === 0 || args.includes('--help')) {
|
|
242
|
-
printUsage();
|
|
243
|
-
process.exit(0);
|
|
244
|
-
}
|
|
245
|
-
const { command, options: cliOptions } = parseArgs(args);
|
|
246
|
-
const options = resolveOptions(cliOptions);
|
|
247
|
-
if (!command) {
|
|
248
|
-
console.error('Error: No command specified. Use "run" or "status".');
|
|
249
|
-
printUsage();
|
|
250
|
-
process.exit(1);
|
|
251
|
-
}
|
|
252
|
-
validateOptions(options);
|
|
253
|
-
try {
|
|
254
|
-
switch (command) {
|
|
255
|
-
case 'run':
|
|
256
|
-
await runCommand(options);
|
|
257
|
-
break;
|
|
258
|
-
case 'status':
|
|
259
|
-
await statusCommand(options);
|
|
260
|
-
break;
|
|
261
|
-
default:
|
|
262
|
-
console.error(`Unknown command: ${command}`);
|
|
263
|
-
printUsage();
|
|
264
|
-
process.exit(1);
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
catch (error) {
|
|
268
|
-
console.error('Migration failed:', error);
|
|
269
|
-
process.exit(1);
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
main();
|
|
273
|
-
//# sourceMappingURL=cli.js.map
|
package/dist/bin/cli.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../bin/cli.ts"],"names":[],"mappings":"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"}
|