@studiosonrai/nestjs-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/README.md +56 -0
- package/dist/bin/cli.js +35 -4
- package/dist/bin/cli.js.map +1 -0
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.js +3 -6
- package/dist/src/index.js.map +1 -0
- package/dist/src/migration-core.d.ts +17 -32
- package/dist/src/migration-core.js +246 -95
- package/dist/src/migration-core.js.map +1 -0
- package/dist/src/migration-core.spec.d.ts +1 -0
- package/dist/src/migration-core.spec.js +290 -0
- package/dist/src/migration-core.spec.js.map +1 -0
- package/dist/src/migration.module.d.ts +0 -30
- package/dist/src/migration.module.js +1 -31
- package/dist/src/migration.module.js.map +1 -0
- package/dist/src/migration.service.d.ts +2 -13
- package/dist/src/migration.service.js +2 -14
- package/dist/src/migration.service.js.map +1 -0
- package/dist/src/migration.service.spec.d.ts +1 -0
- package/dist/src/migration.service.spec.js +190 -0
- package/dist/src/migration.service.spec.js.map +1 -0
- package/dist/src/types.d.ts +15 -52
- package/dist/src/types.js +18 -2
- package/dist/src/types.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +13 -4
package/README.md
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# @studiosonrai/nestjs-migrations
|
|
2
|
+
|
|
3
|
+
SQL Server migrations module for NestJS. Runs TypeScript migrations on startup or via CLI.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @studiosonrai/nestjs-migrations
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
```typescript
|
|
14
|
+
import { MigrationModule } from '@studiosonrai/nestjs-migrations';
|
|
15
|
+
|
|
16
|
+
@Module({
|
|
17
|
+
imports: [
|
|
18
|
+
MigrationModule.forRootAsync({
|
|
19
|
+
inject: [ConfigService],
|
|
20
|
+
useFactory: (config: ConfigService) => ({
|
|
21
|
+
migrationsDir: path.join(__dirname, '../migrations'),
|
|
22
|
+
autoRun: config.get('AUTO_RUN_MIGRATIONS') === 'true',
|
|
23
|
+
}),
|
|
24
|
+
}),
|
|
25
|
+
],
|
|
26
|
+
})
|
|
27
|
+
export class AppModule {}
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## CLI
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
npx nestjs-migrations --dir ./migrations --connection-string "your-connection-string"
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Migration Files
|
|
37
|
+
|
|
38
|
+
Name format: `001_description.sql`, `002_description.sql`, etc.
|
|
39
|
+
|
|
40
|
+
Place SQL files in your migrations directory. They will be executed in alphabetical order.
|
|
41
|
+
|
|
42
|
+
## Hash Integrity Checking
|
|
43
|
+
|
|
44
|
+
Migration files are tracked with SHA256 hashes. If a migration file is modified after being applied, the migration runner will fail with a `HashMismatchError`. This prevents accidental changes to already-applied migrations.
|
|
45
|
+
|
|
46
|
+
```typescript
|
|
47
|
+
import { HashMismatchError } from '@studiosonrai/nestjs-migrations';
|
|
48
|
+
|
|
49
|
+
try {
|
|
50
|
+
await migrationService.runMigrations();
|
|
51
|
+
} catch (error) {
|
|
52
|
+
if (error instanceof HashMismatchError) {
|
|
53
|
+
console.error(`Migration ${error.migrationName} was modified!`);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
```
|
package/dist/bin/cli.js
CHANGED
|
@@ -1,8 +1,41 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
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
|
+
})();
|
|
3
36
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
37
|
const typeorm_1 = require("typeorm");
|
|
5
|
-
const path = require("path");
|
|
38
|
+
const path = __importStar(require("path"));
|
|
6
39
|
const migration_core_1 = require("../src/migration-core");
|
|
7
40
|
function printUsage() {
|
|
8
41
|
console.log(`
|
|
@@ -108,7 +141,6 @@ function parseArgs(args) {
|
|
|
108
141
|
return { command, options };
|
|
109
142
|
}
|
|
110
143
|
function resolveOptions(cliOptions) {
|
|
111
|
-
// Load environment variables
|
|
112
144
|
const dotenv = require('dotenv');
|
|
113
145
|
dotenv.config();
|
|
114
146
|
const options = {
|
|
@@ -123,7 +155,6 @@ function resolveOptions(cliOptions) {
|
|
|
123
155
|
dryRun: cliOptions.dryRun || false,
|
|
124
156
|
verbose: cliOptions.verbose ?? true,
|
|
125
157
|
};
|
|
126
|
-
// Resolve relative paths
|
|
127
158
|
if (options.migrationsDir && !path.isAbsolute(options.migrationsDir)) {
|
|
128
159
|
options.migrationsDir = path.resolve(process.cwd(), options.migrationsDir);
|
|
129
160
|
}
|
|
@@ -239,4 +270,4 @@ async function main() {
|
|
|
239
270
|
}
|
|
240
271
|
}
|
|
241
272
|
main();
|
|
242
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vYmluL2NsaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFQSxxQ0FBcUM7QUFDckMsNkJBQTZCO0FBQzdCLDBEQUFzRDtBQWV0RCxTQUFTLFVBQVU7SUFDakIsT0FBTyxDQUFDLEdBQUcsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQXFDYixDQUFDLENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUyxTQUFTLENBQUMsSUFBYztJQUMvQixNQUFNLE9BQU8sR0FBd0I7UUFDbkMsT0FBTyxFQUFFLElBQUk7S0FDZCxDQUFDO0lBQ0YsSUFBSSxPQUFPLEdBQUcsRUFBRSxDQUFDO0lBRWpCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDckMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFNUIsUUFBUSxHQUFHLEVBQUUsQ0FBQztZQUNaLEtBQUssS0FBSyxDQUFDO1lBQ1gsS0FBSyxRQUFRO2dCQUNYLE9BQU8sR0FBRyxHQUFHLENBQUM7Z0JBQ2QsTUFBTTtZQUNSLEtBQUssa0JBQWtCLENBQUM7WUFDeEIsS0FBSyxJQUFJO2dCQUNQLE9BQU8sQ0FBQyxhQUFhLEdBQUcsT0FBTyxDQUFDO2dCQUNoQyxDQUFDLEVBQUUsQ0FBQztnQkFDSixNQUFNO1lBQ1IsS0FBSyxRQUFRLENBQUM7WUFDZCxLQUFLLElBQUk7Z0JBQ1AsT0FBTyxDQUFDLElBQUksR0FBRyxPQUFPLENBQUM7Z0JBQ3ZCLENBQUMsRUFBRSxDQUFDO2dCQUNKLE1BQU07WUFDUixLQUFLLFFBQVEsQ0FBQztZQUNkLEtBQUssSUFBSTtnQkFDUCxPQUFPLENBQUMs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LENBQUM7SUFDbEIsQ0FBQztBQUNILENBQUM7QUFFRCxJQUFJLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIiMhL3Vzci9iaW4vZW52IG5vZGVcblxuaW1wb3J0IHsgRGF0YVNvdXJjZSB9IGZyb20gJ3R5cGVvcm0nO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IE1pZ3JhdGlvbkNvcmUgfSBmcm9tICcuLi9zcmMvbWlncmF0aW9uLWNvcmUnO1xuXG5pbnRlcmZhY2UgQ2xpT3B0aW9ucyB7XG4gIG1pZ3JhdGlvbnNEaXI6IHN0cmluZztcbiAgaG9zdDogc3RyaW5nO1xuICBwb3J0OiBudW1iZXI7XG4gIGRhdGFiYXNlOiBzdHJpbmc7XG4gIHVzZXJuYW1lPzogc3RyaW5nO1xuICBwYXNzd29yZD86IHN0cmluZztcbiAgZW5jcnlwdD86IGJvb2xlYW47XG4gIHRydXN0U2VydmVyQ2VydGlmaWNhdGU/OiBib29sZWFuO1xuICBkcnlSdW4/OiBib29sZWFuO1xuICB2ZXJib3NlPzogYm9vbGVhbjtcbn1cblxuZnVuY3Rpb24gcHJpbnRVc2FnZSgpOiB2b2lkIHtcbiAgY29uc29sZS5sb2coYFxuQHN0dWRpb3NvbnJhaS9uZXN0anMtbWlncmF0aW9ucyBDTElcblxuVXNhZ2U6XG4gIG5lc3Rqcy1taWdyYXRpb25zIHJ1biBbb3B0aW9uc11cbiAgbmVzdGpzLW1pZ3JhdGlvbnMgc3RhdHVzIFtvcHRpb25zXVxuXG5Db21tYW5kczpcbiAgcnVuICAgICAgIFJ1biBhbGwgcGVuZGluZyBtaWdyYXRpb25zXG4gIHN0YXR1cyAgICBTaG93IG1pZ3JhdGlvbiBzdGF0dXNcblxuT3B0aW9uczpcbiAgLS1taWdyYXRpb25zLWRpciwgLWQgICAgUGF0aCB0byBtaWdyYXRpb25zIGRpcmVjdG9yeSAocmVxdWlyZWQpXG4gIC0taG9zdCwgLWggICAgICAgICAgICAgIERhdGFiYXNlIGhvc3QgKGRlZmF1bHQ6IGxvY2FsaG9zdClcbiAgLS1wb3J0LCAtcCAgICAgICAgICAgICAgRGF0YWJhc2UgcG9ydCAoZGVmYXVsdDogMTQzMylcbiAgLS1kYXRhYmFzZSwgLUQgICAgICAgICAgRGF0YWJhc2UgbmFtZSAocmVxdWlyZWQpXG4gIC0tdXNlcm5hbWUsIC11ICAgICAgICAgIERhdGFiYXNlIHVzZXJuYW1lXG4gIC0tcGFzc3dvcmQsIC1QICAgICAgICAgIERhdGFiYXNlIHBhc3N3b3JkXG4gIC0tZW5jcnlwdCAgICAgICAgICAgICAgIEVuYWJsZSBlbmNyeXB0aW9uIChkZWZhdWx0OiBmYWxzZSlcbiAgLS10cnVzdC1jZXJ0ICAgICAgICAgICAgVHJ1c3Qgc2VydmVyIGNlcnRpZmljYXRlIChkZWZhdWx0OiBmYWxzZSlcbiAgLS1kcnktcnVuICAgICAgICAgICAgICAgU2hvdyBwZW5kaW5nIG1pZ3JhdGlvbnMgd2l0aG91dCBhcHBseWluZ1xuICAtLXZlcmJvc2UsIC12ICAgICAgICAgICBWZXJib3NlIG91dHB1dCAoZGVmYXVsdDogdHJ1ZSlcbiAgLS1oZWxwICAgICAgICAgICAgICAgICAgU2hvdyB0aGlzIGhlbHAgbWVzc2FnZVxuXG5FbnZpcm9ubWVudCB2YXJpYWJsZXM6XG4gIERCX0hPU1QgICAgICAgICAgICAgICAgIERhdGFiYXNlIGhvc3RcbiAgREJfUE9SVCAgICAgICAgICAgICAgICAgRGF0YWJhc2UgcG9ydFxuICBEQl9EQVRBQkFTRSAgICAgICAgICAgICBEYXRhYmFzZSBuYW1lXG4gIERCX1VTRVJOQU1FICAgICAgICAgICAgIERhdGFiYXNlIHVzZXJuYW1lXG4gIERCX1BBU1NXT1JEICAgICAgICAgICAgIERhdGFiYXNlIHBhc3N3b3JkXG4gIERCX0VOQ1JZUFQgICAgICAgICAgICAgIEVuYWJsZSBlbmNyeXB0aW9uXG4gIE1JR1JBVElPTlNfRElSICAgICAgICAgIFBhdGggdG8gbWlncmF0aW9ucyBkaXJlY3RvcnlcblxuRXhhbXBsZXM6XG4gIG5lc3Rqcy1taWdyYXRpb25zIHJ1biAtZCAuL21pZ3JhdGlvbnMgLUQgbXlkYiAtdSBzYSAtUCBwYXNzd29yZFxuICBuZXN0anMtbWlncmF0aW9ucyBzdGF0dXMgLS1taWdyYXRpb25zLWRpciAuL21pZ3JhdGlvbnMgLS1kYXRhYmFzZSBteWRiXG4gIG5lc3Rqcy1taWdyYXRpb25zIHJ1biAtLWRyeS1ydW4gLWQgLi9taWdyYXRpb25zIC1EIG15ZGJcbmApO1xufVxuXG5mdW5jdGlvbiBwYXJzZUFyZ3MoYXJnczogc3RyaW5nW10pOiB7IGNvbW1hbmQ6IHN0cmluZzsgb3B0aW9uczogUGFydGlhbDxDbGlPcHRpb25zPiB9IHtcbiAgY29uc3Qgb3B0aW9uczogUGFydGlhbDxDbGlPcHRpb25zPiA9IHtcbiAgICB2ZXJib3NlOiB0cnVlLFxuICB9O1xuICBsZXQgY29tbWFuZCA9ICcnO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGFyZyA9IGFyZ3NbaV07XG4gICAgY29uc3QgbmV4dEFyZyA9IGFyZ3NbaSArIDFdO1xuXG4gICAgc3dpdGNoIChhcmcpIHtcbiAgICAgIGNhc2UgJ3J1bic6XG4gICAgICBjYXNlICdzdGF0dXMnOlxuICAgICAgICBjb21tYW5kID0gYXJnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJy0tbWlncmF0aW9ucy1kaXInOlxuICAgICAgY2FzZSAnLWQnOlxuICAgICAgICBvcHRpb25zLm1pZ3JhdGlvbnNEaXIgPSBuZXh0QXJnO1xuICAgICAgICBpKys7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnLS1ob3N0JzpcbiAgICAgIGNhc2UgJy1oJzpcbiAgICAgICAgb3B0aW9ucy5ob3N0ID0gbmV4dEFyZztcbiAgICAgICAgaSsrO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJy0tcG9ydCc6XG4gICAgICBjYXNlICctcCc6XG4gICAgICAgIG9wdGlvbnMucG9ydCA9IHBhcnNlSW50KG5leHRBcmcsIDEwKTtcbiAgICAgICAgaSsrO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJy0tZGF0YWJhc2UnOlxuICAgICAgY2FzZSAnLUQnOlxuICAgICAgICBvcHRpb25zLmRhdGFiYXNlID0gbmV4dEFyZztcbiAgICAgICAgaSsrO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJy0tdXNlcm5hbWUnOlxuICAgICAgY2FzZSAnLXUnOlxuICAgICAgICBvcHRpb25zLnVzZXJuYW1lID0gbmV4dEFyZztcbiAgICAgICAgaSsrO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJy0tcGFzc3dvcmQnOlxuICAgICAgY2FzZSAnLVAnOlxuICAgICAgICBvcHRpb25zLnBhc3N3b3JkID0gbmV4dEFyZztcbiAgICAgICAgaSsrO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJy0tZW5jcnlwdCc6XG4gICAgICAgIG9wdGlvbnMuZW5jcnlwdCA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnLS10cnVzdC1jZXJ0JzpcbiAgICAgICAgb3B0aW9ucy50cnVzdFNlcnZlckNlcnRpZmljYXRlID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICctLWRyeS1ydW4nOlxuICAgICAgICBvcHRpb25zLmRyeVJ1biA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnLS12ZXJib3NlJzpcbiAgICAgIGNhc2UgJy12JzpcbiAgICAgICAgb3B0aW9ucy52ZXJib3NlID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICctLWhlbHAnOlxuICAgICAgICBwcmludFVzYWdlKCk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4geyBjb21tYW5kLCBvcHRpb25zIH07XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVPcHRpb25zKGNsaU9wdGlvbnM6IFBhcnRpYWw8Q2xpT3B0aW9ucz4pOiBDbGlPcHRpb25zIHtcbiAgLy8gTG9hZCBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbiAgY29uc3QgZG90ZW52ID0gcmVxdWlyZSgnZG90ZW52Jyk7XG4gIGRvdGVudi5jb25maWcoKTtcblxuICBjb25zdCBvcHRpb25zOiBDbGlPcHRpb25zID0ge1xuICAgIG1pZ3JhdGlvbnNEaXI6IGNsaU9wdGlvbnMubWlncmF0aW9uc0RpciB8fCBwcm9jZXNzLmVudi5NSUdSQVRJT05TX0RJUiB8fCAnJyxcbiAgICBob3N0OiBjbGlPcHRpb25zLmhvc3QgfHwgcHJvY2Vzcy5lbnYuREJfSE9TVCB8fCAnbG9jYWxob3N0JyxcbiAgICBwb3J0OiBjbGlPcHRpb25zLnBvcnQgfHwgcGFyc2VJbnQocHJvY2Vzcy5lbnYuREJfUE9SVCB8fCAnMTQzMycsIDEwKSxcbiAgICBkYXRhYmFzZTogY2xpT3B0aW9ucy5kYXRhYmFzZSB8fCBwcm9jZXNzLmVudi5EQl9EQVRBQkFTRSB8fCAnJyxcbiAgICB1c2VybmFtZTogY2xpT3B0aW9ucy51c2VybmFtZSB8fCBwcm9jZXNzLmVudi5EQl9VU0VSTkFNRSxcbiAgICBwYXNzd29yZDogY2xpT3B0aW9ucy5wYXNzd29yZCB8fCBwcm9jZXNzLmVudi5EQl9QQVNTV09SRCxcbiAgICBlbmNyeXB0OiBjbGlPcHRpb25zLmVuY3J5cHQgfHwgcHJvY2Vzcy5lbnYuREJfRU5DUllQVCA9PT0gJ3RydWUnLFxuICAgIHRydXN0U2VydmVyQ2VydGlmaWNhdGU6IGNsaU9wdGlvbnMudHJ1c3RTZXJ2ZXJDZXJ0aWZpY2F0ZSB8fCBmYWxzZSxcbiAgICBkcnlSdW46IGNsaU9wdGlvbnMuZHJ5UnVuIHx8IGZhbHNlLFxuICAgIHZlcmJvc2U6IGNsaU9wdGlvbnMudmVyYm9zZSA/PyB0cnVlLFxuICB9O1xuXG4gIC8vIFJlc29sdmUgcmVsYXRpdmUgcGF0aHNcbiAgaWYgKG9wdGlvbnMubWlncmF0aW9uc0RpciAmJiAhcGF0aC5pc0Fic29sdXRlKG9wdGlvbnMubWlncmF0aW9uc0RpcikpIHtcbiAgICBvcHRpb25zLm1pZ3JhdGlvbnNEaXIgPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgb3B0aW9ucy5taWdyYXRpb25zRGlyKTtcbiAgfVxuXG4gIHJldHVybiBvcHRpb25zO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZU9wdGlvbnMob3B0aW9uczogQ2xpT3B0aW9ucyk6IHZvaWQge1xuICBpZiAoIW9wdGlvbnMubWlncmF0aW9uc0Rpcikge1xuICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOiAtLW1pZ3JhdGlvbnMtZGlyIGlzIHJlcXVpcmVkJyk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgaWYgKCFvcHRpb25zLmRhdGFiYXNlKSB7XG4gICAgY29uc29sZS5lcnJvcignRXJyb3I6IC0tZGF0YWJhc2UgaXMgcmVxdWlyZWQnKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gY3JlYXRlRGF0YVNvdXJjZShvcHRpb25zOiBDbGlPcHRpb25zKTogUHJvbWlzZTxEYXRhU291cmNlPiB7XG4gIGNvbnN0IGRhdGFTb3VyY2UgPSBuZXcgRGF0YVNvdXJjZSh7XG4gICAgdHlwZTogJ21zc3FsJyxcbiAgICBob3N0OiBvcHRpb25zLmhvc3QsXG4gICAgcG9ydDogb3B0aW9ucy5wb3J0LFxuICAgIGRhdGFiYXNlOiBvcHRpb25zLmRhdGFiYXNlLFxuICAgIHVzZXJuYW1lOiBvcHRpb25zLnVzZXJuYW1lLFxuICAgIHBhc3N3b3JkOiBvcHRpb25zLnBhc3N3b3JkLFxuICAgIG9wdGlvbnM6IHtcbiAgICAgIGVuY3J5cHQ6IG9wdGlvbnMuZW5jcnlwdCB8fCBmYWxzZSxcbiAgICAgIHRydXN0U2VydmVyQ2VydGlmaWNhdGU6IG9wdGlvbnMudHJ1c3RTZXJ2ZXJDZXJ0aWZpY2F0ZSB8fCBmYWxzZSxcbiAgICB9LFxuICB9KTtcblxuICBhd2FpdCBkYXRhU291cmNlLmluaXRpYWxpemUoKTtcbiAgcmV0dXJuIGRhdGFTb3VyY2U7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1bkNvbW1hbmQob3B0aW9uczogQ2xpT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zb2xlLmxvZygnU3RhcnRpbmcgbWlncmF0aW9uIHJ1bm5lci4uLicpO1xuICBjb25zb2xlLmxvZyhgTWlncmF0aW9ucyBkaXJlY3Rvcnk6ICR7b3B0aW9ucy5taWdyYXRpb25zRGlyfWApO1xuICBjb25zb2xlLmxvZyhgRGF0YWJhc2U6ICR7b3B0aW9ucy5kYXRhYmFzZX1gKTtcbiAgY29uc29sZS5sb2coYEhvc3Q6ICR7b3B0aW9ucy5ob3N0fToke29wdGlvbnMucG9ydH1gKTtcbiAgY29uc29sZS5sb2coJycpO1xuXG4gIGNvbnN0IGRhdGFTb3VyY2UgPSBhd2FpdCBjcmVhdGVEYXRhU291cmNlKG9wdGlvbnMpO1xuICBjb25zb2xlLmxvZygnRGF0YWJhc2UgY29ubmVjdGlvbiBlc3RhYmxpc2hlZCcpO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgbWlncmF0aW9uQ29yZSA9IG5ldyBNaWdyYXRpb25Db3JlKGRhdGFTb3VyY2UsIHtcbiAgICAgIG1pZ3JhdGlvbnNEaXI6IG9wdGlvbnMubWlncmF0aW9uc0RpcixcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG1pZ3JhdGlvbkNvcmUucnVuTWlncmF0aW9ucyh7XG4gICAgICBkcnlSdW46IG9wdGlvbnMuZHJ5UnVuLFxuICAgICAgdmVyYm9zZTogb3B0aW9ucy52ZXJib3NlLFxuICAgIH0pO1xuXG4gICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICBjb25zb2xlLmxvZygnJyk7XG4gICAgICBjb25zb2xlLmxvZygnTWlncmF0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkhJyk7XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIGF3YWl0IGRhdGFTb3VyY2UuZGVzdHJveSgpO1xuICAgIGNvbnNvbGUubG9nKCdEYXRhYmFzZSBjb25uZWN0aW9uIGNsb3NlZCcpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN0YXR1c0NvbW1hbmQob3B0aW9uczogQ2xpT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zb2xlLmxvZygnQ2hlY2tpbmcgbWlncmF0aW9uIHN0YXR1cy4uLicpO1xuICBjb25zb2xlLmxvZyhgTWlncmF0aW9ucyBkaXJlY3Rvcnk6ICR7b3B0aW9ucy5taWdyYXRpb25zRGlyfWApO1xuICBjb25zb2xlLmxvZyhgRGF0YWJhc2U6ICR7b3B0aW9ucy5kYXRhYmFzZX1gKTtcbiAgY29uc29sZS5sb2coJycpO1xuXG4gIGNvbnN0IGRhdGFTb3VyY2UgPSBhd2FpdCBjcmVhdGVEYXRhU291cmNlKG9wdGlvbnMpO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgbWlncmF0aW9uQ29yZSA9IG5ldyBNaWdyYXRpb25Db3JlKGRhdGFTb3VyY2UsIHtcbiAgICAgIG1pZ3JhdGlvbnNEaXI6IG9wdGlvbnMubWlncmF0aW9uc0RpcixcbiAgICB9KTtcblxuICAgIGNvbnN0IHN0YXR1cyA9IGF3YWl0IG1pZ3JhdGlvbkNvcmUuZ2V0U3RhdHVzKCk7XG5cbiAgICBjb25zb2xlLmxvZyhgVG90YWwgbWlncmF0aW9uczogJHtzdGF0dXMudG90YWx9YCk7XG4gICAgY29uc29sZS5sb2coYEFwcGxpZWQ6ICR7c3RhdHVzLmFwcGxpZWR9YCk7XG4gICAgY29uc29sZS5sb2coYFBlbmRpbmc6ICR7c3RhdHVzLnBlbmRpbmd9YCk7XG5cbiAgICBpZiAoc3RhdHVzLnBlbmRpbmdGaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zb2xlLmxvZygnJyk7XG4gICAgICBjb25zb2xlLmxvZygnUGVuZGluZyBtaWdyYXRpb25zOicpO1xuICAgICAgc3RhdHVzLnBlbmRpbmdGaWxlcy5mb3JFYWNoKChmaWxlKSA9PiBjb25zb2xlLmxvZyhgICAtICR7ZmlsZX1gKSk7XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIGF3YWl0IGRhdGFTb3VyY2UuZGVzdHJveSgpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG1haW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGFyZ3MgPSBwcm9jZXNzLmFyZ3Yuc2xpY2UoMik7XG5cbiAgaWYgKGFyZ3MubGVuZ3RoID09PSAwIHx8IGFyZ3MuaW5jbHVkZXMoJy0taGVscCcpKSB7XG4gICAgcHJpbnRVc2FnZSgpO1xuICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgfVxuXG4gIGNvbnN0IHsgY29tbWFuZCwgb3B0aW9uczogY2xpT3B0aW9ucyB9ID0gcGFyc2VBcmdzKGFyZ3MpO1xuICBjb25zdCBvcHRpb25zID0gcmVzb2x2ZU9wdGlvbnMoY2xpT3B0aW9ucyk7XG5cbiAgaWYgKCFjb21tYW5kKSB7XG4gICAgY29uc29sZS5lcnJvcignRXJyb3I6IE5vIGNvbW1hbmQgc3BlY2lmaWVkLiBVc2UgXCJydW5cIiBvciBcInN0YXR1c1wiLicpO1xuICAgIHByaW50VXNhZ2UoKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICB2YWxpZGF0ZU9wdGlvbnMob3B0aW9ucyk7XG5cbiAgdHJ5IHtcbiAgICBzd2l0Y2ggKGNvbW1hbmQpIHtcbiAgICAgIGNhc2UgJ3J1bic6XG4gICAgICAgIGF3YWl0IHJ1bkNvbW1hbmQob3B0aW9ucyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc3RhdHVzJzpcbiAgICAgICAgYXdhaXQgc3RhdHVzQ29tbWFuZChvcHRpb25zKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBjb25zb2xlLmVycm9yKGBVbmtub3duIGNvbW1hbmQ6ICR7Y29tbWFuZH1gKTtcbiAgICAgICAgcHJpbnRVc2FnZSgpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoJ01pZ3JhdGlvbiBmYWlsZWQ6JywgZXJyb3IpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxufVxuXG5tYWluKCk7XG4iXX0=
|
|
273
|
+
//# sourceMappingURL=cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../bin/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export { MigrationModule } from './migration.module';
|
|
2
2
|
export { MigrationService } from './migration.service';
|
|
3
3
|
export { MigrationCore } from './migration-core';
|
|
4
|
-
export { MigrationModuleOptions, MigrationModuleAsyncOptions, MigrationModuleOptionsFactory, MigrationResult, MigrationRunOptions, MigrationCoreOptions, MIGRATION_MODULE_OPTIONS, } from './types';
|
|
4
|
+
export { MigrationModuleOptions, MigrationModuleAsyncOptions, MigrationModuleOptionsFactory, MigrationResult, MigrationRunOptions, MigrationCoreOptions, AppliedMigration, HashMismatchError, MIGRATION_MODULE_OPTIONS, } from './types';
|
package/dist/src/index.js
CHANGED
|
@@ -1,16 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.MIGRATION_MODULE_OPTIONS = exports.MigrationCore = exports.MigrationService = exports.MigrationModule = void 0;
|
|
4
|
-
// Module
|
|
3
|
+
exports.MIGRATION_MODULE_OPTIONS = exports.HashMismatchError = exports.MigrationCore = exports.MigrationService = exports.MigrationModule = void 0;
|
|
5
4
|
var migration_module_1 = require("./migration.module");
|
|
6
5
|
Object.defineProperty(exports, "MigrationModule", { enumerable: true, get: function () { return migration_module_1.MigrationModule; } });
|
|
7
|
-
// Service
|
|
8
6
|
var migration_service_1 = require("./migration.service");
|
|
9
7
|
Object.defineProperty(exports, "MigrationService", { enumerable: true, get: function () { return migration_service_1.MigrationService; } });
|
|
10
|
-
// Core (for standalone/CLI usage)
|
|
11
8
|
var migration_core_1 = require("./migration-core");
|
|
12
9
|
Object.defineProperty(exports, "MigrationCore", { enumerable: true, get: function () { return migration_core_1.MigrationCore; } });
|
|
13
|
-
// Types
|
|
14
10
|
var types_1 = require("./types");
|
|
11
|
+
Object.defineProperty(exports, "HashMismatchError", { enumerable: true, get: function () { return types_1.HashMismatchError; } });
|
|
15
12
|
Object.defineProperty(exports, "MIGRATION_MODULE_OPTIONS", { enumerable: true, get: function () { return types_1.MIGRATION_MODULE_OPTIONS; } });
|
|
16
|
-
//# sourceMappingURL=
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AACA,uDAAqD;AAA5C,mHAAA,eAAe,OAAA;AAGxB,yDAAuD;AAA9C,qHAAA,gBAAgB,OAAA;AAGzB,mDAAiD;AAAxC,+GAAA,aAAa,OAAA;AAGtB,iCAUiB;AAFf,0GAAA,iBAAiB,OAAA;AACjB,iHAAA,wBAAwB,OAAA"}
|
|
@@ -1,49 +1,34 @@
|
|
|
1
1
|
import { DataSource, QueryRunner } from 'typeorm';
|
|
2
|
-
import { MigrationCoreOptions, MigrationResult, MigrationRunOptions } from './types';
|
|
3
|
-
/**
|
|
4
|
-
* Core migration runner for SQL Server databases.
|
|
5
|
-
* Handles reading SQL migration files, tracking applied migrations,
|
|
6
|
-
* and executing pending migrations within transactions.
|
|
7
|
-
*/
|
|
2
|
+
import { MigrationCoreOptions, MigrationResult, MigrationRunOptions, AppliedMigration } from './types';
|
|
8
3
|
export declare class MigrationCore {
|
|
9
4
|
private readonly dataSource;
|
|
10
5
|
private readonly migrationsDir;
|
|
6
|
+
private readonly tableName;
|
|
11
7
|
constructor(dataSource: DataSource, options: MigrationCoreOptions);
|
|
12
|
-
/**
|
|
13
|
-
* Ensures the migrations tracking table exists in the database.
|
|
14
|
-
* Creates it if it doesn't exist.
|
|
15
|
-
*/
|
|
16
8
|
ensureMigrationsTable(): Promise<void>;
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* Gets all SQL migration files from the migrations directory.
|
|
23
|
-
* Files are sorted alphabetically (by convention, use numeric prefixes).
|
|
24
|
-
*/
|
|
9
|
+
calculateFileHash(filePath: string): string;
|
|
10
|
+
getAppliedMigrationNames(): Promise<string[]>;
|
|
11
|
+
getAppliedMigrations(): Promise<AppliedMigration[]>;
|
|
12
|
+
verifyMigrationHashes(): Promise<void>;
|
|
25
13
|
getMigrationFiles(): Promise<string[]>;
|
|
26
|
-
/**
|
|
27
|
-
* Runs a single migration file within the provided query runner.
|
|
28
|
-
* Handles SQL Server's GO batch separator.
|
|
29
|
-
*/
|
|
30
14
|
runSingleMigration(file: string, queryRunner: QueryRunner): Promise<void>;
|
|
31
|
-
|
|
32
|
-
* Runs all pending migrations.
|
|
33
|
-
* Each migration runs in its own transaction for isolation.
|
|
34
|
-
*/
|
|
15
|
+
private recordMigration;
|
|
35
16
|
runMigrations(options?: MigrationRunOptions): Promise<MigrationResult>;
|
|
36
|
-
/**
|
|
37
|
-
* Gets the list of pending migrations without applying them.
|
|
38
|
-
*/
|
|
39
17
|
getPendingMigrations(): Promise<string[]>;
|
|
40
|
-
/**
|
|
41
|
-
* Gets migration status information.
|
|
42
|
-
*/
|
|
43
18
|
getStatus(): Promise<{
|
|
44
19
|
total: number;
|
|
45
20
|
applied: number;
|
|
46
21
|
pending: number;
|
|
22
|
+
rerunnable: number;
|
|
47
23
|
pendingFiles: string[];
|
|
24
|
+
rerunnableFiles: string[];
|
|
25
|
+
hashMismatches: Array<{
|
|
26
|
+
name: string;
|
|
27
|
+
expectedHash: string;
|
|
28
|
+
actualHash: string;
|
|
29
|
+
}>;
|
|
30
|
+
missingFiles: string[];
|
|
48
31
|
}>;
|
|
32
|
+
private runPendingVersionedMigrations;
|
|
33
|
+
private runRerunnableScripts;
|
|
49
34
|
}
|