@pristine-ts/mysql-cli 2.0.16
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/LICENSE +201 -0
- package/dist/lib/cjs/commands/commands.js +25 -0
- package/dist/lib/cjs/commands/commands.js.map +1 -0
- package/dist/lib/cjs/commands/mysql-migrate-create.command-options.js +37 -0
- package/dist/lib/cjs/commands/mysql-migrate-create.command-options.js.map +1 -0
- package/dist/lib/cjs/commands/mysql-migrate-create.command.js +120 -0
- package/dist/lib/cjs/commands/mysql-migrate-create.command.js.map +1 -0
- package/dist/lib/cjs/commands/mysql-migrate-status.command-options.js +27 -0
- package/dist/lib/cjs/commands/mysql-migrate-status.command-options.js.map +1 -0
- package/dist/lib/cjs/commands/mysql-migrate-status.command.js +104 -0
- package/dist/lib/cjs/commands/mysql-migrate-status.command.js.map +1 -0
- package/dist/lib/cjs/commands/mysql-migrate-verify.command-options.js +27 -0
- package/dist/lib/cjs/commands/mysql-migrate-verify.command-options.js.map +1 -0
- package/dist/lib/cjs/commands/mysql-migrate-verify.command.js +74 -0
- package/dist/lib/cjs/commands/mysql-migrate-verify.command.js.map +1 -0
- package/dist/lib/cjs/commands/mysql-migrate.command-options.js +41 -0
- package/dist/lib/cjs/commands/mysql-migrate.command-options.js.map +1 -0
- package/dist/lib/cjs/commands/mysql-migrate.command.js +86 -0
- package/dist/lib/cjs/commands/mysql-migrate.command.js.map +1 -0
- package/dist/lib/cjs/enums/enums.js +18 -0
- package/dist/lib/cjs/enums/enums.js.map +1 -0
- package/dist/lib/cjs/enums/migration-state.enum.js +28 -0
- package/dist/lib/cjs/enums/migration-state.enum.js.map +1 -0
- package/dist/lib/cjs/errors/errors.js +22 -0
- package/dist/lib/cjs/errors/errors.js.map +1 -0
- package/dist/lib/cjs/errors/migration-checksum-mismatch.error.js +24 -0
- package/dist/lib/cjs/errors/migration-checksum-mismatch.error.js.map +1 -0
- package/dist/lib/cjs/errors/migration-duplicate-name.error.js +21 -0
- package/dist/lib/cjs/errors/migration-duplicate-name.error.js.map +1 -0
- package/dist/lib/cjs/errors/migration-execution.error.js +21 -0
- package/dist/lib/cjs/errors/migration-execution.error.js.map +1 -0
- package/dist/lib/cjs/errors/migration-invalid-name.error.js +20 -0
- package/dist/lib/cjs/errors/migration-invalid-name.error.js.map +1 -0
- package/dist/lib/cjs/errors/migration-orphaned-record.error.js +22 -0
- package/dist/lib/cjs/errors/migration-orphaned-record.error.js.map +1 -0
- package/dist/lib/cjs/interfaces/interfaces.js +18 -0
- package/dist/lib/cjs/interfaces/interfaces.js.map +1 -0
- package/dist/lib/cjs/interfaces/mysql-migration.interface.js +3 -0
- package/dist/lib/cjs/interfaces/mysql-migration.interface.js.map +1 -0
- package/dist/lib/cjs/managers/managers.js +22 -0
- package/dist/lib/cjs/managers/managers.js.map +1 -0
- package/dist/lib/cjs/managers/mysql-migration-checksum.manager.js +35 -0
- package/dist/lib/cjs/managers/mysql-migration-checksum.manager.js.map +1 -0
- package/dist/lib/cjs/managers/mysql-migration-record.manager.js +96 -0
- package/dist/lib/cjs/managers/mysql-migration-record.manager.js.map +1 -0
- package/dist/lib/cjs/managers/mysql-migration-runner.manager.js +96 -0
- package/dist/lib/cjs/managers/mysql-migration-runner.manager.js.map +1 -0
- package/dist/lib/cjs/managers/mysql-migration-scaffold.manager.js +217 -0
- package/dist/lib/cjs/managers/mysql-migration-scaffold.manager.js.map +1 -0
- package/dist/lib/cjs/managers/mysql-migration.manager.js +261 -0
- package/dist/lib/cjs/managers/mysql-migration.manager.js.map +1 -0
- package/dist/lib/cjs/models/migration-apply-entry.model.js +11 -0
- package/dist/lib/cjs/models/migration-apply-entry.model.js.map +1 -0
- package/dist/lib/cjs/models/migration-apply-result.model.js +18 -0
- package/dist/lib/cjs/models/migration-apply-result.model.js.map +1 -0
- package/dist/lib/cjs/models/migration-plan-entry.model.js +11 -0
- package/dist/lib/cjs/models/migration-plan-entry.model.js.map +1 -0
- package/dist/lib/cjs/models/migration-plan.model.js +24 -0
- package/dist/lib/cjs/models/migration-plan.model.js.map +1 -0
- package/dist/lib/cjs/models/migration-record.model.js +12 -0
- package/dist/lib/cjs/models/migration-record.model.js.map +1 -0
- package/dist/lib/cjs/models/models.js +22 -0
- package/dist/lib/cjs/models/models.js.map +1 -0
- package/dist/lib/cjs/mysql-cli.configuration-keys.js +20 -0
- package/dist/lib/cjs/mysql-cli.configuration-keys.js.map +1 -0
- package/dist/lib/cjs/mysql-cli.module.js +63 -0
- package/dist/lib/cjs/mysql-cli.module.js.map +1 -0
- package/dist/lib/cjs/mysql-cli.module.keyname.js +5 -0
- package/dist/lib/cjs/mysql-cli.module.keyname.js.map +1 -0
- package/dist/lib/cjs/tsconfig.cjs.tsbuildinfo +1 -0
- package/dist/lib/esm/commands/commands.js +9 -0
- package/dist/lib/esm/commands/commands.js.map +1 -0
- package/dist/lib/esm/commands/mysql-migrate-create.command-options.js +33 -0
- package/dist/lib/esm/commands/mysql-migrate-create.command-options.js.map +1 -0
- package/dist/lib/esm/commands/mysql-migrate-create.command.js +114 -0
- package/dist/lib/esm/commands/mysql-migrate-create.command.js.map +1 -0
- package/dist/lib/esm/commands/mysql-migrate-status.command-options.js +23 -0
- package/dist/lib/esm/commands/mysql-migrate-status.command-options.js.map +1 -0
- package/dist/lib/esm/commands/mysql-migrate-status.command.js +101 -0
- package/dist/lib/esm/commands/mysql-migrate-status.command.js.map +1 -0
- package/dist/lib/esm/commands/mysql-migrate-verify.command-options.js +23 -0
- package/dist/lib/esm/commands/mysql-migrate-verify.command-options.js.map +1 -0
- package/dist/lib/esm/commands/mysql-migrate-verify.command.js +71 -0
- package/dist/lib/esm/commands/mysql-migrate-verify.command.js.map +1 -0
- package/dist/lib/esm/commands/mysql-migrate.command-options.js +37 -0
- package/dist/lib/esm/commands/mysql-migrate.command-options.js.map +1 -0
- package/dist/lib/esm/commands/mysql-migrate.command.js +83 -0
- package/dist/lib/esm/commands/mysql-migrate.command.js.map +1 -0
- package/dist/lib/esm/enums/enums.js +2 -0
- package/dist/lib/esm/enums/enums.js.map +1 -0
- package/dist/lib/esm/enums/migration-state.enum.js +25 -0
- package/dist/lib/esm/enums/migration-state.enum.js.map +1 -0
- package/dist/lib/esm/errors/errors.js +6 -0
- package/dist/lib/esm/errors/errors.js.map +1 -0
- package/dist/lib/esm/errors/migration-checksum-mismatch.error.js +20 -0
- package/dist/lib/esm/errors/migration-checksum-mismatch.error.js.map +1 -0
- package/dist/lib/esm/errors/migration-duplicate-name.error.js +17 -0
- package/dist/lib/esm/errors/migration-duplicate-name.error.js.map +1 -0
- package/dist/lib/esm/errors/migration-execution.error.js +17 -0
- package/dist/lib/esm/errors/migration-execution.error.js.map +1 -0
- package/dist/lib/esm/errors/migration-invalid-name.error.js +16 -0
- package/dist/lib/esm/errors/migration-invalid-name.error.js.map +1 -0
- package/dist/lib/esm/errors/migration-orphaned-record.error.js +18 -0
- package/dist/lib/esm/errors/migration-orphaned-record.error.js.map +1 -0
- package/dist/lib/esm/interfaces/interfaces.js +2 -0
- package/dist/lib/esm/interfaces/interfaces.js.map +1 -0
- package/dist/lib/esm/interfaces/mysql-migration.interface.js +2 -0
- package/dist/lib/esm/interfaces/mysql-migration.interface.js.map +1 -0
- package/dist/lib/esm/managers/managers.js +6 -0
- package/dist/lib/esm/managers/managers.js.map +1 -0
- package/dist/lib/esm/managers/mysql-migration-checksum.manager.js +32 -0
- package/dist/lib/esm/managers/mysql-migration-checksum.manager.js.map +1 -0
- package/dist/lib/esm/managers/mysql-migration-record.manager.js +93 -0
- package/dist/lib/esm/managers/mysql-migration-record.manager.js.map +1 -0
- package/dist/lib/esm/managers/mysql-migration-runner.manager.js +93 -0
- package/dist/lib/esm/managers/mysql-migration-runner.manager.js.map +1 -0
- package/dist/lib/esm/managers/mysql-migration-scaffold.manager.js +211 -0
- package/dist/lib/esm/managers/mysql-migration-scaffold.manager.js.map +1 -0
- package/dist/lib/esm/managers/mysql-migration.manager.js +258 -0
- package/dist/lib/esm/managers/mysql-migration.manager.js.map +1 -0
- package/dist/lib/esm/models/migration-apply-entry.model.js +7 -0
- package/dist/lib/esm/models/migration-apply-entry.model.js.map +1 -0
- package/dist/lib/esm/models/migration-apply-result.model.js +14 -0
- package/dist/lib/esm/models/migration-apply-result.model.js.map +1 -0
- package/dist/lib/esm/models/migration-plan-entry.model.js +7 -0
- package/dist/lib/esm/models/migration-plan-entry.model.js.map +1 -0
- package/dist/lib/esm/models/migration-plan.model.js +20 -0
- package/dist/lib/esm/models/migration-plan.model.js.map +1 -0
- package/dist/lib/esm/models/migration-record.model.js +8 -0
- package/dist/lib/esm/models/migration-record.model.js.map +1 -0
- package/dist/lib/esm/models/models.js +6 -0
- package/dist/lib/esm/models/models.js.map +1 -0
- package/dist/lib/esm/mysql-cli.configuration-keys.js +17 -0
- package/dist/lib/esm/mysql-cli.configuration-keys.js.map +1 -0
- package/dist/lib/esm/mysql-cli.module.js +46 -0
- package/dist/lib/esm/mysql-cli.module.js.map +1 -0
- package/dist/lib/esm/mysql-cli.module.keyname.js +2 -0
- package/dist/lib/esm/mysql-cli.module.keyname.js.map +1 -0
- package/dist/lib/esm/tsconfig.tsbuildinfo +1 -0
- package/dist/types/commands/commands.d.ts +8 -0
- package/dist/types/commands/mysql-migrate-create.command-options.d.ts +12 -0
- package/dist/types/commands/mysql-migrate-create.command.d.ts +32 -0
- package/dist/types/commands/mysql-migrate-status.command-options.d.ts +8 -0
- package/dist/types/commands/mysql-migrate-status.command.d.ts +25 -0
- package/dist/types/commands/mysql-migrate-verify.command-options.d.ts +8 -0
- package/dist/types/commands/mysql-migrate-verify.command.d.ts +23 -0
- package/dist/types/commands/mysql-migrate.command-options.d.ts +14 -0
- package/dist/types/commands/mysql-migrate.command.d.ts +23 -0
- package/dist/types/enums/enums.d.ts +1 -0
- package/dist/types/enums/migration-state.enum.d.ts +23 -0
- package/dist/types/errors/errors.d.ts +5 -0
- package/dist/types/errors/migration-checksum-mismatch.error.d.ts +14 -0
- package/dist/types/errors/migration-duplicate-name.error.d.ts +11 -0
- package/dist/types/errors/migration-execution.error.d.ts +12 -0
- package/dist/types/errors/migration-invalid-name.error.d.ts +10 -0
- package/dist/types/errors/migration-orphaned-record.error.d.ts +12 -0
- package/dist/types/interfaces/interfaces.d.ts +1 -0
- package/dist/types/interfaces/mysql-migration.interface.d.ts +40 -0
- package/dist/types/managers/managers.d.ts +5 -0
- package/dist/types/managers/mysql-migration-checksum.manager.d.ts +15 -0
- package/dist/types/managers/mysql-migration-record.manager.d.ts +22 -0
- package/dist/types/managers/mysql-migration-runner.manager.d.ts +16 -0
- package/dist/types/managers/mysql-migration-scaffold.manager.d.ts +40 -0
- package/dist/types/managers/mysql-migration.manager.d.ts +41 -0
- package/dist/types/models/migration-apply-entry.model.d.ts +9 -0
- package/dist/types/models/migration-apply-result.model.d.ts +14 -0
- package/dist/types/models/migration-plan-entry.model.d.ts +15 -0
- package/dist/types/models/migration-plan.model.d.ts +14 -0
- package/dist/types/models/migration-record.model.d.ts +12 -0
- package/dist/types/models/models.d.ts +5 -0
- package/dist/types/mysql-cli.configuration-keys.d.ts +29 -0
- package/dist/types/mysql-cli.module.d.ts +10 -0
- package/dist/types/mysql-cli.module.keyname.d.ts +1 -0
- package/package.json +75 -0
- package/readme.md +195 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration-duplicate-name.error.js","sourceRoot":"","sources":["../../../../src/errors/migration-duplicate-name.error.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,OAAO,2BAA4B,SAAQ,KAAK;IACpD,YACkB,aAAqB,EACrB,mBAA2B;QAE3C,KAAK,CACH,sDAAsD,aAAa,QAAQ;YAC3E,WAAW,mBAAmB,gDAAgD;YAC9E,yBAAyB,CAC1B,CAAC;QAPc,kBAAa,GAAb,aAAa,CAAQ;QACrB,wBAAmB,GAAnB,mBAAmB,CAAQ;QAQ3C,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,2BAA2B,CAAC,SAAS,CAAC,CAAC;IACrE,CAAC;CACF"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Thrown when mysql2 raises an error while executing a migration's SQL. Carries the
|
|
3
|
+
* failing migration name and wraps the underlying error for context. The `apply`
|
|
4
|
+
* orchestrator catches this, halts further migrations, and reports it as the
|
|
5
|
+
* `failedMigration` entry on the result.
|
|
6
|
+
*/
|
|
7
|
+
export class MigrationExecutionError extends Error {
|
|
8
|
+
constructor(migrationName, configUniqueKeyname, cause) {
|
|
9
|
+
super(`Migration "${migrationName}" failed against config "${configUniqueKeyname}": ` +
|
|
10
|
+
`${cause.message}`);
|
|
11
|
+
this.migrationName = migrationName;
|
|
12
|
+
this.configUniqueKeyname = configUniqueKeyname;
|
|
13
|
+
this.cause = cause;
|
|
14
|
+
Object.setPrototypeOf(this, MigrationExecutionError.prototype);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=migration-execution.error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration-execution.error.js","sourceRoot":"","sources":["../../../../src/errors/migration-execution.error.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,OAAO,uBAAwB,SAAQ,KAAK;IAChD,YACkB,aAAqB,EACrB,mBAA2B,EAC3B,KAAY;QAE5B,KAAK,CACH,cAAc,aAAa,4BAA4B,mBAAmB,KAAK;YAC/E,GAAG,KAAK,CAAC,OAAO,EAAE,CACnB,CAAC;QAPc,kBAAa,GAAb,aAAa,CAAQ;QACrB,wBAAmB,GAAnB,mBAAmB,CAAQ;QAC3B,UAAK,GAAL,KAAK,CAAO;QAO5B,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,uBAAuB,CAAC,SAAS,CAAC,CAAC;IACjE,CAAC;CACF"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Thrown when a registered migration's `name` doesn't satisfy the
|
|
3
|
+
* `<NN>-<kebab-slug>` regex (`/^\d+-[a-z0-9-]+$/`). Indicates a hand-edited or
|
|
4
|
+
* misnamed migration class. The fix is to rename to the convention and update the
|
|
5
|
+
* `name` field.
|
|
6
|
+
*/
|
|
7
|
+
export class MigrationInvalidNameError extends Error {
|
|
8
|
+
constructor(migrationName) {
|
|
9
|
+
super(`Migration name "${migrationName}" does not match the required pattern ` +
|
|
10
|
+
`<NN>-<kebab-slug> (e.g. "01-init", "02-add-users-table"). Rename the ` +
|
|
11
|
+
`class file and update its \`name\` field to match.`);
|
|
12
|
+
this.migrationName = migrationName;
|
|
13
|
+
Object.setPrototypeOf(this, MigrationInvalidNameError.prototype);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=migration-invalid-name.error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration-invalid-name.error.js","sourceRoot":"","sources":["../../../../src/errors/migration-invalid-name.error.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,OAAO,yBAA0B,SAAQ,KAAK;IAClD,YACkB,aAAqB;QAErC,KAAK,CACH,mBAAmB,aAAa,wCAAwC;YACxE,uEAAuE;YACvE,oDAAoD,CACrD,CAAC;QANc,kBAAa,GAAb,aAAa,CAAQ;QAQrC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,yBAAyB,CAAC,SAAS,CAAC,CAAC;IACnE,CAAC;CACF"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Thrown by `verify` (and by `apply` without `--force`) when the bookkeeping table
|
|
3
|
+
* holds a record for a migration that no longer exists in the registered DI graph.
|
|
4
|
+
* Indicates a deleted migration class, a renamed `name` field, or running against
|
|
5
|
+
* the wrong config. The fix is to restore the class, fix the name, or run against
|
|
6
|
+
* the correct config.
|
|
7
|
+
*/
|
|
8
|
+
export class MigrationOrphanedRecordError extends Error {
|
|
9
|
+
constructor(migrationName, configUniqueKeyname) {
|
|
10
|
+
super(`Database has a record for migration "${migrationName}" against config ` +
|
|
11
|
+
`"${configUniqueKeyname}" but no matching class is registered. Restore the ` +
|
|
12
|
+
`class, check the \`name\` field, or target a different config.`);
|
|
13
|
+
this.migrationName = migrationName;
|
|
14
|
+
this.configUniqueKeyname = configUniqueKeyname;
|
|
15
|
+
Object.setPrototypeOf(this, MigrationOrphanedRecordError.prototype);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=migration-orphaned-record.error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration-orphaned-record.error.js","sourceRoot":"","sources":["../../../../src/errors/migration-orphaned-record.error.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,OAAO,4BAA6B,SAAQ,KAAK;IACrD,YACkB,aAAqB,EACrB,mBAA2B;QAE3C,KAAK,CACH,wCAAwC,aAAa,mBAAmB;YACxE,IAAI,mBAAmB,qDAAqD;YAC5E,gEAAgE,CACjE,CAAC;QAPc,kBAAa,GAAb,aAAa,CAAQ;QACrB,wBAAmB,GAAnB,mBAAmB,CAAQ;QAQ3C,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,4BAA4B,CAAC,SAAS,CAAC,CAAC;IACtE,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../../../src/interfaces/interfaces.ts"],"names":[],"mappings":"AAAA,cAAc,6BAA6B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mysql-migration.interface.js","sourceRoot":"","sources":["../../../../src/interfaces/mysql-migration.interface.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export * from "./mysql-migration-checksum.manager";
|
|
2
|
+
export * from "./mysql-migration-record.manager";
|
|
3
|
+
export * from "./mysql-migration-runner.manager";
|
|
4
|
+
export * from "./mysql-migration-scaffold.manager";
|
|
5
|
+
export * from "./mysql-migration.manager";
|
|
6
|
+
//# sourceMappingURL=managers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"managers.js","sourceRoot":"","sources":["../../../../src/managers/managers.ts"],"names":[],"mappings":"AAAA,cAAc,oCAAoC,CAAC;AACnD,cAAc,kCAAkC,CAAC;AACjD,cAAc,kCAAkC,CAAC;AACjD,cAAc,oCAAoC,CAAC;AACnD,cAAc,2BAA2B,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { createHash } from "crypto";
|
|
8
|
+
import { injectable } from "tsyringe";
|
|
9
|
+
/**
|
|
10
|
+
* Computes the stable sha256 hex digest of a migration's SQL string. Used both at
|
|
11
|
+
* apply time (to record what was applied) and at status/verify time (to detect
|
|
12
|
+
* drift). Canonicalization strips trivial editor noise — trailing whitespace per
|
|
13
|
+
* line, CRLF endings, leading/trailing whitespace — so identical SQL with different
|
|
14
|
+
* line-ending or final-newline conventions hashes the same.
|
|
15
|
+
*
|
|
16
|
+
* Whitespace *between* tokens is preserved: changing `SELECT *` to `SELECT *`
|
|
17
|
+
* does change the checksum. That's deliberate — anything beyond formatting noise
|
|
18
|
+
* is a real edit, and the user should know.
|
|
19
|
+
*/
|
|
20
|
+
let MysqlMigrationChecksumManager = class MysqlMigrationChecksumManager {
|
|
21
|
+
compute(sql) {
|
|
22
|
+
return createHash("sha256").update(this.canonicalize(sql)).digest("hex");
|
|
23
|
+
}
|
|
24
|
+
canonicalize(sql) {
|
|
25
|
+
return sql.replace(/\r\n/g, "\n").replace(/[ \t]+\n/g, "\n").trim();
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
MysqlMigrationChecksumManager = __decorate([
|
|
29
|
+
injectable()
|
|
30
|
+
], MysqlMigrationChecksumManager);
|
|
31
|
+
export { MysqlMigrationChecksumManager };
|
|
32
|
+
//# sourceMappingURL=mysql-migration-checksum.manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mysql-migration-checksum.manager.js","sourceRoot":"","sources":["../../../../src/managers/mysql-migration-checksum.manager.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,QAAQ,CAAC;AAClC,OAAO,EAAC,UAAU,EAAC,MAAM,UAAU,CAAC;AAEpC;;;;;;;;;;GAUG;AAEI,IAAM,6BAA6B,GAAnC,MAAM,6BAA6B;IACjC,OAAO,CAAC,GAAW;QACxB,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC3E,CAAC;IAEO,YAAY,CAAC,GAAW;QAC9B,OAAO,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;IACtE,CAAC;CACF,CAAA;AARY,6BAA6B;IADzC,UAAU,EAAE;GACA,6BAA6B,CAQzC"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
11
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
12
|
+
};
|
|
13
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
14
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
15
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
16
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
17
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
18
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
19
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
20
|
+
});
|
|
21
|
+
};
|
|
22
|
+
import { inject, injectable } from "tsyringe";
|
|
23
|
+
import { MigrationRecord } from "../models/migration-record.model";
|
|
24
|
+
/**
|
|
25
|
+
* Owns the `pristine_migrations` bookkeeping table — creates it on demand, reads
|
|
26
|
+
* the applied rows back, and inserts a new row when a migration finishes.
|
|
27
|
+
*
|
|
28
|
+
* Uses the regular `MysqlClient` pool (no `multipleStatements` needed for any of
|
|
29
|
+
* these queries — they're single statements with parameter placeholders).
|
|
30
|
+
*/
|
|
31
|
+
let MysqlMigrationRecordManager = class MysqlMigrationRecordManager {
|
|
32
|
+
constructor(mysqlClient, logHandler) {
|
|
33
|
+
this.mysqlClient = mysqlClient;
|
|
34
|
+
this.logHandler = logHandler;
|
|
35
|
+
}
|
|
36
|
+
ensureTable(configUniqueKeyname, tableName) {
|
|
37
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
38
|
+
const sql = `CREATE TABLE IF NOT EXISTS \`${tableName}\` (
|
|
39
|
+
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
|
40
|
+
filename VARCHAR(255) NOT NULL,
|
|
41
|
+
checksum CHAR(64) NOT NULL,
|
|
42
|
+
applied_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
|
|
43
|
+
execution_time_ms INT UNSIGNED NULL,
|
|
44
|
+
PRIMARY KEY (id),
|
|
45
|
+
UNIQUE KEY uniq_filename (filename)
|
|
46
|
+
)`;
|
|
47
|
+
yield this.mysqlClient.executeSql(configUniqueKeyname, sql, []);
|
|
48
|
+
this.logHandler.debug("MysqlMigrationRecordManager: ensured bookkeeping table.", {
|
|
49
|
+
highlights: { tableName, configUniqueKeyname },
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
listApplied(configUniqueKeyname, tableName) {
|
|
54
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
55
|
+
const sql = `SELECT id, filename, checksum, applied_at, execution_time_ms
|
|
56
|
+
FROM \`${tableName}\`
|
|
57
|
+
ORDER BY filename ASC`;
|
|
58
|
+
const rows = yield this.mysqlClient.executeSql(configUniqueKeyname, sql, []);
|
|
59
|
+
return rows.map((row) => {
|
|
60
|
+
var _a;
|
|
61
|
+
const record = new MigrationRecord();
|
|
62
|
+
record.id = row.id;
|
|
63
|
+
record.filename = row.filename;
|
|
64
|
+
record.checksum = row.checksum;
|
|
65
|
+
record.appliedAt = row.applied_at instanceof Date ? row.applied_at : new Date(row.applied_at);
|
|
66
|
+
record.executionTimeMs = (_a = row.execution_time_ms) !== null && _a !== void 0 ? _a : undefined;
|
|
67
|
+
return record;
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
recordApplied(configUniqueKeyname, tableName, record) {
|
|
72
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
73
|
+
const sql = `INSERT INTO \`${tableName}\` (filename, checksum, execution_time_ms)
|
|
74
|
+
VALUES (?, ?, ?)`;
|
|
75
|
+
yield this.mysqlClient.executeSql(configUniqueKeyname, sql, [
|
|
76
|
+
record.filename,
|
|
77
|
+
record.checksum,
|
|
78
|
+
record.executionTimeMs,
|
|
79
|
+
]);
|
|
80
|
+
this.logHandler.debug("MysqlMigrationRecordManager: recorded applied migration.", {
|
|
81
|
+
highlights: { tableName, configUniqueKeyname, filename: record.filename },
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
MysqlMigrationRecordManager = __decorate([
|
|
87
|
+
injectable(),
|
|
88
|
+
__param(0, inject("MysqlClientInterface")),
|
|
89
|
+
__param(1, inject("LogHandlerInterface")),
|
|
90
|
+
__metadata("design:paramtypes", [Object, Object])
|
|
91
|
+
], MysqlMigrationRecordManager);
|
|
92
|
+
export { MysqlMigrationRecordManager };
|
|
93
|
+
//# sourceMappingURL=mysql-migration-record.manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mysql-migration-record.manager.js","sourceRoot":"","sources":["../../../../src/managers/mysql-migration-record.manager.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,EAAC,MAAM,EAAE,UAAU,EAAC,MAAM,UAAU,CAAC;AAG5C,OAAO,EAAC,eAAe,EAAC,MAAM,kCAAkC,CAAC;AAEjE;;;;;;GAMG;AAEI,IAAM,2BAA2B,GAAjC,MAAM,2BAA2B;IACtC,YACmD,WAAiC,EAClC,UAA+B;QAD9B,gBAAW,GAAX,WAAW,CAAsB;QAClC,eAAU,GAAV,UAAU,CAAqB;IAEjF,CAAC;IAEY,WAAW,CAAC,mBAA2B,EAAE,SAAiB;;YACrE,MAAM,GAAG,GAAG,gCAAgC,SAAS;;;;;;;;MAQnD,CAAC;YAEH,MAAM,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,mBAAmB,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;YAEhE,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,yDAAyD,EAAE;gBAC/E,UAAU,EAAE,EAAC,SAAS,EAAE,mBAAmB,EAAC;aAC7C,CAAC,CAAC;QACL,CAAC;KAAA;IAEY,WAAW,CAAC,mBAA2B,EAAE,SAAiB;;YACrE,MAAM,GAAG,GAAG;0BACU,SAAS;uCACI,CAAC;YAEpC,MAAM,IAAI,GAML,MAAM,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,mBAAmB,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;YAErE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;;gBACtB,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;gBACrC,MAAM,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC;gBACnB,MAAM,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;gBAC/B,MAAM,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;gBAC/B,MAAM,CAAC,SAAS,GAAG,GAAG,CAAC,UAAU,YAAY,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;gBAC9F,MAAM,CAAC,eAAe,GAAG,MAAA,GAAG,CAAC,iBAAiB,mCAAI,SAAS,CAAC;gBAC5D,OAAO,MAAM,CAAC;YAChB,CAAC,CAAC,CAAC;QACL,CAAC;KAAA;IAEY,aAAa,CACxB,mBAA2B,EAC3B,SAAiB,EACjB,MAAuE;;YAEvE,MAAM,GAAG,GAAG,iBAAiB,SAAS;kCACR,CAAC;YAE/B,MAAM,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,mBAAmB,EAAE,GAAG,EAAE;gBAC1D,MAAM,CAAC,QAAQ;gBACf,MAAM,CAAC,QAAQ;gBACf,MAAM,CAAC,eAAe;aACvB,CAAC,CAAC;YAEH,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,0DAA0D,EAAE;gBAChF,UAAU,EAAE,EAAC,SAAS,EAAE,mBAAmB,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAC;aACxE,CAAC,CAAC;QACL,CAAC;KAAA;CACF,CAAA;AAnEY,2BAA2B;IADvC,UAAU,EAAE;IAGR,WAAA,MAAM,CAAC,sBAAsB,CAAC,CAAA;IAC9B,WAAA,MAAM,CAAC,qBAAqB,CAAC,CAAA;;GAHrB,2BAA2B,CAmEvC"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
11
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
12
|
+
};
|
|
13
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
14
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
15
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
16
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
17
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
18
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
19
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
20
|
+
});
|
|
21
|
+
};
|
|
22
|
+
import { inject, injectable, injectAll } from "tsyringe";
|
|
23
|
+
import { createConnection } from "mysql2/promise";
|
|
24
|
+
import { MigrationExecutionError } from "../errors/migration-execution.error";
|
|
25
|
+
/**
|
|
26
|
+
* Executes a single migration's SQL string against a target database. Opens a
|
|
27
|
+
* one-shot mysql2 connection with `multipleStatements: true` for the call and
|
|
28
|
+
* closes it in `finally` — does NOT touch the cached `MysqlClient` pool because
|
|
29
|
+
* flipping `multipleStatements` on the pool would leak to every other consumer
|
|
30
|
+
* of the client. A dedicated connection per migration is the cleanest isolation.
|
|
31
|
+
*/
|
|
32
|
+
let MysqlMigrationRunner = class MysqlMigrationRunner {
|
|
33
|
+
constructor(mysqlConfigProviders, logHandler) {
|
|
34
|
+
this.mysqlConfigProviders = mysqlConfigProviders;
|
|
35
|
+
this.logHandler = logHandler;
|
|
36
|
+
}
|
|
37
|
+
execute(configUniqueKeyname, migrationName, sql) {
|
|
38
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
39
|
+
const config = yield this.resolveConfig(configUniqueKeyname);
|
|
40
|
+
const connection = yield createConnection({
|
|
41
|
+
host: config.host,
|
|
42
|
+
port: config.port,
|
|
43
|
+
user: config.user,
|
|
44
|
+
password: config.password,
|
|
45
|
+
database: config.database,
|
|
46
|
+
debug: config.debug,
|
|
47
|
+
multipleStatements: true,
|
|
48
|
+
});
|
|
49
|
+
const startedAt = Date.now();
|
|
50
|
+
try {
|
|
51
|
+
yield connection.query(sql);
|
|
52
|
+
const executionTimeMs = Date.now() - startedAt;
|
|
53
|
+
this.logHandler.debug("MysqlMigrationRunner: migration executed successfully.", {
|
|
54
|
+
highlights: { configUniqueKeyname, migrationName, executionTimeMs },
|
|
55
|
+
});
|
|
56
|
+
return executionTimeMs;
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
this.logHandler.error("MysqlMigrationRunner: migration execution failed.", {
|
|
60
|
+
highlights: { configUniqueKeyname, migrationName, error },
|
|
61
|
+
});
|
|
62
|
+
throw new MigrationExecutionError(migrationName, configUniqueKeyname, error);
|
|
63
|
+
}
|
|
64
|
+
finally {
|
|
65
|
+
try {
|
|
66
|
+
yield connection.end();
|
|
67
|
+
}
|
|
68
|
+
catch (closeError) {
|
|
69
|
+
this.logHandler.warning("MysqlMigrationRunner: failed to close migration connection cleanly.", {
|
|
70
|
+
highlights: { configUniqueKeyname, migrationName, error: closeError },
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
resolveConfig(configUniqueKeyname) {
|
|
77
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
78
|
+
const provider = this.mysqlConfigProviders.find((p) => p.supports(configUniqueKeyname));
|
|
79
|
+
if (provider === undefined) {
|
|
80
|
+
throw new Error(`No MysqlConfigProvider supports the unique keyname "${configUniqueKeyname}".`);
|
|
81
|
+
}
|
|
82
|
+
return provider.getMysqlConfig(configUniqueKeyname);
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
MysqlMigrationRunner = __decorate([
|
|
87
|
+
injectable(),
|
|
88
|
+
__param(0, injectAll("MysqlConfigProviderInterface")),
|
|
89
|
+
__param(1, inject("LogHandlerInterface")),
|
|
90
|
+
__metadata("design:paramtypes", [Array, Object])
|
|
91
|
+
], MysqlMigrationRunner);
|
|
92
|
+
export { MysqlMigrationRunner };
|
|
93
|
+
//# sourceMappingURL=mysql-migration-runner.manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mysql-migration-runner.manager.js","sourceRoot":"","sources":["../../../../src/managers/mysql-migration-runner.manager.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,EAAC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAC,MAAM,UAAU,CAAC;AACvD,OAAO,EAAC,gBAAgB,EAAC,MAAM,gBAAgB,CAAC;AAGhD,OAAO,EAAC,uBAAuB,EAAC,MAAM,qCAAqC,CAAC;AAE5E;;;;;;GAMG;AAEI,IAAM,oBAAoB,GAA1B,MAAM,oBAAoB;IAC/B,YAC8D,oBAAoD,EAChE,UAA+B;QADnB,yBAAoB,GAApB,oBAAoB,CAAgC;QAChE,eAAU,GAAV,UAAU,CAAqB;IAEjF,CAAC;IAEY,OAAO,CAAC,mBAA2B,EAAE,aAAqB,EAAE,GAAW;;YAClF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,mBAAmB,CAAC,CAAC;YAE7D,MAAM,UAAU,GAAG,MAAM,gBAAgB,CAAC;gBACxC,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,kBAAkB,EAAE,IAAI;aACzB,CAAC,CAAC;YAEH,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAE7B,IAAI,CAAC;gBACH,MAAM,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC5B,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;gBAE/C,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,wDAAwD,EAAE;oBAC9E,UAAU,EAAE,EAAC,mBAAmB,EAAE,aAAa,EAAE,eAAe,EAAC;iBAClE,CAAC,CAAC;gBAEH,OAAO,eAAe,CAAC;YACzB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,mDAAmD,EAAE;oBACzE,UAAU,EAAE,EAAC,mBAAmB,EAAE,aAAa,EAAE,KAAK,EAAC;iBACxD,CAAC,CAAC;gBAEH,MAAM,IAAI,uBAAuB,CAAC,aAAa,EAAE,mBAAmB,EAAE,KAAc,CAAC,CAAC;YACxF,CAAC;oBAAS,CAAC;gBACT,IAAI,CAAC;oBACH,MAAM,UAAU,CAAC,GAAG,EAAE,CAAC;gBACzB,CAAC;gBAAC,OAAO,UAAU,EAAE,CAAC;oBACpB,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,qEAAqE,EAAE;wBAC7F,UAAU,EAAE,EAAC,mBAAmB,EAAE,aAAa,EAAE,KAAK,EAAE,UAAU,EAAC;qBACpE,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;KAAA;IAEa,aAAa,CAAC,mBAA2B;;YACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC,CAAC;YAExF,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,MAAM,IAAI,KAAK,CAAC,uDAAuD,mBAAmB,IAAI,CAAC,CAAC;YAClG,CAAC;YAED,OAAO,QAAQ,CAAC,cAAc,CAAC,mBAAmB,CAAC,CAAC;QACtD,CAAC;KAAA;CACF,CAAA;AAzDY,oBAAoB;IADhC,UAAU,EAAE;IAGR,WAAA,SAAS,CAAC,8BAA8B,CAAC,CAAA;IACzC,WAAA,MAAM,CAAC,qBAAqB,CAAC,CAAA;;GAHrB,oBAAoB,CAyDhC"}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
11
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
12
|
+
};
|
|
13
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
14
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
15
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
16
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
17
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
18
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
19
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
20
|
+
});
|
|
21
|
+
};
|
|
22
|
+
var MysqlMigrationScaffoldManager_1;
|
|
23
|
+
import path from "path";
|
|
24
|
+
import { promises as fsp } from "fs";
|
|
25
|
+
import { inject, injectable } from "tsyringe";
|
|
26
|
+
/**
|
|
27
|
+
* Generates a new `.sql-migrations.ts` file and optionally splices its registration
|
|
28
|
+
* into a marker-annotated migrations module file. Pure dev-time scaffolding — never
|
|
29
|
+
* touches the database, never resolved at runtime in production.
|
|
30
|
+
*
|
|
31
|
+
* Numbering: scans the target directory for files matching `<digits>-<slug>.sql-migrations.ts`,
|
|
32
|
+
* picks `max + 1`, and pads to the current width (default 2 digits, never narrows).
|
|
33
|
+
* If you cross 99 you'll want to rename existing files to 3-digit padding once; the
|
|
34
|
+
* scaffold respects whichever width it finds.
|
|
35
|
+
*/
|
|
36
|
+
let MysqlMigrationScaffoldManager = MysqlMigrationScaffoldManager_1 = class MysqlMigrationScaffoldManager {
|
|
37
|
+
constructor(logHandler) {
|
|
38
|
+
this.logHandler = logHandler;
|
|
39
|
+
}
|
|
40
|
+
create(options) {
|
|
41
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
42
|
+
const slug = this.slugify(options.descriptiveName);
|
|
43
|
+
if (slug.length === 0) {
|
|
44
|
+
throw new Error(`Cannot scaffold a migration from an empty/symbol-only name: "${options.descriptiveName}".`);
|
|
45
|
+
}
|
|
46
|
+
yield fsp.mkdir(options.scaffoldPath, { recursive: true });
|
|
47
|
+
const existingPrefixes = yield this.listExistingNumberPrefixes(options.scaffoldPath);
|
|
48
|
+
const width = this.resolveWidth(existingPrefixes);
|
|
49
|
+
const nextNumber = (existingPrefixes.length === 0 ? 0 : Math.max(...existingPrefixes)) + 1;
|
|
50
|
+
const paddedNumber = nextNumber.toString().padStart(width, "0");
|
|
51
|
+
const migrationName = `${paddedNumber}-${slug}`;
|
|
52
|
+
const fileName = `${migrationName}.sql-migrations.ts`;
|
|
53
|
+
const filePath = path.join(options.scaffoldPath, fileName);
|
|
54
|
+
if (yield this.exists(filePath)) {
|
|
55
|
+
throw new Error(`Refusing to overwrite existing migration file at ${filePath}.`);
|
|
56
|
+
}
|
|
57
|
+
const className = this.buildClassName(slug, paddedNumber);
|
|
58
|
+
const fileContent = this.renderMigrationFile(className, migrationName, options.configUniqueKeynames);
|
|
59
|
+
yield fsp.writeFile(filePath, fileContent, "utf8");
|
|
60
|
+
let barrelUpdated = false;
|
|
61
|
+
if (options.barrelPath !== undefined) {
|
|
62
|
+
barrelUpdated = yield this.tryUpdateBarrel({
|
|
63
|
+
barrelPath: options.barrelPath,
|
|
64
|
+
scaffoldPath: options.scaffoldPath,
|
|
65
|
+
migrationFileName: fileName,
|
|
66
|
+
className,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
return { filePath, className, migrationName, barrelUpdated };
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
renderMigrationFile(className, migrationName, configUniqueKeynames) {
|
|
73
|
+
const configLine = configUniqueKeynames === undefined || configUniqueKeynames.length === 0
|
|
74
|
+
? ` // readonly configUniqueKeynames = ["__default__"]; // uncomment to scope to specific configs`
|
|
75
|
+
: ` readonly configUniqueKeynames = ${JSON.stringify(configUniqueKeynames)};`;
|
|
76
|
+
return `import {injectable} from "tsyringe";
|
|
77
|
+
import {tag} from "@pristine-ts/common";
|
|
78
|
+
import {MysqlMigrationInterface} from "@pristine-ts/mysql-cli";
|
|
79
|
+
|
|
80
|
+
@tag("MysqlMigrationInterface")
|
|
81
|
+
@injectable()
|
|
82
|
+
export class ${className} implements MysqlMigrationInterface {
|
|
83
|
+
readonly name = "${migrationName}";
|
|
84
|
+
${configLine}
|
|
85
|
+
|
|
86
|
+
up(): string {
|
|
87
|
+
return \`
|
|
88
|
+
-- write your SQL here
|
|
89
|
+
\`;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
`;
|
|
93
|
+
}
|
|
94
|
+
buildClassName(slug, paddedNumber) {
|
|
95
|
+
const pascal = slug
|
|
96
|
+
.split("-")
|
|
97
|
+
.filter((part) => part.length > 0)
|
|
98
|
+
.map((part) => part.charAt(0).toUpperCase() + part.slice(1))
|
|
99
|
+
.join("");
|
|
100
|
+
return `${pascal}_${paddedNumber}`;
|
|
101
|
+
}
|
|
102
|
+
slugify(input) {
|
|
103
|
+
return input
|
|
104
|
+
.toLowerCase()
|
|
105
|
+
.replace(/[^a-z0-9]+/g, "-")
|
|
106
|
+
.replace(/^-+|-+$/g, "");
|
|
107
|
+
}
|
|
108
|
+
tryUpdateBarrel(options) {
|
|
109
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
110
|
+
if (!(yield this.exists(options.barrelPath))) {
|
|
111
|
+
this.logHandler.warning("MysqlMigrationScaffoldManager: barrel file not found; skipping auto-edit.", {
|
|
112
|
+
highlights: { barrelPath: options.barrelPath },
|
|
113
|
+
});
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
const original = yield fsp.readFile(options.barrelPath, "utf8");
|
|
117
|
+
if (original.indexOf(MysqlMigrationScaffoldManager_1.ImportsStart) === -1 ||
|
|
118
|
+
original.indexOf(MysqlMigrationScaffoldManager_1.ImportsEnd) === -1 ||
|
|
119
|
+
original.indexOf(MysqlMigrationScaffoldManager_1.ServicesStart) === -1 ||
|
|
120
|
+
original.indexOf(MysqlMigrationScaffoldManager_1.ServicesEnd) === -1) {
|
|
121
|
+
this.logHandler.warning("MysqlMigrationScaffoldManager: marker comments not found in barrel; skipping auto-edit.", {
|
|
122
|
+
highlights: { barrelPath: options.barrelPath },
|
|
123
|
+
});
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
126
|
+
const relativeImport = this.relativeImportSpecifier(options.barrelPath, options.scaffoldPath, options.migrationFileName);
|
|
127
|
+
const importLine = `import {${options.className}} from "${relativeImport}";`;
|
|
128
|
+
const serviceLine = `${options.className},`;
|
|
129
|
+
const withImport = this.insertSortedBetween(original, MysqlMigrationScaffoldManager_1.ImportsStart, MysqlMigrationScaffoldManager_1.ImportsEnd, importLine);
|
|
130
|
+
const withService = this.insertSortedBetween(withImport, MysqlMigrationScaffoldManager_1.ServicesStart, MysqlMigrationScaffoldManager_1.ServicesEnd, serviceLine);
|
|
131
|
+
yield fsp.writeFile(options.barrelPath, withService, "utf8");
|
|
132
|
+
return true;
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
insertSortedBetween(source, startMarker, endMarker, newLine) {
|
|
136
|
+
var _a;
|
|
137
|
+
const lines = source.split("\n");
|
|
138
|
+
const startIndex = lines.findIndex((line) => line.trim() === startMarker);
|
|
139
|
+
const endIndex = lines.findIndex((line) => line.trim() === endMarker);
|
|
140
|
+
if (startIndex === -1 || endIndex === -1 || endIndex <= startIndex) {
|
|
141
|
+
return source;
|
|
142
|
+
}
|
|
143
|
+
const indent = ((_a = lines[startIndex].match(/^\s*/)) !== null && _a !== void 0 ? _a : [""])[0];
|
|
144
|
+
const existing = lines.slice(startIndex + 1, endIndex).filter((line) => line.trim().length > 0);
|
|
145
|
+
if (existing.some((line) => line.trim() === newLine.trim())) {
|
|
146
|
+
return source;
|
|
147
|
+
}
|
|
148
|
+
const merged = [...existing, `${indent}${newLine}`].sort((a, b) => a.trim().localeCompare(b.trim()));
|
|
149
|
+
return [
|
|
150
|
+
...lines.slice(0, startIndex + 1),
|
|
151
|
+
...merged,
|
|
152
|
+
...lines.slice(endIndex),
|
|
153
|
+
].join("\n");
|
|
154
|
+
}
|
|
155
|
+
relativeImportSpecifier(barrelPath, scaffoldPath, migrationFileName) {
|
|
156
|
+
const barrelDir = path.dirname(path.resolve(barrelPath));
|
|
157
|
+
const migrationAbs = path.resolve(scaffoldPath, migrationFileName);
|
|
158
|
+
let rel = path.relative(barrelDir, migrationAbs).replace(/\\/g, "/");
|
|
159
|
+
rel = rel.replace(/\.ts$/, "");
|
|
160
|
+
if (rel.startsWith(".") === false) {
|
|
161
|
+
rel = `./${rel}`;
|
|
162
|
+
}
|
|
163
|
+
return rel;
|
|
164
|
+
}
|
|
165
|
+
listExistingNumberPrefixes(dir) {
|
|
166
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
167
|
+
if (!(yield this.exists(dir))) {
|
|
168
|
+
return [];
|
|
169
|
+
}
|
|
170
|
+
const entries = yield fsp.readdir(dir);
|
|
171
|
+
const prefixes = [];
|
|
172
|
+
for (const entry of entries) {
|
|
173
|
+
const match = MysqlMigrationScaffoldManager_1.FilenamePattern.exec(entry);
|
|
174
|
+
if (match) {
|
|
175
|
+
prefixes.push(parseInt(match[1], 10));
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return prefixes;
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
resolveWidth(existingPrefixes) {
|
|
182
|
+
if (existingPrefixes.length === 0) {
|
|
183
|
+
return 2;
|
|
184
|
+
}
|
|
185
|
+
const maxDigits = Math.max(...existingPrefixes.map((n) => n.toString().length));
|
|
186
|
+
return Math.max(2, maxDigits);
|
|
187
|
+
}
|
|
188
|
+
exists(filePath) {
|
|
189
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
190
|
+
try {
|
|
191
|
+
yield fsp.access(filePath);
|
|
192
|
+
return true;
|
|
193
|
+
}
|
|
194
|
+
catch (_a) {
|
|
195
|
+
return false;
|
|
196
|
+
}
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
};
|
|
200
|
+
MysqlMigrationScaffoldManager.FilenamePattern = /^(\d+)-([a-z0-9-]+)\.sql-migrations\.ts$/;
|
|
201
|
+
MysqlMigrationScaffoldManager.ImportsStart = "// <pristine:migration-imports:start>";
|
|
202
|
+
MysqlMigrationScaffoldManager.ImportsEnd = "// <pristine:migration-imports:end>";
|
|
203
|
+
MysqlMigrationScaffoldManager.ServicesStart = "// <pristine:migration-services:start>";
|
|
204
|
+
MysqlMigrationScaffoldManager.ServicesEnd = "// <pristine:migration-services:end>";
|
|
205
|
+
MysqlMigrationScaffoldManager = MysqlMigrationScaffoldManager_1 = __decorate([
|
|
206
|
+
injectable(),
|
|
207
|
+
__param(0, inject("LogHandlerInterface")),
|
|
208
|
+
__metadata("design:paramtypes", [Object])
|
|
209
|
+
], MysqlMigrationScaffoldManager);
|
|
210
|
+
export { MysqlMigrationScaffoldManager };
|
|
211
|
+
//# sourceMappingURL=mysql-migration-scaffold.manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mysql-migration-scaffold.manager.js","sourceRoot":"","sources":["../../../../src/managers/mysql-migration-scaffold.manager.ts"],"names":[],"mappings":"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"}
|