dexie 4.0.1-alpha.8 → 4.0.1-beta.2

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/dist/dexie.js CHANGED
@@ -4,7 +4,7 @@
4
4
  *
5
5
  * By David Fahlander, david.fahlander@gmail.com
6
6
  *
7
- * Version 4.0.1-alpha.8, Fri Feb 17 2023
7
+ * Version 4.0.1-beta.2, Wed Nov 29 2023
8
8
  *
9
9
  * https://dexie.org
10
10
  *
@@ -149,7 +149,7 @@
149
149
  }
150
150
  }
151
151
  function getByKeyPath(obj, keyPath) {
152
- if (hasOwn(obj, keyPath))
152
+ if (typeof keyPath === 'string' && hasOwn(obj, keyPath))
153
153
  return obj[keyPath];
154
154
  if (!keyPath)
155
155
  return obj;
@@ -232,40 +232,54 @@
232
232
  function flatten(a) {
233
233
  return concat.apply([], a);
234
234
  }
235
- var intrinsicTypeNames = "Boolean,String,Date,RegExp,Blob,File,FileList,FileSystemFileHandle,FileSystemDirectoryHandle,ArrayBuffer,DataView,Uint8ClampedArray,ImageBitmap,ImageData,Map,Set,CryptoKey"
235
+ var intrinsicTypeNames = "Array,Boolean,String,Date,RegExp,Blob,File,FileList,FileSystemFileHandle,FileSystemDirectoryHandle,ArrayBuffer,DataView,Uint8ClampedArray,ImageBitmap,ImageData,Map,Set,CryptoKey"
236
236
  .split(',').concat(flatten([8, 16, 32, 64].map(function (num) { return ["Int", "Uint", "Float"].map(function (t) { return t + num + "Array"; }); }))).filter(function (t) { return _global[t]; });
237
- var intrinsicTypes = intrinsicTypeNames.map(function (t) { return _global[t]; });
238
- arrayToObject(intrinsicTypeNames, function (x) { return [x, true]; });
237
+ var intrinsicTypes = new Set(intrinsicTypeNames.map(function (t) { return _global[t]; }));
238
+ function cloneSimpleObjectTree(o) {
239
+ var rv = {};
240
+ for (var k in o)
241
+ if (hasOwn(o, k)) {
242
+ var v = o[k];
243
+ rv[k] = !v || typeof v !== 'object' || intrinsicTypes.has(v.constructor) ? v : cloneSimpleObjectTree(v);
244
+ }
245
+ return rv;
246
+ }
247
+ function objectIsEmpty(o) {
248
+ for (var k in o)
249
+ if (hasOwn(o, k))
250
+ return false;
251
+ return true;
252
+ }
239
253
  var circularRefs = null;
240
254
  function deepClone(any) {
241
- circularRefs = typeof WeakMap !== 'undefined' && new WeakMap();
255
+ circularRefs = new WeakMap();
242
256
  var rv = innerDeepClone(any);
243
257
  circularRefs = null;
244
258
  return rv;
245
259
  }
246
- function innerDeepClone(any) {
247
- if (!any || typeof any !== 'object')
248
- return any;
249
- var rv = circularRefs && circularRefs.get(any);
260
+ function innerDeepClone(x) {
261
+ if (!x || typeof x !== 'object')
262
+ return x;
263
+ var rv = circularRefs.get(x);
250
264
  if (rv)
251
265
  return rv;
252
- if (isArray(any)) {
266
+ if (isArray(x)) {
253
267
  rv = [];
254
- circularRefs && circularRefs.set(any, rv);
255
- for (var i = 0, l = any.length; i < l; ++i) {
256
- rv.push(innerDeepClone(any[i]));
268
+ circularRefs.set(x, rv);
269
+ for (var i = 0, l = x.length; i < l; ++i) {
270
+ rv.push(innerDeepClone(x[i]));
257
271
  }
258
272
  }
259
- else if (intrinsicTypes.indexOf(any.constructor) >= 0) {
260
- rv = any;
273
+ else if (intrinsicTypes.has(x.constructor)) {
274
+ rv = x;
261
275
  }
262
276
  else {
263
- var proto = getProto(any);
277
+ var proto = getProto(x);
264
278
  rv = proto === Object.prototype ? {} : Object.create(proto);
265
- circularRefs && circularRefs.set(any, rv);
266
- for (var prop in any) {
267
- if (hasOwn(any, prop)) {
268
- rv[prop] = innerDeepClone(any[prop]);
279
+ circularRefs.set(x, rv);
280
+ for (var prop in x) {
281
+ if (hasOwn(x, prop)) {
282
+ rv[prop] = innerDeepClone(x[prop]);
269
283
  }
270
284
  }
271
285
  }
@@ -282,6 +296,12 @@
282
296
  var i;
283
297
  return x != null && (i = x[iteratorSymbol]) && i.apply(x);
284
298
  } : function () { return null; };
299
+ function delArrayItem(a, x) {
300
+ var i = a.indexOf(x);
301
+ if (i >= 0)
302
+ a.splice(i, 1);
303
+ return i >= 0;
304
+ }
285
305
  var NO_CHAR_ARRAY = {};
286
306
  function getArrayOf(arrayLike) {
287
307
  var i, a, x, it;
@@ -592,21 +612,9 @@
592
612
  var NativePromise = resolvedNativePromise && resolvedNativePromise.constructor;
593
613
  var patchGlobalPromise = !!resolvedGlobalPromise;
594
614
  var stack_being_generated = false;
595
- var schedulePhysicalTick = resolvedGlobalPromise ?
596
- function () { resolvedGlobalPromise.then(physicalTick); }
597
- :
598
- _global.setImmediate ?
599
- setImmediate.bind(null, physicalTick) :
600
- _global.MutationObserver ?
601
- function () {
602
- var hiddenDiv = document.createElement("div");
603
- (new MutationObserver(function () {
604
- physicalTick();
605
- hiddenDiv = null;
606
- })).observe(hiddenDiv, { attributes: true });
607
- hiddenDiv.setAttribute('i', '1');
608
- } :
609
- function () { setTimeout(physicalTick, 0); };
615
+ function schedulePhysicalTick() {
616
+ queueMicrotask(physicalTick);
617
+ }
610
618
  var asap = function (callback, args) {
611
619
  microtickQueue.push([callback, args]);
612
620
  if (needsNewPhysicalTick) {
@@ -624,17 +632,10 @@
624
632
  global: true,
625
633
  ref: 0,
626
634
  unhandleds: [],
627
- onunhandled: globalError,
635
+ onunhandled: nop,
628
636
  pgp: false,
629
637
  env: {},
630
- finalize: function () {
631
- this.unhandleds.forEach(function (uh) {
632
- try {
633
- globalError(uh[0], uh[1]);
634
- }
635
- catch (e) { }
636
- });
637
- }
638
+ finalize: nop
638
639
  };
639
640
  var PSD = globalPSD;
640
641
  var microtickQueue = [];
@@ -644,7 +645,6 @@
644
645
  if (typeof this !== 'object')
645
646
  throw new TypeError('Promises must be constructed via new');
646
647
  this._listeners = [];
647
- this.onuncatched = nop;
648
648
  this._lib = false;
649
649
  var psd = (this._PSD = PSD);
650
650
  if (debug) {
@@ -711,11 +711,9 @@
711
711
  },
712
712
  finally: function (onFinally) {
713
713
  return this.then(function (value) {
714
- onFinally();
715
- return value;
714
+ return DexiePromise.resolve(onFinally()).then(function () { return value; });
716
715
  }, function (err) {
717
- onFinally();
718
- return PromiseReject(err);
716
+ return DexiePromise.resolve(onFinally()).then(function () { return PromiseReject(err); });
719
717
  });
720
718
  },
721
719
  stack: {
@@ -991,7 +989,9 @@
991
989
  }
992
990
  }
993
991
  function physicalTick() {
994
- beginMicroTickScope() && endMicroTickScope();
992
+ usePSD(globalPSD, function () {
993
+ beginMicroTickScope() && endMicroTickScope();
994
+ });
995
995
  }
996
996
  function beginMicroTickScope() {
997
997
  var wasRootExec = isOutsideMicroTick;
@@ -1154,7 +1154,7 @@
1154
1154
  function switchToZone(targetZone, bEnteringZone) {
1155
1155
  var currentZone = PSD;
1156
1156
  if (bEnteringZone ? task.echoes && (!zoneEchoes++ || targetZone !== PSD) : zoneEchoes && (!--zoneEchoes || targetZone !== PSD)) {
1157
- enqueueNativeMicroTask(bEnteringZone ? zoneEnterEcho.bind(null, targetZone) : zoneLeaveEcho);
1157
+ queueMicrotask(bEnteringZone ? zoneEnterEcho.bind(null, targetZone) : zoneLeaveEcho);
1158
1158
  }
1159
1159
  if (targetZone === PSD)
1160
1160
  return;
@@ -1204,9 +1204,6 @@
1204
1204
  switchToZone(outerScope, false);
1205
1205
  }
1206
1206
  }
1207
- function enqueueNativeMicroTask(job) {
1208
- nativePromiseThen.call(resolvedNativePromise, job);
1209
- }
1210
1207
  function nativeAwaitCompatibleWrap(fn, zone, possibleAwait, cleanup) {
1211
1208
  return typeof fn !== 'function' ? fn : function () {
1212
1209
  var outerZone = PSD;
@@ -1219,7 +1216,7 @@
1219
1216
  finally {
1220
1217
  switchToZone(outerZone, false);
1221
1218
  if (cleanup)
1222
- enqueueNativeMicroTask(decrementExpectedAwaits);
1219
+ queueMicrotask(decrementExpectedAwaits);
1223
1220
  }
1224
1221
  };
1225
1222
  }
@@ -1228,39 +1225,6 @@
1228
1225
  return origThen.call(this, nativeAwaitCompatibleWrap(onResolved, zone), nativeAwaitCompatibleWrap(onRejected, zone));
1229
1226
  };
1230
1227
  }
1231
- var UNHANDLEDREJECTION = "unhandledrejection";
1232
- function globalError(err, promise) {
1233
- var rv;
1234
- try {
1235
- rv = promise.onuncatched(err);
1236
- }
1237
- catch (e) { }
1238
- if (rv !== false)
1239
- try {
1240
- var event, eventData = { promise: promise, reason: err };
1241
- if (_global.document && document.createEvent) {
1242
- event = document.createEvent('Event');
1243
- event.initEvent(UNHANDLEDREJECTION, true, true);
1244
- extend(event, eventData);
1245
- }
1246
- else if (_global.CustomEvent) {
1247
- event = new CustomEvent(UNHANDLEDREJECTION, { detail: eventData });
1248
- extend(event, eventData);
1249
- }
1250
- if (event && _global.dispatchEvent) {
1251
- dispatchEvent(event);
1252
- if (!_global.PromiseRejectionEvent && _global.onunhandledrejection)
1253
- try {
1254
- _global.onunhandledrejection(event);
1255
- }
1256
- catch (_) { }
1257
- }
1258
- if (debug && event && !event.defaultPrevented) {
1259
- console.warn("Unhandled rejection: ".concat(err.stack || err));
1260
- }
1261
- }
1262
- catch (e) { }
1263
- }
1264
1228
  var rejection = DexiePromise.reject;
1265
1229
 
1266
1230
  function tempTransaction(db, mode, storeNames, fn) {
@@ -1295,12 +1259,17 @@
1295
1259
  return fn(resolve, reject, trans);
1296
1260
  });
1297
1261
  }).then(function (result) {
1298
- return trans._completion.then(function () { return result; });
1262
+ if (mode === 'readwrite')
1263
+ try {
1264
+ trans.idbtrans.commit();
1265
+ }
1266
+ catch (_a) { }
1267
+ return mode === 'readonly' ? result : trans._completion.then(function () { return result; });
1299
1268
  });
1300
1269
  }
1301
1270
  }
1302
1271
 
1303
- var DEXIE_VERSION = '4.0.1-alpha.8';
1272
+ var DEXIE_VERSION = '4.0.1-beta.2';
1304
1273
  var maxString = String.fromCharCode(65535);
1305
1274
  var minKey = -Infinity;
1306
1275
  var INVALID_KEY_ARGUMENT = "Invalid key provided. Keys must be of type string, number, Date or Array<string | number | Date>.";
@@ -1435,7 +1404,7 @@
1435
1404
  }
1436
1405
  var wasRootExec = beginMicroTickScope();
1437
1406
  try {
1438
- return trans && trans.db === this.db ?
1407
+ return trans && trans.db._novip === this.db._novip ?
1439
1408
  trans === PSD.trans ?
1440
1409
  trans._promise(mode, checkTableInTransaction, writeLocked) :
1441
1410
  newScope(function () { return trans._promise(mode, checkTableInTransaction, writeLocked); }, { trans: trans, transless: PSD.transless || PSD }) :
@@ -1466,14 +1435,22 @@
1466
1435
  .where(keyPaths[0])
1467
1436
  .equals(indexOrCrit[keyPaths[0]]);
1468
1437
  var compoundIndex = this.schema.indexes.concat(this.schema.primKey).filter(function (ix) {
1469
- return ix.compound &&
1470
- keyPaths.every(function (keyPath) { return ix.keyPath.indexOf(keyPath) >= 0; }) &&
1471
- ix.keyPath.every(function (keyPath) { return keyPaths.indexOf(keyPath) >= 0; });
1472
- })[0];
1473
- if (compoundIndex && this.db._maxKey !== maxString)
1438
+ if (ix.compound &&
1439
+ keyPaths.every(function (keyPath) { return ix.keyPath.indexOf(keyPath) >= 0; })) {
1440
+ for (var i = 0; i < keyPaths.length; ++i) {
1441
+ if (keyPaths.indexOf(ix.keyPath[i]) === -1)
1442
+ return false;
1443
+ }
1444
+ return true;
1445
+ }
1446
+ return false;
1447
+ }).sort(function (a, b) { return a.keyPath.length - b.keyPath.length; })[0];
1448
+ if (compoundIndex && this.db._maxKey !== maxString) {
1449
+ var keyPathsInValidOrder = compoundIndex.keyPath.slice(0, keyPaths.length);
1474
1450
  return this
1475
- .where(compoundIndex.name)
1476
- .equals(compoundIndex.keyPath.map(function (kp) { return indexOrCrit[kp]; }));
1451
+ .where(keyPathsInValidOrder)
1452
+ .equals(keyPathsInValidOrder.map(function (kp) { return indexOrCrit[kp]; }));
1453
+ }
1477
1454
  if (!compoundIndex && debug)
1478
1455
  console.warn("The query ".concat(JSON.stringify(indexOrCrit), " on ").concat(this.name, " would benefit of a ") +
1479
1456
  "compound index [".concat(keyPaths.join('+'), "]"));
@@ -1605,18 +1582,6 @@
1605
1582
  var key = getByKeyPath(keyOrObject, this.schema.primKey.keyPath);
1606
1583
  if (key === undefined)
1607
1584
  return rejection(new exceptions.InvalidArgument("Given object does not contain its primary key"));
1608
- try {
1609
- if (typeof modifications !== "function") {
1610
- keys(modifications).forEach(function (keyPath) {
1611
- setByKeyPath(keyOrObject, keyPath, modifications[keyPath]);
1612
- });
1613
- }
1614
- else {
1615
- modifications(keyOrObject, { value: keyOrObject, primKey: key });
1616
- }
1617
- }
1618
- catch (_a) {
1619
- }
1620
1585
  return this.where(":id").equals(key).modify(modifications);
1621
1586
  }
1622
1587
  else {
@@ -3394,8 +3359,7 @@
3394
3359
  dbcore: dbcore
3395
3360
  };
3396
3361
  }
3397
- function generateMiddlewareStacks(_a, tmpTrans) {
3398
- var db = _a._novip;
3362
+ function generateMiddlewareStacks(db, tmpTrans) {
3399
3363
  var idbdb = tmpTrans.db;
3400
3364
  var stacks = createMiddlewareStacks(db._middlewares, idbdb, db._deps, tmpTrans);
3401
3365
  db.core = stacks.dbcore;
@@ -3410,8 +3374,7 @@
3410
3374
  });
3411
3375
  }
3412
3376
 
3413
- function setApiOnPlace(_a, objs, tableNames, dbschema) {
3414
- var db = _a._novip;
3377
+ function setApiOnPlace(db, objs, tableNames, dbschema) {
3415
3378
  tableNames.forEach(function (tableName) {
3416
3379
  var schema = dbschema[tableName];
3417
3380
  objs.forEach(function (obj) {
@@ -3432,8 +3395,7 @@
3432
3395
  });
3433
3396
  });
3434
3397
  }
3435
- function removeTablesApi(_a, objs) {
3436
- var db = _a._novip;
3398
+ function removeTablesApi(db, objs) {
3437
3399
  objs.forEach(function (obj) {
3438
3400
  for (var key in obj) {
3439
3401
  if (obj[key] instanceof db.Table)
@@ -3465,8 +3427,7 @@
3465
3427
  updateTablesAndIndexes(db, oldVersion, trans, idbUpgradeTrans).catch(rejectTransaction);
3466
3428
  });
3467
3429
  }
3468
- function updateTablesAndIndexes(_a, oldVersion, trans, idbUpgradeTrans) {
3469
- var db = _a._novip;
3430
+ function updateTablesAndIndexes(db, oldVersion, trans, idbUpgradeTrans) {
3470
3431
  var queue = [];
3471
3432
  var versions = db._versions;
3472
3433
  var globalSchema = db._dbSchema = buildGlobalSchema(db, db.idbdb, idbUpgradeTrans);
@@ -3640,8 +3601,7 @@
3640
3601
  });
3641
3602
  return globalSchema;
3642
3603
  }
3643
- function readGlobalSchema(_a, idbdb, tmpTrans) {
3644
- var db = _a._novip;
3604
+ function readGlobalSchema(db, idbdb, tmpTrans) {
3645
3605
  db.verno = idbdb.version / 10;
3646
3606
  var globalSchema = db._dbSchema = buildGlobalSchema(db, idbdb, tmpTrans);
3647
3607
  db._storeNames = slice(idbdb.objectStoreNames, 0);
@@ -3652,8 +3612,7 @@
3652
3612
  var diff = getSchemaDiff(installedSchema, db._dbSchema);
3653
3613
  return !(diff.add.length || diff.change.some(function (ch) { return ch.add.length || ch.change.length; }));
3654
3614
  }
3655
- function adjustToExistingIndexNames(_a, schema, idbtrans) {
3656
- var db = _a._novip;
3615
+ function adjustToExistingIndexNames(db, schema, idbtrans) {
3657
3616
  var storeNames = idbtrans.db.objectStoreNames;
3658
3617
  for (var i = 0; i < storeNames.length; ++i) {
3659
3618
  var storeName = storeNames[i];
@@ -3807,6 +3766,237 @@
3807
3766
  }).finally(function () { return clearInterval(intervalId); });
3808
3767
  }
3809
3768
 
3769
+ var _a;
3770
+ function isEmptyRange(node) {
3771
+ return !("from" in node);
3772
+ }
3773
+ var RangeSet = function (fromOrTree, to) {
3774
+ if (this) {
3775
+ extend(this, arguments.length ? { d: 1, from: fromOrTree, to: arguments.length > 1 ? to : fromOrTree } : { d: 0 });
3776
+ }
3777
+ else {
3778
+ var rv = new RangeSet();
3779
+ if (fromOrTree && ("d" in fromOrTree)) {
3780
+ extend(rv, fromOrTree);
3781
+ }
3782
+ return rv;
3783
+ }
3784
+ };
3785
+ props(RangeSet.prototype, (_a = {
3786
+ add: function (rangeSet) {
3787
+ mergeRanges(this, rangeSet);
3788
+ return this;
3789
+ },
3790
+ addKey: function (key) {
3791
+ addRange(this, key, key);
3792
+ return this;
3793
+ },
3794
+ addKeys: function (keys) {
3795
+ var _this = this;
3796
+ keys.forEach(function (key) { return addRange(_this, key, key); });
3797
+ return this;
3798
+ }
3799
+ },
3800
+ _a[iteratorSymbol] = function () {
3801
+ return getRangeSetIterator(this);
3802
+ },
3803
+ _a));
3804
+ function addRange(target, from, to) {
3805
+ var diff = cmp(from, to);
3806
+ if (isNaN(diff))
3807
+ return;
3808
+ if (diff > 0)
3809
+ throw RangeError();
3810
+ if (isEmptyRange(target))
3811
+ return extend(target, { from: from, to: to, d: 1 });
3812
+ var left = target.l;
3813
+ var right = target.r;
3814
+ if (cmp(to, target.from) < 0) {
3815
+ left
3816
+ ? addRange(left, from, to)
3817
+ : (target.l = { from: from, to: to, d: 1, l: null, r: null });
3818
+ return rebalance(target);
3819
+ }
3820
+ if (cmp(from, target.to) > 0) {
3821
+ right
3822
+ ? addRange(right, from, to)
3823
+ : (target.r = { from: from, to: to, d: 1, l: null, r: null });
3824
+ return rebalance(target);
3825
+ }
3826
+ if (cmp(from, target.from) < 0) {
3827
+ target.from = from;
3828
+ target.l = null;
3829
+ target.d = right ? right.d + 1 : 1;
3830
+ }
3831
+ if (cmp(to, target.to) > 0) {
3832
+ target.to = to;
3833
+ target.r = null;
3834
+ target.d = target.l ? target.l.d + 1 : 1;
3835
+ }
3836
+ var rightWasCutOff = !target.r;
3837
+ if (left && !target.l) {
3838
+ mergeRanges(target, left);
3839
+ }
3840
+ if (right && rightWasCutOff) {
3841
+ mergeRanges(target, right);
3842
+ }
3843
+ }
3844
+ function mergeRanges(target, newSet) {
3845
+ function _addRangeSet(target, _a) {
3846
+ var from = _a.from, to = _a.to, l = _a.l, r = _a.r;
3847
+ addRange(target, from, to);
3848
+ if (l)
3849
+ _addRangeSet(target, l);
3850
+ if (r)
3851
+ _addRangeSet(target, r);
3852
+ }
3853
+ if (!isEmptyRange(newSet))
3854
+ _addRangeSet(target, newSet);
3855
+ }
3856
+ function rangesOverlap(rangeSet1, rangeSet2) {
3857
+ var i1 = getRangeSetIterator(rangeSet2);
3858
+ var nextResult1 = i1.next();
3859
+ if (nextResult1.done)
3860
+ return false;
3861
+ var a = nextResult1.value;
3862
+ var i2 = getRangeSetIterator(rangeSet1);
3863
+ var nextResult2 = i2.next(a.from);
3864
+ var b = nextResult2.value;
3865
+ while (!nextResult1.done && !nextResult2.done) {
3866
+ if (cmp(b.from, a.to) <= 0 && cmp(b.to, a.from) >= 0)
3867
+ return true;
3868
+ cmp(a.from, b.from) < 0
3869
+ ? (a = (nextResult1 = i1.next(b.from)).value)
3870
+ : (b = (nextResult2 = i2.next(a.from)).value);
3871
+ }
3872
+ return false;
3873
+ }
3874
+ function getRangeSetIterator(node) {
3875
+ var state = isEmptyRange(node) ? null : { s: 0, n: node };
3876
+ return {
3877
+ next: function (key) {
3878
+ var keyProvided = arguments.length > 0;
3879
+ while (state) {
3880
+ switch (state.s) {
3881
+ case 0:
3882
+ state.s = 1;
3883
+ if (keyProvided) {
3884
+ while (state.n.l && cmp(key, state.n.from) < 0)
3885
+ state = { up: state, n: state.n.l, s: 1 };
3886
+ }
3887
+ else {
3888
+ while (state.n.l)
3889
+ state = { up: state, n: state.n.l, s: 1 };
3890
+ }
3891
+ case 1:
3892
+ state.s = 2;
3893
+ if (!keyProvided || cmp(key, state.n.to) <= 0)
3894
+ return { value: state.n, done: false };
3895
+ case 2:
3896
+ if (state.n.r) {
3897
+ state.s = 3;
3898
+ state = { up: state, n: state.n.r, s: 0 };
3899
+ continue;
3900
+ }
3901
+ case 3:
3902
+ state = state.up;
3903
+ }
3904
+ }
3905
+ return { done: true };
3906
+ },
3907
+ };
3908
+ }
3909
+ function rebalance(target) {
3910
+ var _a, _b;
3911
+ var diff = (((_a = target.r) === null || _a === void 0 ? void 0 : _a.d) || 0) - (((_b = target.l) === null || _b === void 0 ? void 0 : _b.d) || 0);
3912
+ var r = diff > 1 ? "r" : diff < -1 ? "l" : "";
3913
+ if (r) {
3914
+ var l = r === "r" ? "l" : "r";
3915
+ var rootClone = __assign({}, target);
3916
+ var oldRootRight = target[r];
3917
+ target.from = oldRootRight.from;
3918
+ target.to = oldRootRight.to;
3919
+ target[r] = oldRootRight[r];
3920
+ rootClone[r] = oldRootRight[l];
3921
+ target[l] = rootClone;
3922
+ rootClone.d = computeDepth(rootClone);
3923
+ }
3924
+ target.d = computeDepth(target);
3925
+ }
3926
+ function computeDepth(_a) {
3927
+ var r = _a.r, l = _a.l;
3928
+ return (r ? (l ? Math.max(r.d, l.d) : r.d) : l ? l.d : 0) + 1;
3929
+ }
3930
+
3931
+ function extendObservabilitySet(target, newSet) {
3932
+ keys(newSet).forEach(function (part) {
3933
+ if (target[part])
3934
+ mergeRanges(target[part], newSet[part]);
3935
+ else
3936
+ target[part] = cloneSimpleObjectTree(newSet[part]);
3937
+ });
3938
+ return target;
3939
+ }
3940
+
3941
+ function obsSetsOverlap(os1, os2) {
3942
+ return Object.keys(os1).some(function (key) { return os2[key] && rangesOverlap(os2[key], os1[key]); });
3943
+ }
3944
+
3945
+ var cache = {};
3946
+
3947
+ var unsignaledParts = {};
3948
+ var isTaskEnqueued = false;
3949
+ function signalSubscribersLazily(part) {
3950
+ extendObservabilitySet(unsignaledParts, part);
3951
+ if (!isTaskEnqueued) {
3952
+ isTaskEnqueued = true;
3953
+ setTimeout(function () {
3954
+ isTaskEnqueued = false;
3955
+ var parts = unsignaledParts;
3956
+ unsignaledParts = {};
3957
+ signalSubscribersNow(parts);
3958
+ }, 0);
3959
+ }
3960
+ }
3961
+ function signalSubscribersNow(updatedParts, deleteAffectedCacheEntries) {
3962
+ if (deleteAffectedCacheEntries === void 0) { deleteAffectedCacheEntries = false; }
3963
+ var queriesToSignal = new Set();
3964
+ for (var key in updatedParts) {
3965
+ var parts = /^idb\:\/\/(.*)\/(.*)\//.exec(key);
3966
+ if (parts) {
3967
+ var dbName = parts[1], tableName = parts[2];
3968
+ var tblCache = cache["idb://".concat(dbName, "/").concat(tableName)];
3969
+ if (tblCache)
3970
+ signalTableSubscribersNow(tblCache, updatedParts, queriesToSignal, deleteAffectedCacheEntries);
3971
+ }
3972
+ }
3973
+ queriesToSignal.forEach(function (requery) { return requery(); });
3974
+ }
3975
+ function signalTableSubscribersNow(tblCache, updatedParts, outQueriesToSignal, deleteAffectedCacheEntries) {
3976
+ var updatedEntryLists = deleteAffectedCacheEntries && [];
3977
+ for (var _i = 0, _a = Object.entries(tblCache.queries.query); _i < _a.length; _i++) {
3978
+ var _b = _a[_i], indexName = _b[0], entries = _b[1];
3979
+ var filteredEntries = deleteAffectedCacheEntries && [];
3980
+ for (var _c = 0, entries_1 = entries; _c < entries_1.length; _c++) {
3981
+ var entry = entries_1[_c];
3982
+ if (entry.obsSet && obsSetsOverlap(updatedParts, entry.obsSet)) {
3983
+ entry.subscribers.forEach(function (requery) { return outQueriesToSignal.add(requery); });
3984
+ }
3985
+ else if (deleteAffectedCacheEntries) {
3986
+ filteredEntries.push(entry);
3987
+ }
3988
+ }
3989
+ if (deleteAffectedCacheEntries)
3990
+ updatedEntryLists.push([indexName, filteredEntries]);
3991
+ }
3992
+ if (deleteAffectedCacheEntries) {
3993
+ for (var _d = 0, updatedEntryLists_1 = updatedEntryLists; _d < updatedEntryLists_1.length; _d++) {
3994
+ var _e = updatedEntryLists_1[_d], indexName = _e[0], filteredEntries = _e[1];
3995
+ tblCache.queries.query[indexName] = filteredEntries;
3996
+ }
3997
+ }
3998
+ }
3999
+
3810
4000
  function dexieOpen(db) {
3811
4001
  var state = db._state;
3812
4002
  var indexedDB = db._deps.indexedDB;
@@ -3825,69 +4015,82 @@
3825
4015
  }
3826
4016
  var resolveDbReady = state.dbReadyResolve,
3827
4017
  upgradeTransaction = null, wasCreated = false;
3828
- return DexiePromise.race([openCanceller, (typeof navigator === 'undefined' ? DexiePromise.resolve() : idbReady()).then(function () { return new DexiePromise(function (resolve, reject) {
3829
- throwIfCancelled();
3830
- if (!indexedDB)
3831
- throw new exceptions.MissingAPI();
3832
- var dbName = db.name;
3833
- var req = state.autoSchema ?
3834
- indexedDB.open(dbName) :
3835
- indexedDB.open(dbName, Math.round(db.verno * 10));
3836
- if (!req)
3837
- throw new exceptions.MissingAPI();
3838
- req.onerror = eventRejectHandler(reject);
3839
- req.onblocked = wrap(db._fireOnBlocked);
3840
- req.onupgradeneeded = wrap(function (e) {
3841
- upgradeTransaction = req.transaction;
3842
- if (state.autoSchema && !db._options.allowEmptyDB) {
3843
- req.onerror = preventDefault;
3844
- upgradeTransaction.abort();
3845
- req.result.close();
3846
- var delreq = indexedDB.deleteDatabase(dbName);
3847
- delreq.onsuccess = delreq.onerror = wrap(function () {
3848
- reject(new exceptions.NoSuchDatabase("Database ".concat(dbName, " doesnt exist")));
3849
- });
3850
- }
3851
- else {
3852
- upgradeTransaction.onerror = eventRejectHandler(reject);
3853
- var oldVer = e.oldVersion > Math.pow(2, 62) ? 0 : e.oldVersion;
3854
- wasCreated = oldVer < 1;
3855
- db._novip.idbdb = req.result;
3856
- runUpgraders(db, oldVer / 10, upgradeTransaction, reject);
3857
- }
3858
- }, reject);
3859
- req.onsuccess = wrap(function () {
3860
- upgradeTransaction = null;
3861
- var idbdb = db._novip.idbdb = req.result;
3862
- var objectStoreNames = slice(idbdb.objectStoreNames);
3863
- if (objectStoreNames.length > 0)
3864
- try {
3865
- var tmpTrans = idbdb.transaction(safariMultiStoreFix(objectStoreNames), 'readonly');
3866
- if (state.autoSchema)
3867
- readGlobalSchema(db, idbdb, tmpTrans);
3868
- else {
3869
- adjustToExistingIndexNames(db, db._dbSchema, tmpTrans);
3870
- if (!verifyInstalledSchema(db, tmpTrans)) {
3871
- console.warn("Dexie SchemaDiff: Schema was extended without increasing the number passed to db.version(). Some queries may fail.");
3872
- }
4018
+ var tryOpenDB = function () { return new DexiePromise(function (resolve, reject) {
4019
+ throwIfCancelled();
4020
+ if (!indexedDB)
4021
+ throw new exceptions.MissingAPI();
4022
+ var dbName = db.name;
4023
+ var req = state.autoSchema ?
4024
+ indexedDB.open(dbName) :
4025
+ indexedDB.open(dbName, Math.round(db.verno * 10));
4026
+ if (!req)
4027
+ throw new exceptions.MissingAPI();
4028
+ req.onerror = eventRejectHandler(reject);
4029
+ req.onblocked = wrap(db._fireOnBlocked);
4030
+ req.onupgradeneeded = wrap(function (e) {
4031
+ upgradeTransaction = req.transaction;
4032
+ if (state.autoSchema && !db._options.allowEmptyDB) {
4033
+ req.onerror = preventDefault;
4034
+ upgradeTransaction.abort();
4035
+ req.result.close();
4036
+ var delreq = indexedDB.deleteDatabase(dbName);
4037
+ delreq.onsuccess = delreq.onerror = wrap(function () {
4038
+ reject(new exceptions.NoSuchDatabase("Database ".concat(dbName, " doesnt exist")));
4039
+ });
4040
+ }
4041
+ else {
4042
+ upgradeTransaction.onerror = eventRejectHandler(reject);
4043
+ var oldVer = e.oldVersion > Math.pow(2, 62) ? 0 : e.oldVersion;
4044
+ wasCreated = oldVer < 1;
4045
+ db.idbdb = req.result;
4046
+ runUpgraders(db, oldVer / 10, upgradeTransaction, reject);
4047
+ }
4048
+ }, reject);
4049
+ req.onsuccess = wrap(function () {
4050
+ upgradeTransaction = null;
4051
+ var idbdb = db.idbdb = req.result;
4052
+ var objectStoreNames = slice(idbdb.objectStoreNames);
4053
+ if (objectStoreNames.length > 0)
4054
+ try {
4055
+ var tmpTrans = idbdb.transaction(safariMultiStoreFix(objectStoreNames), 'readonly');
4056
+ if (state.autoSchema)
4057
+ readGlobalSchema(db, idbdb, tmpTrans);
4058
+ else {
4059
+ adjustToExistingIndexNames(db, db._dbSchema, tmpTrans);
4060
+ if (!verifyInstalledSchema(db, tmpTrans)) {
4061
+ console.warn("Dexie SchemaDiff: Schema was extended without increasing the number passed to db.version(). Some queries may fail.");
3873
4062
  }
3874
- generateMiddlewareStacks(db, tmpTrans);
3875
4063
  }
3876
- catch (e) {
3877
- }
3878
- connections.push(db);
3879
- idbdb.onversionchange = wrap(function (ev) {
3880
- state.vcFired = true;
3881
- db.on("versionchange").fire(ev);
3882
- });
3883
- idbdb.onclose = wrap(function (ev) {
3884
- db.on("close").fire(ev);
3885
- });
3886
- if (wasCreated)
3887
- _onDatabaseCreated(db._deps, dbName);
3888
- resolve();
3889
- }, reject);
3890
- }); })]).then(function () {
4064
+ generateMiddlewareStacks(db, tmpTrans);
4065
+ }
4066
+ catch (e) {
4067
+ }
4068
+ connections.push(db);
4069
+ idbdb.onversionchange = wrap(function (ev) {
4070
+ state.vcFired = true;
4071
+ db.on("versionchange").fire(ev);
4072
+ });
4073
+ idbdb.onclose = wrap(function (ev) {
4074
+ db.on("close").fire(ev);
4075
+ });
4076
+ if (wasCreated)
4077
+ _onDatabaseCreated(db._deps, dbName);
4078
+ resolve();
4079
+ }, reject);
4080
+ }).catch(function (err) {
4081
+ if (err && err.name === 'UnknownError' && state.PR1398_maxLoop > 0) {
4082
+ state.PR1398_maxLoop--;
4083
+ console.warn('Dexie: Workaround for Chrome UnknownError on open()');
4084
+ return tryOpenDB();
4085
+ }
4086
+ else {
4087
+ return DexiePromise.reject(err);
4088
+ }
4089
+ }); };
4090
+ return DexiePromise.race([
4091
+ openCanceller,
4092
+ (typeof navigator === 'undefined' ? DexiePromise.resolve() : idbReady()).then(tryOpenDB)
4093
+ ]).then(function () {
3891
4094
  throwIfCancelled();
3892
4095
  state.onReadyBeingFired = [];
3893
4096
  return DexiePromise.resolve(vip(function () { return db.on.ready.fire(db.vip); })).then(function fireRemainders() {
@@ -3898,10 +4101,10 @@
3898
4101
  }
3899
4102
  });
3900
4103
  }).finally(function () {
3901
- state.onReadyBeingFired = null;
3902
- state.isBeingOpened = false;
3903
- }).then(function () {
3904
- return db;
4104
+ if (state.openCanceller === openCanceller) {
4105
+ state.onReadyBeingFired = null;
4106
+ state.isBeingOpened = false;
4107
+ }
3905
4108
  }).catch(function (err) {
3906
4109
  state.dbOpenError = err;
3907
4110
  try {
@@ -3915,6 +4118,20 @@
3915
4118
  }).finally(function () {
3916
4119
  state.openComplete = true;
3917
4120
  resolveDbReady();
4121
+ }).then(function () {
4122
+ if (wasCreated) {
4123
+ var everything_1 = {};
4124
+ db.tables.forEach(function (table) {
4125
+ table.schema.indexes.forEach(function (idx) {
4126
+ if (idx.name)
4127
+ everything_1["idb://".concat(db.name, "/").concat(table.name, "/").concat(idx.name)] = new RangeSet(-Infinity, [[[]]]);
4128
+ });
4129
+ everything_1["idb://".concat(db.name, "/").concat(table.name, "/")] = everything_1["idb://".concat(db.name, "/").concat(table.name, "/:dels")] = new RangeSet(-Infinity, [[[]]]);
4130
+ });
4131
+ globalEvents(DEXIE_STORAGE_MUTATED_EVENT_NAME).fire(everything_1);
4132
+ signalSubscribersNow(everything_1, true);
4133
+ }
4134
+ return db;
3918
4135
  });
3919
4136
  }
3920
4137
 
@@ -3947,6 +4164,7 @@
3947
4164
  return DexiePromise.resolve().then(function () {
3948
4165
  var transless = PSD.transless || PSD;
3949
4166
  var trans = db._createTransaction(mode, storeNames, db._dbSchema, parentTransaction);
4167
+ trans.explicit = true;
3950
4168
  var zoneProps = {
3951
4169
  trans: trans,
3952
4170
  transless: transless
@@ -4017,7 +4235,9 @@
4017
4235
  var indexList = (indexLookup[keyPathAlias] = indexLookup[keyPathAlias] || []);
4018
4236
  var keyLength = keyPath == null ? 0 : typeof keyPath === 'string' ? 1 : keyPath.length;
4019
4237
  var isVirtual = keyTail > 0;
4020
- var virtualIndex = __assign(__assign({}, lowLevelIndex), { isVirtual: isVirtual, keyTail: keyTail, keyLength: keyLength, extractKey: getKeyExtractor(keyPath), unique: !isVirtual && lowLevelIndex.unique });
4238
+ var virtualIndex = __assign(__assign({}, lowLevelIndex), { name: isVirtual
4239
+ ? "".concat(keyPathAlias, "(virtual-from:").concat(lowLevelIndex.name, ")")
4240
+ : lowLevelIndex.name, lowLevelIndex: lowLevelIndex, isVirtual: isVirtual, keyTail: keyTail, keyLength: keyLength, extractKey: getKeyExtractor(keyPath), unique: !isVirtual && lowLevelIndex.unique });
4021
4241
  indexList.push(virtualIndex);
4022
4242
  if (!virtualIndex.isPrimaryKey) {
4023
4243
  allVirtualIndexes.push(virtualIndex);
@@ -4055,7 +4275,7 @@
4055
4275
  function translateRequest(req) {
4056
4276
  var index = req.query.index;
4057
4277
  return index.isVirtual ? __assign(__assign({}, req), { query: {
4058
- index: index,
4278
+ index: index.lowLevelIndex,
4059
4279
  range: translateRange(req.query.range, index.keyTail)
4060
4280
  } }) : req;
4061
4281
  }
@@ -4334,182 +4554,49 @@
4334
4554
  },
4335
4555
  };
4336
4556
 
4337
- var _a;
4338
- function isEmptyRange(node) {
4339
- return !("from" in node);
4340
- }
4341
- var RangeSet = function (fromOrTree, to) {
4342
- if (this) {
4343
- extend(this, arguments.length ? { d: 1, from: fromOrTree, to: arguments.length > 1 ? to : fromOrTree } : { d: 0 });
4344
- }
4345
- else {
4346
- var rv = new RangeSet();
4347
- if (fromOrTree && ("d" in fromOrTree)) {
4348
- extend(rv, fromOrTree);
4349
- }
4350
- return rv;
4351
- }
4352
- };
4353
- props(RangeSet.prototype, (_a = {
4354
- add: function (rangeSet) {
4355
- mergeRanges(this, rangeSet);
4356
- return this;
4357
- },
4358
- addKey: function (key) {
4359
- addRange(this, key, key);
4360
- return this;
4361
- },
4362
- addKeys: function (keys) {
4363
- var _this = this;
4364
- keys.forEach(function (key) { return addRange(_this, key, key); });
4365
- return this;
4366
- }
4367
- },
4368
- _a[iteratorSymbol] = function () {
4369
- return getRangeSetIterator(this);
4370
- },
4371
- _a));
4372
- function addRange(target, from, to) {
4373
- var diff = cmp(from, to);
4374
- if (isNaN(diff))
4375
- return;
4376
- if (diff > 0)
4377
- throw RangeError();
4378
- if (isEmptyRange(target))
4379
- return extend(target, { from: from, to: to, d: 1 });
4380
- var left = target.l;
4381
- var right = target.r;
4382
- if (cmp(to, target.from) < 0) {
4383
- left
4384
- ? addRange(left, from, to)
4385
- : (target.l = { from: from, to: to, d: 1, l: null, r: null });
4386
- return rebalance(target);
4387
- }
4388
- if (cmp(from, target.to) > 0) {
4389
- right
4390
- ? addRange(right, from, to)
4391
- : (target.r = { from: from, to: to, d: 1, l: null, r: null });
4392
- return rebalance(target);
4393
- }
4394
- if (cmp(from, target.from) < 0) {
4395
- target.from = from;
4396
- target.l = null;
4397
- target.d = right ? right.d + 1 : 1;
4398
- }
4399
- if (cmp(to, target.to) > 0) {
4400
- target.to = to;
4401
- target.r = null;
4402
- target.d = target.l ? target.l.d + 1 : 1;
4403
- }
4404
- var rightWasCutOff = !target.r;
4405
- if (left && !target.l) {
4406
- mergeRanges(target, left);
4407
- }
4408
- if (right && rightWasCutOff) {
4409
- mergeRanges(target, right);
4410
- }
4557
+ function isCachableContext(ctx, table) {
4558
+ return (ctx.trans.mode === 'readonly' &&
4559
+ !!ctx.subscr &&
4560
+ !ctx.trans.explicit &&
4561
+ ctx.trans.db._options.cache !== 'disabled' &&
4562
+ !table.schema.primaryKey.outbound);
4411
4563
  }
4412
- function mergeRanges(target, newSet) {
4413
- function _addRangeSet(target, _a) {
4414
- var from = _a.from, to = _a.to, l = _a.l, r = _a.r;
4415
- addRange(target, from, to);
4416
- if (l)
4417
- _addRangeSet(target, l);
4418
- if (r)
4419
- _addRangeSet(target, r);
4420
- }
4421
- if (!isEmptyRange(newSet))
4422
- _addRangeSet(target, newSet);
4423
- }
4424
- function rangesOverlap(rangeSet1, rangeSet2) {
4425
- var i1 = getRangeSetIterator(rangeSet2);
4426
- var nextResult1 = i1.next();
4427
- if (nextResult1.done)
4428
- return false;
4429
- var a = nextResult1.value;
4430
- var i2 = getRangeSetIterator(rangeSet1);
4431
- var nextResult2 = i2.next(a.from);
4432
- var b = nextResult2.value;
4433
- while (!nextResult1.done && !nextResult2.done) {
4434
- if (cmp(b.from, a.to) <= 0 && cmp(b.to, a.from) >= 0)
4435
- return true;
4436
- cmp(a.from, b.from) < 0
4437
- ? (a = (nextResult1 = i1.next(b.from)).value)
4438
- : (b = (nextResult2 = i2.next(a.from)).value);
4439
- }
4440
- return false;
4441
- }
4442
- function getRangeSetIterator(node) {
4443
- var state = isEmptyRange(node) ? null : { s: 0, n: node };
4444
- return {
4445
- next: function (key) {
4446
- var keyProvided = arguments.length > 0;
4447
- while (state) {
4448
- switch (state.s) {
4449
- case 0:
4450
- state.s = 1;
4451
- if (keyProvided) {
4452
- while (state.n.l && cmp(key, state.n.from) < 0)
4453
- state = { up: state, n: state.n.l, s: 1 };
4454
- }
4455
- else {
4456
- while (state.n.l)
4457
- state = { up: state, n: state.n.l, s: 1 };
4458
- }
4459
- case 1:
4460
- state.s = 2;
4461
- if (!keyProvided || cmp(key, state.n.to) <= 0)
4462
- return { value: state.n, done: false };
4463
- case 2:
4464
- if (state.n.r) {
4465
- state.s = 3;
4466
- state = { up: state, n: state.n.r, s: 0 };
4467
- continue;
4468
- }
4469
- case 3:
4470
- state = state.up;
4471
- }
4472
- }
4473
- return { done: true };
4474
- },
4475
- };
4476
- }
4477
- function rebalance(target) {
4478
- var _a, _b;
4479
- var diff = (((_a = target.r) === null || _a === void 0 ? void 0 : _a.d) || 0) - (((_b = target.l) === null || _b === void 0 ? void 0 : _b.d) || 0);
4480
- var r = diff > 1 ? "r" : diff < -1 ? "l" : "";
4481
- if (r) {
4482
- var l = r === "r" ? "l" : "r";
4483
- var rootClone = __assign({}, target);
4484
- var oldRootRight = target[r];
4485
- target.from = oldRootRight.from;
4486
- target.to = oldRootRight.to;
4487
- target[r] = oldRootRight[r];
4488
- rootClone[r] = oldRootRight[l];
4489
- target[l] = rootClone;
4490
- rootClone.d = computeDepth(rootClone);
4564
+
4565
+ function isCachableRequest(type, req) {
4566
+ switch (type) {
4567
+ case 'query':
4568
+ return req.values && !req.unique;
4569
+ case 'get':
4570
+ return false;
4571
+ case 'getMany':
4572
+ return false;
4573
+ case 'count':
4574
+ return false;
4575
+ case 'openCursor':
4576
+ return false;
4491
4577
  }
4492
- target.d = computeDepth(target);
4493
- }
4494
- function computeDepth(_a) {
4495
- var r = _a.r, l = _a.l;
4496
- return (r ? (l ? Math.max(r.d, l.d) : r.d) : l ? l.d : 0) + 1;
4497
4578
  }
4498
4579
 
4499
4580
  var observabilityMiddleware = {
4500
4581
  stack: "dbcore",
4501
4582
  level: 0,
4583
+ name: "Observability",
4502
4584
  create: function (core) {
4503
4585
  var dbName = core.schema.name;
4504
4586
  var FULL_RANGE = new RangeSet(core.MIN_KEY, core.MAX_KEY);
4505
- return __assign(__assign({}, core), { table: function (tableName) {
4587
+ return __assign(__assign({}, core), { transaction: function (stores, mode, options) {
4588
+ if (PSD.subscr && mode !== 'readonly') {
4589
+ throw new exceptions.ReadOnly("Readwrite transaction in liveQuery context. Querier source: ".concat(PSD.querier));
4590
+ }
4591
+ return core.transaction(stores, mode, options);
4592
+ }, table: function (tableName) {
4506
4593
  var table = core.table(tableName);
4507
4594
  var schema = table.schema;
4508
4595
  var primaryKey = schema.primaryKey;
4509
4596
  var extractKey = primaryKey.extractKey, outbound = primaryKey.outbound;
4510
4597
  var tableClone = __assign(__assign({}, table), { mutate: function (req) {
4511
4598
  var trans = req.trans;
4512
- var mutatedParts = trans.mutatedParts || (trans.mutatedParts = {});
4599
+ var mutatedParts = req.mutatedParts || (req.mutatedParts = {});
4513
4600
  var getRangeSet = function (indexName) {
4514
4601
  var part = "idb://".concat(dbName, "/").concat(tableName, "/").concat(indexName);
4515
4602
  return (mutatedParts[part] ||
@@ -4523,32 +4610,34 @@
4523
4610
  : req.type === "delete"
4524
4611
  ? [req.keys]
4525
4612
  : req.values.length < 50
4526
- ? [[], req.values]
4613
+ ? [getEffectiveKeys(primaryKey, req).filter(function (id) { return id; }), req.values]
4527
4614
  : [], keys = _a[0], newObjs = _a[1];
4528
4615
  var oldCache = req.trans["_cache"];
4529
- return table.mutate(req).then(function (res) {
4530
- if (isArray(keys)) {
4531
- if (type !== "delete")
4532
- keys = res.results;
4533
- pkRangeSet.addKeys(keys);
4534
- var oldObjs = getFromTransactionCache(keys, oldCache);
4535
- if (!oldObjs && type !== "add") {
4536
- delsRangeSet.addKeys(keys);
4537
- }
4538
- if (oldObjs || newObjs) {
4539
- trackAffectedIndexes(getRangeSet, schema, oldObjs, newObjs);
4540
- }
4616
+ if (isArray(keys)) {
4617
+ pkRangeSet.addKeys(keys);
4618
+ var oldObjs = type === 'delete' || keys.length === newObjs.length ? getFromTransactionCache(keys, oldCache) : null;
4619
+ if (!oldObjs && type !== "add") {
4620
+ delsRangeSet.addKeys(keys);
4541
4621
  }
4542
- else if (keys) {
4543
- var range = { from: keys.lower, to: keys.upper };
4544
- delsRangeSet.add(range);
4545
- pkRangeSet.add(range);
4622
+ if (oldObjs || newObjs) {
4623
+ trackAffectedIndexes(getRangeSet, schema, oldObjs, newObjs);
4546
4624
  }
4547
- else {
4548
- pkRangeSet.add(FULL_RANGE);
4549
- delsRangeSet.add(FULL_RANGE);
4550
- schema.indexes.forEach(function (idx) { return getRangeSet(idx.name).add(FULL_RANGE); });
4625
+ }
4626
+ else if (keys) {
4627
+ var range = { from: keys.lower, to: keys.upper };
4628
+ delsRangeSet.add(range);
4629
+ pkRangeSet.add(range);
4630
+ }
4631
+ else {
4632
+ pkRangeSet.add(FULL_RANGE);
4633
+ delsRangeSet.add(FULL_RANGE);
4634
+ schema.indexes.forEach(function (idx) { return getRangeSet(idx.name).add(FULL_RANGE); });
4635
+ }
4636
+ return table.mutate(req).then(function (res) {
4637
+ if (keys && (req.type === 'add' || req.type === 'put')) {
4638
+ pkRangeSet.addKeys(res.results);
4551
4639
  }
4640
+ trans.mutatedParts = extendObservabilitySet(trans.mutatedParts || {}, mutatedParts);
4552
4641
  return res;
4553
4642
  });
4554
4643
  } });
@@ -4570,11 +4659,16 @@
4570
4659
  keys(readSubscribers).forEach(function (method) {
4571
4660
  tableClone[method] = function (req) {
4572
4661
  var subscr = PSD.subscr;
4573
- if (subscr) {
4662
+ var isLiveQuery = !!subscr;
4663
+ var cachable = isCachableContext(PSD, table) && isCachableRequest(method, req);
4664
+ var obsSet = cachable
4665
+ ? req.obsSet = {}
4666
+ : subscr;
4667
+ if (isLiveQuery) {
4574
4668
  var getRangeSet = function (indexName) {
4575
4669
  var part = "idb://".concat(dbName, "/").concat(tableName, "/").concat(indexName);
4576
- return (subscr[part] ||
4577
- (subscr[part] = new RangeSet()));
4670
+ return (obsSet[part] ||
4671
+ (obsSet[part] = new RangeSet()));
4578
4672
  };
4579
4673
  var pkRangeSet_1 = getRangeSet("");
4580
4674
  var delsRangeSet_1 = getRangeSet(":dels");
@@ -4669,6 +4763,409 @@
4669
4763
  schema.indexes.forEach(addAffectedIndex);
4670
4764
  }
4671
4765
 
4766
+ function adjustOptimisticFromFailures(tblCache, req, res) {
4767
+ if (res.numFailures === 0)
4768
+ return req;
4769
+ if (req.type === 'deleteRange') {
4770
+ return null;
4771
+ }
4772
+ var numBulkOps = req.keys
4773
+ ? req.keys.length
4774
+ : 'values' in req && req.values
4775
+ ? req.values.length
4776
+ : 1;
4777
+ if (res.numFailures === numBulkOps) {
4778
+ return null;
4779
+ }
4780
+ var clone = __assign({}, req);
4781
+ if (isArray(clone.keys)) {
4782
+ clone.keys = clone.keys.filter(function (_, i) { return !(i in res.failures); });
4783
+ }
4784
+ if ('values' in clone && isArray(clone.values)) {
4785
+ clone.values = clone.values.filter(function (_, i) { return !(i in res.failures); });
4786
+ }
4787
+ return clone;
4788
+ }
4789
+
4790
+ function isAboveLower(key, range) {
4791
+ return range.lower === undefined
4792
+ ? true
4793
+ : range.lowerOpen
4794
+ ? cmp(key, range.lower) > 0
4795
+ : cmp(key, range.lower) >= 0;
4796
+ }
4797
+ function isBelowUpper(key, range) {
4798
+ return range.upper === undefined
4799
+ ? true
4800
+ : range.upperOpen
4801
+ ? cmp(key, range.upper) < 0
4802
+ : cmp(key, range.upper) <= 0;
4803
+ }
4804
+ function isWithinRange(key, range) {
4805
+ return isAboveLower(key, range) && isBelowUpper(key, range);
4806
+ }
4807
+
4808
+ function applyOptimisticOps(result, req, ops, table, cacheEntry, immutable) {
4809
+ if (!ops || ops.length === 0)
4810
+ return result;
4811
+ var index = req.query.index;
4812
+ var primaryKey = table.schema.primaryKey;
4813
+ var extractPrimKey = primaryKey.extractKey;
4814
+ var extractIndex = index.extractKey;
4815
+ var extractLowLevelIndex = (index.lowLevelIndex || index).extractKey;
4816
+ var finalResult = ops.reduce(function (result, op) {
4817
+ var modifedResult = result;
4818
+ var includedValues = op.type === 'add' || op.type === 'put'
4819
+ ? op.values.filter(function (v) {
4820
+ return isWithinRange(extractIndex(v), req.query.range);
4821
+ }).map(function (v) {
4822
+ v = deepClone(v);
4823
+ if (immutable)
4824
+ Object.freeze(v);
4825
+ return v;
4826
+ })
4827
+ : [];
4828
+ switch (op.type) {
4829
+ case 'add':
4830
+ modifedResult = result.concat(req.values
4831
+ ? includedValues
4832
+ : includedValues.map(function (v) { return extractPrimKey(v); }));
4833
+ break;
4834
+ case 'put':
4835
+ var keySet_1 = new RangeSet().addKeys(op.values.map(function (v) { return extractPrimKey(v); }));
4836
+ modifedResult = result
4837
+ .filter(function (item) {
4838
+ var key = req.values ? extractPrimKey(item) : item;
4839
+ return !rangesOverlap(new RangeSet(key), keySet_1);
4840
+ })
4841
+ .concat(req.values
4842
+ ? includedValues
4843
+ : includedValues.map(function (v) { return extractPrimKey(v); }));
4844
+ break;
4845
+ case 'delete':
4846
+ var keysToDelete_1 = new RangeSet().addKeys(op.keys);
4847
+ modifedResult = result.filter(function (item) {
4848
+ var key = req.values ? extractPrimKey(item) : item;
4849
+ return !rangesOverlap(new RangeSet(key), keysToDelete_1);
4850
+ });
4851
+ break;
4852
+ case 'deleteRange':
4853
+ var range_1 = op.range;
4854
+ modifedResult = result.filter(function (item) { return !isWithinRange(extractPrimKey(item), range_1); });
4855
+ break;
4856
+ }
4857
+ return modifedResult;
4858
+ }, result);
4859
+ if (finalResult === result)
4860
+ return result;
4861
+ finalResult.sort(function (a, b) {
4862
+ return cmp(extractLowLevelIndex(a), extractLowLevelIndex(b)) ||
4863
+ cmp(extractPrimKey(a), extractPrimKey(b));
4864
+ });
4865
+ if (req.limit && req.limit < Infinity) {
4866
+ if (finalResult.length > req.limit) {
4867
+ finalResult.length = req.limit;
4868
+ }
4869
+ else if (result.length === req.limit && finalResult.length < req.limit) {
4870
+ cacheEntry.dirty = true;
4871
+ }
4872
+ }
4873
+ return immutable ? Object.freeze(finalResult) : finalResult;
4874
+ }
4875
+
4876
+ function areRangesEqual(r1, r2) {
4877
+ return (cmp(r1.lower, r2.lower) === 0 &&
4878
+ cmp(r1.upper, r2.upper) === 0 &&
4879
+ !!r1.lowerOpen === !!r2.lowerOpen &&
4880
+ !!r1.upperOpen === !!r2.upperOpen);
4881
+ }
4882
+
4883
+ function compareLowers(lower1, lower2, lowerOpen1, lowerOpen2) {
4884
+ if (lower1 === undefined)
4885
+ return lower2 !== undefined ? -1 : 0;
4886
+ if (lower2 === undefined)
4887
+ return 1;
4888
+ var c = cmp(lower1, lower2);
4889
+ if (c === 0) {
4890
+ if (lowerOpen1 && lowerOpen2)
4891
+ return 0;
4892
+ if (lowerOpen1)
4893
+ return 1;
4894
+ if (lowerOpen2)
4895
+ return -1;
4896
+ }
4897
+ return c;
4898
+ }
4899
+ function compareUppers(upper1, upper2, upperOpen1, upperOpen2) {
4900
+ if (upper1 === undefined)
4901
+ return upper2 !== undefined ? 1 : 0;
4902
+ if (upper2 === undefined)
4903
+ return -1;
4904
+ var c = cmp(upper1, upper2);
4905
+ if (c === 0) {
4906
+ if (upperOpen1 && upperOpen2)
4907
+ return 0;
4908
+ if (upperOpen1)
4909
+ return -1;
4910
+ if (upperOpen2)
4911
+ return 1;
4912
+ }
4913
+ return c;
4914
+ }
4915
+ function isSuperRange(r1, r2) {
4916
+ return (compareLowers(r1.lower, r2.lower, r1.lowerOpen, r2.lowerOpen) <= 0 &&
4917
+ compareUppers(r1.upper, r2.upper, r1.upperOpen, r2.upperOpen) >= 0);
4918
+ }
4919
+
4920
+ function findCompatibleQuery(dbName, tableName, type, req) {
4921
+ var tblCache = cache["idb://".concat(dbName, "/").concat(tableName)];
4922
+ if (!tblCache)
4923
+ return [];
4924
+ var queries = tblCache.queries[type];
4925
+ if (!queries)
4926
+ return [null, false, tblCache, null];
4927
+ var indexName = req.query ? req.query.index.name : null;
4928
+ var entries = queries[indexName || ''];
4929
+ if (!entries)
4930
+ return [null, false, tblCache, null];
4931
+ switch (type) {
4932
+ case 'query':
4933
+ var equalEntry = entries.find(function (entry) {
4934
+ return entry.req.limit === req.limit &&
4935
+ entry.req.values === req.values &&
4936
+ areRangesEqual(entry.req.query.range, req.query.range);
4937
+ });
4938
+ if (equalEntry)
4939
+ return [
4940
+ equalEntry,
4941
+ true,
4942
+ tblCache,
4943
+ entries,
4944
+ ];
4945
+ var superEntry = entries.find(function (entry) {
4946
+ var limit = 'limit' in entry.req ? entry.req.limit : Infinity;
4947
+ return (limit >= req.limit &&
4948
+ (req.values ? entry.req.values : true) &&
4949
+ isSuperRange(entry.req.query.range, req.query.range));
4950
+ });
4951
+ return [superEntry, false, tblCache, entries];
4952
+ case 'count':
4953
+ var countQuery = entries.find(function (entry) {
4954
+ return areRangesEqual(entry.req.query.range, req.query.range);
4955
+ });
4956
+ return [countQuery, !!countQuery, tblCache, entries];
4957
+ }
4958
+ }
4959
+
4960
+ function subscribeToCacheEntry(cacheEntry, container, requery, signal) {
4961
+ cacheEntry.subscribers.add(requery);
4962
+ signal.addEventListener("abort", function () {
4963
+ cacheEntry.subscribers.delete(requery);
4964
+ if (cacheEntry.subscribers.size === 0) {
4965
+ enqueForDeletion(cacheEntry, container);
4966
+ }
4967
+ });
4968
+ }
4969
+ function enqueForDeletion(cacheEntry, container) {
4970
+ setTimeout(function () {
4971
+ if (cacheEntry.subscribers.size === 0) {
4972
+ delArrayItem(container, cacheEntry);
4973
+ }
4974
+ }, 3000);
4975
+ }
4976
+
4977
+ var cacheMiddleware = {
4978
+ stack: 'dbcore',
4979
+ level: 0,
4980
+ name: 'Cache',
4981
+ create: function (core) {
4982
+ var dbName = core.schema.name;
4983
+ var coreMW = __assign(__assign({}, core), { transaction: function (stores, mode, options) {
4984
+ var idbtrans = core.transaction(stores, mode, options);
4985
+ if (mode === 'readwrite') {
4986
+ var ac_1 = new AbortController();
4987
+ var signal = ac_1.signal;
4988
+ var endTransaction = function (wasCommitted) { return function () {
4989
+ ac_1.abort();
4990
+ if (mode === 'readwrite') {
4991
+ var affectedSubscribers_1 = new Set();
4992
+ for (var _i = 0, stores_1 = stores; _i < stores_1.length; _i++) {
4993
+ var storeName = stores_1[_i];
4994
+ var tblCache = cache["idb://".concat(dbName, "/").concat(storeName)];
4995
+ var table = core.table(storeName);
4996
+ if (tblCache) {
4997
+ var ops = tblCache.optimisticOps.filter(function (op) { return op.trans === idbtrans; });
4998
+ if (ops.length > 0) {
4999
+ tblCache.optimisticOps = tblCache.optimisticOps.filter(function (op) { return op.trans !== idbtrans; });
5000
+ for (var _a = 0, _b = Object.values(tblCache.queries.query); _a < _b.length; _a++) {
5001
+ var entries = _b[_a];
5002
+ for (var _c = 0, _d = entries.slice(); _c < _d.length; _c++) {
5003
+ var entry = _d[_c];
5004
+ if (entry.res != null &&
5005
+ idbtrans.mutatedParts
5006
+ ) {
5007
+ if (wasCommitted && !entry.dirty) {
5008
+ var freezeResults = Object.isFrozen(entry.res);
5009
+ var modRes = applyOptimisticOps(entry.res, entry.req, ops, table, entry, freezeResults);
5010
+ if (entry.dirty) {
5011
+ delArrayItem(entries, entry);
5012
+ entry.subscribers.forEach(function (requery) { return affectedSubscribers_1.add(requery); });
5013
+ }
5014
+ else if (modRes !== entry.res) {
5015
+ entry.res = modRes;
5016
+ entry.promise = DexiePromise.resolve({ result: modRes });
5017
+ }
5018
+ }
5019
+ else {
5020
+ if (entry.dirty) {
5021
+ delArrayItem(entries, entry);
5022
+ }
5023
+ entry.subscribers.forEach(function (requery) { return affectedSubscribers_1.add(requery); });
5024
+ }
5025
+ }
5026
+ }
5027
+ }
5028
+ }
5029
+ }
5030
+ }
5031
+ affectedSubscribers_1.forEach(function (requery) { return requery(); });
5032
+ }
5033
+ }; };
5034
+ idbtrans.addEventListener('abort', endTransaction(false), {
5035
+ signal: signal,
5036
+ });
5037
+ idbtrans.addEventListener('error', endTransaction(false), {
5038
+ signal: signal,
5039
+ });
5040
+ idbtrans.addEventListener('complete', endTransaction(true), {
5041
+ signal: signal,
5042
+ });
5043
+ }
5044
+ return idbtrans;
5045
+ }, table: function (tableName) {
5046
+ var downTable = core.table(tableName);
5047
+ var primKey = downTable.schema.primaryKey;
5048
+ var tableMW = __assign(__assign({}, downTable), { mutate: function (req) {
5049
+ if (primKey.outbound ||
5050
+ PSD.trans.db._options.cache === 'disabled'
5051
+ ) {
5052
+ return downTable.mutate(req);
5053
+ }
5054
+ var tblCache = cache["idb://".concat(dbName, "/").concat(tableName)];
5055
+ if (!tblCache)
5056
+ return downTable.mutate(req);
5057
+ var promise = downTable.mutate(req);
5058
+ if ((req.type === 'add' || req.type === 'put') && (req.values.length >= 50 || getEffectiveKeys(primKey, req).some(function (key) { return key == null; }))) {
5059
+ promise.then(function (res) {
5060
+ var reqWithResolvedKeys = __assign(__assign({}, req), { values: req.values.map(function (value, i) {
5061
+ var valueWithKey = primKey.keyPath.includes('.')
5062
+ ? deepClone(value)
5063
+ : __assign({}, value);
5064
+ setByKeyPath(valueWithKey, primKey.keyPath, res.results[i]);
5065
+ return valueWithKey;
5066
+ }) });
5067
+ var adjustedReq = adjustOptimisticFromFailures(tblCache, reqWithResolvedKeys, res);
5068
+ tblCache.optimisticOps.push(adjustedReq);
5069
+ queueMicrotask(function () { return signalSubscribersLazily(req.mutatedParts); });
5070
+ });
5071
+ }
5072
+ else {
5073
+ tblCache.optimisticOps.push(req);
5074
+ signalSubscribersLazily(req.mutatedParts);
5075
+ promise.then(function (res) {
5076
+ if (res.numFailures > 0) {
5077
+ delArrayItem(tblCache.optimisticOps, req);
5078
+ var adjustedReq = adjustOptimisticFromFailures(tblCache, req, res);
5079
+ if (adjustedReq) {
5080
+ tblCache.optimisticOps.push(adjustedReq);
5081
+ }
5082
+ signalSubscribersLazily(req.mutatedParts);
5083
+ }
5084
+ });
5085
+ promise.catch(function () {
5086
+ delArrayItem(tblCache.optimisticOps, req);
5087
+ signalSubscribersLazily(req.mutatedParts);
5088
+ });
5089
+ }
5090
+ return promise;
5091
+ }, query: function (req) {
5092
+ if (!isCachableContext(PSD, downTable) || !isCachableRequest("query", req))
5093
+ return downTable.query(req);
5094
+ var freezeResults = PSD.trans.db._options.cache === 'immutable';
5095
+ var _a = PSD, requery = _a.requery, signal = _a.signal;
5096
+ var _b = findCompatibleQuery(dbName, tableName, 'query', req), cacheEntry = _b[0], exactMatch = _b[1], tblCache = _b[2], container = _b[3];
5097
+ if (cacheEntry && exactMatch) {
5098
+ cacheEntry.obsSet = req.obsSet;
5099
+ }
5100
+ else {
5101
+ var promise = downTable.query(req).then(function (res) {
5102
+ var result = res.result;
5103
+ cacheEntry.res = result;
5104
+ if (freezeResults) {
5105
+ for (var i = 0, l = result.length; i < l; ++i) {
5106
+ Object.freeze(result[i]);
5107
+ }
5108
+ Object.freeze(result);
5109
+ }
5110
+ else {
5111
+ res.result = deepClone(result);
5112
+ }
5113
+ return res;
5114
+ }).catch(function (error) {
5115
+ if (container && cacheEntry)
5116
+ delArrayItem(container, cacheEntry);
5117
+ return Promise.reject(error);
5118
+ });
5119
+ cacheEntry = {
5120
+ obsSet: req.obsSet,
5121
+ promise: promise,
5122
+ subscribers: new Set(),
5123
+ type: 'query',
5124
+ req: req,
5125
+ dirty: false,
5126
+ };
5127
+ if (container) {
5128
+ container.push(cacheEntry);
5129
+ }
5130
+ else {
5131
+ container = [cacheEntry];
5132
+ if (!tblCache) {
5133
+ tblCache = cache["idb://".concat(dbName, "/").concat(tableName)] = {
5134
+ queries: {
5135
+ query: {},
5136
+ count: {},
5137
+ },
5138
+ objs: new Map(),
5139
+ optimisticOps: [],
5140
+ unsignaledParts: {}
5141
+ };
5142
+ }
5143
+ tblCache.queries.query[req.query.index.name || ''] = container;
5144
+ }
5145
+ }
5146
+ subscribeToCacheEntry(cacheEntry, container, requery, signal);
5147
+ return cacheEntry.promise.then(function (res) {
5148
+ return {
5149
+ result: applyOptimisticOps(res.result, req, tblCache === null || tblCache === void 0 ? void 0 : tblCache.optimisticOps, downTable, cacheEntry, freezeResults),
5150
+ };
5151
+ });
5152
+ } });
5153
+ return tableMW;
5154
+ } });
5155
+ return coreMW;
5156
+ },
5157
+ };
5158
+
5159
+ function vipify(target, vipDb) {
5160
+ return new Proxy(target, {
5161
+ get: function (target, prop, receiver) {
5162
+ if (prop === 'db')
5163
+ return vipDb;
5164
+ return Reflect.get(target, prop, receiver);
5165
+ }
5166
+ });
5167
+ }
5168
+
4672
5169
  var Dexie$1 = (function () {
4673
5170
  function Dexie(name, options) {
4674
5171
  var _this = this;
@@ -4677,7 +5174,7 @@
4677
5174
  var deps = Dexie.dependencies;
4678
5175
  this._options = options = __assign({
4679
5176
  addons: Dexie.addons, autoOpen: true,
4680
- indexedDB: deps.indexedDB, IDBKeyRange: deps.IDBKeyRange }, options);
5177
+ indexedDB: deps.indexedDB, IDBKeyRange: deps.IDBKeyRange, cache: 'cloned' }, options);
4681
5178
  this._deps = {
4682
5179
  indexedDB: options.indexedDB,
4683
5180
  IDBKeyRange: options.IDBKeyRange
@@ -4747,7 +5244,8 @@
4747
5244
  console.warn("Another connection wants to upgrade database '".concat(_this.name, "'. Closing db now to resume the upgrade."));
4748
5245
  else
4749
5246
  console.warn("Another connection wants to delete database '".concat(_this.name, "'. Closing db now to resume the delete request."));
4750
- _this.close();
5247
+ _this.close({ disableAutoOpen: false });
5248
+ _this._state.openComplete = false;
4751
5249
  });
4752
5250
  this.on("blocked", function (ev) {
4753
5251
  if (!ev.newVersion || ev.newVersion < ev.oldVersion)
@@ -4763,11 +5261,31 @@
4763
5261
  .filter(function (c) { return c.name === _this.name && c !== _this && !c._state.vcFired; })
4764
5262
  .map(function (c) { return c.on("versionchange").fire(ev); });
4765
5263
  };
5264
+ this.use(cacheExistingValuesMiddleware);
5265
+ this.use(cacheMiddleware);
5266
+ this.use(observabilityMiddleware);
4766
5267
  this.use(virtualIndexMiddleware);
4767
5268
  this.use(hooksMiddleware);
4768
- this.use(observabilityMiddleware);
4769
- this.use(cacheExistingValuesMiddleware);
4770
- this.vip = Object.create(this, { _vip: { value: true } });
5269
+ var vipDB = new Proxy(this, {
5270
+ get: function (_, prop, receiver) {
5271
+ if (prop === '_vip')
5272
+ return true;
5273
+ if (prop === 'table')
5274
+ return function (tableName) { return vipify(_this.table(tableName), vipDB); };
5275
+ var rv = Reflect.get(_, prop, receiver);
5276
+ if (rv instanceof Table)
5277
+ return vipify(rv, vipDB);
5278
+ if (prop === 'tables')
5279
+ return rv.map(function (t) { return vipify(t, vipDB); });
5280
+ if (prop === '_createTransaction')
5281
+ return function () {
5282
+ var tx = rv.apply(this, arguments);
5283
+ return vipify(tx, vipDB);
5284
+ };
5285
+ return rv;
5286
+ }
5287
+ });
5288
+ this.vip = vipDB;
4771
5289
  addons.forEach(function (addon) { return addon(_this); });
4772
5290
  }
4773
5291
  Dexie.prototype.version = function (versionNumber) {
@@ -4825,7 +5343,9 @@
4825
5343
  return this;
4826
5344
  };
4827
5345
  Dexie.prototype.open = function () {
4828
- return dexieOpen(this);
5346
+ var _this = this;
5347
+ return usePSD(globalPSD,
5348
+ function () { return dexieOpen(_this); });
4829
5349
  };
4830
5350
  Dexie.prototype._close = function () {
4831
5351
  var state = this._state;
@@ -4837,7 +5357,7 @@
4837
5357
  this.idbdb.close();
4838
5358
  }
4839
5359
  catch (e) { }
4840
- this._novip.idbdb = null;
5360
+ this.idbdb = null;
4841
5361
  }
4842
5362
  state.dbReadyPromise = new DexiePromise(function (resolve) {
4843
5363
  state.dbReadyResolve = resolve;
@@ -4846,10 +5366,12 @@
4846
5366
  state.cancelOpen = reject;
4847
5367
  });
4848
5368
  };
4849
- Dexie.prototype.close = function () {
5369
+ Dexie.prototype.close = function (_a) {
5370
+ var _b = _a === void 0 ? { disableAutoOpen: true } : _a, disableAutoOpen = _b.disableAutoOpen;
4850
5371
  this._close();
4851
5372
  var state = this._state;
4852
- this._options.autoOpen = false;
5373
+ if (disableAutoOpen)
5374
+ this._options.autoOpen = false;
4853
5375
  state.dbOpenError = new exceptions.DatabaseClosed();
4854
5376
  if (state.isBeingOpened)
4855
5377
  state.cancelOpen(state.dbOpenError);
@@ -4860,7 +5382,7 @@
4860
5382
  var state = this._state;
4861
5383
  return new DexiePromise(function (resolve, reject) {
4862
5384
  var doDelete = function () {
4863
- _this.close();
5385
+ _this.close({ disableAutoOpen: false });
4864
5386
  var req = _this._deps.indexedDB.deleteDatabase(_this.name);
4865
5387
  req.onsuccess = wrap(function () {
4866
5388
  _onDatabaseDeleted(_this._deps, _this.name);
@@ -4990,32 +5512,45 @@
4990
5512
  return Observable;
4991
5513
  }());
4992
5514
 
4993
- function extendObservabilitySet(target, newSet) {
4994
- keys(newSet).forEach(function (part) {
4995
- var rangeSet = target[part] || (target[part] = new RangeSet());
4996
- mergeRanges(rangeSet, newSet[part]);
4997
- });
4998
- return target;
5515
+ var domDeps;
5516
+ try {
5517
+ domDeps = {
5518
+ indexedDB: _global.indexedDB || _global.mozIndexedDB || _global.webkitIndexedDB || _global.msIndexedDB,
5519
+ IDBKeyRange: _global.IDBKeyRange || _global.webkitIDBKeyRange
5520
+ };
5521
+ }
5522
+ catch (e) {
5523
+ domDeps = { indexedDB: null, IDBKeyRange: null };
4999
5524
  }
5000
5525
 
5001
5526
  function liveQuery(querier) {
5002
- return new Observable(function (observer) {
5527
+ var hasValue = false;
5528
+ var currentValue;
5529
+ var observable = new Observable(function (observer) {
5003
5530
  var scopeFuncIsAsync = isAsyncFunction(querier);
5004
- function execute(subscr) {
5005
- if (scopeFuncIsAsync) {
5006
- incrementExpectedAwaits();
5531
+ function execute(ctx) {
5532
+ var wasRootExec = beginMicroTickScope();
5533
+ try {
5534
+ if (scopeFuncIsAsync) {
5535
+ incrementExpectedAwaits();
5536
+ }
5537
+ var rv = newScope(querier, ctx);
5538
+ if (scopeFuncIsAsync) {
5539
+ rv = rv.finally(decrementExpectedAwaits);
5540
+ }
5541
+ return Promise.resolve(rv).finally(function () {
5542
+ if (PSD.subscr === ctx.subscr) {
5543
+ console.warn("Dexie liveQuery()'s querier callback did'nt await all of its spawned promises. Querier source: ".concat(querier));
5544
+ return new NativePromise(function (resolve) { return setTimeout(resolve, 0); });
5545
+ }
5546
+ });
5007
5547
  }
5008
- var exec = function () { return newScope(querier, { subscr: subscr, trans: null }); };
5009
- var rv = PSD.trans
5010
- ?
5011
- usePSD(PSD.transless, exec)
5012
- : exec();
5013
- if (scopeFuncIsAsync) {
5014
- rv.then(decrementExpectedAwaits, decrementExpectedAwaits);
5548
+ finally {
5549
+ wasRootExec && endMicroTickScope();
5015
5550
  }
5016
- return rv;
5017
5551
  }
5018
5552
  var closed = false;
5553
+ var abortController;
5019
5554
  var accumMuts = {};
5020
5555
  var currentObs = {};
5021
5556
  var subscription = {
@@ -5023,16 +5558,19 @@
5023
5558
  return closed;
5024
5559
  },
5025
5560
  unsubscribe: function () {
5561
+ if (closed)
5562
+ return;
5026
5563
  closed = true;
5027
- globalEvents.storagemutated.unsubscribe(mutationListener);
5564
+ if (abortController)
5565
+ abortController.abort();
5566
+ if (startedListening)
5567
+ globalEvents.storagemutated.unsubscribe(mutationListener);
5028
5568
  },
5029
5569
  };
5030
5570
  observer.start && observer.start(subscription);
5031
- var querying = false, startedListening = false;
5571
+ var startedListening = false;
5032
5572
  function shouldNotify() {
5033
- return keys(currentObs).some(function (key) {
5034
- return accumMuts[key] && rangesOverlap(accumMuts[key], currentObs[key]);
5035
- });
5573
+ return obsSetsOverlap(currentObs, accumMuts);
5036
5574
  }
5037
5575
  var mutationListener = function (parts) {
5038
5576
  extendObservabilitySet(accumMuts, parts);
@@ -5041,52 +5579,52 @@
5041
5579
  }
5042
5580
  };
5043
5581
  var doQuery = function () {
5044
- if (querying || closed) {
5582
+ if (closed ||
5583
+ !domDeps.indexedDB)
5584
+ {
5045
5585
  return;
5046
5586
  }
5047
5587
  accumMuts = {};
5048
5588
  var subscr = {};
5049
- var ret = execute(subscr);
5050
- if (!startedListening) {
5051
- globalEvents(DEXIE_STORAGE_MUTATED_EVENT_NAME, mutationListener);
5052
- startedListening = true;
5053
- }
5054
- querying = true;
5589
+ if (abortController)
5590
+ abortController.abort();
5591
+ abortController = new AbortController();
5592
+ var ctx = {
5593
+ subscr: subscr,
5594
+ signal: abortController.signal,
5595
+ requery: doQuery,
5596
+ querier: querier,
5597
+ trans: null
5598
+ };
5599
+ var ret = execute(ctx);
5055
5600
  Promise.resolve(ret).then(function (result) {
5056
- querying = false;
5057
- if (closed) {
5601
+ hasValue = true;
5602
+ currentValue = result;
5603
+ if (closed || ctx.signal.aborted) {
5058
5604
  return;
5059
5605
  }
5060
- if (shouldNotify()) {
5061
- doQuery();
5062
- }
5063
- else {
5064
- accumMuts = {};
5065
- currentObs = subscr;
5066
- observer.next && observer.next(result);
5606
+ accumMuts = {};
5607
+ currentObs = subscr;
5608
+ if (!objectIsEmpty(currentObs) && !startedListening) {
5609
+ globalEvents(DEXIE_STORAGE_MUTATED_EVENT_NAME, mutationListener);
5610
+ startedListening = true;
5067
5611
  }
5612
+ observer.next && observer.next(result);
5068
5613
  }, function (err) {
5614
+ hasValue = false;
5069
5615
  if (!['DatabaseClosedError', 'AbortError'].includes(err === null || err === void 0 ? void 0 : err.name)) {
5070
- querying = false;
5616
+ if (closed)
5617
+ return;
5071
5618
  observer.error && observer.error(err);
5072
- subscription.unsubscribe();
5073
5619
  }
5074
5620
  });
5075
5621
  };
5076
5622
  doQuery();
5077
5623
  return subscription;
5078
5624
  });
5079
- }
5080
-
5081
- var domDeps;
5082
- try {
5083
- domDeps = {
5084
- indexedDB: _global.indexedDB || _global.mozIndexedDB || _global.webkitIndexedDB || _global.msIndexedDB,
5085
- IDBKeyRange: _global.IDBKeyRange || _global.webkitIDBKeyRange
5086
- };
5087
- }
5088
- catch (e) {
5089
- domDeps = { indexedDB: null, IDBKeyRange: null };
5625
+ observable.hasValue = function () { return hasValue; };
5626
+ observable.getValue = function () { return currentValue; };
5627
+ return observable;
5090
5628
  }
5091
5629
 
5092
5630
  var Dexie = Dexie$1;
@@ -5166,7 +5704,7 @@
5166
5704
  addons: [],
5167
5705
  connections: connections,
5168
5706
  errnames: errnames,
5169
- dependencies: domDeps,
5707
+ dependencies: domDeps, cache: cache,
5170
5708
  semVer: DEXIE_VERSION, version: DEXIE_VERSION.split('.')
5171
5709
  .map(function (n) { return parseInt(n); })
5172
5710
  .reduce(function (p, c, i) { return p + (c / Math.pow(10, i * 2)); }) }));
@@ -5202,6 +5740,7 @@
5202
5740
  try {
5203
5741
  propagatingLocally = true;
5204
5742
  globalEvents.storagemutated.fire(updateParts);
5743
+ signalSubscribersNow(updateParts, true);
5205
5744
  }
5206
5745
  finally {
5207
5746
  propagatingLocally = wasMe;