@proteinjs/db-driver-spanner 1.22.0 → 1.22.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
CHANGED
|
@@ -3,6 +3,18 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
## [1.22.1](https://github.com/proteinjs/db/compare/@proteinjs/db-driver-spanner@1.22.0...@proteinjs/db-driver-spanner@1.22.1) (2026-08-19)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### Bug Fixes
|
|
10
|
+
|
|
11
|
+
* migration run-state writes omit absent optional fields — a void run() or non-Error throw can never wedge a row at 'running' ([350dbb9](https://github.com/proteinjs/db/commit/350dbb9590c2ac697807b6e1f11cf29ef90c1cdb)), closes [#124](https://github.com/proteinjs/db/issues/124) [#57](https://github.com/proteinjs/db/issues/57)
|
|
12
|
+
* spanner-driver rebuilds stop self-eating — dist excluded from tsc inputs ([35b3046](https://github.com/proteinjs/db/commit/35b304613f5b419027370cf53315aea26197aeef))
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
|
|
6
18
|
# [1.22.0](https://github.com/proteinjs/db/compare/@proteinjs/db-driver-spanner@1.21.0...@proteinjs/db-driver-spanner@1.22.0) (2026-08-18)
|
|
7
19
|
|
|
8
20
|
|
|
@@ -77,6 +77,31 @@ describe('MigrationRunner (spanner)', function () {
|
|
|
77
77
|
return [2 /*return*/, 'migration output'];
|
|
78
78
|
}); }); },
|
|
79
79
|
};
|
|
80
|
+
// #124 wedge class: optional run-state fields are legitimately ABSENT (a void run() leaves no
|
|
81
|
+
// output; a non-Error throw has no message/stack), and the completion write must omit them —
|
|
82
|
+
// an undefined-valued field fails the WHOLE write (RecordSerializer rejects it), stranding the
|
|
83
|
+
// row at 'running' with the run's real outcome lost.
|
|
84
|
+
var voidRunCount = 0; // effect counter: proves the run itself completed
|
|
85
|
+
var voidOutputMigration = {
|
|
86
|
+
id: 'migration-runner-test-void-output',
|
|
87
|
+
description: 'resolves void — no output',
|
|
88
|
+
run: function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
89
|
+
return __generator(this, function (_a) {
|
|
90
|
+
voidRunCount++;
|
|
91
|
+
return [2 /*return*/];
|
|
92
|
+
});
|
|
93
|
+
}); },
|
|
94
|
+
};
|
|
95
|
+
var nonErrorThrowMigration = {
|
|
96
|
+
id: 'migration-runner-test-string-throw',
|
|
97
|
+
description: 'throws a non-Error value',
|
|
98
|
+
run: function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
99
|
+
return __generator(this, function (_a) {
|
|
100
|
+
// eslint-disable-next-line no-throw-literal
|
|
101
|
+
throw 'string throw with no message or stack';
|
|
102
|
+
});
|
|
103
|
+
}); },
|
|
104
|
+
};
|
|
80
105
|
// ensureMigrationRun fixtures carry run counters: re-running any of them is VISIBLE as a
|
|
81
106
|
// counter increment, so idempotence and retry are asserted on the migration's own effect,
|
|
82
107
|
// not on bookkeeping interactions.
|
|
@@ -142,6 +167,8 @@ describe('MigrationRunner (spanner)', function () {
|
|
|
142
167
|
_i = 0, _a = [
|
|
143
168
|
failingMigration,
|
|
144
169
|
succeedingMigration,
|
|
170
|
+
voidOutputMigration,
|
|
171
|
+
nonErrorThrowMigration,
|
|
145
172
|
ensureBootMigration,
|
|
146
173
|
ensureIdempotentMigration,
|
|
147
174
|
ensureRetriedMigration,
|
|
@@ -214,6 +241,45 @@ describe('MigrationRunner (spanner)', function () {
|
|
|
214
241
|
}
|
|
215
242
|
});
|
|
216
243
|
}); });
|
|
244
|
+
test('a void migration (no output) records success — absent fields are omitted from the completion write', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
245
|
+
var runner, row;
|
|
246
|
+
return __generator(this, function (_a) {
|
|
247
|
+
switch (_a.label) {
|
|
248
|
+
case 0:
|
|
249
|
+
runner = new db_1.MigrationRunner();
|
|
250
|
+
return [4 /*yield*/, expect(runner.runMigration(voidOutputMigration.id)).resolves.toBeUndefined()];
|
|
251
|
+
case 1:
|
|
252
|
+
_a.sent();
|
|
253
|
+
expect(voidRunCount).toBe(1);
|
|
254
|
+
return [4 /*yield*/, (0, db_1.getDb)().get(migrationTable, { id: voidOutputMigration.id })];
|
|
255
|
+
case 2:
|
|
256
|
+
row = _a.sent();
|
|
257
|
+
expect(row.status).toBe('success');
|
|
258
|
+
expect(row.output == null).toBe(true);
|
|
259
|
+
expect(row.duration).toBeTruthy();
|
|
260
|
+
return [2 /*return*/];
|
|
261
|
+
}
|
|
262
|
+
});
|
|
263
|
+
}); });
|
|
264
|
+
test('a non-Error throw records failure — absent failureMessage/failureStack never poison the write', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
265
|
+
var runner, row;
|
|
266
|
+
return __generator(this, function (_a) {
|
|
267
|
+
switch (_a.label) {
|
|
268
|
+
case 0:
|
|
269
|
+
runner = new db_1.MigrationRunner();
|
|
270
|
+
return [4 /*yield*/, expect(runner.runMigration(nonErrorThrowMigration.id)).resolves.toBeUndefined()];
|
|
271
|
+
case 1:
|
|
272
|
+
_a.sent();
|
|
273
|
+
return [4 /*yield*/, (0, db_1.getDb)().get(migrationTable, { id: nonErrorThrowMigration.id })];
|
|
274
|
+
case 2:
|
|
275
|
+
row = _a.sent();
|
|
276
|
+
expect(row.status).toBe('failure');
|
|
277
|
+
expect(row.failureMessage == null).toBe(true);
|
|
278
|
+
expect(row.duration).toBeTruthy();
|
|
279
|
+
return [2 /*return*/];
|
|
280
|
+
}
|
|
281
|
+
});
|
|
282
|
+
}); });
|
|
217
283
|
describe('ensureMigrationRun (boot path)', function () {
|
|
218
284
|
// Boot context: NO user session exists — UserAuth is fail-closed, so any getDb() bookkeeping
|
|
219
285
|
// would deny. These tests run with the suite's test identity CLEARED to pin that
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MigrationRunner.test.js","sourceRoot":"","sources":["../../test/MigrationRunner.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,kEAA6D;AAC7D,oCAQuB;AACvB,2CAAqE;AACrE,4DAA2D;AAC3D,gFAA+E;AAC/E,mCAAiC;AAEjC;;;;;;;;;GASG;AAEH,IAAM,aAAa,GAAG,IAAI,iCAAa,CAAC;IACtC,SAAS,EAAE,gBAAgB;IAC3B,YAAY,EAAE,gBAAgB;IAC9B,YAAY,EAAE,MAAM;CACrB,CAAC,CAAC;AAEH,QAAQ,CAAC,2BAA2B,EAAE;IACpC,IAAM,cAAc,GAAG,IAAI,mBAAc,EAAsB,CAAC;IAChE,IAAM,SAAS,GAAG,IAAA,mCAAgB,EAAC,aAAa,CAAC,CAAC;IAClD,IAAM,gBAAgB,GAAG,IAAI,qBAAgB,EAAE,CAAC;IAEhD,IAAM,gBAAgB,GAAG;QACvB,EAAE,EAAE,+BAA+B;QACnC,WAAW,EAAE,eAAe;QAC5B,GAAG,EAAE;;gBACH,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;;aAC9C;KACsB,CAAC;IAE1B,IAAM,mBAAmB,GAAG;QAC1B,EAAE,EAAE,kCAAkC;QACtC,WAAW,EAAE,UAAU;QACvB,GAAG,EAAE;YAAY,sBAAA,kBAAkB,EAAA;iBAAA;KACZ,CAAC;IAE1B,yFAAyF;IACzF,0FAA0F;IAC1F,mCAAmC;IACnC,IAAI,kBAAkB,GAAG,CAAC,CAAC;IAC3B,IAAM,mBAAmB,GAAG;QAC1B,EAAE,EAAE,mCAAmC;QACvC,WAAW,EAAE,mCAAmC;QAChD,GAAG,EAAE;;gBACH,kBAAkB,EAAE,CAAC;gBACrB,sBAAO,aAAa,EAAC;;aACtB;KACsB,CAAC;IAE1B,IAAI,wBAAwB,GAAG,CAAC,CAAC;IACjC,IAAM,yBAAyB,GAAG;QAChC,wEAAwE;QACxE,EAAE,EAAE,mCAAmC;QACvC,WAAW,EAAE,iCAAiC;QAC9C,GAAG,EAAE;;gBACH,wBAAwB,EAAE,CAAC;gBAC3B,sBAAO,mBAAmB,EAAC;;aAC5B;KACsB,CAAC;IAE1B,IAAI,mBAAmB,GAAG,CAAC,CAAC;IAC5B,IAAM,sBAAsB,GAAG;QAC7B,EAAE,EAAE,sCAAsC;QAC1C,WAAW,EAAE,6BAA6B;QAC1C,GAAG,EAAE;;gBACH,mBAAmB,EAAE,CAAC;gBACtB,IAAI,mBAAmB,KAAK,CAAC,EAAE;oBAC7B,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;iBACrD;gBACD,sBAAO,gBAAgB,EAAC;;aACzB;KACsB,CAAC;IAE1B,SAAS,CAAC;;;;;oBACR,0FAA0F;oBAC1F,uFAAuF;oBACvF,uCAAuC;oBACvC,IAAA,uBAAgB,GAAE,CAAC;oBACnB,qBAAM,uDAA0B,CAAC,iBAAiB,CAAC;4BACjD,SAAS,EAAE,gBAAgB;4BAC3B,YAAY,EAAE,gBAAgB;4BAC9B,YAAY,EAAE,MAAM;yBACrB,CAAC,EAAA;;oBAJF,SAIE,CAAC;oBACH,qBAAM,SAAS,CAAC,cAAc,CAAC,EAAA;;oBAA/B,SAA+B,CAAC;oBAChC,qBAAM,aAAa,CAAC,eAAe,EAAE,CAAC,SAAS,CAAC,cAAc,CAAC,EAAA;;oBAA/D,SAA+D,CAAC;
|
|
1
|
+
{"version":3,"file":"MigrationRunner.test.js","sourceRoot":"","sources":["../../test/MigrationRunner.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@proteinjs/db-driver-spanner",
|
|
3
|
-
"version": "1.22.
|
|
3
|
+
"version": "1.22.1",
|
|
4
4
|
"main": "./dist/generated/index.js",
|
|
5
5
|
"types": "./dist/generated/index.d.ts",
|
|
6
6
|
"exports": {
|
|
@@ -42,10 +42,10 @@
|
|
|
42
42
|
},
|
|
43
43
|
"dependencies": {
|
|
44
44
|
"@google-cloud/spanner": "7.5.0",
|
|
45
|
-
"@proteinjs/db": "^1.34.
|
|
45
|
+
"@proteinjs/db": "^1.34.1",
|
|
46
46
|
"@proteinjs/db-query": "^1.7.0",
|
|
47
|
-
"@proteinjs/db-spanner-common": "^1.3.
|
|
48
|
-
"@proteinjs/db-transaction-context": "^0.5.
|
|
47
|
+
"@proteinjs/db-spanner-common": "^1.3.14",
|
|
48
|
+
"@proteinjs/db-transaction-context": "^0.5.14",
|
|
49
49
|
"@proteinjs/logger": "^1.0.21",
|
|
50
50
|
"@proteinjs/reflection": "^1.1.12",
|
|
51
51
|
"@proteinjs/util": "^1.6.1"
|
|
@@ -63,5 +63,5 @@
|
|
|
63
63
|
"ts-jest": "29.1.1",
|
|
64
64
|
"typescript": "5.2.2"
|
|
65
65
|
},
|
|
66
|
-
"gitHead": "
|
|
66
|
+
"gitHead": "a5a56218a5757e47576cbe79858c9aacc6026816"
|
|
67
67
|
}
|
|
@@ -49,6 +49,28 @@ describe('MigrationRunner (spanner)', () => {
|
|
|
49
49
|
run: async () => 'migration output',
|
|
50
50
|
} as unknown as Migration;
|
|
51
51
|
|
|
52
|
+
// #124 wedge class: optional run-state fields are legitimately ABSENT (a void run() leaves no
|
|
53
|
+
// output; a non-Error throw has no message/stack), and the completion write must omit them —
|
|
54
|
+
// an undefined-valued field fails the WHOLE write (RecordSerializer rejects it), stranding the
|
|
55
|
+
// row at 'running' with the run's real outcome lost.
|
|
56
|
+
let voidRunCount = 0; // effect counter: proves the run itself completed
|
|
57
|
+
const voidOutputMigration = {
|
|
58
|
+
id: 'migration-runner-test-void-output',
|
|
59
|
+
description: 'resolves void — no output',
|
|
60
|
+
run: async () => {
|
|
61
|
+
voidRunCount++;
|
|
62
|
+
},
|
|
63
|
+
} as unknown as Migration;
|
|
64
|
+
|
|
65
|
+
const nonErrorThrowMigration = {
|
|
66
|
+
id: 'migration-runner-test-string-throw',
|
|
67
|
+
description: 'throws a non-Error value',
|
|
68
|
+
run: async () => {
|
|
69
|
+
// eslint-disable-next-line no-throw-literal
|
|
70
|
+
throw 'string throw with no message or stack';
|
|
71
|
+
},
|
|
72
|
+
} as unknown as Migration;
|
|
73
|
+
|
|
52
74
|
// ensureMigrationRun fixtures carry run counters: re-running any of them is VISIBLE as a
|
|
53
75
|
// counter increment, so idempotence and retry are asserted on the migration's own effect,
|
|
54
76
|
// not on bookkeeping interactions.
|
|
@@ -101,6 +123,8 @@ describe('MigrationRunner (spanner)', () => {
|
|
|
101
123
|
for (const migration of [
|
|
102
124
|
failingMigration,
|
|
103
125
|
succeedingMigration,
|
|
126
|
+
voidOutputMigration,
|
|
127
|
+
nonErrorThrowMigration,
|
|
104
128
|
ensureBootMigration,
|
|
105
129
|
ensureIdempotentMigration,
|
|
106
130
|
ensureRetriedMigration,
|
|
@@ -137,6 +161,27 @@ describe('MigrationRunner (spanner)', () => {
|
|
|
137
161
|
expect(row.duration).toBeTruthy();
|
|
138
162
|
});
|
|
139
163
|
|
|
164
|
+
test('a void migration (no output) records success — absent fields are omitted from the completion write', async () => {
|
|
165
|
+
const runner = new MigrationRunner();
|
|
166
|
+
await expect(runner.runMigration(voidOutputMigration.id)).resolves.toBeUndefined();
|
|
167
|
+
|
|
168
|
+
expect(voidRunCount).toBe(1);
|
|
169
|
+
const row = await getDb().get(migrationTable, { id: voidOutputMigration.id });
|
|
170
|
+
expect(row.status).toBe('success');
|
|
171
|
+
expect(row.output == null).toBe(true);
|
|
172
|
+
expect(row.duration).toBeTruthy();
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
test('a non-Error throw records failure — absent failureMessage/failureStack never poison the write', async () => {
|
|
176
|
+
const runner = new MigrationRunner();
|
|
177
|
+
await expect(runner.runMigration(nonErrorThrowMigration.id)).resolves.toBeUndefined();
|
|
178
|
+
|
|
179
|
+
const row = await getDb().get(migrationTable, { id: nonErrorThrowMigration.id });
|
|
180
|
+
expect(row.status).toBe('failure');
|
|
181
|
+
expect(row.failureMessage == null).toBe(true);
|
|
182
|
+
expect(row.duration).toBeTruthy();
|
|
183
|
+
});
|
|
184
|
+
|
|
140
185
|
describe('ensureMigrationRun (boot path)', () => {
|
|
141
186
|
// Boot context: NO user session exists — UserAuth is fail-closed, so any getDb() bookkeeping
|
|
142
187
|
// would deny. These tests run with the suite's test identity CLEARED to pin that
|
package/tsconfig.json
CHANGED