@juit/pgproxy-utils 1.3.7 → 1.4.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/dist/migrate.cjs +23 -17
- package/dist/migrate.cjs.map +1 -1
- package/dist/migrate.mjs +24 -18
- package/dist/migrate.mjs.map +1 -1
- package/package.json +3 -4
- package/src/migrate.ts +20 -12
package/dist/migrate.cjs
CHANGED
|
@@ -30,14 +30,14 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
30
30
|
mod
|
|
31
31
|
));
|
|
32
32
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
33
|
-
var __using = (stack, value,
|
|
33
|
+
var __using = (stack, value, async2) => {
|
|
34
34
|
if (value != null) {
|
|
35
35
|
if (typeof value !== "object" && typeof value !== "function") __typeError("Object expected");
|
|
36
36
|
var dispose, inner;
|
|
37
|
-
if (
|
|
37
|
+
if (async2) dispose = value[__knownSymbol("asyncDispose")];
|
|
38
38
|
if (dispose === void 0) {
|
|
39
39
|
dispose = value[__knownSymbol("dispose")];
|
|
40
|
-
if (
|
|
40
|
+
if (async2) inner = dispose;
|
|
41
41
|
}
|
|
42
42
|
if (typeof dispose !== "function") __typeError("Object not disposable");
|
|
43
43
|
if (inner) dispose = function() {
|
|
@@ -47,9 +47,9 @@ var __using = (stack, value, async) => {
|
|
|
47
47
|
return Promise.reject(e);
|
|
48
48
|
}
|
|
49
49
|
};
|
|
50
|
-
stack.push([
|
|
51
|
-
} else if (
|
|
52
|
-
stack.push([
|
|
50
|
+
stack.push([async2, dispose, value]);
|
|
51
|
+
} else if (async2) {
|
|
52
|
+
stack.push([async2]);
|
|
53
53
|
}
|
|
54
54
|
return value;
|
|
55
55
|
};
|
|
@@ -86,6 +86,12 @@ var migrationsExpression = /^([0-9]+)[^\w](.*)\.(sql)$/i;
|
|
|
86
86
|
async function migrate(url, options) {
|
|
87
87
|
var _stack = [];
|
|
88
88
|
try {
|
|
89
|
+
const context = import_plug.async.currentContext();
|
|
90
|
+
if (!context) {
|
|
91
|
+
const filename = import_plug.paths.requireFilename(__filename);
|
|
92
|
+
const newContext = new import_plug.pipe.Context(filename, "");
|
|
93
|
+
return import_plug.async.runAsync(newContext, () => migrate(url, options));
|
|
94
|
+
}
|
|
89
95
|
const {
|
|
90
96
|
/* Default to our "../sql" migrations directory */
|
|
91
97
|
migrations: migrationsDirectory = (0, import_plug.resolve)("sql"),
|
|
@@ -118,10 +124,10 @@ async function migrate(url, options) {
|
|
|
118
124
|
const client = __using(_stack, new import_pgproxy_client.PGClient(url), true);
|
|
119
125
|
const connection = __using(_stack, await client.connect(), true);
|
|
120
126
|
const info = await connection.query("SELECT current_database() AS name");
|
|
121
|
-
|
|
122
|
-
|
|
127
|
+
context.log.notice(`Migrating database ${(0, import_plug.$ylw)(info.rows[0].name)} ${(0, import_plug.$gry)(`(group=${group})`)}`);
|
|
128
|
+
context.log.info("Beginning migrations transaction");
|
|
123
129
|
await connection.begin();
|
|
124
|
-
|
|
130
|
+
context.log.info(`Ensuring presence of ${(0, import_plug.$blu)("$migrations")} table`);
|
|
125
131
|
await connection.query(`
|
|
126
132
|
SET LOCAL client_min_messages TO WARNING;
|
|
127
133
|
CREATE TABLE IF NOT EXISTS "$migrations" (
|
|
@@ -132,9 +138,9 @@ async function migrate(url, options) {
|
|
|
132
138
|
"sha256sum" BYTEA NOT NULL,
|
|
133
139
|
PRIMARY KEY ("group", "number")
|
|
134
140
|
);`);
|
|
135
|
-
|
|
141
|
+
context.log.info(`Lock exclusive use of ${(0, import_plug.$blu)("$migrations")} table`);
|
|
136
142
|
await connection.query('LOCK TABLE "$migrations"');
|
|
137
|
-
|
|
143
|
+
context.log.info(`Looking for entries in ${(0, import_plug.$blu)("$migrations")} table ${(0, import_plug.$gry)(`(group=${group})`)}`);
|
|
138
144
|
const result = await connection.query(
|
|
139
145
|
import_pgproxy_client.SQL`SELECT * FROM "$migrations" WHERE "group" = ${group}`
|
|
140
146
|
);
|
|
@@ -150,22 +156,22 @@ async function migrate(url, options) {
|
|
|
150
156
|
if (prev) {
|
|
151
157
|
if (sha256sum.equals(prev.sha256sum)) {
|
|
152
158
|
const timestamp = prev.timestamp.toISOString().substring(0, 19).replace("T", " ");
|
|
153
|
-
|
|
159
|
+
context.log.notice(`Skipping migration ${(0, import_plug.$gry)(`${group}@`)}${(0, import_plug.$grn)(num)}: ${(0, import_plug.$blu)(name)}`, (0, import_plug.$gry)(`applied on ${(0, import_plug.$und)(timestamp)}`));
|
|
154
160
|
} else {
|
|
155
|
-
|
|
161
|
+
context.log.error(`Failed migration ${(0, import_plug.$gry)(`${group}@`)}${(0, import_plug.$grn)(num)}: ${(0, import_plug.$ylw)(name)}`);
|
|
156
162
|
const currHash = sha256sum.toString("hex").substring(0, 6);
|
|
157
163
|
const prevHash = Buffer.from(prev.sha256sum).toString("hex").substring(0, 6);
|
|
158
164
|
throw new Error(`Migration ${group}@${num} (${name}) has checksum "${currHash}" but was recorded as "${prevHash}"`);
|
|
159
165
|
}
|
|
160
166
|
} else {
|
|
161
167
|
try {
|
|
162
|
-
|
|
168
|
+
context.log.notice(`Applying migration ${(0, import_plug.$gry)(`${group}@`)}${(0, import_plug.$grn)(num)}: ${(0, import_plug.$blu)(name)}`);
|
|
163
169
|
await connection.query(contents);
|
|
164
170
|
await connection.query(import_pgproxy_client.SQL`INSERT INTO "$migrations" ("group", "number", "name", "sha256sum")
|
|
165
171
|
VALUES (${group}, ${number}, ${name}, ${sha256sum})`);
|
|
166
172
|
count++;
|
|
167
173
|
} catch (error) {
|
|
168
|
-
|
|
174
|
+
context.log.error(`Failed migration ${(0, import_plug.$gry)(`${group}@`)}${(0, import_plug.$grn)(num)}: ${(0, import_plug.$ylw)(name)}`);
|
|
169
175
|
const message = error.message.split("\n").map((s) => ` ${s}`).join("\n");
|
|
170
176
|
error.message = `Failed migration ${group}@${num} (${name}):
|
|
171
177
|
${message}`;
|
|
@@ -173,9 +179,9 @@ ${message}`;
|
|
|
173
179
|
}
|
|
174
180
|
}
|
|
175
181
|
}
|
|
176
|
-
|
|
182
|
+
context.log.info("Committing migrations transaction");
|
|
177
183
|
await connection.commit();
|
|
178
|
-
|
|
184
|
+
context.log.notice(`Applied ${(0, import_plug.$ylw)(count)} migrations ${(0, import_plug.$ms)(Date.now() - now)}`);
|
|
179
185
|
return count;
|
|
180
186
|
} catch (_) {
|
|
181
187
|
var _error = _, _hasError = true;
|
package/dist/migrate.cjs.map
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/migrate.ts"],
|
|
4
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAAmB;AACnB,uBAAyB;AAEzB,4BAA8B;AAC9B,
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": ["additional", "crypto", "applied", "group"]
|
|
6
6
|
}
|
package/dist/migrate.mjs
CHANGED
|
@@ -2,14 +2,14 @@ var __knownSymbol = (name, symbol) => (symbol = Symbol[name]) ? symbol : Symbol.
|
|
|
2
2
|
var __typeError = (msg) => {
|
|
3
3
|
throw TypeError(msg);
|
|
4
4
|
};
|
|
5
|
-
var __using = (stack, value,
|
|
5
|
+
var __using = (stack, value, async2) => {
|
|
6
6
|
if (value != null) {
|
|
7
7
|
if (typeof value !== "object" && typeof value !== "function") __typeError("Object expected");
|
|
8
8
|
var dispose, inner;
|
|
9
|
-
if (
|
|
9
|
+
if (async2) dispose = value[__knownSymbol("asyncDispose")];
|
|
10
10
|
if (dispose === void 0) {
|
|
11
11
|
dispose = value[__knownSymbol("dispose")];
|
|
12
|
-
if (
|
|
12
|
+
if (async2) inner = dispose;
|
|
13
13
|
}
|
|
14
14
|
if (typeof dispose !== "function") __typeError("Object not disposable");
|
|
15
15
|
if (inner) dispose = function() {
|
|
@@ -19,9 +19,9 @@ var __using = (stack, value, async) => {
|
|
|
19
19
|
return Promise.reject(e);
|
|
20
20
|
}
|
|
21
21
|
};
|
|
22
|
-
stack.push([
|
|
23
|
-
} else if (
|
|
24
|
-
stack.push([
|
|
22
|
+
stack.push([async2, dispose, value]);
|
|
23
|
+
} else if (async2) {
|
|
24
|
+
stack.push([async2]);
|
|
25
25
|
}
|
|
26
26
|
return value;
|
|
27
27
|
};
|
|
@@ -48,11 +48,17 @@ var __callDispose = (stack, error, hasError) => {
|
|
|
48
48
|
import crypto from "node:crypto";
|
|
49
49
|
import { basename } from "node:path";
|
|
50
50
|
import { PGClient, SQL } from "@juit/pgproxy-client";
|
|
51
|
-
import { $blu, $grn, $gry, $ms, $und, $ylw, find, fs,
|
|
51
|
+
import { $blu, $grn, $gry, $ms, $und, $ylw, async, find, fs, merge, paths, pipe, resolve } from "@plugjs/plug";
|
|
52
52
|
var migrationsExpression = /^([0-9]+)[^\w](.*)\.(sql)$/i;
|
|
53
53
|
async function migrate(url, options) {
|
|
54
54
|
var _stack = [];
|
|
55
55
|
try {
|
|
56
|
+
const context = async.currentContext();
|
|
57
|
+
if (!context) {
|
|
58
|
+
const filename = paths.requireFilename(import.meta.url);
|
|
59
|
+
const newContext = new pipe.Context(filename, "");
|
|
60
|
+
return async.runAsync(newContext, () => migrate(url, options));
|
|
61
|
+
}
|
|
56
62
|
const {
|
|
57
63
|
/* Default to our "../sql" migrations directory */
|
|
58
64
|
migrations: migrationsDirectory = resolve("sql"),
|
|
@@ -85,10 +91,10 @@ async function migrate(url, options) {
|
|
|
85
91
|
const client = __using(_stack, new PGClient(url), true);
|
|
86
92
|
const connection = __using(_stack, await client.connect(), true);
|
|
87
93
|
const info = await connection.query("SELECT current_database() AS name");
|
|
88
|
-
log.notice(`Migrating database ${$ylw(info.rows[0].name)} ${$gry(`(group=${group})`)}`);
|
|
89
|
-
log.info("Beginning migrations transaction");
|
|
94
|
+
context.log.notice(`Migrating database ${$ylw(info.rows[0].name)} ${$gry(`(group=${group})`)}`);
|
|
95
|
+
context.log.info("Beginning migrations transaction");
|
|
90
96
|
await connection.begin();
|
|
91
|
-
log.info(`Ensuring presence of ${$blu("$migrations")} table`);
|
|
97
|
+
context.log.info(`Ensuring presence of ${$blu("$migrations")} table`);
|
|
92
98
|
await connection.query(`
|
|
93
99
|
SET LOCAL client_min_messages TO WARNING;
|
|
94
100
|
CREATE TABLE IF NOT EXISTS "$migrations" (
|
|
@@ -99,9 +105,9 @@ async function migrate(url, options) {
|
|
|
99
105
|
"sha256sum" BYTEA NOT NULL,
|
|
100
106
|
PRIMARY KEY ("group", "number")
|
|
101
107
|
);`);
|
|
102
|
-
log.info(`Lock exclusive use of ${$blu("$migrations")} table`);
|
|
108
|
+
context.log.info(`Lock exclusive use of ${$blu("$migrations")} table`);
|
|
103
109
|
await connection.query('LOCK TABLE "$migrations"');
|
|
104
|
-
log.info(`Looking for entries in ${$blu("$migrations")} table ${$gry(`(group=${group})`)}`);
|
|
110
|
+
context.log.info(`Looking for entries in ${$blu("$migrations")} table ${$gry(`(group=${group})`)}`);
|
|
105
111
|
const result = await connection.query(
|
|
106
112
|
SQL`SELECT * FROM "$migrations" WHERE "group" = ${group}`
|
|
107
113
|
);
|
|
@@ -117,22 +123,22 @@ async function migrate(url, options) {
|
|
|
117
123
|
if (prev) {
|
|
118
124
|
if (sha256sum.equals(prev.sha256sum)) {
|
|
119
125
|
const timestamp = prev.timestamp.toISOString().substring(0, 19).replace("T", " ");
|
|
120
|
-
log.notice(`Skipping migration ${$gry(`${group}@`)}${$grn(num)}: ${$blu(name)}`, $gry(`applied on ${$und(timestamp)}`));
|
|
126
|
+
context.log.notice(`Skipping migration ${$gry(`${group}@`)}${$grn(num)}: ${$blu(name)}`, $gry(`applied on ${$und(timestamp)}`));
|
|
121
127
|
} else {
|
|
122
|
-
log.error(`Failed migration ${$gry(`${group}@`)}${$grn(num)}: ${$ylw(name)}`);
|
|
128
|
+
context.log.error(`Failed migration ${$gry(`${group}@`)}${$grn(num)}: ${$ylw(name)}`);
|
|
123
129
|
const currHash = sha256sum.toString("hex").substring(0, 6);
|
|
124
130
|
const prevHash = Buffer.from(prev.sha256sum).toString("hex").substring(0, 6);
|
|
125
131
|
throw new Error(`Migration ${group}@${num} (${name}) has checksum "${currHash}" but was recorded as "${prevHash}"`);
|
|
126
132
|
}
|
|
127
133
|
} else {
|
|
128
134
|
try {
|
|
129
|
-
log.notice(`Applying migration ${$gry(`${group}@`)}${$grn(num)}: ${$blu(name)}`);
|
|
135
|
+
context.log.notice(`Applying migration ${$gry(`${group}@`)}${$grn(num)}: ${$blu(name)}`);
|
|
130
136
|
await connection.query(contents);
|
|
131
137
|
await connection.query(SQL`INSERT INTO "$migrations" ("group", "number", "name", "sha256sum")
|
|
132
138
|
VALUES (${group}, ${number}, ${name}, ${sha256sum})`);
|
|
133
139
|
count++;
|
|
134
140
|
} catch (error) {
|
|
135
|
-
log.error(`Failed migration ${$gry(`${group}@`)}${$grn(num)}: ${$ylw(name)}`);
|
|
141
|
+
context.log.error(`Failed migration ${$gry(`${group}@`)}${$grn(num)}: ${$ylw(name)}`);
|
|
136
142
|
const message = error.message.split("\n").map((s) => ` ${s}`).join("\n");
|
|
137
143
|
error.message = `Failed migration ${group}@${num} (${name}):
|
|
138
144
|
${message}`;
|
|
@@ -140,9 +146,9 @@ ${message}`;
|
|
|
140
146
|
}
|
|
141
147
|
}
|
|
142
148
|
}
|
|
143
|
-
log.info("Committing migrations transaction");
|
|
149
|
+
context.log.info("Committing migrations transaction");
|
|
144
150
|
await connection.commit();
|
|
145
|
-
log.notice(`Applied ${$ylw(count)} migrations ${$ms(Date.now() - now)}`);
|
|
151
|
+
context.log.notice(`Applied ${$ylw(count)} migrations ${$ms(Date.now() - now)}`);
|
|
146
152
|
return count;
|
|
147
153
|
} catch (_) {
|
|
148
154
|
var _error = _, _hasError = true;
|
package/dist/migrate.mjs.map
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/migrate.ts"],
|
|
4
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,YAAY;AACnB,SAAS,gBAAgB;AAEzB,SAAS,UAAU,WAAW;AAC9B,SAAS,MAAM,MAAM,MAAM,KAAK,MAAM,MAAM,MAAM,IAAI,
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": ["additional", "applied", "group"]
|
|
6
6
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@juit/pgproxy-utils",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.1",
|
|
4
4
|
"main": "./dist/index.cjs",
|
|
5
5
|
"module": "./dist/index.mjs",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -43,9 +43,8 @@
|
|
|
43
43
|
"src/"
|
|
44
44
|
],
|
|
45
45
|
"dependencies": {
|
|
46
|
-
"@juit/pgproxy-client": "1.
|
|
47
|
-
"@juit/pgproxy-
|
|
48
|
-
"@juit/pgproxy-types": "1.3.7",
|
|
46
|
+
"@juit/pgproxy-client": "1.4.1",
|
|
47
|
+
"@juit/pgproxy-types": "1.4.1",
|
|
49
48
|
"@plugjs/plug": "^0.6.78"
|
|
50
49
|
}
|
|
51
50
|
}
|
package/src/migrate.ts
CHANGED
|
@@ -2,7 +2,7 @@ import crypto from 'node:crypto'
|
|
|
2
2
|
import { basename } from 'node:path'
|
|
3
3
|
|
|
4
4
|
import { PGClient, SQL } from '@juit/pgproxy-client'
|
|
5
|
-
import { $blu, $grn, $gry, $ms, $und, $ylw, find, fs,
|
|
5
|
+
import { $blu, $grn, $gry, $ms, $und, $ylw, async, find, fs, merge, paths, pipe, resolve } from '@plugjs/plug'
|
|
6
6
|
|
|
7
7
|
/* ========================================================================== *
|
|
8
8
|
* INTERNALS *
|
|
@@ -46,6 +46,14 @@ export async function migrate(
|
|
|
46
46
|
url: string | URL,
|
|
47
47
|
options?: MigrationOptions,
|
|
48
48
|
): Promise<number> {
|
|
49
|
+
const context = async.currentContext()
|
|
50
|
+
// coverage ignore next // we always have a context in tests...
|
|
51
|
+
if (! context) {
|
|
52
|
+
const filename = paths.requireFilename(__fileurl) // self, for context
|
|
53
|
+
const newContext = new pipe.Context(filename, '') // context for pipes
|
|
54
|
+
return async.runAsync(newContext, () => migrate(url, options))
|
|
55
|
+
}
|
|
56
|
+
|
|
49
57
|
const {
|
|
50
58
|
/* Default to our "../sql" migrations directory */
|
|
51
59
|
migrations: migrationsDirectory = resolve('sql'),
|
|
@@ -98,15 +106,15 @@ export async function migrate(
|
|
|
98
106
|
await using connection = await client.connect()
|
|
99
107
|
|
|
100
108
|
const info = await connection.query<{ name: string }>('SELECT current_database() AS name')
|
|
101
|
-
log.notice(`Migrating database ${$ylw((info.rows[0]!.name))} ${$gry(`(group=${group})`)}`)
|
|
109
|
+
context.log.notice(`Migrating database ${$ylw((info.rows[0]!.name))} ${$gry(`(group=${group})`)}`)
|
|
102
110
|
|
|
103
111
|
// const model = connection.in('$migrations')
|
|
104
112
|
|
|
105
|
-
log.info('Beginning migrations transaction')
|
|
113
|
+
context.log.info('Beginning migrations transaction')
|
|
106
114
|
await connection.begin()
|
|
107
115
|
|
|
108
116
|
/* First of all, make sure we have our "$migrations" table */
|
|
109
|
-
log.info(`Ensuring presence of ${$blu('$migrations')} table`)
|
|
117
|
+
context.log.info(`Ensuring presence of ${$blu('$migrations')} table`)
|
|
110
118
|
await connection.query(`
|
|
111
119
|
SET LOCAL client_min_messages TO WARNING;
|
|
112
120
|
CREATE TABLE IF NOT EXISTS "$migrations" (
|
|
@@ -119,11 +127,11 @@ export async function migrate(
|
|
|
119
127
|
);`)
|
|
120
128
|
|
|
121
129
|
/* Lock our migrations table */
|
|
122
|
-
log.info(`Lock exclusive use of ${$blu('$migrations')} table`)
|
|
130
|
+
context.log.info(`Lock exclusive use of ${$blu('$migrations')} table`)
|
|
123
131
|
await connection.query('LOCK TABLE "$migrations"')
|
|
124
132
|
|
|
125
133
|
/* Gather all applied migrations */
|
|
126
|
-
log.info(`Looking for entries in ${$blu('$migrations')} table ${$gry(`(group=${group})`)}`)
|
|
134
|
+
context.log.info(`Looking for entries in ${$blu('$migrations')} table ${$gry(`(group=${group})`)}`)
|
|
127
135
|
const result = await connection.query<AppliedMigration>(
|
|
128
136
|
SQL`SELECT * FROM "$migrations" WHERE "group" = ${group}`,
|
|
129
137
|
)
|
|
@@ -143,22 +151,22 @@ export async function migrate(
|
|
|
143
151
|
if (prev) {
|
|
144
152
|
if (sha256sum.equals(prev.sha256sum)) {
|
|
145
153
|
const timestamp = prev.timestamp.toISOString().substring(0, 19).replace('T', ' ')
|
|
146
|
-
log.notice(`Skipping migration ${$gry(`${group}@`)}${$grn(num)}: ${$blu(name)}`, $gry(`applied on ${$und(timestamp)}`))
|
|
154
|
+
context.log.notice(`Skipping migration ${$gry(`${group}@`)}${$grn(num)}: ${$blu(name)}`, $gry(`applied on ${$und(timestamp)}`))
|
|
147
155
|
} else {
|
|
148
|
-
log.error(`Failed migration ${$gry(`${group}@`)}${$grn(num)}: ${$ylw(name)}`)
|
|
156
|
+
context.log.error(`Failed migration ${$gry(`${group}@`)}${$grn(num)}: ${$ylw(name)}`)
|
|
149
157
|
const currHash = sha256sum.toString('hex').substring(0, 6)
|
|
150
158
|
const prevHash = Buffer.from(prev.sha256sum).toString('hex').substring(0, 6)
|
|
151
159
|
throw new Error(`Migration ${group}@${num} (${name}) has checksum "${currHash}" but was recorded as "${prevHash}"`)
|
|
152
160
|
}
|
|
153
161
|
} else {
|
|
154
162
|
try {
|
|
155
|
-
log.notice(`Applying migration ${$gry(`${group}@`)}${$grn(num)}: ${$blu(name)}`)
|
|
163
|
+
context.log.notice(`Applying migration ${$gry(`${group}@`)}${$grn(num)}: ${$blu(name)}`)
|
|
156
164
|
await connection.query(contents)
|
|
157
165
|
await connection.query(SQL`INSERT INTO "$migrations" ("group", "number", "name", "sha256sum")
|
|
158
166
|
VALUES (${group}, ${number}, ${name}, ${sha256sum})`)
|
|
159
167
|
count ++
|
|
160
168
|
} catch (error: any) {
|
|
161
|
-
log.error(`Failed migration ${$gry(`${group}@`)}${$grn(num)}: ${$ylw(name)}`)
|
|
169
|
+
context.log.error(`Failed migration ${$gry(`${group}@`)}${$grn(num)}: ${$ylw(name)}`)
|
|
162
170
|
const message = error.message.split('\n').map((s: string) => ` ${s}`).join('\n')
|
|
163
171
|
error.message = `Failed migration ${group}@${num} (${name}):\n${message}`
|
|
164
172
|
throw error
|
|
@@ -167,10 +175,10 @@ export async function migrate(
|
|
|
167
175
|
}
|
|
168
176
|
|
|
169
177
|
/* Commit our migrations */
|
|
170
|
-
log.info('Committing migrations transaction')
|
|
178
|
+
context.log.info('Committing migrations transaction')
|
|
171
179
|
await connection.commit()
|
|
172
180
|
|
|
173
181
|
/* All done */
|
|
174
|
-
log.notice(`Applied ${$ylw(count)} migrations ${$ms(Date.now() - now)}`)
|
|
182
|
+
context.log.notice(`Applied ${$ylw(count)} migrations ${$ms(Date.now() - now)}`)
|
|
175
183
|
return count
|
|
176
184
|
}
|