@prairielearn/migrations 1.2.2 → 2.0.1
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/CHANGELOG.md +26 -0
- package/README.md +11 -0
- package/dist/batched-migrations/batched-migrations-runner.js +1 -1
- package/dist/batched-migrations/batched-migrations-runner.js.map +1 -1
- package/dist/load-migrations.d.ts +1 -0
- package/dist/load-migrations.js +27 -1
- package/dist/load-migrations.js.map +1 -1
- package/dist/load-migrations.test.js +11 -0
- package/dist/load-migrations.test.js.map +1 -1
- package/dist/migrations/migrations.js +9 -1
- package/dist/migrations/migrations.js.map +1 -1
- package/package.json +7 -7
- package/src/batched-migrations/batched-migrations-runner.ts +1 -1
- package/src/load-migrations.test.ts +18 -1
- package/src/load-migrations.ts +29 -0
- package/src/migrations/migrations.ts +9 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,31 @@
|
|
|
1
1
|
# @prairielearn/migrations
|
|
2
2
|
|
|
3
|
+
## 2.0.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 8fd47d928: Upgrade all dependencies
|
|
8
|
+
- Updated dependencies [8fd47d928]
|
|
9
|
+
- @prairielearn/named-locks@1.3.3
|
|
10
|
+
- @prairielearn/postgres@1.7.1
|
|
11
|
+
- @prairielearn/logger@1.0.1
|
|
12
|
+
- @prairielearn/error@1.0.2
|
|
13
|
+
|
|
14
|
+
## 2.0.0
|
|
15
|
+
|
|
16
|
+
### Major Changes
|
|
17
|
+
|
|
18
|
+
- 765dc616e: SQL migrations are now run inside a transaction by default
|
|
19
|
+
|
|
20
|
+
If you need to disable this behavior, you can add an annotation comment to the top of the migration file:
|
|
21
|
+
|
|
22
|
+
```sql
|
|
23
|
+
-- prairielearn:migrations NO TRANSACTION
|
|
24
|
+
CREATE INDEX CONCURRENTLY ...
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Note that migrations implemented as JavaScript are not run in transactions by default. Transactions should be manually used as appropriate.
|
|
28
|
+
|
|
3
29
|
## 1.2.2
|
|
4
30
|
|
|
5
31
|
### Patch Changes
|
package/README.md
CHANGED
|
@@ -24,6 +24,17 @@ module.exports = async function () {
|
|
|
24
24
|
};
|
|
25
25
|
```
|
|
26
26
|
|
|
27
|
+
`.sql` migrations are run inside a transaction by default. If your migration cannot run inside a transaction (for instance, if it uses `CREATE INDEX CONCURRENTLY`), you can add a special annotation comment to the file:
|
|
28
|
+
|
|
29
|
+
```sql
|
|
30
|
+
-- prairielearn:migrations NO TRANSACTION
|
|
31
|
+
CREATE INDEX CONCURRENTLY ...;
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
When running without a transaction, it is recommended that the migration only consist of a single statement so that the database isn't left in an inconsistent state.
|
|
35
|
+
|
|
36
|
+
`.js`/`.ts` migrations are not automatically run inside a transaction. If transactional DDL is required, a transaction should be manually wrapped in a transaction.
|
|
37
|
+
|
|
27
38
|
### Batched migrations
|
|
28
39
|
|
|
29
40
|
Batched migrations are useful for when one needs to make changes to many rows within a table, for instance backfilling a new column from existing data. While one could technically do this with the schema migrations machinery, that has a number of disadvantages:
|
|
@@ -173,7 +173,7 @@ class BatchedMigrationsRunner extends node_events_1.default {
|
|
|
173
173
|
}
|
|
174
174
|
}
|
|
175
175
|
async getOrStartMigration() {
|
|
176
|
-
return (0, named_locks_1.
|
|
176
|
+
return (0, named_locks_1.tryWithLock)(this.lockName, {}, async () => {
|
|
177
177
|
let migration = await (0, postgres_1.queryValidatedZeroOrOneRow)(sql.select_running_migration, { project: this.options.project }, batched_migration_1.BatchedMigrationRowSchema);
|
|
178
178
|
if (!migration) {
|
|
179
179
|
migration = await (0, postgres_1.queryValidatedZeroOrOneRow)(sql.start_next_pending_migration, { project: this.options.project }, batched_migration_1.BatchedMigrationRowSchema);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"batched-migrations-runner.js","sourceRoot":"","sources":["../../src/batched-migrations/batched-migrations-runner.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"batched-migrations-runner.js","sourceRoot":"","sources":["../../src/batched-migrations/batched-migrations-runner.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,8DAAuC;AACvC,0DAA6B;AAC7B,mDAA2D;AAC3D,qDAAkF;AAClF,2DAAoE;AAEpE,wDAA6F;AAC7F,2DAS6B;AAC7B,yEAAoE;AAEpE,MAAM,GAAG,GAAG,IAAA,uBAAY,EAAC,UAAU,CAAC,CAAC;AAErC,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAC7B,MAAM,kBAAkB,GAAG,IAAK,CAAC;AACjC,MAAM,wBAAwB,GAAG,KAAM,CAAC;AACxC,MAAM,yBAAyB,GAAG,KAAM,CAAC;AACzC,MAAM,UAAU,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAgBlD,MAAa,uBAAwB,SAAQ,qBAAY;IAOvD,YAAY,OAAsC;QAChD,KAAK,EAAE,CAAC;QALF,YAAO,GAAG,KAAK,CAAC;QAChB,mBAAc,GAA2B,IAAI,CAAC;QAC9C,oBAAe,GAAG,IAAI,eAAe,EAAE,CAAC;QAYxC,sBAAiB,GAAG,KAAK,IAAI,EAAE;YACrC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;gBACxB,IAAI,CAAC,cAAc,GAAG,MAAM,IAAA,0DAAwC,EAClE,IAAI,CAAC,OAAO,CAAC,WAAW,EACxB,UAAU,CACX,CAAC;aACH;YACD,OAAO,IAAI,CAAC,cAAc,CAAC;QAC7B,CAAC,CAAC;QAhBA,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,QAAQ,GAAG,sBAAsB,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;IAC/D,CAAC;IAEO,oBAAoB,CAAC,SAAiB;QAC5C,OAAO,GAAG,IAAI,CAAC,QAAQ,IAAI,SAAS,EAAE,CAAC;IACzC,CAAC;IAYO,KAAK,CAAC,yBAAyB,CAAC,UAAkB;QACxD,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAE3C,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACtD,MAAM,aAAa,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC;QAC5E,OAAO,aAAa,IAAI,IAAI,CAAC;IAC/B,CAAC;IAED;;;;;OAKG;IACK,KAAK,CAAC,2BAA2B,CAAC,aAA4B;QACpE,6DAA6D;QAC7D,MAAM,mBAAmB,GAAG,mBAAI,CAAC,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;QACvF,MAAM,eAAe,GAAG,yBAAa,mBAAmB,uCAAC,CAAC;QAE1D,MAAM,uBAAuB,GAAG,eAAe,CAAC,OAAyC,CAAC;QAC1F,IAAA,0DAAsC,EAAC,uBAAuB,CAAC,CAAC;QAChE,OAAO,uBAAuB,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,uBAAuB,CAAC,UAAkB;QAC9C,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,yBAAyB,CAAC,UAAU,CAAC,CAAC;QACvE,IAAI,CAAC,aAAa,EAAE;YAClB,MAAM,IAAI,KAAK,CAAC,qCAAqC,UAAU,EAAE,CAAC,CAAC;SACpE;QAED,MAAM,uBAAuB,GAAG,MAAM,IAAI,CAAC,2BAA2B,CAAC,aAAa,CAAC,CAAC;QACtF,MAAM,mBAAmB,GAAG,MAAM,uBAAuB,CAAC,aAAa,EAAE,CAAC;QAE1E,uEAAuE;QACvE,qDAAqD;QACrD,MAAM,MAAM,GACV,mBAAmB,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;QAE7D,MAAM,QAAQ,GAAG,MAAM,CAAC,mBAAmB,CAAC,GAAG,IAAI,iBAAiB,CAAC,CAAC;QACtE,MAAM,QAAQ,GAAG,MAAM,CAAC,mBAAmB,CAAC,GAAG,IAAI,QAAQ,CAAC,CAAC;QAC7D,MAAM,SAAS,GAAG,mBAAmB,CAAC,SAAS,IAAI,kBAAkB,CAAC;QAEtE,MAAM,IAAA,0CAAsB,EAAC;YAC3B,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO;YAC7B,QAAQ,EAAE,aAAa,CAAC,QAAQ;YAChC,SAAS,EAAE,aAAa,CAAC,SAAS;YAClC,UAAU,EAAE,SAAS;YACrB,SAAS,EAAE,QAAQ;YACnB,SAAS,EAAE,QAAQ;YACnB,MAAM;SACP,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,wBAAwB,CAAC,UAAkB,EAAE,OAAyC;QAC1F,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAE3C,IAAI,SAAS,GAAG,MAAM,IAAA,sDAAkC,EAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAE1F,IAAI,SAAS,CAAC,MAAM,KAAK,WAAW;YAAE,OAAO;QAE7C,2EAA2E;QAC3E,IAAI,SAAS,CAAC,MAAM,KAAK,YAAY,EAAE;YACrC,SAAS,GAAG,MAAM,IAAA,gDAA4B,EAAC,SAAS,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;SAC5E;QAED,MAAM,IAAA,wBAAU,EAAC,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,KAAK,IAAI,EAAE;YACrF,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,yBAAyB,CAAC,UAAU,CAAC,CAAC;YACvE,IAAI,CAAC,aAAa,EAAE;gBAClB,MAAM,IAAI,KAAK,CAAC,qCAAqC,UAAU,EAAE,CAAC,CAAC;aACpE;YACD,MAAM,uBAAuB,GAAG,MAAM,IAAI,CAAC,2BAA2B,CAAC,aAAa,CAAC,CAAC;YAEtF,MAAM,MAAM,GAAG,IAAI,iDAAsB,CAAC,SAAS,EAAE,uBAAuB,EAAE;gBAC5E,kDAAkD;gBAClD,WAAW,EAAE,OAAO,EAAE,WAAW,IAAI,IAAI;aAC1C,CAAC,CAAC;YAEH,uEAAuE;YACvE,2BAA2B;YAC3B,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC;QACrB,CAAC,CAAC,CAAC;QAEH,SAAS,GAAG,MAAM,IAAA,sDAAkC,EAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAEtF,IAAI,SAAS,CAAC,MAAM,KAAK,WAAW;YAAE,OAAO;QAE7C,MAAM,IAAI,KAAK,CACb,8CAA8C,UAAU,4CAA4C,SAAS,CAAC,MAAM,IAAI,CACzH,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,UAAwC,EAAE;QAC9C,IAAI,IAAI,CAAC,OAAO,EAAE;YAChB,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;SAC/D;QAED,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,cAAc,EAAE,eAAe,EAAgC;QAC1E,cAAc,KAAK,wBAAwB,CAAC;QAC5C,eAAe,KAAK,yBAAyB,CAAC;QAE9C,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,OAAO,IAAI,CAAC,OAAO,EAAE;YACnB,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,EAAE;gBACvC,uEAAuE;gBACvE,mBAAmB;gBACnB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;gBACrB,OAAO;aACR;YAED,IAAI,OAAO,GAAG,KAAK,CAAC;YACpB,IAAI;gBACF,OAAO,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC;aACvD;YAAC,OAAO,GAAG,EAAE;gBACZ,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;aACzB;YAED,0EAA0E;YAC1E,0EAA0E;YAC1E,yBAAyB;YACzB,IAAI,CAAC,OAAO,EAAE;gBACZ,qEAAqE;gBACrE,4BAA4B;gBAC5B,IAAI;oBACF,MAAM,IAAA,qBAAK,EAAC,eAAe,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC,CAAC;iBACzF;gBAAC,OAAO,GAAG,EAAE;oBACZ,oEAAoE;oBACpE,oEAAoE;oBACpE,gCAAgC;oBAChC,SAAS;iBACV;aACF;SACF;IACH,CAAC;IAEO,KAAK,CAAC,mBAAmB;QAC/B,OAAO,IAAA,yBAAW,EAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE;YAC/C,IAAI,SAAS,GAAG,MAAM,IAAA,qCAA0B,EAC9C,GAAG,CAAC,wBAAwB,EAC5B,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EACjC,6CAAyB,CAC1B,CAAC;YAEF,IAAI,CAAC,SAAS,EAAE;gBACd,SAAS,GAAG,MAAM,IAAA,qCAA0B,EAC1C,GAAG,CAAC,4BAA4B,EAChC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EACjC,6CAAyB,CAC1B,CAAC;aACH;YAED,OAAO,SAAS,CAAC;QACnB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,UAAkB;QACvC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,mBAAmB,EAAE,CAAC;QACnD,IAAI,CAAC,SAAS,EAAE;YACd,mCAAmC;YACnC,OAAO,KAAK,CAAC;SACd;QAED,uEAAuE;QACvE,+CAA+C;QAC/C,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,yBAAyB,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAChF,IAAI,CAAC,aAAa,EAAE;YAClB,OAAO,KAAK,CAAC;SACd;QAED,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,MAAM,IAAA,yBAAW,EACf,IAAI,CAAC,oBAAoB,CAAC,aAAa,CAAC,SAAS,CAAC,EAClD,EAAE,SAAS,EAAE,IAAI,EAAE,EACnB,KAAK,IAAI,EAAE;YACT,OAAO,GAAG,IAAI,CAAC;YACf,MAAM,uBAAuB,GAAG,MAAM,IAAI,CAAC,2BAA2B,CAAC,aAAa,CAAC,CAAC;YAEtF,MAAM,MAAM,GAAG,IAAI,iDAAsB,CAAC,SAAS,EAAE,uBAAuB,CAAC,CAAC;YAE9E,IAAI;gBACF,MAAM,MAAM,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;aACvE;YAAC,OAAO,GAAG,EAAE;gBACZ,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;aACzB;QACH,CAAC,CACF,CAAC;QAEF,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;QAE7B,sCAAsC;QACtC,OAAO,IAAI,CAAC,OAAO,EAAE;YACnB,MAAM,IAAA,qBAAK,EAAC,IAAI,CAAC,CAAC;SACnB;IACH,CAAC;CACF;AAnOD,0DAmOC;AAED,IAAI,MAAM,GAAmC,IAAI,CAAC;AAElD,SAAS,YAAY,CACnB,MAAsC;IAEtC,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;AACrE,CAAC;AAED,SAAgB,qBAAqB,CAAC,OAAsC;IAC1E,IAAI,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IACtE,MAAM,GAAG,IAAI,uBAAuB,CAAC,OAAO,CAAC,CAAC;IAC9C,OAAO,MAAM,CAAC;AAChB,CAAC;AAJD,sDAIC;AAED,SAAgB,sBAAsB,CAAC,UAAwC,EAAE;IAC/E,YAAY,CAAC,MAAM,CAAC,CAAC;IACrB,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACtB,OAAO,MAAM,CAAC;AAChB,CAAC;AAJD,wDAIC;AAEM,KAAK,UAAU,qBAAqB;IACzC,YAAY,CAAC,MAAM,CAAC,CAAC;IACrB,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;IACpB,MAAM,GAAG,IAAI,CAAC;AAChB,CAAC;AAJD,sDAIC;AAED;;;;;;;;;;GAUG;AACI,KAAK,UAAU,uBAAuB,CAAC,UAAkB;IAC9D,YAAY,CAAC,MAAM,CAAC,CAAC;IACrB,MAAM,MAAM,CAAC,uBAAuB,CAAC,UAAU,CAAC,CAAC;AACnD,CAAC;AAHD,0DAGC;AAED;;;;;;;GAOG;AACI,KAAK,UAAU,wBAAwB,CAC5C,UAAkB,EAClB,OAAyC;IAEzC,YAAY,CAAC,MAAM,CAAC,CAAC;IACrB,MAAM,MAAM,CAAC,wBAAwB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;AAC7D,CAAC;AAND,4DAMC"}
|
|
@@ -6,3 +6,4 @@ export interface MigrationFile {
|
|
|
6
6
|
export declare function readAndValidateMigrationsFromDirectory(dir: string, extensions: string[]): Promise<MigrationFile[]>;
|
|
7
7
|
export declare function readAndValidateMigrationsFromDirectories(directories: string[], extensions: string[]): Promise<MigrationFile[]>;
|
|
8
8
|
export declare function sortMigrationFiles(migrationFiles: MigrationFile[]): MigrationFile[];
|
|
9
|
+
export declare function parseAnnotations(contents: string): Set<string>;
|
package/dist/load-migrations.js
CHANGED
|
@@ -3,13 +3,24 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.sortMigrationFiles = exports.readAndValidateMigrationsFromDirectories = exports.readAndValidateMigrationsFromDirectory = void 0;
|
|
6
|
+
exports.parseAnnotations = exports.sortMigrationFiles = exports.readAndValidateMigrationsFromDirectories = exports.readAndValidateMigrationsFromDirectory = void 0;
|
|
7
7
|
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
8
8
|
/**
|
|
9
9
|
* Timestamp prefixes will be of the form `YYYYMMDDHHMMSS`, which will have 14 digits.
|
|
10
10
|
* If this code is still around in the year 10000... good luck.
|
|
11
11
|
*/
|
|
12
12
|
const MIGRATION_FILENAME_REGEX = /^([0-9]{14})_.+\.[a-z]+/;
|
|
13
|
+
/**
|
|
14
|
+
* Annotations are expressed via the following:
|
|
15
|
+
*
|
|
16
|
+
* -- prairielearn:migrations NO TRANSACTION
|
|
17
|
+
*
|
|
18
|
+
* Currently, `NO TRANSACTION` is the only supported annotation. This will run
|
|
19
|
+
* the migration without a transaction. This is useful for migrations that use
|
|
20
|
+
* features that can't be run in transactions, such as `CREATE INDEX CONCURRENTLY`.
|
|
21
|
+
*/
|
|
22
|
+
const ANNOTATION_PREFIX = '-- prairielearn:migrations';
|
|
23
|
+
const ALLOWED_ANNOTATIONS = new Set(['NO TRANSACTION']);
|
|
13
24
|
async function readAndValidateMigrationsFromDirectory(dir, extensions) {
|
|
14
25
|
const migrationFiles = (await fs_extra_1.default.readdir(dir)).filter((m) => extensions.some((e) => m.endsWith(e)));
|
|
15
26
|
const migrations = migrationFiles.map((mf) => {
|
|
@@ -57,4 +68,19 @@ function sortMigrationFiles(migrationFiles) {
|
|
|
57
68
|
});
|
|
58
69
|
}
|
|
59
70
|
exports.sortMigrationFiles = sortMigrationFiles;
|
|
71
|
+
function parseAnnotations(contents) {
|
|
72
|
+
const lines = contents.split('\n');
|
|
73
|
+
const annotations = new Set();
|
|
74
|
+
lines.forEach((line) => {
|
|
75
|
+
if (line.startsWith(ANNOTATION_PREFIX)) {
|
|
76
|
+
const annotation = line.slice(ANNOTATION_PREFIX.length).trim();
|
|
77
|
+
if (!ALLOWED_ANNOTATIONS.has(annotation)) {
|
|
78
|
+
throw new Error(`Invalid annotation: ${annotation}`);
|
|
79
|
+
}
|
|
80
|
+
annotations.add(annotation);
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
return annotations;
|
|
84
|
+
}
|
|
85
|
+
exports.parseAnnotations = parseAnnotations;
|
|
60
86
|
//# sourceMappingURL=load-migrations.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load-migrations.js","sourceRoot":"","sources":["../src/load-migrations.ts"],"names":[],"mappings":";;;;;;AAAA,wDAA0B;AAE1B;;;GAGG;AACH,MAAM,wBAAwB,GAAG,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"load-migrations.js","sourceRoot":"","sources":["../src/load-migrations.ts"],"names":[],"mappings":"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"}
|
|
@@ -91,5 +91,16 @@ describe('load-migrations', () => {
|
|
|
91
91
|
]);
|
|
92
92
|
});
|
|
93
93
|
});
|
|
94
|
+
describe('parseAnnotations', () => {
|
|
95
|
+
it('parses a NO TRANSACTION annotation', () => {
|
|
96
|
+
const annotations = (0, load_migrations_1.parseAnnotations)('-- prairielearn:migrations NO TRANSACTION');
|
|
97
|
+
chai_1.assert.deepEqual(annotations, new Set(['NO TRANSACTION']));
|
|
98
|
+
});
|
|
99
|
+
it('throws an error for an invalid annotation', () => {
|
|
100
|
+
chai_1.assert.throws(() => {
|
|
101
|
+
(0, load_migrations_1.parseAnnotations)('-- prairielearn:migrations INVALID');
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
});
|
|
94
105
|
});
|
|
95
106
|
//# sourceMappingURL=load-migrations.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load-migrations.test.js","sourceRoot":"","sources":["../src/load-migrations.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,6CAAoC;AACpC,wEAA8C;AAC9C,gDAAwB;AACxB,8DAA8B;AAC9B,wDAA0B;AAE1B,
|
|
1
|
+
{"version":3,"file":"load-migrations.test.js","sourceRoot":"","sources":["../src/load-migrations.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -130,8 +130,16 @@ async function initWithLock(directories, project) {
|
|
|
130
130
|
const migrationPath = path_1.default.join(directory, filename);
|
|
131
131
|
if (filename.endsWith('.sql')) {
|
|
132
132
|
const migrationSql = await fs_extra_1.default.readFile(migrationPath, 'utf8');
|
|
133
|
+
const annotations = (0, load_migrations_1.parseAnnotations)(migrationSql);
|
|
133
134
|
try {
|
|
134
|
-
|
|
135
|
+
if (annotations.has('NO TRANSACTION')) {
|
|
136
|
+
await sqldb.queryAsync(migrationSql, {});
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
await sqldb.runInTransactionAsync(async () => {
|
|
140
|
+
await sqldb.queryAsync(migrationSql, {});
|
|
141
|
+
});
|
|
142
|
+
}
|
|
135
143
|
}
|
|
136
144
|
catch (err) {
|
|
137
145
|
error.addData(err, { sqlFile: filename });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../src/migrations/migrations.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,wDAA0B;AAC1B,gDAAwB;AAExB,sEAAwD;AACxD,iDAA8C;AAC9C,8DAAgD;AAChD,2DAA6C;AAE7C,
|
|
1
|
+
{"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../src/migrations/migrations.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prairielearn/migrations",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.1",
|
|
4
4
|
"main": "./dist/index.js",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -16,17 +16,17 @@
|
|
|
16
16
|
"@prairielearn/tsconfig": "^0.0.0",
|
|
17
17
|
"@types/fs-extra": "^11.0.1",
|
|
18
18
|
"@types/mocha": "^10.0.1",
|
|
19
|
-
"@types/node": "^18.16.
|
|
19
|
+
"@types/node": "^18.16.16",
|
|
20
20
|
"mocha": "^10.2.0",
|
|
21
21
|
"ts-node": "^10.9.1",
|
|
22
|
-
"typescript": "^5.
|
|
22
|
+
"typescript": "^5.1.3",
|
|
23
23
|
"typescript-cp": "^0.1.8"
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
|
-
"@prairielearn/error": "^1.0.
|
|
27
|
-
"@prairielearn/logger": "^1.0.
|
|
28
|
-
"@prairielearn/named-locks": "^1.3.
|
|
29
|
-
"@prairielearn/postgres": "^1.7.
|
|
26
|
+
"@prairielearn/error": "^1.0.2",
|
|
27
|
+
"@prairielearn/logger": "^1.0.1",
|
|
28
|
+
"@prairielearn/named-locks": "^1.3.3",
|
|
29
|
+
"@prairielearn/postgres": "^1.7.1",
|
|
30
30
|
"fs-extra": "^11.1.1",
|
|
31
31
|
"serialize-error": "^8.1.0",
|
|
32
32
|
"zod": "^3.21.4"
|
|
@@ -204,7 +204,7 @@ export class BatchedMigrationsRunner extends EventEmitter {
|
|
|
204
204
|
}
|
|
205
205
|
|
|
206
206
|
private async getOrStartMigration(): Promise<BatchedMigrationRow | null> {
|
|
207
|
-
return
|
|
207
|
+
return tryWithLock(this.lockName, {}, async () => {
|
|
208
208
|
let migration = await queryValidatedZeroOrOneRow(
|
|
209
209
|
sql.select_running_migration,
|
|
210
210
|
{ project: this.options.project },
|
|
@@ -4,7 +4,11 @@ import path from 'path';
|
|
|
4
4
|
import tmp from 'tmp-promise';
|
|
5
5
|
import fs from 'fs-extra';
|
|
6
6
|
|
|
7
|
-
import {
|
|
7
|
+
import {
|
|
8
|
+
parseAnnotations,
|
|
9
|
+
readAndValidateMigrationsFromDirectory,
|
|
10
|
+
sortMigrationFiles,
|
|
11
|
+
} from './load-migrations';
|
|
8
12
|
|
|
9
13
|
chai.use(chaiAsPromised);
|
|
10
14
|
|
|
@@ -84,4 +88,17 @@ describe('load-migrations', () => {
|
|
|
84
88
|
);
|
|
85
89
|
});
|
|
86
90
|
});
|
|
91
|
+
|
|
92
|
+
describe('parseAnnotations', () => {
|
|
93
|
+
it('parses a NO TRANSACTION annotation', () => {
|
|
94
|
+
const annotations = parseAnnotations('-- prairielearn:migrations NO TRANSACTION');
|
|
95
|
+
assert.deepEqual(annotations, new Set(['NO TRANSACTION']));
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
it('throws an error for an invalid annotation', () => {
|
|
99
|
+
assert.throws(() => {
|
|
100
|
+
parseAnnotations('-- prairielearn:migrations INVALID');
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
});
|
|
87
104
|
});
|
package/src/load-migrations.ts
CHANGED
|
@@ -6,6 +6,18 @@ import fs from 'fs-extra';
|
|
|
6
6
|
*/
|
|
7
7
|
const MIGRATION_FILENAME_REGEX = /^([0-9]{14})_.+\.[a-z]+/;
|
|
8
8
|
|
|
9
|
+
/**
|
|
10
|
+
* Annotations are expressed via the following:
|
|
11
|
+
*
|
|
12
|
+
* -- prairielearn:migrations NO TRANSACTION
|
|
13
|
+
*
|
|
14
|
+
* Currently, `NO TRANSACTION` is the only supported annotation. This will run
|
|
15
|
+
* the migration without a transaction. This is useful for migrations that use
|
|
16
|
+
* features that can't be run in transactions, such as `CREATE INDEX CONCURRENTLY`.
|
|
17
|
+
*/
|
|
18
|
+
const ANNOTATION_PREFIX = '-- prairielearn:migrations';
|
|
19
|
+
const ALLOWED_ANNOTATIONS = new Set(['NO TRANSACTION']);
|
|
20
|
+
|
|
9
21
|
export interface MigrationFile {
|
|
10
22
|
directory: string;
|
|
11
23
|
filename: string;
|
|
@@ -74,3 +86,20 @@ export function sortMigrationFiles(migrationFiles: MigrationFile[]): MigrationFi
|
|
|
74
86
|
return a.timestamp.localeCompare(b.timestamp);
|
|
75
87
|
});
|
|
76
88
|
}
|
|
89
|
+
|
|
90
|
+
export function parseAnnotations(contents: string): Set<string> {
|
|
91
|
+
const lines = contents.split('\n');
|
|
92
|
+
const annotations = new Set<string>();
|
|
93
|
+
|
|
94
|
+
lines.forEach((line) => {
|
|
95
|
+
if (line.startsWith(ANNOTATION_PREFIX)) {
|
|
96
|
+
const annotation = line.slice(ANNOTATION_PREFIX.length).trim();
|
|
97
|
+
if (!ALLOWED_ANNOTATIONS.has(annotation)) {
|
|
98
|
+
throw new Error(`Invalid annotation: ${annotation}`);
|
|
99
|
+
}
|
|
100
|
+
annotations.add(annotation);
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
return annotations;
|
|
105
|
+
}
|
|
@@ -8,6 +8,7 @@ import * as error from '@prairielearn/error';
|
|
|
8
8
|
|
|
9
9
|
import {
|
|
10
10
|
MigrationFile,
|
|
11
|
+
parseAnnotations,
|
|
11
12
|
readAndValidateMigrationsFromDirectories,
|
|
12
13
|
sortMigrationFiles,
|
|
13
14
|
} from '../load-migrations';
|
|
@@ -124,8 +125,15 @@ export async function initWithLock(directories: string[], project: string) {
|
|
|
124
125
|
const migrationPath = path.join(directory, filename);
|
|
125
126
|
if (filename.endsWith('.sql')) {
|
|
126
127
|
const migrationSql = await fs.readFile(migrationPath, 'utf8');
|
|
128
|
+
const annotations = parseAnnotations(migrationSql);
|
|
127
129
|
try {
|
|
128
|
-
|
|
130
|
+
if (annotations.has('NO TRANSACTION')) {
|
|
131
|
+
await sqldb.queryAsync(migrationSql, {});
|
|
132
|
+
} else {
|
|
133
|
+
await sqldb.runInTransactionAsync(async () => {
|
|
134
|
+
await sqldb.queryAsync(migrationSql, {});
|
|
135
|
+
});
|
|
136
|
+
}
|
|
129
137
|
} catch (err) {
|
|
130
138
|
error.addData(err, { sqlFile: filename });
|
|
131
139
|
throw err;
|