@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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@studiosonrai/nestjs-migrations",
3
- "version": "1.2.0",
3
+ "version": "1.3.0",
4
4
  "description": "SQL Server migrations module for NestJS applications",
5
5
  "main": "dist/src/index.js",
6
6
  "types": "dist/src/index.d.ts",
package/dist/bin/cli.d.ts DELETED
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
2
- export {};
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../bin/cli.ts"],"names":[],"mappings":"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"}