@proteinjs/db 1.18.1 → 1.19.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,643 @@
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
+ exports.cascadeDeleteTests = exports.getCascadeDeleteTestTable = exports.TaskTable = exports.WorkerTable = exports.GroupArrRevTable = exports.MemberArrRevTable = exports.CommentTable = exports.PostTable = exports.GroupDynTable = exports.MemberDynTable = exports.GroupArrTable = exports.MemberArrTable = exports.GroupRefTable = exports.MemberRefTable = void 0;
55
+ var Columns_1 = require("../../src/Columns");
56
+ var Db_1 = require("../../src/Db");
57
+ var Table_1 = require("../../src/Table");
58
+ var Record_1 = require("../../src/Record");
59
+ var Reference_1 = require("../../src/reference/Reference");
60
+ var ReferenceArray_1 = require("../../src/reference/ReferenceArray");
61
+ var db_query_1 = require("@proteinjs/db-query");
62
+ /**
63
+ * ---------- Table Names ----------
64
+ */
65
+ // Cascade (ReferenceColumn)
66
+ var MEMBER_REF_TABLE = 'db_test_cd_members_ref';
67
+ var GROUP_REF_TABLE = 'db_test_cd_groups_ref';
68
+ // Cascade (ReferenceArrayColumn)
69
+ var MEMBER_ARR_TABLE = 'db_test_cd_members_arr';
70
+ var GROUP_ARR_TABLE = 'db_test_cd_groups_arr';
71
+ // Cascade (DynamicReferenceColumn)
72
+ var MEMBER_DYN_TABLE = 'db_test_cd_members_dyn';
73
+ var GROUP_DYN_TABLE = 'db_test_cd_groups_dyn';
74
+ // Reverse (ReferenceColumn)
75
+ var POST_TABLE = 'db_test_cd_posts';
76
+ var COMMENT_TABLE = 'db_test_cd_comments';
77
+ // Reverse (ReferenceArrayColumn)
78
+ var MEMBER_ARR_REV_TABLE = 'db_test_cd_members_arr_rev';
79
+ var GROUP_ARR_REV_TABLE = 'db_test_cd_groups_arr_rev';
80
+ // Reverse (DynamicReferenceColumn)
81
+ var WORKER_TABLE = 'db_test_cd_workers';
82
+ var TASK_TABLE = 'db_test_cd_tasks';
83
+ /**
84
+ * ---------- Table Classes ----------
85
+ */
86
+ // Cascade: ReferenceColumn
87
+ var MemberRefTable = /** @class */ (function (_super) {
88
+ __extends(MemberRefTable, _super);
89
+ function MemberRefTable() {
90
+ var _this = _super !== null && _super.apply(this, arguments) || this;
91
+ _this.name = MEMBER_REF_TABLE;
92
+ _this.columns = (0, Record_1.withRecordColumns)({
93
+ name: new Columns_1.StringColumn('name'),
94
+ });
95
+ return _this;
96
+ }
97
+ return MemberRefTable;
98
+ }(Table_1.Table));
99
+ exports.MemberRefTable = MemberRefTable;
100
+ var GroupRefTable = /** @class */ (function (_super) {
101
+ __extends(GroupRefTable, _super);
102
+ function GroupRefTable() {
103
+ var _this = _super !== null && _super.apply(this, arguments) || this;
104
+ _this.name = GROUP_REF_TABLE;
105
+ _this.columns = (0, Record_1.withRecordColumns)({
106
+ groupName: new Columns_1.StringColumn('group_name'),
107
+ memberRef: new Columns_1.ReferenceColumn('member_id', MEMBER_REF_TABLE, true // cascade: deleting GroupRef deletes the referenced MemberRef
108
+ ),
109
+ });
110
+ return _this;
111
+ }
112
+ return GroupRefTable;
113
+ }(Table_1.Table));
114
+ exports.GroupRefTable = GroupRefTable;
115
+ // Cascade: ReferenceArrayColumn
116
+ var MemberArrTable = /** @class */ (function (_super) {
117
+ __extends(MemberArrTable, _super);
118
+ function MemberArrTable() {
119
+ var _this = _super !== null && _super.apply(this, arguments) || this;
120
+ _this.name = MEMBER_ARR_TABLE;
121
+ _this.columns = (0, Record_1.withRecordColumns)({
122
+ name: new Columns_1.StringColumn('name'),
123
+ });
124
+ return _this;
125
+ }
126
+ return MemberArrTable;
127
+ }(Table_1.Table));
128
+ exports.MemberArrTable = MemberArrTable;
129
+ var GroupArrTable = /** @class */ (function (_super) {
130
+ __extends(GroupArrTable, _super);
131
+ function GroupArrTable() {
132
+ var _this = _super !== null && _super.apply(this, arguments) || this;
133
+ _this.name = GROUP_ARR_TABLE;
134
+ _this.columns = (0, Record_1.withRecordColumns)({
135
+ groupName: new Columns_1.StringColumn('group_name'),
136
+ memberRefs: new Columns_1.ReferenceArrayColumn('member_ids', MEMBER_ARR_TABLE, true // cascade: deleting GroupArr deletes all referenced MemberArr
137
+ ),
138
+ });
139
+ return _this;
140
+ }
141
+ return GroupArrTable;
142
+ }(Table_1.Table));
143
+ exports.GroupArrTable = GroupArrTable;
144
+ // Cascade: DynamicReferenceColumn
145
+ var MemberDynTable = /** @class */ (function (_super) {
146
+ __extends(MemberDynTable, _super);
147
+ function MemberDynTable() {
148
+ var _this = _super !== null && _super.apply(this, arguments) || this;
149
+ _this.name = MEMBER_DYN_TABLE;
150
+ _this.columns = (0, Record_1.withRecordColumns)({
151
+ name: new Columns_1.StringColumn('name'),
152
+ });
153
+ return _this;
154
+ }
155
+ return MemberDynTable;
156
+ }(Table_1.Table));
157
+ exports.MemberDynTable = MemberDynTable;
158
+ var GroupDynTable = /** @class */ (function (_super) {
159
+ __extends(GroupDynTable, _super);
160
+ function GroupDynTable() {
161
+ var _this = _super !== null && _super.apply(this, arguments) || this;
162
+ _this.name = GROUP_DYN_TABLE;
163
+ _this.columns = (0, Record_1.withRecordColumns)({
164
+ groupName: new Columns_1.StringColumn('group_name'),
165
+ memberDynTableName: new Columns_1.DynamicReferenceTableNameColumn('member_dyn_table_name', 'member_dyn_ref'),
166
+ memberDynRef: new Columns_1.DynamicReferenceColumn('member_dyn_ref', 'member_dyn_table_name', true // cascade: deleting GroupDyn deletes dynamically referenced MemberDyn
167
+ ),
168
+ });
169
+ return _this;
170
+ }
171
+ return GroupDynTable;
172
+ }(Table_1.Table));
173
+ exports.GroupDynTable = GroupDynTable;
174
+ // Reverse: ReferenceColumn
175
+ var PostTable = /** @class */ (function (_super) {
176
+ __extends(PostTable, _super);
177
+ function PostTable() {
178
+ var _this = _super !== null && _super.apply(this, arguments) || this;
179
+ _this.name = POST_TABLE;
180
+ _this.columns = (0, Record_1.withRecordColumns)({
181
+ title: new Columns_1.StringColumn('title'),
182
+ });
183
+ return _this;
184
+ }
185
+ return PostTable;
186
+ }(Table_1.Table));
187
+ exports.PostTable = PostTable;
188
+ var CommentTable = /** @class */ (function (_super) {
189
+ __extends(CommentTable, _super);
190
+ function CommentTable() {
191
+ var _this = _super !== null && _super.apply(this, arguments) || this;
192
+ _this.name = COMMENT_TABLE;
193
+ _this.columns = (0, Record_1.withRecordColumns)({
194
+ text: new Columns_1.StringColumn('text'),
195
+ postRef: new Columns_1.ReferenceColumn('post_id', POST_TABLE, false, { reverseCascadeDelete: true } // reverse: deleting Post deletes Comment
196
+ ),
197
+ });
198
+ return _this;
199
+ }
200
+ return CommentTable;
201
+ }(Table_1.Table));
202
+ exports.CommentTable = CommentTable;
203
+ // Reverse: ReferenceArrayColumn
204
+ var MemberArrRevTable = /** @class */ (function (_super) {
205
+ __extends(MemberArrRevTable, _super);
206
+ function MemberArrRevTable() {
207
+ var _this = _super !== null && _super.apply(this, arguments) || this;
208
+ _this.name = MEMBER_ARR_REV_TABLE;
209
+ _this.columns = (0, Record_1.withRecordColumns)({
210
+ name: new Columns_1.StringColumn('name'),
211
+ });
212
+ return _this;
213
+ }
214
+ return MemberArrRevTable;
215
+ }(Table_1.Table));
216
+ exports.MemberArrRevTable = MemberArrRevTable;
217
+ var GroupArrRevTable = /** @class */ (function (_super) {
218
+ __extends(GroupArrRevTable, _super);
219
+ function GroupArrRevTable() {
220
+ var _this = _super !== null && _super.apply(this, arguments) || this;
221
+ _this.name = GROUP_ARR_REV_TABLE;
222
+ _this.columns = (0, Record_1.withRecordColumns)({
223
+ groupName: new Columns_1.StringColumn('group_name'),
224
+ memberRefs: new Columns_1.ReferenceArrayColumn('member_ids', MEMBER_ARR_REV_TABLE, false, { reverseCascadeDelete: true } // reverse: deleting any MemberArrRev deletes the GroupArrRev
225
+ ),
226
+ });
227
+ return _this;
228
+ }
229
+ return GroupArrRevTable;
230
+ }(Table_1.Table));
231
+ exports.GroupArrRevTable = GroupArrRevTable;
232
+ // Reverse: DynamicReferenceColumn
233
+ var WorkerTable = /** @class */ (function (_super) {
234
+ __extends(WorkerTable, _super);
235
+ function WorkerTable() {
236
+ var _this = _super !== null && _super.apply(this, arguments) || this;
237
+ _this.name = WORKER_TABLE;
238
+ _this.columns = (0, Record_1.withRecordColumns)({
239
+ name: new Columns_1.StringColumn('name'),
240
+ });
241
+ return _this;
242
+ }
243
+ return WorkerTable;
244
+ }(Table_1.Table));
245
+ exports.WorkerTable = WorkerTable;
246
+ var TaskTable = /** @class */ (function (_super) {
247
+ __extends(TaskTable, _super);
248
+ function TaskTable() {
249
+ var _this = _super !== null && _super.apply(this, arguments) || this;
250
+ _this.name = TASK_TABLE;
251
+ _this.columns = (0, Record_1.withRecordColumns)({
252
+ title: new Columns_1.StringColumn('title'),
253
+ assigneeTableName: new Columns_1.DynamicReferenceTableNameColumn('assignee_table_name', 'assignee_ref'),
254
+ assigneeRef: new Columns_1.DynamicReferenceColumn('assignee_ref', 'assignee_table_name', false, { reverseCascadeDelete: true } // reverse: deleting Worker deletes Task
255
+ ),
256
+ });
257
+ return _this;
258
+ }
259
+ return TaskTable;
260
+ }(Table_1.Table));
261
+ exports.TaskTable = TaskTable;
262
+ /** getTable resolver for Db */
263
+ var getCascadeDeleteTestTable = function (tableName) {
264
+ switch (tableName) {
265
+ // Cascade
266
+ case MEMBER_REF_TABLE:
267
+ return new MemberRefTable();
268
+ case GROUP_REF_TABLE:
269
+ return new GroupRefTable();
270
+ case MEMBER_ARR_TABLE:
271
+ return new MemberArrTable();
272
+ case GROUP_ARR_TABLE:
273
+ return new GroupArrTable();
274
+ case MEMBER_DYN_TABLE:
275
+ return new MemberDynTable();
276
+ case GROUP_DYN_TABLE:
277
+ return new GroupDynTable();
278
+ // Reverse
279
+ case POST_TABLE:
280
+ return new PostTable();
281
+ case COMMENT_TABLE:
282
+ return new CommentTable();
283
+ case MEMBER_ARR_REV_TABLE:
284
+ return new MemberArrRevTable();
285
+ case GROUP_ARR_REV_TABLE:
286
+ return new GroupArrRevTable();
287
+ case WORKER_TABLE:
288
+ return new WorkerTable();
289
+ case TASK_TABLE:
290
+ return new TaskTable();
291
+ default:
292
+ throw new Error("Cannot find test table: ".concat(tableName));
293
+ }
294
+ };
295
+ exports.getCascadeDeleteTestTable = getCascadeDeleteTestTable;
296
+ /**
297
+ * Public test suite factory.
298
+ */
299
+ var cascadeDeleteTests = function (driver, transactionContextFactory, dropTable) {
300
+ return function () {
301
+ var db = new Db_1.Db(driver, exports.getCascadeDeleteTestTable, transactionContextFactory);
302
+ beforeAll(function () { return __awaiter(void 0, void 0, void 0, function () {
303
+ return __generator(this, function (_a) {
304
+ switch (_a.label) {
305
+ case 0:
306
+ if (!driver.start) return [3 /*break*/, 2];
307
+ return [4 /*yield*/, driver.start()];
308
+ case 1:
309
+ _a.sent();
310
+ _a.label = 2;
311
+ case 2: return [2 /*return*/];
312
+ }
313
+ });
314
+ }); });
315
+ beforeEach(function () { return __awaiter(void 0, void 0, void 0, function () {
316
+ return __generator(this, function (_a) {
317
+ switch (_a.label) {
318
+ case 0:
319
+ // Ensure tables exist and are in a known state for each test
320
+ return [4 /*yield*/, driver.getTableManager().loadTable(new MemberRefTable())];
321
+ case 1:
322
+ // Ensure tables exist and are in a known state for each test
323
+ _a.sent();
324
+ return [4 /*yield*/, driver.getTableManager().loadTable(new GroupRefTable())];
325
+ case 2:
326
+ _a.sent();
327
+ return [4 /*yield*/, driver.getTableManager().loadTable(new MemberArrTable())];
328
+ case 3:
329
+ _a.sent();
330
+ return [4 /*yield*/, driver.getTableManager().loadTable(new GroupArrTable())];
331
+ case 4:
332
+ _a.sent();
333
+ return [4 /*yield*/, driver.getTableManager().loadTable(new MemberDynTable())];
334
+ case 5:
335
+ _a.sent();
336
+ return [4 /*yield*/, driver.getTableManager().loadTable(new GroupDynTable())];
337
+ case 6:
338
+ _a.sent();
339
+ return [4 /*yield*/, driver.getTableManager().loadTable(new PostTable())];
340
+ case 7:
341
+ _a.sent();
342
+ return [4 /*yield*/, driver.getTableManager().loadTable(new CommentTable())];
343
+ case 8:
344
+ _a.sent();
345
+ return [4 /*yield*/, driver.getTableManager().loadTable(new MemberArrRevTable())];
346
+ case 9:
347
+ _a.sent();
348
+ return [4 /*yield*/, driver.getTableManager().loadTable(new GroupArrRevTable())];
349
+ case 10:
350
+ _a.sent();
351
+ return [4 /*yield*/, driver.getTableManager().loadTable(new WorkerTable())];
352
+ case 11:
353
+ _a.sent();
354
+ return [4 /*yield*/, driver.getTableManager().loadTable(new TaskTable())];
355
+ case 12:
356
+ _a.sent();
357
+ return [2 /*return*/];
358
+ }
359
+ });
360
+ }); });
361
+ afterEach(function () { return __awaiter(void 0, void 0, void 0, function () {
362
+ return __generator(this, function (_a) {
363
+ switch (_a.label) {
364
+ case 0:
365
+ // Drop referencing tables first, then referenced
366
+ return [4 /*yield*/, dropTable(new GroupRefTable())];
367
+ case 1:
368
+ // Drop referencing tables first, then referenced
369
+ _a.sent();
370
+ return [4 /*yield*/, dropTable(new MemberRefTable())];
371
+ case 2:
372
+ _a.sent();
373
+ return [4 /*yield*/, dropTable(new GroupArrTable())];
374
+ case 3:
375
+ _a.sent();
376
+ return [4 /*yield*/, dropTable(new MemberArrTable())];
377
+ case 4:
378
+ _a.sent();
379
+ return [4 /*yield*/, dropTable(new GroupDynTable())];
380
+ case 5:
381
+ _a.sent();
382
+ return [4 /*yield*/, dropTable(new MemberDynTable())];
383
+ case 6:
384
+ _a.sent();
385
+ return [4 /*yield*/, dropTable(new CommentTable())];
386
+ case 7:
387
+ _a.sent();
388
+ return [4 /*yield*/, dropTable(new PostTable())];
389
+ case 8:
390
+ _a.sent();
391
+ return [4 /*yield*/, dropTable(new GroupArrRevTable())];
392
+ case 9:
393
+ _a.sent();
394
+ return [4 /*yield*/, dropTable(new MemberArrRevTable())];
395
+ case 10:
396
+ _a.sent();
397
+ return [4 /*yield*/, dropTable(new TaskTable())];
398
+ case 11:
399
+ _a.sent();
400
+ return [4 /*yield*/, dropTable(new WorkerTable())];
401
+ case 12:
402
+ _a.sent();
403
+ return [2 /*return*/];
404
+ }
405
+ });
406
+ }); });
407
+ afterAll(function () { return __awaiter(void 0, void 0, void 0, function () {
408
+ return __generator(this, function (_a) {
409
+ switch (_a.label) {
410
+ case 0:
411
+ if (!driver.stop) return [3 /*break*/, 2];
412
+ return [4 /*yield*/, driver.stop()];
413
+ case 1:
414
+ _a.sent();
415
+ _a.label = 2;
416
+ case 2: return [2 /*return*/];
417
+ }
418
+ });
419
+ }); });
420
+ /**
421
+ * -------------------- Cascade Delete (holder → referenced) --------------------
422
+ */
423
+ describe('Cascade Delete', function () {
424
+ test('ReferenceColumn: deleting holder deletes referenced record', function () { return __awaiter(void 0, void 0, void 0, function () {
425
+ var memberTable, groupTable, m, g, delQb, deleted, remaining;
426
+ return __generator(this, function (_a) {
427
+ switch (_a.label) {
428
+ case 0:
429
+ memberTable = new MemberRefTable();
430
+ groupTable = new GroupRefTable();
431
+ return [4 /*yield*/, db.insert(memberTable, { name: 'Alice' })];
432
+ case 1:
433
+ m = _a.sent();
434
+ return [4 /*yield*/, db.insert(groupTable, {
435
+ groupName: 'G-Ref',
436
+ memberRef: new Reference_1.Reference(memberTable.name, m.id),
437
+ })];
438
+ case 2:
439
+ g = _a.sent();
440
+ delQb = new db_query_1.QueryBuilder(groupTable.name).condition({
441
+ field: 'id',
442
+ operator: '=',
443
+ value: g.id,
444
+ });
445
+ return [4 /*yield*/, db.delete(groupTable, delQb)];
446
+ case 3:
447
+ deleted = _a.sent();
448
+ expect(deleted).toBe(1);
449
+ return [4 /*yield*/, db.query(memberTable, {})];
450
+ case 4:
451
+ remaining = _a.sent();
452
+ expect(remaining.length).toBe(0);
453
+ return [2 /*return*/];
454
+ }
455
+ });
456
+ }); });
457
+ test('ReferenceArrayColumn: deleting holder deletes all referenced records', function () { return __awaiter(void 0, void 0, void 0, function () {
458
+ var memberTable, groupTable, m1, m2, m3, g, delQb, deleted, remaining;
459
+ return __generator(this, function (_a) {
460
+ switch (_a.label) {
461
+ case 0:
462
+ memberTable = new MemberArrTable();
463
+ groupTable = new GroupArrTable();
464
+ return [4 /*yield*/, db.insert(memberTable, { name: 'Bob' })];
465
+ case 1:
466
+ m1 = _a.sent();
467
+ return [4 /*yield*/, db.insert(memberTable, { name: 'Charlie' })];
468
+ case 2:
469
+ m2 = _a.sent();
470
+ return [4 /*yield*/, db.insert(memberTable, { name: 'Dana' })];
471
+ case 3:
472
+ m3 = _a.sent();
473
+ return [4 /*yield*/, db.insert(groupTable, {
474
+ groupName: 'G-Arr',
475
+ memberRefs: new ReferenceArray_1.ReferenceArray(memberTable.name, [m1.id, m2.id]),
476
+ })];
477
+ case 4:
478
+ g = _a.sent();
479
+ delQb = new db_query_1.QueryBuilder(groupTable.name).condition({
480
+ field: 'id',
481
+ operator: '=',
482
+ value: g.id,
483
+ });
484
+ return [4 /*yield*/, db.delete(groupTable, delQb)];
485
+ case 5:
486
+ deleted = _a.sent();
487
+ expect(deleted).toBe(1);
488
+ return [4 /*yield*/, db.query(memberTable, {})];
489
+ case 6:
490
+ remaining = _a.sent();
491
+ expect(remaining.length).toBe(1);
492
+ expect(remaining[0].id).toBe(m3.id);
493
+ return [2 /*return*/];
494
+ }
495
+ });
496
+ }); });
497
+ test('DynamicReferenceColumn: deleting holder deletes dynamically referenced record', function () { return __awaiter(void 0, void 0, void 0, function () {
498
+ var memberTable, groupTable, m, g, delQb, deleted, remaining;
499
+ return __generator(this, function (_a) {
500
+ switch (_a.label) {
501
+ case 0:
502
+ memberTable = new MemberDynTable();
503
+ groupTable = new GroupDynTable();
504
+ return [4 /*yield*/, db.insert(memberTable, { name: 'Dina' })];
505
+ case 1:
506
+ m = _a.sent();
507
+ return [4 /*yield*/, db.insert(groupTable, {
508
+ groupName: 'G-Dyn',
509
+ memberDynTableName: memberTable.name,
510
+ memberDynRef: new Reference_1.Reference(memberTable.name, m.id),
511
+ })];
512
+ case 2:
513
+ g = _a.sent();
514
+ delQb = new db_query_1.QueryBuilder(groupTable.name).condition({
515
+ field: 'id',
516
+ operator: '=',
517
+ value: g.id,
518
+ });
519
+ return [4 /*yield*/, db.delete(groupTable, delQb)];
520
+ case 3:
521
+ deleted = _a.sent();
522
+ expect(deleted).toBe(1);
523
+ return [4 /*yield*/, db.query(memberTable, {})];
524
+ case 4:
525
+ remaining = _a.sent();
526
+ expect(remaining.length).toBe(0);
527
+ return [2 /*return*/];
528
+ }
529
+ });
530
+ }); });
531
+ });
532
+ /**
533
+ * -------------------- Reverse Cascade Delete (referenced → holder) --------------------
534
+ */
535
+ describe('Reverse Cascade Delete', function () {
536
+ test('ReferenceColumn: deleting referenced record deletes the holder', function () { return __awaiter(void 0, void 0, void 0, function () {
537
+ var postTable, commentTable, post, delQb, deleted, remaining;
538
+ return __generator(this, function (_a) {
539
+ switch (_a.label) {
540
+ case 0:
541
+ postTable = new PostTable();
542
+ commentTable = new CommentTable();
543
+ return [4 /*yield*/, db.insert(postTable, { title: 'Hello World' })];
544
+ case 1:
545
+ post = _a.sent();
546
+ return [4 /*yield*/, db.insert(commentTable, {
547
+ text: 'Nice post!',
548
+ postRef: new Reference_1.Reference(postTable.name, post.id),
549
+ })];
550
+ case 2:
551
+ _a.sent();
552
+ delQb = new db_query_1.QueryBuilder(postTable.name).condition({
553
+ field: 'id',
554
+ operator: '=',
555
+ value: post.id,
556
+ });
557
+ return [4 /*yield*/, db.delete(postTable, delQb)];
558
+ case 3:
559
+ deleted = _a.sent();
560
+ expect(deleted).toBe(1);
561
+ return [4 /*yield*/, db.query(commentTable, {})];
562
+ case 4:
563
+ remaining = _a.sent();
564
+ expect(remaining.length).toBe(0);
565
+ return [2 /*return*/];
566
+ }
567
+ });
568
+ }); });
569
+ test('ReferenceArrayColumn: deleting a referenced record deletes the holder', function () { return __awaiter(void 0, void 0, void 0, function () {
570
+ var memberTable, groupTable, m1, m2, delQb, deleted, remainingGroups;
571
+ return __generator(this, function (_a) {
572
+ switch (_a.label) {
573
+ case 0:
574
+ memberTable = new MemberArrRevTable();
575
+ groupTable = new GroupArrRevTable();
576
+ return [4 /*yield*/, db.insert(memberTable, { name: 'Alice' })];
577
+ case 1:
578
+ m1 = _a.sent();
579
+ return [4 /*yield*/, db.insert(memberTable, { name: 'Bob' })];
580
+ case 2:
581
+ m2 = _a.sent();
582
+ return [4 /*yield*/, db.insert(groupTable, {
583
+ groupName: 'G-RevArr',
584
+ memberRefs: new ReferenceArray_1.ReferenceArray(memberTable.name, [m1.id, m2.id]),
585
+ })];
586
+ case 3:
587
+ _a.sent();
588
+ delQb = new db_query_1.QueryBuilder(memberTable.name).condition({
589
+ field: 'id',
590
+ operator: '=',
591
+ value: m1.id,
592
+ });
593
+ return [4 /*yield*/, db.delete(memberTable, delQb)];
594
+ case 4:
595
+ deleted = _a.sent();
596
+ expect(deleted).toBe(1);
597
+ return [4 /*yield*/, db.query(groupTable, {})];
598
+ case 5:
599
+ remainingGroups = _a.sent();
600
+ expect(remainingGroups.length).toBe(0);
601
+ return [2 /*return*/];
602
+ }
603
+ });
604
+ }); });
605
+ test('DynamicReferenceColumn: deleting referenced record deletes the holder', function () { return __awaiter(void 0, void 0, void 0, function () {
606
+ var workerTable, taskTable, worker, delQb, deleted, remainingTasks;
607
+ return __generator(this, function (_a) {
608
+ switch (_a.label) {
609
+ case 0:
610
+ workerTable = new WorkerTable();
611
+ taskTable = new TaskTable();
612
+ return [4 /*yield*/, db.insert(workerTable, { name: 'Wally Worker' })];
613
+ case 1:
614
+ worker = _a.sent();
615
+ return [4 /*yield*/, db.insert(taskTable, {
616
+ title: 'Assemble Widget',
617
+ assigneeTableName: workerTable.name,
618
+ assigneeRef: new Reference_1.Reference(workerTable.name, worker.id),
619
+ })];
620
+ case 2:
621
+ _a.sent();
622
+ delQb = new db_query_1.QueryBuilder(workerTable.name).condition({
623
+ field: 'id',
624
+ operator: '=',
625
+ value: worker.id,
626
+ });
627
+ return [4 /*yield*/, db.delete(workerTable, delQb)];
628
+ case 3:
629
+ deleted = _a.sent();
630
+ expect(deleted).toBe(1);
631
+ return [4 /*yield*/, db.query(taskTable, {})];
632
+ case 4:
633
+ remainingTasks = _a.sent();
634
+ expect(remainingTasks.length).toBe(0);
635
+ return [2 /*return*/];
636
+ }
637
+ });
638
+ }); });
639
+ });
640
+ };
641
+ };
642
+ exports.cascadeDeleteTests = cascadeDeleteTests;
643
+ //# sourceMappingURL=CascadeDeleteTests.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CascadeDeleteTests.js","sourceRoot":"","sources":["../../../test/reusable/CascadeDeleteTests.ts"],"names":[],"mappings":"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"}