@proteinjs/db 1.56.0 → 1.58.0

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.
@@ -0,0 +1,280 @@
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 reflection_1 = require("@proteinjs/reflection");
55
+ var Db_1 = require("../src/Db");
56
+ var Table_1 = require("../src/Table");
57
+ var Record_1 = require("../src/Record");
58
+ var Columns_1 = require("../src/Columns");
59
+ var TableWatcherRunner_1 = require("../src/TableWatcherRunner");
60
+ var DocTable = /** @class */ (function (_super) {
61
+ __extends(DocTable, _super);
62
+ function DocTable() {
63
+ var _this = _super !== null && _super.apply(this, arguments) || this;
64
+ _this.name = 'is_system_doc';
65
+ /** Every door open to everyone: a session Db reaches the write with no user to resolve. */
66
+ _this.auth = { db: { all: 'public' } };
67
+ _this.columns = (0, Record_1.withRecordColumns)({
68
+ title: new Columns_1.StringColumn('title'),
69
+ });
70
+ return _this;
71
+ }
72
+ return DocTable;
73
+ }(Table_1.Table));
74
+ var docTable = new DocTable();
75
+ /** What each hook was handed: the mode of its trailing Db. */
76
+ var handed = [];
77
+ var ModeRecordingWatcher = /** @class */ (function () {
78
+ function ModeRecordingWatcher() {
79
+ }
80
+ ModeRecordingWatcher.prototype.name = function () {
81
+ return 'ModeRecordingWatcher';
82
+ };
83
+ ModeRecordingWatcher.prototype.table = function () {
84
+ return docTable;
85
+ };
86
+ ModeRecordingWatcher.prototype.beforeInsert = function (record, db) {
87
+ return __awaiter(this, void 0, void 0, function () {
88
+ return __generator(this, function (_a) {
89
+ handed.push({ phase: 'beforeInsert', mode: db === null || db === void 0 ? void 0 : db.isSystem() });
90
+ return [2 /*return*/, record];
91
+ });
92
+ });
93
+ };
94
+ ModeRecordingWatcher.prototype.afterInsert = function (_record, db) {
95
+ return __awaiter(this, void 0, void 0, function () {
96
+ return __generator(this, function (_a) {
97
+ handed.push({ phase: 'afterInsert', mode: db === null || db === void 0 ? void 0 : db.isSystem() });
98
+ return [2 /*return*/];
99
+ });
100
+ });
101
+ };
102
+ return ModeRecordingWatcher;
103
+ }());
104
+ var TestTransactionContextFactory = /** @class */ (function () {
105
+ function TestTransactionContextFactory() {
106
+ this.context = {};
107
+ }
108
+ TestTransactionContextFactory.prototype.getTransactionContext = function () {
109
+ return this.context;
110
+ };
111
+ TestTransactionContextFactory.prototype.runInContext = function (context, fn) {
112
+ return __awaiter(this, void 0, void 0, function () {
113
+ var previous;
114
+ return __generator(this, function (_a) {
115
+ switch (_a.label) {
116
+ case 0:
117
+ previous = this.context;
118
+ this.context = context;
119
+ _a.label = 1;
120
+ case 1:
121
+ _a.trys.push([1, , 3, 4]);
122
+ return [4 /*yield*/, fn()];
123
+ case 2: return [2 /*return*/, _a.sent()];
124
+ case 3:
125
+ this.context = previous;
126
+ return [7 /*endfinally*/];
127
+ case 4: return [2 /*return*/];
128
+ }
129
+ });
130
+ });
131
+ };
132
+ return TestTransactionContextFactory;
133
+ }());
134
+ /** Accepts every statement; no database behind it. */
135
+ var AcceptingDriver = /** @class */ (function () {
136
+ function AcceptingDriver() {
137
+ }
138
+ AcceptingDriver.prototype.getDbName = function () {
139
+ return 'test';
140
+ };
141
+ AcceptingDriver.prototype.createDbIfNotExists = function () {
142
+ return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) {
143
+ return [2 /*return*/];
144
+ }); });
145
+ };
146
+ AcceptingDriver.prototype.createDb = function () {
147
+ return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) {
148
+ return [2 /*return*/];
149
+ }); });
150
+ };
151
+ AcceptingDriver.prototype.dropDb = function () {
152
+ return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) {
153
+ return [2 /*return*/];
154
+ }); });
155
+ };
156
+ AcceptingDriver.prototype.getTableManager = function () {
157
+ throw new Error('not used by these tests');
158
+ };
159
+ AcceptingDriver.prototype.runQuery = function () {
160
+ return __awaiter(this, void 0, void 0, function () {
161
+ return __generator(this, function (_a) {
162
+ return [2 /*return*/, []];
163
+ });
164
+ });
165
+ };
166
+ AcceptingDriver.prototype.runDml = function (generateStatement) {
167
+ return __awaiter(this, void 0, void 0, function () {
168
+ return __generator(this, function (_a) {
169
+ generateStatement({
170
+ useParams: true,
171
+ useNamedParams: true,
172
+ prefixTablesWithDb: false,
173
+ getDriverColumnType: function () { return 'STRING(MAX)'; },
174
+ });
175
+ return [2 /*return*/, 1];
176
+ });
177
+ });
178
+ };
179
+ AcceptingDriver.prototype.runTransaction = function (fn) {
180
+ return __awaiter(this, void 0, void 0, function () {
181
+ return __generator(this, function (_a) {
182
+ switch (_a.label) {
183
+ case 0: return [4 /*yield*/, fn({ id: 'transaction' })];
184
+ case 1: return [2 /*return*/, _a.sent()];
185
+ }
186
+ });
187
+ });
188
+ };
189
+ AcceptingDriver.prototype.getOperationDeadlineMs = function () {
190
+ return 1000;
191
+ };
192
+ return AcceptingDriver;
193
+ }());
194
+ var objectCache = function () { return reflection_1.SourceRepository.get().objectCache; };
195
+ var DEFAULT_DRIVER_GLOBAL = '__proteinjs_db_defaultDbDriver';
196
+ var driver = new AcceptingDriver();
197
+ var transactions = new TestTransactionContextFactory();
198
+ var modesHandedBy = function (db) { return __awaiter(void 0, void 0, void 0, function () {
199
+ return __generator(this, function (_a) {
200
+ switch (_a.label) {
201
+ case 0:
202
+ handed.length = 0;
203
+ return [4 /*yield*/, db.insert(docTable, { title: 'row' })];
204
+ case 1:
205
+ _a.sent();
206
+ expect(handed.map(function (_a) {
207
+ var phase = _a.phase;
208
+ return phase;
209
+ })).toEqual(['beforeInsert', 'afterInsert']);
210
+ return [2 /*return*/, handed.map(function (_a) {
211
+ var mode = _a.mode;
212
+ return mode;
213
+ })];
214
+ }
215
+ });
216
+ }); };
217
+ describe('Db.isSystem', function () {
218
+ var originalWatchers;
219
+ var originalFactories;
220
+ var originalTransactionFactories;
221
+ beforeAll(function () {
222
+ originalWatchers = objectCache()['@proteinjs/db/TableWatcher'];
223
+ originalFactories = objectCache()['@proteinjs/db/DefaultDbDriverFactory'];
224
+ originalTransactionFactories = objectCache()['@proteinjs/db/DefaultTransactionContextFactory'];
225
+ objectCache()['@proteinjs/db/TableWatcher'] = [new ModeRecordingWatcher()];
226
+ // The public factories resolve their driver and transaction context through reflection.
227
+ objectCache()['@proteinjs/db/DefaultDbDriverFactory'] = [{ getDbDriver: function () { return driver; } }];
228
+ objectCache()['@proteinjs/db/DefaultTransactionContextFactory'] = [transactions];
229
+ delete globalThis[DEFAULT_DRIVER_GLOBAL];
230
+ TableWatcherRunner_1.TableWatcherRunner.tableWatcherMap = undefined;
231
+ });
232
+ afterAll(function () {
233
+ var restore = function (name, original) {
234
+ if (original) {
235
+ objectCache()[name] = original;
236
+ }
237
+ else {
238
+ delete objectCache()[name];
239
+ }
240
+ };
241
+ restore('@proteinjs/db/TableWatcher', originalWatchers);
242
+ restore('@proteinjs/db/DefaultDbDriverFactory', originalFactories);
243
+ restore('@proteinjs/db/DefaultTransactionContextFactory', originalTransactionFactories);
244
+ delete globalThis[DEFAULT_DRIVER_GLOBAL];
245
+ TableWatcherRunner_1.TableWatcherRunner.tableWatcherMap = undefined;
246
+ });
247
+ test('a system Db answers true, a session Db false — on the public factories and on the constructor', function () {
248
+ expect((0, Db_1.getDbAsSystem)().isSystem()).toBe(true);
249
+ expect((0, Db_1.getDb)().isSystem()).toBe(false);
250
+ expect(new Db_1.Db(driver, function () { return docTable; }, transactions, true).isSystem()).toBe(true);
251
+ expect(new Db_1.Db(driver, function () { return docTable; }, transactions).isSystem()).toBe(false);
252
+ });
253
+ test("the Db a write hands its watchers answers for THAT write: a system write's hooks read true", function () { return __awaiter(void 0, void 0, void 0, function () {
254
+ var _a;
255
+ return __generator(this, function (_b) {
256
+ switch (_b.label) {
257
+ case 0:
258
+ _a = expect;
259
+ return [4 /*yield*/, modesHandedBy((0, Db_1.getDbAsSystem)())];
260
+ case 1:
261
+ _a.apply(void 0, [_b.sent()]).toEqual([true, true]);
262
+ return [2 /*return*/];
263
+ }
264
+ });
265
+ }); });
266
+ test("the Db a write hands its watchers answers for THAT write: a session write's hooks read false", function () { return __awaiter(void 0, void 0, void 0, function () {
267
+ var _a;
268
+ return __generator(this, function (_b) {
269
+ switch (_b.label) {
270
+ case 0:
271
+ _a = expect;
272
+ return [4 /*yield*/, modesHandedBy((0, Db_1.getDb)())];
273
+ case 1:
274
+ _a.apply(void 0, [_b.sent()]).toEqual([false, false]);
275
+ return [2 /*return*/];
276
+ }
277
+ });
278
+ }); });
279
+ });
280
+ //# sourceMappingURL=DbIsSystem.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DbIsSystem.test.js","sourceRoot":"","sources":["../../test/DbIsSystem.test.ts"],"names":[],"mappings":"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"}