remult 3.3.18 → 3.3.19-next.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.
Files changed (38) hide show
  1. package/esm/index.js +7 -6
  2. package/esm/remult-d1.js +1 -0
  3. package/esm/remult-knex/index.js +112 -2
  4. package/esm/remult-mongo.js +17 -8
  5. package/esm/remult-sqlite-core.js +1 -0
  6. package/esm/src/data-interfaces.js +4 -4
  7. package/esm/src/data-providers/array-entity-data-provider.js +14 -2
  8. package/esm/src/data-providers/indexed-db-data-provider.js +644 -0
  9. package/esm/src/data-providers/json-data-provider.js +2 -2
  10. package/esm/src/data-providers/rest-data-provider.js +11 -12
  11. package/esm/src/data-providers/sql-database.js +110 -43
  12. package/esm/src/remult3/RepositoryImplementation.js +90 -60
  13. package/index.d.ts +31 -17
  14. package/index.js +5 -2
  15. package/package.json +1 -1
  16. package/remult-d1.d.ts +1 -0
  17. package/remult-d1.js +1 -0
  18. package/remult-knex/index.d.ts +2 -2
  19. package/remult-knex/index.js +329 -44
  20. package/remult-mongo.js +80 -36
  21. package/remult-sqlite-core.d.ts +1 -0
  22. package/remult-sqlite-core.js +1 -0
  23. package/src/column-interfaces.d.ts +4 -0
  24. package/src/data-interfaces.d.ts +2 -3
  25. package/src/data-interfaces.js +4 -4
  26. package/src/data-providers/array-entity-data-provider.d.ts +2 -2
  27. package/src/data-providers/array-entity-data-provider.js +92 -14
  28. package/src/data-providers/indexed-db-data-provider.d.ts +37 -0
  29. package/src/data-providers/indexed-db-data-provider.js +1048 -0
  30. package/src/data-providers/json-data-provider.js +2 -2
  31. package/src/data-providers/rest-data-provider.d.ts +2 -3
  32. package/src/data-providers/rest-data-provider.js +18 -17
  33. package/src/data-providers/sql-database.js +254 -105
  34. package/src/remult3/RepositoryImplementation.d.ts +1 -1
  35. package/src/remult3/RepositoryImplementation.js +384 -270
  36. package/src/remult3/remult3.d.ts +2 -2
  37. package/src/sql-command.d.ts +2 -0
  38. package/src/standard-schema/index.d.ts +1 -1
@@ -0,0 +1,1048 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.IndexedDbDataProvider = exports.IndexedDbIndexBuilder = void 0;
4
+ exports.idbPrefetchFromFilter = idbPrefetchFromFilter;
5
+ var tslib_1 = require("tslib");
6
+ var filter_consumer_bridge_to_sql_request_js_1 = require("../filter/filter-consumer-bridge-to-sql-request.js");
7
+ var RepositoryImplementation_js_1 = require("../remult3/RepositoryImplementation.js");
8
+ var array_entity_data_provider_js_1 = require("./array-entity-data-provider.js");
9
+ var IndexedDbIndexBuilder = /** @class */ (function () {
10
+ function IndexedDbIndexBuilder() {
11
+ //@internal
12
+ this.entries = [];
13
+ }
14
+ IndexedDbIndexBuilder.prototype.ensureIndexes = function (entity, indexes) {
15
+ this.entries.push({ entity: entity, indexes: tslib_1.__spreadArray([], tslib_1.__read(indexes), false) });
16
+ return this;
17
+ };
18
+ return IndexedDbIndexBuilder;
19
+ }());
20
+ exports.IndexedDbIndexBuilder = IndexedDbIndexBuilder;
21
+ var IndexedDbDataProvider = /** @class */ (function () {
22
+ function IndexedDbDataProvider(dbName, options) {
23
+ if (dbName === void 0) { dbName = 'remult'; }
24
+ this.dbName = dbName;
25
+ //@internal
26
+ this.declaredIndexes = [];
27
+ //@internal
28
+ this.tail = Promise.resolve();
29
+ if (options === null || options === void 0 ? void 0 : options.indexes) {
30
+ var builder = new IndexedDbIndexBuilder();
31
+ options.indexes(builder);
32
+ this.declaredIndexes = builder.entries;
33
+ }
34
+ }
35
+ IndexedDbDataProvider.prototype.getEntityDataProvider = function (entity) {
36
+ return new IndexedDbEntityDataProvider(this, entity);
37
+ };
38
+ IndexedDbDataProvider.prototype.transaction = function (action) {
39
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
40
+ return tslib_1.__generator(this, function (_a) {
41
+ switch (_a.label) {
42
+ case 0: return [4 /*yield*/, action(this)];
43
+ case 1:
44
+ _a.sent();
45
+ return [2 /*return*/];
46
+ }
47
+ });
48
+ });
49
+ };
50
+ IndexedDbDataProvider.prototype.ensureSchema = function (entities) {
51
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
52
+ var _this = this;
53
+ return tslib_1.__generator(this, function (_a) {
54
+ switch (_a.label) {
55
+ case 0: return [4 /*yield*/, this.enqueue(function () { return _this.ensureStores(entities); })];
56
+ case 1:
57
+ _a.sent();
58
+ return [2 /*return*/];
59
+ }
60
+ });
61
+ });
62
+ };
63
+ IndexedDbDataProvider.prototype.close = function () {
64
+ var _a;
65
+ (_a = this.db) === null || _a === void 0 ? void 0 : _a.close();
66
+ this.db = undefined;
67
+ };
68
+ //@internal
69
+ IndexedDbDataProvider.prototype.enqueue = function (fn) {
70
+ var run = this.tail.then(fn, fn);
71
+ this.tail = run.then(function () { }, function () { });
72
+ return run;
73
+ };
74
+ //@internal
75
+ IndexedDbDataProvider.prototype.runWithRows = function (entity, where, what) {
76
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
77
+ var _this = this;
78
+ return tslib_1.__generator(this, function (_a) {
79
+ return [2 /*return*/, this.enqueue(function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
80
+ var rows;
81
+ return tslib_1.__generator(this, function (_a) {
82
+ switch (_a.label) {
83
+ case 0: return [4 /*yield*/, this.ensureStores([entity])];
84
+ case 1:
85
+ _a.sent();
86
+ return [4 /*yield*/, this.loadRows(entity, where)];
87
+ case 2:
88
+ rows = _a.sent();
89
+ return [2 /*return*/, what(new array_entity_data_provider_js_1.ArrayEntityDataProvider(entity, function () { return rows; }))];
90
+ }
91
+ });
92
+ }); })];
93
+ });
94
+ });
95
+ };
96
+ //@internal
97
+ IndexedDbDataProvider.prototype.fetchRows = function (entity, where) {
98
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
99
+ var _this = this;
100
+ return tslib_1.__generator(this, function (_a) {
101
+ return [2 /*return*/, this.enqueue(function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
102
+ return tslib_1.__generator(this, function (_a) {
103
+ switch (_a.label) {
104
+ case 0: return [4 /*yield*/, this.ensureStores([entity])];
105
+ case 1:
106
+ _a.sent();
107
+ return [2 /*return*/, this.loadRows(entity, where)];
108
+ }
109
+ });
110
+ }); })];
111
+ });
112
+ });
113
+ };
114
+ //@internal
115
+ IndexedDbDataProvider.prototype.loadRows = function (entity, where) {
116
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
117
+ var storeName, prefetch, ops;
118
+ return tslib_1.__generator(this, function (_a) {
119
+ switch (_a.label) {
120
+ case 0:
121
+ storeName = storeNameOf(entity);
122
+ return [4 /*yield*/, idbPrefetchFromFilter(entity, where, this.storeIndexes(storeName))];
123
+ case 1:
124
+ prefetch = _a.sent();
125
+ this.lastFetch = prefetch;
126
+ if (prefetch.type === 'all')
127
+ return [2 /*return*/, this.getAll(storeName)];
128
+ ops = prefetch.type === 'or' ? prefetch.parts : [prefetch];
129
+ return [2 /*return*/, this.fetchOps(storeName, entity, ops)];
130
+ }
131
+ });
132
+ });
133
+ };
134
+ //@internal
135
+ IndexedDbDataProvider.prototype.storeIndexes = function (storeName) {
136
+ var db = this.db;
137
+ if (!(db === null || db === void 0 ? void 0 : db.objectStoreNames.contains(storeName)))
138
+ return [];
139
+ var store = db.transaction(storeName).objectStore(storeName);
140
+ var names = store.indexNames;
141
+ var result = [];
142
+ for (var i = 0; i < names.length; i++) {
143
+ var name_1 = names[i];
144
+ result.push({
145
+ name: name_1,
146
+ keyPath: store.index(name_1).keyPath,
147
+ });
148
+ }
149
+ return result;
150
+ };
151
+ //@internal
152
+ IndexedDbDataProvider.prototype.indexesFor = function (entity) {
153
+ return this.declaredIndexes
154
+ .filter(function (e) { return e.entity === entity.entityType; })
155
+ .flatMap(function (e) { return e.indexes; });
156
+ };
157
+ //@internal
158
+ IndexedDbDataProvider.prototype.ensureStores = function (entities) {
159
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
160
+ var wanted, db, needsUpgrade, nextVersion;
161
+ var _this = this;
162
+ return tslib_1.__generator(this, function (_a) {
163
+ switch (_a.label) {
164
+ case 0: return [4 /*yield*/, Promise.all(entities.map(function (entity) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
165
+ var keyPath;
166
+ var _a;
167
+ return tslib_1.__generator(this, function (_b) {
168
+ switch (_b.label) {
169
+ case 0: return [4 /*yield*/, keyPathOf(entity)];
170
+ case 1:
171
+ keyPath = _b.sent();
172
+ _a = {
173
+ name: storeNameOf(entity),
174
+ keyPath: keyPath,
175
+ autoIncrement: (0, RepositoryImplementation_js_1.isAutoIncrement)(entity.idMetadata.field)
176
+ };
177
+ return [4 /*yield*/, resolveIndexDefs(entity, this.indexesFor(entity), keyPath)];
178
+ case 2: return [2 /*return*/, (_a.indexes = _b.sent(),
179
+ _a)];
180
+ }
181
+ });
182
+ }); }))];
183
+ case 1:
184
+ wanted = _a.sent();
185
+ return [4 /*yield*/, this.open()];
186
+ case 2:
187
+ db = _a.sent();
188
+ needsUpgrade = wanted.some(function (w) {
189
+ if (!db.objectStoreNames.contains(w.name))
190
+ return true;
191
+ var existing = _this.storeIndexes(w.name).map(function (i) { return i.name; });
192
+ return w.indexes.some(function (idx) { return !existing.includes(idx.name); });
193
+ });
194
+ if (!needsUpgrade)
195
+ return [2 /*return*/];
196
+ nextVersion = db.version + 1;
197
+ this.forget(db);
198
+ db.close();
199
+ return [4 /*yield*/, this.open(nextVersion, function (upgradeDb, tx) {
200
+ var e_1, _a, e_2, _b;
201
+ try {
202
+ for (var wanted_1 = tslib_1.__values(wanted), wanted_1_1 = wanted_1.next(); !wanted_1_1.done; wanted_1_1 = wanted_1.next()) {
203
+ var _c = wanted_1_1.value, name_2 = _c.name, keyPath = _c.keyPath, autoIncrement = _c.autoIncrement, indexes = _c.indexes;
204
+ var store = upgradeDb.objectStoreNames.contains(name_2)
205
+ ? tx.objectStore(name_2)
206
+ : upgradeDb.createObjectStore(name_2, { keyPath: keyPath, autoIncrement: autoIncrement });
207
+ try {
208
+ for (var indexes_1 = (e_2 = void 0, tslib_1.__values(indexes)), indexes_1_1 = indexes_1.next(); !indexes_1_1.done; indexes_1_1 = indexes_1.next()) {
209
+ var idx = indexes_1_1.value;
210
+ if (!store.indexNames.contains(idx.name)) {
211
+ store.createIndex(idx.name, idx.keyPath);
212
+ }
213
+ }
214
+ }
215
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
216
+ finally {
217
+ try {
218
+ if (indexes_1_1 && !indexes_1_1.done && (_b = indexes_1.return)) _b.call(indexes_1);
219
+ }
220
+ finally { if (e_2) throw e_2.error; }
221
+ }
222
+ }
223
+ }
224
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
225
+ finally {
226
+ try {
227
+ if (wanted_1_1 && !wanted_1_1.done && (_a = wanted_1.return)) _a.call(wanted_1);
228
+ }
229
+ finally { if (e_1) throw e_1.error; }
230
+ }
231
+ })];
232
+ case 3:
233
+ _a.sent();
234
+ return [2 /*return*/];
235
+ }
236
+ });
237
+ });
238
+ };
239
+ //@internal
240
+ IndexedDbDataProvider.prototype.forget = function (db) {
241
+ if (this.db === db)
242
+ this.db = undefined;
243
+ };
244
+ //@internal
245
+ IndexedDbDataProvider.prototype.open = function (version, upgrade) {
246
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
247
+ var _a;
248
+ var _this = this;
249
+ return tslib_1.__generator(this, function (_b) {
250
+ switch (_b.label) {
251
+ case 0:
252
+ if (this.db && version == null)
253
+ return [2 /*return*/, this.db];
254
+ _a = this;
255
+ return [4 /*yield*/, new Promise(function (resolve, reject) {
256
+ var request = version == null
257
+ ? indexedDB.open(_this.dbName)
258
+ : indexedDB.open(_this.dbName, version);
259
+ request.onerror = function () { return reject(request.error); };
260
+ request.onupgradeneeded = function () {
261
+ return upgrade === null || upgrade === void 0 ? void 0 : upgrade(request.result, request.transaction);
262
+ };
263
+ request.onsuccess = function () {
264
+ var db = request.result;
265
+ var forget = function () { return _this.forget(db); };
266
+ db.onclose = forget;
267
+ db.onversionchange = function () {
268
+ db.close();
269
+ forget();
270
+ };
271
+ resolve(db);
272
+ };
273
+ })];
274
+ case 1:
275
+ _a.db = _b.sent();
276
+ return [2 /*return*/, this.db];
277
+ }
278
+ });
279
+ });
280
+ };
281
+ //@internal
282
+ IndexedDbDataProvider.prototype.getAll = function (storeName, range) {
283
+ return this.withStore(storeName, 'readonly', function (store) {
284
+ return idbReq(range ? store.getAll(range) : store.getAll());
285
+ });
286
+ };
287
+ //@internal
288
+ IndexedDbDataProvider.prototype.fetchOps = function (storeName, entity, ops) {
289
+ var _this = this;
290
+ return this.withStore(storeName, 'readonly', function (store) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
291
+ var idKey, seen, rows, _loop_1, ops_1, ops_1_1, op, e_3_1;
292
+ var e_3, _a;
293
+ return tslib_1.__generator(this, function (_b) {
294
+ switch (_b.label) {
295
+ case 0:
296
+ idKey = entity.idMetadata.fields[0].key;
297
+ seen = new Set();
298
+ rows = [];
299
+ _loop_1 = function (op) {
300
+ var source, chunk, _c, _d, chunk_1, chunk_1_1, row, k;
301
+ var e_4, _e;
302
+ return tslib_1.__generator(this, function (_f) {
303
+ switch (_f.label) {
304
+ case 0:
305
+ source = op.index ? store.index(op.index) : store;
306
+ if (!(op.type === 'keys')) return [3 /*break*/, 5];
307
+ if (!op.index) return [3 /*break*/, 2];
308
+ return [4 /*yield*/, Promise.all(op.keys.map(function (key) { return idbReq(source.getAll(key)); }))];
309
+ case 1:
310
+ _d = (_f.sent()).flat();
311
+ return [3 /*break*/, 4];
312
+ case 2: return [4 /*yield*/, Promise.all(op.keys.map(function (key) { return idbReq(store.get(key)); }))];
313
+ case 3:
314
+ _d = _f.sent();
315
+ _f.label = 4;
316
+ case 4:
317
+ _c = _d;
318
+ return [3 /*break*/, 7];
319
+ case 5: return [4 /*yield*/, idbReq(source.getAll(op.range))];
320
+ case 6:
321
+ _c = _f.sent();
322
+ _f.label = 7;
323
+ case 7:
324
+ chunk = _c;
325
+ try {
326
+ for (chunk_1 = (e_4 = void 0, tslib_1.__values(chunk)), chunk_1_1 = chunk_1.next(); !chunk_1_1.done; chunk_1_1 = chunk_1.next()) {
327
+ row = chunk_1_1.value;
328
+ if (row == null)
329
+ continue;
330
+ k = JSON.stringify(row[idKey]);
331
+ if (seen.has(k))
332
+ continue;
333
+ seen.add(k);
334
+ rows.push(row);
335
+ }
336
+ }
337
+ catch (e_4_1) { e_4 = { error: e_4_1 }; }
338
+ finally {
339
+ try {
340
+ if (chunk_1_1 && !chunk_1_1.done && (_e = chunk_1.return)) _e.call(chunk_1);
341
+ }
342
+ finally { if (e_4) throw e_4.error; }
343
+ }
344
+ return [2 /*return*/];
345
+ }
346
+ });
347
+ };
348
+ _b.label = 1;
349
+ case 1:
350
+ _b.trys.push([1, 6, 7, 8]);
351
+ ops_1 = tslib_1.__values(ops), ops_1_1 = ops_1.next();
352
+ _b.label = 2;
353
+ case 2:
354
+ if (!!ops_1_1.done) return [3 /*break*/, 5];
355
+ op = ops_1_1.value;
356
+ return [5 /*yield**/, _loop_1(op)];
357
+ case 3:
358
+ _b.sent();
359
+ _b.label = 4;
360
+ case 4:
361
+ ops_1_1 = ops_1.next();
362
+ return [3 /*break*/, 2];
363
+ case 5: return [3 /*break*/, 8];
364
+ case 6:
365
+ e_3_1 = _b.sent();
366
+ e_3 = { error: e_3_1 };
367
+ return [3 /*break*/, 8];
368
+ case 7:
369
+ try {
370
+ if (ops_1_1 && !ops_1_1.done && (_a = ops_1.return)) _a.call(ops_1);
371
+ }
372
+ finally { if (e_3) throw e_3.error; }
373
+ return [7 /*endfinally*/];
374
+ case 8: return [2 /*return*/, rows];
375
+ }
376
+ });
377
+ }); });
378
+ };
379
+ //@internal
380
+ IndexedDbDataProvider.prototype.withStore = function (storeName, mode, op) {
381
+ var _this = this;
382
+ return new Promise(function (resolve, reject) {
383
+ var tx = _this.db.transaction(storeName, mode);
384
+ var result;
385
+ var opErr;
386
+ tx.oncomplete = function () {
387
+ if (opErr)
388
+ reject(opErr);
389
+ else
390
+ resolve(result);
391
+ };
392
+ tx.onabort = function () { return reject(opErr !== null && opErr !== void 0 ? opErr : tx.error); };
393
+ tx.onerror = function () { return reject(opErr !== null && opErr !== void 0 ? opErr : tx.error); };
394
+ Promise.resolve(op(tx.objectStore(storeName))).then(function (r) {
395
+ result = r;
396
+ }, function (e) {
397
+ opErr = e;
398
+ try {
399
+ tx.abort();
400
+ }
401
+ catch (_a) {
402
+ /* already aborted */
403
+ }
404
+ });
405
+ });
406
+ };
407
+ return IndexedDbDataProvider;
408
+ }());
409
+ exports.IndexedDbDataProvider = IndexedDbDataProvider;
410
+ var IndexedDbEntityDataProvider = /** @class */ (function () {
411
+ function IndexedDbEntityDataProvider(provider, entity) {
412
+ this.provider = provider;
413
+ this.entity = entity;
414
+ }
415
+ IndexedDbEntityDataProvider.prototype.find = function (options) {
416
+ return this.provider.runWithRows(this.entity, options === null || options === void 0 ? void 0 : options.where, function (dp) {
417
+ return dp.find(options);
418
+ });
419
+ };
420
+ IndexedDbEntityDataProvider.prototype.count = function (where) {
421
+ return this.provider.runWithRows(this.entity, where, function (dp) { return dp.count(where); });
422
+ };
423
+ IndexedDbEntityDataProvider.prototype.groupBy = function (options) {
424
+ return this.provider.runWithRows(this.entity, options === null || options === void 0 ? void 0 : options.where, function (dp) {
425
+ return dp.groupBy(options);
426
+ });
427
+ };
428
+ IndexedDbEntityDataProvider.prototype.insert = function (data) {
429
+ var _this = this;
430
+ return this.provider.enqueue(function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
431
+ var helper, names, auto, idName, rows;
432
+ var _this = this;
433
+ return tslib_1.__generator(this, function (_a) {
434
+ switch (_a.label) {
435
+ case 0: return [4 /*yield*/, this.provider.ensureStores([this.entity])];
436
+ case 1:
437
+ _a.sent();
438
+ helper = new array_entity_data_provider_js_1.ArrayEntityDataProvider(this.entity, function () { return []; });
439
+ return [4 /*yield*/, helper.init()];
440
+ case 2:
441
+ names = _a.sent();
442
+ auto = (0, RepositoryImplementation_js_1.isAutoIncrement)(this.entity.idMetadata.field);
443
+ idName = names.$dbNameOf(this.entity.idMetadata.field);
444
+ rows = data.map(function (row) {
445
+ var json = helper.translateToJson(row, names);
446
+ helper.verifyThatRowHasAllNotNullColumns(json, names);
447
+ if (auto)
448
+ delete json[idName];
449
+ return json;
450
+ });
451
+ return [2 /*return*/, this.provider.withStore(storeNameOf(this.entity), 'readwrite', function (store) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
452
+ var result, rows_1, rows_1_1, json, key, e_5, e_6_1;
453
+ var e_6, _a;
454
+ var _b;
455
+ return tslib_1.__generator(this, function (_c) {
456
+ switch (_c.label) {
457
+ case 0:
458
+ result = [];
459
+ _c.label = 1;
460
+ case 1:
461
+ _c.trys.push([1, 9, 10, 11]);
462
+ rows_1 = tslib_1.__values(rows), rows_1_1 = rows_1.next();
463
+ _c.label = 2;
464
+ case 2:
465
+ if (!!rows_1_1.done) return [3 /*break*/, 8];
466
+ json = rows_1_1.value;
467
+ _c.label = 3;
468
+ case 3:
469
+ _c.trys.push([3, 5, , 6]);
470
+ return [4 /*yield*/, idbReq(store.add(json))];
471
+ case 4:
472
+ key = _c.sent();
473
+ if (auto)
474
+ json[idName] = (_b = json[idName]) !== null && _b !== void 0 ? _b : key;
475
+ return [3 /*break*/, 6];
476
+ case 5:
477
+ e_5 = _c.sent();
478
+ if ((e_5 === null || e_5 === void 0 ? void 0 : e_5.name) === 'ConstraintError')
479
+ throw Error('id already exists');
480
+ throw e_5;
481
+ case 6:
482
+ result.push(helper.translateFromJson(json, names));
483
+ _c.label = 7;
484
+ case 7:
485
+ rows_1_1 = rows_1.next();
486
+ return [3 /*break*/, 2];
487
+ case 8: return [3 /*break*/, 11];
488
+ case 9:
489
+ e_6_1 = _c.sent();
490
+ e_6 = { error: e_6_1 };
491
+ return [3 /*break*/, 11];
492
+ case 10:
493
+ try {
494
+ if (rows_1_1 && !rows_1_1.done && (_a = rows_1.return)) _a.call(rows_1);
495
+ }
496
+ finally { if (e_6) throw e_6.error; }
497
+ return [7 /*endfinally*/];
498
+ case 11: return [2 /*return*/, result];
499
+ }
500
+ });
501
+ }); })];
502
+ }
503
+ });
504
+ }); });
505
+ };
506
+ IndexedDbEntityDataProvider.prototype.update = function (id, data) {
507
+ var _this = this;
508
+ return this.provider.enqueue(function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
509
+ var helper, names, key;
510
+ var _this = this;
511
+ return tslib_1.__generator(this, function (_a) {
512
+ switch (_a.label) {
513
+ case 0: return [4 /*yield*/, this.provider.ensureStores([this.entity])];
514
+ case 1:
515
+ _a.sent();
516
+ helper = new array_entity_data_provider_js_1.ArrayEntityDataProvider(this.entity, function () { return []; });
517
+ return [4 /*yield*/, helper.init()];
518
+ case 2:
519
+ names = _a.sent();
520
+ key = toIdbKey(this.entity, id);
521
+ return [2 /*return*/, this.provider.withStore(storeNameOf(this.entity), 'readwrite', function (store) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
522
+ var existing, json, keys, _a, _b, f, newKey, conflict;
523
+ var e_7, _c;
524
+ return tslib_1.__generator(this, function (_d) {
525
+ switch (_d.label) {
526
+ case 0: return [4 /*yield*/, idbReq(store.get(key))];
527
+ case 1:
528
+ existing = _d.sent();
529
+ if (existing == null)
530
+ throw new Error("Couldn't find row with id \"".concat(id, "\" in entity \"").concat(this.entity.key, "\" to update"));
531
+ json = tslib_1.__assign({}, existing);
532
+ keys = Object.keys(data);
533
+ try {
534
+ for (_a = tslib_1.__values(this.entity.fields), _b = _a.next(); !_b.done; _b = _a.next()) {
535
+ f = _b.value;
536
+ if (!(0, filter_consumer_bridge_to_sql_request_js_1.isDbReadonly)(f, names) && keys.includes(f.key)) {
537
+ json[names.$dbNameOf(f)] = f.valueConverter.toJson(data[f.key]);
538
+ }
539
+ }
540
+ }
541
+ catch (e_7_1) { e_7 = { error: e_7_1 }; }
542
+ finally {
543
+ try {
544
+ if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
545
+ }
546
+ finally { if (e_7) throw e_7.error; }
547
+ }
548
+ helper.verifyThatRowHasAllNotNullColumns(json, names);
549
+ newKey = keyFromRow(this.entity, names, json);
550
+ if (!!idbKeysEqual(key, newKey)) return [3 /*break*/, 4];
551
+ return [4 /*yield*/, idbReq(store.get(newKey))];
552
+ case 2:
553
+ conflict = _d.sent();
554
+ if (conflict != null)
555
+ throw Error('id already exists');
556
+ return [4 /*yield*/, idbReq(store.delete(key))];
557
+ case 3:
558
+ _d.sent();
559
+ _d.label = 4;
560
+ case 4: return [4 /*yield*/, idbReq(store.put(json))];
561
+ case 5:
562
+ _d.sent();
563
+ return [2 /*return*/, helper.translateFromJson(json, names)];
564
+ }
565
+ });
566
+ }); })];
567
+ }
568
+ });
569
+ }); });
570
+ };
571
+ IndexedDbEntityDataProvider.prototype.delete = function (ids) {
572
+ var _this = this;
573
+ if (ids.length === 0)
574
+ return Promise.resolve();
575
+ return this.provider.enqueue(function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
576
+ var _this = this;
577
+ return tslib_1.__generator(this, function (_a) {
578
+ switch (_a.label) {
579
+ case 0: return [4 /*yield*/, this.provider.ensureStores([this.entity])];
580
+ case 1:
581
+ _a.sent();
582
+ return [2 /*return*/, this.provider.withStore(storeNameOf(this.entity), 'readwrite', function (store) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
583
+ var ids_1, ids_1_1, id, key, existing, e_8_1;
584
+ var e_8, _a;
585
+ return tslib_1.__generator(this, function (_b) {
586
+ switch (_b.label) {
587
+ case 0:
588
+ _b.trys.push([0, 6, 7, 8]);
589
+ ids_1 = tslib_1.__values(ids), ids_1_1 = ids_1.next();
590
+ _b.label = 1;
591
+ case 1:
592
+ if (!!ids_1_1.done) return [3 /*break*/, 5];
593
+ id = ids_1_1.value;
594
+ key = toIdbKey(this.entity, id);
595
+ return [4 /*yield*/, idbReq(store.get(key))];
596
+ case 2:
597
+ existing = _b.sent();
598
+ if (existing == null)
599
+ throw new Error("Couldn't find row with id \"".concat(id, "\" in entity \"").concat(this.entity.key, "\" to delete"));
600
+ return [4 /*yield*/, idbReq(store.delete(key))];
601
+ case 3:
602
+ _b.sent();
603
+ _b.label = 4;
604
+ case 4:
605
+ ids_1_1 = ids_1.next();
606
+ return [3 /*break*/, 1];
607
+ case 5: return [3 /*break*/, 8];
608
+ case 6:
609
+ e_8_1 = _b.sent();
610
+ e_8 = { error: e_8_1 };
611
+ return [3 /*break*/, 8];
612
+ case 7:
613
+ try {
614
+ if (ids_1_1 && !ids_1_1.done && (_a = ids_1.return)) _a.call(ids_1);
615
+ }
616
+ finally { if (e_8) throw e_8.error; }
617
+ return [7 /*endfinally*/];
618
+ case 8: return [2 /*return*/];
619
+ }
620
+ });
621
+ }); })];
622
+ }
623
+ });
624
+ }); });
625
+ };
626
+ return IndexedDbEntityDataProvider;
627
+ }());
628
+ function storeNameOf(entity) {
629
+ return entity.dbName;
630
+ }
631
+ //@internal
632
+ function idbPrefetchFromFilter(entity_1, where_1) {
633
+ return tslib_1.__awaiter(this, arguments, void 0, function (entity, where, indexes) {
634
+ var names, c, r, ordered, ordered_1, ordered_1_1, idx, r;
635
+ var e_9, _a;
636
+ if (indexes === void 0) { indexes = []; }
637
+ return tslib_1.__generator(this, function (_b) {
638
+ switch (_b.label) {
639
+ case 0:
640
+ if (!where)
641
+ return [2 /*return*/, { type: 'all' }];
642
+ return [4 /*yield*/, (0, filter_consumer_bridge_to_sql_request_js_1.dbNamesOf)(entity, function (x) { return x; })];
643
+ case 1:
644
+ names = _b.sent();
645
+ if (entity.idMetadata.fields.length === 1) {
646
+ c = new IdbPrefetchCollector(entity.idMetadata.fields[0]);
647
+ where.__applyToConsumer(c);
648
+ r = c.result();
649
+ if (r.type !== 'all')
650
+ return [2 /*return*/, r];
651
+ }
652
+ ordered = tslib_1.__spreadArray([], tslib_1.__read(indexes), false).sort(function (a, b) { return pathLen(b.keyPath) - pathLen(a.keyPath); });
653
+ try {
654
+ for (ordered_1 = tslib_1.__values(ordered), ordered_1_1 = ordered_1.next(); !ordered_1_1.done; ordered_1_1 = ordered_1.next()) {
655
+ idx = ordered_1_1.value;
656
+ r = prefetchForIndex(entity, names, where, idx);
657
+ if (r.type !== 'all')
658
+ return [2 /*return*/, withIndex(r, idx.name)];
659
+ }
660
+ }
661
+ catch (e_9_1) { e_9 = { error: e_9_1 }; }
662
+ finally {
663
+ try {
664
+ if (ordered_1_1 && !ordered_1_1.done && (_a = ordered_1.return)) _a.call(ordered_1);
665
+ }
666
+ finally { if (e_9) throw e_9.error; }
667
+ }
668
+ return [2 /*return*/, { type: 'all' }];
669
+ }
670
+ });
671
+ });
672
+ }
673
+ function prefetchForIndex(entity, names, where, idx) {
674
+ var path = Array.isArray(idx.keyPath) ? idx.keyPath : [idx.keyPath];
675
+ if (path.length === 1) {
676
+ var field = fieldByDbName(entity, names, path[0]);
677
+ if (!field)
678
+ return { type: 'all' };
679
+ var c = new IdbPrefetchCollector(field);
680
+ where.__applyToConsumer(c);
681
+ return c.result();
682
+ }
683
+ var parts = path.map(function (dbName) {
684
+ var field = fieldByDbName(entity, names, dbName);
685
+ if (!field)
686
+ return { type: 'all' };
687
+ var c = new IdbPrefetchCollector(field);
688
+ where.__applyToConsumer(c);
689
+ return c.result();
690
+ });
691
+ if (parts.every(function (p) { return p.type === 'keys'; })) {
692
+ return {
693
+ type: 'keys',
694
+ keys: cartesian(parts.map(function (p) { return p.keys; })),
695
+ };
696
+ }
697
+ var last = parts[parts.length - 1];
698
+ var prefix = parts.slice(0, -1);
699
+ if (last.type === 'range' &&
700
+ prefix.every(function (p) { return p.type === 'keys' && p.keys.length === 1; })) {
701
+ var pre = prefix.map(function (p) { return p.keys[0]; });
702
+ var r = last.range;
703
+ try {
704
+ if (r.lower !== undefined && r.upper !== undefined)
705
+ return {
706
+ type: 'range',
707
+ range: IDBKeyRange.bound(tslib_1.__spreadArray(tslib_1.__spreadArray([], tslib_1.__read(pre), false), [r.lower], false), tslib_1.__spreadArray(tslib_1.__spreadArray([], tslib_1.__read(pre), false), [r.upper], false), r.lowerOpen, r.upperOpen),
708
+ };
709
+ if (r.lower !== undefined)
710
+ return {
711
+ type: 'range',
712
+ range: IDBKeyRange.lowerBound(tslib_1.__spreadArray(tslib_1.__spreadArray([], tslib_1.__read(pre), false), [r.lower], false), r.lowerOpen),
713
+ };
714
+ if (r.upper !== undefined)
715
+ return {
716
+ type: 'range',
717
+ range: IDBKeyRange.upperBound(tslib_1.__spreadArray(tslib_1.__spreadArray([], tslib_1.__read(pre), false), [r.upper], false), r.upperOpen),
718
+ };
719
+ }
720
+ catch (_a) {
721
+ return { type: 'keys', keys: [] };
722
+ }
723
+ }
724
+ return { type: 'all' };
725
+ }
726
+ function withIndex(prefetch, index) {
727
+ if (prefetch.type === 'all')
728
+ return prefetch;
729
+ if (prefetch.type === 'or')
730
+ return { type: 'or', parts: prefetch.parts.map(function (p) { return (tslib_1.__assign(tslib_1.__assign({}, p), { index: index })); }) };
731
+ return tslib_1.__assign(tslib_1.__assign({}, prefetch), { index: index });
732
+ }
733
+ function pathLen(keyPath) {
734
+ return Array.isArray(keyPath) ? keyPath.length : 1;
735
+ }
736
+ function fieldByDbName(entity, names, dbName) {
737
+ var e_10, _a;
738
+ try {
739
+ for (var _b = tslib_1.__values(entity.fields), _c = _b.next(); !_c.done; _c = _b.next()) {
740
+ var f = _c.value;
741
+ if (names.$dbNameOf(f) === dbName)
742
+ return f;
743
+ }
744
+ }
745
+ catch (e_10_1) { e_10 = { error: e_10_1 }; }
746
+ finally {
747
+ try {
748
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
749
+ }
750
+ finally { if (e_10) throw e_10.error; }
751
+ }
752
+ }
753
+ function cartesian(lists) {
754
+ var e_11, _a;
755
+ var acc = [[]];
756
+ var _loop_2 = function (list) {
757
+ acc = acc.flatMap(function (prefix) { return list.map(function (v) { return tslib_1.__spreadArray(tslib_1.__spreadArray([], tslib_1.__read(prefix), false), [v], false); }); });
758
+ };
759
+ try {
760
+ for (var lists_1 = tslib_1.__values(lists), lists_1_1 = lists_1.next(); !lists_1_1.done; lists_1_1 = lists_1.next()) {
761
+ var list = lists_1_1.value;
762
+ _loop_2(list);
763
+ }
764
+ }
765
+ catch (e_11_1) { e_11 = { error: e_11_1 }; }
766
+ finally {
767
+ try {
768
+ if (lists_1_1 && !lists_1_1.done && (_a = lists_1.return)) _a.call(lists_1);
769
+ }
770
+ finally { if (e_11) throw e_11.error; }
771
+ }
772
+ return acc;
773
+ }
774
+ var IdbPrefetchCollector = /** @class */ (function () {
775
+ function IdbPrefetchCollector(idField) {
776
+ this.idField = idField;
777
+ this.cannotNarrow = false;
778
+ }
779
+ IdbPrefetchCollector.prototype.result = function () {
780
+ if (this.cannotNarrow)
781
+ return { type: 'all' };
782
+ var andOp = this.andOp();
783
+ if (this.keys && andOp)
784
+ return andOp;
785
+ if (this.orOps)
786
+ return mergeOps(this.orOps);
787
+ return andOp !== null && andOp !== void 0 ? andOp : { type: 'all' };
788
+ };
789
+ IdbPrefetchCollector.prototype.hasIdConstraint = function () {
790
+ return this.keys != null || this.hasBounds || this.orOps != null;
791
+ };
792
+ Object.defineProperty(IdbPrefetchCollector.prototype, "hasBounds", {
793
+ get: function () {
794
+ return this.lower != null || this.upper != null;
795
+ },
796
+ enumerable: false,
797
+ configurable: true
798
+ });
799
+ IdbPrefetchCollector.prototype.andOp = function () {
800
+ if (this.keys) {
801
+ if (!this.hasBounds)
802
+ return { type: 'keys', keys: this.keys };
803
+ try {
804
+ var range_1 = this.toKeyRange();
805
+ return {
806
+ type: 'keys',
807
+ keys: this.keys.filter(function (k) { return range_1.includes(k); }),
808
+ };
809
+ }
810
+ catch (_a) {
811
+ return { type: 'keys', keys: [] };
812
+ }
813
+ }
814
+ if (!this.hasBounds)
815
+ return undefined;
816
+ try {
817
+ return { type: 'range', range: this.toKeyRange() };
818
+ }
819
+ catch (_b) {
820
+ return { type: 'keys', keys: [] };
821
+ }
822
+ };
823
+ IdbPrefetchCollector.prototype.toKeyRange = function () {
824
+ if (this.lower && this.upper)
825
+ return IDBKeyRange.bound(this.lower.value, this.upper.value, this.lower.open, this.upper.open);
826
+ if (this.lower)
827
+ return IDBKeyRange.lowerBound(this.lower.value, this.lower.open);
828
+ return IDBKeyRange.upperBound(this.upper.value, this.upper.open);
829
+ };
830
+ IdbPrefetchCollector.prototype.isId = function (col) {
831
+ return col.key === this.idField.key;
832
+ };
833
+ IdbPrefetchCollector.prototype.toKey = function (col, val) {
834
+ return col.valueConverter.toJson(val);
835
+ };
836
+ IdbPrefetchCollector.prototype.intersectKeys = function (vals) {
837
+ if (!this.keys)
838
+ this.keys = tslib_1.__spreadArray([], tslib_1.__read(vals), false);
839
+ else
840
+ this.keys = this.keys.filter(function (k) {
841
+ return vals.some(function (v) { return idbKeysEqual(k, v); });
842
+ });
843
+ };
844
+ IdbPrefetchCollector.prototype.addLower = function (value, open) {
845
+ if (!this.lower)
846
+ this.lower = { value: value, open: open };
847
+ else if (value > this.lower.value)
848
+ this.lower = { value: value, open: open };
849
+ else if (value === this.lower.value)
850
+ this.lower = { value: value, open: this.lower.open || open };
851
+ };
852
+ IdbPrefetchCollector.prototype.addUpper = function (value, open) {
853
+ if (!this.upper)
854
+ this.upper = { value: value, open: open };
855
+ else if (value < this.upper.value)
856
+ this.upper = { value: value, open: open };
857
+ else if (value === this.upper.value)
858
+ this.upper = { value: value, open: this.upper.open || open };
859
+ };
860
+ IdbPrefetchCollector.prototype.isEqualTo = function (col, val) {
861
+ if (this.isId(col))
862
+ this.intersectKeys([this.toKey(col, val)]);
863
+ };
864
+ IdbPrefetchCollector.prototype.isIn = function (col, val) {
865
+ var _this = this;
866
+ if (this.isId(col))
867
+ this.intersectKeys(val.map(function (v) { return _this.toKey(col, v); }));
868
+ };
869
+ IdbPrefetchCollector.prototype.isGreaterThan = function (col, val) {
870
+ if (this.isId(col))
871
+ this.addLower(this.toKey(col, val), true);
872
+ };
873
+ IdbPrefetchCollector.prototype.isGreaterOrEqualTo = function (col, val) {
874
+ if (this.isId(col))
875
+ this.addLower(this.toKey(col, val), false);
876
+ };
877
+ IdbPrefetchCollector.prototype.isLessThan = function (col, val) {
878
+ if (this.isId(col))
879
+ this.addUpper(this.toKey(col, val), true);
880
+ };
881
+ IdbPrefetchCollector.prototype.isLessOrEqualTo = function (col, val) {
882
+ if (this.isId(col))
883
+ this.addUpper(this.toKey(col, val), false);
884
+ };
885
+ IdbPrefetchCollector.prototype.or = function (orElements) {
886
+ var _this = this;
887
+ var results = orElements.map(function (el) {
888
+ var c = new IdbPrefetchCollector(_this.idField);
889
+ el.__applyToConsumer(c);
890
+ return c.result();
891
+ });
892
+ if (results.some(function (r) { return r.type === 'all'; }))
893
+ return;
894
+ var ops = results.flatMap(function (r) {
895
+ return r.type === 'or' ? r.parts : r.type === 'all' ? [] : [r];
896
+ });
897
+ this.orOps = this.orOps ? tslib_1.__spreadArray(tslib_1.__spreadArray([], tslib_1.__read(this.orOps), false), tslib_1.__read(ops), false) : ops;
898
+ };
899
+ IdbPrefetchCollector.prototype.not = function (filter) {
900
+ var c = new IdbPrefetchCollector(this.idField);
901
+ filter.__applyToConsumer(c);
902
+ if (c.cannotNarrow || c.hasIdConstraint())
903
+ this.cannotNarrow = true;
904
+ };
905
+ IdbPrefetchCollector.prototype.isNull = function (col) {
906
+ if (this.isId(col))
907
+ this.cannotNarrow = true;
908
+ };
909
+ IdbPrefetchCollector.prototype.isNotNull = function (col) {
910
+ if (this.isId(col))
911
+ this.cannotNarrow = true;
912
+ };
913
+ IdbPrefetchCollector.prototype.isDifferentFrom = function (_col, _val) { };
914
+ IdbPrefetchCollector.prototype.containsCaseInsensitive = function (_col, _val) { };
915
+ IdbPrefetchCollector.prototype.notContainsCaseInsensitive = function (_col, _val) { };
916
+ IdbPrefetchCollector.prototype.startsWithCaseInsensitive = function (_col, _val) { };
917
+ IdbPrefetchCollector.prototype.endsWithCaseInsensitive = function (_col, _val) { };
918
+ IdbPrefetchCollector.prototype.custom = function (_key, _customItem) {
919
+ this.cannotNarrow = true;
920
+ };
921
+ IdbPrefetchCollector.prototype.databaseCustom = function (_databaseCustom) {
922
+ this.cannotNarrow = true;
923
+ };
924
+ return IdbPrefetchCollector;
925
+ }());
926
+ function mergeOps(ops) {
927
+ var e_12, _a;
928
+ var _b, _c;
929
+ var keyGroups = new Map();
930
+ var ranges = [];
931
+ try {
932
+ for (var ops_2 = tslib_1.__values(ops), ops_2_1 = ops_2.next(); !ops_2_1.done; ops_2_1 = ops_2.next()) {
933
+ var op = ops_2_1.value;
934
+ if (op.type === 'keys') {
935
+ var k = (_b = op.index) !== null && _b !== void 0 ? _b : '';
936
+ keyGroups.set(k, tslib_1.__spreadArray(tslib_1.__spreadArray([], tslib_1.__read(((_c = keyGroups.get(k)) !== null && _c !== void 0 ? _c : [])), false), tslib_1.__read(op.keys), false));
937
+ }
938
+ else
939
+ ranges.push(op);
940
+ }
941
+ }
942
+ catch (e_12_1) { e_12 = { error: e_12_1 }; }
943
+ finally {
944
+ try {
945
+ if (ops_2_1 && !ops_2_1.done && (_a = ops_2.return)) _a.call(ops_2);
946
+ }
947
+ finally { if (e_12) throw e_12.error; }
948
+ }
949
+ var parts = tslib_1.__spreadArray(tslib_1.__spreadArray([], tslib_1.__read(tslib_1.__spreadArray([], tslib_1.__read(keyGroups.entries()), false).map(function (_a) {
950
+ var _b = tslib_1.__read(_a, 2), index = _b[0], keys = _b[1];
951
+ return (tslib_1.__assign({ type: 'keys', keys: keys.filter(function (k, i) { return keys.findIndex(function (x) { return idbKeysEqual(x, k); }) === i; }) }, (index ? { index: index } : {})));
952
+ })), false), tslib_1.__read(ranges), false);
953
+ if (parts.length === 1)
954
+ return parts[0];
955
+ return { type: 'or', parts: parts };
956
+ }
957
+ function resolveIndexDefs(entity, defs, storeKeyPath) {
958
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
959
+ var names, result, seen, pk, defs_1, defs_1_1, def, keys, keyPath, path, name_3;
960
+ var e_13, _a;
961
+ return tslib_1.__generator(this, function (_b) {
962
+ switch (_b.label) {
963
+ case 0:
964
+ if (defs.length === 0)
965
+ return [2 /*return*/, []];
966
+ return [4 /*yield*/, (0, filter_consumer_bridge_to_sql_request_js_1.dbNamesOf)(entity, function (x) { return x; })];
967
+ case 1:
968
+ names = _b.sent();
969
+ result = [];
970
+ seen = new Set();
971
+ pk = JSON.stringify(storeKeyPath);
972
+ try {
973
+ for (defs_1 = tslib_1.__values(defs), defs_1_1 = defs_1.next(); !defs_1_1.done; defs_1_1 = defs_1.next()) {
974
+ def = defs_1_1.value;
975
+ keys = Array.isArray(def) ? tslib_1.__spreadArray([], tslib_1.__read(def), false) : [def];
976
+ keyPath = keys.map(function (key) {
977
+ var field = tslib_1.__spreadArray([], tslib_1.__read(entity.fields), false).find(function (f) { return f.key === key; });
978
+ if (!field)
979
+ throw new Error("IndexedDB index field \"".concat(key, "\" not found on entity \"").concat(entity.key, "\""));
980
+ return names.$dbNameOf(field);
981
+ });
982
+ path = keyPath.length === 1 ? keyPath[0] : keyPath;
983
+ if (JSON.stringify(path) === pk)
984
+ continue;
985
+ name_3 = keyPath.join('_');
986
+ if (seen.has(name_3))
987
+ continue;
988
+ seen.add(name_3);
989
+ result.push({ name: name_3, keyPath: path });
990
+ }
991
+ }
992
+ catch (e_13_1) { e_13 = { error: e_13_1 }; }
993
+ finally {
994
+ try {
995
+ if (defs_1_1 && !defs_1_1.done && (_a = defs_1.return)) _a.call(defs_1);
996
+ }
997
+ finally { if (e_13) throw e_13.error; }
998
+ }
999
+ return [2 /*return*/, result];
1000
+ }
1001
+ });
1002
+ });
1003
+ }
1004
+ function keyPathOf(entity) {
1005
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
1006
+ var names, fields;
1007
+ return tslib_1.__generator(this, function (_a) {
1008
+ switch (_a.label) {
1009
+ case 0: return [4 /*yield*/, (0, filter_consumer_bridge_to_sql_request_js_1.dbNamesOf)(entity, function (x) { return x; })];
1010
+ case 1:
1011
+ names = _a.sent();
1012
+ fields = entity.idMetadata.fields;
1013
+ if (fields.length === 1)
1014
+ return [2 /*return*/, names.$dbNameOf(fields[0])];
1015
+ return [2 /*return*/, fields.map(function (f) { return names.$dbNameOf(f); })];
1016
+ }
1017
+ });
1018
+ });
1019
+ }
1020
+ function toIdbKey(entity, id) {
1021
+ var fields = entity.idMetadata.fields;
1022
+ if (fields.length === 1)
1023
+ return fields[0].valueConverter.toJson(id);
1024
+ var values = typeof id === 'object' && id !== null
1025
+ ? id
1026
+ : Object.fromEntries(String(id)
1027
+ .split(',')
1028
+ .map(function (part, i) { return [
1029
+ fields[i].key,
1030
+ fields[i].valueConverter.fromJson(part),
1031
+ ]; }));
1032
+ return fields.map(function (f) { return f.valueConverter.toJson(values[f.key]); });
1033
+ }
1034
+ function keyFromRow(entity, names, row) {
1035
+ var fields = entity.idMetadata.fields;
1036
+ if (fields.length === 1)
1037
+ return row[names.$dbNameOf(fields[0])];
1038
+ return fields.map(function (f) { return row[names.$dbNameOf(f)]; });
1039
+ }
1040
+ function idbKeysEqual(a, b) {
1041
+ return JSON.stringify(a) === JSON.stringify(b);
1042
+ }
1043
+ function idbReq(request) {
1044
+ return new Promise(function (resolve, reject) {
1045
+ request.onsuccess = function () { return resolve(request.result); };
1046
+ request.onerror = function () { return reject(request.error); };
1047
+ });
1048
+ }