@proteinjs/db 1.54.1 → 1.54.3
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 +22 -0
- package/dist/src/Columns.d.ts +12 -6
- package/dist/src/Columns.d.ts.map +1 -1
- package/dist/src/Columns.js +40 -65
- package/dist/src/Columns.js.map +1 -1
- package/dist/src/Db.d.ts.map +1 -1
- package/dist/src/Db.js +2 -5
- package/dist/src/Db.js.map +1 -1
- package/dist/src/Record.d.ts +35 -0
- package/dist/src/Record.d.ts.map +1 -1
- package/dist/src/Record.js +177 -45
- package/dist/src/Record.js.map +1 -1
- package/dist/src/Table.d.ts +18 -1
- package/dist/src/Table.d.ts.map +1 -1
- package/dist/src/encryption/EncryptionRecordHooks.d.ts +9 -4
- package/dist/src/encryption/EncryptionRecordHooks.d.ts.map +1 -1
- package/dist/src/encryption/EncryptionRecordHooks.js +65 -42
- package/dist/src/encryption/EncryptionRecordHooks.js.map +1 -1
- package/dist/test/DateTimeFieldReadOnFirstRead.test.d.ts +2 -0
- package/dist/test/DateTimeFieldReadOnFirstRead.test.d.ts.map +1 -0
- package/dist/test/DateTimeFieldReadOnFirstRead.test.js +238 -0
- package/dist/test/DateTimeFieldReadOnFirstRead.test.js.map +1 -0
- package/dist/test/HydrationBenchmark.test.d.ts +2 -0
- package/dist/test/HydrationBenchmark.test.d.ts.map +1 -0
- package/dist/test/HydrationBenchmark.test.js +299 -0
- package/dist/test/HydrationBenchmark.test.js.map +1 -0
- package/dist/test/LegacyCellHydration.test.d.ts +2 -0
- package/dist/test/LegacyCellHydration.test.d.ts.map +1 -0
- package/dist/test/LegacyCellHydration.test.js +321 -0
- package/dist/test/LegacyCellHydration.test.js.map +1 -0
- package/dist/test/SyncRowHydration.test.d.ts +2 -0
- package/dist/test/SyncRowHydration.test.d.ts.map +1 -0
- package/dist/test/SyncRowHydration.test.js +344 -0
- package/dist/test/SyncRowHydration.test.js.map +1 -0
- package/dist/test/reusable/ColumnTypesTests.d.ts.map +1 -1
- package/dist/test/reusable/ColumnTypesTests.js +55 -0
- package/dist/test/reusable/ColumnTypesTests.js.map +1 -1
- package/package.json +2 -2
- package/src/Columns.ts +14 -7
- package/src/Db.ts +3 -4
- package/src/Record.ts +202 -16
- package/src/Table.ts +21 -1
- package/src/encryption/EncryptionRecordHooks.ts +48 -17
- package/test/DateTimeFieldReadOnFirstRead.test.ts +162 -0
- package/test/HydrationBenchmark.test.ts +209 -0
- package/test/LegacyCellHydration.test.ts +234 -0
- package/test/SyncRowHydration.test.ts +249 -0
- package/test/reusable/ColumnTypesTests.ts +47 -1
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __extends = (this && this.__extends) || (function () {
|
|
3
|
+
var extendStatics = function (d, b) {
|
|
4
|
+
extendStatics = Object.setPrototypeOf ||
|
|
5
|
+
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
6
|
+
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|
7
|
+
return extendStatics(d, b);
|
|
8
|
+
};
|
|
9
|
+
return function (d, b) {
|
|
10
|
+
if (typeof b !== "function" && b !== null)
|
|
11
|
+
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|
12
|
+
extendStatics(d, b);
|
|
13
|
+
function __() { this.constructor = d; }
|
|
14
|
+
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
15
|
+
};
|
|
16
|
+
})();
|
|
17
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
18
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
19
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
20
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
21
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
22
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
23
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
24
|
+
});
|
|
25
|
+
};
|
|
26
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
27
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
28
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
29
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
30
|
+
function step(op) {
|
|
31
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
32
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
33
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
34
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
35
|
+
switch (op[0]) {
|
|
36
|
+
case 0: case 1: t = op; break;
|
|
37
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
38
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
39
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
40
|
+
default:
|
|
41
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
42
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
43
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
44
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
45
|
+
if (t[2]) _.ops.pop();
|
|
46
|
+
_.trys.pop(); continue;
|
|
47
|
+
}
|
|
48
|
+
op = body.call(thisArg, _);
|
|
49
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
50
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
54
|
+
var crypto_1 = require("crypto");
|
|
55
|
+
var reflection_1 = require("@proteinjs/reflection");
|
|
56
|
+
var Db_1 = require("../src/Db");
|
|
57
|
+
var TableWatcherRunner_1 = require("../src/TableWatcherRunner");
|
|
58
|
+
var Table_1 = require("../src/Table");
|
|
59
|
+
var Record_1 = require("../src/Record");
|
|
60
|
+
var Columns_1 = require("../src/Columns");
|
|
61
|
+
var DataKeyStore_1 = require("../src/encryption/DataKeyStore");
|
|
62
|
+
var EncryptionEnvelope_1 = require("../src/encryption/EncryptionEnvelope");
|
|
63
|
+
/** Where the loop stood when each cell was read: the row, and whether the sentinel had fired by then. */
|
|
64
|
+
var cellsRead = [];
|
|
65
|
+
var sentinelFired = false;
|
|
66
|
+
/**
|
|
67
|
+
* A column that notes, at each read, whether a microtask armed by the FIRST cell read has fired yet:
|
|
68
|
+
* a hydration that yields the loop between rows lets it fire mid-way; a synchronous one never does.
|
|
69
|
+
*/
|
|
70
|
+
var ObservingColumn = /** @class */ (function () {
|
|
71
|
+
function ObservingColumn(name) {
|
|
72
|
+
this.name = name;
|
|
73
|
+
}
|
|
74
|
+
ObservingColumn.prototype.deserialize = function (storedValue) {
|
|
75
|
+
if (cellsRead.length === 0) {
|
|
76
|
+
queueMicrotask(function () {
|
|
77
|
+
sentinelFired = true;
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
cellsRead.push({ column: this.name, row: storedValue, sentinelFired: sentinelFired });
|
|
81
|
+
return storedValue;
|
|
82
|
+
};
|
|
83
|
+
return ObservingColumn;
|
|
84
|
+
}());
|
|
85
|
+
var DocTable = /** @class */ (function (_super) {
|
|
86
|
+
__extends(DocTable, _super);
|
|
87
|
+
function DocTable() {
|
|
88
|
+
var _this = _super !== null && _super.apply(this, arguments) || this;
|
|
89
|
+
_this.name = 'hydration_doc';
|
|
90
|
+
_this.columns = (0, Record_1.withRecordColumns)({
|
|
91
|
+
title: new Columns_1.StringColumn('title'),
|
|
92
|
+
first: new ObservingColumn('first'),
|
|
93
|
+
second: new ObservingColumn('second'),
|
|
94
|
+
});
|
|
95
|
+
return _this;
|
|
96
|
+
}
|
|
97
|
+
return DocTable;
|
|
98
|
+
}(Table_1.Table));
|
|
99
|
+
var docTable = new DocTable();
|
|
100
|
+
var TestTransactionContextFactory = /** @class */ (function () {
|
|
101
|
+
function TestTransactionContextFactory() {
|
|
102
|
+
this.context = {};
|
|
103
|
+
}
|
|
104
|
+
TestTransactionContextFactory.prototype.getTransactionContext = function () {
|
|
105
|
+
return this.context;
|
|
106
|
+
};
|
|
107
|
+
TestTransactionContextFactory.prototype.runInContext = function (context, fn) {
|
|
108
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
109
|
+
var previous;
|
|
110
|
+
return __generator(this, function (_a) {
|
|
111
|
+
switch (_a.label) {
|
|
112
|
+
case 0:
|
|
113
|
+
previous = this.context;
|
|
114
|
+
this.context = context;
|
|
115
|
+
_a.label = 1;
|
|
116
|
+
case 1:
|
|
117
|
+
_a.trys.push([1, , 3, 4]);
|
|
118
|
+
return [4 /*yield*/, fn()];
|
|
119
|
+
case 2: return [2 /*return*/, _a.sent()];
|
|
120
|
+
case 3:
|
|
121
|
+
this.context = previous;
|
|
122
|
+
return [7 /*endfinally*/];
|
|
123
|
+
case 4: return [2 /*return*/];
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
};
|
|
128
|
+
return TestTransactionContextFactory;
|
|
129
|
+
}());
|
|
130
|
+
/** A driver that answers every query with the rows it was handed. */
|
|
131
|
+
var RowsDriver = /** @class */ (function () {
|
|
132
|
+
function RowsDriver(rows) {
|
|
133
|
+
this.rows = rows;
|
|
134
|
+
}
|
|
135
|
+
RowsDriver.prototype.getDbName = function () {
|
|
136
|
+
return 'test';
|
|
137
|
+
};
|
|
138
|
+
RowsDriver.prototype.createDbIfNotExists = function () {
|
|
139
|
+
return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) {
|
|
140
|
+
return [2 /*return*/];
|
|
141
|
+
}); });
|
|
142
|
+
};
|
|
143
|
+
RowsDriver.prototype.createDb = function () {
|
|
144
|
+
return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) {
|
|
145
|
+
return [2 /*return*/];
|
|
146
|
+
}); });
|
|
147
|
+
};
|
|
148
|
+
RowsDriver.prototype.dropDb = function () {
|
|
149
|
+
return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) {
|
|
150
|
+
return [2 /*return*/];
|
|
151
|
+
}); });
|
|
152
|
+
};
|
|
153
|
+
RowsDriver.prototype.getTableManager = function () {
|
|
154
|
+
throw new Error('not used by these tests');
|
|
155
|
+
};
|
|
156
|
+
RowsDriver.prototype.runQuery = function () {
|
|
157
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
158
|
+
return __generator(this, function (_a) {
|
|
159
|
+
return [2 /*return*/, this.rows];
|
|
160
|
+
});
|
|
161
|
+
});
|
|
162
|
+
};
|
|
163
|
+
RowsDriver.prototype.runDml = function () {
|
|
164
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
165
|
+
return __generator(this, function (_a) {
|
|
166
|
+
return [2 /*return*/, 0];
|
|
167
|
+
});
|
|
168
|
+
});
|
|
169
|
+
};
|
|
170
|
+
RowsDriver.prototype.runTransaction = function (fn) {
|
|
171
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
172
|
+
return __generator(this, function (_a) {
|
|
173
|
+
switch (_a.label) {
|
|
174
|
+
case 0: return [4 /*yield*/, fn({ id: 'transaction' })];
|
|
175
|
+
case 1: return [2 /*return*/, _a.sent()];
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
};
|
|
180
|
+
RowsDriver.prototype.getOperationDeadlineMs = function () {
|
|
181
|
+
return 1000;
|
|
182
|
+
};
|
|
183
|
+
return RowsDriver;
|
|
184
|
+
}());
|
|
185
|
+
var dbOver = function (rows) {
|
|
186
|
+
return new Db_1.Db(new RowsDriver(rows), function () { return docTable; }, new TestTransactionContextFactory(), true);
|
|
187
|
+
};
|
|
188
|
+
var storedRows = function (count) {
|
|
189
|
+
return Array.from({ length: count }, function (_, i) { return ({
|
|
190
|
+
id: "row-".concat(i),
|
|
191
|
+
created: new Date(1700000000000 + i),
|
|
192
|
+
updated: new Date(1700000000000 + i),
|
|
193
|
+
title: "title ".concat(i),
|
|
194
|
+
first: i,
|
|
195
|
+
second: i,
|
|
196
|
+
}); });
|
|
197
|
+
};
|
|
198
|
+
var objectCache = function () { return reflection_1.SourceRepository.get().objectCache; };
|
|
199
|
+
var originalWatchers;
|
|
200
|
+
// No reflection graph in a unit test: the watcher registry is empty by declaration.
|
|
201
|
+
beforeAll(function () {
|
|
202
|
+
originalWatchers = objectCache()['@proteinjs/db/TableWatcher'];
|
|
203
|
+
objectCache()['@proteinjs/db/TableWatcher'] = [];
|
|
204
|
+
TableWatcherRunner_1.TableWatcherRunner.tableWatcherMap = undefined;
|
|
205
|
+
});
|
|
206
|
+
afterAll(function () {
|
|
207
|
+
if (originalWatchers) {
|
|
208
|
+
objectCache()['@proteinjs/db/TableWatcher'] = originalWatchers;
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
delete objectCache()['@proteinjs/db/TableWatcher'];
|
|
212
|
+
}
|
|
213
|
+
TableWatcherRunner_1.TableWatcherRunner.tableWatcherMap = undefined;
|
|
214
|
+
});
|
|
215
|
+
var keyFor = function (owner, version) { return ({
|
|
216
|
+
owner: owner,
|
|
217
|
+
version: version,
|
|
218
|
+
cipherKey: (0, crypto_1.randomBytes)(32),
|
|
219
|
+
indexKey: (0, crypto_1.randomBytes)(32),
|
|
220
|
+
}); };
|
|
221
|
+
describe('a result set hydrates in one synchronous pass when no row needs an await', function () {
|
|
222
|
+
beforeEach(function () {
|
|
223
|
+
cellsRead.length = 0;
|
|
224
|
+
sentinelFired = false;
|
|
225
|
+
});
|
|
226
|
+
it('a query over plain rows never yields the event loop between rows', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
227
|
+
var rows, records;
|
|
228
|
+
return __generator(this, function (_a) {
|
|
229
|
+
switch (_a.label) {
|
|
230
|
+
case 0:
|
|
231
|
+
rows = storedRows(200);
|
|
232
|
+
return [4 /*yield*/, dbOver(rows).query(docTable, {})];
|
|
233
|
+
case 1:
|
|
234
|
+
records = _a.sent();
|
|
235
|
+
expect(records).toHaveLength(200);
|
|
236
|
+
expect(records[199]).toMatchObject({ id: 'row-199', title: 'title 199', first: 199, second: 199 });
|
|
237
|
+
// Every cell of every row was read before the microtask armed by the first cell could fire.
|
|
238
|
+
expect(cellsRead).toHaveLength(400);
|
|
239
|
+
expect(cellsRead.filter(function (cell) { return cell.sentinelFired; }).map(function (cell) { return "".concat(cell.column, ":").concat(cell.row); })).toEqual([]);
|
|
240
|
+
expect(sentinelFired).toBe(true);
|
|
241
|
+
return [2 /*return*/];
|
|
242
|
+
}
|
|
243
|
+
});
|
|
244
|
+
}); });
|
|
245
|
+
it('the serializer answers a plain result set with the array itself, not a promise', function () {
|
|
246
|
+
var rows = storedRows(3);
|
|
247
|
+
var records = new Record_1.RecordSerializer(docTable).deserializeAll(rows);
|
|
248
|
+
expect(Array.isArray(records)).toBe(true);
|
|
249
|
+
expect(records.map(function (record) { return record.title; })).toEqual(['title 0', 'title 1', 'title 2']);
|
|
250
|
+
});
|
|
251
|
+
it('a column whose deserialize answers with a promise still settles, in column order', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
252
|
+
var LaterColumn, LaterTable, laterTable, rows, settling, records;
|
|
253
|
+
return __generator(this, function (_a) {
|
|
254
|
+
switch (_a.label) {
|
|
255
|
+
case 0:
|
|
256
|
+
LaterColumn = /** @class */ (function () {
|
|
257
|
+
function LaterColumn(name) {
|
|
258
|
+
this.name = name;
|
|
259
|
+
}
|
|
260
|
+
LaterColumn.prototype.deserialize = function (storedValue) {
|
|
261
|
+
return Promise.resolve(storedValue === null ? null : storedValue * 2);
|
|
262
|
+
};
|
|
263
|
+
return LaterColumn;
|
|
264
|
+
}());
|
|
265
|
+
LaterTable = /** @class */ (function (_super) {
|
|
266
|
+
__extends(LaterTable, _super);
|
|
267
|
+
function LaterTable() {
|
|
268
|
+
var _this = _super !== null && _super.apply(this, arguments) || this;
|
|
269
|
+
_this.name = 'hydration_later';
|
|
270
|
+
_this.columns = (0, Record_1.withRecordColumns)({
|
|
271
|
+
title: new Columns_1.StringColumn('title'),
|
|
272
|
+
later: new LaterColumn('later'),
|
|
273
|
+
after: new Columns_1.StringColumn('after'),
|
|
274
|
+
});
|
|
275
|
+
return _this;
|
|
276
|
+
}
|
|
277
|
+
return LaterTable;
|
|
278
|
+
}(Table_1.Table));
|
|
279
|
+
laterTable = new LaterTable();
|
|
280
|
+
rows = [
|
|
281
|
+
{ id: 'a', created: new Date(), updated: new Date(), title: 'one', later: 21, after: 'x' },
|
|
282
|
+
{ id: 'b', created: new Date(), updated: new Date(), title: 'two', later: null, after: 'y' },
|
|
283
|
+
];
|
|
284
|
+
settling = new Record_1.RecordSerializer(laterTable).deserializeAll(rows);
|
|
285
|
+
expect(Array.isArray(settling)).toBe(false);
|
|
286
|
+
return [4 /*yield*/, settling];
|
|
287
|
+
case 1:
|
|
288
|
+
records = _a.sent();
|
|
289
|
+
expect(records.map(function (record) { return record.later; })).toEqual([42, null]);
|
|
290
|
+
expect(Object.keys(records[0])).toEqual(['id', 'created', 'updated', 'title', 'later', 'after']);
|
|
291
|
+
return [2 /*return*/];
|
|
292
|
+
}
|
|
293
|
+
});
|
|
294
|
+
}); });
|
|
295
|
+
it('a row holding a ciphertext envelope takes the async road and decrypts; its plain neighbors ride along', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
296
|
+
var key, envelope, keyRead, rows, settling, records;
|
|
297
|
+
return __generator(this, function (_a) {
|
|
298
|
+
switch (_a.label) {
|
|
299
|
+
case 0:
|
|
300
|
+
key = keyFor('owner-1', 4);
|
|
301
|
+
envelope = new EncryptionEnvelope_1.EncryptionEnvelope();
|
|
302
|
+
keyRead = jest.spyOn(DataKeyStore_1.DataKeyStore.prototype, 'getKeyByVersion').mockResolvedValue(key);
|
|
303
|
+
_a.label = 1;
|
|
304
|
+
case 1:
|
|
305
|
+
_a.trys.push([1, , 3, 4]);
|
|
306
|
+
rows = storedRows(3);
|
|
307
|
+
rows[1].title = envelope.encrypt('the plaintext', key);
|
|
308
|
+
settling = new Record_1.RecordSerializer(docTable).deserializeAll(rows);
|
|
309
|
+
expect(Array.isArray(settling)).toBe(false);
|
|
310
|
+
return [4 /*yield*/, settling];
|
|
311
|
+
case 2:
|
|
312
|
+
records = _a.sent();
|
|
313
|
+
expect(records.map(function (record) { return record.title; })).toEqual(['title 0', 'the plaintext', 'title 2']);
|
|
314
|
+
expect(keyRead).toHaveBeenCalledTimes(1);
|
|
315
|
+
expect(keyRead).toHaveBeenCalledWith('owner-1', 4);
|
|
316
|
+
// The plain rows were hydrated in the one pass; the envelope row landed when its key read settled.
|
|
317
|
+
expect(cellsRead.map(function (cell) { return cell.row; })).toEqual([0, 0, 2, 2, 1, 1]);
|
|
318
|
+
return [3 /*break*/, 4];
|
|
319
|
+
case 3:
|
|
320
|
+
keyRead.mockRestore();
|
|
321
|
+
return [7 /*endfinally*/];
|
|
322
|
+
case 4: return [2 /*return*/];
|
|
323
|
+
}
|
|
324
|
+
});
|
|
325
|
+
}); });
|
|
326
|
+
it('a stored column the table no longer declares is omitted; a column without deserialize passes its value through', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
327
|
+
var rows, record;
|
|
328
|
+
return __generator(this, function (_a) {
|
|
329
|
+
switch (_a.label) {
|
|
330
|
+
case 0:
|
|
331
|
+
rows = [
|
|
332
|
+
{ id: 'a', created: new Date(), updated: new Date(), title: 'one', first: 1, second: 1, retired: 'gone' },
|
|
333
|
+
];
|
|
334
|
+
return [4 /*yield*/, new Record_1.RecordSerializer(docTable).deserializeAll(rows)];
|
|
335
|
+
case 1:
|
|
336
|
+
record = (_a.sent())[0];
|
|
337
|
+
expect(record).toMatchObject({ id: 'a', title: 'one', first: 1, second: 1 });
|
|
338
|
+
expect('retired' in record).toBe(false);
|
|
339
|
+
return [2 /*return*/];
|
|
340
|
+
}
|
|
341
|
+
});
|
|
342
|
+
}); });
|
|
343
|
+
});
|
|
344
|
+
//# sourceMappingURL=SyncRowHydration.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SyncRowHydration.test.js","sourceRoot":"","sources":["../../test/SyncRowHydration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ColumnTypesTests.d.ts","sourceRoot":"","sources":["../../../test/reusable/ColumnTypesTests.ts"],"names":[],"mappings":"AAAA,OAAO,EAAM,QAAQ,EAAU,KAAK,EAAE,gCAAgC,
|
|
1
|
+
{"version":3,"file":"ColumnTypesTests.d.ts","sourceRoot":"","sources":["../../../test/reusable/ColumnTypesTests.ts"],"names":[],"mappings":"AAAA,OAAO,EAAM,QAAQ,EAAU,KAAK,EAAE,gCAAgC,EAAuB,MAAM,eAAe,CAAC;AAMnH,eAAO,MAAM,eAAe,WAClB,QAAQ,6BACW,gCAAgC,qBACxC,MAAM,GAAG,CAAC,KAAK,QAAQ,IAAI,CAAC,eAsHhD,CAAC"}
|
|
@@ -38,6 +38,8 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
|
38
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
39
|
exports.columnTypeTests = void 0;
|
|
40
40
|
var db_1 = require("@proteinjs/db");
|
|
41
|
+
var db_query_1 = require("@proteinjs/db-query");
|
|
42
|
+
var StatementConfigFactory_1 = require("../../src/StatementConfigFactory");
|
|
41
43
|
var DbTestEnvironment_1 = require("../util/DbTestEnvironment");
|
|
42
44
|
var columnTypesTestTables_1 = require("../util/tables/columnTypesTestTables");
|
|
43
45
|
var columnTypeTests = function (driver, transactionContextFactory, dropTable) {
|
|
@@ -137,6 +139,59 @@ var columnTypeTests = function (driver, transactionContextFactory, dropTable) {
|
|
|
137
139
|
}
|
|
138
140
|
});
|
|
139
141
|
}); });
|
|
142
|
+
test('A legacy cell the column cannot deserialize never takes the row with it', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
143
|
+
var testTable, legacy, intact, statementConfigFactory, legacyRow, fetched, all, other;
|
|
144
|
+
return __generator(this, function (_a) {
|
|
145
|
+
switch (_a.label) {
|
|
146
|
+
case 0:
|
|
147
|
+
testTable = columnTypesTestTables_1.columnTypesTestTables.Test;
|
|
148
|
+
return [4 /*yield*/, db.insert(testTable, {
|
|
149
|
+
stringColumn: 'legacy',
|
|
150
|
+
objectColumn: { theme: 'dark' },
|
|
151
|
+
arrayColumn: ['a', 'b'],
|
|
152
|
+
})];
|
|
153
|
+
case 1:
|
|
154
|
+
legacy = _a.sent();
|
|
155
|
+
return [4 /*yield*/, db.insert(testTable, {
|
|
156
|
+
stringColumn: 'intact',
|
|
157
|
+
objectColumn: { theme: 'light' },
|
|
158
|
+
arrayColumn: ['c'],
|
|
159
|
+
})];
|
|
160
|
+
case 2:
|
|
161
|
+
intact = _a.sent();
|
|
162
|
+
statementConfigFactory = new StatementConfigFactory_1.StatementConfigFactory(driver.getDbName());
|
|
163
|
+
legacyRow = new db_1.QueryBuilderFactory()
|
|
164
|
+
.getQueryBuilder(testTable)
|
|
165
|
+
.condition({ field: 'id', operator: '=', value: legacy.id });
|
|
166
|
+
return [4 /*yield*/, driver.runDml(function (config) {
|
|
167
|
+
return new db_query_1.StatementFactory().update(testTable.name, { object_column: 'legacyword', array_column: 'legacyword' }, legacyRow, statementConfigFactory.getStatementConfig(config));
|
|
168
|
+
})];
|
|
169
|
+
case 3:
|
|
170
|
+
_a.sent();
|
|
171
|
+
return [4 /*yield*/, db.get(testTable, { id: legacy.id })];
|
|
172
|
+
case 4:
|
|
173
|
+
fetched = _a.sent();
|
|
174
|
+
expect(fetched).toMatchObject({ id: legacy.id, stringColumn: 'legacy' });
|
|
175
|
+
expect(fetched).not.toHaveProperty('objectColumn');
|
|
176
|
+
expect(fetched).not.toHaveProperty('arrayColumn');
|
|
177
|
+
return [4 /*yield*/, db.query(testTable, {})];
|
|
178
|
+
case 5:
|
|
179
|
+
all = _a.sent();
|
|
180
|
+
expect(all.map(function (record) { return record.id; }).sort()).toEqual([legacy.id, intact.id].sort());
|
|
181
|
+
other = all.find(function (record) { return record.id === intact.id; });
|
|
182
|
+
expect(other).toMatchObject({ stringColumn: 'intact', objectColumn: { theme: 'light' }, arrayColumn: ['c'] });
|
|
183
|
+
// Clean up
|
|
184
|
+
return [4 /*yield*/, db.delete(testTable, { id: legacy.id })];
|
|
185
|
+
case 6:
|
|
186
|
+
// Clean up
|
|
187
|
+
_a.sent();
|
|
188
|
+
return [4 /*yield*/, db.delete(testTable, { id: intact.id })];
|
|
189
|
+
case 7:
|
|
190
|
+
_a.sent();
|
|
191
|
+
return [2 /*return*/];
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
}); });
|
|
140
195
|
};
|
|
141
196
|
};
|
|
142
197
|
exports.columnTypeTests = columnTypeTests;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ColumnTypesTests.js","sourceRoot":"","sources":["../../../test/reusable/ColumnTypesTests.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"ColumnTypesTests.js","sourceRoot":"","sources":["../../../test/reusable/ColumnTypesTests.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@proteinjs/db",
|
|
3
|
-
"version": "1.54.
|
|
3
|
+
"version": "1.54.3",
|
|
4
4
|
"main": "./dist/generated/index.js",
|
|
5
5
|
"types": "./dist/generated/index.d.ts",
|
|
6
6
|
"exports": {
|
|
@@ -66,5 +66,5 @@
|
|
|
66
66
|
"ts-jest": "29.1.1",
|
|
67
67
|
"typescript": "5.2.2"
|
|
68
68
|
},
|
|
69
|
-
"gitHead": "
|
|
69
|
+
"gitHead": "351cc984b09d074bf0306a82750efd99ec00654a"
|
|
70
70
|
}
|
package/src/Columns.ts
CHANGED
|
@@ -74,7 +74,7 @@ export class BooleanColumn implements Column<boolean | null, boolean | null> {
|
|
|
74
74
|
return null;
|
|
75
75
|
}
|
|
76
76
|
|
|
77
|
-
|
|
77
|
+
deserialize(serializedFieldValue: boolean | null): boolean | null {
|
|
78
78
|
if (serializedFieldValue) {
|
|
79
79
|
return true;
|
|
80
80
|
}
|
|
@@ -95,6 +95,13 @@ export class DateColumn implements Column<Date, Date> {
|
|
|
95
95
|
}
|
|
96
96
|
|
|
97
97
|
export class DateTimeColumn implements Column<moment.Moment | null, Date | null> {
|
|
98
|
+
/**
|
|
99
|
+
* The moment is built on the field's first read, not at hydration (`Column.deserializeOnFirstRead`):
|
|
100
|
+
* a row carries several of these and most are never read, and a moment costs more to build than
|
|
101
|
+
* the stored Date it is built from.
|
|
102
|
+
*/
|
|
103
|
+
readonly deserializeOnFirstRead = true;
|
|
104
|
+
|
|
98
105
|
constructor(
|
|
99
106
|
public name: string,
|
|
100
107
|
public options?: ColumnOptions
|
|
@@ -112,7 +119,7 @@ export class DateTimeColumn implements Column<moment.Moment | null, Date | null>
|
|
|
112
119
|
return fieldValue.toDate();
|
|
113
120
|
}
|
|
114
121
|
|
|
115
|
-
|
|
122
|
+
deserialize(serializedFieldValue: Date | null): moment.Moment | null {
|
|
116
123
|
if (serializedFieldValue === undefined || serializedFieldValue === null) {
|
|
117
124
|
return null;
|
|
118
125
|
}
|
|
@@ -186,7 +193,7 @@ export class ObjectColumn<T> extends StringColumn<T> {
|
|
|
186
193
|
return Serializer.serialize(fieldValue);
|
|
187
194
|
}
|
|
188
195
|
|
|
189
|
-
|
|
196
|
+
deserialize(serializedFieldValue: string): T | null {
|
|
190
197
|
if (serializedFieldValue === undefined || serializedFieldValue == null) {
|
|
191
198
|
return null;
|
|
192
199
|
}
|
|
@@ -247,8 +254,8 @@ export class ReferenceArrayColumn<T extends Record> extends ObjectColumn<Referen
|
|
|
247
254
|
return await super.serialize(returnIds as any);
|
|
248
255
|
}
|
|
249
256
|
|
|
250
|
-
|
|
251
|
-
let ids =
|
|
257
|
+
deserialize(serializedFieldValue: string): ReferenceArray<T> | null {
|
|
258
|
+
let ids = super.deserialize(serializedFieldValue) as string[] | null;
|
|
252
259
|
if (ids === null) {
|
|
253
260
|
ids = [];
|
|
254
261
|
}
|
|
@@ -315,7 +322,7 @@ export class ReferenceColumn<T extends Record> extends StringColumn<Reference<T>
|
|
|
315
322
|
return fieldValue._id;
|
|
316
323
|
}
|
|
317
324
|
|
|
318
|
-
|
|
325
|
+
deserialize(serializedFieldValue: string): Reference<T> | null {
|
|
319
326
|
const reference = new Reference(this.referenceTable, serializedFieldValue);
|
|
320
327
|
if (reference._id === null) {
|
|
321
328
|
return null;
|
|
@@ -487,7 +494,7 @@ export class DynamicReferenceColumn<T extends Record> extends StringColumn<Refer
|
|
|
487
494
|
return fieldValue._id;
|
|
488
495
|
}
|
|
489
496
|
|
|
490
|
-
|
|
497
|
+
deserialize(serializedFieldValue: string, serializedRecord: any): Reference<T> | null {
|
|
491
498
|
const reference = new Reference('', serializedFieldValue);
|
|
492
499
|
if (reference._id === null) {
|
|
493
500
|
return null;
|
package/src/Db.ts
CHANGED
|
@@ -750,10 +750,9 @@ export class Db<R extends Record = Record> implements DbService<R> {
|
|
|
750
750
|
const generateQuery = (config: DbDriverQueryStatementConfig) =>
|
|
751
751
|
qb.toSql(this.statementConfigFactory.getStatementConfig(config));
|
|
752
752
|
const serializedRecords = await this.dbDriver.runQuery(generateQuery, this.transactionForDriver());
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
);
|
|
753
|
+
// One pass over the result set — synchronous when no row needs an await (see
|
|
754
|
+
// `RecordSerializer.deserializeAll`): no promise per row, no yield of the loop between rows.
|
|
755
|
+
const records = await new RecordSerializer<T>(table).deserializeAll(serializedRecords);
|
|
757
756
|
await this.preloadReferences(records, options);
|
|
758
757
|
return records;
|
|
759
758
|
}
|